@happyvertical/repos 0.85.4 → 0.86.0
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.
- package/AGENT.md +1 -1
- package/README.md +21 -0
- package/dist/index.d.ts +231 -0
- package/dist/index.js +6742 -5
- package/dist/index.js.map +1 -1
- package/metadata.json +2 -1
- package/package.json +3 -2
package/dist/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","names":[],"sources":["../src/errors.ts","../src/factory.ts","../src/forge/errors.ts","../src/github/forge.ts","../src/github/transport.ts","../src/github/app.ts","../src/github/fixtures.ts","../src/github/rest.ts","../src/github/index.ts","../src/github/webhooks.ts","../src/parsing.ts"],"sourcesContent":["/**\n * Repository error handling\n */\n\nexport enum RepositoryErrorCode {\n NOT_FOUND = 'NOT_FOUND',\n UNAUTHORIZED = 'UNAUTHORIZED',\n FORBIDDEN = 'FORBIDDEN',\n RATE_LIMITED = 'RATE_LIMITED',\n VALIDATION_ERROR = 'VALIDATION_ERROR',\n NETWORK_ERROR = 'NETWORK_ERROR',\n UNKNOWN = 'UNKNOWN',\n}\n\nexport class RepositoryError extends Error {\n constructor(\n message: string,\n public code: RepositoryErrorCode,\n public statusCode?: number,\n public response?: unknown,\n ) {\n super(message);\n this.name = 'RepositoryError';\n Error.captureStackTrace(this, this.constructor);\n }\n\n static fromHTTPStatus(\n statusCode: number,\n message: string,\n response?: unknown,\n ): RepositoryError {\n let code: RepositoryErrorCode;\n\n switch (statusCode) {\n case 404:\n code = RepositoryErrorCode.NOT_FOUND;\n break;\n case 401:\n code = RepositoryErrorCode.UNAUTHORIZED;\n break;\n case 403:\n code = RepositoryErrorCode.FORBIDDEN;\n break;\n case 429:\n code = RepositoryErrorCode.RATE_LIMITED;\n break;\n case 422:\n code = RepositoryErrorCode.VALIDATION_ERROR;\n break;\n default:\n code = RepositoryErrorCode.UNKNOWN;\n }\n\n return new RepositoryError(message, code, statusCode, response);\n }\n\n static networkError(message: string, cause?: Error): RepositoryError {\n return new RepositoryError(\n message,\n RepositoryErrorCode.NETWORK_ERROR,\n undefined,\n cause,\n );\n }\n\n isRetryable(): boolean {\n return (\n this.code === RepositoryErrorCode.RATE_LIMITED ||\n this.code === RepositoryErrorCode.NETWORK_ERROR\n );\n }\n}\n","/**\n * Repository factory function\n *\n * Creates repository instances following the pattern from @happyvertical/files and @happyvertical/sql\n */\n\nimport { RepositoryError, RepositoryErrorCode } from './errors.js';\nimport type { IRepository, RepositoryConfig } from './types.js';\n\n/**\n * Check if value is already a repository instance\n */\nfunction isRepositoryInstance(value: unknown): value is IRepository {\n return (\n value !== null &&\n typeof value === 'object' &&\n 'getIssue' in value &&\n 'createIssue' in value &&\n 'addLabels' in value &&\n typeof (value as IRepository).getIssue === 'function'\n );\n}\n\n/**\n * Get a repository client instance\n *\n * This is the main entry point following the pattern from @happyvertical/files and @happyvertical/sql.\n * It can accept either a configuration object or an existing repository instance.\n *\n * @param options - Repository configuration or existing repository instance\n * @returns Promise resolving to repository interface\n *\n * @example\n * ```typescript\n * import { getRepository } from '@happyvertical/repos';\n *\n * // Create a GitHub repository client\n * const repo = await getRepository({\n * type: 'github',\n * owner: 'happyvertical',\n * repo: 'sdk',\n * token: process.env.GITHUB_TOKEN\n * });\n *\n * // Use the client\n * const issue = await repo.getIssue(352);\n * await repo.addLabels(352, ['type: feature', 'priority: high']);\n *\n * // Pass existing instance (returns it unchanged)\n * const sameRepo = await getRepository(repo);\n * ```\n */\nexport async function getRepository(\n options: RepositoryConfig | IRepository,\n): Promise<IRepository> {\n // If already a repository instance, return it\n if (isRepositoryInstance(options)) {\n return options;\n }\n\n // Validate configuration\n if (!options.type) {\n throw new RepositoryError(\n 'Repository type is required',\n RepositoryErrorCode.VALIDATION_ERROR,\n );\n }\n\n if (!options.owner || !options.repo) {\n throw new RepositoryError(\n 'Repository owner and repo are required',\n RepositoryErrorCode.VALIDATION_ERROR,\n );\n }\n\n if (!options.token) {\n throw new RepositoryError(\n 'Authentication token is required',\n RepositoryErrorCode.UNAUTHORIZED,\n );\n }\n\n // Create repository instance based on type\n switch (options.type) {\n case 'github': {\n const { GitHubRepository } = await import('./github/index.js');\n return new GitHubRepository(options);\n }\n\n case 'gitlab':\n throw new RepositoryError(\n 'GitLab support not yet implemented',\n RepositoryErrorCode.UNKNOWN,\n );\n\n case 'bitbucket':\n throw new RepositoryError(\n 'Bitbucket support not yet implemented',\n RepositoryErrorCode.UNKNOWN,\n );\n\n case 'azure':\n throw new RepositoryError(\n 'Azure DevOps support not yet implemented',\n RepositoryErrorCode.UNKNOWN,\n );\n\n default:\n throw new RepositoryError(\n `Unsupported repository type: ${options.type}`,\n RepositoryErrorCode.VALIDATION_ERROR,\n );\n }\n}\n","import type { ForgeProvider, ForgeRateLimit } from './types.js';\n\nexport type ForgeErrorCode =\n | 'AUTHENTICATION_FAILED'\n | 'AUTHORITY_MISMATCH'\n | 'CONFIGURATION_ERROR'\n | 'INVALID_INPUT'\n | 'NOT_FOUND'\n | 'PROVIDER_ERROR'\n | 'RATE_LIMITED'\n | 'SIGNATURE_INVALID'\n | 'TRANSPORT_ERROR';\n\nexport class ForgeError extends Error {\n readonly provider?: ForgeProvider;\n readonly code: ForgeErrorCode;\n readonly status?: number;\n readonly requestId?: string;\n readonly rateLimit?: ForgeRateLimit;\n readonly details?: unknown;\n readonly retryable: boolean;\n\n constructor(\n message: string,\n code: ForgeErrorCode,\n options: {\n cause?: unknown;\n provider?: ForgeProvider;\n status?: number;\n requestId?: string;\n rateLimit?: ForgeRateLimit;\n details?: unknown;\n retryable?: boolean;\n } = {},\n ) {\n super(\n message,\n options.cause === undefined ? undefined : { cause: options.cause },\n );\n this.name = 'ForgeError';\n this.code = code;\n this.provider = options.provider;\n this.status = options.status;\n this.requestId = options.requestId;\n this.rateLimit = options.rateLimit;\n this.details = options.details;\n this.retryable = options.retryable ?? false;\n }\n}\n\nexport class ForgeSignatureError extends ForgeError {\n constructor(message = 'Forge webhook signature is invalid') {\n super(message, 'SIGNATURE_INVALID');\n this.name = 'ForgeSignatureError';\n }\n}\n","import type {\n CheckRun,\n CommitStatus,\n CreateCheckRunInput,\n CreateCommitStatusInput,\n ForgeOperations,\n ForgePullRequestRef,\n ForgeRepositoryRef,\n ForgeResponse,\n ForgeTransport,\n UpdateCheckRunInput,\n} from '../forge/types.js';\n\n/** Repository coordinates and transport for a GitHub forge provider. */\nexport interface GitHubForgeProviderOptions {\n owner: string;\n repo: string;\n transport: ForgeTransport;\n}\n\nfunction repositoryPath(owner: string, repo: string): string {\n return `/repos/${encodeURIComponent(owner)}/${encodeURIComponent(repo)}`;\n}\n\nfunction normalizeRepository(\n data: Record<string, unknown>,\n): ForgeRepositoryRef {\n const owner = (data.owner as { login?: string } | undefined)?.login ?? '';\n const name = typeof data.name === 'string' ? data.name : '';\n return {\n id: data.node_id === undefined ? undefined : String(data.node_id),\n owner,\n name,\n fullName:\n typeof data.full_name === 'string' ? data.full_name : `${owner}/${name}`,\n defaultBranch:\n typeof data.default_branch === 'string' ? data.default_branch : undefined,\n private: typeof data.private === 'boolean' ? data.private : undefined,\n url: typeof data.html_url === 'string' ? data.html_url : undefined,\n };\n}\n\nfunction normalizePullRequest(\n data: Record<string, unknown>,\n): ForgePullRequestRef {\n const head = (data.head ?? {}) as Record<string, unknown>;\n const base = (data.base ?? {}) as Record<string, unknown>;\n return {\n id: data.node_id === undefined ? undefined : String(data.node_id),\n number: Number(data.number),\n state: data.state === 'closed' ? 'closed' : 'open',\n draft: typeof data.draft === 'boolean' ? data.draft : undefined,\n headSha: String(head.sha ?? ''),\n headRef: typeof head.ref === 'string' ? head.ref : undefined,\n baseSha: typeof base.sha === 'string' ? base.sha : undefined,\n baseRef: typeof base.ref === 'string' ? base.ref : undefined,\n merged: typeof data.merged === 'boolean' ? data.merged : undefined,\n mergeCommitSha:\n typeof data.merge_commit_sha === 'string'\n ? data.merge_commit_sha\n : undefined,\n url: typeof data.html_url === 'string' ? data.html_url : undefined,\n };\n}\n\nfunction normalizeStatus(data: Record<string, unknown>): CommitStatus {\n return {\n id: String(data.id ?? data.node_id ?? ''),\n sha: String(data.sha ?? ''),\n state: String(data.state ?? ''),\n context: String(data.context ?? ''),\n description:\n typeof data.description === 'string' ? data.description : undefined,\n targetUrl:\n typeof data.target_url === 'string' ? data.target_url : undefined,\n createdAt:\n typeof data.created_at === 'string'\n ? new Date(data.created_at)\n : undefined,\n raw: data,\n };\n}\n\nfunction normalizeCheck(data: Record<string, unknown>): CheckRun {\n return {\n id: String(data.id ?? data.node_id ?? ''),\n name: String(data.name ?? ''),\n headSha: String(data.head_sha ?? ''),\n status: (data.status ?? 'queued') as CheckRun['status'],\n conclusion:\n typeof data.conclusion === 'string'\n ? (data.conclusion as CheckRun['conclusion'])\n : undefined,\n detailsUrl:\n typeof data.details_url === 'string' ? data.details_url : undefined,\n externalId:\n typeof data.external_id === 'string' ? data.external_id : undefined,\n startedAt:\n typeof data.started_at === 'string'\n ? new Date(data.started_at)\n : undefined,\n completedAt:\n typeof data.completed_at === 'string'\n ? new Date(data.completed_at)\n : undefined,\n raw: data,\n };\n}\n\nfunction checkInput(input: CreateCheckRunInput | UpdateCheckRunInput) {\n return {\n ...('name' in input ? { name: input.name } : {}),\n ...('headSha' in input ? { head_sha: input.headSha } : {}),\n status: input.status,\n conclusion: input.conclusion,\n details_url: input.detailsUrl,\n external_id: input.externalId,\n started_at:\n input.startedAt instanceof Date\n ? input.startedAt.toISOString()\n : input.startedAt,\n completed_at:\n input.completedAt instanceof Date\n ? input.completedAt.toISOString()\n : input.completedAt,\n output: input.output,\n };\n}\n\n/**\n * Repository-scoped GitHub implementation of provider-neutral forge operations.\n * Every operation may throw `ForgeError` for transport or provider failures.\n */\nexport class GitHubForgeProvider implements ForgeOperations {\n private readonly transport: ForgeTransport;\n private readonly path: string;\n\n /**\n * Creates a repository-scoped GitHub forge provider.\n * @param options Repository coordinates and authenticated transport.\n */\n constructor(options: GitHubForgeProviderOptions) {\n this.transport = options.transport;\n this.path = repositoryPath(options.owner, options.repo);\n }\n\n /** @returns Normalized repository data and request metadata. */\n async getRepository(): Promise<ForgeResponse<ForgeRepositoryRef>> {\n const response = await this.transport.request<Record<string, unknown>>({\n method: 'GET',\n path: this.path,\n });\n return { ...response, data: normalizeRepository(response.data) };\n }\n\n /**\n * Returns one normalized pull request.\n * @param number Repository-local pull-request number.\n * @returns Pull-request data and request metadata.\n * @throws {ForgeError} When GitHub rejects the request.\n */\n async getPullRequest(\n number: number,\n ): Promise<ForgeResponse<ForgePullRequestRef>> {\n const response = await this.transport.request<Record<string, unknown>>({\n method: 'GET',\n path: `${this.path}/pulls/${number}`,\n });\n return { ...response, data: normalizePullRequest(response.data) };\n }\n\n /**\n * Lists every raw provider review for one pull request.\n * @param number Repository-local pull-request number.\n * @returns All reviews and final-page request metadata.\n */\n listPullRequestReviews(\n number: number,\n ): Promise<ForgeResponse<readonly unknown[]>> {\n return this.paginate(\n `${this.path}/pulls/${number}/reviews`,\n (data) => data as unknown[],\n );\n }\n\n /**\n * Returns one raw provider commit payload.\n * @param sha Exact commit SHA.\n * @returns Commit payload and request metadata.\n */\n getCommit(sha: string): Promise<ForgeResponse<unknown>> {\n return this.transport.request({\n method: 'GET',\n path: `${this.path}/commits/${encodeURIComponent(sha)}`,\n });\n }\n\n /**\n * Returns complete normalized commit-status history.\n * @param sha Exact commit SHA.\n * @returns All status pages and final-page request metadata.\n */\n async listCommitStatuses(\n sha: string,\n ): Promise<ForgeResponse<readonly CommitStatus[]>> {\n return this.paginate(\n `${this.path}/commits/${encodeURIComponent(sha)}/statuses`,\n (data) => (data as Record<string, unknown>[]).map(normalizeStatus),\n );\n }\n\n /**\n * Publishes one commit status.\n * @param input Exact SHA and status attributes.\n * @returns Published status and request metadata.\n */\n async createCommitStatus(\n input: CreateCommitStatusInput,\n ): Promise<ForgeResponse<CommitStatus>> {\n const response = await this.transport.request<Record<string, unknown>>({\n method: 'POST',\n path: `${this.path}/statuses/${encodeURIComponent(input.sha)}`,\n body: {\n state: input.state,\n context: input.context,\n description: input.description,\n target_url: input.targetUrl,\n },\n });\n return { ...response, data: normalizeStatus(response.data) };\n }\n\n /**\n * Returns all normalized check runs, including reruns.\n * @param sha Exact commit SHA.\n * @returns All check pages and final-page request metadata.\n */\n async listCheckRuns(\n sha: string,\n ): Promise<ForgeResponse<readonly CheckRun[]>> {\n return this.paginate(\n `${this.path}/commits/${encodeURIComponent(sha)}/check-runs?filter=all`,\n (data) =>\n (\n (data as { check_runs?: Record<string, unknown>[] }).check_runs ?? []\n ).map(normalizeCheck),\n (data) => (data as { total_count?: number }).total_count,\n );\n }\n\n /**\n * Publishes one check run.\n * @param input Check identity, exact head SHA, state, and output.\n * @returns Published check and request metadata.\n */\n async createCheckRun(\n input: CreateCheckRunInput,\n ): Promise<ForgeResponse<CheckRun>> {\n const response = await this.transport.request<Record<string, unknown>>({\n method: 'POST',\n path: `${this.path}/check-runs`,\n body: checkInput(input),\n });\n return { ...response, data: normalizeCheck(response.data) };\n }\n\n /**\n * Changes one check run by provider ID.\n * @param id GitHub check-run ID.\n * @param input Attributes to change.\n * @returns Updated check and request metadata.\n */\n async updateCheckRun(\n id: string,\n input: UpdateCheckRunInput,\n ): Promise<ForgeResponse<CheckRun>> {\n const response = await this.transport.request<Record<string, unknown>>({\n method: 'PATCH',\n path: `${this.path}/check-runs/${encodeURIComponent(id)}`,\n body: checkInput(input),\n });\n return { ...response, data: normalizeCheck(response.data) };\n }\n\n /**\n * Lists raw deployment payloads using narrow filters.\n * @param options Optional SHA, environment, and result limit.\n * @returns Matching deployments and request metadata.\n */\n listDeployments(\n options: { sha?: string; environment?: string; limit?: number } = {},\n ): Promise<ForgeResponse<unknown[]>> {\n const params = new URLSearchParams();\n if (options.sha) params.set('sha', options.sha);\n if (options.environment) params.set('environment', options.environment);\n params.set('per_page', String(options.limit ?? 30));\n return this.transport.request({\n method: 'GET',\n path: `${this.path}/deployments?${params}`,\n });\n }\n\n /**\n * Returns one raw deployment payload.\n * @param id GitHub deployment ID.\n * @returns Deployment payload and request metadata.\n */\n getDeployment(id: string): Promise<ForgeResponse<unknown>> {\n return this.transport.request({\n method: 'GET',\n path: `${this.path}/deployments/${encodeURIComponent(id)}`,\n });\n }\n\n private async paginate<T>(\n path: string,\n items: (data: unknown) => readonly T[],\n totalCount?: (data: unknown) => number | undefined,\n ): Promise<ForgeResponse<readonly T[]>> {\n const separator = path.includes('?') ? '&' : '?';\n const collected: T[] = [];\n let page = 1;\n let response: ForgeResponse<unknown>;\n let providerTotal: number | undefined;\n do {\n response = await this.transport.request({\n method: 'GET',\n path: `${path}${separator}per_page=100&page=${page}`,\n });\n const pageItems = items(response.data);\n collected.push(...pageItems);\n providerTotal ??= totalCount?.(response.data);\n page += 1;\n if (pageItems.length < 100) break;\n } while (providerTotal === undefined || collected.length < providerTotal);\n\n return {\n data: collected,\n metadata: {\n ...response.metadata,\n pagination: {\n pages: page - 1,\n totalCount: providerTotal ?? collected.length,\n },\n },\n };\n }\n}\n","import { ForgeError, type ForgeErrorCode } from '../forge/errors.js';\nimport type {\n ForgeRateLimit,\n ForgeResponse,\n ForgeTransport,\n ForgeTransportRequest,\n} from '../forge/types.js';\n\nexport type GitHubTokenSource = string | (() => string | Promise<string>);\n\n/** Construction options for an authenticated GitHub REST transport. */\nexport interface GitHubTransportOptions {\n token: GitHubTokenSource;\n baseUrl?: string;\n fetch?: typeof globalThis.fetch;\n}\n\nfunction optionalInteger(value: string | null): number | undefined {\n if (value === null || value.trim() === '') return undefined;\n const parsed = Number.parseInt(value, 10);\n return Number.isFinite(parsed) ? parsed : undefined;\n}\n\nfunction responseRateLimit(headers: Headers): ForgeRateLimit | undefined {\n const limit = optionalInteger(headers.get('x-ratelimit-limit'));\n const remaining = optionalInteger(headers.get('x-ratelimit-remaining'));\n const used = optionalInteger(headers.get('x-ratelimit-used'));\n const reset = optionalInteger(headers.get('x-ratelimit-reset'));\n const retryAfter = optionalInteger(headers.get('retry-after'));\n if (\n limit === undefined &&\n remaining === undefined &&\n used === undefined &&\n reset === undefined &&\n retryAfter === undefined\n ) {\n return undefined;\n }\n return {\n limit,\n remaining,\n used,\n resetAt: reset === undefined ? undefined : new Date(reset * 1_000),\n retryAfterMs:\n retryAfter === undefined ? undefined : Math.max(0, retryAfter * 1_000),\n };\n}\n\nfunction errorCode(status: number, rateLimit?: ForgeRateLimit): ForgeErrorCode {\n if (status === 401) return 'AUTHENTICATION_FAILED';\n if (status === 404) return 'NOT_FOUND';\n if (status === 422) return 'INVALID_INPUT';\n if (\n status === 429 ||\n (status === 403 &&\n (rateLimit?.remaining === 0 || rateLimit?.retryAfterMs !== undefined))\n ) {\n return 'RATE_LIMITED';\n }\n return 'PROVIDER_ERROR';\n}\n\nexport class GitHubTransport implements ForgeTransport {\n private readonly token: GitHubTokenSource;\n private readonly baseUrl: string;\n private readonly fetchImplementation: typeof globalThis.fetch;\n\n /**\n * Creates a GitHub REST transport with fixed or lazy credentials.\n * @param options Token source, provider URL, and fetch override.\n */\n constructor(options: GitHubTransportOptions) {\n this.token = options.token;\n this.baseUrl = (options.baseUrl ?? 'https://api.github.com').replace(\n /\\/+$/,\n '',\n );\n this.fetchImplementation = options.fetch ?? globalThis.fetch;\n }\n\n /**\n * Executes one GitHub REST request.\n * @param request Method, provider-relative path, body, headers, and signal.\n * @returns Parsed data and metadata for this exact request.\n * @throws {ForgeError} For transport, authentication, rate, or provider failures.\n */\n async request<T>(request: ForgeTransportRequest): Promise<ForgeResponse<T>> {\n const token =\n typeof this.token === 'function' ? await this.token() : this.token;\n let response: Response;\n try {\n response = await this.fetchImplementation(\n `${this.baseUrl}${request.path}`,\n {\n method: request.method,\n headers: {\n Accept: 'application/vnd.github+json',\n Authorization: `Bearer ${token}`,\n 'Content-Type': 'application/json',\n 'X-GitHub-Api-Version': '2022-11-28',\n ...request.headers,\n },\n body:\n request.body === undefined\n ? undefined\n : JSON.stringify(request.body),\n signal: request.signal,\n },\n );\n } catch (cause) {\n throw new ForgeError(\n 'GitHub transport request failed',\n 'TRANSPORT_ERROR',\n {\n cause,\n provider: 'github',\n retryable: true,\n },\n );\n }\n\n const requestId = response.headers.get('x-github-request-id') ?? undefined;\n const rateLimit = responseRateLimit(response.headers);\n const metadata = {\n provider: 'github' as const,\n requestId,\n status: response.status,\n rateLimit,\n };\n let text: string;\n try {\n text = response.status === 204 ? '' : await response.text();\n } catch (cause) {\n throw new ForgeError(\n 'GitHub transport response body failed',\n 'TRANSPORT_ERROR',\n {\n cause,\n provider: 'github',\n status: response.status,\n requestId,\n rateLimit,\n retryable: true,\n },\n );\n }\n let data: unknown;\n try {\n data = text === '' ? undefined : JSON.parse(text);\n } catch {\n data = text;\n }\n\n if (!response.ok) {\n const code = errorCode(response.status, rateLimit);\n const providerMessage =\n typeof data === 'object' &&\n data !== null &&\n 'message' in data &&\n typeof data.message === 'string'\n ? data.message\n : response.statusText;\n throw new ForgeError(`GitHub API error: ${providerMessage}`, code, {\n provider: 'github',\n status: response.status,\n requestId,\n rateLimit,\n details: data,\n retryable: code === 'RATE_LIMITED' || response.status >= 500,\n });\n }\n\n return { data: data as T, metadata };\n }\n}\n","import { createSign } from 'node:crypto';\nimport { ForgeError } from '../forge/errors.js';\nimport type {\n ForgeInstallationRef,\n ForgeRepositoryRef,\n} from '../forge/types.js';\nimport { GitHubForgeProvider } from './forge.js';\nimport { GitHubTransport } from './transport.js';\n\n/** Credentials required to sign GitHub App JSON Web Tokens. */\nexport interface GitHubAppCredentials {\n appId: string | number;\n privateKey: string;\n}\n\n/** Construction options for one request/job-scoped GitHub App authority. */\nexport interface GitHubAppAuthOptions extends GitHubAppCredentials {\n baseUrl?: string;\n fetch?: typeof globalThis.fetch;\n now?: () => Date;\n /** Refresh before provider expiry. Defaults to 60 seconds. */\n expirySkewMs?: number;\n}\n\n/** Installation and repository boundary requested by a caller. */\nexport interface GitHubInstallationScope {\n installationId: string | number;\n owner: string;\n repo: string;\n}\n\n/** Authorized repository client and explicit token-revocation handle. */\nexport interface GitHubInstallationContext {\n installation: ForgeInstallationRef;\n repository: ForgeRepositoryRef;\n forge: GitHubForgeProvider;\n /** Revokes issued tokens remotely and closes this local context. */\n revoke(): Promise<void>;\n}\n\ninterface CachedToken {\n token: string;\n expiresAt: number;\n generation: number;\n authorizedRepositories: Set<string>;\n}\n\nfunction base64UrlJson(value: unknown): string {\n return Buffer.from(JSON.stringify(value)).toString('base64url');\n}\n\n/**\n * Creates a short-lived GitHub App JWT without mutating process credentials.\n * @param credentials GitHub App ID and RSA private key.\n * @param now Clock value used for issued-at and expiry claims.\n * @returns Signed RS256 GitHub App JWT.\n * @throws {ForgeError} When credentials are missing or the key cannot sign.\n */\nexport function createGitHubAppJwt(\n credentials: GitHubAppCredentials,\n now = new Date(),\n): string {\n if (!credentials.appId || !credentials.privateKey) {\n throw new ForgeError(\n 'GitHub App id and private key are required',\n 'CONFIGURATION_ERROR',\n { provider: 'github' },\n );\n }\n const issuedAt = Math.floor(now.getTime() / 1_000) - 60;\n const header = base64UrlJson({ alg: 'RS256', typ: 'JWT' });\n const payload = base64UrlJson({\n iat: issuedAt,\n exp: issuedAt + 10 * 60,\n iss: String(credentials.appId),\n });\n const unsigned = `${header}.${payload}`;\n try {\n const signer = createSign('RSA-SHA256');\n signer.update(unsigned);\n signer.end();\n return `${unsigned}.${signer.sign(credentials.privateKey, 'base64url')}`;\n } catch (cause) {\n throw new ForgeError(\n 'GitHub App private key could not sign a JWT',\n 'CONFIGURATION_ERROR',\n { cause, provider: 'github' },\n );\n }\n}\n\n/**\n * Request/job-scoped GitHub App authority.\n *\n * Keep this object inside a single request or job. Its token cache and in-flight\n * acquisitions are instance fields, so installations cannot share credentials.\n */\nexport class GitHubAppAuth {\n private readonly credentials: GitHubAppCredentials;\n private readonly baseUrl?: string;\n private readonly fetchImplementation?: typeof globalThis.fetch;\n private readonly now: () => Date;\n private readonly expirySkewMs: number;\n private readonly tokens = new Map<string, CachedToken>();\n private readonly issuedTokens = new Map<string, Map<string, number>>();\n private readonly tokenRequests = new Map<string, Promise<CachedToken>>();\n private readonly authorizationRequests = new Map<string, Promise<void>>();\n private readonly revokedInstallations = new Set<string>();\n private nextTokenGeneration = 1;\n\n /**\n * Creates isolated GitHub App authority from credentials and dependencies.\n * @param options Credentials, clock, provider URL, and fetch override.\n */\n constructor(options: GitHubAppAuthOptions) {\n this.credentials = {\n appId: options.appId,\n privateKey: options.privateKey,\n };\n this.baseUrl = options.baseUrl;\n this.fetchImplementation = options.fetch;\n this.now = options.now ?? (() => new Date());\n this.expirySkewMs = options.expirySkewMs ?? 60_000;\n }\n\n /**\n * Clears locally cached credentials without remote revocation.\n * @param installationId Optional installation to clear; omitted clears all.\n * @returns Nothing.\n */\n clear(installationId?: string | number): void {\n if (installationId === undefined) {\n this.tokens.clear();\n this.issuedTokens.clear();\n this.tokenRequests.clear();\n this.authorizationRequests.clear();\n this.revokedInstallations.clear();\n return;\n }\n const id = String(installationId);\n this.clearCachedInstallation(id);\n this.revokedInstallations.delete(id);\n }\n\n /**\n * Acquires and verifies one installation/repository boundary.\n * @param scope Installation ID and exact repository coordinates.\n * @returns An isolated forge provider and revocation handle.\n * @throws {ForgeError} When authentication, provider access, or scope fails.\n */\n async createInstallationContext(\n scope: GitHubInstallationScope,\n ): Promise<GitHubInstallationContext> {\n const installationId = String(scope.installationId);\n const fullName = `${scope.owner}/${scope.repo}`.toLowerCase();\n await this.getAuthorizedToken(installationId, fullName);\n let active = true;\n let revocationInFlight: Promise<void> | undefined;\n const token = () => {\n if (!active) {\n throw new ForgeError(\n 'GitHub installation context has been revoked',\n 'AUTHENTICATION_FAILED',\n { provider: 'github' },\n );\n }\n return this.getAuthorizedToken(installationId, fullName);\n };\n const forge = new GitHubForgeProvider({\n owner: scope.owner,\n repo: scope.repo,\n transport: new GitHubTransport({\n token,\n baseUrl: this.baseUrl,\n fetch: this.fetchImplementation,\n }),\n });\n return {\n installation: { id: installationId },\n repository: {\n owner: scope.owner,\n name: scope.repo,\n fullName: `${scope.owner}/${scope.repo}`,\n },\n forge,\n revoke: async () => {\n active = false;\n if (!revocationInFlight) {\n revocationInFlight = this.revokeInstallationTokens(\n installationId,\n ).finally(() => {\n revocationInFlight = undefined;\n });\n }\n await revocationInFlight;\n },\n };\n }\n\n private async getAuthorizedToken(\n installationId: string,\n fullName: string,\n ): Promise<string> {\n if (this.revokedInstallations.has(installationId)) {\n throw new ForgeError(\n 'GitHub App installation authority has been revoked',\n 'AUTHENTICATION_FAILED',\n { provider: 'github' },\n );\n }\n const cached = await this.getInstallationToken(installationId);\n if (this.revokedInstallations.has(installationId)) {\n throw new ForgeError(\n 'GitHub App installation authority has been revoked',\n 'AUTHENTICATION_FAILED',\n { provider: 'github' },\n );\n }\n if (cached.authorizedRepositories.has(fullName)) return cached.token;\n\n const key = `${installationId}:${cached.generation}:${fullName}`;\n let pending = this.authorizationRequests.get(key);\n if (!pending) {\n pending = this.verifyRepositoryScope(cached, fullName).finally(() => {\n this.authorizationRequests.delete(key);\n });\n this.authorizationRequests.set(key, pending);\n }\n await pending;\n if (this.revokedInstallations.has(installationId)) {\n throw new ForgeError(\n 'GitHub App installation authority has been revoked',\n 'AUTHENTICATION_FAILED',\n { provider: 'github' },\n );\n }\n return cached.token;\n }\n\n private async getInstallationToken(\n installationId: string,\n ): Promise<CachedToken> {\n const cached = this.tokens.get(installationId);\n if (cached && cached.expiresAt - this.expirySkewMs > this.now().getTime()) {\n return cached;\n }\n\n let pending = this.tokenRequests.get(installationId);\n if (!pending) {\n pending = this.acquireInstallationToken(installationId).finally(() => {\n this.tokenRequests.delete(installationId);\n });\n this.tokenRequests.set(installationId, pending);\n }\n return pending;\n }\n\n private async acquireInstallationToken(\n installationId: string,\n ): Promise<CachedToken> {\n const appTransport = new GitHubTransport({\n token: () => createGitHubAppJwt(this.credentials, this.now()),\n baseUrl: this.baseUrl,\n fetch: this.fetchImplementation,\n });\n const response = await appTransport.request<{\n token?: string;\n expires_at?: string;\n }>({\n method: 'POST',\n path: `/app/installations/${encodeURIComponent(installationId)}/access_tokens`,\n });\n const token = response.data.token;\n const expiresAt = Date.parse(response.data.expires_at ?? '');\n if (!token || !Number.isFinite(expiresAt)) {\n throw new ForgeError(\n 'GitHub returned an invalid installation token',\n 'AUTHENTICATION_FAILED',\n { provider: 'github', requestId: response.metadata.requestId },\n );\n }\n const cached: CachedToken = {\n token,\n expiresAt,\n generation: this.nextTokenGeneration,\n authorizedRepositories: new Set(),\n };\n this.nextTokenGeneration += 1;\n const issued = this.issuedTokens.get(installationId) ?? new Map();\n for (const [issuedToken, issuedExpiry] of issued) {\n if (issuedExpiry <= this.now().getTime()) issued.delete(issuedToken);\n }\n issued.set(token, expiresAt);\n this.issuedTokens.set(installationId, issued);\n if (this.revokedInstallations.has(installationId)) {\n try {\n await this.revokeToken(token);\n issued.delete(token);\n } catch (cause) {\n const providerError = cause instanceof ForgeError ? cause : undefined;\n throw new ForgeError(\n 'A GitHub token acquired during revocation could not be revoked',\n 'PROVIDER_ERROR',\n {\n cause,\n provider: 'github',\n status: providerError?.status,\n requestId: providerError?.requestId,\n rateLimit: providerError?.rateLimit,\n retryable: providerError?.retryable,\n },\n );\n }\n throw new ForgeError(\n 'GitHub App installation authority was revoked during token acquisition',\n 'AUTHENTICATION_FAILED',\n { provider: 'github' },\n );\n }\n this.tokens.set(installationId, cached);\n return cached;\n }\n\n private async verifyRepositoryScope(\n cached: CachedToken,\n fullName: string,\n ): Promise<void> {\n const transport = new GitHubTransport({\n token: cached.token,\n baseUrl: this.baseUrl,\n fetch: this.fetchImplementation,\n });\n const separator = fullName.indexOf('/');\n const owner = fullName.slice(0, separator);\n const repo = fullName.slice(separator + 1);\n try {\n await transport.request({\n method: 'GET',\n path: `/repos/${encodeURIComponent(owner)}/${encodeURIComponent(repo)}`,\n });\n } catch (cause) {\n const providerError = cause instanceof ForgeError ? cause : undefined;\n if (\n providerError?.retryable ||\n providerError?.code === 'AUTHENTICATION_FAILED' ||\n providerError?.code === 'TRANSPORT_ERROR' ||\n (providerError?.status !== 403 && providerError?.status !== 404)\n ) {\n throw cause;\n }\n throw new ForgeError(\n `GitHub App installation is not authorized for ${fullName}`,\n 'AUTHORITY_MISMATCH',\n {\n cause,\n provider: 'github',\n status: providerError?.status,\n requestId: providerError?.requestId,\n rateLimit: providerError?.rateLimit,\n },\n );\n }\n cached.authorizedRepositories.add(fullName);\n }\n\n private async revokeInstallationTokens(\n installationId: string,\n ): Promise<void> {\n this.revokedInstallations.add(installationId);\n const issued = [...(this.issuedTokens.get(installationId)?.keys() ?? [])];\n this.clearCachedInstallation(installationId, false);\n if (issued.length === 0) return;\n\n const retained = this.issuedTokens.get(installationId) ?? new Map();\n const failures: unknown[] = [];\n for (const token of issued) {\n try {\n await this.revokeToken(token);\n retained.delete(token);\n } catch (error) {\n failures.push(error);\n }\n }\n if (retained.size === 0) this.issuedTokens.delete(installationId);\n else this.issuedTokens.set(installationId, retained);\n if (failures.length > 0) {\n const failure = failures[0];\n const providerError = failure instanceof ForgeError ? failure : undefined;\n throw new ForgeError(\n 'One or more GitHub installation tokens could not be revoked',\n 'PROVIDER_ERROR',\n {\n cause: failure,\n provider: 'github',\n status: providerError?.status,\n requestId: providerError?.requestId,\n rateLimit: providerError?.rateLimit,\n retryable: providerError?.retryable,\n },\n );\n }\n }\n\n private async revokeToken(token: string): Promise<void> {\n const transport = new GitHubTransport({\n token,\n baseUrl: this.baseUrl,\n fetch: this.fetchImplementation,\n });\n await transport.request<void>({\n method: 'DELETE',\n path: '/installation/token',\n });\n }\n\n private clearCachedInstallation(\n installationId: string,\n clearIssued = true,\n ): void {\n this.tokens.delete(installationId);\n if (clearIssued) this.issuedTokens.delete(installationId);\n this.tokenRequests.delete(installationId);\n for (const key of this.authorizationRequests.keys()) {\n if (key.startsWith(`${installationId}:`)) {\n this.authorizationRequests.delete(key);\n }\n }\n }\n}\n","import { createHmac } from 'node:crypto';\nimport type { GitHubWebhookHeaders } from './webhooks.js';\n\n/** Exact webhook bytes and headers suitable for deterministic tests. */\nexport interface GitHubWebhookFixture {\n rawBody: Uint8Array;\n headers: GitHubWebhookHeaders;\n}\n\n/**\n * Produces exact, repeatable webhook bytes and headers for integration suites.\n * Pass the same delivery id for duplicates, or a new id with the same payload\n * for a provider redelivery.\n * @param options Secret, delivery identity, event name, and payload.\n * @returns Exact bytes and matching GitHub delivery headers.\n */\nexport function createGitHubWebhookFixture(options: {\n secret: string;\n deliveryId: string;\n event: string;\n payload: unknown;\n}): GitHubWebhookFixture {\n const rawBody = new TextEncoder().encode(JSON.stringify(options.payload));\n const signature = createHmac('sha256', options.secret)\n .update(rawBody)\n .digest('hex');\n return {\n rawBody,\n headers: {\n 'x-github-delivery': options.deliveryId,\n 'x-github-event': options.event,\n 'x-hub-signature-256': `sha256=${signature}`,\n },\n };\n}\n","/**\n * GitHub REST API client\n */\n\nimport { RepositoryError } from '../errors.js';\n\nexport interface GitHubRestConfig {\n token: string;\n baseUrl?: string;\n}\n\n/**\n * GitHub REST API client\n */\nexport class GitHubRest {\n private token: string;\n private baseUrl: string;\n\n constructor(config: GitHubRestConfig) {\n this.token = config.token;\n this.baseUrl = config.baseUrl || 'https://api.github.com';\n }\n\n /**\n * Make a REST API request\n */\n async request(\n method: string,\n path: string,\n body?: unknown,\n ): Promise<unknown> {\n const url = `${this.baseUrl}${path}`;\n const headers = {\n Authorization: `Bearer ${this.token}`,\n Accept: 'application/vnd.github+json',\n 'X-GitHub-Api-Version': '2022-11-28',\n 'Content-Type': 'application/json',\n };\n\n const response = await fetch(url, {\n method,\n headers,\n body: body ? JSON.stringify(body) : undefined,\n });\n\n if (!response.ok) {\n const error = await response.text();\n throw RepositoryError.fromHTTPStatus(\n response.status,\n `GitHub API error: ${response.statusText}\\n${error}`,\n error,\n );\n }\n\n return response.json();\n }\n\n /**\n * GET request\n */\n async get(path: string): Promise<unknown> {\n return this.request('GET', path);\n }\n\n /**\n * POST request\n */\n async post(path: string, body: unknown): Promise<unknown> {\n return this.request('POST', path, body);\n }\n\n /**\n * PATCH request\n */\n async patch(path: string, body: unknown): Promise<unknown> {\n return this.request('PATCH', path, body);\n }\n\n /**\n * PUT request\n */\n async put(path: string, body?: unknown): Promise<unknown> {\n return this.request('PUT', path, body);\n }\n\n /**\n * DELETE request\n */\n async delete(path: string): Promise<void> {\n await this.request('DELETE', path);\n }\n}\n","/**\n * GitHub repository implementation\n */\n\nimport { GraphQLClient, type IGraphQLClient } from '@happyvertical/graphql';\nimport type {\n CheckRun,\n CommitStatus,\n CreateCheckRunInput,\n CreateCommitStatusInput,\n UpdateCheckRunInput,\n} from '../forge/types.js';\nimport type {\n Branch,\n Comment,\n CreateFromTemplateOptions,\n CreateIssueInput,\n CreatePRInput,\n IRepository,\n Issue,\n Label,\n MergeMethod,\n PullRequest,\n Repository,\n RepositoryConfig,\n SearchFilters,\n UpdateIssueInput,\n} from '../types.js';\nimport { GitHubRest } from './rest.js';\n\n/**\n * GitHub repository implementation\n */\nexport class GitHubRepository implements IRepository {\n private rest: GitHubRest;\n private graphql: IGraphQLClient;\n private owner: string;\n private repo: string;\n\n constructor(config: RepositoryConfig) {\n if (config.type !== 'github') {\n throw new Error('Invalid config type for GitHubRepository');\n }\n\n this.owner = config.owner;\n this.repo = config.repo;\n this.rest = new GitHubRest({\n token: config.token,\n baseUrl: config.baseUrl,\n });\n this.graphql = new GraphQLClient({\n endpoint: config.baseUrl\n ? `${config.baseUrl}/graphql`\n : 'https://api.github.com/graphql',\n token: config.token,\n });\n }\n\n // Repository Info\n async getRepository(): Promise<Repository> {\n const data = (await this.rest.get(`/repos/${this.owner}/${this.repo}`)) as {\n name: string;\n owner: { login: string };\n description: string;\n default_branch: string;\n html_url: string;\n private: boolean;\n };\n\n return {\n owner: data.owner.login,\n name: data.name,\n description: data.description,\n defaultBranch: data.default_branch,\n url: data.html_url,\n isPrivate: data.private,\n };\n }\n\n // Issues\n async getIssue(number: number): Promise<Issue> {\n const data = (await this.rest.get(\n `/repos/${this.owner}/${this.repo}/issues/${number}`,\n )) as {\n number: number;\n node_id: string;\n title: string;\n body: string | null;\n state: string;\n labels: Array<{ name: string; color: string; description: string }>;\n assignees: Array<{ login: string; id: number; type: string }>;\n user: { login: string; id: number; type: string };\n created_at: string;\n updated_at: string;\n closed_at: string | null;\n html_url: string;\n comments: number;\n };\n\n return {\n number: data.number,\n id: data.node_id,\n title: data.title,\n body: data.body || '',\n state: data.state === 'open' ? 'open' : 'closed',\n labels: data.labels.map((l) => ({\n name: l.name,\n color: l.color,\n description: l.description,\n })),\n assignees: data.assignees.map((a) => ({\n login: a.login,\n id: String(a.id),\n type: a.type === 'Bot' ? 'Bot' : 'User',\n })),\n author: {\n login: data.user.login,\n id: String(data.user.id),\n type: data.user.type === 'Bot' ? 'Bot' : 'User',\n },\n createdAt: new Date(data.created_at),\n updatedAt: new Date(data.updated_at),\n closedAt: data.closed_at ? new Date(data.closed_at) : undefined,\n url: data.html_url,\n commentsCount: data.comments,\n };\n }\n\n async createIssue(data: CreateIssueInput): Promise<Issue> {\n const result = (await this.rest.post(\n `/repos/${this.owner}/${this.repo}/issues`,\n data,\n )) as ReturnType<typeof this.getIssue> extends Promise<infer T> ? T : never;\n return this.getIssue(result.number);\n }\n\n async updateIssue(number: number, data: UpdateIssueInput): Promise<Issue> {\n await this.rest.patch(\n `/repos/${this.owner}/${this.repo}/issues/${number}`,\n data,\n );\n return this.getIssue(number);\n }\n\n async closeIssue(number: number): Promise<void> {\n await this.updateIssue(number, { state: 'closed' });\n }\n\n // Labels\n async addLabels(issueNumber: number, labels: string[]): Promise<void> {\n await this.rest.post(\n `/repos/${this.owner}/${this.repo}/issues/${issueNumber}/labels`,\n { labels },\n );\n }\n\n async removeLabel(issueNumber: number, label: string): Promise<void> {\n const encodedLabel = encodeURIComponent(label);\n await this.rest.delete(\n `/repos/${this.owner}/${this.repo}/issues/${issueNumber}/labels/${encodedLabel}`,\n );\n }\n\n async createLabel(label: Label): Promise<void> {\n await this.rest.post(`/repos/${this.owner}/${this.repo}/labels`, label);\n }\n\n async updateLabel(name: string, label: Label): Promise<void> {\n await this.rest.patch(\n `/repos/${this.owner}/${this.repo}/labels/${encodeURIComponent(name)}`,\n label,\n );\n }\n\n async listLabels(): Promise<Label[]> {\n const data = (await this.rest.get(\n `/repos/${this.owner}/${this.repo}/labels`,\n )) as Array<{ name: string; color: string; description: string }>;\n\n return data.map((l) => ({\n name: l.name,\n color: l.color,\n description: l.description,\n }));\n }\n\n // Comments\n async addComment(issueNumber: number, body: string): Promise<Comment> {\n const data = (await this.rest.post(\n `/repos/${this.owner}/${this.repo}/issues/${issueNumber}/comments`,\n { body },\n )) as {\n id: number;\n body: string;\n user: { login: string; id: number; type: string };\n created_at: string;\n updated_at: string;\n html_url: string;\n };\n\n return {\n id: String(data.id),\n body: data.body,\n author: {\n login: data.user.login,\n id: String(data.user.id),\n type: data.user.type === 'Bot' ? 'Bot' : 'User',\n },\n createdAt: new Date(data.created_at),\n updatedAt: new Date(data.updated_at),\n url: data.html_url,\n };\n }\n\n async updateComment(commentId: string, body: string): Promise<Comment> {\n const data = (await this.rest.patch(\n `/repos/${this.owner}/${this.repo}/issues/comments/${commentId}`,\n { body },\n )) as ReturnType<typeof this.addComment> extends Promise<infer T>\n ? T\n : never;\n return data as Comment;\n }\n\n async deleteComment(commentId: string): Promise<void> {\n await this.rest.delete(\n `/repos/${this.owner}/${this.repo}/issues/comments/${commentId}`,\n );\n }\n\n async listComments(issueNumber: number): Promise<Comment[]> {\n const data = (await this.rest.get(\n `/repos/${this.owner}/${this.repo}/issues/${issueNumber}/comments`,\n )) as Array<{\n id: number;\n body: string;\n user: { login: string; id: number; type: string };\n created_at: string;\n updated_at: string;\n html_url: string;\n }>;\n\n return data.map((c) => ({\n id: String(c.id),\n body: c.body,\n author: {\n login: c.user.login,\n id: String(c.user.id),\n type: c.user.type === 'Bot' ? 'Bot' : 'User',\n },\n createdAt: new Date(c.created_at),\n updatedAt: new Date(c.updated_at),\n url: c.html_url,\n }));\n }\n\n // Assignments\n async assignIssue(issueNumber: number, assignees: string[]): Promise<void> {\n await this.rest.post(\n `/repos/${this.owner}/${this.repo}/issues/${issueNumber}/assignees`,\n { assignees },\n );\n }\n\n async unassignIssue(issueNumber: number, assignees: string[]): Promise<void> {\n await this.rest.delete(\n `/repos/${this.owner}/${this.repo}/issues/${issueNumber}/assignees`,\n );\n }\n\n // Pull Requests\n async getPullRequest(number: number): Promise<PullRequest> {\n const issue = await this.getIssue(number);\n const data = (await this.rest.get(\n `/repos/${this.owner}/${this.repo}/pulls/${number}`,\n )) as {\n head: { ref: string };\n base: { ref: string };\n merged: boolean;\n merged_at: string | null;\n mergeable: boolean;\n draft: boolean;\n };\n\n return {\n ...issue,\n headRef: data.head.ref,\n baseRef: data.base.ref,\n merged: data.merged,\n mergedAt: data.merged_at ? new Date(data.merged_at) : undefined,\n mergeable: data.mergeable,\n draft: data.draft,\n };\n }\n\n async createPullRequest(data: CreatePRInput): Promise<PullRequest> {\n const result = (await this.rest.post(\n `/repos/${this.owner}/${this.repo}/pulls`,\n {\n title: data.title,\n body: data.body,\n head: data.headRef,\n base: data.baseRef,\n draft: data.draft,\n },\n )) as { number: number };\n return this.getPullRequest(result.number);\n }\n\n async mergePullRequest(number: number, method?: MergeMethod): Promise<void> {\n await this.rest.put(\n `/repos/${this.owner}/${this.repo}/pulls/${number}/merge`,\n {\n merge_method: method || 'merge',\n },\n );\n }\n\n // Search\n async searchIssues(query: string, filters?: SearchFilters): Promise<Issue[]> {\n let searchQuery = `${query} repo:${this.owner}/${this.repo}`;\n\n if (filters?.state) {\n searchQuery += ` state:${filters.state}`;\n }\n if (filters?.labels) {\n searchQuery += ` ${filters.labels.map((l) => `label:\"${l}\"`).join(' ')}`;\n }\n if (filters?.author) {\n searchQuery += ` author:${filters.author}`;\n }\n if (filters?.assignee) {\n searchQuery += ` assignee:${filters.assignee}`;\n }\n\n const params = new URLSearchParams({\n q: searchQuery,\n sort: filters?.sort || 'created',\n order: filters?.order || 'desc',\n per_page: String(filters?.limit || 30),\n });\n\n const data = (await this.rest.get(`/search/issues?${params}`)) as {\n items: Array<{\n number: number;\n }>;\n };\n\n return Promise.all(data.items.map((item) => this.getIssue(item.number)));\n }\n\n // Node ID resolution\n async getIssueNodeId(issueNumber: number): Promise<string> {\n const issue = await this.getIssue(issueNumber);\n return issue.id;\n }\n\n async getPRNodeId(prNumber: number): Promise<string> {\n const pr = await this.getPullRequest(prNumber);\n return pr.id;\n }\n\n // Branch Management\n async createBranch(name: string, fromRef: string): Promise<Branch> {\n // First get the SHA for the reference\n const refData = (await this.rest.get(\n `/repos/${this.owner}/${this.repo}/git/ref/heads/${fromRef}`,\n )) as { object: { sha: string } };\n\n // Create the new branch\n await this.rest.post(`/repos/${this.owner}/${this.repo}/git/refs`, {\n ref: `refs/heads/${name}`,\n sha: refData.object.sha,\n });\n\n return {\n name,\n sha: refData.object.sha,\n protected: false,\n };\n }\n\n async deleteBranch(name: string): Promise<void> {\n await this.rest.delete(\n `/repos/${this.owner}/${this.repo}/git/refs/heads/${name}`,\n );\n }\n\n async getBranch(name: string): Promise<Branch | null> {\n try {\n const data = (await this.rest.get(\n `/repos/${this.owner}/${this.repo}/branches/${encodeURIComponent(name)}`,\n )) as {\n name: string;\n commit: { sha: string };\n protected: boolean;\n };\n\n return {\n name: data.name,\n sha: data.commit.sha,\n protected: data.protected,\n };\n } catch (error) {\n // Return null if branch not found (404)\n if (\n error instanceof Error &&\n 'code' in error &&\n (error as { code: string }).code === 'NOT_FOUND'\n ) {\n return null;\n }\n throw error;\n }\n }\n\n // PR Draft/Review\n async markPRReady(prNumber: number): Promise<void> {\n const pr = await this.getPullRequest(prNumber);\n const mutation = `\n mutation($pullRequestId: ID!) {\n markPullRequestReadyForReview(input: {\n pullRequestId: $pullRequestId\n }) {\n pullRequest {\n id\n }\n }\n }\n `;\n await this.graphql.mutate(mutation, { pullRequestId: pr.id });\n }\n\n async convertPRToDraft(prNumber: number): Promise<void> {\n const pr = await this.getPullRequest(prNumber);\n const mutation = `\n mutation($pullRequestId: ID!) {\n convertPullRequestToDraft(input: {\n pullRequestId: $pullRequestId\n }) {\n pullRequest {\n id\n }\n }\n }\n `;\n await this.graphql.mutate(mutation, { pullRequestId: pr.id });\n }\n\n async requestReview(prNumber: number, reviewers: string[]): Promise<void> {\n await this.rest.post(\n `/repos/${this.owner}/${this.repo}/pulls/${prNumber}/requested_reviewers`,\n { reviewers },\n );\n }\n\n // Workflow\n async triggerWorkflow(\n workflowId: string,\n ref: string,\n inputs?: Record<string, string>,\n ): Promise<void> {\n await this.rest.post(\n `/repos/${this.owner}/${this.repo}/actions/workflows/${workflowId}/dispatches`,\n { ref, inputs: inputs || {} },\n );\n }\n\n // Linking\n async findPRsForIssue(issueNumber: number): Promise<PullRequest[]> {\n // Search for PRs that reference this issue with closing keywords\n const keywords = ['closes', 'fixes', 'resolves'];\n const searchTerms = keywords\n .map((k) => `${k} #${issueNumber}`)\n .join(' OR ');\n const query = `is:pr repo:${this.owner}/${this.repo} ${searchTerms}`;\n\n const data = (await this.rest.get(\n `/search/issues?q=${encodeURIComponent(query)}`,\n )) as {\n items: Array<{ number: number }>;\n };\n\n return Promise.all(\n data.items.map((item) => this.getPullRequest(item.number)),\n );\n }\n\n async findIssueForPR(prNumber: number): Promise<Issue | null> {\n const pr = await this.getPullRequest(prNumber);\n\n // Look for closing keywords in PR body\n const closingPattern = /(?:closes?|fixes?|resolves?)\\s+#(\\d+)/gi;\n const matches = [...pr.body.matchAll(closingPattern)];\n\n if (matches.length === 0) {\n return null;\n }\n\n // Return the first linked issue\n const issueNumber = Number.parseInt(matches[0][1], 10);\n try {\n return await this.getIssue(issueNumber);\n } catch {\n return null;\n }\n }\n\n // File Content\n async getFileContent(path: string, ref?: string): Promise<string | null> {\n try {\n const url = `/repos/${this.owner}/${this.repo}/contents/${path}${ref ? `?ref=${ref}` : ''}`;\n const data = (await this.rest.get(url)) as {\n type: string;\n content?: string;\n encoding?: string;\n };\n\n if (data.type !== 'file' || !data.content) {\n return null;\n }\n\n // GitHub returns base64-encoded content\n if (data.encoding === 'base64') {\n return Buffer.from(data.content, 'base64').toString('utf-8');\n }\n\n return data.content;\n } catch {\n // 404 means file doesn't exist\n return null;\n }\n }\n\n async listDirectoryFiles(path: string, ref?: string): Promise<string[]> {\n try {\n const url = `/repos/${this.owner}/${this.repo}/contents/${path}${ref ? `?ref=${ref}` : ''}`;\n const data = (await this.rest.get(url)) as Array<{\n name: string;\n type: string;\n }>;\n\n if (!Array.isArray(data)) {\n return [];\n }\n\n return data\n .filter((item) => item.type === 'file')\n .map((item) => item.name);\n } catch {\n // 404 means directory doesn't exist\n return [];\n }\n }\n\n /**\n * Publishes one GitHub commit status.\n * @param input Exact commit SHA and status attributes.\n * @returns Normalized published status.\n */\n async createCommitStatus(\n input: CreateCommitStatusInput,\n ): Promise<CommitStatus> {\n const data = (await this.rest.post(\n `/repos/${this.owner}/${this.repo}/statuses/${encodeURIComponent(input.sha)}`,\n {\n state: input.state,\n context: input.context,\n description: input.description,\n target_url: input.targetUrl,\n },\n )) as Record<string, unknown>;\n return this.mapCommitStatus(data);\n }\n\n /**\n * Returns complete commit-status history across GitHub pages.\n * @param sha Exact commit SHA.\n * @returns Every normalized status for the commit.\n */\n async listCommitStatuses(sha: string): Promise<readonly CommitStatus[]> {\n const statuses: CommitStatus[] = [];\n let page = 1;\n while (true) {\n const data = (await this.rest.get(\n `/repos/${this.owner}/${this.repo}/commits/${encodeURIComponent(sha)}/statuses?per_page=100&page=${page}`,\n )) as Record<string, unknown>[];\n statuses.push(...data.map((status) => this.mapCommitStatus(status)));\n if (data.length < 100) return statuses;\n page += 1;\n }\n }\n\n /**\n * Publishes one GitHub check run.\n * @param input Check identity, exact head SHA, state, and output.\n * @returns Normalized published check run.\n */\n async createCheckRun(input: CreateCheckRunInput): Promise<CheckRun> {\n const data = (await this.rest.post(\n `/repos/${this.owner}/${this.repo}/check-runs`,\n this.mapCheckRunInput(input),\n )) as Record<string, unknown>;\n return this.mapCheckRun(data);\n }\n\n /**\n * Changes one GitHub check run.\n * @param id GitHub check-run ID.\n * @param input Attributes to change.\n * @returns Normalized updated check run.\n */\n async updateCheckRun(\n id: string,\n input: UpdateCheckRunInput,\n ): Promise<CheckRun> {\n const data = (await this.rest.patch(\n `/repos/${this.owner}/${this.repo}/check-runs/${encodeURIComponent(id)}`,\n this.mapCheckRunInput(input),\n )) as Record<string, unknown>;\n return this.mapCheckRun(data);\n }\n\n /**\n * Returns complete GitHub check history, including reruns.\n * @param sha Exact commit SHA.\n * @returns Every normalized check run for the commit.\n */\n async listCheckRuns(sha: string): Promise<readonly CheckRun[]> {\n const checkRuns: CheckRun[] = [];\n let page = 1;\n let totalCount: number | undefined;\n while (true) {\n const data = (await this.rest.get(\n `/repos/${this.owner}/${this.repo}/commits/${encodeURIComponent(sha)}/check-runs?filter=all&per_page=100&page=${page}`,\n )) as {\n check_runs?: Record<string, unknown>[];\n total_count?: number;\n };\n const pageRuns = data.check_runs ?? [];\n totalCount ??= data.total_count;\n checkRuns.push(...pageRuns.map((checkRun) => this.mapCheckRun(checkRun)));\n if (\n pageRuns.length < 100 ||\n (totalCount !== undefined && checkRuns.length >= totalCount)\n ) {\n return checkRuns;\n }\n page += 1;\n }\n }\n\n private mapCommitStatus(data: Record<string, unknown>): CommitStatus {\n return {\n id: String(data.id ?? data.node_id ?? ''),\n sha: String(data.sha ?? ''),\n state: String(data.state ?? ''),\n context: String(data.context ?? ''),\n description:\n typeof data.description === 'string' ? data.description : undefined,\n targetUrl:\n typeof data.target_url === 'string' ? data.target_url : undefined,\n createdAt:\n typeof data.created_at === 'string'\n ? new Date(data.created_at)\n : undefined,\n raw: data,\n };\n }\n\n private mapCheckRunInput(\n input: CreateCheckRunInput | UpdateCheckRunInput,\n ): Record<string, unknown> {\n return {\n ...('name' in input ? { name: input.name } : {}),\n ...('headSha' in input ? { head_sha: input.headSha } : {}),\n status: input.status,\n conclusion: input.conclusion,\n details_url: input.detailsUrl,\n external_id: input.externalId,\n started_at:\n input.startedAt instanceof Date\n ? input.startedAt.toISOString()\n : input.startedAt,\n completed_at:\n input.completedAt instanceof Date\n ? input.completedAt.toISOString()\n : input.completedAt,\n output: input.output,\n };\n }\n\n private mapCheckRun(data: Record<string, unknown>): CheckRun {\n return {\n id: String(data.id ?? data.node_id ?? ''),\n name: String(data.name ?? ''),\n headSha: String(data.head_sha ?? ''),\n status: (data.status ?? 'queued') as CheckRun['status'],\n conclusion:\n typeof data.conclusion === 'string'\n ? (data.conclusion as CheckRun['conclusion'])\n : undefined,\n detailsUrl:\n typeof data.details_url === 'string' ? data.details_url : undefined,\n externalId:\n typeof data.external_id === 'string' ? data.external_id : undefined,\n startedAt:\n typeof data.started_at === 'string'\n ? new Date(data.started_at)\n : undefined,\n completedAt:\n typeof data.completed_at === 'string'\n ? new Date(data.completed_at)\n : undefined,\n raw: data,\n };\n }\n\n // Repository Creation from Template\n\n /**\n * Create a new repository from this repository as a template.\n *\n * Uses the GitHub \"Generate\" API: POST /repos/{template_owner}/{template_repo}/generate\n * The current repository (this.owner/this.repo) is used as the template.\n */\n async createRepositoryFromTemplate(\n options: CreateFromTemplateOptions,\n ): Promise<Repository> {\n const data = (await this.rest.post(\n `/repos/${this.owner}/${this.repo}/generate`,\n {\n owner: options.owner,\n name: options.name,\n description: options.description || '',\n private: options.isPrivate ?? true,\n include_all_branches: options.includeAllBranches ?? false,\n },\n )) as {\n name: string;\n owner: { login: string };\n description: string;\n default_branch: string;\n html_url: string;\n private: boolean;\n };\n\n return {\n owner: data.owner.login,\n name: data.name,\n description: data.description || '',\n defaultBranch: data.default_branch,\n url: data.html_url,\n isPrivate: data.private,\n };\n }\n}\n","import { createHmac, timingSafeEqual } from 'node:crypto';\nimport { ForgeError, ForgeSignatureError } from '../forge/errors.js';\nimport type {\n CheckRun,\n ForgeActor,\n ForgeEventEnvelope,\n ForgeInstallationRef,\n ForgeObservation,\n ForgePullRequestRef,\n ForgeRepositoryRef,\n} from '../forge/types.js';\n\nexport type GitHubWebhookHeaders =\n | Headers\n | Readonly<Record<string, string | readonly string[] | undefined>>;\n\n/** Construction options for raw GitHub webhook verification. */\nexport interface GitHubWebhookVerifierOptions {\n /** Current secret first, followed by still-valid rotation secrets. */\n secrets: string | readonly string[];\n now?: () => Date;\n}\n\nfunction headerValue(\n headers: GitHubWebhookHeaders,\n requestedName: string,\n): string | undefined {\n if (headers instanceof Headers) {\n return headers.get(requestedName) ?? undefined;\n }\n const requested = requestedName.toLowerCase();\n for (const [name, value] of Object.entries(headers)) {\n if (name.toLowerCase() !== requested) continue;\n return typeof value === 'string' ? value : value?.[0];\n }\n return undefined;\n}\n\nfunction object(value: unknown): Record<string, unknown> {\n return typeof value === 'object' && value !== null\n ? (value as Record<string, unknown>)\n : {};\n}\n\nfunction optionalString(value: unknown): string | undefined {\n return typeof value === 'string' && value !== '' ? value : undefined;\n}\n\nfunction actor(value: unknown): ForgeActor | undefined {\n const data = object(value);\n const login = optionalString(data.login);\n if (!login) return undefined;\n return {\n id: data.id === undefined ? undefined : String(data.id),\n login,\n type: optionalString(data.type),\n };\n}\n\nfunction repository(value: unknown): ForgeRepositoryRef | undefined {\n const data = object(value);\n const ownerData = object(data.owner);\n const fullName = optionalString(data.full_name);\n const name = optionalString(data.name);\n const owner = optionalString(ownerData.login);\n if (!name || (!owner && !fullName)) return undefined;\n const resolvedOwner = owner ?? fullName?.split('/')[0] ?? '';\n return {\n id: data.node_id === undefined ? undefined : String(data.node_id),\n owner: resolvedOwner,\n name,\n fullName: fullName ?? `${resolvedOwner}/${name}`,\n defaultBranch: optionalString(data.default_branch),\n private: typeof data.private === 'boolean' ? data.private : undefined,\n url: optionalString(data.html_url),\n };\n}\n\nfunction installation(value: unknown): ForgeInstallationRef | undefined {\n const data = object(value);\n if (data.id === undefined) return undefined;\n const accountData = object(data.account);\n return {\n id: String(data.id),\n account: optionalString(accountData.login),\n repositorySelection:\n data.repository_selection === 'all' ||\n data.repository_selection === 'selected'\n ? data.repository_selection\n : undefined,\n };\n}\n\nfunction pullRequest(value: unknown): ForgePullRequestRef {\n const data = object(value);\n const head = object(data.head);\n const base = object(data.base);\n return {\n id: data.node_id === undefined ? undefined : String(data.node_id),\n number: Number(data.number),\n state: data.state === 'closed' ? 'closed' : 'open',\n draft: typeof data.draft === 'boolean' ? data.draft : undefined,\n headSha: String(head.sha ?? ''),\n headRef: optionalString(head.ref),\n baseSha: optionalString(base.sha),\n baseRef: optionalString(base.ref),\n merged: typeof data.merged === 'boolean' ? data.merged : undefined,\n mergeCommitSha: optionalString(data.merge_commit_sha),\n url: optionalString(data.html_url),\n };\n}\n\nfunction check(value: unknown): CheckRun {\n const data = object(value);\n const app = object(data.app);\n return {\n id: String(data.id ?? data.node_id ?? ''),\n name: String(data.name ?? app.name ?? 'check_suite'),\n headSha: String(data.head_sha ?? ''),\n status: (data.status ?? 'queued') as CheckRun['status'],\n conclusion:\n typeof data.conclusion === 'string'\n ? (data.conclusion as CheckRun['conclusion'])\n : undefined,\n detailsUrl: optionalString(data.details_url),\n externalId: optionalString(data.external_id),\n startedAt: optionalString(data.started_at)\n ? new Date(String(data.started_at))\n : undefined,\n completedAt: optionalString(data.completed_at)\n ? new Date(String(data.completed_at))\n : undefined,\n raw: data,\n };\n}\n\nfunction occurrence(payload: Record<string, unknown>): Date | undefined {\n const candidates = [\n object(payload.review).submitted_at,\n object(payload.check_run).completed_at,\n object(payload.check_run).started_at,\n payload.created_at,\n object(payload.status).created_at,\n object(payload.deployment_status).created_at,\n object(payload.deployment).created_at,\n object(payload.pull_request).updated_at,\n object(payload.head_commit).timestamp,\n ];\n for (const candidate of candidates) {\n if (typeof candidate !== 'string') continue;\n const timestamp = new Date(candidate);\n if (!Number.isNaN(timestamp.getTime())) return timestamp;\n }\n return undefined;\n}\n\nfunction normalizeObservation(\n event: string,\n payload: Record<string, unknown>,\n action?: string,\n): ForgeObservation {\n if (event === 'ping') {\n return {\n kind: 'availability',\n available: true,\n message: optionalString(payload.zen),\n };\n }\n if (event === 'installation' || event === 'installation_repositories') {\n const installationRef = installation(payload.installation);\n if (!installationRef) return { kind: 'unknown' };\n const repositories = [\n ...(Array.isArray(payload.repositories) ? payload.repositories : []),\n ...(Array.isArray(payload.repositories_added)\n ? payload.repositories_added\n : []),\n ...(Array.isArray(payload.repositories_removed)\n ? payload.repositories_removed\n : []),\n ]\n .map(repository)\n .filter((item): item is ForgeRepositoryRef => item !== undefined);\n return {\n kind: 'installation',\n installation: installationRef,\n repositories,\n };\n }\n if (event === 'repository') {\n const repositoryRef = repository(payload.repository);\n return repositoryRef\n ? { kind: 'repository', repository: repositoryRef }\n : { kind: 'unknown' };\n }\n if (event === 'pull_request') {\n const pullRequestRef = pullRequest(payload.pull_request);\n return action === 'closed' && pullRequestRef.merged\n ? {\n kind: 'merge',\n pullRequest: pullRequestRef,\n mergeCommitSha: pullRequestRef.mergeCommitSha,\n }\n : { kind: 'pull_request', pullRequest: pullRequestRef };\n }\n if (event === 'pull_request_review') {\n const review = object(payload.review);\n return {\n kind: 'review',\n pullRequest: pullRequest(payload.pull_request),\n review: {\n id: String(review.id ?? review.node_id ?? ''),\n state: String(review.state ?? ''),\n body: optionalString(review.body),\n commitSha: optionalString(review.commit_id),\n submittedAt: optionalString(review.submitted_at)\n ? new Date(String(review.submitted_at))\n : undefined,\n author: actor(review.user),\n },\n };\n }\n if (event === 'push') {\n return {\n kind: 'push',\n ref: String(payload.ref ?? ''),\n beforeSha: optionalString(payload.before),\n afterSha: String(payload.after ?? ''),\n forced: typeof payload.forced === 'boolean' ? payload.forced : undefined,\n created:\n typeof payload.created === 'boolean' ? payload.created : undefined,\n deleted:\n typeof payload.deleted === 'boolean' ? payload.deleted : undefined,\n };\n }\n if (event === 'status') {\n return {\n kind: 'status',\n status: {\n id: String(payload.id ?? ''),\n sha: String(payload.sha ?? ''),\n state: String(payload.state ?? ''),\n context: String(payload.context ?? ''),\n description: optionalString(payload.description),\n targetUrl: optionalString(payload.target_url),\n createdAt: optionalString(payload.created_at)\n ? new Date(String(payload.created_at))\n : undefined,\n raw: payload,\n },\n };\n }\n if (event === 'check_run' || event === 'check_suite') {\n return {\n kind: 'check',\n check: check(payload.check_run ?? payload.check_suite),\n };\n }\n if (event === 'merge_group') {\n const mergeGroup = object(payload.merge_group);\n return {\n kind: 'merge_group',\n headSha: String(mergeGroup.head_sha ?? ''),\n headRef: optionalString(mergeGroup.head_ref),\n baseSha: optionalString(mergeGroup.base_sha),\n baseRef: optionalString(mergeGroup.base_ref),\n };\n }\n if (event === 'deployment' || event === 'deployment_status') {\n const deployment = object(payload.deployment);\n const deploymentStatus = object(payload.deployment_status);\n return {\n kind: 'deployment',\n deployment: {\n id: String(deployment.id ?? ''),\n sha: optionalString(deployment.sha),\n ref: optionalString(deployment.ref),\n environment:\n optionalString(deploymentStatus.environment) ??\n optionalString(deployment.environment),\n state: optionalString(deploymentStatus.state),\n url:\n optionalString(deploymentStatus.environment_url) ??\n optionalString(deploymentStatus.target_url),\n },\n };\n }\n return { kind: 'unknown' };\n}\n\n/**\n * Normalizes one already-verified GitHub payload.\n * @param deliveryId Stable provider delivery identity.\n * @param event GitHub event header value.\n * @param raw Parsed provider payload.\n * @param receivedAt Local receipt timestamp.\n * @returns A provider-neutral event envelope preserving the parsed payload.\n */\nexport function normalizeGitHubWebhook(\n deliveryId: string,\n event: string,\n raw: unknown,\n receivedAt = new Date(),\n): ForgeEventEnvelope {\n const payload = object(raw);\n const action = optionalString(payload.action);\n return {\n provider: 'github',\n deliveryId,\n event,\n action,\n occurredAt: occurrence(payload),\n receivedAt,\n installation: installation(payload.installation),\n repository: repository(payload.repository),\n actor: actor(payload.sender),\n observation: normalizeObservation(event, payload, action),\n raw,\n };\n}\n\nexport class GitHubWebhookVerifier {\n private readonly secrets: readonly string[];\n private readonly now: () => Date;\n\n /**\n * Creates a verifier with a current secret and optional rotation secrets.\n * @param options Current/rotation secrets and optional clock.\n * @throws {ForgeError} When no non-empty secret is configured.\n */\n constructor(options: GitHubWebhookVerifierOptions) {\n this.secrets =\n typeof options.secrets === 'string'\n ? [options.secrets]\n : [...options.secrets];\n if (this.secrets.length === 0 || this.secrets.some((secret) => !secret)) {\n throw new ForgeError(\n 'At least one non-empty GitHub webhook secret is required',\n 'CONFIGURATION_ERROR',\n { provider: 'github' },\n );\n }\n this.now = options.now ?? (() => new Date());\n }\n\n /**\n * Verifies unchanged provider bytes with constant-time comparisons.\n * @param rawBody Exact bytes received from the HTTP server.\n * @param signature GitHub SHA-256 signature header.\n * @returns Index of the configured secret that matched.\n * @throws {ForgeSignatureError} When the signature is missing or invalid.\n */\n verify(rawBody: Uint8Array, signature: string | undefined): number {\n if (!signature?.startsWith('sha256=')) throw new ForgeSignatureError();\n const suppliedHex = signature.slice('sha256='.length);\n if (!/^[a-fA-F0-9]{64}$/.test(suppliedHex)) {\n throw new ForgeSignatureError();\n }\n const supplied = Buffer.from(suppliedHex, 'hex');\n let matchedIndex = -1;\n this.secrets.forEach((secret, index) => {\n const expected = createHmac('sha256', secret).update(rawBody).digest();\n if (timingSafeEqual(expected, supplied)) matchedIndex = index;\n });\n if (matchedIndex === -1) throw new ForgeSignatureError();\n return matchedIndex;\n }\n\n /**\n * Verifies raw bytes before decoding and normalizes the delivery.\n * @param rawBody Exact bytes received from the HTTP server.\n * @param headers Case-insensitive GitHub delivery headers.\n * @returns Verified normalized delivery.\n * @throws {ForgeError} For invalid signatures, headers, UTF-8, or JSON.\n */\n verifyAndNormalize(\n rawBody: Uint8Array,\n headers: GitHubWebhookHeaders,\n ): ForgeEventEnvelope {\n this.verify(rawBody, headerValue(headers, 'x-hub-signature-256'));\n const deliveryId = headerValue(headers, 'x-github-delivery');\n const event = headerValue(headers, 'x-github-event');\n if (!deliveryId || !event) {\n throw new ForgeError(\n 'GitHub delivery identity and event headers are required',\n 'INVALID_INPUT',\n { provider: 'github' },\n );\n }\n let payload: unknown;\n try {\n payload = JSON.parse(\n new TextDecoder('utf-8', { fatal: true }).decode(rawBody),\n );\n } catch (cause) {\n throw new ForgeError(\n 'GitHub webhook body is not valid UTF-8 JSON',\n 'INVALID_INPUT',\n { cause, provider: 'github' },\n );\n }\n return normalizeGitHubWebhook(deliveryId, event, payload, this.now());\n }\n}\n","/**\n * Issue body parsing and rendering utilities\n *\n * Parses GitHub issue bodies created from YAML form templates.\n * GitHub renders form fields as markdown sections with ### headings.\n */\n\nimport { readFile } from 'node:fs/promises';\nimport yaml from 'js-yaml';\nimport type { IRepository } from './types.js';\n\n/**\n * Template field definition - mirrors GitHub ISSUE_TEMPLATE YAML structure\n */\nexport interface TemplateField {\n type: 'textarea' | 'input' | 'dropdown' | 'checkboxes' | 'markdown';\n id?: string;\n attributes: {\n label: string;\n description?: string;\n placeholder?: string;\n value?: string;\n options?: string[];\n };\n validations?: {\n required?: boolean;\n };\n}\n\n/**\n * Issue template definition\n */\nexport interface IssueTemplate {\n name: string;\n description?: string;\n title?: string;\n labels?: string[];\n assignees?: string[];\n body: TemplateField[];\n}\n\n/**\n * Load and parse an issue template from a YAML file\n *\n * @param yamlPath - Path to the YAML template file\n * @returns Parsed issue template\n *\n * @example\n * ```typescript\n * const template = await loadIssueTemplate('.github/ISSUE_TEMPLATE/bug_report.yml');\n * ```\n */\nexport async function loadIssueTemplate(\n yamlPath: string,\n): Promise<IssueTemplate> {\n const content = await readFile(yamlPath, 'utf-8');\n return parseIssueTemplate(content);\n}\n\n/**\n * Parse an issue template from YAML content\n *\n * @param yamlContent - YAML content string\n * @returns Parsed issue template\n *\n * @example\n * ```typescript\n * const template = parseIssueTemplate(`\n * name: Bug Report\n * body:\n * - type: textarea\n * id: description\n * attributes:\n * label: Description\n * `);\n * ```\n */\nexport function parseIssueTemplate(yamlContent: string): IssueTemplate {\n const parsed = yaml.load(yamlContent) as IssueTemplate;\n\n if (!parsed.name) {\n throw new Error('Issue template must have a name');\n }\n\n if (!parsed.body || !Array.isArray(parsed.body)) {\n throw new Error('Issue template must have a body array');\n }\n\n return parsed;\n}\n\n/**\n * Parse an issue body into field values\n *\n * GitHub renders form fields as markdown sections:\n * ```\n * ### Label\n *\n * Content here\n *\n * ### Next Label\n * ```\n *\n * Without a template, returns a Record<string, string> keyed by label.\n * With a template, returns a Record<string, string> keyed by field ID.\n *\n * @param body - The issue body markdown\n * @param template - Optional template for mapping labels to field IDs\n * @returns Parsed fields as key-value pairs\n *\n * @example\n * ```typescript\n * // Without template - keyed by label\n * const fields = parseIssueBody(issue.body);\n * // { 'Description': '...', 'Steps to Reproduce': '...' }\n *\n * // With template - keyed by field ID\n * const template = await loadIssueTemplate('.github/ISSUE_TEMPLATE/bug_report.yml');\n * const fields = parseIssueBody(issue.body, template);\n * // { description: '...', reproduction: '...' }\n * ```\n */\nexport function parseIssueBody(\n body: string,\n template?: IssueTemplate,\n): Record<string, string> {\n const sections = parseSections(body);\n\n if (!template) {\n return sections;\n }\n\n // Build label-to-id mapping from template\n const labelToId = new Map<string, string>();\n for (const field of template.body) {\n if (field.id && field.attributes?.label) {\n labelToId.set(field.attributes.label, field.id);\n }\n }\n\n // Map labels to field IDs\n const result: Record<string, string> = {};\n for (const [label, content] of Object.entries(sections)) {\n const id = labelToId.get(label);\n if (id) {\n result[id] = content;\n } else {\n // Keep original label if no ID mapping found\n result[label] = content;\n }\n }\n\n return result;\n}\n\n/**\n * Parse markdown sections (### headers) into key-value pairs\n */\nfunction parseSections(body: string): Record<string, string> {\n const result: Record<string, string> = {};\n\n // Match ### headers and their content\n // Content is everything until the next ### or --- or end of string\n const sectionRegex =\n /^### (.+?)\\r?\\n\\r?\\n([\\s\\S]*?)(?=\\r?\\n### |\\r?\\n---|\\s*$)/gm;\n\n for (const match of body.matchAll(sectionRegex)) {\n const label = match[1].trim();\n const content = match[2].trim();\n result[label] = content;\n }\n\n return result;\n}\n\n/**\n * Render fields into an issue body markdown string\n *\n * Without a template, uses field keys as labels.\n * With a template, uses field IDs to look up labels and renders in template order.\n *\n * @param fields - Field values as key-value pairs\n * @param template - Optional template for field ordering and labels\n * @returns Markdown string for issue body\n *\n * @example\n * ```typescript\n * // Without template\n * const body = renderIssueBody({\n * 'Description': 'Bug description here',\n * 'Steps to Reproduce': '1. Do X\\n2. See error'\n * });\n *\n * // With template\n * const template = await loadIssueTemplate('.github/ISSUE_TEMPLATE/bug_report.yml');\n * const body = renderIssueBody({\n * description: 'Bug description here',\n * reproduction: '1. Do X\\n2. See error'\n * }, template);\n * ```\n */\nexport function renderIssueBody(\n fields: Record<string, string>,\n template?: IssueTemplate,\n): string {\n const sections: string[] = [];\n\n if (!template) {\n // Without template, render in field order\n for (const [label, content] of Object.entries(fields)) {\n sections.push(`### ${label}\\n\\n${content}`);\n }\n } else {\n // With template, render in template order using field IDs\n const idToContent = new Map(Object.entries(fields));\n\n for (const field of template.body) {\n // Skip markdown-only fields (no id)\n if (!field.id || field.type === 'markdown') {\n continue;\n }\n\n const label = field.attributes?.label || field.id;\n const content = idToContent.get(field.id);\n\n if (content !== undefined) {\n sections.push(`### ${label}\\n\\n${content}`);\n }\n }\n }\n\n return sections.join('\\n\\n');\n}\n\n/**\n * Get a specific field value from an issue body\n *\n * @param body - The issue body markdown\n * @param fieldIdOrLabel - Field ID (with template) or label (without template)\n * @param template - Optional template for field ID lookup\n * @returns Field value or undefined if not found\n */\nexport function getIssueField(\n body: string,\n fieldIdOrLabel: string,\n template?: IssueTemplate,\n): string | undefined {\n const fields = parseIssueBody(body, template);\n return fields[fieldIdOrLabel];\n}\n\n/**\n * Update a specific field in an issue body\n *\n * @param body - The issue body markdown\n * @param fieldIdOrLabel - Field ID (with template) or label (without template)\n * @param value - New value for the field\n * @param template - Optional template for field ID lookup\n * @returns Updated issue body markdown\n */\nexport function updateIssueField(\n body: string,\n fieldIdOrLabel: string,\n value: string,\n template?: IssueTemplate,\n): string {\n const fields = parseIssueBody(body, template);\n fields[fieldIdOrLabel] = value;\n return renderIssueBody(fields, template);\n}\n\n/**\n * Fetch issue templates from a repository via GitHub API\n *\n * @param repo - Repository client implementing IRepository\n * @returns Array of parsed issue templates\n *\n * @example\n * ```typescript\n * const repo = await getRepository({ type: 'github', owner: 'org', repo: 'name', token });\n * const templates = await fetchIssueTemplates(repo);\n * // [{ name: 'Bug Report', labels: ['bug'], body: [...] }, ...]\n * ```\n */\nexport async function fetchIssueTemplates(\n repo: IRepository,\n): Promise<IssueTemplate[]> {\n const templatePath = '.github/ISSUE_TEMPLATE';\n const files = await repo.listDirectoryFiles(templatePath);\n const templates: IssueTemplate[] = [];\n\n for (const file of files) {\n if (file.endsWith('.yml') || file.endsWith('.yaml')) {\n const content = await repo.getFileContent(`${templatePath}/${file}`);\n if (content) {\n try {\n templates.push(parseIssueTemplate(content));\n } catch (e) {\n console.warn(`[repos] Failed to parse template ${file}:`, e);\n }\n }\n }\n }\n\n return templates;\n}\n\n/**\n * Detect which template an issue was created from based on labels\n *\n * Matches issue labels against template labels to find the best match.\n * Returns the template with the most matching labels.\n *\n * @param labels - Issue labels\n * @param templates - Available templates\n * @returns Matching template or undefined if no match\n *\n * @example\n * ```typescript\n * const templates = await fetchIssueTemplates(repo);\n * const template = detectTemplateFromLabels(['bug', 'critical'], templates);\n * if (template) {\n * const fields = parseIssueBody(issue.body, template);\n * }\n * ```\n */\nexport function detectTemplateFromLabels(\n labels: string[],\n templates: IssueTemplate[],\n): IssueTemplate | undefined {\n const labelSet = new Set(labels.map((l) => l.toLowerCase()));\n\n let bestMatch: IssueTemplate | undefined;\n let bestScore = 0;\n\n for (const template of templates) {\n if (!template.labels || template.labels.length === 0) continue;\n\n const matchCount = template.labels.filter((l) =>\n labelSet.has(l.toLowerCase()),\n ).length;\n\n // Require at least one matching label\n if (matchCount > 0 && matchCount > bestScore) {\n bestScore = matchCount;\n bestMatch = template;\n }\n }\n\n return bestMatch;\n}\n"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"index.js","names":["isBytes","anumber","abytes","aexists","aoutput","clean","createView","hasHexBuiltin","createView","_0n","_1n","abool","bytesToHex_","copyBytes","abytes_","hexToBytes_","concatBytes_","_0n","_1n","_2n","_3n","_4n","gcd","_0n","_1n","_2n","_0n","abytes","wcRandomBytes","isBytes","randomBytes","hmac","nobleHmac","abytes","isBytes","abytes","anumber","isAligned32","isAligned32","encrypt","decrypt","bytesToHex2","hexToBytes2","bytesToHex3","hexToBytes3","hexToBytes4","sha2562","bytesToHex4","hkdf_extract","sha2563","secp256k12","hexToBytes5","hkdf_expand","concatBytes2","base642","randomBytes2","bech322","sha2564","hexToBytes6","bytesToHex5","base643","bytesToHex6","sha2565"],"sources":["../src/errors.ts","../src/factory.ts","../src/forge/errors.ts","../../../node_modules/.pnpm/@noble+hashes@2.0.1/node_modules/@noble/hashes/utils.js","../../../node_modules/.pnpm/@noble+hashes@2.0.1/node_modules/@noble/hashes/_md.js","../../../node_modules/.pnpm/@noble+hashes@2.0.1/node_modules/@noble/hashes/sha2.js","../../../node_modules/.pnpm/@noble+curves@2.0.1/node_modules/@noble/curves/utils.js","../../../node_modules/.pnpm/@noble+curves@2.0.1/node_modules/@noble/curves/abstract/modular.js","../../../node_modules/.pnpm/@noble+curves@2.0.1/node_modules/@noble/curves/abstract/curve.js","../../../node_modules/.pnpm/@noble+hashes@2.0.1/node_modules/@noble/hashes/hmac.js","../../../node_modules/.pnpm/@noble+curves@2.0.1/node_modules/@noble/curves/abstract/weierstrass.js","../../../node_modules/.pnpm/@noble+curves@2.0.1/node_modules/@noble/curves/secp256k1.js","../../../node_modules/.pnpm/@scure+base@2.0.0/node_modules/@scure/base/index.js","../../../node_modules/.pnpm/@noble+ciphers@2.1.1/node_modules/@noble/ciphers/utils.js","../../../node_modules/.pnpm/@noble+ciphers@2.1.1/node_modules/@noble/ciphers/aes.js","../../../node_modules/.pnpm/@noble+ciphers@2.1.1/node_modules/@noble/ciphers/_arx.js","../../../node_modules/.pnpm/@noble+ciphers@2.1.1/node_modules/@noble/ciphers/_poly1305.js","../../../node_modules/.pnpm/@noble+ciphers@2.1.1/node_modules/@noble/ciphers/chacha.js","../../../node_modules/.pnpm/@noble+hashes@2.0.1/node_modules/@noble/hashes/hkdf.js","../../../node_modules/.pnpm/nostr-tools@2.23.3_typescript@5.9.3/node_modules/nostr-tools/lib/esm/index.js","../src/buzz/types.ts","../src/buzz/events.ts","../src/buzz/fixtures.ts","../src/buzz/relay.ts","../src/github/forge.ts","../src/github/transport.ts","../src/github/app.ts","../src/github/fixtures.ts","../src/github/rest.ts","../src/github/index.ts","../src/github/webhooks.ts","../src/parsing.ts"],"sourcesContent":["/**\n * Repository error handling\n */\n\nexport enum RepositoryErrorCode {\n NOT_FOUND = 'NOT_FOUND',\n UNAUTHORIZED = 'UNAUTHORIZED',\n FORBIDDEN = 'FORBIDDEN',\n RATE_LIMITED = 'RATE_LIMITED',\n VALIDATION_ERROR = 'VALIDATION_ERROR',\n NETWORK_ERROR = 'NETWORK_ERROR',\n UNKNOWN = 'UNKNOWN',\n}\n\nexport class RepositoryError extends Error {\n constructor(\n message: string,\n public code: RepositoryErrorCode,\n public statusCode?: number,\n public response?: unknown,\n ) {\n super(message);\n this.name = 'RepositoryError';\n Error.captureStackTrace(this, this.constructor);\n }\n\n static fromHTTPStatus(\n statusCode: number,\n message: string,\n response?: unknown,\n ): RepositoryError {\n let code: RepositoryErrorCode;\n\n switch (statusCode) {\n case 404:\n code = RepositoryErrorCode.NOT_FOUND;\n break;\n case 401:\n code = RepositoryErrorCode.UNAUTHORIZED;\n break;\n case 403:\n code = RepositoryErrorCode.FORBIDDEN;\n break;\n case 429:\n code = RepositoryErrorCode.RATE_LIMITED;\n break;\n case 422:\n code = RepositoryErrorCode.VALIDATION_ERROR;\n break;\n default:\n code = RepositoryErrorCode.UNKNOWN;\n }\n\n return new RepositoryError(message, code, statusCode, response);\n }\n\n static networkError(message: string, cause?: Error): RepositoryError {\n return new RepositoryError(\n message,\n RepositoryErrorCode.NETWORK_ERROR,\n undefined,\n cause,\n );\n }\n\n isRetryable(): boolean {\n return (\n this.code === RepositoryErrorCode.RATE_LIMITED ||\n this.code === RepositoryErrorCode.NETWORK_ERROR\n );\n }\n}\n","/**\n * Repository factory function\n *\n * Creates repository instances following the pattern from @happyvertical/files and @happyvertical/sql\n */\n\nimport { RepositoryError, RepositoryErrorCode } from './errors.js';\nimport type { IRepository, RepositoryConfig } from './types.js';\n\n/**\n * Check if value is already a repository instance\n */\nfunction isRepositoryInstance(value: unknown): value is IRepository {\n return (\n value !== null &&\n typeof value === 'object' &&\n 'getIssue' in value &&\n 'createIssue' in value &&\n 'addLabels' in value &&\n typeof (value as IRepository).getIssue === 'function'\n );\n}\n\n/**\n * Get a repository client instance\n *\n * This is the main entry point following the pattern from @happyvertical/files and @happyvertical/sql.\n * It can accept either a configuration object or an existing repository instance.\n *\n * @param options - Repository configuration or existing repository instance\n * @returns Promise resolving to repository interface\n *\n * @example\n * ```typescript\n * import { getRepository } from '@happyvertical/repos';\n *\n * // Create a GitHub repository client\n * const repo = await getRepository({\n * type: 'github',\n * owner: 'happyvertical',\n * repo: 'sdk',\n * token: process.env.GITHUB_TOKEN\n * });\n *\n * // Use the client\n * const issue = await repo.getIssue(352);\n * await repo.addLabels(352, ['type: feature', 'priority: high']);\n *\n * // Pass existing instance (returns it unchanged)\n * const sameRepo = await getRepository(repo);\n * ```\n */\nexport async function getRepository(\n options: RepositoryConfig | IRepository,\n): Promise<IRepository> {\n // If already a repository instance, return it\n if (isRepositoryInstance(options)) {\n return options;\n }\n\n // Validate configuration\n if (!options.type) {\n throw new RepositoryError(\n 'Repository type is required',\n RepositoryErrorCode.VALIDATION_ERROR,\n );\n }\n\n if (!options.owner || !options.repo) {\n throw new RepositoryError(\n 'Repository owner and repo are required',\n RepositoryErrorCode.VALIDATION_ERROR,\n );\n }\n\n if (!options.token) {\n throw new RepositoryError(\n 'Authentication token is required',\n RepositoryErrorCode.UNAUTHORIZED,\n );\n }\n\n // Create repository instance based on type\n switch (options.type) {\n case 'github': {\n const { GitHubRepository } = await import('./github/index.js');\n return new GitHubRepository(options);\n }\n\n case 'gitlab':\n throw new RepositoryError(\n 'GitLab support not yet implemented',\n RepositoryErrorCode.UNKNOWN,\n );\n\n case 'bitbucket':\n throw new RepositoryError(\n 'Bitbucket support not yet implemented',\n RepositoryErrorCode.UNKNOWN,\n );\n\n case 'azure':\n throw new RepositoryError(\n 'Azure DevOps support not yet implemented',\n RepositoryErrorCode.UNKNOWN,\n );\n\n default:\n throw new RepositoryError(\n `Unsupported repository type: ${options.type}`,\n RepositoryErrorCode.VALIDATION_ERROR,\n );\n }\n}\n","import type { ForgeProvider, ForgeRateLimit } from './types.js';\n\nexport type ForgeErrorCode =\n | 'AUTHENTICATION_FAILED'\n | 'AUTHORITY_MISMATCH'\n | 'CONFIGURATION_ERROR'\n | 'INVALID_INPUT'\n | 'NOT_FOUND'\n | 'PROVIDER_ERROR'\n | 'RATE_LIMITED'\n | 'SIGNATURE_INVALID'\n | 'TRANSPORT_ERROR';\n\nexport class ForgeError extends Error {\n readonly provider?: ForgeProvider;\n readonly code: ForgeErrorCode;\n readonly status?: number;\n readonly requestId?: string;\n readonly rateLimit?: ForgeRateLimit;\n readonly details?: unknown;\n readonly retryable: boolean;\n\n constructor(\n message: string,\n code: ForgeErrorCode,\n options: {\n cause?: unknown;\n provider?: ForgeProvider;\n status?: number;\n requestId?: string;\n rateLimit?: ForgeRateLimit;\n details?: unknown;\n retryable?: boolean;\n } = {},\n ) {\n super(\n message,\n options.cause === undefined ? undefined : { cause: options.cause },\n );\n this.name = 'ForgeError';\n this.code = code;\n this.provider = options.provider;\n this.status = options.status;\n this.requestId = options.requestId;\n this.rateLimit = options.rateLimit;\n this.details = options.details;\n this.retryable = options.retryable ?? false;\n }\n}\n\nexport class ForgeSignatureError extends ForgeError {\n constructor(message = 'Forge webhook signature is invalid') {\n super(message, 'SIGNATURE_INVALID');\n this.name = 'ForgeSignatureError';\n }\n}\n","/**\n * Utilities for hex, bytes, CSPRNG.\n * @module\n */\n/*! noble-hashes - MIT License (c) 2022 Paul Miller (paulmillr.com) */\n/** Checks if something is Uint8Array. Be careful: nodejs Buffer will return true. */\nexport function isBytes(a) {\n return a instanceof Uint8Array || (ArrayBuffer.isView(a) && a.constructor.name === 'Uint8Array');\n}\n/** Asserts something is positive integer. */\nexport function anumber(n, title = '') {\n if (!Number.isSafeInteger(n) || n < 0) {\n const prefix = title && `\"${title}\" `;\n throw new Error(`${prefix}expected integer >= 0, got ${n}`);\n }\n}\n/** Asserts something is Uint8Array. */\nexport function abytes(value, length, title = '') {\n const bytes = isBytes(value);\n const len = value?.length;\n const needsLen = length !== undefined;\n if (!bytes || (needsLen && len !== length)) {\n const prefix = title && `\"${title}\" `;\n const ofLen = needsLen ? ` of length ${length}` : '';\n const got = bytes ? `length=${len}` : `type=${typeof value}`;\n throw new Error(prefix + 'expected Uint8Array' + ofLen + ', got ' + got);\n }\n return value;\n}\n/** Asserts something is hash */\nexport function ahash(h) {\n if (typeof h !== 'function' || typeof h.create !== 'function')\n throw new Error('Hash must wrapped by utils.createHasher');\n anumber(h.outputLen);\n anumber(h.blockLen);\n}\n/** Asserts a hash instance has not been destroyed / finished */\nexport function aexists(instance, checkFinished = true) {\n if (instance.destroyed)\n throw new Error('Hash instance has been destroyed');\n if (checkFinished && instance.finished)\n throw new Error('Hash#digest() has already been called');\n}\n/** Asserts output is properly-sized byte array */\nexport function aoutput(out, instance) {\n abytes(out, undefined, 'digestInto() output');\n const min = instance.outputLen;\n if (out.length < min) {\n throw new Error('\"digestInto() output\" expected to be of length >=' + min);\n }\n}\n/** Cast u8 / u16 / u32 to u8. */\nexport function u8(arr) {\n return new Uint8Array(arr.buffer, arr.byteOffset, arr.byteLength);\n}\n/** Cast u8 / u16 / u32 to u32. */\nexport function u32(arr) {\n return new Uint32Array(arr.buffer, arr.byteOffset, Math.floor(arr.byteLength / 4));\n}\n/** Zeroize a byte array. Warning: JS provides no guarantees. */\nexport function clean(...arrays) {\n for (let i = 0; i < arrays.length; i++) {\n arrays[i].fill(0);\n }\n}\n/** Create DataView of an array for easy byte-level manipulation. */\nexport function createView(arr) {\n return new DataView(arr.buffer, arr.byteOffset, arr.byteLength);\n}\n/** The rotate right (circular right shift) operation for uint32 */\nexport function rotr(word, shift) {\n return (word << (32 - shift)) | (word >>> shift);\n}\n/** The rotate left (circular left shift) operation for uint32 */\nexport function rotl(word, shift) {\n return (word << shift) | ((word >>> (32 - shift)) >>> 0);\n}\n/** Is current platform little-endian? Most are. Big-Endian platform: IBM */\nexport const isLE = /* @__PURE__ */ (() => new Uint8Array(new Uint32Array([0x11223344]).buffer)[0] === 0x44)();\n/** The byte swap operation for uint32 */\nexport function byteSwap(word) {\n return (((word << 24) & 0xff000000) |\n ((word << 8) & 0xff0000) |\n ((word >>> 8) & 0xff00) |\n ((word >>> 24) & 0xff));\n}\n/** Conditionally byte swap if on a big-endian platform */\nexport const swap8IfBE = isLE\n ? (n) => n\n : (n) => byteSwap(n);\n/** In place byte swap for Uint32Array */\nexport function byteSwap32(arr) {\n for (let i = 0; i < arr.length; i++) {\n arr[i] = byteSwap(arr[i]);\n }\n return arr;\n}\nexport const swap32IfBE = isLE\n ? (u) => u\n : byteSwap32;\n// Built-in hex conversion https://caniuse.com/mdn-javascript_builtins_uint8array_fromhex\nconst hasHexBuiltin = /* @__PURE__ */ (() => \n// @ts-ignore\ntypeof Uint8Array.from([]).toHex === 'function' && typeof Uint8Array.fromHex === 'function')();\n// Array where index 0xf0 (240) is mapped to string 'f0'\nconst hexes = /* @__PURE__ */ Array.from({ length: 256 }, (_, i) => i.toString(16).padStart(2, '0'));\n/**\n * Convert byte array to hex string. Uses built-in function, when available.\n * @example bytesToHex(Uint8Array.from([0xca, 0xfe, 0x01, 0x23])) // 'cafe0123'\n */\nexport function bytesToHex(bytes) {\n abytes(bytes);\n // @ts-ignore\n if (hasHexBuiltin)\n return bytes.toHex();\n // pre-caching improves the speed 6x\n let hex = '';\n for (let i = 0; i < bytes.length; i++) {\n hex += hexes[bytes[i]];\n }\n return hex;\n}\n// We use optimized technique to convert hex string to byte array\nconst asciis = { _0: 48, _9: 57, A: 65, F: 70, a: 97, f: 102 };\nfunction asciiToBase16(ch) {\n if (ch >= asciis._0 && ch <= asciis._9)\n return ch - asciis._0; // '2' => 50-48\n if (ch >= asciis.A && ch <= asciis.F)\n return ch - (asciis.A - 10); // 'B' => 66-(65-10)\n if (ch >= asciis.a && ch <= asciis.f)\n return ch - (asciis.a - 10); // 'b' => 98-(97-10)\n return;\n}\n/**\n * Convert hex string to byte array. Uses built-in function, when available.\n * @example hexToBytes('cafe0123') // Uint8Array.from([0xca, 0xfe, 0x01, 0x23])\n */\nexport function hexToBytes(hex) {\n if (typeof hex !== 'string')\n throw new Error('hex string expected, got ' + typeof hex);\n // @ts-ignore\n if (hasHexBuiltin)\n return Uint8Array.fromHex(hex);\n const hl = hex.length;\n const al = hl / 2;\n if (hl % 2)\n throw new Error('hex string expected, got unpadded hex of length ' + hl);\n const array = new Uint8Array(al);\n for (let ai = 0, hi = 0; ai < al; ai++, hi += 2) {\n const n1 = asciiToBase16(hex.charCodeAt(hi));\n const n2 = asciiToBase16(hex.charCodeAt(hi + 1));\n if (n1 === undefined || n2 === undefined) {\n const char = hex[hi] + hex[hi + 1];\n throw new Error('hex string expected, got non-hex character \"' + char + '\" at index ' + hi);\n }\n array[ai] = n1 * 16 + n2; // multiply first octet, e.g. 'a3' => 10*16+3 => 160 + 3 => 163\n }\n return array;\n}\n/**\n * There is no setImmediate in browser and setTimeout is slow.\n * Call of async fn will return Promise, which will be fullfiled only on\n * next scheduler queue processing step and this is exactly what we need.\n */\nexport const nextTick = async () => { };\n/** Returns control to thread each 'tick' ms to avoid blocking. */\nexport async function asyncLoop(iters, tick, cb) {\n let ts = Date.now();\n for (let i = 0; i < iters; i++) {\n cb(i);\n // Date.now() is not monotonic, so in case if clock goes backwards we return return control too\n const diff = Date.now() - ts;\n if (diff >= 0 && diff < tick)\n continue;\n await nextTick();\n ts += diff;\n }\n}\n/**\n * Converts string to bytes using UTF8 encoding.\n * Built-in doesn't validate input to be string: we do the check.\n * @example utf8ToBytes('abc') // Uint8Array.from([97, 98, 99])\n */\nexport function utf8ToBytes(str) {\n if (typeof str !== 'string')\n throw new Error('string expected');\n return new Uint8Array(new TextEncoder().encode(str)); // https://bugzil.la/1681809\n}\n/**\n * Helper for KDFs: consumes uint8array or string.\n * When string is passed, does utf8 decoding, using TextDecoder.\n */\nexport function kdfInputToBytes(data, errorTitle = '') {\n if (typeof data === 'string')\n return utf8ToBytes(data);\n return abytes(data, undefined, errorTitle);\n}\n/** Copies several Uint8Arrays into one. */\nexport function concatBytes(...arrays) {\n let sum = 0;\n for (let i = 0; i < arrays.length; i++) {\n const a = arrays[i];\n abytes(a);\n sum += a.length;\n }\n const res = new Uint8Array(sum);\n for (let i = 0, pad = 0; i < arrays.length; i++) {\n const a = arrays[i];\n res.set(a, pad);\n pad += a.length;\n }\n return res;\n}\n/** Merges default options and passed options. */\nexport function checkOpts(defaults, opts) {\n if (opts !== undefined && {}.toString.call(opts) !== '[object Object]')\n throw new Error('options must be object or undefined');\n const merged = Object.assign(defaults, opts);\n return merged;\n}\n/** Creates function with outputLen, blockLen, create properties from a class constructor. */\nexport function createHasher(hashCons, info = {}) {\n const hashC = (msg, opts) => hashCons(opts).update(msg).digest();\n const tmp = hashCons(undefined);\n hashC.outputLen = tmp.outputLen;\n hashC.blockLen = tmp.blockLen;\n hashC.create = (opts) => hashCons(opts);\n Object.assign(hashC, info);\n return Object.freeze(hashC);\n}\n/** Cryptographically secure PRNG. Uses internal OS-level `crypto.getRandomValues`. */\nexport function randomBytes(bytesLength = 32) {\n const cr = typeof globalThis === 'object' ? globalThis.crypto : null;\n if (typeof cr?.getRandomValues !== 'function')\n throw new Error('crypto.getRandomValues must be defined');\n return cr.getRandomValues(new Uint8Array(bytesLength));\n}\n/** Creates OID opts for NIST hashes, with prefix 06 09 60 86 48 01 65 03 04 02. */\nexport const oidNist = (suffix) => ({\n oid: Uint8Array.from([0x06, 0x09, 0x60, 0x86, 0x48, 0x01, 0x65, 0x03, 0x04, 0x02, suffix]),\n});\n//# sourceMappingURL=utils.js.map","/**\n * Internal Merkle-Damgard hash utils.\n * @module\n */\nimport { abytes, aexists, aoutput, clean, createView } from \"./utils.js\";\n/** Choice: a ? b : c */\nexport function Chi(a, b, c) {\n return (a & b) ^ (~a & c);\n}\n/** Majority function, true if any two inputs is true. */\nexport function Maj(a, b, c) {\n return (a & b) ^ (a & c) ^ (b & c);\n}\n/**\n * Merkle-Damgard hash construction base class.\n * Could be used to create MD5, RIPEMD, SHA1, SHA2.\n */\nexport class HashMD {\n blockLen;\n outputLen;\n padOffset;\n isLE;\n // For partial updates less than block size\n buffer;\n view;\n finished = false;\n length = 0;\n pos = 0;\n destroyed = false;\n constructor(blockLen, outputLen, padOffset, isLE) {\n this.blockLen = blockLen;\n this.outputLen = outputLen;\n this.padOffset = padOffset;\n this.isLE = isLE;\n this.buffer = new Uint8Array(blockLen);\n this.view = createView(this.buffer);\n }\n update(data) {\n aexists(this);\n abytes(data);\n const { view, buffer, blockLen } = this;\n const len = data.length;\n for (let pos = 0; pos < len;) {\n const take = Math.min(blockLen - this.pos, len - pos);\n // Fast path: we have at least one block in input, cast it to view and process\n if (take === blockLen) {\n const dataView = createView(data);\n for (; blockLen <= len - pos; pos += blockLen)\n this.process(dataView, pos);\n continue;\n }\n buffer.set(data.subarray(pos, pos + take), this.pos);\n this.pos += take;\n pos += take;\n if (this.pos === blockLen) {\n this.process(view, 0);\n this.pos = 0;\n }\n }\n this.length += data.length;\n this.roundClean();\n return this;\n }\n digestInto(out) {\n aexists(this);\n aoutput(out, this);\n this.finished = true;\n // Padding\n // We can avoid allocation of buffer for padding completely if it\n // was previously not allocated here. But it won't change performance.\n const { buffer, view, blockLen, isLE } = this;\n let { pos } = this;\n // append the bit '1' to the message\n buffer[pos++] = 0b10000000;\n clean(this.buffer.subarray(pos));\n // we have less than padOffset left in buffer, so we cannot put length in\n // current block, need process it and pad again\n if (this.padOffset > blockLen - pos) {\n this.process(view, 0);\n pos = 0;\n }\n // Pad until full block byte with zeros\n for (let i = pos; i < blockLen; i++)\n buffer[i] = 0;\n // Note: sha512 requires length to be 128bit integer, but length in JS will overflow before that\n // You need to write around 2 exabytes (u64_max / 8 / (1024**6)) for this to happen.\n // So we just write lowest 64 bits of that value.\n view.setBigUint64(blockLen - 8, BigInt(this.length * 8), isLE);\n this.process(view, 0);\n const oview = createView(out);\n const len = this.outputLen;\n // NOTE: we do division by 4 later, which must be fused in single op with modulo by JIT\n if (len % 4)\n throw new Error('_sha2: outputLen must be aligned to 32bit');\n const outLen = len / 4;\n const state = this.get();\n if (outLen > state.length)\n throw new Error('_sha2: outputLen bigger than state');\n for (let i = 0; i < outLen; i++)\n oview.setUint32(4 * i, state[i], isLE);\n }\n digest() {\n const { buffer, outputLen } = this;\n this.digestInto(buffer);\n const res = buffer.slice(0, outputLen);\n this.destroy();\n return res;\n }\n _cloneInto(to) {\n to ||= new this.constructor();\n to.set(...this.get());\n const { blockLen, buffer, length, finished, destroyed, pos } = this;\n to.destroyed = destroyed;\n to.finished = finished;\n to.length = length;\n to.pos = pos;\n if (length % blockLen)\n to.buffer.set(buffer);\n return to;\n }\n clone() {\n return this._cloneInto();\n }\n}\n/**\n * Initial SHA-2 state: fractional parts of square roots of first 16 primes 2..53.\n * Check out `test/misc/sha2-gen-iv.js` for recomputation guide.\n */\n/** Initial SHA256 state. Bits 0..32 of frac part of sqrt of primes 2..19 */\nexport const SHA256_IV = /* @__PURE__ */ Uint32Array.from([\n 0x6a09e667, 0xbb67ae85, 0x3c6ef372, 0xa54ff53a, 0x510e527f, 0x9b05688c, 0x1f83d9ab, 0x5be0cd19,\n]);\n/** Initial SHA224 state. Bits 32..64 of frac part of sqrt of primes 23..53 */\nexport const SHA224_IV = /* @__PURE__ */ Uint32Array.from([\n 0xc1059ed8, 0x367cd507, 0x3070dd17, 0xf70e5939, 0xffc00b31, 0x68581511, 0x64f98fa7, 0xbefa4fa4,\n]);\n/** Initial SHA384 state. Bits 0..64 of frac part of sqrt of primes 23..53 */\nexport const SHA384_IV = /* @__PURE__ */ Uint32Array.from([\n 0xcbbb9d5d, 0xc1059ed8, 0x629a292a, 0x367cd507, 0x9159015a, 0x3070dd17, 0x152fecd8, 0xf70e5939,\n 0x67332667, 0xffc00b31, 0x8eb44a87, 0x68581511, 0xdb0c2e0d, 0x64f98fa7, 0x47b5481d, 0xbefa4fa4,\n]);\n/** Initial SHA512 state. Bits 0..64 of frac part of sqrt of primes 2..19 */\nexport const SHA512_IV = /* @__PURE__ */ Uint32Array.from([\n 0x6a09e667, 0xf3bcc908, 0xbb67ae85, 0x84caa73b, 0x3c6ef372, 0xfe94f82b, 0xa54ff53a, 0x5f1d36f1,\n 0x510e527f, 0xade682d1, 0x9b05688c, 0x2b3e6c1f, 0x1f83d9ab, 0xfb41bd6b, 0x5be0cd19, 0x137e2179,\n]);\n//# sourceMappingURL=_md.js.map","/**\n * SHA2 hash function. A.k.a. sha256, sha384, sha512, sha512_224, sha512_256.\n * SHA256 is the fastest hash implementable in JS, even faster than Blake3.\n * Check out [RFC 4634](https://www.rfc-editor.org/rfc/rfc4634) and\n * [FIPS 180-4](https://nvlpubs.nist.gov/nistpubs/FIPS/NIST.FIPS.180-4.pdf).\n * @module\n */\nimport { Chi, HashMD, Maj, SHA224_IV, SHA256_IV, SHA384_IV, SHA512_IV } from \"./_md.js\";\nimport * as u64 from \"./_u64.js\";\nimport { clean, createHasher, oidNist, rotr } from \"./utils.js\";\n/**\n * Round constants:\n * First 32 bits of fractional parts of the cube roots of the first 64 primes 2..311)\n */\n// prettier-ignore\nconst SHA256_K = /* @__PURE__ */ Uint32Array.from([\n 0x428a2f98, 0x71374491, 0xb5c0fbcf, 0xe9b5dba5, 0x3956c25b, 0x59f111f1, 0x923f82a4, 0xab1c5ed5,\n 0xd807aa98, 0x12835b01, 0x243185be, 0x550c7dc3, 0x72be5d74, 0x80deb1fe, 0x9bdc06a7, 0xc19bf174,\n 0xe49b69c1, 0xefbe4786, 0x0fc19dc6, 0x240ca1cc, 0x2de92c6f, 0x4a7484aa, 0x5cb0a9dc, 0x76f988da,\n 0x983e5152, 0xa831c66d, 0xb00327c8, 0xbf597fc7, 0xc6e00bf3, 0xd5a79147, 0x06ca6351, 0x14292967,\n 0x27b70a85, 0x2e1b2138, 0x4d2c6dfc, 0x53380d13, 0x650a7354, 0x766a0abb, 0x81c2c92e, 0x92722c85,\n 0xa2bfe8a1, 0xa81a664b, 0xc24b8b70, 0xc76c51a3, 0xd192e819, 0xd6990624, 0xf40e3585, 0x106aa070,\n 0x19a4c116, 0x1e376c08, 0x2748774c, 0x34b0bcb5, 0x391c0cb3, 0x4ed8aa4a, 0x5b9cca4f, 0x682e6ff3,\n 0x748f82ee, 0x78a5636f, 0x84c87814, 0x8cc70208, 0x90befffa, 0xa4506ceb, 0xbef9a3f7, 0xc67178f2\n]);\n/** Reusable temporary buffer. \"W\" comes straight from spec. */\nconst SHA256_W = /* @__PURE__ */ new Uint32Array(64);\n/** Internal 32-byte base SHA2 hash class. */\nclass SHA2_32B extends HashMD {\n constructor(outputLen) {\n super(64, outputLen, 8, false);\n }\n get() {\n const { A, B, C, D, E, F, G, H } = this;\n return [A, B, C, D, E, F, G, H];\n }\n // prettier-ignore\n set(A, B, C, D, E, F, G, H) {\n this.A = A | 0;\n this.B = B | 0;\n this.C = C | 0;\n this.D = D | 0;\n this.E = E | 0;\n this.F = F | 0;\n this.G = G | 0;\n this.H = H | 0;\n }\n process(view, offset) {\n // Extend the first 16 words into the remaining 48 words w[16..63] of the message schedule array\n for (let i = 0; i < 16; i++, offset += 4)\n SHA256_W[i] = view.getUint32(offset, false);\n for (let i = 16; i < 64; i++) {\n const W15 = SHA256_W[i - 15];\n const W2 = SHA256_W[i - 2];\n const s0 = rotr(W15, 7) ^ rotr(W15, 18) ^ (W15 >>> 3);\n const s1 = rotr(W2, 17) ^ rotr(W2, 19) ^ (W2 >>> 10);\n SHA256_W[i] = (s1 + SHA256_W[i - 7] + s0 + SHA256_W[i - 16]) | 0;\n }\n // Compression function main loop, 64 rounds\n let { A, B, C, D, E, F, G, H } = this;\n for (let i = 0; i < 64; i++) {\n const sigma1 = rotr(E, 6) ^ rotr(E, 11) ^ rotr(E, 25);\n const T1 = (H + sigma1 + Chi(E, F, G) + SHA256_K[i] + SHA256_W[i]) | 0;\n const sigma0 = rotr(A, 2) ^ rotr(A, 13) ^ rotr(A, 22);\n const T2 = (sigma0 + Maj(A, B, C)) | 0;\n H = G;\n G = F;\n F = E;\n E = (D + T1) | 0;\n D = C;\n C = B;\n B = A;\n A = (T1 + T2) | 0;\n }\n // Add the compressed chunk to the current hash value\n A = (A + this.A) | 0;\n B = (B + this.B) | 0;\n C = (C + this.C) | 0;\n D = (D + this.D) | 0;\n E = (E + this.E) | 0;\n F = (F + this.F) | 0;\n G = (G + this.G) | 0;\n H = (H + this.H) | 0;\n this.set(A, B, C, D, E, F, G, H);\n }\n roundClean() {\n clean(SHA256_W);\n }\n destroy() {\n this.set(0, 0, 0, 0, 0, 0, 0, 0);\n clean(this.buffer);\n }\n}\n/** Internal SHA2-256 hash class. */\nexport class _SHA256 extends SHA2_32B {\n // We cannot use array here since array allows indexing by variable\n // which means optimizer/compiler cannot use registers.\n A = SHA256_IV[0] | 0;\n B = SHA256_IV[1] | 0;\n C = SHA256_IV[2] | 0;\n D = SHA256_IV[3] | 0;\n E = SHA256_IV[4] | 0;\n F = SHA256_IV[5] | 0;\n G = SHA256_IV[6] | 0;\n H = SHA256_IV[7] | 0;\n constructor() {\n super(32);\n }\n}\n/** Internal SHA2-224 hash class. */\nexport class _SHA224 extends SHA2_32B {\n A = SHA224_IV[0] | 0;\n B = SHA224_IV[1] | 0;\n C = SHA224_IV[2] | 0;\n D = SHA224_IV[3] | 0;\n E = SHA224_IV[4] | 0;\n F = SHA224_IV[5] | 0;\n G = SHA224_IV[6] | 0;\n H = SHA224_IV[7] | 0;\n constructor() {\n super(28);\n }\n}\n// SHA2-512 is slower than sha256 in js because u64 operations are slow.\n// Round contants\n// First 32 bits of the fractional parts of the cube roots of the first 80 primes 2..409\n// prettier-ignore\nconst K512 = /* @__PURE__ */ (() => u64.split([\n '0x428a2f98d728ae22', '0x7137449123ef65cd', '0xb5c0fbcfec4d3b2f', '0xe9b5dba58189dbbc',\n '0x3956c25bf348b538', '0x59f111f1b605d019', '0x923f82a4af194f9b', '0xab1c5ed5da6d8118',\n '0xd807aa98a3030242', '0x12835b0145706fbe', '0x243185be4ee4b28c', '0x550c7dc3d5ffb4e2',\n '0x72be5d74f27b896f', '0x80deb1fe3b1696b1', '0x9bdc06a725c71235', '0xc19bf174cf692694',\n '0xe49b69c19ef14ad2', '0xefbe4786384f25e3', '0x0fc19dc68b8cd5b5', '0x240ca1cc77ac9c65',\n '0x2de92c6f592b0275', '0x4a7484aa6ea6e483', '0x5cb0a9dcbd41fbd4', '0x76f988da831153b5',\n '0x983e5152ee66dfab', '0xa831c66d2db43210', '0xb00327c898fb213f', '0xbf597fc7beef0ee4',\n '0xc6e00bf33da88fc2', '0xd5a79147930aa725', '0x06ca6351e003826f', '0x142929670a0e6e70',\n '0x27b70a8546d22ffc', '0x2e1b21385c26c926', '0x4d2c6dfc5ac42aed', '0x53380d139d95b3df',\n '0x650a73548baf63de', '0x766a0abb3c77b2a8', '0x81c2c92e47edaee6', '0x92722c851482353b',\n '0xa2bfe8a14cf10364', '0xa81a664bbc423001', '0xc24b8b70d0f89791', '0xc76c51a30654be30',\n '0xd192e819d6ef5218', '0xd69906245565a910', '0xf40e35855771202a', '0x106aa07032bbd1b8',\n '0x19a4c116b8d2d0c8', '0x1e376c085141ab53', '0x2748774cdf8eeb99', '0x34b0bcb5e19b48a8',\n '0x391c0cb3c5c95a63', '0x4ed8aa4ae3418acb', '0x5b9cca4f7763e373', '0x682e6ff3d6b2b8a3',\n '0x748f82ee5defb2fc', '0x78a5636f43172f60', '0x84c87814a1f0ab72', '0x8cc702081a6439ec',\n '0x90befffa23631e28', '0xa4506cebde82bde9', '0xbef9a3f7b2c67915', '0xc67178f2e372532b',\n '0xca273eceea26619c', '0xd186b8c721c0c207', '0xeada7dd6cde0eb1e', '0xf57d4f7fee6ed178',\n '0x06f067aa72176fba', '0x0a637dc5a2c898a6', '0x113f9804bef90dae', '0x1b710b35131c471b',\n '0x28db77f523047d84', '0x32caab7b40c72493', '0x3c9ebe0a15c9bebc', '0x431d67c49c100d4c',\n '0x4cc5d4becb3e42b6', '0x597f299cfc657e2a', '0x5fcb6fab3ad6faec', '0x6c44198c4a475817'\n].map(n => BigInt(n))))();\nconst SHA512_Kh = /* @__PURE__ */ (() => K512[0])();\nconst SHA512_Kl = /* @__PURE__ */ (() => K512[1])();\n// Reusable temporary buffers\nconst SHA512_W_H = /* @__PURE__ */ new Uint32Array(80);\nconst SHA512_W_L = /* @__PURE__ */ new Uint32Array(80);\n/** Internal 64-byte base SHA2 hash class. */\nclass SHA2_64B extends HashMD {\n constructor(outputLen) {\n super(128, outputLen, 16, false);\n }\n // prettier-ignore\n get() {\n const { Ah, Al, Bh, Bl, Ch, Cl, Dh, Dl, Eh, El, Fh, Fl, Gh, Gl, Hh, Hl } = this;\n return [Ah, Al, Bh, Bl, Ch, Cl, Dh, Dl, Eh, El, Fh, Fl, Gh, Gl, Hh, Hl];\n }\n // prettier-ignore\n set(Ah, Al, Bh, Bl, Ch, Cl, Dh, Dl, Eh, El, Fh, Fl, Gh, Gl, Hh, Hl) {\n this.Ah = Ah | 0;\n this.Al = Al | 0;\n this.Bh = Bh | 0;\n this.Bl = Bl | 0;\n this.Ch = Ch | 0;\n this.Cl = Cl | 0;\n this.Dh = Dh | 0;\n this.Dl = Dl | 0;\n this.Eh = Eh | 0;\n this.El = El | 0;\n this.Fh = Fh | 0;\n this.Fl = Fl | 0;\n this.Gh = Gh | 0;\n this.Gl = Gl | 0;\n this.Hh = Hh | 0;\n this.Hl = Hl | 0;\n }\n process(view, offset) {\n // Extend the first 16 words into the remaining 64 words w[16..79] of the message schedule array\n for (let i = 0; i < 16; i++, offset += 4) {\n SHA512_W_H[i] = view.getUint32(offset);\n SHA512_W_L[i] = view.getUint32((offset += 4));\n }\n for (let i = 16; i < 80; i++) {\n // s0 := (w[i-15] rightrotate 1) xor (w[i-15] rightrotate 8) xor (w[i-15] rightshift 7)\n const W15h = SHA512_W_H[i - 15] | 0;\n const W15l = SHA512_W_L[i - 15] | 0;\n const s0h = u64.rotrSH(W15h, W15l, 1) ^ u64.rotrSH(W15h, W15l, 8) ^ u64.shrSH(W15h, W15l, 7);\n const s0l = u64.rotrSL(W15h, W15l, 1) ^ u64.rotrSL(W15h, W15l, 8) ^ u64.shrSL(W15h, W15l, 7);\n // s1 := (w[i-2] rightrotate 19) xor (w[i-2] rightrotate 61) xor (w[i-2] rightshift 6)\n const W2h = SHA512_W_H[i - 2] | 0;\n const W2l = SHA512_W_L[i - 2] | 0;\n const s1h = u64.rotrSH(W2h, W2l, 19) ^ u64.rotrBH(W2h, W2l, 61) ^ u64.shrSH(W2h, W2l, 6);\n const s1l = u64.rotrSL(W2h, W2l, 19) ^ u64.rotrBL(W2h, W2l, 61) ^ u64.shrSL(W2h, W2l, 6);\n // SHA256_W[i] = s0 + s1 + SHA256_W[i - 7] + SHA256_W[i - 16];\n const SUMl = u64.add4L(s0l, s1l, SHA512_W_L[i - 7], SHA512_W_L[i - 16]);\n const SUMh = u64.add4H(SUMl, s0h, s1h, SHA512_W_H[i - 7], SHA512_W_H[i - 16]);\n SHA512_W_H[i] = SUMh | 0;\n SHA512_W_L[i] = SUMl | 0;\n }\n let { Ah, Al, Bh, Bl, Ch, Cl, Dh, Dl, Eh, El, Fh, Fl, Gh, Gl, Hh, Hl } = this;\n // Compression function main loop, 80 rounds\n for (let i = 0; i < 80; i++) {\n // S1 := (e rightrotate 14) xor (e rightrotate 18) xor (e rightrotate 41)\n const sigma1h = u64.rotrSH(Eh, El, 14) ^ u64.rotrSH(Eh, El, 18) ^ u64.rotrBH(Eh, El, 41);\n const sigma1l = u64.rotrSL(Eh, El, 14) ^ u64.rotrSL(Eh, El, 18) ^ u64.rotrBL(Eh, El, 41);\n //const T1 = (H + sigma1 + Chi(E, F, G) + SHA256_K[i] + SHA256_W[i]) | 0;\n const CHIh = (Eh & Fh) ^ (~Eh & Gh);\n const CHIl = (El & Fl) ^ (~El & Gl);\n // T1 = H + sigma1 + Chi(E, F, G) + SHA512_K[i] + SHA512_W[i]\n // prettier-ignore\n const T1ll = u64.add5L(Hl, sigma1l, CHIl, SHA512_Kl[i], SHA512_W_L[i]);\n const T1h = u64.add5H(T1ll, Hh, sigma1h, CHIh, SHA512_Kh[i], SHA512_W_H[i]);\n const T1l = T1ll | 0;\n // S0 := (a rightrotate 28) xor (a rightrotate 34) xor (a rightrotate 39)\n const sigma0h = u64.rotrSH(Ah, Al, 28) ^ u64.rotrBH(Ah, Al, 34) ^ u64.rotrBH(Ah, Al, 39);\n const sigma0l = u64.rotrSL(Ah, Al, 28) ^ u64.rotrBL(Ah, Al, 34) ^ u64.rotrBL(Ah, Al, 39);\n const MAJh = (Ah & Bh) ^ (Ah & Ch) ^ (Bh & Ch);\n const MAJl = (Al & Bl) ^ (Al & Cl) ^ (Bl & Cl);\n Hh = Gh | 0;\n Hl = Gl | 0;\n Gh = Fh | 0;\n Gl = Fl | 0;\n Fh = Eh | 0;\n Fl = El | 0;\n ({ h: Eh, l: El } = u64.add(Dh | 0, Dl | 0, T1h | 0, T1l | 0));\n Dh = Ch | 0;\n Dl = Cl | 0;\n Ch = Bh | 0;\n Cl = Bl | 0;\n Bh = Ah | 0;\n Bl = Al | 0;\n const All = u64.add3L(T1l, sigma0l, MAJl);\n Ah = u64.add3H(All, T1h, sigma0h, MAJh);\n Al = All | 0;\n }\n // Add the compressed chunk to the current hash value\n ({ h: Ah, l: Al } = u64.add(this.Ah | 0, this.Al | 0, Ah | 0, Al | 0));\n ({ h: Bh, l: Bl } = u64.add(this.Bh | 0, this.Bl | 0, Bh | 0, Bl | 0));\n ({ h: Ch, l: Cl } = u64.add(this.Ch | 0, this.Cl | 0, Ch | 0, Cl | 0));\n ({ h: Dh, l: Dl } = u64.add(this.Dh | 0, this.Dl | 0, Dh | 0, Dl | 0));\n ({ h: Eh, l: El } = u64.add(this.Eh | 0, this.El | 0, Eh | 0, El | 0));\n ({ h: Fh, l: Fl } = u64.add(this.Fh | 0, this.Fl | 0, Fh | 0, Fl | 0));\n ({ h: Gh, l: Gl } = u64.add(this.Gh | 0, this.Gl | 0, Gh | 0, Gl | 0));\n ({ h: Hh, l: Hl } = u64.add(this.Hh | 0, this.Hl | 0, Hh | 0, Hl | 0));\n this.set(Ah, Al, Bh, Bl, Ch, Cl, Dh, Dl, Eh, El, Fh, Fl, Gh, Gl, Hh, Hl);\n }\n roundClean() {\n clean(SHA512_W_H, SHA512_W_L);\n }\n destroy() {\n clean(this.buffer);\n this.set(0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0);\n }\n}\n/** Internal SHA2-512 hash class. */\nexport class _SHA512 extends SHA2_64B {\n Ah = SHA512_IV[0] | 0;\n Al = SHA512_IV[1] | 0;\n Bh = SHA512_IV[2] | 0;\n Bl = SHA512_IV[3] | 0;\n Ch = SHA512_IV[4] | 0;\n Cl = SHA512_IV[5] | 0;\n Dh = SHA512_IV[6] | 0;\n Dl = SHA512_IV[7] | 0;\n Eh = SHA512_IV[8] | 0;\n El = SHA512_IV[9] | 0;\n Fh = SHA512_IV[10] | 0;\n Fl = SHA512_IV[11] | 0;\n Gh = SHA512_IV[12] | 0;\n Gl = SHA512_IV[13] | 0;\n Hh = SHA512_IV[14] | 0;\n Hl = SHA512_IV[15] | 0;\n constructor() {\n super(64);\n }\n}\n/** Internal SHA2-384 hash class. */\nexport class _SHA384 extends SHA2_64B {\n Ah = SHA384_IV[0] | 0;\n Al = SHA384_IV[1] | 0;\n Bh = SHA384_IV[2] | 0;\n Bl = SHA384_IV[3] | 0;\n Ch = SHA384_IV[4] | 0;\n Cl = SHA384_IV[5] | 0;\n Dh = SHA384_IV[6] | 0;\n Dl = SHA384_IV[7] | 0;\n Eh = SHA384_IV[8] | 0;\n El = SHA384_IV[9] | 0;\n Fh = SHA384_IV[10] | 0;\n Fl = SHA384_IV[11] | 0;\n Gh = SHA384_IV[12] | 0;\n Gl = SHA384_IV[13] | 0;\n Hh = SHA384_IV[14] | 0;\n Hl = SHA384_IV[15] | 0;\n constructor() {\n super(48);\n }\n}\n/**\n * Truncated SHA512/256 and SHA512/224.\n * SHA512_IV is XORed with 0xa5a5a5a5a5a5a5a5, then used as \"intermediary\" IV of SHA512/t.\n * Then t hashes string to produce result IV.\n * See `test/misc/sha2-gen-iv.js`.\n */\n/** SHA512/224 IV */\nconst T224_IV = /* @__PURE__ */ Uint32Array.from([\n 0x8c3d37c8, 0x19544da2, 0x73e19966, 0x89dcd4d6, 0x1dfab7ae, 0x32ff9c82, 0x679dd514, 0x582f9fcf,\n 0x0f6d2b69, 0x7bd44da8, 0x77e36f73, 0x04c48942, 0x3f9d85a8, 0x6a1d36c8, 0x1112e6ad, 0x91d692a1,\n]);\n/** SHA512/256 IV */\nconst T256_IV = /* @__PURE__ */ Uint32Array.from([\n 0x22312194, 0xfc2bf72c, 0x9f555fa3, 0xc84c64c2, 0x2393b86b, 0x6f53b151, 0x96387719, 0x5940eabd,\n 0x96283ee2, 0xa88effe3, 0xbe5e1e25, 0x53863992, 0x2b0199fc, 0x2c85b8aa, 0x0eb72ddc, 0x81c52ca2,\n]);\n/** Internal SHA2-512/224 hash class. */\nexport class _SHA512_224 extends SHA2_64B {\n Ah = T224_IV[0] | 0;\n Al = T224_IV[1] | 0;\n Bh = T224_IV[2] | 0;\n Bl = T224_IV[3] | 0;\n Ch = T224_IV[4] | 0;\n Cl = T224_IV[5] | 0;\n Dh = T224_IV[6] | 0;\n Dl = T224_IV[7] | 0;\n Eh = T224_IV[8] | 0;\n El = T224_IV[9] | 0;\n Fh = T224_IV[10] | 0;\n Fl = T224_IV[11] | 0;\n Gh = T224_IV[12] | 0;\n Gl = T224_IV[13] | 0;\n Hh = T224_IV[14] | 0;\n Hl = T224_IV[15] | 0;\n constructor() {\n super(28);\n }\n}\n/** Internal SHA2-512/256 hash class. */\nexport class _SHA512_256 extends SHA2_64B {\n Ah = T256_IV[0] | 0;\n Al = T256_IV[1] | 0;\n Bh = T256_IV[2] | 0;\n Bl = T256_IV[3] | 0;\n Ch = T256_IV[4] | 0;\n Cl = T256_IV[5] | 0;\n Dh = T256_IV[6] | 0;\n Dl = T256_IV[7] | 0;\n Eh = T256_IV[8] | 0;\n El = T256_IV[9] | 0;\n Fh = T256_IV[10] | 0;\n Fl = T256_IV[11] | 0;\n Gh = T256_IV[12] | 0;\n Gl = T256_IV[13] | 0;\n Hh = T256_IV[14] | 0;\n Hl = T256_IV[15] | 0;\n constructor() {\n super(32);\n }\n}\n/**\n * SHA2-256 hash function from RFC 4634. In JS it's the fastest: even faster than Blake3. Some info:\n *\n * - Trying 2^128 hashes would get 50% chance of collision, using birthday attack.\n * - BTC network is doing 2^70 hashes/sec (2^95 hashes/year) as per 2025.\n * - Each sha256 hash is executing 2^18 bit operations.\n * - Good 2024 ASICs can do 200Th/sec with 3500 watts of power, corresponding to 2^36 hashes/joule.\n */\nexport const sha256 = /* @__PURE__ */ createHasher(() => new _SHA256(), \n/* @__PURE__ */ oidNist(0x01));\n/** SHA2-224 hash function from RFC 4634 */\nexport const sha224 = /* @__PURE__ */ createHasher(() => new _SHA224(), \n/* @__PURE__ */ oidNist(0x04));\n/** SHA2-512 hash function from RFC 4634. */\nexport const sha512 = /* @__PURE__ */ createHasher(() => new _SHA512(), \n/* @__PURE__ */ oidNist(0x03));\n/** SHA2-384 hash function from RFC 4634. */\nexport const sha384 = /* @__PURE__ */ createHasher(() => new _SHA384(), \n/* @__PURE__ */ oidNist(0x02));\n/**\n * SHA2-512/256 \"truncated\" hash function, with improved resistance to length extension attacks.\n * See the paper on [truncated SHA512](https://eprint.iacr.org/2010/548.pdf).\n */\nexport const sha512_256 = /* @__PURE__ */ createHasher(() => new _SHA512_256(), \n/* @__PURE__ */ oidNist(0x06));\n/**\n * SHA2-512/224 \"truncated\" hash function, with improved resistance to length extension attacks.\n * See the paper on [truncated SHA512](https://eprint.iacr.org/2010/548.pdf).\n */\nexport const sha512_224 = /* @__PURE__ */ createHasher(() => new _SHA512_224(), \n/* @__PURE__ */ oidNist(0x05));\n//# sourceMappingURL=sha2.js.map","/**\n * Hex, bytes and number utilities.\n * @module\n */\n/*! noble-curves - MIT License (c) 2022 Paul Miller (paulmillr.com) */\nimport { abytes as abytes_, anumber, bytesToHex as bytesToHex_, concatBytes as concatBytes_, hexToBytes as hexToBytes_, } from '@noble/hashes/utils.js';\nexport { abytes, anumber, bytesToHex, concatBytes, hexToBytes, isBytes, randomBytes, } from '@noble/hashes/utils.js';\nconst _0n = /* @__PURE__ */ BigInt(0);\nconst _1n = /* @__PURE__ */ BigInt(1);\nexport function abool(value, title = '') {\n if (typeof value !== 'boolean') {\n const prefix = title && `\"${title}\" `;\n throw new Error(prefix + 'expected boolean, got type=' + typeof value);\n }\n return value;\n}\n// Used in weierstrass, der\nfunction abignumber(n) {\n if (typeof n === 'bigint') {\n if (!isPosBig(n))\n throw new Error('positive bigint expected, got ' + n);\n }\n else\n anumber(n);\n return n;\n}\nexport function asafenumber(value, title = '') {\n if (!Number.isSafeInteger(value)) {\n const prefix = title && `\"${title}\" `;\n throw new Error(prefix + 'expected safe integer, got type=' + typeof value);\n }\n}\nexport function numberToHexUnpadded(num) {\n const hex = abignumber(num).toString(16);\n return hex.length & 1 ? '0' + hex : hex;\n}\nexport function hexToNumber(hex) {\n if (typeof hex !== 'string')\n throw new Error('hex string expected, got ' + typeof hex);\n return hex === '' ? _0n : BigInt('0x' + hex); // Big Endian\n}\n// BE: Big Endian, LE: Little Endian\nexport function bytesToNumberBE(bytes) {\n return hexToNumber(bytesToHex_(bytes));\n}\nexport function bytesToNumberLE(bytes) {\n return hexToNumber(bytesToHex_(copyBytes(abytes_(bytes)).reverse()));\n}\nexport function numberToBytesBE(n, len) {\n anumber(len);\n n = abignumber(n);\n const res = hexToBytes_(n.toString(16).padStart(len * 2, '0'));\n if (res.length !== len)\n throw new Error('number too large');\n return res;\n}\nexport function numberToBytesLE(n, len) {\n return numberToBytesBE(n, len).reverse();\n}\n// Unpadded, rarely used\nexport function numberToVarBytesBE(n) {\n return hexToBytes_(numberToHexUnpadded(abignumber(n)));\n}\n// Compares 2 u8a-s in kinda constant time\nexport function equalBytes(a, b) {\n if (a.length !== b.length)\n return false;\n let diff = 0;\n for (let i = 0; i < a.length; i++)\n diff |= a[i] ^ b[i];\n return diff === 0;\n}\n/**\n * Copies Uint8Array. We can't use u8a.slice(), because u8a can be Buffer,\n * and Buffer#slice creates mutable copy. Never use Buffers!\n */\nexport function copyBytes(bytes) {\n return Uint8Array.from(bytes);\n}\n/**\n * Decodes 7-bit ASCII string to Uint8Array, throws on non-ascii symbols\n * Should be safe to use for things expected to be ASCII.\n * Returns exact same result as `TextEncoder` for ASCII or throws.\n */\nexport function asciiToBytes(ascii) {\n return Uint8Array.from(ascii, (c, i) => {\n const charCode = c.charCodeAt(0);\n if (c.length !== 1 || charCode > 127) {\n throw new Error(`string contains non-ASCII character \"${ascii[i]}\" with code ${charCode} at position ${i}`);\n }\n return charCode;\n });\n}\n// Is positive bigint\nconst isPosBig = (n) => typeof n === 'bigint' && _0n <= n;\nexport function inRange(n, min, max) {\n return isPosBig(n) && isPosBig(min) && isPosBig(max) && min <= n && n < max;\n}\n/**\n * Asserts min <= n < max. NOTE: It's < max and not <= max.\n * @example\n * aInRange('x', x, 1n, 256n); // would assume x is in (1n..255n)\n */\nexport function aInRange(title, n, min, max) {\n // Why min <= n < max and not a (min < n < max) OR b (min <= n <= max)?\n // consider P=256n, min=0n, max=P\n // - a for min=0 would require -1: `inRange('x', x, -1n, P)`\n // - b would commonly require subtraction: `inRange('x', x, 0n, P - 1n)`\n // - our way is the cleanest: `inRange('x', x, 0n, P)\n if (!inRange(n, min, max))\n throw new Error('expected valid ' + title + ': ' + min + ' <= n < ' + max + ', got ' + n);\n}\n// Bit operations\n/**\n * Calculates amount of bits in a bigint.\n * Same as `n.toString(2).length`\n * TODO: merge with nLength in modular\n */\nexport function bitLen(n) {\n let len;\n for (len = 0; n > _0n; n >>= _1n, len += 1)\n ;\n return len;\n}\n/**\n * Gets single bit at position.\n * NOTE: first bit position is 0 (same as arrays)\n * Same as `!!+Array.from(n.toString(2)).reverse()[pos]`\n */\nexport function bitGet(n, pos) {\n return (n >> BigInt(pos)) & _1n;\n}\n/**\n * Sets single bit at position.\n */\nexport function bitSet(n, pos, value) {\n return n | ((value ? _1n : _0n) << BigInt(pos));\n}\n/**\n * Calculate mask for N bits. Not using ** operator with bigints because of old engines.\n * Same as BigInt(`0b${Array(i).fill('1').join('')}`)\n */\nexport const bitMask = (n) => (_1n << BigInt(n)) - _1n;\n/**\n * Minimal HMAC-DRBG from NIST 800-90 for RFC6979 sigs.\n * @returns function that will call DRBG until 2nd arg returns something meaningful\n * @example\n * const drbg = createHmacDRBG<Key>(32, 32, hmac);\n * drbg(seed, bytesToKey); // bytesToKey must return Key or undefined\n */\nexport function createHmacDrbg(hashLen, qByteLen, hmacFn) {\n anumber(hashLen, 'hashLen');\n anumber(qByteLen, 'qByteLen');\n if (typeof hmacFn !== 'function')\n throw new Error('hmacFn must be a function');\n const u8n = (len) => new Uint8Array(len); // creates Uint8Array\n const NULL = Uint8Array.of();\n const byte0 = Uint8Array.of(0x00);\n const byte1 = Uint8Array.of(0x01);\n const _maxDrbgIters = 1000;\n // Step B, Step C: set hashLen to 8*ceil(hlen/8)\n let v = u8n(hashLen); // Minimal non-full-spec HMAC-DRBG from NIST 800-90 for RFC6979 sigs.\n let k = u8n(hashLen); // Steps B and C of RFC6979 3.2: set hashLen, in our case always same\n let i = 0; // Iterations counter, will throw when over 1000\n const reset = () => {\n v.fill(1);\n k.fill(0);\n i = 0;\n };\n const h = (...msgs) => hmacFn(k, concatBytes_(v, ...msgs)); // hmac(k)(v, ...values)\n const reseed = (seed = NULL) => {\n // HMAC-DRBG reseed() function. Steps D-G\n k = h(byte0, seed); // k = hmac(k || v || 0x00 || seed)\n v = h(); // v = hmac(k || v)\n if (seed.length === 0)\n return;\n k = h(byte1, seed); // k = hmac(k || v || 0x01 || seed)\n v = h(); // v = hmac(k || v)\n };\n const gen = () => {\n // HMAC-DRBG generate() function\n if (i++ >= _maxDrbgIters)\n throw new Error('drbg: tried max amount of iterations');\n let len = 0;\n const out = [];\n while (len < qByteLen) {\n v = h();\n const sl = v.slice();\n out.push(sl);\n len += v.length;\n }\n return concatBytes_(...out);\n };\n const genUntil = (seed, pred) => {\n reset();\n reseed(seed); // Steps D-G\n let res = undefined; // Step H: grind until k is in [1..n-1]\n while (!(res = pred(gen())))\n reseed();\n reset();\n return res;\n };\n return genUntil;\n}\nexport function validateObject(object, fields = {}, optFields = {}) {\n if (!object || typeof object !== 'object')\n throw new Error('expected valid options object');\n function checkField(fieldName, expectedType, isOpt) {\n const val = object[fieldName];\n if (isOpt && val === undefined)\n return;\n const current = typeof val;\n if (current !== expectedType || val === null)\n throw new Error(`param \"${fieldName}\" is invalid: expected ${expectedType}, got ${current}`);\n }\n const iter = (f, isOpt) => Object.entries(f).forEach(([k, v]) => checkField(k, v, isOpt));\n iter(fields, false);\n iter(optFields, true);\n}\n/**\n * throws not implemented error\n */\nexport const notImplemented = () => {\n throw new Error('not implemented');\n};\n/**\n * Memoizes (caches) computation result.\n * Uses WeakMap: the value is going auto-cleaned by GC after last reference is removed.\n */\nexport function memoized(fn) {\n const map = new WeakMap();\n return (arg, ...args) => {\n const val = map.get(arg);\n if (val !== undefined)\n return val;\n const computed = fn(arg, ...args);\n map.set(arg, computed);\n return computed;\n };\n}\n//# sourceMappingURL=utils.js.map","/**\n * Utils for modular division and fields.\n * Field over 11 is a finite (Galois) field is integer number operations `mod 11`.\n * There is no division: it is replaced by modular multiplicative inverse.\n * @module\n */\n/*! noble-curves - MIT License (c) 2022 Paul Miller (paulmillr.com) */\nimport { abytes, anumber, bytesToNumberBE, bytesToNumberLE, numberToBytesBE, numberToBytesLE, validateObject, } from \"../utils.js\";\n// Numbers aren't used in x25519 / x448 builds\n// prettier-ignore\nconst _0n = /* @__PURE__ */ BigInt(0), _1n = /* @__PURE__ */ BigInt(1), _2n = /* @__PURE__ */ BigInt(2);\n// prettier-ignore\nconst _3n = /* @__PURE__ */ BigInt(3), _4n = /* @__PURE__ */ BigInt(4), _5n = /* @__PURE__ */ BigInt(5);\n// prettier-ignore\nconst _7n = /* @__PURE__ */ BigInt(7), _8n = /* @__PURE__ */ BigInt(8), _9n = /* @__PURE__ */ BigInt(9);\nconst _16n = /* @__PURE__ */ BigInt(16);\n// Calculates a modulo b\nexport function mod(a, b) {\n const result = a % b;\n return result >= _0n ? result : b + result;\n}\n/**\n * Efficiently raise num to power and do modular division.\n * Unsafe in some contexts: uses ladder, so can expose bigint bits.\n * @example\n * pow(2n, 6n, 11n) // 64n % 11n == 9n\n */\nexport function pow(num, power, modulo) {\n return FpPow(Field(modulo), num, power);\n}\n/** Does `x^(2^power)` mod p. `pow2(30, 4)` == `30^(2^4)` */\nexport function pow2(x, power, modulo) {\n let res = x;\n while (power-- > _0n) {\n res *= res;\n res %= modulo;\n }\n return res;\n}\n/**\n * Inverses number over modulo.\n * Implemented using [Euclidean GCD](https://brilliant.org/wiki/extended-euclidean-algorithm/).\n */\nexport function invert(number, modulo) {\n if (number === _0n)\n throw new Error('invert: expected non-zero number');\n if (modulo <= _0n)\n throw new Error('invert: expected positive modulus, got ' + modulo);\n // Fermat's little theorem \"CT-like\" version inv(n) = n^(m-2) mod m is 30x slower.\n let a = mod(number, modulo);\n let b = modulo;\n // prettier-ignore\n let x = _0n, y = _1n, u = _1n, v = _0n;\n while (a !== _0n) {\n // JIT applies optimization if those two lines follow each other\n const q = b / a;\n const r = b % a;\n const m = x - u * q;\n const n = y - v * q;\n // prettier-ignore\n b = a, a = r, x = u, y = v, u = m, v = n;\n }\n const gcd = b;\n if (gcd !== _1n)\n throw new Error('invert: does not exist');\n return mod(x, modulo);\n}\nfunction assertIsSquare(Fp, root, n) {\n if (!Fp.eql(Fp.sqr(root), n))\n throw new Error('Cannot find square root');\n}\n// Not all roots are possible! Example which will throw:\n// const NUM =\n// n = 72057594037927816n;\n// Fp = Field(BigInt('0x1a0111ea397fe69a4b1ba7b6434bacd764774b84f38512bf6730d2a0f6b0f6241eabfffeb153ffffb9feffffffffaaab'));\nfunction sqrt3mod4(Fp, n) {\n const p1div4 = (Fp.ORDER + _1n) / _4n;\n const root = Fp.pow(n, p1div4);\n assertIsSquare(Fp, root, n);\n return root;\n}\nfunction sqrt5mod8(Fp, n) {\n const p5div8 = (Fp.ORDER - _5n) / _8n;\n const n2 = Fp.mul(n, _2n);\n const v = Fp.pow(n2, p5div8);\n const nv = Fp.mul(n, v);\n const i = Fp.mul(Fp.mul(nv, _2n), v);\n const root = Fp.mul(nv, Fp.sub(i, Fp.ONE));\n assertIsSquare(Fp, root, n);\n return root;\n}\n// Based on RFC9380, Kong algorithm\n// prettier-ignore\nfunction sqrt9mod16(P) {\n const Fp_ = Field(P);\n const tn = tonelliShanks(P);\n const c1 = tn(Fp_, Fp_.neg(Fp_.ONE)); // 1. c1 = sqrt(-1) in F, i.e., (c1^2) == -1 in F\n const c2 = tn(Fp_, c1); // 2. c2 = sqrt(c1) in F, i.e., (c2^2) == c1 in F\n const c3 = tn(Fp_, Fp_.neg(c1)); // 3. c3 = sqrt(-c1) in F, i.e., (c3^2) == -c1 in F\n const c4 = (P + _7n) / _16n; // 4. c4 = (q + 7) / 16 # Integer arithmetic\n return (Fp, n) => {\n let tv1 = Fp.pow(n, c4); // 1. tv1 = x^c4\n let tv2 = Fp.mul(tv1, c1); // 2. tv2 = c1 * tv1\n const tv3 = Fp.mul(tv1, c2); // 3. tv3 = c2 * tv1\n const tv4 = Fp.mul(tv1, c3); // 4. tv4 = c3 * tv1\n const e1 = Fp.eql(Fp.sqr(tv2), n); // 5. e1 = (tv2^2) == x\n const e2 = Fp.eql(Fp.sqr(tv3), n); // 6. e2 = (tv3^2) == x\n tv1 = Fp.cmov(tv1, tv2, e1); // 7. tv1 = CMOV(tv1, tv2, e1) # Select tv2 if (tv2^2) == x\n tv2 = Fp.cmov(tv4, tv3, e2); // 8. tv2 = CMOV(tv4, tv3, e2) # Select tv3 if (tv3^2) == x\n const e3 = Fp.eql(Fp.sqr(tv2), n); // 9. e3 = (tv2^2) == x\n const root = Fp.cmov(tv1, tv2, e3); // 10. z = CMOV(tv1, tv2, e3) # Select sqrt from tv1 & tv2\n assertIsSquare(Fp, root, n);\n return root;\n };\n}\n/**\n * Tonelli-Shanks square root search algorithm.\n * 1. https://eprint.iacr.org/2012/685.pdf (page 12)\n * 2. Square Roots from 1; 24, 51, 10 to Dan Shanks\n * @param P field order\n * @returns function that takes field Fp (created from P) and number n\n */\nexport function tonelliShanks(P) {\n // Initialization (precomputation).\n // Caching initialization could boost perf by 7%.\n if (P < _3n)\n throw new Error('sqrt is not defined for small field');\n // Factor P - 1 = Q * 2^S, where Q is odd\n let Q = P - _1n;\n let S = 0;\n while (Q % _2n === _0n) {\n Q /= _2n;\n S++;\n }\n // Find the first quadratic non-residue Z >= 2\n let Z = _2n;\n const _Fp = Field(P);\n while (FpLegendre(_Fp, Z) === 1) {\n // Basic primality test for P. After x iterations, chance of\n // not finding quadratic non-residue is 2^x, so 2^1000.\n if (Z++ > 1000)\n throw new Error('Cannot find square root: probably non-prime P');\n }\n // Fast-path; usually done before Z, but we do \"primality test\".\n if (S === 1)\n return sqrt3mod4;\n // Slow-path\n // TODO: test on Fp2 and others\n let cc = _Fp.pow(Z, Q); // c = z^Q\n const Q1div2 = (Q + _1n) / _2n;\n return function tonelliSlow(Fp, n) {\n if (Fp.is0(n))\n return n;\n // Check if n is a quadratic residue using Legendre symbol\n if (FpLegendre(Fp, n) !== 1)\n throw new Error('Cannot find square root');\n // Initialize variables for the main loop\n let M = S;\n let c = Fp.mul(Fp.ONE, cc); // c = z^Q, move cc from field _Fp into field Fp\n let t = Fp.pow(n, Q); // t = n^Q, first guess at the fudge factor\n let R = Fp.pow(n, Q1div2); // R = n^((Q+1)/2), first guess at the square root\n // Main loop\n // while t != 1\n while (!Fp.eql(t, Fp.ONE)) {\n if (Fp.is0(t))\n return Fp.ZERO; // if t=0 return R=0\n let i = 1;\n // Find the smallest i >= 1 such that t^(2^i) ≡ 1 (mod P)\n let t_tmp = Fp.sqr(t); // t^(2^1)\n while (!Fp.eql(t_tmp, Fp.ONE)) {\n i++;\n t_tmp = Fp.sqr(t_tmp); // t^(2^2)...\n if (i === M)\n throw new Error('Cannot find square root');\n }\n // Calculate the exponent for b: 2^(M - i - 1)\n const exponent = _1n << BigInt(M - i - 1); // bigint is important\n const b = Fp.pow(c, exponent); // b = 2^(M - i - 1)\n // Update variables\n M = i;\n c = Fp.sqr(b); // c = b^2\n t = Fp.mul(t, c); // t = (t * b^2)\n R = Fp.mul(R, b); // R = R*b\n }\n return R;\n };\n}\n/**\n * Square root for a finite field. Will try optimized versions first:\n *\n * 1. P ≡ 3 (mod 4)\n * 2. P ≡ 5 (mod 8)\n * 3. P ≡ 9 (mod 16)\n * 4. Tonelli-Shanks algorithm\n *\n * Different algorithms can give different roots, it is up to user to decide which one they want.\n * For example there is FpSqrtOdd/FpSqrtEven to choice root based on oddness (used for hash-to-curve).\n */\nexport function FpSqrt(P) {\n // P ≡ 3 (mod 4) => √n = n^((P+1)/4)\n if (P % _4n === _3n)\n return sqrt3mod4;\n // P ≡ 5 (mod 8) => Atkin algorithm, page 10 of https://eprint.iacr.org/2012/685.pdf\n if (P % _8n === _5n)\n return sqrt5mod8;\n // P ≡ 9 (mod 16) => Kong algorithm, page 11 of https://eprint.iacr.org/2012/685.pdf (algorithm 4)\n if (P % _16n === _9n)\n return sqrt9mod16(P);\n // Tonelli-Shanks algorithm\n return tonelliShanks(P);\n}\n// Little-endian check for first LE bit (last BE bit);\nexport const isNegativeLE = (num, modulo) => (mod(num, modulo) & _1n) === _1n;\n// prettier-ignore\nconst FIELD_FIELDS = [\n 'create', 'isValid', 'is0', 'neg', 'inv', 'sqrt', 'sqr',\n 'eql', 'add', 'sub', 'mul', 'pow', 'div',\n 'addN', 'subN', 'mulN', 'sqrN'\n];\nexport function validateField(field) {\n const initial = {\n ORDER: 'bigint',\n BYTES: 'number',\n BITS: 'number',\n };\n const opts = FIELD_FIELDS.reduce((map, val) => {\n map[val] = 'function';\n return map;\n }, initial);\n validateObject(field, opts);\n // const max = 16384;\n // if (field.BYTES < 1 || field.BYTES > max) throw new Error('invalid field');\n // if (field.BITS < 1 || field.BITS > 8 * max) throw new Error('invalid field');\n return field;\n}\n// Generic field functions\n/**\n * Same as `pow` but for Fp: non-constant-time.\n * Unsafe in some contexts: uses ladder, so can expose bigint bits.\n */\nexport function FpPow(Fp, num, power) {\n if (power < _0n)\n throw new Error('invalid exponent, negatives unsupported');\n if (power === _0n)\n return Fp.ONE;\n if (power === _1n)\n return num;\n let p = Fp.ONE;\n let d = num;\n while (power > _0n) {\n if (power & _1n)\n p = Fp.mul(p, d);\n d = Fp.sqr(d);\n power >>= _1n;\n }\n return p;\n}\n/**\n * Efficiently invert an array of Field elements.\n * Exception-free. Will return `undefined` for 0 elements.\n * @param passZero map 0 to 0 (instead of undefined)\n */\nexport function FpInvertBatch(Fp, nums, passZero = false) {\n const inverted = new Array(nums.length).fill(passZero ? Fp.ZERO : undefined);\n // Walk from first to last, multiply them by each other MOD p\n const multipliedAcc = nums.reduce((acc, num, i) => {\n if (Fp.is0(num))\n return acc;\n inverted[i] = acc;\n return Fp.mul(acc, num);\n }, Fp.ONE);\n // Invert last element\n const invertedAcc = Fp.inv(multipliedAcc);\n // Walk from last to first, multiply them by inverted each other MOD p\n nums.reduceRight((acc, num, i) => {\n if (Fp.is0(num))\n return acc;\n inverted[i] = Fp.mul(acc, inverted[i]);\n return Fp.mul(acc, num);\n }, invertedAcc);\n return inverted;\n}\n// TODO: remove\nexport function FpDiv(Fp, lhs, rhs) {\n return Fp.mul(lhs, typeof rhs === 'bigint' ? invert(rhs, Fp.ORDER) : Fp.inv(rhs));\n}\n/**\n * Legendre symbol.\n * Legendre constant is used to calculate Legendre symbol (a | p)\n * which denotes the value of a^((p-1)/2) (mod p).\n *\n * * (a | p) ≡ 1 if a is a square (mod p), quadratic residue\n * * (a | p) ≡ -1 if a is not a square (mod p), quadratic non residue\n * * (a | p) ≡ 0 if a ≡ 0 (mod p)\n */\nexport function FpLegendre(Fp, n) {\n // We can use 3rd argument as optional cache of this value\n // but seems unneeded for now. The operation is very fast.\n const p1mod2 = (Fp.ORDER - _1n) / _2n;\n const powered = Fp.pow(n, p1mod2);\n const yes = Fp.eql(powered, Fp.ONE);\n const zero = Fp.eql(powered, Fp.ZERO);\n const no = Fp.eql(powered, Fp.neg(Fp.ONE));\n if (!yes && !zero && !no)\n throw new Error('invalid Legendre symbol result');\n return yes ? 1 : zero ? 0 : -1;\n}\n// This function returns True whenever the value x is a square in the field F.\nexport function FpIsSquare(Fp, n) {\n const l = FpLegendre(Fp, n);\n return l === 1;\n}\n// CURVE.n lengths\nexport function nLength(n, nBitLength) {\n // Bit size, byte size of CURVE.n\n if (nBitLength !== undefined)\n anumber(nBitLength);\n const _nBitLength = nBitLength !== undefined ? nBitLength : n.toString(2).length;\n const nByteLength = Math.ceil(_nBitLength / 8);\n return { nBitLength: _nBitLength, nByteLength };\n}\nclass _Field {\n ORDER;\n BITS;\n BYTES;\n isLE;\n ZERO = _0n;\n ONE = _1n;\n _lengths;\n _sqrt; // cached sqrt\n _mod;\n constructor(ORDER, opts = {}) {\n if (ORDER <= _0n)\n throw new Error('invalid field: expected ORDER > 0, got ' + ORDER);\n let _nbitLength = undefined;\n this.isLE = false;\n if (opts != null && typeof opts === 'object') {\n if (typeof opts.BITS === 'number')\n _nbitLength = opts.BITS;\n if (typeof opts.sqrt === 'function')\n this.sqrt = opts.sqrt;\n if (typeof opts.isLE === 'boolean')\n this.isLE = opts.isLE;\n if (opts.allowedLengths)\n this._lengths = opts.allowedLengths?.slice();\n if (typeof opts.modFromBytes === 'boolean')\n this._mod = opts.modFromBytes;\n }\n const { nBitLength, nByteLength } = nLength(ORDER, _nbitLength);\n if (nByteLength > 2048)\n throw new Error('invalid field: expected ORDER of <= 2048 bytes');\n this.ORDER = ORDER;\n this.BITS = nBitLength;\n this.BYTES = nByteLength;\n this._sqrt = undefined;\n Object.preventExtensions(this);\n }\n create(num) {\n return mod(num, this.ORDER);\n }\n isValid(num) {\n if (typeof num !== 'bigint')\n throw new Error('invalid field element: expected bigint, got ' + typeof num);\n return _0n <= num && num < this.ORDER; // 0 is valid element, but it's not invertible\n }\n is0(num) {\n return num === _0n;\n }\n // is valid and invertible\n isValidNot0(num) {\n return !this.is0(num) && this.isValid(num);\n }\n isOdd(num) {\n return (num & _1n) === _1n;\n }\n neg(num) {\n return mod(-num, this.ORDER);\n }\n eql(lhs, rhs) {\n return lhs === rhs;\n }\n sqr(num) {\n return mod(num * num, this.ORDER);\n }\n add(lhs, rhs) {\n return mod(lhs + rhs, this.ORDER);\n }\n sub(lhs, rhs) {\n return mod(lhs - rhs, this.ORDER);\n }\n mul(lhs, rhs) {\n return mod(lhs * rhs, this.ORDER);\n }\n pow(num, power) {\n return FpPow(this, num, power);\n }\n div(lhs, rhs) {\n return mod(lhs * invert(rhs, this.ORDER), this.ORDER);\n }\n // Same as above, but doesn't normalize\n sqrN(num) {\n return num * num;\n }\n addN(lhs, rhs) {\n return lhs + rhs;\n }\n subN(lhs, rhs) {\n return lhs - rhs;\n }\n mulN(lhs, rhs) {\n return lhs * rhs;\n }\n inv(num) {\n return invert(num, this.ORDER);\n }\n sqrt(num) {\n // Caching _sqrt speeds up sqrt9mod16 by 5x and tonneli-shanks by 10%\n if (!this._sqrt)\n this._sqrt = FpSqrt(this.ORDER);\n return this._sqrt(this, num);\n }\n toBytes(num) {\n return this.isLE ? numberToBytesLE(num, this.BYTES) : numberToBytesBE(num, this.BYTES);\n }\n fromBytes(bytes, skipValidation = false) {\n abytes(bytes);\n const { _lengths: allowedLengths, BYTES, isLE, ORDER, _mod: modFromBytes } = this;\n if (allowedLengths) {\n if (!allowedLengths.includes(bytes.length) || bytes.length > BYTES) {\n throw new Error('Field.fromBytes: expected ' + allowedLengths + ' bytes, got ' + bytes.length);\n }\n const padded = new Uint8Array(BYTES);\n // isLE add 0 to right, !isLE to the left.\n padded.set(bytes, isLE ? 0 : padded.length - bytes.length);\n bytes = padded;\n }\n if (bytes.length !== BYTES)\n throw new Error('Field.fromBytes: expected ' + BYTES + ' bytes, got ' + bytes.length);\n let scalar = isLE ? bytesToNumberLE(bytes) : bytesToNumberBE(bytes);\n if (modFromBytes)\n scalar = mod(scalar, ORDER);\n if (!skipValidation)\n if (!this.isValid(scalar))\n throw new Error('invalid field element: outside of range 0..ORDER');\n // NOTE: we don't validate scalar here, please use isValid. This done such way because some\n // protocol may allow non-reduced scalar that reduced later or changed some other way.\n return scalar;\n }\n // TODO: we don't need it here, move out to separate fn\n invertBatch(lst) {\n return FpInvertBatch(this, lst);\n }\n // We can't move this out because Fp6, Fp12 implement it\n // and it's unclear what to return in there.\n cmov(a, b, condition) {\n return condition ? b : a;\n }\n}\n/**\n * Creates a finite field. Major performance optimizations:\n * * 1. Denormalized operations like mulN instead of mul.\n * * 2. Identical object shape: never add or remove keys.\n * * 3. `Object.freeze`.\n * Fragile: always run a benchmark on a change.\n * Security note: operations don't check 'isValid' for all elements for performance reasons,\n * it is caller responsibility to check this.\n * This is low-level code, please make sure you know what you're doing.\n *\n * Note about field properties:\n * * CHARACTERISTIC p = prime number, number of elements in main subgroup.\n * * ORDER q = similar to cofactor in curves, may be composite `q = p^m`.\n *\n * @param ORDER field order, probably prime, or could be composite\n * @param bitLen how many bits the field consumes\n * @param isLE (default: false) if encoding / decoding should be in little-endian\n * @param redef optional faster redefinitions of sqrt and other methods\n */\nexport function Field(ORDER, opts = {}) {\n return new _Field(ORDER, opts);\n}\n// Generic random scalar, we can do same for other fields if via Fp2.mul(Fp2.ONE, Fp2.random)?\n// This allows unsafe methods like ignore bias or zero. These unsafe, but often used in different protocols (if deterministic RNG).\n// which mean we cannot force this via opts.\n// Not sure what to do with randomBytes, we can accept it inside opts if wanted.\n// Probably need to export getMinHashLength somewhere?\n// random(bytes?: Uint8Array, unsafeAllowZero = false, unsafeAllowBias = false) {\n// const LEN = !unsafeAllowBias ? getMinHashLength(ORDER) : BYTES;\n// if (bytes === undefined) bytes = randomBytes(LEN); // _opts.randomBytes?\n// const num = isLE ? bytesToNumberLE(bytes) : bytesToNumberBE(bytes);\n// // `mod(x, 11)` can sometimes produce 0. `mod(x, 10) + 1` is the same, but no 0\n// const reduced = unsafeAllowZero ? mod(num, ORDER) : mod(num, ORDER - _1n) + _1n;\n// return reduced;\n// },\nexport function FpSqrtOdd(Fp, elm) {\n if (!Fp.isOdd)\n throw new Error(\"Field doesn't have isOdd\");\n const root = Fp.sqrt(elm);\n return Fp.isOdd(root) ? root : Fp.neg(root);\n}\nexport function FpSqrtEven(Fp, elm) {\n if (!Fp.isOdd)\n throw new Error(\"Field doesn't have isOdd\");\n const root = Fp.sqrt(elm);\n return Fp.isOdd(root) ? Fp.neg(root) : root;\n}\n/**\n * Returns total number of bytes consumed by the field element.\n * For example, 32 bytes for usual 256-bit weierstrass curve.\n * @param fieldOrder number of field elements, usually CURVE.n\n * @returns byte length of field\n */\nexport function getFieldBytesLength(fieldOrder) {\n if (typeof fieldOrder !== 'bigint')\n throw new Error('field order must be bigint');\n const bitLength = fieldOrder.toString(2).length;\n return Math.ceil(bitLength / 8);\n}\n/**\n * Returns minimal amount of bytes that can be safely reduced\n * by field order.\n * Should be 2^-128 for 128-bit curve such as P256.\n * @param fieldOrder number of field elements, usually CURVE.n\n * @returns byte length of target hash\n */\nexport function getMinHashLength(fieldOrder) {\n const length = getFieldBytesLength(fieldOrder);\n return length + Math.ceil(length / 2);\n}\n/**\n * \"Constant-time\" private key generation utility.\n * Can take (n + n/2) or more bytes of uniform input e.g. from CSPRNG or KDF\n * and convert them into private scalar, with the modulo bias being negligible.\n * Needs at least 48 bytes of input for 32-byte private key.\n * https://research.kudelskisecurity.com/2020/07/28/the-definitive-guide-to-modulo-bias-and-how-to-avoid-it/\n * FIPS 186-5, A.2 https://csrc.nist.gov/publications/detail/fips/186/5/final\n * RFC 9380, https://www.rfc-editor.org/rfc/rfc9380#section-5\n * @param hash hash output from SHA3 or a similar function\n * @param groupOrder size of subgroup - (e.g. secp256k1.Point.Fn.ORDER)\n * @param isLE interpret hash bytes as LE num\n * @returns valid private scalar\n */\nexport function mapHashToField(key, fieldOrder, isLE = false) {\n abytes(key);\n const len = key.length;\n const fieldLen = getFieldBytesLength(fieldOrder);\n const minLen = getMinHashLength(fieldOrder);\n // No small numbers: need to understand bias story. No huge numbers: easier to detect JS timings.\n if (len < 16 || len < minLen || len > 1024)\n throw new Error('expected ' + minLen + '-1024 bytes of input, got ' + len);\n const num = isLE ? bytesToNumberLE(key) : bytesToNumberBE(key);\n // `mod(x, 11)` can sometimes produce 0. `mod(x, 10) + 1` is the same, but no 0\n const reduced = mod(num, fieldOrder - _1n) + _1n;\n return isLE ? numberToBytesLE(reduced, fieldLen) : numberToBytesBE(reduced, fieldLen);\n}\n//# sourceMappingURL=modular.js.map","/**\n * Methods for elliptic curve multiplication by scalars.\n * Contains wNAF, pippenger.\n * @module\n */\n/*! noble-curves - MIT License (c) 2022 Paul Miller (paulmillr.com) */\nimport { bitLen, bitMask } from \"../utils.js\";\nimport { Field, FpInvertBatch, validateField } from \"./modular.js\";\nconst _0n = /* @__PURE__ */ BigInt(0);\nconst _1n = /* @__PURE__ */ BigInt(1);\nexport function negateCt(condition, item) {\n const neg = item.negate();\n return condition ? neg : item;\n}\n/**\n * Takes a bunch of Projective Points but executes only one\n * inversion on all of them. Inversion is very slow operation,\n * so this improves performance massively.\n * Optimization: converts a list of projective points to a list of identical points with Z=1.\n */\nexport function normalizeZ(c, points) {\n const invertedZs = FpInvertBatch(c.Fp, points.map((p) => p.Z));\n return points.map((p, i) => c.fromAffine(p.toAffine(invertedZs[i])));\n}\nfunction validateW(W, bits) {\n if (!Number.isSafeInteger(W) || W <= 0 || W > bits)\n throw new Error('invalid window size, expected [1..' + bits + '], got W=' + W);\n}\nfunction calcWOpts(W, scalarBits) {\n validateW(W, scalarBits);\n const windows = Math.ceil(scalarBits / W) + 1; // W=8 33. Not 32, because we skip zero\n const windowSize = 2 ** (W - 1); // W=8 128. Not 256, because we skip zero\n const maxNumber = 2 ** W; // W=8 256\n const mask = bitMask(W); // W=8 255 == mask 0b11111111\n const shiftBy = BigInt(W); // W=8 8\n return { windows, windowSize, mask, maxNumber, shiftBy };\n}\nfunction calcOffsets(n, window, wOpts) {\n const { windowSize, mask, maxNumber, shiftBy } = wOpts;\n let wbits = Number(n & mask); // extract W bits.\n let nextN = n >> shiftBy; // shift number by W bits.\n // What actually happens here:\n // const highestBit = Number(mask ^ (mask >> 1n));\n // let wbits2 = wbits - 1; // skip zero\n // if (wbits2 & highestBit) { wbits2 ^= Number(mask); // (~);\n // split if bits > max: +224 => 256-32\n if (wbits > windowSize) {\n // we skip zero, which means instead of `>= size-1`, we do `> size`\n wbits -= maxNumber; // -32, can be maxNumber - wbits, but then we need to set isNeg here.\n nextN += _1n; // +256 (carry)\n }\n const offsetStart = window * windowSize;\n const offset = offsetStart + Math.abs(wbits) - 1; // -1 because we skip zero\n const isZero = wbits === 0; // is current window slice a 0?\n const isNeg = wbits < 0; // is current window slice negative?\n const isNegF = window % 2 !== 0; // fake random statement for noise\n const offsetF = offsetStart; // fake offset for noise\n return { nextN, offset, isZero, isNeg, isNegF, offsetF };\n}\nfunction validateMSMPoints(points, c) {\n if (!Array.isArray(points))\n throw new Error('array expected');\n points.forEach((p, i) => {\n if (!(p instanceof c))\n throw new Error('invalid point at index ' + i);\n });\n}\nfunction validateMSMScalars(scalars, field) {\n if (!Array.isArray(scalars))\n throw new Error('array of scalars expected');\n scalars.forEach((s, i) => {\n if (!field.isValid(s))\n throw new Error('invalid scalar at index ' + i);\n });\n}\n// Since points in different groups cannot be equal (different object constructor),\n// we can have single place to store precomputes.\n// Allows to make points frozen / immutable.\nconst pointPrecomputes = new WeakMap();\nconst pointWindowSizes = new WeakMap();\nfunction getW(P) {\n // To disable precomputes:\n // return 1;\n return pointWindowSizes.get(P) || 1;\n}\nfunction assert0(n) {\n if (n !== _0n)\n throw new Error('invalid wNAF');\n}\n/**\n * Elliptic curve multiplication of Point by scalar. Fragile.\n * Table generation takes **30MB of ram and 10ms on high-end CPU**,\n * but may take much longer on slow devices. Actual generation will happen on\n * first call of `multiply()`. By default, `BASE` point is precomputed.\n *\n * Scalars should always be less than curve order: this should be checked inside of a curve itself.\n * Creates precomputation tables for fast multiplication:\n * - private scalar is split by fixed size windows of W bits\n * - every window point is collected from window's table & added to accumulator\n * - since windows are different, same point inside tables won't be accessed more than once per calc\n * - each multiplication is 'Math.ceil(CURVE_ORDER / 𝑊) + 1' point additions (fixed for any scalar)\n * - +1 window is neccessary for wNAF\n * - wNAF reduces table size: 2x less memory + 2x faster generation, but 10% slower multiplication\n *\n * @todo Research returning 2d JS array of windows, instead of a single window.\n * This would allow windows to be in different memory locations\n */\nexport class wNAF {\n BASE;\n ZERO;\n Fn;\n bits;\n // Parametrized with a given Point class (not individual point)\n constructor(Point, bits) {\n this.BASE = Point.BASE;\n this.ZERO = Point.ZERO;\n this.Fn = Point.Fn;\n this.bits = bits;\n }\n // non-const time multiplication ladder\n _unsafeLadder(elm, n, p = this.ZERO) {\n let d = elm;\n while (n > _0n) {\n if (n & _1n)\n p = p.add(d);\n d = d.double();\n n >>= _1n;\n }\n return p;\n }\n /**\n * Creates a wNAF precomputation window. Used for caching.\n * Default window size is set by `utils.precompute()` and is equal to 8.\n * Number of precomputed points depends on the curve size:\n * 2^(𝑊−1) * (Math.ceil(𝑛 / 𝑊) + 1), where:\n * - 𝑊 is the window size\n * - 𝑛 is the bitlength of the curve order.\n * For a 256-bit curve and window size 8, the number of precomputed points is 128 * 33 = 4224.\n * @param point Point instance\n * @param W window size\n * @returns precomputed point tables flattened to a single array\n */\n precomputeWindow(point, W) {\n const { windows, windowSize } = calcWOpts(W, this.bits);\n const points = [];\n let p = point;\n let base = p;\n for (let window = 0; window < windows; window++) {\n base = p;\n points.push(base);\n // i=1, bc we skip 0\n for (let i = 1; i < windowSize; i++) {\n base = base.add(p);\n points.push(base);\n }\n p = base.double();\n }\n return points;\n }\n /**\n * Implements ec multiplication using precomputed tables and w-ary non-adjacent form.\n * More compact implementation:\n * https://github.com/paulmillr/noble-secp256k1/blob/47cb1669b6e506ad66b35fe7d76132ae97465da2/index.ts#L502-L541\n * @returns real and fake (for const-time) points\n */\n wNAF(W, precomputes, n) {\n // Scalar should be smaller than field order\n if (!this.Fn.isValid(n))\n throw new Error('invalid scalar');\n // Accumulators\n let p = this.ZERO;\n let f = this.BASE;\n // This code was first written with assumption that 'f' and 'p' will never be infinity point:\n // since each addition is multiplied by 2 ** W, it cannot cancel each other. However,\n // there is negate now: it is possible that negated element from low value\n // would be the same as high element, which will create carry into next window.\n // It's not obvious how this can fail, but still worth investigating later.\n const wo = calcWOpts(W, this.bits);\n for (let window = 0; window < wo.windows; window++) {\n // (n === _0n) is handled and not early-exited. isEven and offsetF are used for noise\n const { nextN, offset, isZero, isNeg, isNegF, offsetF } = calcOffsets(n, window, wo);\n n = nextN;\n if (isZero) {\n // bits are 0: add garbage to fake point\n // Important part for const-time getPublicKey: add random \"noise\" point to f.\n f = f.add(negateCt(isNegF, precomputes[offsetF]));\n }\n else {\n // bits are 1: add to result point\n p = p.add(negateCt(isNeg, precomputes[offset]));\n }\n }\n assert0(n);\n // Return both real and fake points: JIT won't eliminate f.\n // At this point there is a way to F be infinity-point even if p is not,\n // which makes it less const-time: around 1 bigint multiply.\n return { p, f };\n }\n /**\n * Implements ec unsafe (non const-time) multiplication using precomputed tables and w-ary non-adjacent form.\n * @param acc accumulator point to add result of multiplication\n * @returns point\n */\n wNAFUnsafe(W, precomputes, n, acc = this.ZERO) {\n const wo = calcWOpts(W, this.bits);\n for (let window = 0; window < wo.windows; window++) {\n if (n === _0n)\n break; // Early-exit, skip 0 value\n const { nextN, offset, isZero, isNeg } = calcOffsets(n, window, wo);\n n = nextN;\n if (isZero) {\n // Window bits are 0: skip processing.\n // Move to next window.\n continue;\n }\n else {\n const item = precomputes[offset];\n acc = acc.add(isNeg ? item.negate() : item); // Re-using acc allows to save adds in MSM\n }\n }\n assert0(n);\n return acc;\n }\n getPrecomputes(W, point, transform) {\n // Calculate precomputes on a first run, reuse them after\n let comp = pointPrecomputes.get(point);\n if (!comp) {\n comp = this.precomputeWindow(point, W);\n if (W !== 1) {\n // Doing transform outside of if brings 15% perf hit\n if (typeof transform === 'function')\n comp = transform(comp);\n pointPrecomputes.set(point, comp);\n }\n }\n return comp;\n }\n cached(point, scalar, transform) {\n const W = getW(point);\n return this.wNAF(W, this.getPrecomputes(W, point, transform), scalar);\n }\n unsafe(point, scalar, transform, prev) {\n const W = getW(point);\n if (W === 1)\n return this._unsafeLadder(point, scalar, prev); // For W=1 ladder is ~x2 faster\n return this.wNAFUnsafe(W, this.getPrecomputes(W, point, transform), scalar, prev);\n }\n // We calculate precomputes for elliptic curve point multiplication\n // using windowed method. This specifies window size and\n // stores precomputed values. Usually only base point would be precomputed.\n createCache(P, W) {\n validateW(W, this.bits);\n pointWindowSizes.set(P, W);\n pointPrecomputes.delete(P);\n }\n hasCache(elm) {\n return getW(elm) !== 1;\n }\n}\n/**\n * Endomorphism-specific multiplication for Koblitz curves.\n * Cost: 128 dbl, 0-256 adds.\n */\nexport function mulEndoUnsafe(Point, point, k1, k2) {\n let acc = point;\n let p1 = Point.ZERO;\n let p2 = Point.ZERO;\n while (k1 > _0n || k2 > _0n) {\n if (k1 & _1n)\n p1 = p1.add(acc);\n if (k2 & _1n)\n p2 = p2.add(acc);\n acc = acc.double();\n k1 >>= _1n;\n k2 >>= _1n;\n }\n return { p1, p2 };\n}\n/**\n * Pippenger algorithm for multi-scalar multiplication (MSM, Pa + Qb + Rc + ...).\n * 30x faster vs naive addition on L=4096, 10x faster than precomputes.\n * For N=254bit, L=1, it does: 1024 ADD + 254 DBL. For L=5: 1536 ADD + 254 DBL.\n * Algorithmically constant-time (for same L), even when 1 point + scalar, or when scalar = 0.\n * @param c Curve Point constructor\n * @param fieldN field over CURVE.N - important that it's not over CURVE.P\n * @param points array of L curve points\n * @param scalars array of L scalars (aka secret keys / bigints)\n */\nexport function pippenger(c, points, scalars) {\n // If we split scalars by some window (let's say 8 bits), every chunk will only\n // take 256 buckets even if there are 4096 scalars, also re-uses double.\n // TODO:\n // - https://eprint.iacr.org/2024/750.pdf\n // - https://tches.iacr.org/index.php/TCHES/article/view/10287\n // 0 is accepted in scalars\n const fieldN = c.Fn;\n validateMSMPoints(points, c);\n validateMSMScalars(scalars, fieldN);\n const plength = points.length;\n const slength = scalars.length;\n if (plength !== slength)\n throw new Error('arrays of points and scalars must have equal length');\n // if (plength === 0) throw new Error('array must be of length >= 2');\n const zero = c.ZERO;\n const wbits = bitLen(BigInt(plength));\n let windowSize = 1; // bits\n if (wbits > 12)\n windowSize = wbits - 3;\n else if (wbits > 4)\n windowSize = wbits - 2;\n else if (wbits > 0)\n windowSize = 2;\n const MASK = bitMask(windowSize);\n const buckets = new Array(Number(MASK) + 1).fill(zero); // +1 for zero array\n const lastBits = Math.floor((fieldN.BITS - 1) / windowSize) * windowSize;\n let sum = zero;\n for (let i = lastBits; i >= 0; i -= windowSize) {\n buckets.fill(zero);\n for (let j = 0; j < slength; j++) {\n const scalar = scalars[j];\n const wbits = Number((scalar >> BigInt(i)) & MASK);\n buckets[wbits] = buckets[wbits].add(points[j]);\n }\n let resI = zero; // not using this will do small speed-up, but will lose ct\n // Skip first bucket, because it is zero\n for (let j = buckets.length - 1, sumI = zero; j > 0; j--) {\n sumI = sumI.add(buckets[j]);\n resI = resI.add(sumI);\n }\n sum = sum.add(resI);\n if (i !== 0)\n for (let j = 0; j < windowSize; j++)\n sum = sum.double();\n }\n return sum;\n}\n/**\n * Precomputed multi-scalar multiplication (MSM, Pa + Qb + Rc + ...).\n * @param c Curve Point constructor\n * @param fieldN field over CURVE.N - important that it's not over CURVE.P\n * @param points array of L curve points\n * @returns function which multiplies points with scaars\n */\nexport function precomputeMSMUnsafe(c, points, windowSize) {\n /**\n * Performance Analysis of Window-based Precomputation\n *\n * Base Case (256-bit scalar, 8-bit window):\n * - Standard precomputation requires:\n * - 31 additions per scalar × 256 scalars = 7,936 ops\n * - Plus 255 summary additions = 8,191 total ops\n * Note: Summary additions can be optimized via accumulator\n *\n * Chunked Precomputation Analysis:\n * - Using 32 chunks requires:\n * - 255 additions per chunk\n * - 256 doublings\n * - Total: (255 × 32) + 256 = 8,416 ops\n *\n * Memory Usage Comparison:\n * Window Size | Standard Points | Chunked Points\n * ------------|-----------------|---------------\n * 4-bit | 520 | 15\n * 8-bit | 4,224 | 255\n * 10-bit | 13,824 | 1,023\n * 16-bit | 557,056 | 65,535\n *\n * Key Advantages:\n * 1. Enables larger window sizes due to reduced memory overhead\n * 2. More efficient for smaller scalar counts:\n * - 16 chunks: (16 × 255) + 256 = 4,336 ops\n * - ~2x faster than standard 8,191 ops\n *\n * Limitations:\n * - Not suitable for plain precomputes (requires 256 constant doublings)\n * - Performance degrades with larger scalar counts:\n * - Optimal for ~256 scalars\n * - Less efficient for 4096+ scalars (Pippenger preferred)\n */\n const fieldN = c.Fn;\n validateW(windowSize, fieldN.BITS);\n validateMSMPoints(points, c);\n const zero = c.ZERO;\n const tableSize = 2 ** windowSize - 1; // table size (without zero)\n const chunks = Math.ceil(fieldN.BITS / windowSize); // chunks of item\n const MASK = bitMask(windowSize);\n const tables = points.map((p) => {\n const res = [];\n for (let i = 0, acc = p; i < tableSize; i++) {\n res.push(acc);\n acc = acc.add(p);\n }\n return res;\n });\n return (scalars) => {\n validateMSMScalars(scalars, fieldN);\n if (scalars.length > points.length)\n throw new Error('array of scalars must be smaller than array of points');\n let res = zero;\n for (let i = 0; i < chunks; i++) {\n // No need to double if accumulator is still zero.\n if (res !== zero)\n for (let j = 0; j < windowSize; j++)\n res = res.double();\n const shiftBy = BigInt(chunks * windowSize - (i + 1) * windowSize);\n for (let j = 0; j < scalars.length; j++) {\n const n = scalars[j];\n const curr = Number((n >> shiftBy) & MASK);\n if (!curr)\n continue; // skip zero scalars chunks\n res = res.add(tables[j][curr - 1]);\n }\n }\n return res;\n };\n}\nfunction createField(order, field, isLE) {\n if (field) {\n if (field.ORDER !== order)\n throw new Error('Field.ORDER must match order: Fp == p, Fn == n');\n validateField(field);\n return field;\n }\n else {\n return Field(order, { isLE });\n }\n}\n/** Validates CURVE opts and creates fields */\nexport function createCurveFields(type, CURVE, curveOpts = {}, FpFnLE) {\n if (FpFnLE === undefined)\n FpFnLE = type === 'edwards';\n if (!CURVE || typeof CURVE !== 'object')\n throw new Error(`expected valid ${type} CURVE object`);\n for (const p of ['p', 'n', 'h']) {\n const val = CURVE[p];\n if (!(typeof val === 'bigint' && val > _0n))\n throw new Error(`CURVE.${p} must be positive bigint`);\n }\n const Fp = createField(CURVE.p, curveOpts.Fp, FpFnLE);\n const Fn = createField(CURVE.n, curveOpts.Fn, FpFnLE);\n const _b = type === 'weierstrass' ? 'b' : 'd';\n const params = ['Gx', 'Gy', 'a', _b];\n for (const p of params) {\n // @ts-ignore\n if (!Fp.isValid(CURVE[p]))\n throw new Error(`CURVE.${p} must be valid field element of CURVE.Fp`);\n }\n CURVE = Object.freeze(Object.assign({}, CURVE));\n return { CURVE, Fp, Fn };\n}\nexport function createKeygen(randomSecretKey, getPublicKey) {\n return function keygen(seed) {\n const secretKey = randomSecretKey(seed);\n return { secretKey, publicKey: getPublicKey(secretKey) };\n };\n}\n//# sourceMappingURL=curve.js.map","/**\n * HMAC: RFC2104 message authentication code.\n * @module\n */\nimport { abytes, aexists, ahash, clean } from \"./utils.js\";\n/** Internal class for HMAC. */\nexport class _HMAC {\n oHash;\n iHash;\n blockLen;\n outputLen;\n finished = false;\n destroyed = false;\n constructor(hash, key) {\n ahash(hash);\n abytes(key, undefined, 'key');\n this.iHash = hash.create();\n if (typeof this.iHash.update !== 'function')\n throw new Error('Expected instance of class which extends utils.Hash');\n this.blockLen = this.iHash.blockLen;\n this.outputLen = this.iHash.outputLen;\n const blockLen = this.blockLen;\n const pad = new Uint8Array(blockLen);\n // blockLen can be bigger than outputLen\n pad.set(key.length > blockLen ? hash.create().update(key).digest() : key);\n for (let i = 0; i < pad.length; i++)\n pad[i] ^= 0x36;\n this.iHash.update(pad);\n // By doing update (processing of first block) of outer hash here we can re-use it between multiple calls via clone\n this.oHash = hash.create();\n // Undo internal XOR && apply outer XOR\n for (let i = 0; i < pad.length; i++)\n pad[i] ^= 0x36 ^ 0x5c;\n this.oHash.update(pad);\n clean(pad);\n }\n update(buf) {\n aexists(this);\n this.iHash.update(buf);\n return this;\n }\n digestInto(out) {\n aexists(this);\n abytes(out, this.outputLen, 'output');\n this.finished = true;\n this.iHash.digestInto(out);\n this.oHash.update(out);\n this.oHash.digestInto(out);\n this.destroy();\n }\n digest() {\n const out = new Uint8Array(this.oHash.outputLen);\n this.digestInto(out);\n return out;\n }\n _cloneInto(to) {\n // Create new instance without calling constructor since key already in state and we don't know it.\n to ||= Object.create(Object.getPrototypeOf(this), {});\n const { oHash, iHash, finished, destroyed, blockLen, outputLen } = this;\n to = to;\n to.finished = finished;\n to.destroyed = destroyed;\n to.blockLen = blockLen;\n to.outputLen = outputLen;\n to.oHash = oHash._cloneInto(to.oHash);\n to.iHash = iHash._cloneInto(to.iHash);\n return to;\n }\n clone() {\n return this._cloneInto();\n }\n destroy() {\n this.destroyed = true;\n this.oHash.destroy();\n this.iHash.destroy();\n }\n}\n/**\n * HMAC: RFC2104 message authentication code.\n * @param hash - function that would be used e.g. sha256\n * @param key - message key\n * @param message - message data\n * @example\n * import { hmac } from '@noble/hashes/hmac';\n * import { sha256 } from '@noble/hashes/sha2';\n * const mac1 = hmac(sha256, 'key', 'message');\n */\nexport const hmac = (hash, key, message) => new _HMAC(hash, key).update(message).digest();\nhmac.create = (hash, key) => new _HMAC(hash, key);\n//# sourceMappingURL=hmac.js.map","/**\n * Short Weierstrass curve methods. The formula is: y² = x³ + ax + b.\n *\n * ### Design rationale for types\n *\n * * Interaction between classes from different curves should fail:\n * `k256.Point.BASE.add(p256.Point.BASE)`\n * * For this purpose we want to use `instanceof` operator, which is fast and works during runtime\n * * Different calls of `curve()` would return different classes -\n * `curve(params) !== curve(params)`: if somebody decided to monkey-patch their curve,\n * it won't affect others\n *\n * TypeScript can't infer types for classes created inside a function. Classes is one instance\n * of nominative types in TypeScript and interfaces only check for shape, so it's hard to create\n * unique type for every function call.\n *\n * We can use generic types via some param, like curve opts, but that would:\n * 1. Enable interaction between `curve(params)` and `curve(params)` (curves of same params)\n * which is hard to debug.\n * 2. Params can be generic and we can't enforce them to be constant value:\n * if somebody creates curve from non-constant params,\n * it would be allowed to interact with other curves with non-constant params\n *\n * @todo https://www.typescriptlang.org/docs/handbook/release-notes/typescript-2-7.html#unique-symbol\n * @module\n */\n/*! noble-curves - MIT License (c) 2022 Paul Miller (paulmillr.com) */\nimport { hmac as nobleHmac } from '@noble/hashes/hmac.js';\nimport { ahash } from '@noble/hashes/utils.js';\nimport { abool, abytes, aInRange, bitLen, bitMask, bytesToHex, bytesToNumberBE, concatBytes, createHmacDrbg, hexToBytes, isBytes, memoized, numberToHexUnpadded, validateObject, randomBytes as wcRandomBytes, } from \"../utils.js\";\nimport { createCurveFields, createKeygen, mulEndoUnsafe, negateCt, normalizeZ, wNAF, } from \"./curve.js\";\nimport { FpInvertBatch, getMinHashLength, mapHashToField, validateField, } from \"./modular.js\";\n// We construct basis in such way that den is always positive and equals n, but num sign depends on basis (not on secret value)\nconst divNearest = (num, den) => (num + (num >= 0 ? den : -den) / _2n) / den;\n/**\n * Splits scalar for GLV endomorphism.\n */\nexport function _splitEndoScalar(k, basis, n) {\n // Split scalar into two such that part is ~half bits: `abs(part) < sqrt(N)`\n // Since part can be negative, we need to do this on point.\n // TODO: verifyScalar function which consumes lambda\n const [[a1, b1], [a2, b2]] = basis;\n const c1 = divNearest(b2 * k, n);\n const c2 = divNearest(-b1 * k, n);\n // |k1|/|k2| is < sqrt(N), but can be negative.\n // If we do `k1 mod N`, we'll get big scalar (`> sqrt(N)`): so, we do cheaper negation instead.\n let k1 = k - c1 * a1 - c2 * a2;\n let k2 = -c1 * b1 - c2 * b2;\n const k1neg = k1 < _0n;\n const k2neg = k2 < _0n;\n if (k1neg)\n k1 = -k1;\n if (k2neg)\n k2 = -k2;\n // Double check that resulting scalar less than half bits of N: otherwise wNAF will fail.\n // This should only happen on wrong basises. Also, math inside is too complex and I don't trust it.\n const MAX_NUM = bitMask(Math.ceil(bitLen(n) / 2)) + _1n; // Half bits of N\n if (k1 < _0n || k1 >= MAX_NUM || k2 < _0n || k2 >= MAX_NUM) {\n throw new Error('splitScalar (endomorphism): failed, k=' + k);\n }\n return { k1neg, k1, k2neg, k2 };\n}\nfunction validateSigFormat(format) {\n if (!['compact', 'recovered', 'der'].includes(format))\n throw new Error('Signature format must be \"compact\", \"recovered\", or \"der\"');\n return format;\n}\nfunction validateSigOpts(opts, def) {\n const optsn = {};\n for (let optName of Object.keys(def)) {\n // @ts-ignore\n optsn[optName] = opts[optName] === undefined ? def[optName] : opts[optName];\n }\n abool(optsn.lowS, 'lowS');\n abool(optsn.prehash, 'prehash');\n if (optsn.format !== undefined)\n validateSigFormat(optsn.format);\n return optsn;\n}\nexport class DERErr extends Error {\n constructor(m = '') {\n super(m);\n }\n}\n/**\n * ASN.1 DER encoding utilities. ASN is very complex & fragile. Format:\n *\n * [0x30 (SEQUENCE), bytelength, 0x02 (INTEGER), intLength, R, 0x02 (INTEGER), intLength, S]\n *\n * Docs: https://letsencrypt.org/docs/a-warm-welcome-to-asn1-and-der/, https://luca.ntop.org/Teaching/Appunti/asn1.html\n */\nexport const DER = {\n // asn.1 DER encoding utils\n Err: DERErr,\n // Basic building block is TLV (Tag-Length-Value)\n _tlv: {\n encode: (tag, data) => {\n const { Err: E } = DER;\n if (tag < 0 || tag > 256)\n throw new E('tlv.encode: wrong tag');\n if (data.length & 1)\n throw new E('tlv.encode: unpadded data');\n const dataLen = data.length / 2;\n const len = numberToHexUnpadded(dataLen);\n if ((len.length / 2) & 0b1000_0000)\n throw new E('tlv.encode: long form length too big');\n // length of length with long form flag\n const lenLen = dataLen > 127 ? numberToHexUnpadded((len.length / 2) | 0b1000_0000) : '';\n const t = numberToHexUnpadded(tag);\n return t + lenLen + len + data;\n },\n // v - value, l - left bytes (unparsed)\n decode(tag, data) {\n const { Err: E } = DER;\n let pos = 0;\n if (tag < 0 || tag > 256)\n throw new E('tlv.encode: wrong tag');\n if (data.length < 2 || data[pos++] !== tag)\n throw new E('tlv.decode: wrong tlv');\n const first = data[pos++];\n const isLong = !!(first & 0b1000_0000); // First bit of first length byte is flag for short/long form\n let length = 0;\n if (!isLong)\n length = first;\n else {\n // Long form: [longFlag(1bit), lengthLength(7bit), length (BE)]\n const lenLen = first & 0b0111_1111;\n if (!lenLen)\n throw new E('tlv.decode(long): indefinite length not supported');\n if (lenLen > 4)\n throw new E('tlv.decode(long): byte length is too big'); // this will overflow u32 in js\n const lengthBytes = data.subarray(pos, pos + lenLen);\n if (lengthBytes.length !== lenLen)\n throw new E('tlv.decode: length bytes not complete');\n if (lengthBytes[0] === 0)\n throw new E('tlv.decode(long): zero leftmost byte');\n for (const b of lengthBytes)\n length = (length << 8) | b;\n pos += lenLen;\n if (length < 128)\n throw new E('tlv.decode(long): not minimal encoding');\n }\n const v = data.subarray(pos, pos + length);\n if (v.length !== length)\n throw new E('tlv.decode: wrong value length');\n return { v, l: data.subarray(pos + length) };\n },\n },\n // https://crypto.stackexchange.com/a/57734 Leftmost bit of first byte is 'negative' flag,\n // since we always use positive integers here. It must always be empty:\n // - add zero byte if exists\n // - if next byte doesn't have a flag, leading zero is not allowed (minimal encoding)\n _int: {\n encode(num) {\n const { Err: E } = DER;\n if (num < _0n)\n throw new E('integer: negative integers are not allowed');\n let hex = numberToHexUnpadded(num);\n // Pad with zero byte if negative flag is present\n if (Number.parseInt(hex[0], 16) & 0b1000)\n hex = '00' + hex;\n if (hex.length & 1)\n throw new E('unexpected DER parsing assertion: unpadded hex');\n return hex;\n },\n decode(data) {\n const { Err: E } = DER;\n if (data[0] & 0b1000_0000)\n throw new E('invalid signature integer: negative');\n if (data[0] === 0x00 && !(data[1] & 0b1000_0000))\n throw new E('invalid signature integer: unnecessary leading zero');\n return bytesToNumberBE(data);\n },\n },\n toSig(bytes) {\n // parse DER signature\n const { Err: E, _int: int, _tlv: tlv } = DER;\n const data = abytes(bytes, undefined, 'signature');\n const { v: seqBytes, l: seqLeftBytes } = tlv.decode(0x30, data);\n if (seqLeftBytes.length)\n throw new E('invalid signature: left bytes after parsing');\n const { v: rBytes, l: rLeftBytes } = tlv.decode(0x02, seqBytes);\n const { v: sBytes, l: sLeftBytes } = tlv.decode(0x02, rLeftBytes);\n if (sLeftBytes.length)\n throw new E('invalid signature: left bytes after parsing');\n return { r: int.decode(rBytes), s: int.decode(sBytes) };\n },\n hexFromSig(sig) {\n const { _tlv: tlv, _int: int } = DER;\n const rs = tlv.encode(0x02, int.encode(sig.r));\n const ss = tlv.encode(0x02, int.encode(sig.s));\n const seq = rs + ss;\n return tlv.encode(0x30, seq);\n },\n};\n// Be friendly to bad ECMAScript parsers by not using bigint literals\n// prettier-ignore\nconst _0n = BigInt(0), _1n = BigInt(1), _2n = BigInt(2), _3n = BigInt(3), _4n = BigInt(4);\n/**\n * Creates weierstrass Point constructor, based on specified curve options.\n *\n * See {@link WeierstrassOpts}.\n *\n * @example\n```js\nconst opts = {\n p: 0xfffffffffffffffffffffffffffffffeffffac73n,\n n: 0x100000000000000000001b8fa16dfab9aca16b6b3n,\n h: 1n,\n a: 0n,\n b: 7n,\n Gx: 0x3b4c382ce37aa192a4019e763036f4f5dd4d7ebbn,\n Gy: 0x938cf935318fdced6bc28286531733c3f03c4feen,\n};\nconst secp160k1_Point = weierstrass(opts);\n```\n */\nexport function weierstrass(params, extraOpts = {}) {\n const validated = createCurveFields('weierstrass', params, extraOpts);\n const { Fp, Fn } = validated;\n let CURVE = validated.CURVE;\n const { h: cofactor, n: CURVE_ORDER } = CURVE;\n validateObject(extraOpts, {}, {\n allowInfinityPoint: 'boolean',\n clearCofactor: 'function',\n isTorsionFree: 'function',\n fromBytes: 'function',\n toBytes: 'function',\n endo: 'object',\n });\n const { endo } = extraOpts;\n if (endo) {\n // validateObject(endo, { beta: 'bigint', splitScalar: 'function' });\n if (!Fp.is0(CURVE.a) || typeof endo.beta !== 'bigint' || !Array.isArray(endo.basises)) {\n throw new Error('invalid endo: expected \"beta\": bigint and \"basises\": array');\n }\n }\n const lengths = getWLengths(Fp, Fn);\n function assertCompressionIsSupported() {\n if (!Fp.isOdd)\n throw new Error('compression is not supported: Field does not have .isOdd()');\n }\n // Implements IEEE P1363 point encoding\n function pointToBytes(_c, point, isCompressed) {\n const { x, y } = point.toAffine();\n const bx = Fp.toBytes(x);\n abool(isCompressed, 'isCompressed');\n if (isCompressed) {\n assertCompressionIsSupported();\n const hasEvenY = !Fp.isOdd(y);\n return concatBytes(pprefix(hasEvenY), bx);\n }\n else {\n return concatBytes(Uint8Array.of(0x04), bx, Fp.toBytes(y));\n }\n }\n function pointFromBytes(bytes) {\n abytes(bytes, undefined, 'Point');\n const { publicKey: comp, publicKeyUncompressed: uncomp } = lengths; // e.g. for 32-byte: 33, 65\n const length = bytes.length;\n const head = bytes[0];\n const tail = bytes.subarray(1);\n // No actual validation is done here: use .assertValidity()\n if (length === comp && (head === 0x02 || head === 0x03)) {\n const x = Fp.fromBytes(tail);\n if (!Fp.isValid(x))\n throw new Error('bad point: is not on curve, wrong x');\n const y2 = weierstrassEquation(x); // y² = x³ + ax + b\n let y;\n try {\n y = Fp.sqrt(y2); // y = y² ^ (p+1)/4\n }\n catch (sqrtError) {\n const err = sqrtError instanceof Error ? ': ' + sqrtError.message : '';\n throw new Error('bad point: is not on curve, sqrt error' + err);\n }\n assertCompressionIsSupported();\n const evenY = Fp.isOdd(y);\n const evenH = (head & 1) === 1; // ECDSA-specific\n if (evenH !== evenY)\n y = Fp.neg(y);\n return { x, y };\n }\n else if (length === uncomp && head === 0x04) {\n // TODO: more checks\n const L = Fp.BYTES;\n const x = Fp.fromBytes(tail.subarray(0, L));\n const y = Fp.fromBytes(tail.subarray(L, L * 2));\n if (!isValidXY(x, y))\n throw new Error('bad point: is not on curve');\n return { x, y };\n }\n else {\n throw new Error(`bad point: got length ${length}, expected compressed=${comp} or uncompressed=${uncomp}`);\n }\n }\n const encodePoint = extraOpts.toBytes || pointToBytes;\n const decodePoint = extraOpts.fromBytes || pointFromBytes;\n function weierstrassEquation(x) {\n const x2 = Fp.sqr(x); // x * x\n const x3 = Fp.mul(x2, x); // x² * x\n return Fp.add(Fp.add(x3, Fp.mul(x, CURVE.a)), CURVE.b); // x³ + a * x + b\n }\n // TODO: move top-level\n /** Checks whether equation holds for given x, y: y² == x³ + ax + b */\n function isValidXY(x, y) {\n const left = Fp.sqr(y); // y²\n const right = weierstrassEquation(x); // x³ + ax + b\n return Fp.eql(left, right);\n }\n // Validate whether the passed curve params are valid.\n // Test 1: equation y² = x³ + ax + b should work for generator point.\n if (!isValidXY(CURVE.Gx, CURVE.Gy))\n throw new Error('bad curve params: generator point');\n // Test 2: discriminant Δ part should be non-zero: 4a³ + 27b² != 0.\n // Guarantees curve is genus-1, smooth (non-singular).\n const _4a3 = Fp.mul(Fp.pow(CURVE.a, _3n), _4n);\n const _27b2 = Fp.mul(Fp.sqr(CURVE.b), BigInt(27));\n if (Fp.is0(Fp.add(_4a3, _27b2)))\n throw new Error('bad curve params: a or b');\n /** Asserts coordinate is valid: 0 <= n < Fp.ORDER. */\n function acoord(title, n, banZero = false) {\n if (!Fp.isValid(n) || (banZero && Fp.is0(n)))\n throw new Error(`bad point coordinate ${title}`);\n return n;\n }\n function aprjpoint(other) {\n if (!(other instanceof Point))\n throw new Error('Weierstrass Point expected');\n }\n function splitEndoScalarN(k) {\n if (!endo || !endo.basises)\n throw new Error('no endo');\n return _splitEndoScalar(k, endo.basises, Fn.ORDER);\n }\n // Memoized toAffine / validity check. They are heavy. Points are immutable.\n // Converts Projective point to affine (x, y) coordinates.\n // Can accept precomputed Z^-1 - for example, from invertBatch.\n // (X, Y, Z) ∋ (x=X/Z, y=Y/Z)\n const toAffineMemo = memoized((p, iz) => {\n const { X, Y, Z } = p;\n // Fast-path for normalized points\n if (Fp.eql(Z, Fp.ONE))\n return { x: X, y: Y };\n const is0 = p.is0();\n // If invZ was 0, we return zero point. However we still want to execute\n // all operations, so we replace invZ with a random number, 1.\n if (iz == null)\n iz = is0 ? Fp.ONE : Fp.inv(Z);\n const x = Fp.mul(X, iz);\n const y = Fp.mul(Y, iz);\n const zz = Fp.mul(Z, iz);\n if (is0)\n return { x: Fp.ZERO, y: Fp.ZERO };\n if (!Fp.eql(zz, Fp.ONE))\n throw new Error('invZ was invalid');\n return { x, y };\n });\n // NOTE: on exception this will crash 'cached' and no value will be set.\n // Otherwise true will be return\n const assertValidMemo = memoized((p) => {\n if (p.is0()) {\n // (0, 1, 0) aka ZERO is invalid in most contexts.\n // In BLS, ZERO can be serialized, so we allow it.\n // (0, 0, 0) is invalid representation of ZERO.\n if (extraOpts.allowInfinityPoint && !Fp.is0(p.Y))\n return;\n throw new Error('bad point: ZERO');\n }\n // Some 3rd-party test vectors require different wording between here & `fromCompressedHex`\n const { x, y } = p.toAffine();\n if (!Fp.isValid(x) || !Fp.isValid(y))\n throw new Error('bad point: x or y not field elements');\n if (!isValidXY(x, y))\n throw new Error('bad point: equation left != right');\n if (!p.isTorsionFree())\n throw new Error('bad point: not in prime-order subgroup');\n return true;\n });\n function finishEndo(endoBeta, k1p, k2p, k1neg, k2neg) {\n k2p = new Point(Fp.mul(k2p.X, endoBeta), k2p.Y, k2p.Z);\n k1p = negateCt(k1neg, k1p);\n k2p = negateCt(k2neg, k2p);\n return k1p.add(k2p);\n }\n /**\n * Projective Point works in 3d / projective (homogeneous) coordinates:(X, Y, Z) ∋ (x=X/Z, y=Y/Z).\n * Default Point works in 2d / affine coordinates: (x, y).\n * We're doing calculations in projective, because its operations don't require costly inversion.\n */\n class Point {\n // base / generator point\n static BASE = new Point(CURVE.Gx, CURVE.Gy, Fp.ONE);\n // zero / infinity / identity point\n static ZERO = new Point(Fp.ZERO, Fp.ONE, Fp.ZERO); // 0, 1, 0\n // math field\n static Fp = Fp;\n // scalar field\n static Fn = Fn;\n X;\n Y;\n Z;\n /** Does NOT validate if the point is valid. Use `.assertValidity()`. */\n constructor(X, Y, Z) {\n this.X = acoord('x', X);\n this.Y = acoord('y', Y, true);\n this.Z = acoord('z', Z);\n Object.freeze(this);\n }\n static CURVE() {\n return CURVE;\n }\n /** Does NOT validate if the point is valid. Use `.assertValidity()`. */\n static fromAffine(p) {\n const { x, y } = p || {};\n if (!p || !Fp.isValid(x) || !Fp.isValid(y))\n throw new Error('invalid affine point');\n if (p instanceof Point)\n throw new Error('projective point not allowed');\n // (0, 0) would've produced (0, 0, 1) - instead, we need (0, 1, 0)\n if (Fp.is0(x) && Fp.is0(y))\n return Point.ZERO;\n return new Point(x, y, Fp.ONE);\n }\n static fromBytes(bytes) {\n const P = Point.fromAffine(decodePoint(abytes(bytes, undefined, 'point')));\n P.assertValidity();\n return P;\n }\n static fromHex(hex) {\n return Point.fromBytes(hexToBytes(hex));\n }\n get x() {\n return this.toAffine().x;\n }\n get y() {\n return this.toAffine().y;\n }\n /**\n *\n * @param windowSize\n * @param isLazy true will defer table computation until the first multiplication\n * @returns\n */\n precompute(windowSize = 8, isLazy = true) {\n wnaf.createCache(this, windowSize);\n if (!isLazy)\n this.multiply(_3n); // random number\n return this;\n }\n // TODO: return `this`\n /** A point on curve is valid if it conforms to equation. */\n assertValidity() {\n assertValidMemo(this);\n }\n hasEvenY() {\n const { y } = this.toAffine();\n if (!Fp.isOdd)\n throw new Error(\"Field doesn't support isOdd\");\n return !Fp.isOdd(y);\n }\n /** Compare one point to another. */\n equals(other) {\n aprjpoint(other);\n const { X: X1, Y: Y1, Z: Z1 } = this;\n const { X: X2, Y: Y2, Z: Z2 } = other;\n const U1 = Fp.eql(Fp.mul(X1, Z2), Fp.mul(X2, Z1));\n const U2 = Fp.eql(Fp.mul(Y1, Z2), Fp.mul(Y2, Z1));\n return U1 && U2;\n }\n /** Flips point to one corresponding to (x, -y) in Affine coordinates. */\n negate() {\n return new Point(this.X, Fp.neg(this.Y), this.Z);\n }\n // Renes-Costello-Batina exception-free doubling formula.\n // There is 30% faster Jacobian formula, but it is not complete.\n // https://eprint.iacr.org/2015/1060, algorithm 3\n // Cost: 8M + 3S + 3*a + 2*b3 + 15add.\n double() {\n const { a, b } = CURVE;\n const b3 = Fp.mul(b, _3n);\n const { X: X1, Y: Y1, Z: Z1 } = this;\n let X3 = Fp.ZERO, Y3 = Fp.ZERO, Z3 = Fp.ZERO; // prettier-ignore\n let t0 = Fp.mul(X1, X1); // step 1\n let t1 = Fp.mul(Y1, Y1);\n let t2 = Fp.mul(Z1, Z1);\n let t3 = Fp.mul(X1, Y1);\n t3 = Fp.add(t3, t3); // step 5\n Z3 = Fp.mul(X1, Z1);\n Z3 = Fp.add(Z3, Z3);\n X3 = Fp.mul(a, Z3);\n Y3 = Fp.mul(b3, t2);\n Y3 = Fp.add(X3, Y3); // step 10\n X3 = Fp.sub(t1, Y3);\n Y3 = Fp.add(t1, Y3);\n Y3 = Fp.mul(X3, Y3);\n X3 = Fp.mul(t3, X3);\n Z3 = Fp.mul(b3, Z3); // step 15\n t2 = Fp.mul(a, t2);\n t3 = Fp.sub(t0, t2);\n t3 = Fp.mul(a, t3);\n t3 = Fp.add(t3, Z3);\n Z3 = Fp.add(t0, t0); // step 20\n t0 = Fp.add(Z3, t0);\n t0 = Fp.add(t0, t2);\n t0 = Fp.mul(t0, t3);\n Y3 = Fp.add(Y3, t0);\n t2 = Fp.mul(Y1, Z1); // step 25\n t2 = Fp.add(t2, t2);\n t0 = Fp.mul(t2, t3);\n X3 = Fp.sub(X3, t0);\n Z3 = Fp.mul(t2, t1);\n Z3 = Fp.add(Z3, Z3); // step 30\n Z3 = Fp.add(Z3, Z3);\n return new Point(X3, Y3, Z3);\n }\n // Renes-Costello-Batina exception-free addition formula.\n // There is 30% faster Jacobian formula, but it is not complete.\n // https://eprint.iacr.org/2015/1060, algorithm 1\n // Cost: 12M + 0S + 3*a + 3*b3 + 23add.\n add(other) {\n aprjpoint(other);\n const { X: X1, Y: Y1, Z: Z1 } = this;\n const { X: X2, Y: Y2, Z: Z2 } = other;\n let X3 = Fp.ZERO, Y3 = Fp.ZERO, Z3 = Fp.ZERO; // prettier-ignore\n const a = CURVE.a;\n const b3 = Fp.mul(CURVE.b, _3n);\n let t0 = Fp.mul(X1, X2); // step 1\n let t1 = Fp.mul(Y1, Y2);\n let t2 = Fp.mul(Z1, Z2);\n let t3 = Fp.add(X1, Y1);\n let t4 = Fp.add(X2, Y2); // step 5\n t3 = Fp.mul(t3, t4);\n t4 = Fp.add(t0, t1);\n t3 = Fp.sub(t3, t4);\n t4 = Fp.add(X1, Z1);\n let t5 = Fp.add(X2, Z2); // step 10\n t4 = Fp.mul(t4, t5);\n t5 = Fp.add(t0, t2);\n t4 = Fp.sub(t4, t5);\n t5 = Fp.add(Y1, Z1);\n X3 = Fp.add(Y2, Z2); // step 15\n t5 = Fp.mul(t5, X3);\n X3 = Fp.add(t1, t2);\n t5 = Fp.sub(t5, X3);\n Z3 = Fp.mul(a, t4);\n X3 = Fp.mul(b3, t2); // step 20\n Z3 = Fp.add(X3, Z3);\n X3 = Fp.sub(t1, Z3);\n Z3 = Fp.add(t1, Z3);\n Y3 = Fp.mul(X3, Z3);\n t1 = Fp.add(t0, t0); // step 25\n t1 = Fp.add(t1, t0);\n t2 = Fp.mul(a, t2);\n t4 = Fp.mul(b3, t4);\n t1 = Fp.add(t1, t2);\n t2 = Fp.sub(t0, t2); // step 30\n t2 = Fp.mul(a, t2);\n t4 = Fp.add(t4, t2);\n t0 = Fp.mul(t1, t4);\n Y3 = Fp.add(Y3, t0);\n t0 = Fp.mul(t5, t4); // step 35\n X3 = Fp.mul(t3, X3);\n X3 = Fp.sub(X3, t0);\n t0 = Fp.mul(t3, t1);\n Z3 = Fp.mul(t5, Z3);\n Z3 = Fp.add(Z3, t0); // step 40\n return new Point(X3, Y3, Z3);\n }\n subtract(other) {\n return this.add(other.negate());\n }\n is0() {\n return this.equals(Point.ZERO);\n }\n /**\n * Constant time multiplication.\n * Uses wNAF method. Windowed method may be 10% faster,\n * but takes 2x longer to generate and consumes 2x memory.\n * Uses precomputes when available.\n * Uses endomorphism for Koblitz curves.\n * @param scalar by which the point would be multiplied\n * @returns New point\n */\n multiply(scalar) {\n const { endo } = extraOpts;\n if (!Fn.isValidNot0(scalar))\n throw new Error('invalid scalar: out of range'); // 0 is invalid\n let point, fake; // Fake point is used to const-time mult\n const mul = (n) => wnaf.cached(this, n, (p) => normalizeZ(Point, p));\n /** See docs for {@link EndomorphismOpts} */\n if (endo) {\n const { k1neg, k1, k2neg, k2 } = splitEndoScalarN(scalar);\n const { p: k1p, f: k1f } = mul(k1);\n const { p: k2p, f: k2f } = mul(k2);\n fake = k1f.add(k2f);\n point = finishEndo(endo.beta, k1p, k2p, k1neg, k2neg);\n }\n else {\n const { p, f } = mul(scalar);\n point = p;\n fake = f;\n }\n // Normalize `z` for both points, but return only real one\n return normalizeZ(Point, [point, fake])[0];\n }\n /**\n * Non-constant-time multiplication. Uses double-and-add algorithm.\n * It's faster, but should only be used when you don't care about\n * an exposed secret key e.g. sig verification, which works over *public* keys.\n */\n multiplyUnsafe(sc) {\n const { endo } = extraOpts;\n const p = this;\n if (!Fn.isValid(sc))\n throw new Error('invalid scalar: out of range'); // 0 is valid\n if (sc === _0n || p.is0())\n return Point.ZERO; // 0\n if (sc === _1n)\n return p; // 1\n if (wnaf.hasCache(this))\n return this.multiply(sc); // precomputes\n // We don't have method for double scalar multiplication (aP + bQ):\n // Even with using Strauss-Shamir trick, it's 35% slower than naïve mul+add.\n if (endo) {\n const { k1neg, k1, k2neg, k2 } = splitEndoScalarN(sc);\n const { p1, p2 } = mulEndoUnsafe(Point, p, k1, k2); // 30% faster vs wnaf.unsafe\n return finishEndo(endo.beta, p1, p2, k1neg, k2neg);\n }\n else {\n return wnaf.unsafe(p, sc);\n }\n }\n /**\n * Converts Projective point to affine (x, y) coordinates.\n * @param invertedZ Z^-1 (inverted zero) - optional, precomputation is useful for invertBatch\n */\n toAffine(invertedZ) {\n return toAffineMemo(this, invertedZ);\n }\n /**\n * Checks whether Point is free of torsion elements (is in prime subgroup).\n * Always torsion-free for cofactor=1 curves.\n */\n isTorsionFree() {\n const { isTorsionFree } = extraOpts;\n if (cofactor === _1n)\n return true;\n if (isTorsionFree)\n return isTorsionFree(Point, this);\n return wnaf.unsafe(this, CURVE_ORDER).is0();\n }\n clearCofactor() {\n const { clearCofactor } = extraOpts;\n if (cofactor === _1n)\n return this; // Fast-path\n if (clearCofactor)\n return clearCofactor(Point, this);\n return this.multiplyUnsafe(cofactor);\n }\n isSmallOrder() {\n // can we use this.clearCofactor()?\n return this.multiplyUnsafe(cofactor).is0();\n }\n toBytes(isCompressed = true) {\n abool(isCompressed, 'isCompressed');\n this.assertValidity();\n return encodePoint(Point, this, isCompressed);\n }\n toHex(isCompressed = true) {\n return bytesToHex(this.toBytes(isCompressed));\n }\n toString() {\n return `<Point ${this.is0() ? 'ZERO' : this.toHex()}>`;\n }\n }\n const bits = Fn.BITS;\n const wnaf = new wNAF(Point, extraOpts.endo ? Math.ceil(bits / 2) : bits);\n Point.BASE.precompute(8); // Enable precomputes. Slows down first publicKey computation by 20ms.\n return Point;\n}\n// Points start with byte 0x02 when y is even; otherwise 0x03\nfunction pprefix(hasEvenY) {\n return Uint8Array.of(hasEvenY ? 0x02 : 0x03);\n}\n/**\n * Implementation of the Shallue and van de Woestijne method for any weierstrass curve.\n * TODO: check if there is a way to merge this with uvRatio in Edwards; move to modular.\n * b = True and y = sqrt(u / v) if (u / v) is square in F, and\n * b = False and y = sqrt(Z * (u / v)) otherwise.\n * @param Fp\n * @param Z\n * @returns\n */\nexport function SWUFpSqrtRatio(Fp, Z) {\n // Generic implementation\n const q = Fp.ORDER;\n let l = _0n;\n for (let o = q - _1n; o % _2n === _0n; o /= _2n)\n l += _1n;\n const c1 = l; // 1. c1, the largest integer such that 2^c1 divides q - 1.\n // We need 2n ** c1 and 2n ** (c1-1). We can't use **; but we can use <<.\n // 2n ** c1 == 2n << (c1-1)\n const _2n_pow_c1_1 = _2n << (c1 - _1n - _1n);\n const _2n_pow_c1 = _2n_pow_c1_1 * _2n;\n const c2 = (q - _1n) / _2n_pow_c1; // 2. c2 = (q - 1) / (2^c1) # Integer arithmetic\n const c3 = (c2 - _1n) / _2n; // 3. c3 = (c2 - 1) / 2 # Integer arithmetic\n const c4 = _2n_pow_c1 - _1n; // 4. c4 = 2^c1 - 1 # Integer arithmetic\n const c5 = _2n_pow_c1_1; // 5. c5 = 2^(c1 - 1) # Integer arithmetic\n const c6 = Fp.pow(Z, c2); // 6. c6 = Z^c2\n const c7 = Fp.pow(Z, (c2 + _1n) / _2n); // 7. c7 = Z^((c2 + 1) / 2)\n let sqrtRatio = (u, v) => {\n let tv1 = c6; // 1. tv1 = c6\n let tv2 = Fp.pow(v, c4); // 2. tv2 = v^c4\n let tv3 = Fp.sqr(tv2); // 3. tv3 = tv2^2\n tv3 = Fp.mul(tv3, v); // 4. tv3 = tv3 * v\n let tv5 = Fp.mul(u, tv3); // 5. tv5 = u * tv3\n tv5 = Fp.pow(tv5, c3); // 6. tv5 = tv5^c3\n tv5 = Fp.mul(tv5, tv2); // 7. tv5 = tv5 * tv2\n tv2 = Fp.mul(tv5, v); // 8. tv2 = tv5 * v\n tv3 = Fp.mul(tv5, u); // 9. tv3 = tv5 * u\n let tv4 = Fp.mul(tv3, tv2); // 10. tv4 = tv3 * tv2\n tv5 = Fp.pow(tv4, c5); // 11. tv5 = tv4^c5\n let isQR = Fp.eql(tv5, Fp.ONE); // 12. isQR = tv5 == 1\n tv2 = Fp.mul(tv3, c7); // 13. tv2 = tv3 * c7\n tv5 = Fp.mul(tv4, tv1); // 14. tv5 = tv4 * tv1\n tv3 = Fp.cmov(tv2, tv3, isQR); // 15. tv3 = CMOV(tv2, tv3, isQR)\n tv4 = Fp.cmov(tv5, tv4, isQR); // 16. tv4 = CMOV(tv5, tv4, isQR)\n // 17. for i in (c1, c1 - 1, ..., 2):\n for (let i = c1; i > _1n; i--) {\n let tv5 = i - _2n; // 18. tv5 = i - 2\n tv5 = _2n << (tv5 - _1n); // 19. tv5 = 2^tv5\n let tvv5 = Fp.pow(tv4, tv5); // 20. tv5 = tv4^tv5\n const e1 = Fp.eql(tvv5, Fp.ONE); // 21. e1 = tv5 == 1\n tv2 = Fp.mul(tv3, tv1); // 22. tv2 = tv3 * tv1\n tv1 = Fp.mul(tv1, tv1); // 23. tv1 = tv1 * tv1\n tvv5 = Fp.mul(tv4, tv1); // 24. tv5 = tv4 * tv1\n tv3 = Fp.cmov(tv2, tv3, e1); // 25. tv3 = CMOV(tv2, tv3, e1)\n tv4 = Fp.cmov(tvv5, tv4, e1); // 26. tv4 = CMOV(tv5, tv4, e1)\n }\n return { isValid: isQR, value: tv3 };\n };\n if (Fp.ORDER % _4n === _3n) {\n // sqrt_ratio_3mod4(u, v)\n const c1 = (Fp.ORDER - _3n) / _4n; // 1. c1 = (q - 3) / 4 # Integer arithmetic\n const c2 = Fp.sqrt(Fp.neg(Z)); // 2. c2 = sqrt(-Z)\n sqrtRatio = (u, v) => {\n let tv1 = Fp.sqr(v); // 1. tv1 = v^2\n const tv2 = Fp.mul(u, v); // 2. tv2 = u * v\n tv1 = Fp.mul(tv1, tv2); // 3. tv1 = tv1 * tv2\n let y1 = Fp.pow(tv1, c1); // 4. y1 = tv1^c1\n y1 = Fp.mul(y1, tv2); // 5. y1 = y1 * tv2\n const y2 = Fp.mul(y1, c2); // 6. y2 = y1 * c2\n const tv3 = Fp.mul(Fp.sqr(y1), v); // 7. tv3 = y1^2; 8. tv3 = tv3 * v\n const isQR = Fp.eql(tv3, u); // 9. isQR = tv3 == u\n let y = Fp.cmov(y2, y1, isQR); // 10. y = CMOV(y2, y1, isQR)\n return { isValid: isQR, value: y }; // 11. return (isQR, y) isQR ? y : y*c2\n };\n }\n // No curves uses that\n // if (Fp.ORDER % _8n === _5n) // sqrt_ratio_5mod8\n return sqrtRatio;\n}\n/**\n * Simplified Shallue-van de Woestijne-Ulas Method\n * https://www.rfc-editor.org/rfc/rfc9380#section-6.6.2\n */\nexport function mapToCurveSimpleSWU(Fp, opts) {\n validateField(Fp);\n const { A, B, Z } = opts;\n if (!Fp.isValid(A) || !Fp.isValid(B) || !Fp.isValid(Z))\n throw new Error('mapToCurveSimpleSWU: invalid opts');\n const sqrtRatio = SWUFpSqrtRatio(Fp, Z);\n if (!Fp.isOdd)\n throw new Error('Field does not have .isOdd()');\n // Input: u, an element of F.\n // Output: (x, y), a point on E.\n return (u) => {\n // prettier-ignore\n let tv1, tv2, tv3, tv4, tv5, tv6, x, y;\n tv1 = Fp.sqr(u); // 1. tv1 = u^2\n tv1 = Fp.mul(tv1, Z); // 2. tv1 = Z * tv1\n tv2 = Fp.sqr(tv1); // 3. tv2 = tv1^2\n tv2 = Fp.add(tv2, tv1); // 4. tv2 = tv2 + tv1\n tv3 = Fp.add(tv2, Fp.ONE); // 5. tv3 = tv2 + 1\n tv3 = Fp.mul(tv3, B); // 6. tv3 = B * tv3\n tv4 = Fp.cmov(Z, Fp.neg(tv2), !Fp.eql(tv2, Fp.ZERO)); // 7. tv4 = CMOV(Z, -tv2, tv2 != 0)\n tv4 = Fp.mul(tv4, A); // 8. tv4 = A * tv4\n tv2 = Fp.sqr(tv3); // 9. tv2 = tv3^2\n tv6 = Fp.sqr(tv4); // 10. tv6 = tv4^2\n tv5 = Fp.mul(tv6, A); // 11. tv5 = A * tv6\n tv2 = Fp.add(tv2, tv5); // 12. tv2 = tv2 + tv5\n tv2 = Fp.mul(tv2, tv3); // 13. tv2 = tv2 * tv3\n tv6 = Fp.mul(tv6, tv4); // 14. tv6 = tv6 * tv4\n tv5 = Fp.mul(tv6, B); // 15. tv5 = B * tv6\n tv2 = Fp.add(tv2, tv5); // 16. tv2 = tv2 + tv5\n x = Fp.mul(tv1, tv3); // 17. x = tv1 * tv3\n const { isValid, value } = sqrtRatio(tv2, tv6); // 18. (is_gx1_square, y1) = sqrt_ratio(tv2, tv6)\n y = Fp.mul(tv1, u); // 19. y = tv1 * u -> Z * u^3 * y1\n y = Fp.mul(y, value); // 20. y = y * y1\n x = Fp.cmov(x, tv3, isValid); // 21. x = CMOV(x, tv3, is_gx1_square)\n y = Fp.cmov(y, value, isValid); // 22. y = CMOV(y, y1, is_gx1_square)\n const e1 = Fp.isOdd(u) === Fp.isOdd(y); // 23. e1 = sgn0(u) == sgn0(y)\n y = Fp.cmov(Fp.neg(y), y, e1); // 24. y = CMOV(-y, y, e1)\n const tv4_inv = FpInvertBatch(Fp, [tv4], true)[0];\n x = Fp.mul(x, tv4_inv); // 25. x = x / tv4\n return { x, y };\n };\n}\nfunction getWLengths(Fp, Fn) {\n return {\n secretKey: Fn.BYTES,\n publicKey: 1 + Fp.BYTES,\n publicKeyUncompressed: 1 + 2 * Fp.BYTES,\n publicKeyHasPrefix: true,\n signature: 2 * Fn.BYTES,\n };\n}\n/**\n * Sometimes users only need getPublicKey, getSharedSecret, and secret key handling.\n * This helper ensures no signature functionality is present. Less code, smaller bundle size.\n */\nexport function ecdh(Point, ecdhOpts = {}) {\n const { Fn } = Point;\n const randomBytes_ = ecdhOpts.randomBytes || wcRandomBytes;\n const lengths = Object.assign(getWLengths(Point.Fp, Fn), { seed: getMinHashLength(Fn.ORDER) });\n function isValidSecretKey(secretKey) {\n try {\n const num = Fn.fromBytes(secretKey);\n return Fn.isValidNot0(num);\n }\n catch (error) {\n return false;\n }\n }\n function isValidPublicKey(publicKey, isCompressed) {\n const { publicKey: comp, publicKeyUncompressed } = lengths;\n try {\n const l = publicKey.length;\n if (isCompressed === true && l !== comp)\n return false;\n if (isCompressed === false && l !== publicKeyUncompressed)\n return false;\n return !!Point.fromBytes(publicKey);\n }\n catch (error) {\n return false;\n }\n }\n /**\n * Produces cryptographically secure secret key from random of size\n * (groupLen + ceil(groupLen / 2)) with modulo bias being negligible.\n */\n function randomSecretKey(seed = randomBytes_(lengths.seed)) {\n return mapHashToField(abytes(seed, lengths.seed, 'seed'), Fn.ORDER);\n }\n /**\n * Computes public key for a secret key. Checks for validity of the secret key.\n * @param isCompressed whether to return compact (default), or full key\n * @returns Public key, full when isCompressed=false; short when isCompressed=true\n */\n function getPublicKey(secretKey, isCompressed = true) {\n return Point.BASE.multiply(Fn.fromBytes(secretKey)).toBytes(isCompressed);\n }\n /**\n * Quick and dirty check for item being public key. Does not validate hex, or being on-curve.\n */\n function isProbPub(item) {\n const { secretKey, publicKey, publicKeyUncompressed } = lengths;\n if (!isBytes(item))\n return undefined;\n if (('_lengths' in Fn && Fn._lengths) || secretKey === publicKey)\n return undefined;\n const l = abytes(item, undefined, 'key').length;\n return l === publicKey || l === publicKeyUncompressed;\n }\n /**\n * ECDH (Elliptic Curve Diffie Hellman).\n * Computes shared public key from secret key A and public key B.\n * Checks: 1) secret key validity 2) shared key is on-curve.\n * Does NOT hash the result.\n * @param isCompressed whether to return compact (default), or full key\n * @returns shared public key\n */\n function getSharedSecret(secretKeyA, publicKeyB, isCompressed = true) {\n if (isProbPub(secretKeyA) === true)\n throw new Error('first arg must be private key');\n if (isProbPub(publicKeyB) === false)\n throw new Error('second arg must be public key');\n const s = Fn.fromBytes(secretKeyA);\n const b = Point.fromBytes(publicKeyB); // checks for being on-curve\n return b.multiply(s).toBytes(isCompressed);\n }\n const utils = {\n isValidSecretKey,\n isValidPublicKey,\n randomSecretKey,\n };\n const keygen = createKeygen(randomSecretKey, getPublicKey);\n return Object.freeze({ getPublicKey, getSharedSecret, keygen, Point, utils, lengths });\n}\n/**\n * Creates ECDSA signing interface for given elliptic curve `Point` and `hash` function.\n *\n * @param Point created using {@link weierstrass} function\n * @param hash used for 1) message prehash-ing 2) k generation in `sign`, using hmac_drbg(hash)\n * @param ecdsaOpts rarely needed, see {@link ECDSAOpts}\n *\n * @example\n * ```js\n * const p256_Point = weierstrass(...);\n * const p256_sha256 = ecdsa(p256_Point, sha256);\n * const p256_sha224 = ecdsa(p256_Point, sha224);\n * const p256_sha224_r = ecdsa(p256_Point, sha224, { randomBytes: (length) => { ... } });\n * ```\n */\nexport function ecdsa(Point, hash, ecdsaOpts = {}) {\n ahash(hash);\n validateObject(ecdsaOpts, {}, {\n hmac: 'function',\n lowS: 'boolean',\n randomBytes: 'function',\n bits2int: 'function',\n bits2int_modN: 'function',\n });\n ecdsaOpts = Object.assign({}, ecdsaOpts);\n const randomBytes = ecdsaOpts.randomBytes || wcRandomBytes;\n const hmac = ecdsaOpts.hmac || ((key, msg) => nobleHmac(hash, key, msg));\n const { Fp, Fn } = Point;\n const { ORDER: CURVE_ORDER, BITS: fnBits } = Fn;\n const { keygen, getPublicKey, getSharedSecret, utils, lengths } = ecdh(Point, ecdsaOpts);\n const defaultSigOpts = {\n prehash: true,\n lowS: typeof ecdsaOpts.lowS === 'boolean' ? ecdsaOpts.lowS : true,\n format: 'compact',\n extraEntropy: false,\n };\n const hasLargeCofactor = CURVE_ORDER * _2n < Fp.ORDER; // Won't CURVE().h > 2n be more effective?\n function isBiggerThanHalfOrder(number) {\n const HALF = CURVE_ORDER >> _1n;\n return number > HALF;\n }\n function validateRS(title, num) {\n if (!Fn.isValidNot0(num))\n throw new Error(`invalid signature ${title}: out of range 1..Point.Fn.ORDER`);\n return num;\n }\n function assertSmallCofactor() {\n // ECDSA recovery is hard for cofactor > 1 curves.\n // In sign, `r = q.x mod n`, and here we recover q.x from r.\n // While recovering q.x >= n, we need to add r+n for cofactor=1 curves.\n // However, for cofactor>1, r+n may not get q.x:\n // r+n*i would need to be done instead where i is unknown.\n // To easily get i, we either need to:\n // a. increase amount of valid recid values (4, 5...); OR\n // b. prohibit non-prime-order signatures (recid > 1).\n if (hasLargeCofactor)\n throw new Error('\"recovered\" sig type is not supported for cofactor >2 curves');\n }\n function validateSigLength(bytes, format) {\n validateSigFormat(format);\n const size = lengths.signature;\n const sizer = format === 'compact' ? size : format === 'recovered' ? size + 1 : undefined;\n return abytes(bytes, sizer);\n }\n /**\n * ECDSA signature with its (r, s) properties. Supports compact, recovered & DER representations.\n */\n class Signature {\n r;\n s;\n recovery;\n constructor(r, s, recovery) {\n this.r = validateRS('r', r); // r in [1..N-1];\n this.s = validateRS('s', s); // s in [1..N-1];\n if (recovery != null) {\n assertSmallCofactor();\n if (![0, 1, 2, 3].includes(recovery))\n throw new Error('invalid recovery id');\n this.recovery = recovery;\n }\n Object.freeze(this);\n }\n static fromBytes(bytes, format = defaultSigOpts.format) {\n validateSigLength(bytes, format);\n let recid;\n if (format === 'der') {\n const { r, s } = DER.toSig(abytes(bytes));\n return new Signature(r, s);\n }\n if (format === 'recovered') {\n recid = bytes[0];\n format = 'compact';\n bytes = bytes.subarray(1);\n }\n const L = lengths.signature / 2;\n const r = bytes.subarray(0, L);\n const s = bytes.subarray(L, L * 2);\n return new Signature(Fn.fromBytes(r), Fn.fromBytes(s), recid);\n }\n static fromHex(hex, format) {\n return this.fromBytes(hexToBytes(hex), format);\n }\n assertRecovery() {\n const { recovery } = this;\n if (recovery == null)\n throw new Error('invalid recovery id: must be present');\n return recovery;\n }\n addRecoveryBit(recovery) {\n return new Signature(this.r, this.s, recovery);\n }\n recoverPublicKey(messageHash) {\n const { r, s } = this;\n const recovery = this.assertRecovery();\n const radj = recovery === 2 || recovery === 3 ? r + CURVE_ORDER : r;\n if (!Fp.isValid(radj))\n throw new Error('invalid recovery id: sig.r+curve.n != R.x');\n const x = Fp.toBytes(radj);\n const R = Point.fromBytes(concatBytes(pprefix((recovery & 1) === 0), x));\n const ir = Fn.inv(radj); // r^-1\n const h = bits2int_modN(abytes(messageHash, undefined, 'msgHash')); // Truncate hash\n const u1 = Fn.create(-h * ir); // -hr^-1\n const u2 = Fn.create(s * ir); // sr^-1\n // (sr^-1)R-(hr^-1)G = -(hr^-1)G + (sr^-1). unsafe is fine: there is no private data.\n const Q = Point.BASE.multiplyUnsafe(u1).add(R.multiplyUnsafe(u2));\n if (Q.is0())\n throw new Error('invalid recovery: point at infinify');\n Q.assertValidity();\n return Q;\n }\n // Signatures should be low-s, to prevent malleability.\n hasHighS() {\n return isBiggerThanHalfOrder(this.s);\n }\n toBytes(format = defaultSigOpts.format) {\n validateSigFormat(format);\n if (format === 'der')\n return hexToBytes(DER.hexFromSig(this));\n const { r, s } = this;\n const rb = Fn.toBytes(r);\n const sb = Fn.toBytes(s);\n if (format === 'recovered') {\n assertSmallCofactor();\n return concatBytes(Uint8Array.of(this.assertRecovery()), rb, sb);\n }\n return concatBytes(rb, sb);\n }\n toHex(format) {\n return bytesToHex(this.toBytes(format));\n }\n }\n // RFC6979: ensure ECDSA msg is X bytes and < N. RFC suggests optional truncating via bits2octets.\n // FIPS 186-4 4.6 suggests the leftmost min(nBitLen, outLen) bits, which matches bits2int.\n // bits2int can produce res>N, we can do mod(res, N) since the bitLen is the same.\n // int2octets can't be used; pads small msgs with 0: unacceptatble for trunc as per RFC vectors\n const bits2int = ecdsaOpts.bits2int ||\n function bits2int_def(bytes) {\n // Our custom check \"just in case\", for protection against DoS\n if (bytes.length > 8192)\n throw new Error('input is too large');\n // For curves with nBitLength % 8 !== 0: bits2octets(bits2octets(m)) !== bits2octets(m)\n // for some cases, since bytes.length * 8 is not actual bitLength.\n const num = bytesToNumberBE(bytes); // check for == u8 done here\n const delta = bytes.length * 8 - fnBits; // truncate to nBitLength leftmost bits\n return delta > 0 ? num >> BigInt(delta) : num;\n };\n const bits2int_modN = ecdsaOpts.bits2int_modN ||\n function bits2int_modN_def(bytes) {\n return Fn.create(bits2int(bytes)); // can't use bytesToNumberBE here\n };\n // Pads output with zero as per spec\n const ORDER_MASK = bitMask(fnBits);\n /** Converts to bytes. Checks if num in `[0..ORDER_MASK-1]` e.g.: `[0..2^256-1]`. */\n function int2octets(num) {\n // IMPORTANT: the check ensures working for case `Fn.BYTES != Fn.BITS * 8`\n aInRange('num < 2^' + fnBits, num, _0n, ORDER_MASK);\n return Fn.toBytes(num);\n }\n function validateMsgAndHash(message, prehash) {\n abytes(message, undefined, 'message');\n return prehash ? abytes(hash(message), undefined, 'prehashed message') : message;\n }\n /**\n * Steps A, D of RFC6979 3.2.\n * Creates RFC6979 seed; converts msg/privKey to numbers.\n * Used only in sign, not in verify.\n *\n * Warning: we cannot assume here that message has same amount of bytes as curve order,\n * this will be invalid at least for P521. Also it can be bigger for P224 + SHA256.\n */\n function prepSig(message, secretKey, opts) {\n const { lowS, prehash, extraEntropy } = validateSigOpts(opts, defaultSigOpts);\n message = validateMsgAndHash(message, prehash); // RFC6979 3.2 A: h1 = H(m)\n // We can't later call bits2octets, since nested bits2int is broken for curves\n // with fnBits % 8 !== 0. Because of that, we unwrap it here as int2octets call.\n // const bits2octets = (bits) => int2octets(bits2int_modN(bits))\n const h1int = bits2int_modN(message);\n const d = Fn.fromBytes(secretKey); // validate secret key, convert to bigint\n if (!Fn.isValidNot0(d))\n throw new Error('invalid private key');\n const seedArgs = [int2octets(d), int2octets(h1int)];\n // extraEntropy. RFC6979 3.6: additional k' (optional).\n if (extraEntropy != null && extraEntropy !== false) {\n // K = HMAC_K(V || 0x00 || int2octets(x) || bits2octets(h1) || k')\n // gen random bytes OR pass as-is\n const e = extraEntropy === true ? randomBytes(lengths.secretKey) : extraEntropy;\n seedArgs.push(abytes(e, undefined, 'extraEntropy')); // check for being bytes\n }\n const seed = concatBytes(...seedArgs); // Step D of RFC6979 3.2\n const m = h1int; // no need to call bits2int second time here, it is inside truncateHash!\n // Converts signature params into point w r/s, checks result for validity.\n // To transform k => Signature:\n // q = k⋅G\n // r = q.x mod n\n // s = k^-1(m + rd) mod n\n // Can use scalar blinding b^-1(bm + bdr) where b ∈ [1,q−1] according to\n // https://tches.iacr.org/index.php/TCHES/article/view/7337/6509. We've decided against it:\n // a) dependency on CSPRNG b) 15% slowdown c) doesn't really help since bigints are not CT\n function k2sig(kBytes) {\n // RFC 6979 Section 3.2, step 3: k = bits2int(T)\n // Important: all mod() calls here must be done over N\n const k = bits2int(kBytes); // Cannot use fields methods, since it is group element\n if (!Fn.isValidNot0(k))\n return; // Valid scalars (including k) must be in 1..N-1\n const ik = Fn.inv(k); // k^-1 mod n\n const q = Point.BASE.multiply(k).toAffine(); // q = k⋅G\n const r = Fn.create(q.x); // r = q.x mod n\n if (r === _0n)\n return;\n const s = Fn.create(ik * Fn.create(m + r * d)); // s = k^-1(m + rd) mod n\n if (s === _0n)\n return;\n let recovery = (q.x === r ? 0 : 2) | Number(q.y & _1n); // recovery bit (2 or 3 when q.x>n)\n let normS = s;\n if (lowS && isBiggerThanHalfOrder(s)) {\n normS = Fn.neg(s); // if lowS was passed, ensure s is always in the bottom half of N\n recovery ^= 1;\n }\n return new Signature(r, normS, hasLargeCofactor ? undefined : recovery);\n }\n return { seed, k2sig };\n }\n /**\n * Signs message hash with a secret key.\n *\n * ```\n * sign(m, d) where\n * k = rfc6979_hmac_drbg(m, d)\n * (x, y) = G × k\n * r = x mod n\n * s = (m + dr) / k mod n\n * ```\n */\n function sign(message, secretKey, opts = {}) {\n const { seed, k2sig } = prepSig(message, secretKey, opts); // Steps A, D of RFC6979 3.2.\n const drbg = createHmacDrbg(hash.outputLen, Fn.BYTES, hmac);\n const sig = drbg(seed, k2sig); // Steps B, C, D, E, F, G\n return sig.toBytes(opts.format);\n }\n /**\n * Verifies a signature against message and public key.\n * Rejects lowS signatures by default: see {@link ECDSAVerifyOpts}.\n * Implements section 4.1.4 from https://www.secg.org/sec1-v2.pdf:\n *\n * ```\n * verify(r, s, h, P) where\n * u1 = hs^-1 mod n\n * u2 = rs^-1 mod n\n * R = u1⋅G + u2⋅P\n * mod(R.x, n) == r\n * ```\n */\n function verify(signature, message, publicKey, opts = {}) {\n const { lowS, prehash, format } = validateSigOpts(opts, defaultSigOpts);\n publicKey = abytes(publicKey, undefined, 'publicKey');\n message = validateMsgAndHash(message, prehash);\n if (!isBytes(signature)) {\n const end = signature instanceof Signature ? ', use sig.toBytes()' : '';\n throw new Error('verify expects Uint8Array signature' + end);\n }\n validateSigLength(signature, format); // execute this twice because we want loud error\n try {\n const sig = Signature.fromBytes(signature, format);\n const P = Point.fromBytes(publicKey);\n if (lowS && sig.hasHighS())\n return false;\n const { r, s } = sig;\n const h = bits2int_modN(message); // mod n, not mod p\n const is = Fn.inv(s); // s^-1 mod n\n const u1 = Fn.create(h * is); // u1 = hs^-1 mod n\n const u2 = Fn.create(r * is); // u2 = rs^-1 mod n\n const R = Point.BASE.multiplyUnsafe(u1).add(P.multiplyUnsafe(u2)); // u1⋅G + u2⋅P\n if (R.is0())\n return false;\n const v = Fn.create(R.x); // v = r.x mod n\n return v === r;\n }\n catch (e) {\n return false;\n }\n }\n function recoverPublicKey(signature, message, opts = {}) {\n const { prehash } = validateSigOpts(opts, defaultSigOpts);\n message = validateMsgAndHash(message, prehash);\n return Signature.fromBytes(signature, 'recovered').recoverPublicKey(message).toBytes();\n }\n return Object.freeze({\n keygen,\n getPublicKey,\n getSharedSecret,\n utils,\n lengths,\n Point,\n sign,\n verify,\n recoverPublicKey,\n Signature,\n hash,\n });\n}\n//# sourceMappingURL=weierstrass.js.map","/**\n * SECG secp256k1. See [pdf](https://www.secg.org/sec2-v2.pdf).\n *\n * Belongs to Koblitz curves: it has efficiently-computable GLV endomorphism ψ,\n * check out {@link EndomorphismOpts}. Seems to be rigid (not backdoored).\n * @module\n */\n/*! noble-curves - MIT License (c) 2022 Paul Miller (paulmillr.com) */\nimport { sha256 } from '@noble/hashes/sha2.js';\nimport { randomBytes } from '@noble/hashes/utils.js';\nimport { createKeygen } from \"./abstract/curve.js\";\nimport { createHasher, isogenyMap } from \"./abstract/hash-to-curve.js\";\nimport { Field, mapHashToField, pow2 } from \"./abstract/modular.js\";\nimport { ecdsa, mapToCurveSimpleSWU, weierstrass, } from \"./abstract/weierstrass.js\";\nimport { abytes, asciiToBytes, bytesToNumberBE, concatBytes } from \"./utils.js\";\n// Seems like generator was produced from some seed:\n// `Pointk1.BASE.multiply(Pointk1.Fn.inv(2n, N)).toAffine().x`\n// // gives short x 0x3b78ce563f89a0ed9414f5aa28ad0d96d6795f9c63n\nconst secp256k1_CURVE = {\n p: BigInt('0xfffffffffffffffffffffffffffffffffffffffffffffffffffffffefffffc2f'),\n n: BigInt('0xfffffffffffffffffffffffffffffffebaaedce6af48a03bbfd25e8cd0364141'),\n h: BigInt(1),\n a: BigInt(0),\n b: BigInt(7),\n Gx: BigInt('0x79be667ef9dcbbac55a06295ce870b07029bfcdb2dce28d959f2815b16f81798'),\n Gy: BigInt('0x483ada7726a3c4655da4fbfc0e1108a8fd17b448a68554199c47d08ffb10d4b8'),\n};\nconst secp256k1_ENDO = {\n beta: BigInt('0x7ae96a2b657c07106e64479eac3434e99cf0497512f58995c1396c28719501ee'),\n basises: [\n [BigInt('0x3086d221a7d46bcde86c90e49284eb15'), -BigInt('0xe4437ed6010e88286f547fa90abfe4c3')],\n [BigInt('0x114ca50f7a8e2f3f657c1108d9d44cfd8'), BigInt('0x3086d221a7d46bcde86c90e49284eb15')],\n ],\n};\nconst _0n = /* @__PURE__ */ BigInt(0);\nconst _2n = /* @__PURE__ */ BigInt(2);\n/**\n * √n = n^((p+1)/4) for fields p = 3 mod 4. We unwrap the loop and multiply bit-by-bit.\n * (P+1n/4n).toString(2) would produce bits [223x 1, 0, 22x 1, 4x 0, 11, 00]\n */\nfunction sqrtMod(y) {\n const P = secp256k1_CURVE.p;\n // prettier-ignore\n const _3n = BigInt(3), _6n = BigInt(6), _11n = BigInt(11), _22n = BigInt(22);\n // prettier-ignore\n const _23n = BigInt(23), _44n = BigInt(44), _88n = BigInt(88);\n const b2 = (y * y * y) % P; // x^3, 11\n const b3 = (b2 * b2 * y) % P; // x^7\n const b6 = (pow2(b3, _3n, P) * b3) % P;\n const b9 = (pow2(b6, _3n, P) * b3) % P;\n const b11 = (pow2(b9, _2n, P) * b2) % P;\n const b22 = (pow2(b11, _11n, P) * b11) % P;\n const b44 = (pow2(b22, _22n, P) * b22) % P;\n const b88 = (pow2(b44, _44n, P) * b44) % P;\n const b176 = (pow2(b88, _88n, P) * b88) % P;\n const b220 = (pow2(b176, _44n, P) * b44) % P;\n const b223 = (pow2(b220, _3n, P) * b3) % P;\n const t1 = (pow2(b223, _23n, P) * b22) % P;\n const t2 = (pow2(t1, _6n, P) * b2) % P;\n const root = pow2(t2, _2n, P);\n if (!Fpk1.eql(Fpk1.sqr(root), y))\n throw new Error('Cannot find square root');\n return root;\n}\nconst Fpk1 = Field(secp256k1_CURVE.p, { sqrt: sqrtMod });\nconst Pointk1 = /* @__PURE__ */ weierstrass(secp256k1_CURVE, {\n Fp: Fpk1,\n endo: secp256k1_ENDO,\n});\n/**\n * secp256k1 curve: ECDSA and ECDH methods.\n *\n * Uses sha256 to hash messages. To use a different hash,\n * pass `{ prehash: false }` to sign / verify.\n *\n * @example\n * ```js\n * import { secp256k1 } from '@noble/curves/secp256k1.js';\n * const { secretKey, publicKey } = secp256k1.keygen();\n * // const publicKey = secp256k1.getPublicKey(secretKey);\n * const msg = new TextEncoder().encode('hello noble');\n * const sig = secp256k1.sign(msg, secretKey);\n * const isValid = secp256k1.verify(sig, msg, publicKey);\n * // const sigKeccak = secp256k1.sign(keccak256(msg), secretKey, { prehash: false });\n * ```\n */\nexport const secp256k1 = /* @__PURE__ */ ecdsa(Pointk1, sha256);\n// Schnorr signatures are superior to ECDSA from above. Below is Schnorr-specific BIP0340 code.\n// https://github.com/bitcoin/bips/blob/master/bip-0340.mediawiki\n/** An object mapping tags to their tagged hash prefix of [SHA256(tag) | SHA256(tag)] */\nconst TAGGED_HASH_PREFIXES = {};\nfunction taggedHash(tag, ...messages) {\n let tagP = TAGGED_HASH_PREFIXES[tag];\n if (tagP === undefined) {\n const tagH = sha256(asciiToBytes(tag));\n tagP = concatBytes(tagH, tagH);\n TAGGED_HASH_PREFIXES[tag] = tagP;\n }\n return sha256(concatBytes(tagP, ...messages));\n}\n// ECDSA compact points are 33-byte. Schnorr is 32: we strip first byte 0x02 or 0x03\nconst pointToBytes = (point) => point.toBytes(true).slice(1);\nconst hasEven = (y) => y % _2n === _0n;\n// Calculate point, scalar and bytes\nfunction schnorrGetExtPubKey(priv) {\n const { Fn, BASE } = Pointk1;\n const d_ = Fn.fromBytes(priv);\n const p = BASE.multiply(d_); // P = d'⋅G; 0 < d' < n check is done inside\n const scalar = hasEven(p.y) ? d_ : Fn.neg(d_);\n return { scalar, bytes: pointToBytes(p) };\n}\n/**\n * lift_x from BIP340. Convert 32-byte x coordinate to elliptic curve point.\n * @returns valid point checked for being on-curve\n */\nfunction lift_x(x) {\n const Fp = Fpk1;\n if (!Fp.isValidNot0(x))\n throw new Error('invalid x: Fail if x ≥ p');\n const xx = Fp.create(x * x);\n const c = Fp.create(xx * x + BigInt(7)); // Let c = x³ + 7 mod p.\n let y = Fp.sqrt(c); // Let y = c^(p+1)/4 mod p. Same as sqrt().\n // Return the unique point P such that x(P) = x and\n // y(P) = y if y mod 2 = 0 or y(P) = p-y otherwise.\n if (!hasEven(y))\n y = Fp.neg(y);\n const p = Pointk1.fromAffine({ x, y });\n p.assertValidity();\n return p;\n}\nconst num = bytesToNumberBE;\n/**\n * Create tagged hash, convert it to bigint, reduce modulo-n.\n */\nfunction challenge(...args) {\n return Pointk1.Fn.create(num(taggedHash('BIP0340/challenge', ...args)));\n}\n/**\n * Schnorr public key is just `x` coordinate of Point as per BIP340.\n */\nfunction schnorrGetPublicKey(secretKey) {\n return schnorrGetExtPubKey(secretKey).bytes; // d'=int(sk). Fail if d'=0 or d'≥n. Ret bytes(d'⋅G)\n}\n/**\n * Creates Schnorr signature as per BIP340. Verifies itself before returning anything.\n * auxRand is optional and is not the sole source of k generation: bad CSPRNG won't be dangerous.\n */\nfunction schnorrSign(message, secretKey, auxRand = randomBytes(32)) {\n const { Fn } = Pointk1;\n const m = abytes(message, undefined, 'message');\n const { bytes: px, scalar: d } = schnorrGetExtPubKey(secretKey); // checks for isWithinCurveOrder\n const a = abytes(auxRand, 32, 'auxRand'); // Auxiliary random data a: a 32-byte array\n const t = Fn.toBytes(d ^ num(taggedHash('BIP0340/aux', a))); // Let t be the byte-wise xor of bytes(d) and hash/aux(a)\n const rand = taggedHash('BIP0340/nonce', t, px, m); // Let rand = hash/nonce(t || bytes(P) || m)\n // Let k' = int(rand) mod n. Fail if k' = 0. Let R = k'⋅G\n const { bytes: rx, scalar: k } = schnorrGetExtPubKey(rand);\n const e = challenge(rx, px, m); // Let e = int(hash/challenge(bytes(R) || bytes(P) || m)) mod n.\n const sig = new Uint8Array(64); // Let sig = bytes(R) || bytes((k + ed) mod n).\n sig.set(rx, 0);\n sig.set(Fn.toBytes(Fn.create(k + e * d)), 32);\n // If Verify(bytes(P), m, sig) (see below) returns failure, abort\n if (!schnorrVerify(sig, m, px))\n throw new Error('sign: Invalid signature produced');\n return sig;\n}\n/**\n * Verifies Schnorr signature.\n * Will swallow errors & return false except for initial type validation of arguments.\n */\nfunction schnorrVerify(signature, message, publicKey) {\n const { Fp, Fn, BASE } = Pointk1;\n const sig = abytes(signature, 64, 'signature');\n const m = abytes(message, undefined, 'message');\n const pub = abytes(publicKey, 32, 'publicKey');\n try {\n const P = lift_x(num(pub)); // P = lift_x(int(pk)); fail if that fails\n const r = num(sig.subarray(0, 32)); // Let r = int(sig[0:32]); fail if r ≥ p.\n if (!Fp.isValidNot0(r))\n return false;\n const s = num(sig.subarray(32, 64)); // Let s = int(sig[32:64]); fail if s ≥ n.\n if (!Fn.isValidNot0(s))\n return false;\n const e = challenge(Fn.toBytes(r), pointToBytes(P), m); // int(challenge(bytes(r)||bytes(P)||m))%n\n // R = s⋅G - e⋅P, where -eP == (n-e)P\n const R = BASE.multiplyUnsafe(s).add(P.multiplyUnsafe(Fn.neg(e)));\n const { x, y } = R.toAffine();\n // Fail if is_infinite(R) / not has_even_y(R) / x(R) ≠ r.\n if (R.is0() || !hasEven(y) || x !== r)\n return false;\n return true;\n }\n catch (error) {\n return false;\n }\n}\n/**\n * Schnorr signatures over secp256k1.\n * https://github.com/bitcoin/bips/blob/master/bip-0340.mediawiki\n * @example\n * ```js\n * import { schnorr } from '@noble/curves/secp256k1.js';\n * const { secretKey, publicKey } = schnorr.keygen();\n * // const publicKey = schnorr.getPublicKey(secretKey);\n * const msg = new TextEncoder().encode('hello');\n * const sig = schnorr.sign(msg, secretKey);\n * const isValid = schnorr.verify(sig, msg, publicKey);\n * ```\n */\nexport const schnorr = /* @__PURE__ */ (() => {\n const size = 32;\n const seedLength = 48;\n const randomSecretKey = (seed = randomBytes(seedLength)) => {\n return mapHashToField(seed, secp256k1_CURVE.n);\n };\n return {\n keygen: createKeygen(randomSecretKey, schnorrGetPublicKey),\n getPublicKey: schnorrGetPublicKey,\n sign: schnorrSign,\n verify: schnorrVerify,\n Point: Pointk1,\n utils: {\n randomSecretKey,\n taggedHash,\n lift_x,\n pointToBytes,\n },\n lengths: {\n secretKey: size,\n publicKey: size,\n publicKeyHasPrefix: false,\n signature: size * 2,\n seed: seedLength,\n },\n };\n})();\nconst isoMap = /* @__PURE__ */ (() => isogenyMap(Fpk1, [\n // xNum\n [\n '0x8e38e38e38e38e38e38e38e38e38e38e38e38e38e38e38e38e38e38daaaaa8c7',\n '0x7d3d4c80bc321d5b9f315cea7fd44c5d595d2fc0bf63b92dfff1044f17c6581',\n '0x534c328d23f234e6e2a413deca25caece4506144037c40314ecbd0b53d9dd262',\n '0x8e38e38e38e38e38e38e38e38e38e38e38e38e38e38e38e38e38e38daaaaa88c',\n ],\n // xDen\n [\n '0xd35771193d94918a9ca34ccbb7b640dd86cd409542f8487d9fe6b745781eb49b',\n '0xedadc6f64383dc1df7c4b2d51b54225406d36b641f5e41bbc52a56612a8c6d14',\n '0x0000000000000000000000000000000000000000000000000000000000000001', // LAST 1\n ],\n // yNum\n [\n '0x4bda12f684bda12f684bda12f684bda12f684bda12f684bda12f684b8e38e23c',\n '0xc75e0c32d5cb7c0fa9d0a54b12a0a6d5647ab046d686da6fdffc90fc201d71a3',\n '0x29a6194691f91a73715209ef6512e576722830a201be2018a765e85a9ecee931',\n '0x2f684bda12f684bda12f684bda12f684bda12f684bda12f684bda12f38e38d84',\n ],\n // yDen\n [\n '0xfffffffffffffffffffffffffffffffffffffffffffffffffffffffefffff93b',\n '0x7a06534bb8bdb49fd5e9e6632722c2989467c1bfc8e8d978dfb425d2685c2573',\n '0x6484aa716545ca2cf3a70c3fa8fe337e0a3d21162f0d6299a7bf8192bfd2a76f',\n '0x0000000000000000000000000000000000000000000000000000000000000001', // LAST 1\n ],\n].map((i) => i.map((j) => BigInt(j)))))();\nconst mapSWU = /* @__PURE__ */ (() => mapToCurveSimpleSWU(Fpk1, {\n A: BigInt('0x3f8731abdd661adca08a5558f0f5d272e953d363cb6f0e5d405447c01a444533'),\n B: BigInt('1771'),\n Z: Fpk1.create(BigInt('-11')),\n}))();\n/** Hashing / encoding to secp256k1 points / field. RFC 9380 methods. */\nexport const secp256k1_hasher = /* @__PURE__ */ (() => createHasher(Pointk1, (scalars) => {\n const { x, y } = mapSWU(Fpk1.create(scalars[0]));\n return isoMap(x, y);\n}, {\n DST: 'secp256k1_XMD:SHA-256_SSWU_RO_',\n encodeDST: 'secp256k1_XMD:SHA-256_SSWU_NU_',\n p: Fpk1.ORDER,\n m: 1,\n k: 128,\n expand: 'xmd',\n hash: sha256,\n}))();\n//# sourceMappingURL=secp256k1.js.map","/*! scure-base - MIT License (c) 2022 Paul Miller (paulmillr.com) */\nfunction isBytes(a) {\n return a instanceof Uint8Array || (ArrayBuffer.isView(a) && a.constructor.name === 'Uint8Array');\n}\n/** Asserts something is Uint8Array. */\nfunction abytes(b) {\n if (!isBytes(b))\n throw new Error('Uint8Array expected');\n}\nfunction isArrayOf(isString, arr) {\n if (!Array.isArray(arr))\n return false;\n if (arr.length === 0)\n return true;\n if (isString) {\n return arr.every((item) => typeof item === 'string');\n }\n else {\n return arr.every((item) => Number.isSafeInteger(item));\n }\n}\nfunction afn(input) {\n if (typeof input !== 'function')\n throw new Error('function expected');\n return true;\n}\nfunction astr(label, input) {\n if (typeof input !== 'string')\n throw new Error(`${label}: string expected`);\n return true;\n}\nfunction anumber(n) {\n if (!Number.isSafeInteger(n))\n throw new Error(`invalid integer: ${n}`);\n}\nfunction aArr(input) {\n if (!Array.isArray(input))\n throw new Error('array expected');\n}\nfunction astrArr(label, input) {\n if (!isArrayOf(true, input))\n throw new Error(`${label}: array of strings expected`);\n}\nfunction anumArr(label, input) {\n if (!isArrayOf(false, input))\n throw new Error(`${label}: array of numbers expected`);\n}\n/**\n * @__NO_SIDE_EFFECTS__\n */\nfunction chain(...args) {\n const id = (a) => a;\n // Wrap call in closure so JIT can inline calls\n const wrap = (a, b) => (c) => a(b(c));\n // Construct chain of args[-1].encode(args[-2].encode([...]))\n const encode = args.map((x) => x.encode).reduceRight(wrap, id);\n // Construct chain of args[0].decode(args[1].decode(...))\n const decode = args.map((x) => x.decode).reduce(wrap, id);\n return { encode, decode };\n}\n/**\n * Encodes integer radix representation to array of strings using alphabet and back.\n * Could also be array of strings.\n * @__NO_SIDE_EFFECTS__\n */\nfunction alphabet(letters) {\n // mapping 1 to \"b\"\n const lettersA = typeof letters === 'string' ? letters.split('') : letters;\n const len = lettersA.length;\n astrArr('alphabet', lettersA);\n // mapping \"b\" to 1\n const indexes = new Map(lettersA.map((l, i) => [l, i]));\n return {\n encode: (digits) => {\n aArr(digits);\n return digits.map((i) => {\n if (!Number.isSafeInteger(i) || i < 0 || i >= len)\n throw new Error(`alphabet.encode: digit index outside alphabet \"${i}\". Allowed: ${letters}`);\n return lettersA[i];\n });\n },\n decode: (input) => {\n aArr(input);\n return input.map((letter) => {\n astr('alphabet.decode', letter);\n const i = indexes.get(letter);\n if (i === undefined)\n throw new Error(`Unknown letter: \"${letter}\". Allowed: ${letters}`);\n return i;\n });\n },\n };\n}\n/**\n * @__NO_SIDE_EFFECTS__\n */\nfunction join(separator = '') {\n astr('join', separator);\n return {\n encode: (from) => {\n astrArr('join.decode', from);\n return from.join(separator);\n },\n decode: (to) => {\n astr('join.decode', to);\n return to.split(separator);\n },\n };\n}\n/**\n * Pad strings array so it has integer number of bits\n * @__NO_SIDE_EFFECTS__\n */\nfunction padding(bits, chr = '=') {\n anumber(bits);\n astr('padding', chr);\n return {\n encode(data) {\n astrArr('padding.encode', data);\n while ((data.length * bits) % 8)\n data.push(chr);\n return data;\n },\n decode(input) {\n astrArr('padding.decode', input);\n let end = input.length;\n if ((end * bits) % 8)\n throw new Error('padding: invalid, string should have whole number of bytes');\n for (; end > 0 && input[end - 1] === chr; end--) {\n const last = end - 1;\n const byte = last * bits;\n if (byte % 8 === 0)\n throw new Error('padding: invalid, string has too much padding');\n }\n return input.slice(0, end);\n },\n };\n}\n/**\n * @__NO_SIDE_EFFECTS__\n */\nfunction normalize(fn) {\n afn(fn);\n return { encode: (from) => from, decode: (to) => fn(to) };\n}\n/**\n * Slow: O(n^2) time complexity\n */\nfunction convertRadix(data, from, to) {\n // base 1 is impossible\n if (from < 2)\n throw new Error(`convertRadix: invalid from=${from}, base cannot be less than 2`);\n if (to < 2)\n throw new Error(`convertRadix: invalid to=${to}, base cannot be less than 2`);\n aArr(data);\n if (!data.length)\n return [];\n let pos = 0;\n const res = [];\n const digits = Array.from(data, (d) => {\n anumber(d);\n if (d < 0 || d >= from)\n throw new Error(`invalid integer: ${d}`);\n return d;\n });\n const dlen = digits.length;\n while (true) {\n let carry = 0;\n let done = true;\n for (let i = pos; i < dlen; i++) {\n const digit = digits[i];\n const fromCarry = from * carry;\n const digitBase = fromCarry + digit;\n if (!Number.isSafeInteger(digitBase) ||\n fromCarry / from !== carry ||\n digitBase - digit !== fromCarry) {\n throw new Error('convertRadix: carry overflow');\n }\n const div = digitBase / to;\n carry = digitBase % to;\n const rounded = Math.floor(div);\n digits[i] = rounded;\n if (!Number.isSafeInteger(rounded) || rounded * to + carry !== digitBase)\n throw new Error('convertRadix: carry overflow');\n if (!done)\n continue;\n else if (!rounded)\n pos = i;\n else\n done = false;\n }\n res.push(carry);\n if (done)\n break;\n }\n for (let i = 0; i < data.length - 1 && data[i] === 0; i++)\n res.push(0);\n return res.reverse();\n}\nconst gcd = (a, b) => (b === 0 ? a : gcd(b, a % b));\nconst radix2carry = /* @__NO_SIDE_EFFECTS__ */ (from, to) => from + (to - gcd(from, to));\nconst powers = /* @__PURE__ */ (() => {\n let res = [];\n for (let i = 0; i < 40; i++)\n res.push(2 ** i);\n return res;\n})();\n/**\n * Implemented with numbers, because BigInt is 5x slower\n */\nfunction convertRadix2(data, from, to, padding) {\n aArr(data);\n if (from <= 0 || from > 32)\n throw new Error(`convertRadix2: wrong from=${from}`);\n if (to <= 0 || to > 32)\n throw new Error(`convertRadix2: wrong to=${to}`);\n if (radix2carry(from, to) > 32) {\n throw new Error(`convertRadix2: carry overflow from=${from} to=${to} carryBits=${radix2carry(from, to)}`);\n }\n let carry = 0;\n let pos = 0; // bitwise position in current element\n const max = powers[from];\n const mask = powers[to] - 1;\n const res = [];\n for (const n of data) {\n anumber(n);\n if (n >= max)\n throw new Error(`convertRadix2: invalid data word=${n} from=${from}`);\n carry = (carry << from) | n;\n if (pos + from > 32)\n throw new Error(`convertRadix2: carry overflow pos=${pos} from=${from}`);\n pos += from;\n for (; pos >= to; pos -= to)\n res.push(((carry >> (pos - to)) & mask) >>> 0);\n const pow = powers[pos];\n if (pow === undefined)\n throw new Error('invalid carry');\n carry &= pow - 1; // clean carry, otherwise it will cause overflow\n }\n carry = (carry << (to - pos)) & mask;\n if (!padding && pos >= from)\n throw new Error('Excess padding');\n if (!padding && carry > 0)\n throw new Error(`Non-zero padding: ${carry}`);\n if (padding && pos > 0)\n res.push(carry >>> 0);\n return res;\n}\n/**\n * @__NO_SIDE_EFFECTS__\n */\nfunction radix(num) {\n anumber(num);\n const _256 = 2 ** 8;\n return {\n encode: (bytes) => {\n if (!isBytes(bytes))\n throw new Error('radix.encode input should be Uint8Array');\n return convertRadix(Array.from(bytes), _256, num);\n },\n decode: (digits) => {\n anumArr('radix.decode', digits);\n return Uint8Array.from(convertRadix(digits, num, _256));\n },\n };\n}\n/**\n * If both bases are power of same number (like `2**8 <-> 2**64`),\n * there is a linear algorithm. For now we have implementation for power-of-two bases only.\n * @__NO_SIDE_EFFECTS__\n */\nfunction radix2(bits, revPadding = false) {\n anumber(bits);\n if (bits <= 0 || bits > 32)\n throw new Error('radix2: bits should be in (0..32]');\n if (radix2carry(8, bits) > 32 || radix2carry(bits, 8) > 32)\n throw new Error('radix2: carry overflow');\n return {\n encode: (bytes) => {\n if (!isBytes(bytes))\n throw new Error('radix2.encode input should be Uint8Array');\n return convertRadix2(Array.from(bytes), 8, bits, !revPadding);\n },\n decode: (digits) => {\n anumArr('radix2.decode', digits);\n return Uint8Array.from(convertRadix2(digits, bits, 8, revPadding));\n },\n };\n}\nfunction unsafeWrapper(fn) {\n afn(fn);\n return function (...args) {\n try {\n return fn.apply(null, args);\n }\n catch (e) { }\n };\n}\nfunction checksum(len, fn) {\n anumber(len);\n afn(fn);\n return {\n encode(data) {\n if (!isBytes(data))\n throw new Error('checksum.encode: input should be Uint8Array');\n const sum = fn(data).slice(0, len);\n const res = new Uint8Array(data.length + len);\n res.set(data);\n res.set(sum, data.length);\n return res;\n },\n decode(data) {\n if (!isBytes(data))\n throw new Error('checksum.decode: input should be Uint8Array');\n const payload = data.slice(0, -len);\n const oldChecksum = data.slice(-len);\n const newChecksum = fn(payload).slice(0, len);\n for (let i = 0; i < len; i++)\n if (newChecksum[i] !== oldChecksum[i])\n throw new Error('Invalid checksum');\n return payload;\n },\n };\n}\n// prettier-ignore\nexport const utils = {\n alphabet, chain, checksum, convertRadix, convertRadix2, radix, radix2, join, padding,\n};\n// RFC 4648 aka RFC 3548\n// ---------------------\n/**\n * base16 encoding from RFC 4648.\n * @example\n * ```js\n * base16.encode(Uint8Array.from([0x12, 0xab]));\n * // => '12AB'\n * ```\n */\nexport const base16 = chain(radix2(4), alphabet('0123456789ABCDEF'), join(''));\n/**\n * base32 encoding from RFC 4648. Has padding.\n * Use `base32nopad` for unpadded version.\n * Also check out `base32hex`, `base32hexnopad`, `base32crockford`.\n * @example\n * ```js\n * base32.encode(Uint8Array.from([0x12, 0xab]));\n * // => 'CKVQ===='\n * base32.decode('CKVQ====');\n * // => Uint8Array.from([0x12, 0xab])\n * ```\n */\nexport const base32 = chain(radix2(5), alphabet('ABCDEFGHIJKLMNOPQRSTUVWXYZ234567'), padding(5), join(''));\n/**\n * base32 encoding from RFC 4648. No padding.\n * Use `base32` for padded version.\n * Also check out `base32hex`, `base32hexnopad`, `base32crockford`.\n * @example\n * ```js\n * base32nopad.encode(Uint8Array.from([0x12, 0xab]));\n * // => 'CKVQ'\n * base32nopad.decode('CKVQ');\n * // => Uint8Array.from([0x12, 0xab])\n * ```\n */\nexport const base32nopad = chain(radix2(5), alphabet('ABCDEFGHIJKLMNOPQRSTUVWXYZ234567'), join(''));\n/**\n * base32 encoding from RFC 4648. Padded. Compared to ordinary `base32`, slightly different alphabet.\n * Use `base32hexnopad` for unpadded version.\n * @example\n * ```js\n * base32hex.encode(Uint8Array.from([0x12, 0xab]));\n * // => '2ALG===='\n * base32hex.decode('2ALG====');\n * // => Uint8Array.from([0x12, 0xab])\n * ```\n */\nexport const base32hex = chain(radix2(5), alphabet('0123456789ABCDEFGHIJKLMNOPQRSTUV'), padding(5), join(''));\n/**\n * base32 encoding from RFC 4648. No padding. Compared to ordinary `base32`, slightly different alphabet.\n * Use `base32hex` for padded version.\n * @example\n * ```js\n * base32hexnopad.encode(Uint8Array.from([0x12, 0xab]));\n * // => '2ALG'\n * base32hexnopad.decode('2ALG');\n * // => Uint8Array.from([0x12, 0xab])\n * ```\n */\nexport const base32hexnopad = chain(radix2(5), alphabet('0123456789ABCDEFGHIJKLMNOPQRSTUV'), join(''));\n/**\n * base32 encoding from RFC 4648. Doug Crockford's version.\n * https://www.crockford.com/base32.html\n * @example\n * ```js\n * base32crockford.encode(Uint8Array.from([0x12, 0xab]));\n * // => '2ANG'\n * base32crockford.decode('2ANG');\n * // => Uint8Array.from([0x12, 0xab])\n * ```\n */\nexport const base32crockford = chain(radix2(5), alphabet('0123456789ABCDEFGHJKMNPQRSTVWXYZ'), join(''), normalize((s) => s.toUpperCase().replace(/O/g, '0').replace(/[IL]/g, '1')));\n// Built-in base64 conversion https://caniuse.com/mdn-javascript_builtins_uint8array_frombase64\n// prettier-ignore\nconst hasBase64Builtin = /* @__PURE__ */ (() => typeof Uint8Array.from([]).toBase64 === 'function' &&\n typeof Uint8Array.fromBase64 === 'function')();\nconst decodeBase64Builtin = (s, isUrl) => {\n astr('base64', s);\n const re = isUrl ? /^[A-Za-z0-9=_-]+$/ : /^[A-Za-z0-9=+/]+$/;\n const alphabet = isUrl ? 'base64url' : 'base64';\n if (s.length > 0 && !re.test(s))\n throw new Error('invalid base64');\n return Uint8Array.fromBase64(s, { alphabet, lastChunkHandling: 'strict' });\n};\n/**\n * base64 from RFC 4648. Padded.\n * Use `base64nopad` for unpadded version.\n * Also check out `base64url`, `base64urlnopad`.\n * Falls back to built-in function, when available.\n * @example\n * ```js\n * base64.encode(Uint8Array.from([0x12, 0xab]));\n * // => 'Eqs='\n * base64.decode('Eqs=');\n * // => Uint8Array.from([0x12, 0xab])\n * ```\n */\n// prettier-ignore\nexport const base64 = hasBase64Builtin ? {\n encode(b) { abytes(b); return b.toBase64(); },\n decode(s) { return decodeBase64Builtin(s, false); },\n} : chain(radix2(6), alphabet('ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/'), padding(6), join(''));\n/**\n * base64 from RFC 4648. No padding.\n * Use `base64` for padded version.\n * @example\n * ```js\n * base64nopad.encode(Uint8Array.from([0x12, 0xab]));\n * // => 'Eqs'\n * base64nopad.decode('Eqs');\n * // => Uint8Array.from([0x12, 0xab])\n * ```\n */\nexport const base64nopad = chain(radix2(6), alphabet('ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/'), join(''));\n/**\n * base64 from RFC 4648, using URL-safe alphabet. Padded.\n * Use `base64urlnopad` for unpadded version.\n * Falls back to built-in function, when available.\n * @example\n * ```js\n * base64url.encode(Uint8Array.from([0x12, 0xab]));\n * // => 'Eqs='\n * base64url.decode('Eqs=');\n * // => Uint8Array.from([0x12, 0xab])\n * ```\n */\n// prettier-ignore\nexport const base64url = hasBase64Builtin ? {\n encode(b) { abytes(b); return b.toBase64({ alphabet: 'base64url' }); },\n decode(s) { return decodeBase64Builtin(s, true); },\n} : chain(radix2(6), alphabet('ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789-_'), padding(6), join(''));\n/**\n * base64 from RFC 4648, using URL-safe alphabet. No padding.\n * Use `base64url` for padded version.\n * @example\n * ```js\n * base64urlnopad.encode(Uint8Array.from([0x12, 0xab]));\n * // => 'Eqs'\n * base64urlnopad.decode('Eqs');\n * // => Uint8Array.from([0x12, 0xab])\n * ```\n */\nexport const base64urlnopad = chain(radix2(6), alphabet('ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789-_'), join(''));\n// base58 code\n// -----------\nconst genBase58 = /* @__NO_SIDE_EFFECTS__ */ (abc) => chain(radix(58), alphabet(abc), join(''));\n/**\n * base58: base64 without ambigous characters +, /, 0, O, I, l.\n * Quadratic (O(n^2)) - so, can't be used on large inputs.\n * @example\n * ```js\n * base58.decode('01abcdef');\n * // => '3UhJW'\n * ```\n */\nexport const base58 = genBase58('123456789ABCDEFGHJKLMNPQRSTUVWXYZabcdefghijkmnopqrstuvwxyz');\n/**\n * base58: flickr version. Check out `base58`.\n */\nexport const base58flickr = genBase58('123456789abcdefghijkmnopqrstuvwxyzABCDEFGHJKLMNPQRSTUVWXYZ');\n/**\n * base58: XRP version. Check out `base58`.\n */\nexport const base58xrp = genBase58('rpshnaf39wBUDNEGHJKLM4PQRST7VWXYZ2bcdeCg65jkm8oFqi1tuvAxyz');\n// Data len (index) -> encoded block len\nconst XMR_BLOCK_LEN = [0, 2, 3, 5, 6, 7, 9, 10, 11];\n/**\n * base58: XMR version. Check out `base58`.\n * Done in 8-byte blocks (which equals 11 chars in decoding). Last (non-full) block padded with '1' to size in XMR_BLOCK_LEN.\n * Block encoding significantly reduces quadratic complexity of base58.\n */\nexport const base58xmr = {\n encode(data) {\n let res = '';\n for (let i = 0; i < data.length; i += 8) {\n const block = data.subarray(i, i + 8);\n res += base58.encode(block).padStart(XMR_BLOCK_LEN[block.length], '1');\n }\n return res;\n },\n decode(str) {\n let res = [];\n for (let i = 0; i < str.length; i += 11) {\n const slice = str.slice(i, i + 11);\n const blockLen = XMR_BLOCK_LEN.indexOf(slice.length);\n const block = base58.decode(slice);\n for (let j = 0; j < block.length - blockLen; j++) {\n if (block[j] !== 0)\n throw new Error('base58xmr: wrong padding');\n }\n res = res.concat(Array.from(block.slice(block.length - blockLen)));\n }\n return Uint8Array.from(res);\n },\n};\n/**\n * Method, which creates base58check encoder.\n * Requires function, calculating sha256.\n */\nexport const createBase58check = (sha256) => chain(checksum(4, (data) => sha256(sha256(data))), base58);\n/**\n * Use `createBase58check` instead.\n * @deprecated\n */\nexport const base58check = createBase58check;\nconst BECH_ALPHABET = chain(alphabet('qpzry9x8gf2tvdw0s3jn54khce6mua7l'), join(''));\nconst POLYMOD_GENERATORS = [0x3b6a57b2, 0x26508e6d, 0x1ea119fa, 0x3d4233dd, 0x2a1462b3];\nfunction bech32Polymod(pre) {\n const b = pre >> 25;\n let chk = (pre & 0x1ffffff) << 5;\n for (let i = 0; i < POLYMOD_GENERATORS.length; i++) {\n if (((b >> i) & 1) === 1)\n chk ^= POLYMOD_GENERATORS[i];\n }\n return chk;\n}\nfunction bechChecksum(prefix, words, encodingConst = 1) {\n const len = prefix.length;\n let chk = 1;\n for (let i = 0; i < len; i++) {\n const c = prefix.charCodeAt(i);\n if (c < 33 || c > 126)\n throw new Error(`Invalid prefix (${prefix})`);\n chk = bech32Polymod(chk) ^ (c >> 5);\n }\n chk = bech32Polymod(chk);\n for (let i = 0; i < len; i++)\n chk = bech32Polymod(chk) ^ (prefix.charCodeAt(i) & 0x1f);\n for (let v of words)\n chk = bech32Polymod(chk) ^ v;\n for (let i = 0; i < 6; i++)\n chk = bech32Polymod(chk);\n chk ^= encodingConst;\n return BECH_ALPHABET.encode(convertRadix2([chk % powers[30]], 30, 5, false));\n}\n/**\n * @__NO_SIDE_EFFECTS__\n */\nfunction genBech32(encoding) {\n const ENCODING_CONST = encoding === 'bech32' ? 1 : 0x2bc830a3;\n const _words = radix2(5);\n const fromWords = _words.decode;\n const toWords = _words.encode;\n const fromWordsUnsafe = unsafeWrapper(fromWords);\n function encode(prefix, words, limit = 90) {\n astr('bech32.encode prefix', prefix);\n if (isBytes(words))\n words = Array.from(words);\n anumArr('bech32.encode', words);\n const plen = prefix.length;\n if (plen === 0)\n throw new TypeError(`Invalid prefix length ${plen}`);\n const actualLength = plen + 7 + words.length;\n if (limit !== false && actualLength > limit)\n throw new TypeError(`Length ${actualLength} exceeds limit ${limit}`);\n const lowered = prefix.toLowerCase();\n const sum = bechChecksum(lowered, words, ENCODING_CONST);\n return `${lowered}1${BECH_ALPHABET.encode(words)}${sum}`;\n }\n function decode(str, limit = 90) {\n astr('bech32.decode input', str);\n const slen = str.length;\n if (slen < 8 || (limit !== false && slen > limit))\n throw new TypeError(`invalid string length: ${slen} (${str}). Expected (8..${limit})`);\n // don't allow mixed case\n const lowered = str.toLowerCase();\n if (str !== lowered && str !== str.toUpperCase())\n throw new Error(`String must be lowercase or uppercase`);\n const sepIndex = lowered.lastIndexOf('1');\n if (sepIndex === 0 || sepIndex === -1)\n throw new Error(`Letter \"1\" must be present between prefix and data only`);\n const prefix = lowered.slice(0, sepIndex);\n const data = lowered.slice(sepIndex + 1);\n if (data.length < 6)\n throw new Error('Data must be at least 6 characters long');\n const words = BECH_ALPHABET.decode(data).slice(0, -6);\n const sum = bechChecksum(prefix, words, ENCODING_CONST);\n if (!data.endsWith(sum))\n throw new Error(`Invalid checksum in ${str}: expected \"${sum}\"`);\n return { prefix, words };\n }\n const decodeUnsafe = unsafeWrapper(decode);\n function decodeToBytes(str) {\n const { prefix, words } = decode(str, false);\n return { prefix, words, bytes: fromWords(words) };\n }\n function encodeFromBytes(prefix, bytes) {\n return encode(prefix, toWords(bytes));\n }\n return {\n encode,\n decode,\n encodeFromBytes,\n decodeToBytes,\n decodeUnsafe,\n fromWords,\n fromWordsUnsafe,\n toWords,\n };\n}\n/**\n * bech32 from BIP 173. Operates on words.\n * For high-level, check out scure-btc-signer:\n * https://github.com/paulmillr/scure-btc-signer.\n */\nexport const bech32 = genBech32('bech32');\n/**\n * bech32m from BIP 350. Operates on words.\n * It was to mitigate `bech32` weaknesses.\n * For high-level, check out scure-btc-signer:\n * https://github.com/paulmillr/scure-btc-signer.\n */\nexport const bech32m = genBech32('bech32m');\n/**\n * UTF-8-to-byte decoder. Uses built-in TextDecoder / TextEncoder.\n * @example\n * ```js\n * const b = utf8.decode(\"hey\"); // => new Uint8Array([ 104, 101, 121 ])\n * const str = utf8.encode(b); // \"hey\"\n * ```\n */\nexport const utf8 = {\n encode: (data) => new TextDecoder().decode(data),\n decode: (str) => new TextEncoder().encode(str),\n};\n// Built-in hex conversion https://caniuse.com/mdn-javascript_builtins_uint8array_fromhex\n// prettier-ignore\nconst hasHexBuiltin = /* @__PURE__ */ (() => typeof Uint8Array.from([]).toHex === 'function' &&\n typeof Uint8Array.fromHex === 'function')();\n// prettier-ignore\nconst hexBuiltin = {\n encode(data) { abytes(data); return data.toHex(); },\n decode(s) { astr('hex', s); return Uint8Array.fromHex(s); },\n};\n/**\n * hex string decoder. Uses built-in function, when available.\n * @example\n * ```js\n * const b = hex.decode(\"0102ff\"); // => new Uint8Array([ 1, 2, 255 ])\n * const str = hex.encode(b); // \"0102ff\"\n * ```\n */\nexport const hex = hasHexBuiltin\n ? hexBuiltin\n : chain(radix2(4), alphabet('0123456789abcdef'), join(''), normalize((s) => {\n if (typeof s !== 'string' || s.length % 2 !== 0)\n throw new TypeError(`hex.decode: expected string, got ${typeof s} with length ${s.length}`);\n return s.toLowerCase();\n }));\n// prettier-ignore\nconst CODERS = {\n utf8, hex, base16, base32, base64, base64url, base58, base58xmr\n};\nconst coderTypeError = 'Invalid encoding type. Available types: utf8, hex, base16, base32, base64, base64url, base58, base58xmr';\n/** @deprecated */\nexport const bytesToString = (type, bytes) => {\n if (typeof type !== 'string' || !CODERS.hasOwnProperty(type))\n throw new TypeError(coderTypeError);\n if (!isBytes(bytes))\n throw new TypeError('bytesToString() expects Uint8Array');\n return CODERS[type].encode(bytes);\n};\n/** @deprecated */\nexport const str = bytesToString; // as in python, but for bytes only\n/** @deprecated */\nexport const stringToBytes = (type, str) => {\n if (!CODERS.hasOwnProperty(type))\n throw new TypeError(coderTypeError);\n if (typeof str !== 'string')\n throw new TypeError('stringToBytes() expects string');\n return CODERS[type].decode(str);\n};\n/** @deprecated */\nexport const bytes = stringToBytes;\n//# sourceMappingURL=index.js.map","/**\n * Utilities for hex, bytes, CSPRNG.\n * @module\n */\n/*! noble-ciphers - MIT License (c) 2023 Paul Miller (paulmillr.com) */\n/** Checks if something is Uint8Array. Be careful: nodejs Buffer will return true. */\nexport function isBytes(a) {\n return a instanceof Uint8Array || (ArrayBuffer.isView(a) && a.constructor.name === 'Uint8Array');\n}\n/** Asserts something is boolean. */\nexport function abool(b) {\n if (typeof b !== 'boolean')\n throw new Error(`boolean expected, not ${b}`);\n}\n/** Asserts something is positive integer. */\nexport function anumber(n) {\n if (!Number.isSafeInteger(n) || n < 0)\n throw new Error('positive integer expected, got ' + n);\n}\n/** Asserts something is Uint8Array. */\nexport function abytes(value, length, title = '') {\n const bytes = isBytes(value);\n const len = value?.length;\n const needsLen = length !== undefined;\n if (!bytes || (needsLen && len !== length)) {\n const prefix = title && `\"${title}\" `;\n const ofLen = needsLen ? ` of length ${length}` : '';\n const got = bytes ? `length=${len}` : `type=${typeof value}`;\n throw new Error(prefix + 'expected Uint8Array' + ofLen + ', got ' + got);\n }\n return value;\n}\n/** Asserts a hash instance has not been destroyed / finished */\nexport function aexists(instance, checkFinished = true) {\n if (instance.destroyed)\n throw new Error('Hash instance has been destroyed');\n if (checkFinished && instance.finished)\n throw new Error('Hash#digest() has already been called');\n}\n/** Asserts output is properly-sized byte array */\nexport function aoutput(out, instance) {\n abytes(out, undefined, 'output');\n const min = instance.outputLen;\n if (out.length < min) {\n throw new Error('digestInto() expects output buffer of length at least ' + min);\n }\n}\n/** Cast u8 / u16 / u32 to u8. */\nexport function u8(arr) {\n return new Uint8Array(arr.buffer, arr.byteOffset, arr.byteLength);\n}\n/** Cast u8 / u16 / u32 to u32. */\nexport function u32(arr) {\n return new Uint32Array(arr.buffer, arr.byteOffset, Math.floor(arr.byteLength / 4));\n}\n/** Zeroize a byte array. Warning: JS provides no guarantees. */\nexport function clean(...arrays) {\n for (let i = 0; i < arrays.length; i++) {\n arrays[i].fill(0);\n }\n}\n/** Create DataView of an array for easy byte-level manipulation. */\nexport function createView(arr) {\n return new DataView(arr.buffer, arr.byteOffset, arr.byteLength);\n}\n/** Is current platform little-endian? Most are. Big-Endian platform: IBM */\nexport const isLE = /* @__PURE__ */ (() => new Uint8Array(new Uint32Array([0x11223344]).buffer)[0] === 0x44)();\n// Built-in hex conversion https://caniuse.com/mdn-javascript_builtins_uint8array_fromhex\nconst hasHexBuiltin = /* @__PURE__ */ (() => \n// @ts-ignore\ntypeof Uint8Array.from([]).toHex === 'function' && typeof Uint8Array.fromHex === 'function')();\n// Array where index 0xf0 (240) is mapped to string 'f0'\nconst hexes = /* @__PURE__ */ Array.from({ length: 256 }, (_, i) => i.toString(16).padStart(2, '0'));\n/**\n * Convert byte array to hex string. Uses built-in function, when available.\n * @example bytesToHex(Uint8Array.from([0xca, 0xfe, 0x01, 0x23])) // 'cafe0123'\n */\nexport function bytesToHex(bytes) {\n abytes(bytes);\n // @ts-ignore\n if (hasHexBuiltin)\n return bytes.toHex();\n // pre-caching improves the speed 6x\n let hex = '';\n for (let i = 0; i < bytes.length; i++) {\n hex += hexes[bytes[i]];\n }\n return hex;\n}\n// We use optimized technique to convert hex string to byte array\nconst asciis = { _0: 48, _9: 57, A: 65, F: 70, a: 97, f: 102 };\nfunction asciiToBase16(ch) {\n if (ch >= asciis._0 && ch <= asciis._9)\n return ch - asciis._0; // '2' => 50-48\n if (ch >= asciis.A && ch <= asciis.F)\n return ch - (asciis.A - 10); // 'B' => 66-(65-10)\n if (ch >= asciis.a && ch <= asciis.f)\n return ch - (asciis.a - 10); // 'b' => 98-(97-10)\n return;\n}\n/**\n * Convert hex string to byte array. Uses built-in function, when available.\n * @example hexToBytes('cafe0123') // Uint8Array.from([0xca, 0xfe, 0x01, 0x23])\n */\nexport function hexToBytes(hex) {\n if (typeof hex !== 'string')\n throw new Error('hex string expected, got ' + typeof hex);\n // @ts-ignore\n if (hasHexBuiltin)\n return Uint8Array.fromHex(hex);\n const hl = hex.length;\n const al = hl / 2;\n if (hl % 2)\n throw new Error('hex string expected, got unpadded hex of length ' + hl);\n const array = new Uint8Array(al);\n for (let ai = 0, hi = 0; ai < al; ai++, hi += 2) {\n const n1 = asciiToBase16(hex.charCodeAt(hi));\n const n2 = asciiToBase16(hex.charCodeAt(hi + 1));\n if (n1 === undefined || n2 === undefined) {\n const char = hex[hi] + hex[hi + 1];\n throw new Error('hex string expected, got non-hex character \"' + char + '\" at index ' + hi);\n }\n array[ai] = n1 * 16 + n2; // multiply first octet, e.g. 'a3' => 10*16+3 => 160 + 3 => 163\n }\n return array;\n}\n// Used in micro\nexport function hexToNumber(hex) {\n if (typeof hex !== 'string')\n throw new Error('hex string expected, got ' + typeof hex);\n return BigInt(hex === '' ? '0' : '0x' + hex); // Big Endian\n}\n// Used in ff1\n// BE: Big Endian, LE: Little Endian\nexport function bytesToNumberBE(bytes) {\n return hexToNumber(bytesToHex(bytes));\n}\n// Used in micro, ff1\nexport function numberToBytesBE(n, len) {\n return hexToBytes(n.toString(16).padStart(len * 2, '0'));\n}\n/**\n * Converts string to bytes using UTF8 encoding.\n * @example utf8ToBytes('abc') // new Uint8Array([97, 98, 99])\n */\nexport function utf8ToBytes(str) {\n if (typeof str !== 'string')\n throw new Error('string expected');\n return new Uint8Array(new TextEncoder().encode(str)); // https://bugzil.la/1681809\n}\n/**\n * Converts bytes to string using UTF8 encoding.\n * @example bytesToUtf8(new Uint8Array([97, 98, 99])) // 'abc'\n */\nexport function bytesToUtf8(bytes) {\n return new TextDecoder().decode(bytes);\n}\n/**\n * Checks if two U8A use same underlying buffer and overlaps.\n * This is invalid and can corrupt data.\n */\nexport function overlapBytes(a, b) {\n return (a.buffer === b.buffer && // best we can do, may fail with an obscure Proxy\n a.byteOffset < b.byteOffset + b.byteLength && // a starts before b end\n b.byteOffset < a.byteOffset + a.byteLength // b starts before a end\n );\n}\n/**\n * If input and output overlap and input starts before output, we will overwrite end of input before\n * we start processing it, so this is not supported for most ciphers (except chacha/salse, which designed with this)\n */\nexport function complexOverlapBytes(input, output) {\n // This is very cursed. It works somehow, but I'm completely unsure,\n // reasoning about overlapping aligned windows is very hard.\n if (overlapBytes(input, output) && input.byteOffset < output.byteOffset)\n throw new Error('complex overlap of input and output is not supported');\n}\n/**\n * Copies several Uint8Arrays into one.\n */\nexport function concatBytes(...arrays) {\n let sum = 0;\n for (let i = 0; i < arrays.length; i++) {\n const a = arrays[i];\n abytes(a);\n sum += a.length;\n }\n const res = new Uint8Array(sum);\n for (let i = 0, pad = 0; i < arrays.length; i++) {\n const a = arrays[i];\n res.set(a, pad);\n pad += a.length;\n }\n return res;\n}\nexport function checkOpts(defaults, opts) {\n if (opts == null || typeof opts !== 'object')\n throw new Error('options must be defined');\n const merged = Object.assign(defaults, opts);\n return merged;\n}\n/** Compares 2 uint8array-s in kinda constant time. */\nexport function equalBytes(a, b) {\n if (a.length !== b.length)\n return false;\n let diff = 0;\n for (let i = 0; i < a.length; i++)\n diff |= a[i] ^ b[i];\n return diff === 0;\n}\n/**\n * Wraps a cipher: validates args, ensures encrypt() can only be called once.\n * @__NO_SIDE_EFFECTS__\n */\nexport const wrapCipher = (params, constructor) => {\n function wrappedCipher(key, ...args) {\n // Validate key\n abytes(key, undefined, 'key');\n // Big-Endian hardware is rare. Just in case someone still decides to run ciphers:\n if (!isLE)\n throw new Error('Non little-endian hardware is not yet supported');\n // Validate nonce if nonceLength is present\n if (params.nonceLength !== undefined) {\n const nonce = args[0];\n abytes(nonce, params.varSizeNonce ? undefined : params.nonceLength, 'nonce');\n }\n // Validate AAD if tagLength present\n const tagl = params.tagLength;\n if (tagl && args[1] !== undefined)\n abytes(args[1], undefined, 'AAD');\n const cipher = constructor(key, ...args);\n const checkOutput = (fnLength, output) => {\n if (output !== undefined) {\n if (fnLength !== 2)\n throw new Error('cipher output not supported');\n abytes(output, undefined, 'output');\n }\n };\n // Create wrapped cipher with validation and single-use encryption\n let called = false;\n const wrCipher = {\n encrypt(data, output) {\n if (called)\n throw new Error('cannot encrypt() twice with same key + nonce');\n called = true;\n abytes(data);\n checkOutput(cipher.encrypt.length, output);\n return cipher.encrypt(data, output);\n },\n decrypt(data, output) {\n abytes(data);\n if (tagl && data.length < tagl)\n throw new Error('\"ciphertext\" expected length bigger than tagLength=' + tagl);\n checkOutput(cipher.decrypt.length, output);\n return cipher.decrypt(data, output);\n },\n };\n return wrCipher;\n }\n Object.assign(wrappedCipher, params);\n return wrappedCipher;\n};\n/**\n * By default, returns u8a of length.\n * When out is available, it checks it for validity and uses it.\n */\nexport function getOutput(expectedLength, out, onlyAligned = true) {\n if (out === undefined)\n return new Uint8Array(expectedLength);\n if (out.length !== expectedLength)\n throw new Error('\"output\" expected Uint8Array of length ' + expectedLength + ', got: ' + out.length);\n if (onlyAligned && !isAligned32(out))\n throw new Error('invalid output, must be aligned');\n return out;\n}\nexport function u64Lengths(dataLength, aadLength, isLE) {\n abool(isLE);\n const num = new Uint8Array(16);\n const view = createView(num);\n view.setBigUint64(0, BigInt(aadLength), isLE);\n view.setBigUint64(8, BigInt(dataLength), isLE);\n return num;\n}\n// Is byte array aligned to 4 byte offset (u32)?\nexport function isAligned32(bytes) {\n return bytes.byteOffset % 4 === 0;\n}\n// copy bytes to new u8a (aligned). Because Buffer.slice is broken.\nexport function copyBytes(bytes) {\n return Uint8Array.from(bytes);\n}\n/** Cryptographically secure PRNG. Uses internal OS-level `crypto.getRandomValues`. */\nexport function randomBytes(bytesLength = 32) {\n const cr = typeof globalThis === 'object' ? globalThis.crypto : null;\n if (typeof cr?.getRandomValues !== 'function')\n throw new Error('crypto.getRandomValues must be defined');\n return cr.getRandomValues(new Uint8Array(bytesLength));\n}\n/**\n * Uses CSPRG for nonce, nonce injected in ciphertext.\n * For `encrypt`, a `nonceBytes`-length buffer is fetched from CSPRNG and\n * prepended to encrypted ciphertext. For `decrypt`, first `nonceBytes` of ciphertext\n * are treated as nonce.\n *\n * NOTE: Under the same key, using random nonces (e.g. `managedNonce`) with AES-GCM and ChaCha\n * should be limited to `2**23` (8M) messages to get a collision chance of `2**-50`. Stretching to * `2**32` (4B) messages, chance would become `2**-33` - still negligible, but creeping up.\n * @example\n * const gcm = managedNonce(aes.gcm);\n * const ciphr = gcm(key).encrypt(data);\n * const plain = gcm(key).decrypt(ciph);\n */\nexport function managedNonce(fn, randomBytes_ = randomBytes) {\n const { nonceLength } = fn;\n anumber(nonceLength);\n const addNonce = (nonce, ciphertext) => {\n const out = concatBytes(nonce, ciphertext);\n ciphertext.fill(0);\n return out;\n };\n // NOTE: we cannot support DST here, it would be mistake:\n // - we don't know how much dst length cipher requires\n // - nonce may unalign dst and break everything\n // - we create new u8a anyway (concatBytes)\n // - previously we passed all args to cipher, but that was mistake!\n return ((key, ...args) => ({\n encrypt(plaintext) {\n abytes(plaintext);\n const nonce = randomBytes_(nonceLength);\n const encrypted = fn(key, nonce, ...args).encrypt(plaintext);\n // @ts-ignore\n if (encrypted instanceof Promise)\n return encrypted.then((ct) => addNonce(nonce, ct));\n return addNonce(nonce, encrypted);\n },\n decrypt(ciphertext) {\n abytes(ciphertext);\n const nonce = ciphertext.subarray(0, nonceLength);\n const decrypted = ciphertext.subarray(nonceLength);\n return fn(key, nonce, ...args).decrypt(decrypted);\n },\n }));\n}\n//# sourceMappingURL=utils.js.map","/**\n * [AES](https://en.wikipedia.org/wiki/Advanced_Encryption_Standard)\n * a.k.a. Advanced Encryption Standard\n * is a variant of Rijndael block cipher, standardized by NIST in 2001.\n * We provide the fastest available pure JS implementation.\n *\n * `cipher = encrypt(block, key)`\n *\n * Data is split into 128-bit blocks. Encrypted in 10/12/14 rounds (128/192/256 bits). In every round:\n * 1. **S-box**, table substitution\n * 2. **Shift rows**, cyclic shift left of all rows of data array\n * 3. **Mix columns**, multiplying every column by fixed polynomial\n * 4. **Add round key**, round_key xor i-th column of array\n *\n * Check out [FIPS-197](https://csrc.nist.gov/files/pubs/fips/197/final/docs/fips-197.pdf),\n * [NIST 800-38G](https://nvlpubs.nist.gov/nistpubs/SpecialPublications/NIST.SP.800-38G.pdf)\n * and [original proposal](https://csrc.nist.gov/csrc/media/projects/cryptographic-standards-and-guidelines/documents/aes-development/rijndael-ammended.pdf)\n * @module\n */\nimport { ghash, polyval } from \"./_polyval.js\";\n// prettier-ignore\nimport { abytes, anumber, clean, complexOverlapBytes, concatBytes, copyBytes, createView, equalBytes, getOutput, isAligned32, overlapBytes, u32, u64Lengths, u8, wrapCipher } from \"./utils.js\";\nconst BLOCK_SIZE = 16;\nconst BLOCK_SIZE32 = 4;\nconst EMPTY_BLOCK = /* @__PURE__ */ new Uint8Array(BLOCK_SIZE);\nconst ONE_BLOCK = /* @__PURE__ */ Uint8Array.from([\n 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01,\n]);\nconst POLY = 0x11b; // 1 + x + x**3 + x**4 + x**8\nfunction validateKeyLength(key) {\n if (![16, 24, 32].includes(key.length))\n throw new Error('\"aes key\" expected Uint8Array of length 16/24/32, got length=' + key.length);\n}\n// TODO: remove multiplication, binary ops only\nfunction mul2(n) {\n return (n << 1) ^ (POLY & -(n >> 7));\n}\nfunction mul(a, b) {\n let res = 0;\n for (; b > 0; b >>= 1) {\n // Montgomery ladder\n res ^= a & -(b & 1); // if (b&1) res ^=a (but const-time).\n a = mul2(a); // a = 2*a\n }\n return res;\n}\n// Increments bigint with wrap around\n// NOTE: we cannot use u32 here since it may overflow on carry!\nconst incBytes = (data, isLE, carry = 1) => {\n if (!Number.isSafeInteger(carry))\n throw new Error('incBytes: wrong carry ' + carry);\n abytes(data);\n for (let i = 0; i < data.length; i++) {\n const pos = !isLE ? data.length - 1 - i : i;\n carry = (carry + (data[pos] & 0xff)) | 0;\n data[pos] = carry & 0xff;\n carry >>>= 8;\n }\n};\n// AES S-box is generated using finite field inversion,\n// an affine transform, and xor of a constant 0x63.\nconst sbox = /* @__PURE__ */ (() => {\n const t = new Uint8Array(256);\n for (let i = 0, x = 1; i < 256; i++, x ^= mul2(x))\n t[i] = x;\n const box = new Uint8Array(256);\n box[0] = 0x63; // first elm\n for (let i = 0; i < 255; i++) {\n let x = t[255 - i];\n x |= x << 8;\n box[t[i]] = (x ^ (x >> 4) ^ (x >> 5) ^ (x >> 6) ^ (x >> 7) ^ 0x63) & 0xff;\n }\n clean(t);\n return box;\n})();\n// Inverted S-box\nconst invSbox = /* @__PURE__ */ sbox.map((_, j) => sbox.indexOf(j));\n// Rotate u32 by 8\nconst rotr32_8 = (n) => (n << 24) | (n >>> 8);\nconst rotl32_8 = (n) => (n << 8) | (n >>> 24);\n// The byte swap operation for uint32 (LE<->BE)\nconst byteSwap = (word) => ((word << 24) & 0xff000000) |\n ((word << 8) & 0xff0000) |\n ((word >>> 8) & 0xff00) |\n ((word >>> 24) & 0xff);\n// T-table is optimization suggested in 5.2 of original proposal (missed from FIPS-197). Changes:\n// - LE instead of BE\n// - bigger tables: T0 and T1 are merged into T01 table and T2 & T3 into T23;\n// so index is u16, instead of u8. This speeds up things, unexpectedly\nfunction genTtable(sbox, fn) {\n if (sbox.length !== 256)\n throw new Error('Wrong sbox length');\n const T0 = new Uint32Array(256).map((_, j) => fn(sbox[j]));\n const T1 = T0.map(rotl32_8);\n const T2 = T1.map(rotl32_8);\n const T3 = T2.map(rotl32_8);\n const T01 = new Uint32Array(256 * 256);\n const T23 = new Uint32Array(256 * 256);\n const sbox2 = new Uint16Array(256 * 256);\n for (let i = 0; i < 256; i++) {\n for (let j = 0; j < 256; j++) {\n const idx = i * 256 + j;\n T01[idx] = T0[i] ^ T1[j];\n T23[idx] = T2[i] ^ T3[j];\n sbox2[idx] = (sbox[i] << 8) | sbox[j];\n }\n }\n return { sbox, sbox2, T0, T1, T2, T3, T01, T23 };\n}\nconst tableEncoding = /* @__PURE__ */ genTtable(sbox, (s) => (mul(s, 3) << 24) | (s << 16) | (s << 8) | mul(s, 2));\nconst tableDecoding = /* @__PURE__ */ genTtable(invSbox, (s) => (mul(s, 11) << 24) | (mul(s, 13) << 16) | (mul(s, 9) << 8) | mul(s, 14));\nconst xPowers = /* @__PURE__ */ (() => {\n const p = new Uint8Array(16);\n for (let i = 0, x = 1; i < 16; i++, x = mul2(x))\n p[i] = x;\n return p;\n})();\n/** Key expansion used in CTR. */\nfunction expandKeyLE(key) {\n abytes(key);\n const len = key.length;\n validateKeyLength(key);\n const { sbox2 } = tableEncoding;\n const toClean = [];\n if (!isAligned32(key))\n toClean.push((key = copyBytes(key)));\n const k32 = u32(key);\n const Nk = k32.length;\n const subByte = (n) => applySbox(sbox2, n, n, n, n);\n const xk = new Uint32Array(len + 28); // expanded key\n xk.set(k32);\n // 4.3.1 Key expansion\n for (let i = Nk; i < xk.length; i++) {\n let t = xk[i - 1];\n if (i % Nk === 0)\n t = subByte(rotr32_8(t)) ^ xPowers[i / Nk - 1];\n else if (Nk > 6 && i % Nk === 4)\n t = subByte(t);\n xk[i] = xk[i - Nk] ^ t;\n }\n clean(...toClean);\n return xk;\n}\nfunction expandKeyDecLE(key) {\n const encKey = expandKeyLE(key);\n const xk = encKey.slice();\n const Nk = encKey.length;\n const { sbox2 } = tableEncoding;\n const { T0, T1, T2, T3 } = tableDecoding;\n // Inverse key by chunks of 4 (rounds)\n for (let i = 0; i < Nk; i += 4) {\n for (let j = 0; j < 4; j++)\n xk[i + j] = encKey[Nk - i - 4 + j];\n }\n clean(encKey);\n // apply InvMixColumn except first & last round\n for (let i = 4; i < Nk - 4; i++) {\n const x = xk[i];\n const w = applySbox(sbox2, x, x, x, x);\n xk[i] = T0[w & 0xff] ^ T1[(w >>> 8) & 0xff] ^ T2[(w >>> 16) & 0xff] ^ T3[w >>> 24];\n }\n return xk;\n}\n// Apply tables\nfunction apply0123(T01, T23, s0, s1, s2, s3) {\n return (T01[((s0 << 8) & 0xff00) | ((s1 >>> 8) & 0xff)] ^\n T23[((s2 >>> 8) & 0xff00) | ((s3 >>> 24) & 0xff)]);\n}\nfunction applySbox(sbox2, s0, s1, s2, s3) {\n return (sbox2[(s0 & 0xff) | (s1 & 0xff00)] |\n (sbox2[((s2 >>> 16) & 0xff) | ((s3 >>> 16) & 0xff00)] << 16));\n}\nfunction encrypt(xk, s0, s1, s2, s3) {\n const { sbox2, T01, T23 } = tableEncoding;\n let k = 0;\n ((s0 ^= xk[k++]), (s1 ^= xk[k++]), (s2 ^= xk[k++]), (s3 ^= xk[k++]));\n const rounds = xk.length / 4 - 2;\n for (let i = 0; i < rounds; i++) {\n const t0 = xk[k++] ^ apply0123(T01, T23, s0, s1, s2, s3);\n const t1 = xk[k++] ^ apply0123(T01, T23, s1, s2, s3, s0);\n const t2 = xk[k++] ^ apply0123(T01, T23, s2, s3, s0, s1);\n const t3 = xk[k++] ^ apply0123(T01, T23, s3, s0, s1, s2);\n ((s0 = t0), (s1 = t1), (s2 = t2), (s3 = t3));\n }\n // last round (without mixcolumns, so using SBOX2 table)\n const t0 = xk[k++] ^ applySbox(sbox2, s0, s1, s2, s3);\n const t1 = xk[k++] ^ applySbox(sbox2, s1, s2, s3, s0);\n const t2 = xk[k++] ^ applySbox(sbox2, s2, s3, s0, s1);\n const t3 = xk[k++] ^ applySbox(sbox2, s3, s0, s1, s2);\n return { s0: t0, s1: t1, s2: t2, s3: t3 };\n}\n// Can't be merged with encrypt: arg positions for apply0123 / applySbox are different\nfunction decrypt(xk, s0, s1, s2, s3) {\n const { sbox2, T01, T23 } = tableDecoding;\n let k = 0;\n ((s0 ^= xk[k++]), (s1 ^= xk[k++]), (s2 ^= xk[k++]), (s3 ^= xk[k++]));\n const rounds = xk.length / 4 - 2;\n for (let i = 0; i < rounds; i++) {\n const t0 = xk[k++] ^ apply0123(T01, T23, s0, s3, s2, s1);\n const t1 = xk[k++] ^ apply0123(T01, T23, s1, s0, s3, s2);\n const t2 = xk[k++] ^ apply0123(T01, T23, s2, s1, s0, s3);\n const t3 = xk[k++] ^ apply0123(T01, T23, s3, s2, s1, s0);\n ((s0 = t0), (s1 = t1), (s2 = t2), (s3 = t3));\n }\n // Last round\n const t0 = xk[k++] ^ applySbox(sbox2, s0, s3, s2, s1);\n const t1 = xk[k++] ^ applySbox(sbox2, s1, s0, s3, s2);\n const t2 = xk[k++] ^ applySbox(sbox2, s2, s1, s0, s3);\n const t3 = xk[k++] ^ applySbox(sbox2, s3, s2, s1, s0);\n return { s0: t0, s1: t1, s2: t2, s3: t3 };\n}\n// TODO: investigate merging with ctr32\nfunction ctrCounter(xk, nonce, src, dst) {\n abytes(nonce, BLOCK_SIZE, 'nonce');\n abytes(src);\n const srcLen = src.length;\n dst = getOutput(srcLen, dst);\n complexOverlapBytes(src, dst);\n const ctr = nonce;\n const c32 = u32(ctr);\n // Fill block (empty, ctr=0)\n let { s0, s1, s2, s3 } = encrypt(xk, c32[0], c32[1], c32[2], c32[3]);\n const src32 = u32(src);\n const dst32 = u32(dst);\n // process blocks\n for (let i = 0; i + 4 <= src32.length; i += 4) {\n dst32[i + 0] = src32[i + 0] ^ s0;\n dst32[i + 1] = src32[i + 1] ^ s1;\n dst32[i + 2] = src32[i + 2] ^ s2;\n dst32[i + 3] = src32[i + 3] ^ s3;\n incBytes(ctr, false, 1); // Full 128 bit counter with wrap around\n ({ s0, s1, s2, s3 } = encrypt(xk, c32[0], c32[1], c32[2], c32[3]));\n }\n // leftovers (less than block)\n // It's possible to handle > u32 fast, but is it worth it?\n const start = BLOCK_SIZE * Math.floor(src32.length / BLOCK_SIZE32);\n if (start < srcLen) {\n const b32 = new Uint32Array([s0, s1, s2, s3]);\n const buf = u8(b32);\n for (let i = start, pos = 0; i < srcLen; i++, pos++)\n dst[i] = src[i] ^ buf[pos];\n clean(b32);\n }\n return dst;\n}\n// AES CTR with overflowing 32 bit counter\n// It's possible to do 32le significantly simpler (and probably faster) by using u32.\n// But, we need both, and perf bottleneck is in ghash anyway.\nfunction ctr32(xk, isLE, nonce, src, dst) {\n abytes(nonce, BLOCK_SIZE, 'nonce');\n abytes(src);\n dst = getOutput(src.length, dst);\n const ctr = nonce; // write new value to nonce, so it can be re-used\n const c32 = u32(ctr);\n const view = createView(ctr);\n const src32 = u32(src);\n const dst32 = u32(dst);\n const ctrPos = isLE ? 0 : 12;\n const srcLen = src.length;\n // Fill block (empty, ctr=0)\n let ctrNum = view.getUint32(ctrPos, isLE); // read current counter value\n let { s0, s1, s2, s3 } = encrypt(xk, c32[0], c32[1], c32[2], c32[3]);\n // process blocks\n for (let i = 0; i + 4 <= src32.length; i += 4) {\n dst32[i + 0] = src32[i + 0] ^ s0;\n dst32[i + 1] = src32[i + 1] ^ s1;\n dst32[i + 2] = src32[i + 2] ^ s2;\n dst32[i + 3] = src32[i + 3] ^ s3;\n ctrNum = (ctrNum + 1) >>> 0; // u32 wrap\n view.setUint32(ctrPos, ctrNum, isLE);\n ({ s0, s1, s2, s3 } = encrypt(xk, c32[0], c32[1], c32[2], c32[3]));\n }\n // leftovers (less than a block)\n const start = BLOCK_SIZE * Math.floor(src32.length / BLOCK_SIZE32);\n if (start < srcLen) {\n const b32 = new Uint32Array([s0, s1, s2, s3]);\n const buf = u8(b32);\n for (let i = start, pos = 0; i < srcLen; i++, pos++)\n dst[i] = src[i] ^ buf[pos];\n clean(b32);\n }\n return dst;\n}\n/**\n * **CTR** (Counter Mode): Turns a block cipher into a stream cipher using a counter and IV (nonce).\n * Efficient and parallelizable. Requires a unique nonce per encryption. Unauthenticated: needs MAC.\n */\nexport const ctr = /* @__PURE__ */ wrapCipher({ blockSize: 16, nonceLength: 16 }, function aesctr(key, nonce) {\n function processCtr(buf, dst) {\n abytes(buf);\n if (dst !== undefined) {\n abytes(dst);\n if (!isAligned32(dst))\n throw new Error('unaligned destination');\n }\n const xk = expandKeyLE(key);\n const n = copyBytes(nonce); // align + avoid changing\n const toClean = [xk, n];\n if (!isAligned32(buf))\n toClean.push((buf = copyBytes(buf)));\n const out = ctrCounter(xk, n, buf, dst);\n clean(...toClean);\n return out;\n }\n return {\n encrypt: (plaintext, dst) => processCtr(plaintext, dst),\n decrypt: (ciphertext, dst) => processCtr(ciphertext, dst),\n };\n});\nfunction validateBlockDecrypt(data) {\n abytes(data);\n if (data.length % BLOCK_SIZE !== 0) {\n throw new Error('aes-(cbc/ecb).decrypt ciphertext should consist of blocks with size ' + BLOCK_SIZE);\n }\n}\nfunction validateBlockEncrypt(plaintext, pcks5, dst) {\n abytes(plaintext);\n let outLen = plaintext.length;\n const remaining = outLen % BLOCK_SIZE;\n if (!pcks5 && remaining !== 0)\n throw new Error('aec/(cbc-ecb): unpadded plaintext with disabled padding');\n if (!isAligned32(plaintext))\n plaintext = copyBytes(plaintext);\n const b = u32(plaintext);\n if (pcks5) {\n let left = BLOCK_SIZE - remaining;\n if (!left)\n left = BLOCK_SIZE; // if no bytes left, create empty padding block\n outLen = outLen + left;\n }\n dst = getOutput(outLen, dst);\n complexOverlapBytes(plaintext, dst);\n const o = u32(dst);\n return { b, o, out: dst };\n}\nfunction validatePCKS(data, pcks5) {\n if (!pcks5)\n return data;\n const len = data.length;\n if (!len)\n throw new Error('aes/pcks5: empty ciphertext not allowed');\n const lastByte = data[len - 1];\n if (lastByte <= 0 || lastByte > 16)\n throw new Error('aes/pcks5: wrong padding');\n const out = data.subarray(0, -lastByte);\n for (let i = 0; i < lastByte; i++)\n if (data[len - i - 1] !== lastByte)\n throw new Error('aes/pcks5: wrong padding');\n return out;\n}\nfunction padPCKS(left) {\n const tmp = new Uint8Array(16);\n const tmp32 = u32(tmp);\n tmp.set(left);\n const paddingByte = BLOCK_SIZE - left.length;\n for (let i = BLOCK_SIZE - paddingByte; i < BLOCK_SIZE; i++)\n tmp[i] = paddingByte;\n return tmp32;\n}\n/**\n * **ECB** (Electronic Codebook): Deterministic encryption; identical plaintext blocks yield\n * identical ciphertexts. Not secure due to pattern leakage.\n * See [AES Penguin](https://words.filippo.io/the-ecb-penguin/).\n */\nexport const ecb = /* @__PURE__ */ wrapCipher({ blockSize: 16 }, function aesecb(key, opts = {}) {\n const pcks5 = !opts.disablePadding;\n return {\n encrypt(plaintext, dst) {\n const { b, o, out: _out } = validateBlockEncrypt(plaintext, pcks5, dst);\n const xk = expandKeyLE(key);\n let i = 0;\n for (; i + 4 <= b.length;) {\n const { s0, s1, s2, s3 } = encrypt(xk, b[i + 0], b[i + 1], b[i + 2], b[i + 3]);\n ((o[i++] = s0), (o[i++] = s1), (o[i++] = s2), (o[i++] = s3));\n }\n if (pcks5) {\n const tmp32 = padPCKS(plaintext.subarray(i * 4));\n const { s0, s1, s2, s3 } = encrypt(xk, tmp32[0], tmp32[1], tmp32[2], tmp32[3]);\n ((o[i++] = s0), (o[i++] = s1), (o[i++] = s2), (o[i++] = s3));\n }\n clean(xk);\n return _out;\n },\n decrypt(ciphertext, dst) {\n validateBlockDecrypt(ciphertext);\n const xk = expandKeyDecLE(key);\n dst = getOutput(ciphertext.length, dst);\n const toClean = [xk];\n if (!isAligned32(ciphertext))\n toClean.push((ciphertext = copyBytes(ciphertext)));\n complexOverlapBytes(ciphertext, dst);\n const b = u32(ciphertext);\n const o = u32(dst);\n for (let i = 0; i + 4 <= b.length;) {\n const { s0, s1, s2, s3 } = decrypt(xk, b[i + 0], b[i + 1], b[i + 2], b[i + 3]);\n ((o[i++] = s0), (o[i++] = s1), (o[i++] = s2), (o[i++] = s3));\n }\n clean(...toClean);\n return validatePCKS(dst, pcks5);\n },\n };\n});\n/**\n * **CBC** (Cipher Block Chaining): Each plaintext block is XORed with the\n * previous block of ciphertext before encryption.\n * Hard to use: requires proper padding and an IV. Unauthenticated: needs MAC.\n */\nexport const cbc = /* @__PURE__ */ wrapCipher({ blockSize: 16, nonceLength: 16 }, function aescbc(key, iv, opts = {}) {\n const pcks5 = !opts.disablePadding;\n return {\n encrypt(plaintext, dst) {\n const xk = expandKeyLE(key);\n const { b, o, out: _out } = validateBlockEncrypt(plaintext, pcks5, dst);\n let _iv = iv;\n const toClean = [xk];\n if (!isAligned32(_iv))\n toClean.push((_iv = copyBytes(_iv)));\n const n32 = u32(_iv);\n // prettier-ignore\n let s0 = n32[0], s1 = n32[1], s2 = n32[2], s3 = n32[3];\n let i = 0;\n for (; i + 4 <= b.length;) {\n ((s0 ^= b[i + 0]), (s1 ^= b[i + 1]), (s2 ^= b[i + 2]), (s3 ^= b[i + 3]));\n ({ s0, s1, s2, s3 } = encrypt(xk, s0, s1, s2, s3));\n ((o[i++] = s0), (o[i++] = s1), (o[i++] = s2), (o[i++] = s3));\n }\n if (pcks5) {\n const tmp32 = padPCKS(plaintext.subarray(i * 4));\n ((s0 ^= tmp32[0]), (s1 ^= tmp32[1]), (s2 ^= tmp32[2]), (s3 ^= tmp32[3]));\n ({ s0, s1, s2, s3 } = encrypt(xk, s0, s1, s2, s3));\n ((o[i++] = s0), (o[i++] = s1), (o[i++] = s2), (o[i++] = s3));\n }\n clean(...toClean);\n return _out;\n },\n decrypt(ciphertext, dst) {\n validateBlockDecrypt(ciphertext);\n const xk = expandKeyDecLE(key);\n let _iv = iv;\n const toClean = [xk];\n if (!isAligned32(_iv))\n toClean.push((_iv = copyBytes(_iv)));\n const n32 = u32(_iv);\n dst = getOutput(ciphertext.length, dst);\n if (!isAligned32(ciphertext))\n toClean.push((ciphertext = copyBytes(ciphertext)));\n complexOverlapBytes(ciphertext, dst);\n const b = u32(ciphertext);\n const o = u32(dst);\n // prettier-ignore\n let s0 = n32[0], s1 = n32[1], s2 = n32[2], s3 = n32[3];\n for (let i = 0; i + 4 <= b.length;) {\n // prettier-ignore\n const ps0 = s0, ps1 = s1, ps2 = s2, ps3 = s3;\n ((s0 = b[i + 0]), (s1 = b[i + 1]), (s2 = b[i + 2]), (s3 = b[i + 3]));\n const { s0: o0, s1: o1, s2: o2, s3: o3 } = decrypt(xk, s0, s1, s2, s3);\n ((o[i++] = o0 ^ ps0), (o[i++] = o1 ^ ps1), (o[i++] = o2 ^ ps2), (o[i++] = o3 ^ ps3));\n }\n clean(...toClean);\n return validatePCKS(dst, pcks5);\n },\n };\n});\n/**\n * CFB: Cipher Feedback Mode. The input for the block cipher is the previous cipher output.\n * Unauthenticated: needs MAC.\n */\nexport const cfb = /* @__PURE__ */ wrapCipher({ blockSize: 16, nonceLength: 16 }, function aescfb(key, iv) {\n function processCfb(src, isEncrypt, dst) {\n abytes(src);\n const srcLen = src.length;\n dst = getOutput(srcLen, dst);\n if (overlapBytes(src, dst))\n throw new Error('overlapping src and dst not supported.');\n const xk = expandKeyLE(key);\n let _iv = iv;\n const toClean = [xk];\n if (!isAligned32(_iv))\n toClean.push((_iv = copyBytes(_iv)));\n if (!isAligned32(src))\n toClean.push((src = copyBytes(src)));\n const src32 = u32(src);\n const dst32 = u32(dst);\n const next32 = isEncrypt ? dst32 : src32;\n const n32 = u32(_iv);\n // prettier-ignore\n let s0 = n32[0], s1 = n32[1], s2 = n32[2], s3 = n32[3];\n for (let i = 0; i + 4 <= src32.length;) {\n const { s0: e0, s1: e1, s2: e2, s3: e3 } = encrypt(xk, s0, s1, s2, s3);\n dst32[i + 0] = src32[i + 0] ^ e0;\n dst32[i + 1] = src32[i + 1] ^ e1;\n dst32[i + 2] = src32[i + 2] ^ e2;\n dst32[i + 3] = src32[i + 3] ^ e3;\n ((s0 = next32[i++]), (s1 = next32[i++]), (s2 = next32[i++]), (s3 = next32[i++]));\n }\n // leftovers (less than block)\n const start = BLOCK_SIZE * Math.floor(src32.length / BLOCK_SIZE32);\n if (start < srcLen) {\n ({ s0, s1, s2, s3 } = encrypt(xk, s0, s1, s2, s3));\n const buf = u8(new Uint32Array([s0, s1, s2, s3]));\n for (let i = start, pos = 0; i < srcLen; i++, pos++)\n dst[i] = src[i] ^ buf[pos];\n clean(buf);\n }\n clean(...toClean);\n return dst;\n }\n return {\n encrypt: (plaintext, dst) => processCfb(plaintext, true, dst),\n decrypt: (ciphertext, dst) => processCfb(ciphertext, false, dst),\n };\n});\n// TODO: merge with chacha, however gcm has bitLen while chacha has byteLen\nfunction computeTag(fn, isLE, key, data, AAD) {\n const aadLength = AAD ? AAD.length : 0;\n const h = fn.create(key, data.length + aadLength);\n if (AAD)\n h.update(AAD);\n const num = u64Lengths(8 * data.length, 8 * aadLength, isLE);\n h.update(data);\n h.update(num);\n const res = h.digest();\n clean(num);\n return res;\n}\n/**\n * **GCM** (Galois/Counter Mode): Combines CTR mode with polynomial MAC. Efficient and widely used.\n * Not perfect:\n * a) conservative key wear-out is `2**32` (4B) msgs.\n * b) key wear-out under random nonces is even smaller: `2**23` (8M) messages for `2**-50` chance.\n * c) MAC can be forged: see Poly1305 documentation.\n */\nexport const gcm = /* @__PURE__ */ wrapCipher({ blockSize: 16, nonceLength: 12, tagLength: 16, varSizeNonce: true }, function aesgcm(key, nonce, AAD) {\n // NIST 800-38d doesn't enforce minimum nonce length.\n // We enforce 8 bytes for compat with openssl.\n // 12 bytes are recommended. More than 12 bytes would be converted into 12.\n if (nonce.length < 8)\n throw new Error('aes/gcm: invalid nonce length');\n const tagLength = 16;\n function _computeTag(authKey, tagMask, data) {\n const tag = computeTag(ghash, false, authKey, data, AAD);\n for (let i = 0; i < tagMask.length; i++)\n tag[i] ^= tagMask[i];\n return tag;\n }\n function deriveKeys() {\n const xk = expandKeyLE(key);\n const authKey = EMPTY_BLOCK.slice();\n const counter = EMPTY_BLOCK.slice();\n ctr32(xk, false, counter, counter, authKey);\n // NIST 800-38d, page 15: different behavior for 96-bit and non-96-bit nonces\n if (nonce.length === 12) {\n counter.set(nonce);\n }\n else {\n const nonceLen = EMPTY_BLOCK.slice();\n const view = createView(nonceLen);\n view.setBigUint64(8, BigInt(nonce.length * 8), false);\n // ghash(nonce || u64be(0) || u64be(nonceLen*8))\n const g = ghash.create(authKey).update(nonce).update(nonceLen);\n g.digestInto(counter); // digestInto doesn't trigger '.destroy'\n g.destroy();\n }\n const tagMask = ctr32(xk, false, counter, EMPTY_BLOCK);\n return { xk, authKey, counter, tagMask };\n }\n return {\n encrypt(plaintext) {\n const { xk, authKey, counter, tagMask } = deriveKeys();\n const out = new Uint8Array(plaintext.length + tagLength);\n const toClean = [xk, authKey, counter, tagMask];\n if (!isAligned32(plaintext))\n toClean.push((plaintext = copyBytes(plaintext)));\n ctr32(xk, false, counter, plaintext, out.subarray(0, plaintext.length));\n const tag = _computeTag(authKey, tagMask, out.subarray(0, out.length - tagLength));\n toClean.push(tag);\n out.set(tag, plaintext.length);\n clean(...toClean);\n return out;\n },\n decrypt(ciphertext) {\n const { xk, authKey, counter, tagMask } = deriveKeys();\n const toClean = [xk, authKey, tagMask, counter];\n if (!isAligned32(ciphertext))\n toClean.push((ciphertext = copyBytes(ciphertext)));\n const data = ciphertext.subarray(0, -tagLength);\n const passedTag = ciphertext.subarray(-tagLength);\n const tag = _computeTag(authKey, tagMask, data);\n toClean.push(tag);\n if (!equalBytes(tag, passedTag))\n throw new Error('aes/gcm: invalid ghash tag');\n const out = ctr32(xk, false, counter, data);\n clean(...toClean);\n return out;\n },\n };\n});\nconst limit = (name, min, max) => (value) => {\n if (!Number.isSafeInteger(value) || min > value || value > max) {\n const minmax = '[' + min + '..' + max + ']';\n throw new Error('' + name + ': expected value in range ' + minmax + ', got ' + value);\n }\n};\n/**\n * **SIV** (Synthetic IV): GCM with nonce-misuse resistance.\n * Repeating nonces reveal only the fact plaintexts are identical.\n * Also suffers from GCM issues: key wear-out limits & MAC forging.\n * See [RFC 8452](https://www.rfc-editor.org/rfc/rfc8452).\n */\nexport const gcmsiv = /* @__PURE__ */ wrapCipher({ blockSize: 16, nonceLength: 12, tagLength: 16, varSizeNonce: true }, function aessiv(key, nonce, AAD) {\n const tagLength = 16;\n // From RFC 8452: Section 6\n const AAD_LIMIT = limit('AAD', 0, 2 ** 36);\n const PLAIN_LIMIT = limit('plaintext', 0, 2 ** 36);\n const NONCE_LIMIT = limit('nonce', 12, 12);\n const CIPHER_LIMIT = limit('ciphertext', 16, 2 ** 36 + 16);\n abytes(key);\n validateKeyLength(key);\n NONCE_LIMIT(nonce.length);\n if (AAD !== undefined)\n AAD_LIMIT(AAD.length);\n function deriveKeys() {\n const xk = expandKeyLE(key);\n const encKey = new Uint8Array(key.length);\n const authKey = new Uint8Array(16);\n const toClean = [xk, encKey];\n let _nonce = nonce;\n if (!isAligned32(_nonce))\n toClean.push((_nonce = copyBytes(_nonce)));\n const n32 = u32(_nonce);\n // prettier-ignore\n let s0 = 0, s1 = n32[0], s2 = n32[1], s3 = n32[2];\n let counter = 0;\n for (const derivedKey of [authKey, encKey].map(u32)) {\n const d32 = u32(derivedKey);\n for (let i = 0; i < d32.length; i += 2) {\n // aes(u32le(0) || nonce)[:8] || aes(u32le(1) || nonce)[:8] ...\n const { s0: o0, s1: o1 } = encrypt(xk, s0, s1, s2, s3);\n d32[i + 0] = o0;\n d32[i + 1] = o1;\n s0 = ++counter; // increment counter inside state\n }\n }\n const res = { authKey, encKey: expandKeyLE(encKey) };\n // Cleanup\n clean(...toClean);\n return res;\n }\n function _computeTag(encKey, authKey, data) {\n const tag = computeTag(polyval, true, authKey, data, AAD);\n // Compute the expected tag by XORing S_s and the nonce, clearing the\n // most significant bit of the last byte and encrypting with the\n // message-encryption key.\n for (let i = 0; i < 12; i++)\n tag[i] ^= nonce[i];\n tag[15] &= 0x7f; // Clear the highest bit\n // encrypt tag as block\n const t32 = u32(tag);\n // prettier-ignore\n let s0 = t32[0], s1 = t32[1], s2 = t32[2], s3 = t32[3];\n ({ s0, s1, s2, s3 } = encrypt(encKey, s0, s1, s2, s3));\n ((t32[0] = s0), (t32[1] = s1), (t32[2] = s2), (t32[3] = s3));\n return tag;\n }\n // actual decrypt/encrypt of message.\n function processSiv(encKey, tag, input) {\n let block = copyBytes(tag);\n block[15] |= 0x80; // Force highest bit\n const res = ctr32(encKey, true, block, input);\n // Cleanup\n clean(block);\n return res;\n }\n return {\n encrypt(plaintext) {\n PLAIN_LIMIT(plaintext.length);\n const { encKey, authKey } = deriveKeys();\n const tag = _computeTag(encKey, authKey, plaintext);\n const toClean = [encKey, authKey, tag];\n if (!isAligned32(plaintext))\n toClean.push((plaintext = copyBytes(plaintext)));\n const out = new Uint8Array(plaintext.length + tagLength);\n out.set(tag, plaintext.length);\n out.set(processSiv(encKey, tag, plaintext));\n // Cleanup\n clean(...toClean);\n return out;\n },\n decrypt(ciphertext) {\n CIPHER_LIMIT(ciphertext.length);\n const tag = ciphertext.subarray(-tagLength);\n const { encKey, authKey } = deriveKeys();\n const toClean = [encKey, authKey];\n if (!isAligned32(ciphertext))\n toClean.push((ciphertext = copyBytes(ciphertext)));\n const plaintext = processSiv(encKey, tag, ciphertext.subarray(0, -tagLength));\n const expectedTag = _computeTag(encKey, authKey, plaintext);\n toClean.push(expectedTag);\n if (!equalBytes(tag, expectedTag)) {\n clean(...toClean);\n throw new Error('invalid polyval tag');\n }\n // Cleanup\n clean(...toClean);\n return plaintext;\n },\n };\n});\nfunction isBytes32(a) {\n return (a instanceof Uint32Array || (ArrayBuffer.isView(a) && a.constructor.name === 'Uint32Array'));\n}\nfunction encryptBlock(xk, block) {\n abytes(block, 16, 'block');\n if (!isBytes32(xk))\n throw new Error('_encryptBlock accepts result of expandKeyLE');\n const b32 = u32(block);\n let { s0, s1, s2, s3 } = encrypt(xk, b32[0], b32[1], b32[2], b32[3]);\n ((b32[0] = s0), (b32[1] = s1), (b32[2] = s2), (b32[3] = s3));\n return block;\n}\nfunction decryptBlock(xk, block) {\n abytes(block, 16, 'block');\n if (!isBytes32(xk))\n throw new Error('_decryptBlock accepts result of expandKeyLE');\n const b32 = u32(block);\n let { s0, s1, s2, s3 } = decrypt(xk, b32[0], b32[1], b32[2], b32[3]);\n ((b32[0] = s0), (b32[1] = s1), (b32[2] = s2), (b32[3] = s3));\n return block;\n}\n/**\n * AES-W (base for AESKW/AESKWP).\n * Specs: [SP800-38F](https://nvlpubs.nist.gov/nistpubs/SpecialPublications/NIST.SP.800-38F.pdf),\n * [RFC 3394](https://www.rfc-editor.org/rfc/rfc3394),\n * [RFC 5649](https://www.rfc-editor.org/rfc/rfc5649).\n */\nconst AESW = {\n /*\n High-level pseudocode:\n ```\n A: u64 = IV\n out = []\n for (let i=0, ctr = 0; i<6; i++) {\n for (const chunk of chunks(plaintext, 8)) {\n A ^= swapEndianess(ctr++)\n [A, res] = chunks(encrypt(A || chunk), 8);\n out ||= res\n }\n }\n out = A || out\n ```\n Decrypt is the same, but reversed.\n */\n encrypt(kek, out) {\n // Size is limited to 4GB, otherwise ctr will overflow and we'll need to switch to bigints.\n // If you need it larger, open an issue.\n if (out.length >= 2 ** 32)\n throw new Error('plaintext should be less than 4gb');\n const xk = expandKeyLE(kek);\n if (out.length === 16)\n encryptBlock(xk, out);\n else {\n const o32 = u32(out);\n // prettier-ignore\n let a0 = o32[0], a1 = o32[1]; // A\n for (let j = 0, ctr = 1; j < 6; j++) {\n for (let pos = 2; pos < o32.length; pos += 2, ctr++) {\n const { s0, s1, s2, s3 } = encrypt(xk, a0, a1, o32[pos], o32[pos + 1]);\n // A = MSB(64, B) ^ t where t = (n*j)+i\n ((a0 = s0), (a1 = s1 ^ byteSwap(ctr)), (o32[pos] = s2), (o32[pos + 1] = s3));\n }\n }\n ((o32[0] = a0), (o32[1] = a1)); // out = A || out\n }\n xk.fill(0);\n },\n decrypt(kek, out) {\n if (out.length - 8 >= 2 ** 32)\n throw new Error('ciphertext should be less than 4gb');\n const xk = expandKeyDecLE(kek);\n const chunks = out.length / 8 - 1; // first chunk is IV\n if (chunks === 1)\n decryptBlock(xk, out);\n else {\n const o32 = u32(out);\n // prettier-ignore\n let a0 = o32[0], a1 = o32[1]; // A\n for (let j = 0, ctr = chunks * 6; j < 6; j++) {\n for (let pos = chunks * 2; pos >= 1; pos -= 2, ctr--) {\n a1 ^= byteSwap(ctr);\n const { s0, s1, s2, s3 } = decrypt(xk, a0, a1, o32[pos], o32[pos + 1]);\n ((a0 = s0), (a1 = s1), (o32[pos] = s2), (o32[pos + 1] = s3));\n }\n }\n ((o32[0] = a0), (o32[1] = a1));\n }\n xk.fill(0);\n },\n};\nconst AESKW_IV = /* @__PURE__ */ new Uint8Array(8).fill(0xa6); // A6A6A6A6A6A6A6A6\n/**\n * AES-KW (key-wrap). Injects static IV into plaintext, adds counter, encrypts 6 times.\n * Reduces block size from 16 to 8 bytes.\n * For padded version, use aeskwp.\n * [RFC 3394](https://www.rfc-editor.org/rfc/rfc3394/),\n * [NIST.SP.800-38F](https://nvlpubs.nist.gov/nistpubs/SpecialPublications/NIST.SP.800-38F.pdf).\n */\nexport const aeskw = /* @__PURE__ */ wrapCipher({ blockSize: 8 }, (kek) => ({\n encrypt(plaintext) {\n if (!plaintext.length || plaintext.length % 8 !== 0)\n throw new Error('invalid plaintext length');\n if (plaintext.length === 8)\n throw new Error('8-byte keys not allowed in AESKW, use AESKWP instead');\n const out = concatBytes(AESKW_IV, plaintext);\n AESW.encrypt(kek, out);\n return out;\n },\n decrypt(ciphertext) {\n // ciphertext must be at least 24 bytes and a multiple of 8 bytes\n // 24 because should have at least two block (1 iv + 2).\n // Replace with 16 to enable '8-byte keys'\n if (ciphertext.length % 8 !== 0 || ciphertext.length < 3 * 8)\n throw new Error('invalid ciphertext length');\n const out = copyBytes(ciphertext);\n AESW.decrypt(kek, out);\n if (!equalBytes(out.subarray(0, 8), AESKW_IV))\n throw new Error('integrity check failed');\n out.subarray(0, 8).fill(0); // ciphertext.subarray(0, 8) === IV, but we clean it anyway\n return out.subarray(8);\n },\n}));\n/*\nWe don't support 8-byte keys. The rabbit hole:\n\n- Wycheproof says: \"NIST SP 800-38F does not define the wrapping of 8 byte keys.\n RFC 3394 Section 2 on the other hand specifies that 8 byte keys are wrapped\n by directly encrypting one block with AES.\"\n - https://github.com/C2SP/wycheproof/blob/master/doc/key_wrap.md\n - \"RFC 3394 specifies in Section 2, that the input for the key wrap\n algorithm must be at least two blocks and otherwise the constant\n field and key are simply encrypted with ECB as a single block\"\n- What RFC 3394 actually says (in Section 2):\n - \"Before being wrapped, the key data is parsed into n blocks of 64 bits.\n The only restriction the key wrap algorithm places on n is that n be\n at least two\"\n - \"For key data with length less than or equal to 64 bits, the constant\n field used in this specification and the key data form a single\n 128-bit codebook input making this key wrap unnecessary.\"\n- Which means \"assert(n >= 2)\" and \"use something else for 8 byte keys\"\n- NIST SP800-38F actually prohibits 8-byte in \"5.3.1 Mandatory Limits\".\n It states that plaintext for KW should be \"2 to 2^54 -1 semiblocks\".\n- So, where does \"directly encrypt single block with AES\" come from?\n - Not RFC 3394. Pseudocode of key wrap in 2.2 explicitly uses\n loop of 6 for any code path\n - There is a weird W3C spec:\n https://www.w3.org/TR/2002/REC-xmlenc-core-20021210/Overview.html#kw-aes128\n - This spec is outdated, as admitted by Wycheproof authors\n - There is RFC 5649 for padded key wrap, which is padding construction on\n top of AESKW. In '4.1.2' it says: \"If the padded plaintext contains exactly\n eight octets, then prepend the AIV as defined in Section 3 above to P[1] and\n encrypt the resulting 128-bit block using AES in ECB mode [Modes] with key\n K (the KEK). In this case, the output is two 64-bit blocks C[0] and C[1]:\"\n - Browser subtle crypto is actually crashes on wrapping keys less than 16 bytes:\n `Error: error:1C8000E6:Provider routines::invalid input length] { opensslErrorStack: [ 'error:030000BD:digital envelope routines::update error' ]`\n\nIn the end, seems like a bug in Wycheproof.\nThe 8-byte check can be easily disabled inside of AES_W.\n*/\nconst AESKWP_IV = 0xa65959a6; // single u32le value\n/**\n * AES-KW, but with padding and allows random keys.\n * Second u32 of IV is used as counter for length.\n * [RFC 5649](https://www.rfc-editor.org/rfc/rfc5649)\n */\nexport const aeskwp = /* @__PURE__ */ wrapCipher({ blockSize: 8 }, (kek) => ({\n encrypt(plaintext) {\n if (!plaintext.length)\n throw new Error('invalid plaintext length');\n const padded = Math.ceil(plaintext.length / 8) * 8;\n const out = new Uint8Array(8 + padded);\n out.set(plaintext, 8);\n const out32 = u32(out);\n out32[0] = AESKWP_IV;\n out32[1] = byteSwap(plaintext.length);\n AESW.encrypt(kek, out);\n return out;\n },\n decrypt(ciphertext) {\n // 16 because should have at least one block\n if (ciphertext.length < 16)\n throw new Error('invalid ciphertext length');\n const out = copyBytes(ciphertext);\n const o32 = u32(out);\n AESW.decrypt(kek, out);\n const len = byteSwap(o32[1]) >>> 0;\n const padded = Math.ceil(len / 8) * 8;\n if (o32[0] !== AESKWP_IV || out.length - 8 !== padded)\n throw new Error('integrity check failed');\n for (let i = len; i < padded; i++)\n if (out[8 + i] !== 0)\n throw new Error('integrity check failed');\n out.subarray(0, 8).fill(0); // ciphertext.subarray(0, 8) === IV, but we clean it anyway\n return out.subarray(8, 8 + len);\n },\n}));\nclass _AesCtrDRBG {\n blockLen;\n key;\n nonce;\n state;\n reseedCnt;\n constructor(keyLen, seed, personalization) {\n this.blockLen = ctr.blockSize;\n const keyLenBytes = keyLen / 8;\n const nonceLen = 16;\n this.state = new Uint8Array(keyLenBytes + nonceLen);\n this.key = this.state.subarray(0, keyLenBytes);\n this.nonce = this.state.subarray(keyLenBytes, keyLenBytes + nonceLen);\n this.reseedCnt = 1;\n incBytes(this.nonce, false, 1);\n this.addEntropy(seed, personalization);\n }\n update(data) {\n // cannot re-use state here, because we will wipe current key\n ctr(this.key, this.nonce).encrypt(new Uint8Array(this.state.length), this.state);\n if (data) {\n abytes(data);\n for (let i = 0; i < data.length; i++)\n this.state[i] ^= data[i];\n }\n incBytes(this.nonce, false, 1);\n }\n addEntropy(seed, info) {\n abytes(seed, this.state.length, 'seed');\n const _seed = seed.slice();\n if (info) {\n abytes(info);\n if (info.length > _seed.length)\n throw new Error('info length is too big');\n for (let i = 0; i < info.length; i++)\n _seed[i] ^= info[i];\n }\n this.update(_seed);\n _seed.fill(0);\n this.reseedCnt = 1;\n }\n randomBytes(len, info) {\n anumber(len);\n if (this.reseedCnt++ >= 2 ** 48)\n throw new Error('entropy exhausted');\n if (info)\n this.update(info);\n const res = new Uint8Array(len);\n ctr(this.key, this.nonce).encrypt(res, res);\n incBytes(this.nonce, false, Math.ceil(len / this.blockLen));\n this.update(info);\n return res;\n }\n clean() {\n this.state.fill(0);\n this.reseedCnt = 0;\n }\n}\nconst createAesDrbg = (keyLen) => {\n return (seed, personalization = undefined) => new _AesCtrDRBG(keyLen, seed, personalization);\n};\n/**\n * AES-CTR DRBG 128-bit - CSPRNG (cryptographically secure pseudorandom number generator).\n * It's best to limit usage to non-production, non-critical cases: for example, test-only.\n */\nexport const rngAesCtrDrbg128 = /* @__PURE__ */ createAesDrbg(128);\n/**\n * AES-CTR DRBG 256-bit - CSPRNG (cryptographically secure pseudorandom number generator).\n * It's best to limit usage to non-production, non-critical cases: for example, test-only.\n */\nexport const rngAesCtrDrbg256 = /* @__PURE__ */ createAesDrbg(256);\n//#region CMAC\n/**\n * Left-shift by one bit and conditionally XOR with 0x87:\n * ```\n * if MSB(L) is equal to 0\n * then K1 := L << 1;\n * else K1 := (L << 1) XOR const_Rb;\n * ```\n *\n * Specs: [RFC 4493, Section 2.3](https://www.rfc-editor.org/rfc/rfc4493.html#section-2.3),\n * [RFC 5297 Section 2.3](https://datatracker.ietf.org/doc/html/rfc5297.html#section-2.3)\n *\n * @returns modified `block` (for chaining)\n */\nfunction dbl(block) {\n let carry = 0;\n // Left shift by 1 bit\n for (let i = BLOCK_SIZE - 1; i >= 0; i--) {\n const newCarry = (block[i] & 0x80) >>> 7;\n block[i] = (block[i] << 1) | carry;\n carry = newCarry;\n }\n // XOR with 0x87 if there was a carry from the most significant bit\n if (carry) {\n block[BLOCK_SIZE - 1] ^= 0x87;\n }\n return block;\n}\n/**\n * `a XOR b`, running in-site on `a`.\n * @param a left operand and output\n * @param b right operand\n * @returns `a` (for chaining)\n */\nfunction xorBlock(a, b) {\n if (a.length !== b.length)\n throw new Error('xorBlock: blocks must have same length');\n for (let i = 0; i < a.length; i++) {\n a[i] = a[i] ^ b[i];\n }\n return a;\n}\n/**\n * xorend as defined in [RFC 5297 Section 2.1](https://datatracker.ietf.org/doc/html/rfc5297.html#section-2.1).\n *\n * ```\n * leftmost(A, len(A)-len(B)) || (rightmost(A, len(B)) xor B)\n * ```\n */\nfunction xorend(a, b) {\n if (b.length > a.length) {\n throw new Error('xorend: len(B) must be less than or equal to len(A)');\n }\n // keep leftmost part of `a` unchanged\n // and xor only the rightmost part:\n const offset = a.length - b.length;\n for (let i = 0; i < b.length; i++) {\n a[offset + i] = a[offset + i] ^ b[i];\n }\n return a;\n}\n/**\n * Internal CMAC class.\n */\nclass _CMAC {\n buffer;\n destroyed;\n k1;\n k2;\n xk;\n constructor(key) {\n abytes(key);\n validateKeyLength(key);\n this.xk = expandKeyLE(key);\n this.buffer = new Uint8Array(0);\n this.destroyed = false;\n // L = AES_encrypt(K, const_Zero)\n const L = new Uint8Array(BLOCK_SIZE);\n encryptBlock(this.xk, L);\n // Generate subkeys K1 and K2 from the main key according to\n // [RFC 4493, Section 2.3](https://www.rfc-editor.org/rfc/rfc4493.html#section-2.3)\n // K1\n this.k1 = dbl(L);\n this.k2 = dbl(new Uint8Array(this.k1));\n }\n update(data) {\n const { destroyed, buffer } = this;\n if (destroyed)\n throw new Error('CMAC instance was destroyed');\n abytes(data);\n const newBuffer = new Uint8Array(buffer.length + data.length);\n newBuffer.set(buffer);\n newBuffer.set(data, buffer.length);\n this.buffer = newBuffer;\n return this;\n }\n // see https://www.rfc-editor.org/rfc/rfc4493.html#section-2.4\n digest() {\n if (this.destroyed)\n throw new Error('CMAC instance was destroyed');\n const { buffer } = this;\n const msgLen = buffer.length;\n // Step 2:\n let n = Math.ceil(msgLen / BLOCK_SIZE); // n := ceil(len/const_Bsize);\n // Step 3:\n let flag; // denoting if last block is complete or not\n if (n === 0) {\n n = 1;\n flag = false;\n }\n else {\n flag = msgLen % BLOCK_SIZE === 0; // if len mod const_Bsize is 0\n }\n // Step 4:\n const lastBlockStart = (n - 1) * BLOCK_SIZE;\n const lastBlockData = buffer.subarray(lastBlockStart);\n let m_last;\n if (flag) {\n // M_last := M_n XOR K1;\n m_last = xorBlock(new Uint8Array(lastBlockData), this.k1);\n }\n else {\n // M_last := padding(M_n) XOR K2;\n //\n // [...] padding(x) is the concatenation of x and a single '1',\n // followed by the minimum number of '0's, so that the total length is\n // equal to 128 bits.\n const padded = new Uint8Array(BLOCK_SIZE);\n padded.set(lastBlockData);\n padded[lastBlockData.length] = 0x80; // single '1' bit\n m_last = xorBlock(padded, this.k2);\n }\n // Step 5:\n let x = new Uint8Array(BLOCK_SIZE); // X := const_Zero;\n // Step 6:\n for (let i = 0; i < n - 1; i++) {\n const m_i = buffer.subarray(i * BLOCK_SIZE, (i + 1) * BLOCK_SIZE); // M_i\n xorBlock(x, m_i); // Y := X XOR M_i;\n encryptBlock(this.xk, x); // X := AES-128(K,Y);\n }\n // Step 7:\n xorBlock(x, m_last); // Y := M_last XOR X;\n encryptBlock(this.xk, x); // T := AES-128(K,Y);\n // cleanup:\n clean(m_last);\n return x; // T\n }\n destroy() {\n const { buffer, destroyed, xk, k1, k2 } = this;\n if (destroyed)\n return;\n this.destroyed = true;\n clean(buffer, xk, k1, k2);\n }\n}\n/**\n * AES-CMAC (Cipher-based Message Authentication Code).\n * Specs: [RFC 4493](https://www.rfc-editor.org/rfc/rfc4493.html).\n */\nexport const cmac = (key, message) => new _CMAC(key).update(message).digest();\ncmac.create = (key) => new _CMAC(key);\n/**\n * S2V (Synthetic Initialization Vector) function as described in [RFC 5297 Section 2.4](https://datatracker.ietf.org/doc/html/rfc5297.html#section-2.4).\n *\n * ```\n * S2V(K, S1, ..., Sn) {\n * if n = 0 then\n * return V = AES-CMAC(K, <one>)\n * fi\n * D = AES-CMAC(K, <zero>)\n * for i = 1 to n-1 do\n * D = dbl(D) xor AES-CMAC(K, Si)\n * done\n * if len(Sn) >= 128 then\n * T = Sn xorend D\n * else\n * T = dbl(D) xor pad(Sn)\n * fi\n * return V = AES-CMAC(K, T)\n * }\n * ```\n *\n * S2V takes a key and a vector of strings S1, S2, ..., Sn and returns a 128-bit string.\n * The S2V function is used to generate a synthetic IV for AES-SIV.\n *\n * @param key - AES key (128, 192, or 256 bits)\n * @param strings - Array of byte arrays to process\n * @returns 128-bit synthetic IV\n */\nfunction s2v(key, strings) {\n validateKeyLength(key);\n const len = strings.length;\n if (len > 127) {\n // see https://datatracker.ietf.org/doc/html/rfc5297.html#section-7\n throw new Error('s2v: number of input strings must be less than or equal to 127');\n }\n if (len === 0)\n return cmac(key, ONE_BLOCK);\n // D = AES-CMAC(K, <zero>)\n let d = cmac(key, EMPTY_BLOCK);\n // for i = 1 to n-1 do\n // D = dbl(D) xor AES-CMAC(K, Si)\n for (let i = 0; i < len - 1; i++) {\n dbl(d);\n const cmacResult = cmac(key, strings[i]);\n xorBlock(d, cmacResult);\n clean(cmacResult);\n }\n const s_n = strings[len - 1];\n let t;\n // if len(Sn) >= 128 then\n if (s_n.byteLength >= BLOCK_SIZE) {\n // T = Sn xorend D\n t = xorend(Uint8Array.from(s_n), d);\n }\n else {\n // pad(Sn):\n const paddedSn = new Uint8Array(BLOCK_SIZE);\n paddedSn.set(s_n);\n paddedSn[s_n.length] = 0x80; // padding: 0x80 followed by zeros\n // T = dbl(D) xor pad(Sn)\n t = xorBlock(dbl(d), paddedSn);\n clean(paddedSn);\n }\n // V = AES-CMAC(K, T)\n const result = cmac(key, t);\n clean(d, t);\n return result;\n}\n/** Use `gcmsiv` or `aessiv`. */\nexport const siv = () => {\n throw new Error('\"siv\" from v1 is now \"gcmsiv\"');\n};\n/**\n * **SIV**: Synthetic Initialization Vector (SIV) Authenticated Encryption\n * Nonce is derived from the plaintext and AAD using the S2V function.\n * See [RFC 5297](https://datatracker.ietf.org/doc/html/rfc5297.html).\n */\nexport const aessiv = /* @__PURE__ */ wrapCipher({ blockSize: 16, tagLength: 16 }, function aessiv(key, ...AAD) {\n // From RFC 5297: Section 6.1, 6.2, 6.3:\n const PLAIN_LIMIT = limit('plaintext', 0, 2 ** 132);\n const CIPHER_LIMIT = limit('ciphertext', 16, 2 ** 132 + 16);\n if (AAD.length > 126) {\n // see https://datatracker.ietf.org/doc/html/rfc5297.html#section-7\n throw new Error('\"AAD\" number of elements must be less than or equal to 126');\n }\n AAD.forEach((aad) => abytes(aad));\n abytes(key);\n if (![32, 48, 64].includes(key.length))\n throw new Error('\"aes key\" expected Uint8Array of length 32/48/64, got length=' + key.length);\n // The key is split into equal halves, K1 = leftmost(K, len(K)/2) and\n // K2 = rightmost(K, len(K)/2). K1 is used for S2V and K2 is used for CTR.\n const k1 = key.subarray(0, key.length / 2);\n const k2 = key.subarray(key.length / 2);\n return {\n // https://datatracker.ietf.org/doc/html/rfc5297.html#section-2.6\n encrypt(plaintext) {\n PLAIN_LIMIT(plaintext.length);\n const v = s2v(k1, [...AAD, plaintext]);\n // clear out the 31st and 63rd (rightmost) bit:\n const q = Uint8Array.from(v);\n q[8] &= 0x7f;\n q[12] &= 0x7f;\n // encrypt:\n const c = ctr(k2, q).encrypt(plaintext);\n return concatBytes(v, c);\n },\n // https://datatracker.ietf.org/doc/html/rfc5297.html#section-2.7\n decrypt(ciphertext) {\n CIPHER_LIMIT(ciphertext.length);\n const v = ciphertext.subarray(0, BLOCK_SIZE);\n const c = ciphertext.subarray(BLOCK_SIZE);\n // clear out the 31st and 63rd (rightmost) bit:\n const q = Uint8Array.from(v);\n q[8] &= 0x7f;\n q[12] &= 0x7f;\n // decrypt:\n const p = ctr(k2, q).decrypt(c);\n // verify tag:\n const t = s2v(k1, [...AAD, p]);\n if (equalBytes(t, v)) {\n return p;\n }\n else {\n throw new Error('invalid siv tag');\n }\n },\n };\n});\n//#endregion\n/** Unsafe low-level internal methods. May change at any time. */\nexport const unsafe = {\n expandKeyLE,\n expandKeyDecLE,\n encrypt,\n decrypt,\n encryptBlock,\n decryptBlock,\n ctrCounter,\n ctr32,\n dbl,\n xorBlock,\n xorend,\n s2v,\n};\n//# sourceMappingURL=aes.js.map","/**\n * Basic utils for ARX (add-rotate-xor) salsa and chacha ciphers.\n\nRFC8439 requires multi-step cipher stream, where\nauthKey starts with counter: 0, actual msg with counter: 1.\n\nFor this, we need a way to re-use nonce / counter:\n\n const counter = new Uint8Array(4);\n chacha(..., counter, ...); // counter is now 1\n chacha(..., counter, ...); // counter is now 2\n\nThis is complicated:\n\n- 32-bit counters are enough, no need for 64-bit: max ArrayBuffer size in JS is 4GB\n- Original papers don't allow mutating counters\n- Counter overflow is undefined [^1]\n- Idea A: allow providing (nonce | counter) instead of just nonce, re-use it\n- Caveat: Cannot be re-used through all cases:\n- * chacha has (counter | nonce)\n- * xchacha has (nonce16 | counter | nonce16)\n- Idea B: separate nonce / counter and provide separate API for counter re-use\n- Caveat: there are different counter sizes depending on an algorithm.\n- salsa & chacha also differ in structures of key & sigma:\n salsa20: s[0] | k(4) | s[1] | nonce(2) | cnt(2) | s[2] | k(4) | s[3]\n chacha: s(4) | k(8) | cnt(1) | nonce(3)\n chacha20orig: s(4) | k(8) | cnt(2) | nonce(2)\n- Idea C: helper method such as `setSalsaState(key, nonce, sigma, data)`\n- Caveat: we can't re-use counter array\n\nxchacha [^2] uses the subkey and remaining 8 byte nonce with ChaCha20 as normal\n(prefixed by 4 NUL bytes, since [RFC8439] specifies a 12-byte nonce).\n\n[^1]: https://mailarchive.ietf.org/arch/msg/cfrg/gsOnTJzcbgG6OqD8Sc0GO5aR_tU/\n[^2]: https://datatracker.ietf.org/doc/html/draft-irtf-cfrg-xchacha#appendix-A.2\n\n * @module\n */\nimport { abool, abytes, anumber, checkOpts, clean, copyBytes, randomBytes, u32, } from \"./utils.js\";\n// Replaces `TextEncoder`, which is not available in all environments\nconst encodeStr = (str) => Uint8Array.from(str.split(''), (c) => c.charCodeAt(0));\nconst sigma16 = encodeStr('expand 16-byte k');\nconst sigma32 = encodeStr('expand 32-byte k');\nconst sigma16_32 = u32(sigma16);\nconst sigma32_32 = u32(sigma32);\n/** Rotate left. */\nexport function rotl(a, b) {\n return (a << b) | (a >>> (32 - b));\n}\n// Is byte array aligned to 4 byte offset (u32)?\nfunction isAligned32(b) {\n return b.byteOffset % 4 === 0;\n}\n// Salsa and Chacha block length is always 512-bit\nconst BLOCK_LEN = 64;\nconst BLOCK_LEN32 = 16;\n// new Uint32Array([2**32]) // => Uint32Array(1) [ 0 ]\n// new Uint32Array([2**32-1]) // => Uint32Array(1) [ 4294967295 ]\nconst MAX_COUNTER = 2 ** 32 - 1;\nconst U32_EMPTY = Uint32Array.of();\nfunction runCipher(core, sigma, key, nonce, data, output, counter, rounds) {\n const len = data.length;\n const block = new Uint8Array(BLOCK_LEN);\n const b32 = u32(block);\n // Make sure that buffers aligned to 4 bytes\n const isAligned = isAligned32(data) && isAligned32(output);\n const d32 = isAligned ? u32(data) : U32_EMPTY;\n const o32 = isAligned ? u32(output) : U32_EMPTY;\n for (let pos = 0; pos < len; counter++) {\n core(sigma, key, nonce, b32, counter, rounds);\n if (counter >= MAX_COUNTER)\n throw new Error('arx: counter overflow');\n const take = Math.min(BLOCK_LEN, len - pos);\n // aligned to 4 bytes\n if (isAligned && take === BLOCK_LEN) {\n const pos32 = pos / 4;\n if (pos % 4 !== 0)\n throw new Error('arx: invalid block position');\n for (let j = 0, posj; j < BLOCK_LEN32; j++) {\n posj = pos32 + j;\n o32[posj] = d32[posj] ^ b32[j];\n }\n pos += BLOCK_LEN;\n continue;\n }\n for (let j = 0, posj; j < take; j++) {\n posj = pos + j;\n output[posj] = data[posj] ^ block[j];\n }\n pos += take;\n }\n}\n/** Creates ARX-like (ChaCha, Salsa) cipher stream from core function. */\nexport function createCipher(core, opts) {\n const { allowShortKeys, extendNonceFn, counterLength, counterRight, rounds } = checkOpts({ allowShortKeys: false, counterLength: 8, counterRight: false, rounds: 20 }, opts);\n if (typeof core !== 'function')\n throw new Error('core must be a function');\n anumber(counterLength);\n anumber(rounds);\n abool(counterRight);\n abool(allowShortKeys);\n return (key, nonce, data, output, counter = 0) => {\n abytes(key, undefined, 'key');\n abytes(nonce, undefined, 'nonce');\n abytes(data, undefined, 'data');\n const len = data.length;\n if (output === undefined)\n output = new Uint8Array(len);\n abytes(output, undefined, 'output');\n anumber(counter);\n if (counter < 0 || counter >= MAX_COUNTER)\n throw new Error('arx: counter overflow');\n if (output.length < len)\n throw new Error(`arx: output (${output.length}) is shorter than data (${len})`);\n const toClean = [];\n // Key & sigma\n // key=16 -> sigma16, k=key|key\n // key=32 -> sigma32, k=key\n let l = key.length;\n let k;\n let sigma;\n if (l === 32) {\n toClean.push((k = copyBytes(key)));\n sigma = sigma32_32;\n }\n else if (l === 16 && allowShortKeys) {\n k = new Uint8Array(32);\n k.set(key);\n k.set(key, 16);\n sigma = sigma16_32;\n toClean.push(k);\n }\n else {\n abytes(key, 32, 'arx key');\n throw new Error('invalid key size');\n // throw new Error(`\"arx key\" expected Uint8Array of length 32, got length=${l}`);\n }\n // Nonce\n // salsa20: 8 (8-byte counter)\n // chacha20orig: 8 (8-byte counter)\n // chacha20: 12 (4-byte counter)\n // xsalsa20: 24 (16 -> hsalsa, 8 -> old nonce)\n // xchacha20: 24 (16 -> hchacha, 8 -> old nonce)\n // Align nonce to 4 bytes\n if (!isAligned32(nonce))\n toClean.push((nonce = copyBytes(nonce)));\n const k32 = u32(k);\n // hsalsa & hchacha: handle extended nonce\n if (extendNonceFn) {\n if (nonce.length !== 24)\n throw new Error(`arx: extended nonce must be 24 bytes`);\n extendNonceFn(sigma, k32, u32(nonce.subarray(0, 16)), k32);\n nonce = nonce.subarray(16);\n }\n // Handle nonce counter\n const nonceNcLen = 16 - counterLength;\n if (nonceNcLen !== nonce.length)\n throw new Error(`arx: nonce must be ${nonceNcLen} or 16 bytes`);\n // Pad counter when nonce is 64 bit\n if (nonceNcLen !== 12) {\n const nc = new Uint8Array(12);\n nc.set(nonce, counterRight ? 0 : 12 - nonce.length);\n nonce = nc;\n toClean.push(nonce);\n }\n const n32 = u32(nonce);\n runCipher(core, sigma, k32, n32, data, output, counter, rounds);\n clean(...toClean);\n return output;\n };\n}\n/** Internal class which wraps chacha20 or chacha8 to create CSPRNG. */\nexport class _XorStreamPRG {\n blockLen;\n keyLen;\n nonceLen;\n state;\n buf;\n key;\n nonce;\n pos;\n ctr;\n cipher;\n constructor(cipher, blockLen, keyLen, nonceLen, seed) {\n this.cipher = cipher;\n this.blockLen = blockLen;\n this.keyLen = keyLen;\n this.nonceLen = nonceLen;\n this.state = new Uint8Array(this.keyLen + this.nonceLen);\n this.reseed(seed);\n this.ctr = 0;\n this.pos = this.blockLen;\n this.buf = new Uint8Array(this.blockLen);\n this.key = this.state.subarray(0, this.keyLen);\n this.nonce = this.state.subarray(this.keyLen);\n }\n reseed(seed) {\n abytes(seed);\n if (!seed || seed.length === 0)\n throw new Error('entropy required');\n for (let i = 0; i < seed.length; i++)\n this.state[i % this.state.length] ^= seed[i];\n this.ctr = 0;\n this.pos = this.blockLen;\n }\n addEntropy(seed) {\n this.state.set(this.randomBytes(this.state.length));\n this.reseed(seed);\n }\n randomBytes(len) {\n anumber(len);\n if (len === 0)\n return new Uint8Array(0);\n const out = new Uint8Array(len);\n let outPos = 0;\n // Leftovers\n if (this.pos < this.blockLen) {\n const take = Math.min(len, this.blockLen - this.pos);\n out.set(this.buf.subarray(this.pos, this.pos + take), 0);\n this.pos += take;\n outPos += take;\n if (outPos === len)\n return out; // fast path\n }\n // Full blocks directly to out\n const blocks = Math.floor((len - outPos) / this.blockLen);\n if (blocks > 0) {\n const blockBytes = blocks * this.blockLen;\n const b = out.subarray(outPos, outPos + blockBytes);\n this.cipher(this.key, this.nonce, b, b, this.ctr);\n this.ctr += blocks;\n outPos += blockBytes;\n }\n // Save leftovers\n const left = len - outPos;\n if (left > 0) {\n this.buf.fill(0);\n // NOTE: cipher will handle overflow\n this.cipher(this.key, this.nonce, this.buf, this.buf, this.ctr++);\n out.set(this.buf.subarray(0, left), outPos);\n this.pos = left;\n }\n return out;\n }\n clone() {\n return new _XorStreamPRG(this.cipher, this.blockLen, this.keyLen, this.nonceLen, this.randomBytes(this.state.length));\n }\n clean() {\n this.pos = 0;\n this.ctr = 0;\n this.buf.fill(0);\n this.state.fill(0);\n }\n}\nexport const createPRG = (cipher, blockLen, keyLen, nonceLen) => {\n return (seed = randomBytes(32)) => new _XorStreamPRG(cipher, blockLen, keyLen, nonceLen, seed);\n};\n//# sourceMappingURL=_arx.js.map","/**\n * Poly1305 ([PDF](https://cr.yp.to/mac/poly1305-20050329.pdf),\n * [wiki](https://en.wikipedia.org/wiki/Poly1305))\n * is a fast and parallel secret-key message-authentication code suitable for\n * a wide variety of applications. It was standardized in\n * [RFC 8439](https://www.rfc-editor.org/rfc/rfc8439) and is now used in TLS 1.3.\n *\n * Polynomial MACs are not perfect for every situation:\n * they lack Random Key Robustness: the MAC can be forged, and can't be used in PAKE schemes.\n * See [invisible salamanders attack](https://keymaterial.net/2020/09/07/invisible-salamanders-in-aes-gcm-siv/).\n * To combat invisible salamanders, `hash(key)` can be included in ciphertext,\n * however, this would violate ciphertext indistinguishability:\n * an attacker would know which key was used - so `HKDF(key, i)`\n * could be used instead.\n *\n * Check out [original website](https://cr.yp.to/mac.html).\n * Based on Public Domain [poly1305-donna](https://github.com/floodyberry/poly1305-donna).\n * @module\n */\n// prettier-ignore\nimport { abytes, aexists, aoutput, bytesToHex, clean, concatBytes, copyBytes, hexToNumber, numberToBytesBE } from \"./utils.js\";\nfunction u8to16(a, i) {\n return (a[i++] & 0xff) | ((a[i++] & 0xff) << 8);\n}\nfunction bytesToNumberLE(bytes) {\n return hexToNumber(bytesToHex(Uint8Array.from(bytes).reverse()));\n}\n/** Small version of `poly1305` without loop unrolling. Unused, provided for auditability. */\nfunction poly1305_small(msg, key) {\n abytes(msg);\n abytes(key, 32, 'key');\n const POW_2_130_5 = BigInt(2) ** BigInt(130) - BigInt(5); // 2^130-5\n const POW_2_128_1 = BigInt(2) ** BigInt(128) - BigInt(1); // 2^128-1\n const CLAMP_R = BigInt('0x0ffffffc0ffffffc0ffffffc0fffffff');\n const r = bytesToNumberLE(key.subarray(0, 16)) & CLAMP_R;\n const s = bytesToNumberLE(key.subarray(16));\n // Process by 16 byte chunks\n let acc = BigInt(0);\n for (let i = 0; i < msg.length; i += 16) {\n const m = msg.subarray(i, i + 16);\n const n = bytesToNumberLE(m) | (BigInt(1) << BigInt(8 * m.length));\n acc = ((acc + n) * r) % POW_2_130_5;\n }\n const res = (acc + s) & POW_2_128_1;\n return numberToBytesBE(res, 16).reverse(); // LE\n}\n// Can be used to replace `computeTag` in chacha.ts. Unused, provided for auditability.\n// @ts-expect-error\nfunction poly1305_computeTag_small(authKey, lengths, ciphertext, AAD) {\n const res = [];\n const updatePadded2 = (msg) => {\n res.push(msg);\n const leftover = msg.length % 16;\n if (leftover)\n res.push(new Uint8Array(16).slice(leftover));\n };\n if (AAD)\n updatePadded2(AAD);\n updatePadded2(ciphertext);\n res.push(lengths);\n return poly1305_small(concatBytes(...res), authKey);\n}\n/** Poly1305 class. Prefer poly1305() function instead. */\nexport class Poly1305 {\n blockLen = 16;\n outputLen = 16;\n buffer = new Uint8Array(16);\n r = new Uint16Array(10); // Allocating 1 array with .subarray() here is slower than 3\n h = new Uint16Array(10);\n pad = new Uint16Array(8);\n pos = 0;\n finished = false;\n // Can be speed-up using BigUint64Array, at the cost of complexity\n constructor(key) {\n key = copyBytes(abytes(key, 32, 'key'));\n const t0 = u8to16(key, 0);\n const t1 = u8to16(key, 2);\n const t2 = u8to16(key, 4);\n const t3 = u8to16(key, 6);\n const t4 = u8to16(key, 8);\n const t5 = u8to16(key, 10);\n const t6 = u8to16(key, 12);\n const t7 = u8to16(key, 14);\n // https://github.com/floodyberry/poly1305-donna/blob/e6ad6e091d30d7f4ec2d4f978be1fcfcbce72781/poly1305-donna-16.h#L47\n this.r[0] = t0 & 0x1fff;\n this.r[1] = ((t0 >>> 13) | (t1 << 3)) & 0x1fff;\n this.r[2] = ((t1 >>> 10) | (t2 << 6)) & 0x1f03;\n this.r[3] = ((t2 >>> 7) | (t3 << 9)) & 0x1fff;\n this.r[4] = ((t3 >>> 4) | (t4 << 12)) & 0x00ff;\n this.r[5] = (t4 >>> 1) & 0x1ffe;\n this.r[6] = ((t4 >>> 14) | (t5 << 2)) & 0x1fff;\n this.r[7] = ((t5 >>> 11) | (t6 << 5)) & 0x1f81;\n this.r[8] = ((t6 >>> 8) | (t7 << 8)) & 0x1fff;\n this.r[9] = (t7 >>> 5) & 0x007f;\n for (let i = 0; i < 8; i++)\n this.pad[i] = u8to16(key, 16 + 2 * i);\n }\n process(data, offset, isLast = false) {\n const hibit = isLast ? 0 : 1 << 11;\n const { h, r } = this;\n const r0 = r[0];\n const r1 = r[1];\n const r2 = r[2];\n const r3 = r[3];\n const r4 = r[4];\n const r5 = r[5];\n const r6 = r[6];\n const r7 = r[7];\n const r8 = r[8];\n const r9 = r[9];\n const t0 = u8to16(data, offset + 0);\n const t1 = u8to16(data, offset + 2);\n const t2 = u8to16(data, offset + 4);\n const t3 = u8to16(data, offset + 6);\n const t4 = u8to16(data, offset + 8);\n const t5 = u8to16(data, offset + 10);\n const t6 = u8to16(data, offset + 12);\n const t7 = u8to16(data, offset + 14);\n let h0 = h[0] + (t0 & 0x1fff);\n let h1 = h[1] + (((t0 >>> 13) | (t1 << 3)) & 0x1fff);\n let h2 = h[2] + (((t1 >>> 10) | (t2 << 6)) & 0x1fff);\n let h3 = h[3] + (((t2 >>> 7) | (t3 << 9)) & 0x1fff);\n let h4 = h[4] + (((t3 >>> 4) | (t4 << 12)) & 0x1fff);\n let h5 = h[5] + ((t4 >>> 1) & 0x1fff);\n let h6 = h[6] + (((t4 >>> 14) | (t5 << 2)) & 0x1fff);\n let h7 = h[7] + (((t5 >>> 11) | (t6 << 5)) & 0x1fff);\n let h8 = h[8] + (((t6 >>> 8) | (t7 << 8)) & 0x1fff);\n let h9 = h[9] + ((t7 >>> 5) | hibit);\n let c = 0;\n let d0 = c + h0 * r0 + h1 * (5 * r9) + h2 * (5 * r8) + h3 * (5 * r7) + h4 * (5 * r6);\n c = d0 >>> 13;\n d0 &= 0x1fff;\n d0 += h5 * (5 * r5) + h6 * (5 * r4) + h7 * (5 * r3) + h8 * (5 * r2) + h9 * (5 * r1);\n c += d0 >>> 13;\n d0 &= 0x1fff;\n let d1 = c + h0 * r1 + h1 * r0 + h2 * (5 * r9) + h3 * (5 * r8) + h4 * (5 * r7);\n c = d1 >>> 13;\n d1 &= 0x1fff;\n d1 += h5 * (5 * r6) + h6 * (5 * r5) + h7 * (5 * r4) + h8 * (5 * r3) + h9 * (5 * r2);\n c += d1 >>> 13;\n d1 &= 0x1fff;\n let d2 = c + h0 * r2 + h1 * r1 + h2 * r0 + h3 * (5 * r9) + h4 * (5 * r8);\n c = d2 >>> 13;\n d2 &= 0x1fff;\n d2 += h5 * (5 * r7) + h6 * (5 * r6) + h7 * (5 * r5) + h8 * (5 * r4) + h9 * (5 * r3);\n c += d2 >>> 13;\n d2 &= 0x1fff;\n let d3 = c + h0 * r3 + h1 * r2 + h2 * r1 + h3 * r0 + h4 * (5 * r9);\n c = d3 >>> 13;\n d3 &= 0x1fff;\n d3 += h5 * (5 * r8) + h6 * (5 * r7) + h7 * (5 * r6) + h8 * (5 * r5) + h9 * (5 * r4);\n c += d3 >>> 13;\n d3 &= 0x1fff;\n let d4 = c + h0 * r4 + h1 * r3 + h2 * r2 + h3 * r1 + h4 * r0;\n c = d4 >>> 13;\n d4 &= 0x1fff;\n d4 += h5 * (5 * r9) + h6 * (5 * r8) + h7 * (5 * r7) + h8 * (5 * r6) + h9 * (5 * r5);\n c += d4 >>> 13;\n d4 &= 0x1fff;\n let d5 = c + h0 * r5 + h1 * r4 + h2 * r3 + h3 * r2 + h4 * r1;\n c = d5 >>> 13;\n d5 &= 0x1fff;\n d5 += h5 * r0 + h6 * (5 * r9) + h7 * (5 * r8) + h8 * (5 * r7) + h9 * (5 * r6);\n c += d5 >>> 13;\n d5 &= 0x1fff;\n let d6 = c + h0 * r6 + h1 * r5 + h2 * r4 + h3 * r3 + h4 * r2;\n c = d6 >>> 13;\n d6 &= 0x1fff;\n d6 += h5 * r1 + h6 * r0 + h7 * (5 * r9) + h8 * (5 * r8) + h9 * (5 * r7);\n c += d6 >>> 13;\n d6 &= 0x1fff;\n let d7 = c + h0 * r7 + h1 * r6 + h2 * r5 + h3 * r4 + h4 * r3;\n c = d7 >>> 13;\n d7 &= 0x1fff;\n d7 += h5 * r2 + h6 * r1 + h7 * r0 + h8 * (5 * r9) + h9 * (5 * r8);\n c += d7 >>> 13;\n d7 &= 0x1fff;\n let d8 = c + h0 * r8 + h1 * r7 + h2 * r6 + h3 * r5 + h4 * r4;\n c = d8 >>> 13;\n d8 &= 0x1fff;\n d8 += h5 * r3 + h6 * r2 + h7 * r1 + h8 * r0 + h9 * (5 * r9);\n c += d8 >>> 13;\n d8 &= 0x1fff;\n let d9 = c + h0 * r9 + h1 * r8 + h2 * r7 + h3 * r6 + h4 * r5;\n c = d9 >>> 13;\n d9 &= 0x1fff;\n d9 += h5 * r4 + h6 * r3 + h7 * r2 + h8 * r1 + h9 * r0;\n c += d9 >>> 13;\n d9 &= 0x1fff;\n c = ((c << 2) + c) | 0;\n c = (c + d0) | 0;\n d0 = c & 0x1fff;\n c = c >>> 13;\n d1 += c;\n h[0] = d0;\n h[1] = d1;\n h[2] = d2;\n h[3] = d3;\n h[4] = d4;\n h[5] = d5;\n h[6] = d6;\n h[7] = d7;\n h[8] = d8;\n h[9] = d9;\n }\n finalize() {\n const { h, pad } = this;\n const g = new Uint16Array(10);\n let c = h[1] >>> 13;\n h[1] &= 0x1fff;\n for (let i = 2; i < 10; i++) {\n h[i] += c;\n c = h[i] >>> 13;\n h[i] &= 0x1fff;\n }\n h[0] += c * 5;\n c = h[0] >>> 13;\n h[0] &= 0x1fff;\n h[1] += c;\n c = h[1] >>> 13;\n h[1] &= 0x1fff;\n h[2] += c;\n g[0] = h[0] + 5;\n c = g[0] >>> 13;\n g[0] &= 0x1fff;\n for (let i = 1; i < 10; i++) {\n g[i] = h[i] + c;\n c = g[i] >>> 13;\n g[i] &= 0x1fff;\n }\n g[9] -= 1 << 13;\n let mask = (c ^ 1) - 1;\n for (let i = 0; i < 10; i++)\n g[i] &= mask;\n mask = ~mask;\n for (let i = 0; i < 10; i++)\n h[i] = (h[i] & mask) | g[i];\n h[0] = (h[0] | (h[1] << 13)) & 0xffff;\n h[1] = ((h[1] >>> 3) | (h[2] << 10)) & 0xffff;\n h[2] = ((h[2] >>> 6) | (h[3] << 7)) & 0xffff;\n h[3] = ((h[3] >>> 9) | (h[4] << 4)) & 0xffff;\n h[4] = ((h[4] >>> 12) | (h[5] << 1) | (h[6] << 14)) & 0xffff;\n h[5] = ((h[6] >>> 2) | (h[7] << 11)) & 0xffff;\n h[6] = ((h[7] >>> 5) | (h[8] << 8)) & 0xffff;\n h[7] = ((h[8] >>> 8) | (h[9] << 5)) & 0xffff;\n let f = h[0] + pad[0];\n h[0] = f & 0xffff;\n for (let i = 1; i < 8; i++) {\n f = (((h[i] + pad[i]) | 0) + (f >>> 16)) | 0;\n h[i] = f & 0xffff;\n }\n clean(g);\n }\n update(data) {\n aexists(this);\n abytes(data);\n data = copyBytes(data);\n const { buffer, blockLen } = this;\n const len = data.length;\n for (let pos = 0; pos < len;) {\n const take = Math.min(blockLen - this.pos, len - pos);\n // Fast path: we have at least one block in input\n if (take === blockLen) {\n for (; blockLen <= len - pos; pos += blockLen)\n this.process(data, pos);\n continue;\n }\n buffer.set(data.subarray(pos, pos + take), this.pos);\n this.pos += take;\n pos += take;\n if (this.pos === blockLen) {\n this.process(buffer, 0, false);\n this.pos = 0;\n }\n }\n return this;\n }\n destroy() {\n clean(this.h, this.r, this.buffer, this.pad);\n }\n digestInto(out) {\n aexists(this);\n aoutput(out, this);\n this.finished = true;\n const { buffer, h } = this;\n let { pos } = this;\n if (pos) {\n buffer[pos++] = 1;\n for (; pos < 16; pos++)\n buffer[pos] = 0;\n this.process(buffer, 0, true);\n }\n this.finalize();\n let opos = 0;\n for (let i = 0; i < 8; i++) {\n out[opos++] = h[i] >>> 0;\n out[opos++] = h[i] >>> 8;\n }\n return out;\n }\n digest() {\n const { buffer, outputLen } = this;\n this.digestInto(buffer);\n const res = buffer.slice(0, outputLen);\n this.destroy();\n return res;\n }\n}\nexport function wrapConstructorWithKey(hashCons) {\n const hashC = (msg, key) => hashCons(key).update(msg).digest();\n const tmp = hashCons(new Uint8Array(32)); // tmp array, used just once below\n hashC.outputLen = tmp.outputLen;\n hashC.blockLen = tmp.blockLen;\n hashC.create = (key) => hashCons(key);\n return hashC;\n}\n/** Poly1305 MAC from RFC 8439. */\nexport const poly1305 = /** @__PURE__ */ (() => wrapConstructorWithKey((key) => new Poly1305(key)))();\n//# sourceMappingURL=_poly1305.js.map","/**\n * ChaCha stream cipher, released\n * in 2008. Developed after Salsa20, ChaCha aims to increase diffusion per round.\n * It was standardized in [RFC 8439](https://www.rfc-editor.org/rfc/rfc8439) and\n * is now used in TLS 1.3.\n *\n * [XChaCha20](https://datatracker.ietf.org/doc/html/draft-irtf-cfrg-xchacha)\n * extended-nonce variant is also provided. Similar to XSalsa, it's safe to use with\n * randomly-generated nonces.\n *\n * Check out [PDF](http://cr.yp.to/chacha/chacha-20080128.pdf) and\n * [wiki](https://en.wikipedia.org/wiki/Salsa20) and\n * [website](https://cr.yp.to/chacha.html).\n *\n * @module\n */\nimport { createCipher, createPRG, rotl } from \"./_arx.js\";\nimport { poly1305 } from \"./_poly1305.js\";\nimport { abytes, clean, equalBytes, getOutput, u64Lengths, wrapCipher, } from \"./utils.js\";\n/**\n * ChaCha core function. It is implemented twice:\n * 1. Simple loop (chachaCore_small, hchacha_small)\n * 2. Unrolled loop (chachaCore, hchacha) - 4x faster, but larger & harder to read\n * The specific implementation is selected in `createCipher` below.\n */\n/** quarter-round */\n// prettier-ignore\nfunction chachaQR(x, a, b, c, d) {\n x[a] = (x[a] + x[b]) | 0;\n x[d] = rotl(x[d] ^ x[a], 16);\n x[c] = (x[c] + x[d]) | 0;\n x[b] = rotl(x[b] ^ x[c], 12);\n x[a] = (x[a] + x[b]) | 0;\n x[d] = rotl(x[d] ^ x[a], 8);\n x[c] = (x[c] + x[d]) | 0;\n x[b] = rotl(x[b] ^ x[c], 7);\n}\n/** single round */\nfunction chachaRound(x, rounds = 20) {\n for (let r = 0; r < rounds; r += 2) {\n chachaQR(x, 0, 4, 8, 12);\n chachaQR(x, 1, 5, 9, 13);\n chachaQR(x, 2, 6, 10, 14);\n chachaQR(x, 3, 7, 11, 15);\n chachaQR(x, 0, 5, 10, 15);\n chachaQR(x, 1, 6, 11, 12);\n chachaQR(x, 2, 7, 8, 13);\n chachaQR(x, 3, 4, 9, 14);\n }\n}\nconst ctmp = /* @__PURE__ */ new Uint32Array(16);\n/** Small version of chacha without loop unrolling. Unused, provided for auditability. */\n// prettier-ignore\nfunction chacha(s, k, i, out, isHChacha = true, rounds = 20) {\n // Create initial array using common pattern\n const y = Uint32Array.from([\n s[0], s[1], s[2], s[3], // \"expa\" \"nd 3\" \"2-by\" \"te k\"\n k[0], k[1], k[2], k[3], // Key Key Key Key\n k[4], k[5], k[6], k[7], // Key Key Key Key\n i[0], i[1], i[2], i[3], // Counter Counter Nonce Nonce\n ]);\n const x = ctmp;\n x.set(y);\n chachaRound(x, rounds);\n // hchacha extracts 8 specific bytes, chacha adds orig to result\n if (isHChacha) {\n const xindexes = [0, 1, 2, 3, 12, 13, 14, 15];\n for (let i = 0; i < 8; i++)\n out[i] = x[xindexes[i]];\n }\n else {\n for (let i = 0; i < 16; i++)\n out[i] = (y[i] + x[i]) | 0;\n }\n}\n/** Identical to `chachaCore`. Unused. */\n// @ts-ignore\nconst chachaCore_small = (s, k, n, out, cnt, rounds) => chacha(s, k, Uint32Array.from([n[0], n[1], cnt, 0]), out, false, rounds);\n/** Identical to `hchacha`. Unused. */\n// @ts-ignore\nconst hchacha_small = chacha;\n/** Identical to `chachaCore_small`. Unused. */\n// prettier-ignore\nfunction chachaCore(s, k, n, out, cnt, rounds = 20) {\n let y00 = s[0], y01 = s[1], y02 = s[2], y03 = s[3], // \"expa\" \"nd 3\" \"2-by\" \"te k\"\n y04 = k[0], y05 = k[1], y06 = k[2], y07 = k[3], // Key Key Key Key\n y08 = k[4], y09 = k[5], y10 = k[6], y11 = k[7], // Key Key Key Key\n y12 = cnt, y13 = n[0], y14 = n[1], y15 = n[2]; // Counter Counter\tNonce Nonce\n // Save state to temporary variables\n let x00 = y00, x01 = y01, x02 = y02, x03 = y03, x04 = y04, x05 = y05, x06 = y06, x07 = y07, x08 = y08, x09 = y09, x10 = y10, x11 = y11, x12 = y12, x13 = y13, x14 = y14, x15 = y15;\n for (let r = 0; r < rounds; r += 2) {\n x00 = (x00 + x04) | 0;\n x12 = rotl(x12 ^ x00, 16);\n x08 = (x08 + x12) | 0;\n x04 = rotl(x04 ^ x08, 12);\n x00 = (x00 + x04) | 0;\n x12 = rotl(x12 ^ x00, 8);\n x08 = (x08 + x12) | 0;\n x04 = rotl(x04 ^ x08, 7);\n x01 = (x01 + x05) | 0;\n x13 = rotl(x13 ^ x01, 16);\n x09 = (x09 + x13) | 0;\n x05 = rotl(x05 ^ x09, 12);\n x01 = (x01 + x05) | 0;\n x13 = rotl(x13 ^ x01, 8);\n x09 = (x09 + x13) | 0;\n x05 = rotl(x05 ^ x09, 7);\n x02 = (x02 + x06) | 0;\n x14 = rotl(x14 ^ x02, 16);\n x10 = (x10 + x14) | 0;\n x06 = rotl(x06 ^ x10, 12);\n x02 = (x02 + x06) | 0;\n x14 = rotl(x14 ^ x02, 8);\n x10 = (x10 + x14) | 0;\n x06 = rotl(x06 ^ x10, 7);\n x03 = (x03 + x07) | 0;\n x15 = rotl(x15 ^ x03, 16);\n x11 = (x11 + x15) | 0;\n x07 = rotl(x07 ^ x11, 12);\n x03 = (x03 + x07) | 0;\n x15 = rotl(x15 ^ x03, 8);\n x11 = (x11 + x15) | 0;\n x07 = rotl(x07 ^ x11, 7);\n x00 = (x00 + x05) | 0;\n x15 = rotl(x15 ^ x00, 16);\n x10 = (x10 + x15) | 0;\n x05 = rotl(x05 ^ x10, 12);\n x00 = (x00 + x05) | 0;\n x15 = rotl(x15 ^ x00, 8);\n x10 = (x10 + x15) | 0;\n x05 = rotl(x05 ^ x10, 7);\n x01 = (x01 + x06) | 0;\n x12 = rotl(x12 ^ x01, 16);\n x11 = (x11 + x12) | 0;\n x06 = rotl(x06 ^ x11, 12);\n x01 = (x01 + x06) | 0;\n x12 = rotl(x12 ^ x01, 8);\n x11 = (x11 + x12) | 0;\n x06 = rotl(x06 ^ x11, 7);\n x02 = (x02 + x07) | 0;\n x13 = rotl(x13 ^ x02, 16);\n x08 = (x08 + x13) | 0;\n x07 = rotl(x07 ^ x08, 12);\n x02 = (x02 + x07) | 0;\n x13 = rotl(x13 ^ x02, 8);\n x08 = (x08 + x13) | 0;\n x07 = rotl(x07 ^ x08, 7);\n x03 = (x03 + x04) | 0;\n x14 = rotl(x14 ^ x03, 16);\n x09 = (x09 + x14) | 0;\n x04 = rotl(x04 ^ x09, 12);\n x03 = (x03 + x04) | 0;\n x14 = rotl(x14 ^ x03, 8);\n x09 = (x09 + x14) | 0;\n x04 = rotl(x04 ^ x09, 7);\n }\n // Write output\n let oi = 0;\n out[oi++] = (y00 + x00) | 0;\n out[oi++] = (y01 + x01) | 0;\n out[oi++] = (y02 + x02) | 0;\n out[oi++] = (y03 + x03) | 0;\n out[oi++] = (y04 + x04) | 0;\n out[oi++] = (y05 + x05) | 0;\n out[oi++] = (y06 + x06) | 0;\n out[oi++] = (y07 + x07) | 0;\n out[oi++] = (y08 + x08) | 0;\n out[oi++] = (y09 + x09) | 0;\n out[oi++] = (y10 + x10) | 0;\n out[oi++] = (y11 + x11) | 0;\n out[oi++] = (y12 + x12) | 0;\n out[oi++] = (y13 + x13) | 0;\n out[oi++] = (y14 + x14) | 0;\n out[oi++] = (y15 + x15) | 0;\n}\n/**\n * hchacha hashes key and nonce into key' and nonce' for xchacha20.\n * Identical to `hchacha_small`.\n * Need to find a way to merge it with `chachaCore` without 25% performance hit.\n */\n// prettier-ignore\nexport function hchacha(s, k, i, out) {\n let x00 = s[0], x01 = s[1], x02 = s[2], x03 = s[3], x04 = k[0], x05 = k[1], x06 = k[2], x07 = k[3], x08 = k[4], x09 = k[5], x10 = k[6], x11 = k[7], x12 = i[0], x13 = i[1], x14 = i[2], x15 = i[3];\n for (let r = 0; r < 20; r += 2) {\n x00 = (x00 + x04) | 0;\n x12 = rotl(x12 ^ x00, 16);\n x08 = (x08 + x12) | 0;\n x04 = rotl(x04 ^ x08, 12);\n x00 = (x00 + x04) | 0;\n x12 = rotl(x12 ^ x00, 8);\n x08 = (x08 + x12) | 0;\n x04 = rotl(x04 ^ x08, 7);\n x01 = (x01 + x05) | 0;\n x13 = rotl(x13 ^ x01, 16);\n x09 = (x09 + x13) | 0;\n x05 = rotl(x05 ^ x09, 12);\n x01 = (x01 + x05) | 0;\n x13 = rotl(x13 ^ x01, 8);\n x09 = (x09 + x13) | 0;\n x05 = rotl(x05 ^ x09, 7);\n x02 = (x02 + x06) | 0;\n x14 = rotl(x14 ^ x02, 16);\n x10 = (x10 + x14) | 0;\n x06 = rotl(x06 ^ x10, 12);\n x02 = (x02 + x06) | 0;\n x14 = rotl(x14 ^ x02, 8);\n x10 = (x10 + x14) | 0;\n x06 = rotl(x06 ^ x10, 7);\n x03 = (x03 + x07) | 0;\n x15 = rotl(x15 ^ x03, 16);\n x11 = (x11 + x15) | 0;\n x07 = rotl(x07 ^ x11, 12);\n x03 = (x03 + x07) | 0;\n x15 = rotl(x15 ^ x03, 8);\n x11 = (x11 + x15) | 0;\n x07 = rotl(x07 ^ x11, 7);\n x00 = (x00 + x05) | 0;\n x15 = rotl(x15 ^ x00, 16);\n x10 = (x10 + x15) | 0;\n x05 = rotl(x05 ^ x10, 12);\n x00 = (x00 + x05) | 0;\n x15 = rotl(x15 ^ x00, 8);\n x10 = (x10 + x15) | 0;\n x05 = rotl(x05 ^ x10, 7);\n x01 = (x01 + x06) | 0;\n x12 = rotl(x12 ^ x01, 16);\n x11 = (x11 + x12) | 0;\n x06 = rotl(x06 ^ x11, 12);\n x01 = (x01 + x06) | 0;\n x12 = rotl(x12 ^ x01, 8);\n x11 = (x11 + x12) | 0;\n x06 = rotl(x06 ^ x11, 7);\n x02 = (x02 + x07) | 0;\n x13 = rotl(x13 ^ x02, 16);\n x08 = (x08 + x13) | 0;\n x07 = rotl(x07 ^ x08, 12);\n x02 = (x02 + x07) | 0;\n x13 = rotl(x13 ^ x02, 8);\n x08 = (x08 + x13) | 0;\n x07 = rotl(x07 ^ x08, 7);\n x03 = (x03 + x04) | 0;\n x14 = rotl(x14 ^ x03, 16);\n x09 = (x09 + x14) | 0;\n x04 = rotl(x04 ^ x09, 12);\n x03 = (x03 + x04) | 0;\n x14 = rotl(x14 ^ x03, 8);\n x09 = (x09 + x14) | 0;\n x04 = rotl(x04 ^ x09, 7);\n }\n let oi = 0;\n out[oi++] = x00;\n out[oi++] = x01;\n out[oi++] = x02;\n out[oi++] = x03;\n out[oi++] = x12;\n out[oi++] = x13;\n out[oi++] = x14;\n out[oi++] = x15;\n}\n/** Original, non-RFC chacha20 from DJB. 8-byte nonce, 8-byte counter. */\nexport const chacha20orig = /* @__PURE__ */ createCipher(chachaCore, {\n counterRight: false,\n counterLength: 8,\n allowShortKeys: true,\n});\n/**\n * ChaCha stream cipher. Conforms to RFC 8439 (IETF, TLS). 12-byte nonce, 4-byte counter.\n * With smaller nonce, it's not safe to make it random (CSPRNG), due to collision chance.\n */\nexport const chacha20 = /* @__PURE__ */ createCipher(chachaCore, {\n counterRight: false,\n counterLength: 4,\n allowShortKeys: false,\n});\n/**\n * XChaCha eXtended-nonce ChaCha. With 24-byte nonce, it's safe to make it random (CSPRNG).\n * See [IRTF draft](https://datatracker.ietf.org/doc/html/draft-irtf-cfrg-xchacha).\n */\nexport const xchacha20 = /* @__PURE__ */ createCipher(chachaCore, {\n counterRight: false,\n counterLength: 8,\n extendNonceFn: hchacha,\n allowShortKeys: false,\n});\n/** Reduced 8-round chacha, described in original paper. */\nexport const chacha8 = /* @__PURE__ */ createCipher(chachaCore, {\n counterRight: false,\n counterLength: 4,\n rounds: 8,\n});\n/** Reduced 12-round chacha, described in original paper. */\nexport const chacha12 = /* @__PURE__ */ createCipher(chachaCore, {\n counterRight: false,\n counterLength: 4,\n rounds: 12,\n});\nconst ZEROS16 = /* @__PURE__ */ new Uint8Array(16);\n// Pad to digest size with zeros\nconst updatePadded = (h, msg) => {\n h.update(msg);\n const leftover = msg.length % 16;\n if (leftover)\n h.update(ZEROS16.subarray(leftover));\n};\nconst ZEROS32 = /* @__PURE__ */ new Uint8Array(32);\nfunction computeTag(fn, key, nonce, ciphertext, AAD) {\n if (AAD !== undefined)\n abytes(AAD, undefined, 'AAD');\n const authKey = fn(key, nonce, ZEROS32);\n const lengths = u64Lengths(ciphertext.length, AAD ? AAD.length : 0, true);\n // Methods below can be replaced with\n // return poly1305_computeTag_small(authKey, lengths, ciphertext, AAD)\n const h = poly1305.create(authKey);\n if (AAD)\n updatePadded(h, AAD);\n updatePadded(h, ciphertext);\n h.update(lengths);\n const res = h.digest();\n clean(authKey, lengths);\n return res;\n}\n/**\n * AEAD algorithm from RFC 8439.\n * Salsa20 and chacha (RFC 8439) use poly1305 differently.\n * We could have composed them, but it's hard because of authKey:\n * In salsa20, authKey changes position in salsa stream.\n * In chacha, authKey can't be computed inside computeTag, it modifies the counter.\n */\nexport const _poly1305_aead = (xorStream) => (key, nonce, AAD) => {\n const tagLength = 16;\n return {\n encrypt(plaintext, output) {\n const plength = plaintext.length;\n output = getOutput(plength + tagLength, output, false);\n output.set(plaintext);\n const oPlain = output.subarray(0, -tagLength);\n // Actual encryption\n xorStream(key, nonce, oPlain, oPlain, 1);\n const tag = computeTag(xorStream, key, nonce, oPlain, AAD);\n output.set(tag, plength); // append tag\n clean(tag);\n return output;\n },\n decrypt(ciphertext, output) {\n output = getOutput(ciphertext.length - tagLength, output, false);\n const data = ciphertext.subarray(0, -tagLength);\n const passedTag = ciphertext.subarray(-tagLength);\n const tag = computeTag(xorStream, key, nonce, data, AAD);\n if (!equalBytes(passedTag, tag))\n throw new Error('invalid tag');\n output.set(ciphertext.subarray(0, -tagLength));\n // Actual decryption\n xorStream(key, nonce, output, output, 1); // start stream with i=1\n clean(tag);\n return output;\n },\n };\n};\n/**\n * ChaCha20-Poly1305 from RFC 8439.\n *\n * Unsafe to use random nonces under the same key, due to collision chance.\n * Prefer XChaCha instead.\n */\nexport const chacha20poly1305 = /* @__PURE__ */ wrapCipher({ blockSize: 64, nonceLength: 12, tagLength: 16 }, _poly1305_aead(chacha20));\n/**\n * XChaCha20-Poly1305 extended-nonce chacha.\n *\n * Can be safely used with random nonces (CSPRNG).\n * See [IRTF draft](https://datatracker.ietf.org/doc/html/draft-irtf-cfrg-xchacha).\n */\nexport const xchacha20poly1305 = /* @__PURE__ */ wrapCipher({ blockSize: 64, nonceLength: 24, tagLength: 16 }, _poly1305_aead(xchacha20));\n/**\n * Chacha20 CSPRNG (cryptographically secure pseudorandom number generator).\n * It's best to limit usage to non-production, non-critical cases: for example, test-only.\n * Compatible with libtomcrypt. It does not have a specification, so unclear how secure it is.\n */\nexport const rngChacha20 = /* @__PURE__ */ createPRG(chacha20orig, 64, 32, 8);\n/**\n * Chacha20/8 CSPRNG (cryptographically secure pseudorandom number generator).\n * It's best to limit usage to non-production, non-critical cases: for example, test-only.\n * Faster than `rngChacha20`.\n */\nexport const rngChacha8 = /* @__PURE__ */ createPRG(chacha8, 64, 32, 12);\n//# sourceMappingURL=chacha.js.map","/**\n * HKDF (RFC 5869): extract + expand in one step.\n * See https://soatok.blog/2021/11/17/understanding-hkdf/.\n * @module\n */\nimport { hmac } from \"./hmac.js\";\nimport { abytes, ahash, anumber, clean } from \"./utils.js\";\n/**\n * HKDF-extract from spec. Less important part. `HKDF-Extract(IKM, salt) -> PRK`\n * Arguments position differs from spec (IKM is first one, since it is not optional)\n * @param hash - hash function that would be used (e.g. sha256)\n * @param ikm - input keying material, the initial key\n * @param salt - optional salt value (a non-secret random value)\n */\nexport function extract(hash, ikm, salt) {\n ahash(hash);\n // NOTE: some libraries treat zero-length array as 'not provided';\n // we don't, since we have undefined as 'not provided'\n // https://github.com/RustCrypto/KDFs/issues/15\n if (salt === undefined)\n salt = new Uint8Array(hash.outputLen);\n return hmac(hash, salt, ikm);\n}\nconst HKDF_COUNTER = /* @__PURE__ */ Uint8Array.of(0);\nconst EMPTY_BUFFER = /* @__PURE__ */ Uint8Array.of();\n/**\n * HKDF-expand from the spec. The most important part. `HKDF-Expand(PRK, info, L) -> OKM`\n * @param hash - hash function that would be used (e.g. sha256)\n * @param prk - a pseudorandom key of at least HashLen octets (usually, the output from the extract step)\n * @param info - optional context and application specific information (can be a zero-length string)\n * @param length - length of output keying material in bytes\n */\nexport function expand(hash, prk, info, length = 32) {\n ahash(hash);\n anumber(length, 'length');\n const olen = hash.outputLen;\n if (length > 255 * olen)\n throw new Error('Length must be <= 255*HashLen');\n const blocks = Math.ceil(length / olen);\n if (info === undefined)\n info = EMPTY_BUFFER;\n else\n abytes(info, undefined, 'info');\n // first L(ength) octets of T\n const okm = new Uint8Array(blocks * olen);\n // Re-use HMAC instance between blocks\n const HMAC = hmac.create(hash, prk);\n const HMACTmp = HMAC._cloneInto();\n const T = new Uint8Array(HMAC.outputLen);\n for (let counter = 0; counter < blocks; counter++) {\n HKDF_COUNTER[0] = counter + 1;\n // T(0) = empty string (zero length)\n // T(N) = HMAC-Hash(PRK, T(N-1) | info | N)\n HMACTmp.update(counter === 0 ? EMPTY_BUFFER : T)\n .update(info)\n .update(HKDF_COUNTER)\n .digestInto(T);\n okm.set(T, olen * counter);\n HMAC._cloneInto(HMACTmp);\n }\n HMAC.destroy();\n HMACTmp.destroy();\n clean(T, HKDF_COUNTER);\n return okm.slice(0, length);\n}\n/**\n * HKDF (RFC 5869): derive keys from an initial input.\n * Combines hkdf_extract + hkdf_expand in one step\n * @param hash - hash function that would be used (e.g. sha256)\n * @param ikm - input keying material, the initial key\n * @param salt - optional salt value (a non-secret random value)\n * @param info - optional context and application specific information (can be a zero-length string)\n * @param length - length of output keying material in bytes\n * @example\n * import { hkdf } from '@noble/hashes/hkdf';\n * import { sha256 } from '@noble/hashes/sha2';\n * import { randomBytes } from '@noble/hashes/utils';\n * const inputKey = randomBytes(32);\n * const salt = randomBytes(32);\n * const info = 'application-key';\n * const hk1 = hkdf(sha256, inputKey, salt, info, 32);\n */\nexport const hkdf = (hash, ikm, salt, info, length) => expand(hash, extract(hash, ikm, salt), info, length);\n//# sourceMappingURL=hkdf.js.map","var __defProp = Object.defineProperty;\nvar __export = (target, all) => {\n for (var name in all)\n __defProp(target, name, { get: all[name], enumerable: true });\n};\n\n// pure.ts\nimport { schnorr } from \"@noble/curves/secp256k1.js\";\nimport { bytesToHex as bytesToHex2, hexToBytes as hexToBytes2 } from \"@noble/hashes/utils.js\";\n\n// core.ts\nvar verifiedSymbol = Symbol(\"verified\");\nvar isRecord = (obj) => obj instanceof Object;\nfunction validateEvent(event) {\n if (!isRecord(event))\n return false;\n if (typeof event.kind !== \"number\")\n return false;\n if (typeof event.content !== \"string\")\n return false;\n if (typeof event.created_at !== \"number\")\n return false;\n if (typeof event.pubkey !== \"string\")\n return false;\n if (!event.pubkey.match(/^[a-f0-9]{64}$/))\n return false;\n if (!Array.isArray(event.tags))\n return false;\n for (let i2 = 0; i2 < event.tags.length; i2++) {\n let tag = event.tags[i2];\n if (!Array.isArray(tag))\n return false;\n for (let j = 0; j < tag.length; j++) {\n if (typeof tag[j] !== \"string\")\n return false;\n }\n }\n return true;\n}\nfunction sortEvents(events) {\n return events.sort((a, b) => {\n if (a.created_at !== b.created_at) {\n return b.created_at - a.created_at;\n }\n return a.id.localeCompare(b.id);\n });\n}\n\n// pure.ts\nimport { sha256 } from \"@noble/hashes/sha2.js\";\n\n// utils.ts\nvar utils_exports = {};\n__export(utils_exports, {\n binarySearch: () => binarySearch,\n bytesToHex: () => bytesToHex,\n hexToBytes: () => hexToBytes,\n insertEventIntoAscendingList: () => insertEventIntoAscendingList,\n insertEventIntoDescendingList: () => insertEventIntoDescendingList,\n mergeReverseSortedLists: () => mergeReverseSortedLists,\n normalizeURL: () => normalizeURL,\n utf8Decoder: () => utf8Decoder,\n utf8Encoder: () => utf8Encoder\n});\nimport { bytesToHex, hexToBytes } from \"@noble/hashes/utils.js\";\nvar utf8Decoder = new TextDecoder(\"utf-8\");\nvar utf8Encoder = new TextEncoder();\nfunction normalizeURL(url) {\n try {\n if (url.indexOf(\"://\") === -1)\n url = \"wss://\" + url;\n let p = new URL(url);\n if (p.protocol === \"http:\")\n p.protocol = \"ws:\";\n else if (p.protocol === \"https:\")\n p.protocol = \"wss:\";\n p.pathname = p.pathname.replace(/\\/+/g, \"/\");\n if (p.pathname.endsWith(\"/\"))\n p.pathname = p.pathname.slice(0, -1);\n if (p.port === \"80\" && p.protocol === \"ws:\" || p.port === \"443\" && p.protocol === \"wss:\")\n p.port = \"\";\n p.searchParams.sort();\n p.hash = \"\";\n return p.toString();\n } catch (e) {\n throw new Error(`Invalid URL: ${url}`);\n }\n}\nfunction insertEventIntoDescendingList(sortedArray, event) {\n const [idx, found] = binarySearch(sortedArray, (b) => {\n if (event.id === b.id)\n return 0;\n if (event.created_at === b.created_at)\n return -1;\n return b.created_at - event.created_at;\n });\n if (!found) {\n sortedArray.splice(idx, 0, event);\n }\n return sortedArray;\n}\nfunction insertEventIntoAscendingList(sortedArray, event) {\n const [idx, found] = binarySearch(sortedArray, (b) => {\n if (event.id === b.id)\n return 0;\n if (event.created_at === b.created_at)\n return -1;\n return event.created_at - b.created_at;\n });\n if (!found) {\n sortedArray.splice(idx, 0, event);\n }\n return sortedArray;\n}\nfunction binarySearch(arr, compare) {\n let start = 0;\n let end = arr.length - 1;\n while (start <= end) {\n const mid = Math.floor((start + end) / 2);\n const cmp = compare(arr[mid]);\n if (cmp === 0) {\n return [mid, true];\n }\n if (cmp < 0) {\n end = mid - 1;\n } else {\n start = mid + 1;\n }\n }\n return [start, false];\n}\nfunction mergeReverseSortedLists(list1, list2) {\n const result = new Array(list1.length + list2.length);\n result.length = 0;\n let i1 = 0;\n let i2 = 0;\n let sameTimestampIds = [];\n while (i1 < list1.length && i2 < list2.length) {\n let next;\n if (list1[i1]?.created_at > list2[i2]?.created_at) {\n next = list1[i1];\n i1++;\n } else {\n next = list2[i2];\n i2++;\n }\n if (result.length > 0 && result[result.length - 1].created_at === next.created_at) {\n if (sameTimestampIds.includes(next.id))\n continue;\n } else {\n sameTimestampIds.length = 0;\n }\n result.push(next);\n sameTimestampIds.push(next.id);\n }\n while (i1 < list1.length) {\n const next = list1[i1];\n i1++;\n if (result.length > 0 && result[result.length - 1].created_at === next.created_at) {\n if (sameTimestampIds.includes(next.id))\n continue;\n } else {\n sameTimestampIds.length = 0;\n }\n result.push(next);\n sameTimestampIds.push(next.id);\n }\n while (i2 < list2.length) {\n const next = list2[i2];\n i2++;\n if (result.length > 0 && result[result.length - 1].created_at === next.created_at) {\n if (sameTimestampIds.includes(next.id))\n continue;\n } else {\n sameTimestampIds.length = 0;\n }\n result.push(next);\n sameTimestampIds.push(next.id);\n }\n return result;\n}\n\n// pure.ts\nvar JS = class {\n generateSecretKey() {\n return schnorr.utils.randomSecretKey();\n }\n getPublicKey(secretKey) {\n return bytesToHex2(schnorr.getPublicKey(secretKey));\n }\n finalizeEvent(t, secretKey) {\n const event = t;\n event.pubkey = bytesToHex2(schnorr.getPublicKey(secretKey));\n event.id = getEventHash(event);\n event.sig = bytesToHex2(schnorr.sign(hexToBytes2(getEventHash(event)), secretKey));\n event[verifiedSymbol] = true;\n return event;\n }\n verifyEvent(event) {\n if (typeof event[verifiedSymbol] === \"boolean\")\n return event[verifiedSymbol];\n try {\n const hash = getEventHash(event);\n if (hash !== event.id) {\n event[verifiedSymbol] = false;\n return false;\n }\n const valid = schnorr.verify(hexToBytes2(event.sig), hexToBytes2(hash), hexToBytes2(event.pubkey));\n event[verifiedSymbol] = valid;\n return valid;\n } catch (err) {\n event[verifiedSymbol] = false;\n return false;\n }\n }\n};\nfunction serializeEvent(evt) {\n if (!validateEvent(evt))\n throw new Error(\"can't serialize event with wrong or missing properties\");\n return JSON.stringify([0, evt.pubkey, evt.created_at, evt.kind, evt.tags, evt.content]);\n}\nfunction getEventHash(event) {\n let eventHash = sha256(utf8Encoder.encode(serializeEvent(event)));\n return bytesToHex2(eventHash);\n}\nvar i = new JS();\nvar generateSecretKey = i.generateSecretKey;\nvar getPublicKey = i.getPublicKey;\nvar finalizeEvent = i.finalizeEvent;\nvar verifyEvent = i.verifyEvent;\n\n// kinds.ts\nvar kinds_exports = {};\n__export(kinds_exports, {\n Application: () => Application,\n BadgeAward: () => BadgeAward,\n BadgeDefinition: () => BadgeDefinition,\n BlockedRelaysList: () => BlockedRelaysList,\n BlossomServerList: () => BlossomServerList,\n BookmarkList: () => BookmarkList,\n Bookmarksets: () => Bookmarksets,\n Calendar: () => Calendar,\n CalendarEventRSVP: () => CalendarEventRSVP,\n ChannelCreation: () => ChannelCreation,\n ChannelHideMessage: () => ChannelHideMessage,\n ChannelMessage: () => ChannelMessage,\n ChannelMetadata: () => ChannelMetadata,\n ChannelMuteUser: () => ChannelMuteUser,\n ChatMessage: () => ChatMessage,\n ClassifiedListing: () => ClassifiedListing,\n ClientAuth: () => ClientAuth,\n Comment: () => Comment,\n CommunitiesList: () => CommunitiesList,\n CommunityDefinition: () => CommunityDefinition,\n CommunityPostApproval: () => CommunityPostApproval,\n Contacts: () => Contacts,\n CreateOrUpdateProduct: () => CreateOrUpdateProduct,\n CreateOrUpdateStall: () => CreateOrUpdateStall,\n Curationsets: () => Curationsets,\n Date: () => Date2,\n DirectMessageRelaysList: () => DirectMessageRelaysList,\n DraftClassifiedListing: () => DraftClassifiedListing,\n DraftLong: () => DraftLong,\n Emojisets: () => Emojisets,\n EncryptedDirectMessage: () => EncryptedDirectMessage,\n EventDeletion: () => EventDeletion,\n FavoriteRelays: () => FavoriteRelays,\n FileMessage: () => FileMessage,\n FileMetadata: () => FileMetadata,\n FileServerPreference: () => FileServerPreference,\n Followsets: () => Followsets,\n ForumThread: () => ForumThread,\n GenericRepost: () => GenericRepost,\n Genericlists: () => Genericlists,\n GiftWrap: () => GiftWrap,\n GroupMetadata: () => GroupMetadata,\n HTTPAuth: () => HTTPAuth,\n Handlerinformation: () => Handlerinformation,\n Handlerrecommendation: () => Handlerrecommendation,\n Highlights: () => Highlights,\n InterestsList: () => InterestsList,\n Interestsets: () => Interestsets,\n JobFeedback: () => JobFeedback,\n JobRequest: () => JobRequest,\n JobResult: () => JobResult,\n Label: () => Label,\n LightningPubRPC: () => LightningPubRPC,\n LiveChatMessage: () => LiveChatMessage,\n LiveEvent: () => LiveEvent,\n LongFormArticle: () => LongFormArticle,\n Metadata: () => Metadata,\n Mutelist: () => Mutelist,\n NWCWalletInfo: () => NWCWalletInfo,\n NWCWalletRequest: () => NWCWalletRequest,\n NWCWalletResponse: () => NWCWalletResponse,\n NormalVideo: () => NormalVideo,\n NostrConnect: () => NostrConnect,\n OpenTimestamps: () => OpenTimestamps,\n Photo: () => Photo,\n Pinlist: () => Pinlist,\n Poll: () => Poll,\n PollResponse: () => PollResponse,\n PrivateDirectMessage: () => PrivateDirectMessage,\n ProblemTracker: () => ProblemTracker,\n ProfileBadges: () => ProfileBadges,\n PublicChatsList: () => PublicChatsList,\n Reaction: () => Reaction,\n RecommendRelay: () => RecommendRelay,\n RelayList: () => RelayList,\n RelayReview: () => RelayReview,\n Relaysets: () => Relaysets,\n Report: () => Report,\n Reporting: () => Reporting,\n Repost: () => Repost,\n Seal: () => Seal,\n SearchRelaysList: () => SearchRelaysList,\n ShortTextNote: () => ShortTextNote,\n ShortVideo: () => ShortVideo,\n Time: () => Time,\n UserEmojiList: () => UserEmojiList,\n UserStatuses: () => UserStatuses,\n Voice: () => Voice,\n VoiceComment: () => VoiceComment,\n Zap: () => Zap,\n ZapGoal: () => ZapGoal,\n ZapRequest: () => ZapRequest,\n classifyKind: () => classifyKind,\n isAddressableKind: () => isAddressableKind,\n isEphemeralKind: () => isEphemeralKind,\n isKind: () => isKind,\n isRegularKind: () => isRegularKind,\n isReplaceableKind: () => isReplaceableKind\n});\nfunction isRegularKind(kind) {\n return kind < 1e4 && kind !== 0 && kind !== 3;\n}\nfunction isReplaceableKind(kind) {\n return kind === 0 || kind === 3 || 1e4 <= kind && kind < 2e4;\n}\nfunction isEphemeralKind(kind) {\n return 2e4 <= kind && kind < 3e4;\n}\nfunction isAddressableKind(kind) {\n return 3e4 <= kind && kind < 4e4;\n}\nfunction classifyKind(kind) {\n if (isRegularKind(kind))\n return \"regular\";\n if (isReplaceableKind(kind))\n return \"replaceable\";\n if (isEphemeralKind(kind))\n return \"ephemeral\";\n if (isAddressableKind(kind))\n return \"parameterized\";\n return \"unknown\";\n}\nfunction isKind(event, kind) {\n const kindAsArray = kind instanceof Array ? kind : [kind];\n return validateEvent(event) && kindAsArray.includes(event.kind) || false;\n}\nvar Metadata = 0;\nvar ShortTextNote = 1;\nvar RecommendRelay = 2;\nvar Contacts = 3;\nvar EncryptedDirectMessage = 4;\nvar EventDeletion = 5;\nvar Repost = 6;\nvar Reaction = 7;\nvar BadgeAward = 8;\nvar ChatMessage = 9;\nvar ForumThread = 11;\nvar Seal = 13;\nvar PrivateDirectMessage = 14;\nvar FileMessage = 15;\nvar GenericRepost = 16;\nvar Photo = 20;\nvar NormalVideo = 21;\nvar ShortVideo = 22;\nvar ChannelCreation = 40;\nvar ChannelMetadata = 41;\nvar ChannelMessage = 42;\nvar ChannelHideMessage = 43;\nvar ChannelMuteUser = 44;\nvar OpenTimestamps = 1040;\nvar GiftWrap = 1059;\nvar Poll = 1068;\nvar FileMetadata = 1063;\nvar Comment = 1111;\nvar LiveChatMessage = 1311;\nvar Voice = 1222;\nvar VoiceComment = 1244;\nvar ProblemTracker = 1971;\nvar Report = 1984;\nvar Reporting = 1984;\nvar Label = 1985;\nvar CommunityPostApproval = 4550;\nvar JobRequest = 5999;\nvar JobResult = 6999;\nvar JobFeedback = 7e3;\nvar ZapGoal = 9041;\nvar ZapRequest = 9734;\nvar Zap = 9735;\nvar Highlights = 9802;\nvar PollResponse = 1018;\nvar Mutelist = 1e4;\nvar Pinlist = 10001;\nvar RelayList = 10002;\nvar BookmarkList = 10003;\nvar CommunitiesList = 10004;\nvar PublicChatsList = 10005;\nvar BlockedRelaysList = 10006;\nvar SearchRelaysList = 10007;\nvar FavoriteRelays = 10012;\nvar InterestsList = 10015;\nvar UserEmojiList = 10030;\nvar DirectMessageRelaysList = 10050;\nvar FileServerPreference = 10096;\nvar BlossomServerList = 10063;\nvar NWCWalletInfo = 13194;\nvar LightningPubRPC = 21e3;\nvar ClientAuth = 22242;\nvar NWCWalletRequest = 23194;\nvar NWCWalletResponse = 23195;\nvar NostrConnect = 24133;\nvar HTTPAuth = 27235;\nvar Followsets = 3e4;\nvar Genericlists = 30001;\nvar Relaysets = 30002;\nvar Bookmarksets = 30003;\nvar Curationsets = 30004;\nvar ProfileBadges = 30008;\nvar BadgeDefinition = 30009;\nvar Interestsets = 30015;\nvar CreateOrUpdateStall = 30017;\nvar CreateOrUpdateProduct = 30018;\nvar LongFormArticle = 30023;\nvar DraftLong = 30024;\nvar Emojisets = 30030;\nvar Application = 30078;\nvar LiveEvent = 30311;\nvar UserStatuses = 30315;\nvar ClassifiedListing = 30402;\nvar DraftClassifiedListing = 30403;\nvar Date2 = 31922;\nvar Time = 31923;\nvar Calendar = 31924;\nvar CalendarEventRSVP = 31925;\nvar RelayReview = 31987;\nvar Handlerrecommendation = 31989;\nvar Handlerinformation = 31990;\nvar CommunityDefinition = 34550;\nvar GroupMetadata = 39e3;\n\n// filter.ts\nfunction matchFilter(filter, event) {\n if (filter.ids && filter.ids.indexOf(event.id) === -1) {\n return false;\n }\n if (filter.kinds && filter.kinds.indexOf(event.kind) === -1) {\n return false;\n }\n if (filter.authors && filter.authors.indexOf(event.pubkey) === -1) {\n return false;\n }\n for (let f in filter) {\n if (f[0] === \"#\") {\n let tagName = f.slice(1);\n let values = filter[`#${tagName}`];\n if (values && !event.tags.find(([t, v]) => t === f.slice(1) && values.indexOf(v) !== -1))\n return false;\n }\n }\n if (filter.since && event.created_at < filter.since)\n return false;\n if (filter.until && event.created_at > filter.until)\n return false;\n return true;\n}\nfunction matchFilters(filters, event) {\n for (let i2 = 0; i2 < filters.length; i2++) {\n if (matchFilter(filters[i2], event)) {\n return true;\n }\n }\n return false;\n}\nfunction mergeFilters(...filters) {\n let result = {};\n for (let i2 = 0; i2 < filters.length; i2++) {\n let filter = filters[i2];\n Object.entries(filter).forEach(([property, values]) => {\n if (property === \"kinds\" || property === \"ids\" || property === \"authors\" || property[0] === \"#\") {\n result[property] = result[property] || [];\n for (let v = 0; v < values.length; v++) {\n let value = values[v];\n if (!result[property].includes(value))\n result[property].push(value);\n }\n }\n });\n if (filter.limit && (!result.limit || filter.limit > result.limit))\n result.limit = filter.limit;\n if (filter.until && (!result.until || filter.until > result.until))\n result.until = filter.until;\n if (filter.since && (!result.since || filter.since < result.since))\n result.since = filter.since;\n }\n return result;\n}\nfunction getFilterLimit(filter) {\n if (filter.ids && !filter.ids.length)\n return 0;\n if (filter.kinds && !filter.kinds.length)\n return 0;\n if (filter.authors && !filter.authors.length)\n return 0;\n for (const [key, value] of Object.entries(filter)) {\n if (key[0] === \"#\" && Array.isArray(value) && !value.length)\n return 0;\n }\n return Math.min(\n Math.max(0, filter.limit ?? Infinity),\n filter.ids?.length ?? Infinity,\n filter.authors?.length && filter.kinds?.every((kind) => isReplaceableKind(kind)) ? filter.authors.length * filter.kinds.length : Infinity,\n filter.authors?.length && filter.kinds?.every((kind) => isAddressableKind(kind)) && filter[\"#d\"]?.length ? filter.authors.length * filter.kinds.length * filter[\"#d\"].length : Infinity\n );\n}\n\n// fakejson.ts\nvar fakejson_exports = {};\n__export(fakejson_exports, {\n getHex64: () => getHex64,\n getInt: () => getInt,\n getSubscriptionId: () => getSubscriptionId,\n matchEventId: () => matchEventId,\n matchEventKind: () => matchEventKind,\n matchEventPubkey: () => matchEventPubkey\n});\nfunction getHex64(json, field) {\n let len = field.length + 3;\n let idx = json.indexOf(`\"${field}\":`) + len;\n let s = json.slice(idx).indexOf(`\"`) + idx + 1;\n return json.slice(s, s + 64);\n}\nfunction getInt(json, field) {\n let len = field.length;\n let idx = json.indexOf(`\"${field}\":`) + len + 3;\n let sliced = json.slice(idx);\n let end = Math.min(sliced.indexOf(\",\"), sliced.indexOf(\"}\"));\n return parseInt(sliced.slice(0, end), 10);\n}\nfunction getSubscriptionId(json) {\n let idx = json.slice(0, 22).indexOf(`\"EVENT\"`);\n if (idx === -1)\n return null;\n let pstart = json.slice(idx + 7 + 1).indexOf(`\"`);\n if (pstart === -1)\n return null;\n let start = idx + 7 + 1 + pstart;\n let pend = json.slice(start + 1, 80).indexOf(`\"`);\n if (pend === -1)\n return null;\n let end = start + 1 + pend;\n return json.slice(start + 1, end);\n}\nfunction matchEventId(json, id) {\n return id === getHex64(json, \"id\");\n}\nfunction matchEventPubkey(json, pubkey) {\n return pubkey === getHex64(json, \"pubkey\");\n}\nfunction matchEventKind(json, kind) {\n return kind === getInt(json, \"kind\");\n}\n\n// nip42.ts\nvar nip42_exports = {};\n__export(nip42_exports, {\n makeAuthEvent: () => makeAuthEvent\n});\nfunction makeAuthEvent(relayURL, challenge) {\n return {\n kind: ClientAuth,\n created_at: Math.floor(Date.now() / 1e3),\n tags: [\n [\"relay\", relayURL],\n [\"challenge\", challenge]\n ],\n content: \"\"\n };\n}\n\n// abstract-relay.ts\nvar SendingOnClosedConnection = class extends Error {\n constructor(message, relay) {\n super(`Tried to send message '${message} on a closed connection to ${relay}.`);\n this.name = \"SendingOnClosedConnection\";\n }\n};\nvar AbstractRelay = class {\n url;\n _connected = false;\n onclose = null;\n onnotice = (msg) => console.debug(`NOTICE from ${this.url}: ${msg}`);\n onauth;\n baseEoseTimeout = 4400;\n publishTimeout = 4400;\n pingFrequency = 29e3;\n pingTimeout = 2e4;\n resubscribeBackoff = [1e4, 1e4, 1e4, 2e4, 2e4, 3e4, 6e4];\n openSubs = /* @__PURE__ */ new Map();\n enablePing;\n enableReconnect;\n idleSince = Date.now();\n ongoingOperations = 0;\n reconnectTimeoutHandle;\n pingIntervalHandle;\n reconnectAttempts = 0;\n skipReconnection = false;\n connectionPromise;\n openCountRequests = /* @__PURE__ */ new Map();\n openEventPublishes = /* @__PURE__ */ new Map();\n ws;\n challenge;\n authPromise;\n serial = 0;\n verifyEvent;\n _WebSocket;\n constructor(url, opts) {\n this.url = normalizeURL(url);\n this.verifyEvent = opts.verifyEvent;\n this._WebSocket = opts.websocketImplementation || WebSocket;\n this.enablePing = opts.enablePing;\n this.enableReconnect = opts.enableReconnect || false;\n }\n static async connect(url, opts) {\n const relay = new AbstractRelay(url, opts);\n await relay.connect(opts);\n return relay;\n }\n closeAllSubscriptions(reason) {\n for (let [_, sub] of this.openSubs) {\n sub.close(reason);\n }\n this.openSubs.clear();\n for (let [_, ep] of this.openEventPublishes) {\n ep.reject(new Error(reason));\n }\n this.openEventPublishes.clear();\n for (let [_, cr] of this.openCountRequests) {\n cr.reject(new Error(reason));\n }\n this.openCountRequests.clear();\n }\n get connected() {\n return this._connected;\n }\n async reconnect() {\n const backoff = this.resubscribeBackoff[Math.min(this.reconnectAttempts, this.resubscribeBackoff.length - 1)];\n this.reconnectAttempts++;\n this.reconnectTimeoutHandle = setTimeout(async () => {\n try {\n await this.connect();\n } catch (err) {\n }\n }, backoff);\n }\n handleHardClose(reason) {\n if (this.pingIntervalHandle) {\n clearInterval(this.pingIntervalHandle);\n this.pingIntervalHandle = void 0;\n }\n this._connected = false;\n this.connectionPromise = void 0;\n this.idleSince = void 0;\n if (this.enableReconnect && !this.skipReconnection) {\n this.reconnect();\n } else {\n this.onclose?.();\n this.closeAllSubscriptions(reason);\n }\n }\n async connect(opts) {\n let connectionTimeoutHandle;\n if (this.connectionPromise)\n return this.connectionPromise;\n this.challenge = void 0;\n this.authPromise = void 0;\n this.skipReconnection = false;\n this.connectionPromise = new Promise((resolve, reject) => {\n if (opts?.timeout) {\n connectionTimeoutHandle = setTimeout(() => {\n reject(\"connection timed out\");\n this.connectionPromise = void 0;\n this.skipReconnection = true;\n this.onclose?.();\n this.handleHardClose(\"relay connection timed out\");\n }, opts.timeout);\n }\n if (opts?.abort) {\n opts.abort.onabort = reject;\n }\n try {\n this.ws = new this._WebSocket(this.url);\n } catch (err) {\n clearTimeout(connectionTimeoutHandle);\n reject(err);\n return;\n }\n this.ws.onopen = () => {\n if (this.reconnectTimeoutHandle) {\n clearTimeout(this.reconnectTimeoutHandle);\n this.reconnectTimeoutHandle = void 0;\n }\n clearTimeout(connectionTimeoutHandle);\n this._connected = true;\n const isReconnection = this.reconnectAttempts > 0;\n this.reconnectAttempts = 0;\n for (const sub of this.openSubs.values()) {\n sub.eosed = false;\n if (isReconnection) {\n for (let f = 0; f < sub.filters.length; f++) {\n if (sub.lastEmitted) {\n sub.filters[f].since = sub.lastEmitted + 1;\n }\n }\n }\n sub.fire();\n }\n if (this.enablePing) {\n this.pingIntervalHandle = setInterval(() => this.pingpong(), this.pingFrequency);\n }\n resolve();\n };\n this.ws.onerror = () => {\n clearTimeout(connectionTimeoutHandle);\n reject(\"connection failed\");\n this.connectionPromise = void 0;\n this.skipReconnection = true;\n this.onclose?.();\n this.handleHardClose(\"relay connection failed\");\n };\n this.ws.onclose = (ev) => {\n clearTimeout(connectionTimeoutHandle);\n reject(ev.message || \"websocket closed\");\n this.handleHardClose(\"relay connection closed\");\n };\n this.ws.onmessage = this._onmessage.bind(this);\n });\n return this.connectionPromise;\n }\n waitForPingPong() {\n return new Promise((resolve) => {\n ;\n this.ws.once(\"pong\", () => resolve(true));\n this.ws.ping();\n });\n }\n waitForDummyReq() {\n return new Promise((resolve, reject) => {\n if (!this.connectionPromise)\n return reject(new Error(`no connection to ${this.url}, can't ping`));\n try {\n const sub = this.subscribe(\n [{ ids: [\"aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\"], limit: 0 }],\n {\n label: \"<forced-ping>\",\n oneose: () => {\n resolve(true);\n sub.close();\n },\n onclose() {\n resolve(true);\n },\n eoseTimeout: this.pingTimeout + 1e3\n }\n );\n } catch (err) {\n reject(err);\n }\n });\n }\n async pingpong() {\n if (this.ws?.readyState === 1) {\n const result = await Promise.any([\n this.ws && this.ws.ping && this.ws.once ? this.waitForPingPong() : this.waitForDummyReq(),\n new Promise((res) => setTimeout(() => res(false), this.pingTimeout))\n ]);\n if (!result) {\n if (this.ws?.readyState === this._WebSocket.OPEN) {\n this.ws?.close();\n }\n }\n }\n }\n async send(message) {\n if (!this.connectionPromise)\n throw new SendingOnClosedConnection(message, this.url);\n this.connectionPromise.then(() => {\n this.ws?.send(message);\n });\n }\n async auth(signAuthEvent) {\n const challenge = this.challenge;\n if (!challenge)\n throw new Error(\"can't perform auth, no challenge was received\");\n if (this.authPromise)\n return this.authPromise;\n this.authPromise = new Promise(async (resolve, reject) => {\n try {\n let evt = await signAuthEvent(makeAuthEvent(this.url, challenge));\n let timeout = setTimeout(() => {\n let ep = this.openEventPublishes.get(evt.id);\n if (ep) {\n ep.reject(new Error(\"auth timed out\"));\n this.openEventPublishes.delete(evt.id);\n }\n }, this.publishTimeout);\n this.openEventPublishes.set(evt.id, { resolve, reject, timeout });\n this.send('[\"AUTH\",' + JSON.stringify(evt) + \"]\");\n } catch (err) {\n console.warn(\"subscribe auth function failed:\", err);\n }\n });\n return this.authPromise;\n }\n async publish(event) {\n this.idleSince = void 0;\n this.ongoingOperations++;\n const ret = new Promise((resolve, reject) => {\n const timeout = setTimeout(() => {\n const ep = this.openEventPublishes.get(event.id);\n if (ep) {\n ep.reject(new Error(\"publish timed out\"));\n this.openEventPublishes.delete(event.id);\n }\n }, this.publishTimeout);\n this.openEventPublishes.set(event.id, { resolve, reject, timeout });\n });\n this.send('[\"EVENT\",' + JSON.stringify(event) + \"]\");\n this.ongoingOperations--;\n if (this.ongoingOperations === 0)\n this.idleSince = Date.now();\n return ret;\n }\n async count(filters, params) {\n this.serial++;\n const id = params?.id || \"count:\" + this.serial;\n const ret = new Promise((resolve, reject) => {\n this.openCountRequests.set(id, { resolve, reject });\n });\n this.send('[\"COUNT\",\"' + id + '\",' + JSON.stringify(filters).substring(1));\n return ret;\n }\n subscribe(filters, params) {\n if (params.label !== \"<forced-ping>\") {\n this.idleSince = void 0;\n this.ongoingOperations++;\n }\n const sub = this.prepareSubscription(filters, params);\n sub.fire();\n if (params.abort) {\n params.abort.onabort = () => sub.close(String(params.abort.reason || \"<aborted>\"));\n }\n return sub;\n }\n prepareSubscription(filters, params) {\n this.serial++;\n const id = params.id || (params.label ? params.label + \":\" : \"sub:\") + this.serial;\n const sub = new Subscription(this, id, filters, params);\n this.openSubs.set(id, sub);\n return sub;\n }\n close() {\n this.skipReconnection = true;\n if (this.reconnectTimeoutHandle) {\n clearTimeout(this.reconnectTimeoutHandle);\n this.reconnectTimeoutHandle = void 0;\n }\n if (this.pingIntervalHandle) {\n clearInterval(this.pingIntervalHandle);\n this.pingIntervalHandle = void 0;\n }\n this.closeAllSubscriptions(\"relay connection closed by us\");\n this._connected = false;\n this.idleSince = void 0;\n this.onclose?.();\n if (this.ws?.readyState === this._WebSocket.OPEN) {\n this.ws?.close();\n }\n }\n _onmessage(ev) {\n const json = ev.data;\n if (!json) {\n return;\n }\n const subid = getSubscriptionId(json);\n if (subid) {\n const so = this.openSubs.get(subid);\n if (!so) {\n return;\n }\n const id = getHex64(json, \"id\");\n const alreadyHave = so.alreadyHaveEvent?.(id);\n so.receivedEvent?.(this, id);\n if (alreadyHave) {\n return;\n }\n }\n try {\n let data = JSON.parse(json);\n switch (data[0]) {\n case \"EVENT\": {\n const so = this.openSubs.get(data[1]);\n const event = data[2];\n if (this.verifyEvent(event) && matchFilters(so.filters, event)) {\n so.onevent(event);\n } else {\n so.oninvalidevent?.(event);\n }\n if (!so.lastEmitted || so.lastEmitted < event.created_at)\n so.lastEmitted = event.created_at;\n return;\n }\n case \"COUNT\": {\n const id = data[1];\n const payload = data[2];\n const cr = this.openCountRequests.get(id);\n if (cr) {\n cr.resolve(payload.count);\n this.openCountRequests.delete(id);\n }\n return;\n }\n case \"EOSE\": {\n const so = this.openSubs.get(data[1]);\n if (!so)\n return;\n so.receivedEose();\n return;\n }\n case \"OK\": {\n const id = data[1];\n const ok = data[2];\n const reason = data[3];\n const ep = this.openEventPublishes.get(id);\n if (ep) {\n clearTimeout(ep.timeout);\n if (ok)\n ep.resolve(reason);\n else\n ep.reject(new Error(reason));\n this.openEventPublishes.delete(id);\n }\n return;\n }\n case \"CLOSED\": {\n const id = data[1];\n const so = this.openSubs.get(id);\n if (!so)\n return;\n so.closed = true;\n so.close(data[2]);\n return;\n }\n case \"NOTICE\": {\n this.onnotice(data[1]);\n return;\n }\n case \"AUTH\": {\n this.challenge = data[1];\n if (this.onauth) {\n this.auth(this.onauth);\n }\n return;\n }\n default: {\n const so = this.openSubs.get(data[1]);\n so?.oncustom?.(data);\n return;\n }\n }\n } catch (err) {\n try {\n const [_, __, event] = JSON.parse(json);\n console.warn(`[nostr] relay ${this.url} error processing message:`, err, event);\n } catch (_) {\n console.warn(`[nostr] relay ${this.url} error processing message:`, err);\n }\n return;\n }\n }\n};\nvar Subscription = class {\n relay;\n id;\n lastEmitted;\n closed = false;\n eosed = false;\n filters;\n alreadyHaveEvent;\n receivedEvent;\n onevent;\n oninvalidevent;\n oneose;\n onclose;\n oncustom;\n eoseTimeout;\n eoseTimeoutHandle;\n constructor(relay, id, filters, params) {\n if (filters.length === 0)\n throw new Error(\"subscription can't be created with zero filters\");\n this.relay = relay;\n this.filters = filters;\n this.id = id;\n this.alreadyHaveEvent = params.alreadyHaveEvent;\n this.receivedEvent = params.receivedEvent;\n this.eoseTimeout = params.eoseTimeout || relay.baseEoseTimeout;\n this.oneose = params.oneose;\n this.onclose = params.onclose;\n this.oninvalidevent = params.oninvalidevent;\n this.onevent = params.onevent || ((event) => {\n console.warn(\n `onevent() callback not defined for subscription '${this.id}' in relay ${this.relay.url}. event received:`,\n event\n );\n });\n }\n fire() {\n this.relay.send('[\"REQ\",\"' + this.id + '\",' + JSON.stringify(this.filters).substring(1));\n this.eoseTimeoutHandle = setTimeout(this.receivedEose.bind(this), this.eoseTimeout);\n }\n receivedEose() {\n if (this.eosed)\n return;\n clearTimeout(this.eoseTimeoutHandle);\n this.eosed = true;\n this.oneose?.();\n }\n close(reason = \"closed by caller\") {\n if (!this.closed && this.relay.connected) {\n try {\n this.relay.send('[\"CLOSE\",' + JSON.stringify(this.id) + \"]\");\n } catch (err) {\n if (err instanceof SendingOnClosedConnection) {\n } else {\n throw err;\n }\n }\n this.closed = true;\n }\n this.relay.openSubs.delete(this.id);\n this.relay.ongoingOperations--;\n if (this.relay.ongoingOperations === 0)\n this.relay.idleSince = Date.now();\n this.onclose?.(reason);\n }\n};\n\n// relay.ts\nvar _WebSocket;\ntry {\n _WebSocket = WebSocket;\n} catch {\n}\nvar Relay = class extends AbstractRelay {\n constructor(url, options) {\n super(url, { verifyEvent, websocketImplementation: _WebSocket, ...options });\n }\n static async connect(url, options) {\n const relay = new Relay(url, options);\n await relay.connect();\n return relay;\n }\n};\n\n// helpers.ts\nvar alwaysTrue = (t) => {\n t[verifiedSymbol] = true;\n return true;\n};\n\n// abstract-pool.ts\nvar AbstractSimplePool = class {\n relays = /* @__PURE__ */ new Map();\n seenOn = /* @__PURE__ */ new Map();\n trackRelays = false;\n verifyEvent;\n enablePing;\n enableReconnect;\n automaticallyAuth;\n trustedRelayURLs = /* @__PURE__ */ new Set();\n onRelayConnectionFailure;\n onRelayConnectionSuccess;\n allowConnectingToRelay;\n maxWaitForConnection;\n _WebSocket;\n constructor(opts) {\n this.verifyEvent = opts.verifyEvent;\n this._WebSocket = opts.websocketImplementation;\n this.enablePing = opts.enablePing;\n this.enableReconnect = opts.enableReconnect || false;\n this.automaticallyAuth = opts.automaticallyAuth;\n this.onRelayConnectionFailure = opts.onRelayConnectionFailure;\n this.onRelayConnectionSuccess = opts.onRelayConnectionSuccess;\n this.allowConnectingToRelay = opts.allowConnectingToRelay;\n this.maxWaitForConnection = opts.maxWaitForConnection || 3e3;\n }\n async ensureRelay(url, params) {\n url = normalizeURL(url);\n let relay = this.relays.get(url);\n if (!relay) {\n relay = new AbstractRelay(url, {\n verifyEvent: this.trustedRelayURLs.has(url) ? alwaysTrue : this.verifyEvent,\n websocketImplementation: this._WebSocket,\n enablePing: this.enablePing,\n enableReconnect: this.enableReconnect\n });\n relay.onclose = () => {\n this.relays.delete(url);\n };\n this.relays.set(url, relay);\n }\n if (this.automaticallyAuth) {\n const authSignerFn = this.automaticallyAuth(url);\n if (authSignerFn) {\n relay.onauth = authSignerFn;\n }\n }\n try {\n await relay.connect({\n timeout: params?.connectionTimeout,\n abort: params?.abort\n });\n } catch (err) {\n this.relays.delete(url);\n throw err;\n }\n return relay;\n }\n close(relays) {\n relays.map(normalizeURL).forEach((url) => {\n this.relays.get(url)?.close();\n this.relays.delete(url);\n });\n }\n subscribe(relays, filter, params) {\n const request = [];\n const uniqUrls = [];\n for (let i2 = 0; i2 < relays.length; i2++) {\n const url = normalizeURL(relays[i2]);\n if (!request.find((r) => r.url === url)) {\n if (uniqUrls.indexOf(url) === -1) {\n uniqUrls.push(url);\n request.push({ url, filter });\n }\n }\n }\n return this.subscribeMap(request, params);\n }\n subscribeMany(relays, filter, params) {\n return this.subscribe(relays, filter, params);\n }\n subscribeMap(requests, params) {\n const grouped = /* @__PURE__ */ new Map();\n for (const req of requests) {\n const { url, filter } = req;\n if (!grouped.has(url))\n grouped.set(url, []);\n grouped.get(url).push(filter);\n }\n const groupedRequests = Array.from(grouped.entries()).map(([url, filters]) => ({ url, filters }));\n if (this.trackRelays) {\n params.receivedEvent = (relay, id) => {\n let set = this.seenOn.get(id);\n if (!set) {\n set = /* @__PURE__ */ new Set();\n this.seenOn.set(id, set);\n }\n set.add(relay);\n };\n }\n const _knownIds = /* @__PURE__ */ new Set();\n const subs = [];\n const eosesReceived = [];\n let handleEose = (i2) => {\n if (eosesReceived[i2])\n return;\n eosesReceived[i2] = true;\n if (eosesReceived.filter((a) => a).length === groupedRequests.length) {\n params.oneose?.();\n handleEose = () => {\n };\n }\n };\n const closesReceived = [];\n let handleClose = (i2, reason) => {\n if (closesReceived[i2])\n return;\n handleEose(i2);\n closesReceived[i2] = reason;\n if (closesReceived.filter((a) => a).length === groupedRequests.length) {\n params.onclose?.(closesReceived);\n handleClose = () => {\n };\n }\n };\n const localAlreadyHaveEventHandler = (id) => {\n if (params.alreadyHaveEvent?.(id)) {\n return true;\n }\n const have = _knownIds.has(id);\n _knownIds.add(id);\n return have;\n };\n const allOpened = Promise.all(\n groupedRequests.map(async ({ url, filters }, i2) => {\n if (this.allowConnectingToRelay?.(url, [\"read\", filters]) === false) {\n handleClose(i2, \"connection skipped by allowConnectingToRelay\");\n return;\n }\n let relay;\n try {\n relay = await this.ensureRelay(url, {\n connectionTimeout: this.maxWaitForConnection < (params.maxWait || 0) ? Math.max(params.maxWait * 0.8, params.maxWait - 1e3) : this.maxWaitForConnection,\n abort: params.abort\n });\n } catch (err) {\n this.onRelayConnectionFailure?.(url);\n handleClose(i2, err?.message || String(err));\n return;\n }\n this.onRelayConnectionSuccess?.(url);\n let subscription = relay.subscribe(filters, {\n ...params,\n oneose: () => handleEose(i2),\n onclose: (reason) => {\n if (reason.startsWith(\"auth-required: \") && params.onauth) {\n relay.auth(params.onauth).then(() => {\n relay.subscribe(filters, {\n ...params,\n oneose: () => handleEose(i2),\n onclose: (reason2) => {\n handleClose(i2, reason2);\n },\n alreadyHaveEvent: localAlreadyHaveEventHandler,\n eoseTimeout: params.maxWait,\n abort: params.abort\n });\n }).catch((err) => {\n handleClose(i2, `auth was required and attempted, but failed with: ${err}`);\n });\n } else {\n handleClose(i2, reason);\n }\n },\n alreadyHaveEvent: localAlreadyHaveEventHandler,\n eoseTimeout: params.maxWait,\n abort: params.abort\n });\n subs.push(subscription);\n })\n );\n return {\n async close(reason) {\n await allOpened;\n subs.forEach((sub) => {\n sub.close(reason);\n });\n }\n };\n }\n subscribeEose(relays, filter, params) {\n let subcloser;\n subcloser = this.subscribe(relays, filter, {\n ...params,\n oneose() {\n const reason = \"closed automatically on eose\";\n if (subcloser)\n subcloser.close(reason);\n else\n params.onclose?.(relays.map((_) => reason));\n }\n });\n return subcloser;\n }\n subscribeManyEose(relays, filter, params) {\n return this.subscribeEose(relays, filter, params);\n }\n async querySync(relays, filter, params) {\n return new Promise(async (resolve) => {\n const events = [];\n this.subscribeEose(relays, filter, {\n ...params,\n onevent(event) {\n events.push(event);\n },\n onclose(_) {\n resolve(events);\n }\n });\n });\n }\n async get(relays, filter, params) {\n filter.limit = 1;\n const events = await this.querySync(relays, filter, params);\n events.sort((a, b) => b.created_at - a.created_at);\n return events[0] || null;\n }\n publish(relays, event, params) {\n return relays.map(normalizeURL).map(async (url, i2, arr) => {\n if (arr.indexOf(url) !== i2) {\n return Promise.reject(\"duplicate url\");\n }\n if (this.allowConnectingToRelay?.(url, [\"write\", event]) === false) {\n return Promise.reject(\"connection skipped by allowConnectingToRelay\");\n }\n let r;\n try {\n r = await this.ensureRelay(url, {\n connectionTimeout: this.maxWaitForConnection < (params?.maxWait || 0) ? Math.max(params.maxWait * 0.8, params.maxWait - 1e3) : this.maxWaitForConnection,\n abort: params?.abort\n });\n } catch (err) {\n this.onRelayConnectionFailure?.(url);\n return String(\"connection failure: \" + String(err));\n }\n return r.publish(event).catch(async (err) => {\n if (err instanceof Error && err.message.startsWith(\"auth-required: \") && params?.onauth) {\n await r.auth(params.onauth);\n return r.publish(event);\n }\n throw err;\n }).then((reason) => {\n if (this.trackRelays) {\n let set = this.seenOn.get(event.id);\n if (!set) {\n set = /* @__PURE__ */ new Set();\n this.seenOn.set(event.id, set);\n }\n set.add(r);\n }\n return reason;\n });\n });\n }\n listConnectionStatus() {\n const map = /* @__PURE__ */ new Map();\n this.relays.forEach((relay, url) => map.set(url, relay.connected));\n return map;\n }\n destroy() {\n this.relays.forEach((conn) => conn.close());\n this.relays = /* @__PURE__ */ new Map();\n }\n pruneIdleRelays(idleThresholdMs = 1e4) {\n const prunedUrls = [];\n for (const [url, relay] of this.relays) {\n if (relay.idleSince && Date.now() - relay.idleSince >= idleThresholdMs) {\n this.relays.delete(url);\n prunedUrls.push(url);\n relay.close();\n }\n }\n return prunedUrls;\n }\n};\n\n// pool.ts\nvar _WebSocket2;\ntry {\n _WebSocket2 = WebSocket;\n} catch {\n}\nvar SimplePool = class extends AbstractSimplePool {\n constructor(options) {\n super({ verifyEvent, websocketImplementation: _WebSocket2, maxWaitForConnection: 3e3, ...options });\n }\n};\n\n// nip19.ts\nvar nip19_exports = {};\n__export(nip19_exports, {\n BECH32_REGEX: () => BECH32_REGEX,\n Bech32MaxSize: () => Bech32MaxSize,\n NostrTypeGuard: () => NostrTypeGuard,\n decode: () => decode,\n decodeNostrURI: () => decodeNostrURI,\n encodeBytes: () => encodeBytes,\n naddrEncode: () => naddrEncode,\n neventEncode: () => neventEncode,\n noteEncode: () => noteEncode,\n nprofileEncode: () => nprofileEncode,\n npubEncode: () => npubEncode,\n nsecEncode: () => nsecEncode\n});\nimport { bytesToHex as bytesToHex3, concatBytes, hexToBytes as hexToBytes3 } from \"@noble/hashes/utils.js\";\nimport { bech32 } from \"@scure/base\";\nvar NostrTypeGuard = {\n isNProfile: (value) => /^nprofile1[a-z\\d]+$/.test(value || \"\"),\n isNEvent: (value) => /^nevent1[a-z\\d]+$/.test(value || \"\"),\n isNAddr: (value) => /^naddr1[a-z\\d]+$/.test(value || \"\"),\n isNSec: (value) => /^nsec1[a-z\\d]{58}$/.test(value || \"\"),\n isNPub: (value) => /^npub1[a-z\\d]{58}$/.test(value || \"\"),\n isNote: (value) => /^note1[a-z\\d]+$/.test(value || \"\"),\n isNcryptsec: (value) => /^ncryptsec1[a-z\\d]+$/.test(value || \"\")\n};\nvar Bech32MaxSize = 5e3;\nvar BECH32_REGEX = /[\\x21-\\x7E]{1,83}1[023456789acdefghjklmnpqrstuvwxyz]{6,}/;\nfunction integerToUint8Array(number) {\n const uint8Array = new Uint8Array(4);\n uint8Array[0] = number >> 24 & 255;\n uint8Array[1] = number >> 16 & 255;\n uint8Array[2] = number >> 8 & 255;\n uint8Array[3] = number & 255;\n return uint8Array;\n}\nfunction decodeNostrURI(nip19code) {\n try {\n if (nip19code.startsWith(\"nostr:\"))\n nip19code = nip19code.substring(6);\n return decode(nip19code);\n } catch (_err) {\n return { type: \"invalid\", data: null };\n }\n}\nfunction decode(code) {\n let { prefix, words } = bech32.decode(code, Bech32MaxSize);\n let data = new Uint8Array(bech32.fromWords(words));\n switch (prefix) {\n case \"nprofile\": {\n let tlv = parseTLV(data);\n if (!tlv[0]?.[0])\n throw new Error(\"missing TLV 0 for nprofile\");\n if (tlv[0][0].length !== 32)\n throw new Error(\"TLV 0 should be 32 bytes\");\n return {\n type: \"nprofile\",\n data: {\n pubkey: bytesToHex3(tlv[0][0]),\n relays: tlv[1] ? tlv[1].map((d) => utf8Decoder.decode(d)) : []\n }\n };\n }\n case \"nevent\": {\n let tlv = parseTLV(data);\n if (!tlv[0]?.[0])\n throw new Error(\"missing TLV 0 for nevent\");\n if (tlv[0][0].length !== 32)\n throw new Error(\"TLV 0 should be 32 bytes\");\n if (tlv[2] && tlv[2][0].length !== 32)\n throw new Error(\"TLV 2 should be 32 bytes\");\n if (tlv[3] && tlv[3][0].length !== 4)\n throw new Error(\"TLV 3 should be 4 bytes\");\n return {\n type: \"nevent\",\n data: {\n id: bytesToHex3(tlv[0][0]),\n relays: tlv[1] ? tlv[1].map((d) => utf8Decoder.decode(d)) : [],\n author: tlv[2]?.[0] ? bytesToHex3(tlv[2][0]) : void 0,\n kind: tlv[3]?.[0] ? parseInt(bytesToHex3(tlv[3][0]), 16) : void 0\n }\n };\n }\n case \"naddr\": {\n let tlv = parseTLV(data);\n if (!tlv[0]?.[0])\n throw new Error(\"missing TLV 0 for naddr\");\n if (!tlv[2]?.[0])\n throw new Error(\"missing TLV 2 for naddr\");\n if (tlv[2][0].length !== 32)\n throw new Error(\"TLV 2 should be 32 bytes\");\n if (!tlv[3]?.[0])\n throw new Error(\"missing TLV 3 for naddr\");\n if (tlv[3][0].length !== 4)\n throw new Error(\"TLV 3 should be 4 bytes\");\n return {\n type: \"naddr\",\n data: {\n identifier: utf8Decoder.decode(tlv[0][0]),\n pubkey: bytesToHex3(tlv[2][0]),\n kind: parseInt(bytesToHex3(tlv[3][0]), 16),\n relays: tlv[1] ? tlv[1].map((d) => utf8Decoder.decode(d)) : []\n }\n };\n }\n case \"nsec\":\n return { type: prefix, data };\n case \"npub\":\n case \"note\":\n return { type: prefix, data: bytesToHex3(data) };\n default:\n throw new Error(`unknown prefix ${prefix}`);\n }\n}\nfunction parseTLV(data) {\n let result = {};\n let rest = data;\n while (rest.length > 0) {\n let t = rest[0];\n let l = rest[1];\n let v = rest.slice(2, 2 + l);\n rest = rest.slice(2 + l);\n if (v.length < l)\n throw new Error(`not enough data to read on TLV ${t}`);\n result[t] = result[t] || [];\n result[t].push(v);\n }\n return result;\n}\nfunction nsecEncode(key) {\n return encodeBytes(\"nsec\", key);\n}\nfunction npubEncode(hex) {\n return encodeBytes(\"npub\", hexToBytes3(hex));\n}\nfunction noteEncode(hex) {\n return encodeBytes(\"note\", hexToBytes3(hex));\n}\nfunction encodeBech32(prefix, data) {\n let words = bech32.toWords(data);\n return bech32.encode(prefix, words, Bech32MaxSize);\n}\nfunction encodeBytes(prefix, bytes) {\n return encodeBech32(prefix, bytes);\n}\nfunction nprofileEncode(profile) {\n let data = encodeTLV({\n 0: [hexToBytes3(profile.pubkey)],\n 1: (profile.relays || []).map((url) => utf8Encoder.encode(url))\n });\n return encodeBech32(\"nprofile\", data);\n}\nfunction neventEncode(event) {\n let kindArray;\n if (event.kind !== void 0) {\n kindArray = integerToUint8Array(event.kind);\n }\n let data = encodeTLV({\n 0: [hexToBytes3(event.id)],\n 1: (event.relays || []).map((url) => utf8Encoder.encode(url)),\n 2: event.author ? [hexToBytes3(event.author)] : [],\n 3: kindArray ? [new Uint8Array(kindArray)] : []\n });\n return encodeBech32(\"nevent\", data);\n}\nfunction naddrEncode(addr) {\n let kind = new ArrayBuffer(4);\n new DataView(kind).setUint32(0, addr.kind, false);\n let data = encodeTLV({\n 0: [utf8Encoder.encode(addr.identifier)],\n 1: (addr.relays || []).map((url) => utf8Encoder.encode(url)),\n 2: [hexToBytes3(addr.pubkey)],\n 3: [new Uint8Array(kind)]\n });\n return encodeBech32(\"naddr\", data);\n}\nfunction encodeTLV(tlv) {\n let entries = [];\n Object.entries(tlv).reverse().forEach(([t, vs]) => {\n vs.forEach((v) => {\n let entry = new Uint8Array(v.length + 2);\n entry.set([parseInt(t)], 0);\n entry.set([v.length], 1);\n entry.set(v, 2);\n entries.push(entry);\n });\n });\n return concatBytes(...entries);\n}\n\n// references.ts\nvar mentionRegex = /\\bnostr:((note|npub|naddr|nevent|nprofile)1\\w+)\\b|#\\[(\\d+)\\]/g;\nfunction parseReferences(evt) {\n let references = [];\n for (let ref of evt.content.matchAll(mentionRegex)) {\n if (ref[2]) {\n try {\n let { type, data } = decode(ref[1]);\n switch (type) {\n case \"npub\": {\n references.push({\n text: ref[0],\n profile: { pubkey: data, relays: [] }\n });\n break;\n }\n case \"nprofile\": {\n references.push({\n text: ref[0],\n profile: data\n });\n break;\n }\n case \"note\": {\n references.push({\n text: ref[0],\n event: { id: data, relays: [] }\n });\n break;\n }\n case \"nevent\": {\n references.push({\n text: ref[0],\n event: data\n });\n break;\n }\n case \"naddr\": {\n references.push({\n text: ref[0],\n address: data\n });\n break;\n }\n }\n } catch (err) {\n }\n } else if (ref[3]) {\n let idx = parseInt(ref[3], 10);\n let tag = evt.tags[idx];\n if (!tag)\n continue;\n switch (tag[0]) {\n case \"p\": {\n references.push({\n text: ref[0],\n profile: { pubkey: tag[1], relays: tag[2] ? [tag[2]] : [] }\n });\n break;\n }\n case \"e\": {\n references.push({\n text: ref[0],\n event: { id: tag[1], relays: tag[2] ? [tag[2]] : [] }\n });\n break;\n }\n case \"a\": {\n try {\n let [kind, pubkey, identifier] = tag[1].split(\":\");\n references.push({\n text: ref[0],\n address: {\n identifier,\n pubkey,\n kind: parseInt(kind, 10),\n relays: tag[2] ? [tag[2]] : []\n }\n });\n } catch (err) {\n }\n break;\n }\n }\n }\n }\n return references;\n}\n\n// nip04.ts\nvar nip04_exports = {};\n__export(nip04_exports, {\n decrypt: () => decrypt,\n encrypt: () => encrypt\n});\nimport { hexToBytes as hexToBytes4, randomBytes } from \"@noble/hashes/utils.js\";\nimport { secp256k1 } from \"@noble/curves/secp256k1.js\";\nimport { cbc } from \"@noble/ciphers/aes.js\";\nimport { base64 } from \"@scure/base\";\nfunction encrypt(secretKey, pubkey, text) {\n const privkey = secretKey instanceof Uint8Array ? secretKey : hexToBytes4(secretKey);\n const key = secp256k1.getSharedSecret(privkey, hexToBytes4(\"02\" + pubkey));\n const normalizedKey = getNormalizedX(key);\n let iv = Uint8Array.from(randomBytes(16));\n let plaintext = utf8Encoder.encode(text);\n let ciphertext = cbc(normalizedKey, iv).encrypt(plaintext);\n let ctb64 = base64.encode(new Uint8Array(ciphertext));\n let ivb64 = base64.encode(new Uint8Array(iv.buffer));\n return `${ctb64}?iv=${ivb64}`;\n}\nfunction decrypt(secretKey, pubkey, data) {\n const privkey = secretKey instanceof Uint8Array ? secretKey : hexToBytes4(secretKey);\n let [ctb64, ivb64] = data.split(\"?iv=\");\n let key = secp256k1.getSharedSecret(privkey, hexToBytes4(\"02\" + pubkey));\n let normalizedKey = getNormalizedX(key);\n let iv = base64.decode(ivb64);\n let ciphertext = base64.decode(ctb64);\n let plaintext = cbc(normalizedKey, iv).decrypt(ciphertext);\n return utf8Decoder.decode(plaintext);\n}\nfunction getNormalizedX(key) {\n return key.slice(1, 33);\n}\n\n// nip05.ts\nvar nip05_exports = {};\n__export(nip05_exports, {\n NIP05_REGEX: () => NIP05_REGEX,\n isNip05: () => isNip05,\n isValid: () => isValid,\n queryProfile: () => queryProfile,\n searchDomain: () => searchDomain,\n useFetchImplementation: () => useFetchImplementation\n});\nvar NIP05_REGEX = /^(?:([\\w.+-]+)@)?([\\w_-]+(\\.[\\w_-]+)+)$/;\nvar isNip05 = (value) => NIP05_REGEX.test(value || \"\");\nvar _fetch;\ntry {\n _fetch = fetch;\n} catch (_) {\n null;\n}\nfunction useFetchImplementation(fetchImplementation) {\n _fetch = fetchImplementation;\n}\nasync function searchDomain(domain, query = \"\") {\n try {\n const url = `https://${domain}/.well-known/nostr.json?name=${query}`;\n const res = await _fetch(url, { redirect: \"manual\" });\n if (res.status !== 200) {\n throw Error(\"Wrong response code\");\n }\n const json = await res.json();\n return json.names;\n } catch (_) {\n return {};\n }\n}\nasync function queryProfile(fullname) {\n const match = fullname.match(NIP05_REGEX);\n if (!match)\n return null;\n const [, name = \"_\", domain] = match;\n try {\n const url = `https://${domain}/.well-known/nostr.json?name=${name}`;\n const res = await _fetch(url, { redirect: \"manual\" });\n if (res.status !== 200) {\n throw Error(\"Wrong response code\");\n }\n const json = await res.json();\n const pubkey = json.names[name];\n return pubkey ? { pubkey, relays: json.relays?.[pubkey] } : null;\n } catch (_e) {\n return null;\n }\n}\nasync function isValid(pubkey, nip05) {\n const res = await queryProfile(nip05);\n return res ? res.pubkey === pubkey : false;\n}\n\n// nip10.ts\nvar nip10_exports = {};\n__export(nip10_exports, {\n parse: () => parse\n});\nfunction parse(event) {\n const result = {\n reply: void 0,\n root: void 0,\n mentions: [],\n profiles: [],\n quotes: []\n };\n let maybeParent;\n let maybeRoot;\n for (let i2 = event.tags.length - 1; i2 >= 0; i2--) {\n const tag = event.tags[i2];\n if (tag[0] === \"e\" && tag[1]) {\n const [_, eTagEventId, eTagRelayUrl, eTagMarker, eTagAuthor] = tag;\n const eventPointer = {\n id: eTagEventId,\n relays: eTagRelayUrl ? [eTagRelayUrl] : [],\n author: eTagAuthor\n };\n if (eTagMarker === \"root\") {\n result.root = eventPointer;\n continue;\n }\n if (eTagMarker === \"reply\") {\n result.reply = eventPointer;\n continue;\n }\n if (eTagMarker === \"mention\") {\n result.mentions.push(eventPointer);\n continue;\n }\n if (!maybeParent) {\n maybeParent = eventPointer;\n } else {\n maybeRoot = eventPointer;\n }\n result.mentions.push(eventPointer);\n continue;\n }\n if (tag[0] === \"q\" && tag[1]) {\n const [_, eTagEventId, eTagRelayUrl] = tag;\n result.quotes.push({\n id: eTagEventId,\n relays: eTagRelayUrl ? [eTagRelayUrl] : []\n });\n }\n if (tag[0] === \"p\" && tag[1]) {\n result.profiles.push({\n pubkey: tag[1],\n relays: tag[2] ? [tag[2]] : []\n });\n continue;\n }\n }\n if (!result.root) {\n result.root = maybeRoot || maybeParent || result.reply;\n }\n if (!result.reply) {\n result.reply = maybeParent || result.root;\n }\n ;\n [result.reply, result.root].forEach((ref) => {\n if (!ref)\n return;\n let idx = result.mentions.indexOf(ref);\n if (idx !== -1) {\n result.mentions.splice(idx, 1);\n }\n if (ref.author) {\n let author = result.profiles.find((p) => p.pubkey === ref.author);\n if (author && author.relays) {\n if (!ref.relays) {\n ref.relays = [];\n }\n author.relays.forEach((url) => {\n if (ref.relays?.indexOf(url) === -1)\n ref.relays.push(url);\n });\n author.relays = ref.relays;\n }\n }\n });\n result.mentions.forEach((ref) => {\n if (ref.author) {\n let author = result.profiles.find((p) => p.pubkey === ref.author);\n if (author && author.relays) {\n if (!ref.relays) {\n ref.relays = [];\n }\n author.relays.forEach((url) => {\n if (ref.relays.indexOf(url) === -1)\n ref.relays.push(url);\n });\n author.relays = ref.relays;\n }\n }\n });\n return result;\n}\n\n// nip11.ts\nvar nip11_exports = {};\n__export(nip11_exports, {\n fetchRelayInformation: () => fetchRelayInformation,\n useFetchImplementation: () => useFetchImplementation2\n});\nvar _fetch2;\ntry {\n _fetch2 = fetch;\n} catch {\n}\nfunction useFetchImplementation2(fetchImplementation) {\n _fetch2 = fetchImplementation;\n}\nasync function fetchRelayInformation(url) {\n return await (await fetch(url.replace(\"ws://\", \"http://\").replace(\"wss://\", \"https://\"), {\n headers: { Accept: \"application/nostr+json\" }\n })).json();\n}\n\n// nip13.ts\nvar nip13_exports = {};\n__export(nip13_exports, {\n getPow: () => getPow,\n minePow: () => minePow\n});\nimport { bytesToHex as bytesToHex4 } from \"@noble/hashes/utils.js\";\nimport { sha256 as sha2562 } from \"@noble/hashes/sha2.js\";\nfunction getPow(hex) {\n let count = 0;\n for (let i2 = 0; i2 < 64; i2 += 8) {\n const nibble = parseInt(hex.substring(i2, i2 + 8), 16);\n if (nibble === 0) {\n count += 32;\n } else {\n count += Math.clz32(nibble);\n break;\n }\n }\n return count;\n}\nfunction getPowFromBytes(hash) {\n let count = 0;\n for (let i2 = 0; i2 < hash.length; i2++) {\n const byte = hash[i2];\n if (byte === 0) {\n count += 8;\n } else {\n count += Math.clz32(byte) - 24;\n break;\n }\n }\n return count;\n}\nfunction minePow(unsigned, difficulty) {\n let count = 0;\n const event = unsigned;\n const tag = [\"nonce\", count.toString(), difficulty.toString()];\n event.tags.push(tag);\n while (true) {\n const now2 = Math.floor(new Date().getTime() / 1e3);\n if (now2 !== event.created_at) {\n count = 0;\n event.created_at = now2;\n }\n tag[1] = (++count).toString();\n const hash = sha2562(\n utf8Encoder.encode(JSON.stringify([0, event.pubkey, event.created_at, event.kind, event.tags, event.content]))\n );\n if (getPowFromBytes(hash) >= difficulty) {\n event.id = bytesToHex4(hash);\n break;\n }\n }\n return event;\n}\n\n// nip17.ts\nvar nip17_exports = {};\n__export(nip17_exports, {\n unwrapEvent: () => unwrapEvent2,\n unwrapManyEvents: () => unwrapManyEvents2,\n wrapEvent: () => wrapEvent2,\n wrapManyEvents: () => wrapManyEvents2\n});\n\n// nip59.ts\nvar nip59_exports = {};\n__export(nip59_exports, {\n createRumor: () => createRumor,\n createSeal: () => createSeal,\n createWrap: () => createWrap,\n unwrapEvent: () => unwrapEvent,\n unwrapManyEvents: () => unwrapManyEvents,\n wrapEvent: () => wrapEvent,\n wrapManyEvents: () => wrapManyEvents\n});\n\n// nip44.ts\nvar nip44_exports = {};\n__export(nip44_exports, {\n decrypt: () => decrypt2,\n encrypt: () => encrypt2,\n getConversationKey: () => getConversationKey,\n v2: () => v2\n});\nimport { chacha20 } from \"@noble/ciphers/chacha.js\";\nimport { equalBytes } from \"@noble/ciphers/utils.js\";\nimport { secp256k1 as secp256k12 } from \"@noble/curves/secp256k1.js\";\nimport { extract as hkdf_extract, expand as hkdf_expand } from \"@noble/hashes/hkdf.js\";\nimport { hmac } from \"@noble/hashes/hmac.js\";\nimport { sha256 as sha2563 } from \"@noble/hashes/sha2.js\";\nimport { concatBytes as concatBytes2, hexToBytes as hexToBytes5, randomBytes as randomBytes2 } from \"@noble/hashes/utils.js\";\nimport { base64 as base642 } from \"@scure/base\";\nvar minPlaintextSize = 1;\nvar maxPlaintextSize = 65535;\nfunction getConversationKey(privkeyA, pubkeyB) {\n const sharedX = secp256k12.getSharedSecret(privkeyA, hexToBytes5(\"02\" + pubkeyB)).subarray(1, 33);\n return hkdf_extract(sha2563, sharedX, utf8Encoder.encode(\"nip44-v2\"));\n}\nfunction getMessageKeys(conversationKey, nonce) {\n const keys = hkdf_expand(sha2563, conversationKey, nonce, 76);\n return {\n chacha_key: keys.subarray(0, 32),\n chacha_nonce: keys.subarray(32, 44),\n hmac_key: keys.subarray(44, 76)\n };\n}\nfunction calcPaddedLen(len) {\n if (!Number.isSafeInteger(len) || len < 1)\n throw new Error(\"expected positive integer\");\n if (len <= 32)\n return 32;\n const nextPower = 1 << Math.floor(Math.log2(len - 1)) + 1;\n const chunk = nextPower <= 256 ? 32 : nextPower / 8;\n return chunk * (Math.floor((len - 1) / chunk) + 1);\n}\nfunction writeU16BE(num) {\n if (!Number.isSafeInteger(num) || num < minPlaintextSize || num > maxPlaintextSize)\n throw new Error(\"invalid plaintext size: must be between 1 and 65535 bytes\");\n const arr = new Uint8Array(2);\n new DataView(arr.buffer).setUint16(0, num, false);\n return arr;\n}\nfunction pad(plaintext) {\n const unpadded = utf8Encoder.encode(plaintext);\n const unpaddedLen = unpadded.length;\n const prefix = writeU16BE(unpaddedLen);\n const suffix = new Uint8Array(calcPaddedLen(unpaddedLen) - unpaddedLen);\n return concatBytes2(prefix, unpadded, suffix);\n}\nfunction unpad(padded) {\n const unpaddedLen = new DataView(padded.buffer).getUint16(0);\n const unpadded = padded.subarray(2, 2 + unpaddedLen);\n if (unpaddedLen < minPlaintextSize || unpaddedLen > maxPlaintextSize || unpadded.length !== unpaddedLen || padded.length !== 2 + calcPaddedLen(unpaddedLen))\n throw new Error(\"invalid padding\");\n return utf8Decoder.decode(unpadded);\n}\nfunction hmacAad(key, message, aad) {\n if (aad.length !== 32)\n throw new Error(\"AAD associated data must be 32 bytes\");\n const combined = concatBytes2(aad, message);\n return hmac(sha2563, key, combined);\n}\nfunction decodePayload(payload) {\n if (typeof payload !== \"string\")\n throw new Error(\"payload must be a valid string\");\n const plen = payload.length;\n if (plen < 132 || plen > 87472)\n throw new Error(\"invalid payload length: \" + plen);\n if (payload[0] === \"#\")\n throw new Error(\"unknown encryption version\");\n let data;\n try {\n data = base642.decode(payload);\n } catch (error) {\n throw new Error(\"invalid base64: \" + error.message);\n }\n const dlen = data.length;\n if (dlen < 99 || dlen > 65603)\n throw new Error(\"invalid data length: \" + dlen);\n const vers = data[0];\n if (vers !== 2)\n throw new Error(\"unknown encryption version \" + vers);\n return {\n nonce: data.subarray(1, 33),\n ciphertext: data.subarray(33, -32),\n mac: data.subarray(-32)\n };\n}\nfunction encrypt2(plaintext, conversationKey, nonce = randomBytes2(32)) {\n const { chacha_key, chacha_nonce, hmac_key } = getMessageKeys(conversationKey, nonce);\n const padded = pad(plaintext);\n const ciphertext = chacha20(chacha_key, chacha_nonce, padded);\n const mac = hmacAad(hmac_key, ciphertext, nonce);\n return base642.encode(concatBytes2(new Uint8Array([2]), nonce, ciphertext, mac));\n}\nfunction decrypt2(payload, conversationKey) {\n const { nonce, ciphertext, mac } = decodePayload(payload);\n const { chacha_key, chacha_nonce, hmac_key } = getMessageKeys(conversationKey, nonce);\n const calculatedMac = hmacAad(hmac_key, ciphertext, nonce);\n if (!equalBytes(calculatedMac, mac))\n throw new Error(\"invalid MAC\");\n const padded = chacha20(chacha_key, chacha_nonce, ciphertext);\n return unpad(padded);\n}\nvar v2 = {\n utils: {\n getConversationKey,\n calcPaddedLen\n },\n encrypt: encrypt2,\n decrypt: decrypt2\n};\n\n// nip59.ts\nvar TWO_DAYS = 2 * 24 * 60 * 60;\nvar now = () => Math.round(Date.now() / 1e3);\nvar randomNow = () => Math.round(now() - Math.random() * TWO_DAYS);\nvar nip44ConversationKey = (privateKey, publicKey) => getConversationKey(privateKey, publicKey);\nvar nip44Encrypt = (data, privateKey, publicKey) => encrypt2(JSON.stringify(data), nip44ConversationKey(privateKey, publicKey));\nvar nip44Decrypt = (data, privateKey) => JSON.parse(decrypt2(data.content, nip44ConversationKey(privateKey, data.pubkey)));\nfunction createRumor(event, privateKey) {\n const rumor = {\n created_at: now(),\n content: \"\",\n tags: [],\n ...event,\n pubkey: getPublicKey(privateKey)\n };\n rumor.id = getEventHash(rumor);\n return rumor;\n}\nfunction createSeal(rumor, privateKey, recipientPublicKey) {\n return finalizeEvent(\n {\n kind: Seal,\n content: nip44Encrypt(rumor, privateKey, recipientPublicKey),\n created_at: randomNow(),\n tags: []\n },\n privateKey\n );\n}\nfunction createWrap(seal, recipientPublicKey) {\n const randomKey = generateSecretKey();\n return finalizeEvent(\n {\n kind: GiftWrap,\n content: nip44Encrypt(seal, randomKey, recipientPublicKey),\n created_at: randomNow(),\n tags: [[\"p\", recipientPublicKey]]\n },\n randomKey\n );\n}\nfunction wrapEvent(event, senderPrivateKey, recipientPublicKey) {\n const rumor = createRumor(event, senderPrivateKey);\n const seal = createSeal(rumor, senderPrivateKey, recipientPublicKey);\n return createWrap(seal, recipientPublicKey);\n}\nfunction wrapManyEvents(event, senderPrivateKey, recipientsPublicKeys) {\n if (!recipientsPublicKeys || recipientsPublicKeys.length === 0) {\n throw new Error(\"At least one recipient is required.\");\n }\n const senderPublicKey = getPublicKey(senderPrivateKey);\n const wrappeds = [wrapEvent(event, senderPrivateKey, senderPublicKey)];\n recipientsPublicKeys.forEach((recipientPublicKey) => {\n wrappeds.push(wrapEvent(event, senderPrivateKey, recipientPublicKey));\n });\n return wrappeds;\n}\nfunction unwrapEvent(wrap, recipientPrivateKey) {\n const unwrappedSeal = nip44Decrypt(wrap, recipientPrivateKey);\n return nip44Decrypt(unwrappedSeal, recipientPrivateKey);\n}\nfunction unwrapManyEvents(wrappedEvents, recipientPrivateKey) {\n let unwrappedEvents = [];\n wrappedEvents.forEach((e) => {\n unwrappedEvents.push(unwrapEvent(e, recipientPrivateKey));\n });\n unwrappedEvents.sort((a, b) => a.created_at - b.created_at);\n return unwrappedEvents;\n}\n\n// nip17.ts\nfunction createEvent(recipients, message, conversationTitle, replyTo) {\n const baseEvent = {\n created_at: Math.ceil(Date.now() / 1e3),\n kind: PrivateDirectMessage,\n tags: [],\n content: message\n };\n const recipientsArray = Array.isArray(recipients) ? recipients : [recipients];\n recipientsArray.forEach(({ publicKey, relayUrl }) => {\n baseEvent.tags.push(relayUrl ? [\"p\", publicKey, relayUrl] : [\"p\", publicKey]);\n });\n if (replyTo) {\n baseEvent.tags.push([\"e\", replyTo.eventId, replyTo.relayUrl || \"\", \"reply\"]);\n }\n if (conversationTitle) {\n baseEvent.tags.push([\"subject\", conversationTitle]);\n }\n return baseEvent;\n}\nfunction wrapEvent2(senderPrivateKey, recipient, message, conversationTitle, replyTo) {\n const event = createEvent(recipient, message, conversationTitle, replyTo);\n return wrapEvent(event, senderPrivateKey, recipient.publicKey);\n}\nfunction wrapManyEvents2(senderPrivateKey, recipients, message, conversationTitle, replyTo) {\n if (!recipients || recipients.length === 0) {\n throw new Error(\"At least one recipient is required.\");\n }\n const senderPublicKey = getPublicKey(senderPrivateKey);\n return [{ publicKey: senderPublicKey }, ...recipients].map(\n (recipient) => wrapEvent2(senderPrivateKey, recipient, message, conversationTitle, replyTo)\n );\n}\nvar unwrapEvent2 = unwrapEvent;\nvar unwrapManyEvents2 = unwrapManyEvents;\n\n// nip18.ts\nvar nip18_exports = {};\n__export(nip18_exports, {\n finishRepostEvent: () => finishRepostEvent,\n getRepostedEvent: () => getRepostedEvent,\n getRepostedEventPointer: () => getRepostedEventPointer\n});\nfunction finishRepostEvent(t, reposted, relayUrl, privateKey) {\n let kind;\n const tags = [...t.tags ?? [], [\"e\", reposted.id, relayUrl], [\"p\", reposted.pubkey]];\n if (reposted.kind === ShortTextNote) {\n kind = Repost;\n } else {\n kind = GenericRepost;\n tags.push([\"k\", String(reposted.kind)]);\n }\n return finalizeEvent(\n {\n kind,\n tags,\n content: t.content === \"\" || reposted.tags?.find((tag) => tag[0] === \"-\") ? \"\" : JSON.stringify(reposted),\n created_at: t.created_at\n },\n privateKey\n );\n}\nfunction getRepostedEventPointer(event) {\n if (![Repost, GenericRepost].includes(event.kind)) {\n return void 0;\n }\n let lastETag;\n let lastPTag;\n for (let i2 = event.tags.length - 1; i2 >= 0 && (lastETag === void 0 || lastPTag === void 0); i2--) {\n const tag = event.tags[i2];\n if (tag.length >= 2) {\n if (tag[0] === \"e\" && lastETag === void 0) {\n lastETag = tag;\n } else if (tag[0] === \"p\" && lastPTag === void 0) {\n lastPTag = tag;\n }\n }\n }\n if (lastETag === void 0) {\n return void 0;\n }\n return {\n id: lastETag[1],\n relays: [lastETag[2], lastPTag?.[2]].filter((x) => typeof x === \"string\"),\n author: lastPTag?.[1]\n };\n}\nfunction getRepostedEvent(event, { skipVerification } = {}) {\n const pointer = getRepostedEventPointer(event);\n if (pointer === void 0 || event.content === \"\") {\n return void 0;\n }\n let repostedEvent;\n try {\n repostedEvent = JSON.parse(event.content);\n } catch (error) {\n return void 0;\n }\n if (repostedEvent.id !== pointer.id) {\n return void 0;\n }\n if (!skipVerification && !verifyEvent(repostedEvent)) {\n return void 0;\n }\n return repostedEvent;\n}\n\n// nip21.ts\nvar nip21_exports = {};\n__export(nip21_exports, {\n NOSTR_URI_REGEX: () => NOSTR_URI_REGEX,\n parse: () => parse2,\n test: () => test\n});\nvar NOSTR_URI_REGEX = new RegExp(`nostr:(${BECH32_REGEX.source})`);\nfunction test(value) {\n return typeof value === \"string\" && new RegExp(`^${NOSTR_URI_REGEX.source}$`).test(value);\n}\nfunction parse2(uri) {\n const match = uri.match(new RegExp(`^${NOSTR_URI_REGEX.source}$`));\n if (!match)\n throw new Error(`Invalid Nostr URI: ${uri}`);\n return {\n uri: match[0],\n value: match[1],\n decoded: decode(match[1])\n };\n}\n\n// nip25.ts\nvar nip25_exports = {};\n__export(nip25_exports, {\n finishReactionEvent: () => finishReactionEvent,\n getReactedEventPointer: () => getReactedEventPointer\n});\nfunction finishReactionEvent(t, reacted, privateKey) {\n const inheritedTags = reacted.tags.filter((tag) => tag.length >= 2 && (tag[0] === \"e\" || tag[0] === \"p\"));\n return finalizeEvent(\n {\n ...t,\n kind: Reaction,\n tags: [...t.tags ?? [], ...inheritedTags, [\"e\", reacted.id], [\"p\", reacted.pubkey]],\n content: t.content ?? \"+\"\n },\n privateKey\n );\n}\nfunction getReactedEventPointer(event) {\n if (event.kind !== Reaction) {\n return void 0;\n }\n let lastETag;\n let lastPTag;\n for (let i2 = event.tags.length - 1; i2 >= 0 && (lastETag === void 0 || lastPTag === void 0); i2--) {\n const tag = event.tags[i2];\n if (tag.length >= 2) {\n if (tag[0] === \"e\" && lastETag === void 0) {\n lastETag = tag;\n } else if (tag[0] === \"p\" && lastPTag === void 0) {\n lastPTag = tag;\n }\n }\n }\n if (lastETag === void 0 || lastPTag === void 0) {\n return void 0;\n }\n return {\n id: lastETag[1],\n relays: [lastETag[2], lastPTag[2]].filter((x) => x !== void 0),\n author: lastPTag[1]\n };\n}\n\n// nip27.ts\nvar nip27_exports = {};\n__export(nip27_exports, {\n parse: () => parse3\n});\nvar noCharacter = /\\W/m;\nvar noURLCharacter = /[^\\w\\/] |[^\\w\\/]$|$|,| /m;\nvar MAX_HASHTAG_LENGTH = 42;\nfunction* parse3(content) {\n let emojis = [];\n if (typeof content !== \"string\") {\n for (let i2 = 0; i2 < content.tags.length; i2++) {\n const tag = content.tags[i2];\n if (tag[0] === \"emoji\" && tag.length >= 3) {\n emojis.push({ type: \"emoji\", shortcode: tag[1], url: tag[2] });\n }\n }\n content = content.content;\n }\n const max = content.length;\n let prevIndex = 0;\n let index = 0;\n mainloop:\n while (index < max) {\n const u = content.indexOf(\":\", index);\n const h = content.indexOf(\"#\", index);\n if (u === -1 && h === -1) {\n break mainloop;\n }\n if (u === -1 || h >= 0 && h < u) {\n if (h === 0 || content[h - 1].match(noCharacter)) {\n const m = content.slice(h + 1, h + MAX_HASHTAG_LENGTH).match(noCharacter);\n const end = m ? h + 1 + m.index : max;\n yield { type: \"text\", text: content.slice(prevIndex, h) };\n yield { type: \"hashtag\", value: content.slice(h + 1, end) };\n index = end;\n prevIndex = index;\n continue mainloop;\n }\n index = h + 1;\n continue mainloop;\n }\n if (content.slice(u - 5, u) === \"nostr\") {\n const m = content.slice(u + 60).match(noCharacter);\n const end = m ? u + 60 + m.index : max;\n try {\n let pointer;\n let { data, type } = decode(content.slice(u + 1, end));\n switch (type) {\n case \"npub\":\n pointer = { pubkey: data };\n break;\n case \"note\":\n pointer = { id: data };\n break;\n case \"nsec\":\n index = end + 1;\n continue;\n default:\n pointer = data;\n }\n if (prevIndex !== u - 5) {\n yield { type: \"text\", text: content.slice(prevIndex, u - 5) };\n }\n yield { type: \"reference\", pointer };\n index = end;\n prevIndex = index;\n continue mainloop;\n } catch (_err) {\n index = u + 1;\n continue mainloop;\n }\n } else if (content.slice(u - 5, u) === \"https\" || content.slice(u - 4, u) === \"http\") {\n const m = content.slice(u + 4).match(noURLCharacter);\n const end = m ? u + 4 + m.index : max;\n const prefixLen = content[u - 1] === \"s\" ? 5 : 4;\n try {\n let url = new URL(content.slice(u - prefixLen, end));\n if (url.hostname.indexOf(\".\") === -1) {\n throw new Error(\"invalid url\");\n }\n if (prevIndex !== u - prefixLen) {\n yield { type: \"text\", text: content.slice(prevIndex, u - prefixLen) };\n }\n if (/\\.(png|jpe?g|gif|webp|heic|svg)$/i.test(url.pathname)) {\n yield { type: \"image\", url: url.toString() };\n index = end;\n prevIndex = index;\n continue mainloop;\n }\n if (/\\.(mp4|avi|webm|mkv|mov)$/i.test(url.pathname)) {\n yield { type: \"video\", url: url.toString() };\n index = end;\n prevIndex = index;\n continue mainloop;\n }\n if (/\\.(mp3|aac|ogg|opus|wav|flac)$/i.test(url.pathname)) {\n yield { type: \"audio\", url: url.toString() };\n index = end;\n prevIndex = index;\n continue mainloop;\n }\n yield { type: \"url\", url: url.toString() };\n index = end;\n prevIndex = index;\n continue mainloop;\n } catch (_err) {\n index = end + 1;\n continue mainloop;\n }\n } else if (content.slice(u - 3, u) === \"wss\" || content.slice(u - 2, u) === \"ws\") {\n const m = content.slice(u + 4).match(noURLCharacter);\n const end = m ? u + 4 + m.index : max;\n const prefixLen = content[u - 1] === \"s\" ? 3 : 2;\n try {\n let url = new URL(content.slice(u - prefixLen, end));\n if (url.hostname.indexOf(\".\") === -1) {\n throw new Error(\"invalid ws url\");\n }\n if (prevIndex !== u - prefixLen) {\n yield { type: \"text\", text: content.slice(prevIndex, u - prefixLen) };\n }\n yield { type: \"relay\", url: url.toString() };\n index = end;\n prevIndex = index;\n continue mainloop;\n } catch (_err) {\n index = end + 1;\n continue mainloop;\n }\n } else {\n for (let e = 0; e < emojis.length; e++) {\n const emoji = emojis[e];\n if (content[u + emoji.shortcode.length + 1] === \":\" && content.slice(u + 1, u + emoji.shortcode.length + 1) === emoji.shortcode) {\n if (prevIndex !== u) {\n yield { type: \"text\", text: content.slice(prevIndex, u) };\n }\n yield emoji;\n index = u + emoji.shortcode.length + 2;\n prevIndex = index;\n continue mainloop;\n }\n }\n index = u + 1;\n continue mainloop;\n }\n }\n if (prevIndex !== max) {\n yield { type: \"text\", text: content.slice(prevIndex) };\n }\n}\n\n// nip28.ts\nvar nip28_exports = {};\n__export(nip28_exports, {\n channelCreateEvent: () => channelCreateEvent,\n channelHideMessageEvent: () => channelHideMessageEvent,\n channelMessageEvent: () => channelMessageEvent,\n channelMetadataEvent: () => channelMetadataEvent,\n channelMuteUserEvent: () => channelMuteUserEvent\n});\nvar channelCreateEvent = (t, privateKey) => {\n let content;\n if (typeof t.content === \"object\") {\n content = JSON.stringify(t.content);\n } else if (typeof t.content === \"string\") {\n content = t.content;\n } else {\n return void 0;\n }\n return finalizeEvent(\n {\n kind: ChannelCreation,\n tags: [...t.tags ?? []],\n content,\n created_at: t.created_at\n },\n privateKey\n );\n};\nvar channelMetadataEvent = (t, privateKey) => {\n let content;\n if (typeof t.content === \"object\") {\n content = JSON.stringify(t.content);\n } else if (typeof t.content === \"string\") {\n content = t.content;\n } else {\n return void 0;\n }\n return finalizeEvent(\n {\n kind: ChannelMetadata,\n tags: [[\"e\", t.channel_create_event_id], ...t.tags ?? []],\n content,\n created_at: t.created_at\n },\n privateKey\n );\n};\nvar channelMessageEvent = (t, privateKey) => {\n const tags = [[\"e\", t.channel_create_event_id, t.relay_url, \"root\"]];\n if (t.reply_to_channel_message_event_id) {\n tags.push([\"e\", t.reply_to_channel_message_event_id, t.relay_url, \"reply\"]);\n }\n return finalizeEvent(\n {\n kind: ChannelMessage,\n tags: [...tags, ...t.tags ?? []],\n content: t.content,\n created_at: t.created_at\n },\n privateKey\n );\n};\nvar channelHideMessageEvent = (t, privateKey) => {\n let content;\n if (typeof t.content === \"object\") {\n content = JSON.stringify(t.content);\n } else if (typeof t.content === \"string\") {\n content = t.content;\n } else {\n return void 0;\n }\n return finalizeEvent(\n {\n kind: ChannelHideMessage,\n tags: [[\"e\", t.channel_message_event_id], ...t.tags ?? []],\n content,\n created_at: t.created_at\n },\n privateKey\n );\n};\nvar channelMuteUserEvent = (t, privateKey) => {\n let content;\n if (typeof t.content === \"object\") {\n content = JSON.stringify(t.content);\n } else if (typeof t.content === \"string\") {\n content = t.content;\n } else {\n return void 0;\n }\n return finalizeEvent(\n {\n kind: ChannelMuteUser,\n tags: [[\"p\", t.pubkey_to_mute], ...t.tags ?? []],\n content,\n created_at: t.created_at\n },\n privateKey\n );\n};\n\n// nip30.ts\nvar nip30_exports = {};\n__export(nip30_exports, {\n EMOJI_SHORTCODE_REGEX: () => EMOJI_SHORTCODE_REGEX,\n matchAll: () => matchAll,\n regex: () => regex,\n replaceAll: () => replaceAll\n});\nvar EMOJI_SHORTCODE_REGEX = /:(\\w+):/;\nvar regex = () => new RegExp(`\\\\B${EMOJI_SHORTCODE_REGEX.source}\\\\B`, \"g\");\nfunction* matchAll(content) {\n const matches = content.matchAll(regex());\n for (const match of matches) {\n try {\n const [shortcode, name] = match;\n yield {\n shortcode,\n name,\n start: match.index,\n end: match.index + shortcode.length\n };\n } catch (_e) {\n }\n }\n}\nfunction replaceAll(content, replacer) {\n return content.replaceAll(regex(), (shortcode, name) => {\n return replacer({\n shortcode,\n name\n });\n });\n}\n\n// nip39.ts\nvar nip39_exports = {};\n__export(nip39_exports, {\n useFetchImplementation: () => useFetchImplementation3,\n validateGithub: () => validateGithub\n});\nvar _fetch3;\ntry {\n _fetch3 = fetch;\n} catch {\n}\nfunction useFetchImplementation3(fetchImplementation) {\n _fetch3 = fetchImplementation;\n}\nasync function validateGithub(pubkey, username, proof) {\n try {\n let res = await (await _fetch3(`https://gist.github.com/${username}/${proof}/raw`)).text();\n return res === `Verifying that I control the following Nostr public key: ${pubkey}`;\n } catch (_) {\n return false;\n }\n}\n\n// nip47.ts\nvar nip47_exports = {};\n__export(nip47_exports, {\n makeNwcRequestEvent: () => makeNwcRequestEvent,\n parseConnectionString: () => parseConnectionString\n});\nfunction parseConnectionString(connectionString) {\n const { host, pathname, searchParams } = new URL(connectionString);\n const pubkey = pathname || host;\n const relay = searchParams.get(\"relay\");\n const secret = searchParams.get(\"secret\");\n if (!pubkey || !relay || !secret) {\n throw new Error(\"invalid connection string\");\n }\n return { pubkey, relay, secret };\n}\nasync function makeNwcRequestEvent(pubkey, secretKey, invoice) {\n const content = {\n method: \"pay_invoice\",\n params: {\n invoice\n }\n };\n const encryptedContent = encrypt(secretKey, pubkey, JSON.stringify(content));\n const eventTemplate = {\n kind: NWCWalletRequest,\n created_at: Math.round(Date.now() / 1e3),\n content: encryptedContent,\n tags: [[\"p\", pubkey]]\n };\n return finalizeEvent(eventTemplate, secretKey);\n}\n\n// nip54.ts\nvar nip54_exports = {};\n__export(nip54_exports, {\n normalizeIdentifier: () => normalizeIdentifier\n});\nfunction normalizeIdentifier(name) {\n name = name.trim().toLowerCase();\n name = name.normalize(\"NFKC\");\n return Array.from(name).map((char) => {\n if (/\\p{Letter}/u.test(char) || /\\p{Number}/u.test(char)) {\n return char;\n }\n return \"-\";\n }).join(\"\");\n}\n\n// nip57.ts\nvar nip57_exports = {};\n__export(nip57_exports, {\n getSatoshisAmountFromBolt11: () => getSatoshisAmountFromBolt11,\n getZapEndpoint: () => getZapEndpoint,\n makeZapReceipt: () => makeZapReceipt,\n makeZapRequest: () => makeZapRequest,\n useFetchImplementation: () => useFetchImplementation4,\n validateZapRequest: () => validateZapRequest\n});\nimport { bech32 as bech322 } from \"@scure/base\";\nvar _fetch4;\ntry {\n _fetch4 = fetch;\n} catch {\n}\nfunction useFetchImplementation4(fetchImplementation) {\n _fetch4 = fetchImplementation;\n}\nasync function getZapEndpoint(metadata) {\n try {\n let lnurl = \"\";\n let { lud06, lud16 } = JSON.parse(metadata.content);\n if (lud16) {\n let [name, domain] = lud16.split(\"@\");\n lnurl = new URL(`/.well-known/lnurlp/${name}`, `https://${domain}`).toString();\n } else if (lud06) {\n let { words } = bech322.decode(lud06, 1e3);\n let data = bech322.fromWords(words);\n lnurl = utf8Decoder.decode(data);\n } else {\n return null;\n }\n let res = await _fetch4(lnurl);\n let body = await res.json();\n if (body.allowsNostr && body.nostrPubkey) {\n return body.callback;\n }\n } catch (err) {\n }\n return null;\n}\nfunction makeZapRequest(params) {\n let zr = {\n kind: 9734,\n created_at: Math.round(Date.now() / 1e3),\n content: params.comment || \"\",\n tags: [\n [\"p\", \"pubkey\" in params ? params.pubkey : params.event.pubkey],\n [\"amount\", params.amount.toString()],\n [\"relays\", ...params.relays]\n ]\n };\n if (\"event\" in params) {\n zr.tags.push([\"e\", params.event.id]);\n if (isReplaceableKind(params.event.kind)) {\n const a = [\"a\", `${params.event.kind}:${params.event.pubkey}:`];\n zr.tags.push(a);\n } else if (isAddressableKind(params.event.kind)) {\n let d = params.event.tags.find(([t, v]) => t === \"d\" && v);\n if (!d)\n throw new Error(\"d tag not found or is empty\");\n const a = [\"a\", `${params.event.kind}:${params.event.pubkey}:${d[1]}`];\n zr.tags.push(a);\n }\n zr.tags.push([\"k\", params.event.kind.toString()]);\n }\n return zr;\n}\nfunction validateZapRequest(zapRequestString) {\n let zapRequest;\n try {\n zapRequest = JSON.parse(zapRequestString);\n } catch (err) {\n return \"Invalid zap request JSON.\";\n }\n if (!validateEvent(zapRequest))\n return \"Zap request is not a valid Nostr event.\";\n if (!verifyEvent(zapRequest))\n return \"Invalid signature on zap request.\";\n let p = zapRequest.tags.find(([t, v]) => t === \"p\" && v);\n if (!p)\n return \"Zap request doesn't have a 'p' tag.\";\n if (!p[1].match(/^[a-f0-9]{64}$/))\n return \"Zap request 'p' tag is not valid hex.\";\n let e = zapRequest.tags.find(([t, v]) => t === \"e\" && v);\n if (e && !e[1].match(/^[a-f0-9]{64}$/))\n return \"Zap request 'e' tag is not valid hex.\";\n let relays = zapRequest.tags.find(([t, v]) => t === \"relays\" && v);\n if (!relays)\n return \"Zap request doesn't have a 'relays' tag.\";\n return null;\n}\nfunction makeZapReceipt({\n zapRequest,\n preimage,\n bolt11,\n paidAt\n}) {\n let zr = JSON.parse(zapRequest);\n let tagsFromZapRequest = zr.tags.filter(([t]) => t === \"e\" || t === \"p\" || t === \"a\");\n let zap = {\n kind: 9735,\n created_at: Math.round(paidAt.getTime() / 1e3),\n content: \"\",\n tags: [...tagsFromZapRequest, [\"P\", zr.pubkey], [\"bolt11\", bolt11], [\"description\", zapRequest]]\n };\n if (preimage) {\n zap.tags.push([\"preimage\", preimage]);\n }\n return zap;\n}\nfunction getSatoshisAmountFromBolt11(bolt11) {\n if (bolt11.length < 50) {\n return 0;\n }\n bolt11 = bolt11.substring(0, 50);\n const idx = bolt11.lastIndexOf(\"1\");\n if (idx === -1) {\n return 0;\n }\n const hrp = bolt11.substring(0, idx);\n if (!hrp.startsWith(\"lnbc\")) {\n return 0;\n }\n const amount = hrp.substring(4);\n if (amount.length < 1) {\n return 0;\n }\n const char = amount[amount.length - 1];\n const digit = char.charCodeAt(0) - \"0\".charCodeAt(0);\n const isDigit = digit >= 0 && digit <= 9;\n let cutPoint = amount.length - 1;\n if (isDigit) {\n cutPoint++;\n }\n if (cutPoint < 1) {\n return 0;\n }\n const num = parseInt(amount.substring(0, cutPoint));\n switch (char) {\n case \"m\":\n return num * 1e5;\n case \"u\":\n return num * 100;\n case \"n\":\n return num / 10;\n case \"p\":\n return num / 1e4;\n default:\n return num * 1e8;\n }\n}\n\n// nip77.ts\nvar nip77_exports = {};\n__export(nip77_exports, {\n Negentropy: () => Negentropy,\n NegentropyStorageVector: () => NegentropyStorageVector,\n NegentropySync: () => NegentropySync\n});\nimport { bytesToHex as bytesToHex5, hexToBytes as hexToBytes6 } from \"@noble/hashes/utils.js\";\nimport { sha256 as sha2564 } from \"@noble/hashes/sha2.js\";\nvar PROTOCOL_VERSION = 97;\nvar ID_SIZE = 32;\nvar FINGERPRINT_SIZE = 16;\nvar Mode = {\n Skip: 0,\n Fingerprint: 1,\n IdList: 2\n};\nvar WrappedBuffer = class {\n _raw;\n length;\n constructor(buffer) {\n if (typeof buffer === \"number\") {\n this._raw = new Uint8Array(buffer);\n this.length = 0;\n } else if (buffer instanceof Uint8Array) {\n this._raw = new Uint8Array(buffer);\n this.length = buffer.length;\n } else {\n this._raw = new Uint8Array(512);\n this.length = 0;\n }\n }\n unwrap() {\n return this._raw.subarray(0, this.length);\n }\n get capacity() {\n return this._raw.byteLength;\n }\n extend(buf) {\n if (buf instanceof WrappedBuffer)\n buf = buf.unwrap();\n if (typeof buf.length !== \"number\")\n throw Error(\"bad length\");\n const targetSize = buf.length + this.length;\n if (this.capacity < targetSize) {\n const oldRaw = this._raw;\n const newCapacity = Math.max(this.capacity * 2, targetSize);\n this._raw = new Uint8Array(newCapacity);\n this._raw.set(oldRaw);\n }\n this._raw.set(buf, this.length);\n this.length += buf.length;\n }\n shift() {\n const first = this._raw[0];\n this._raw = this._raw.subarray(1);\n this.length--;\n return first;\n }\n shiftN(n = 1) {\n const firstSubarray = this._raw.subarray(0, n);\n this._raw = this._raw.subarray(n);\n this.length -= n;\n return firstSubarray;\n }\n};\nfunction decodeVarInt(buf) {\n let res = 0;\n while (1) {\n if (buf.length === 0)\n throw Error(\"parse ends prematurely\");\n let byte = buf.shift();\n res = res << 7 | byte & 127;\n if ((byte & 128) === 0)\n break;\n }\n return res;\n}\nfunction encodeVarInt(n) {\n if (n === 0)\n return new WrappedBuffer(new Uint8Array([0]));\n let o = [];\n while (n !== 0) {\n o.push(n & 127);\n n >>>= 7;\n }\n o.reverse();\n for (let i2 = 0; i2 < o.length - 1; i2++)\n o[i2] |= 128;\n return new WrappedBuffer(new Uint8Array(o));\n}\nfunction getByte(buf) {\n return getBytes(buf, 1)[0];\n}\nfunction getBytes(buf, n) {\n if (buf.length < n)\n throw Error(\"parse ends prematurely\");\n return buf.shiftN(n);\n}\nvar Accumulator = class {\n buf;\n constructor() {\n this.setToZero();\n }\n setToZero() {\n this.buf = new Uint8Array(ID_SIZE);\n }\n add(otherBuf) {\n let currCarry = 0, nextCarry = 0;\n let p = new DataView(this.buf.buffer);\n let po = new DataView(otherBuf.buffer);\n for (let i2 = 0; i2 < 8; i2++) {\n let offset = i2 * 4;\n let orig = p.getUint32(offset, true);\n let otherV = po.getUint32(offset, true);\n let next = orig;\n next += currCarry;\n next += otherV;\n if (next > 4294967295)\n nextCarry = 1;\n p.setUint32(offset, next & 4294967295, true);\n currCarry = nextCarry;\n nextCarry = 0;\n }\n }\n negate() {\n let p = new DataView(this.buf.buffer);\n for (let i2 = 0; i2 < 8; i2++) {\n let offset = i2 * 4;\n p.setUint32(offset, ~p.getUint32(offset, true));\n }\n let one = new Uint8Array(ID_SIZE);\n one[0] = 1;\n this.add(one);\n }\n getFingerprint(n) {\n let input = new WrappedBuffer();\n input.extend(this.buf);\n input.extend(encodeVarInt(n));\n let hash = sha2564(input.unwrap());\n return hash.subarray(0, FINGERPRINT_SIZE);\n }\n};\nvar NegentropyStorageVector = class {\n items;\n sealed;\n constructor() {\n this.items = [];\n this.sealed = false;\n }\n insert(timestamp, id) {\n if (this.sealed)\n throw Error(\"already sealed\");\n const idb = hexToBytes6(id);\n if (idb.byteLength !== ID_SIZE)\n throw Error(\"bad id size for added item\");\n this.items.push({ timestamp, id: idb });\n }\n seal() {\n if (this.sealed)\n throw Error(\"already sealed\");\n this.sealed = true;\n this.items.sort(itemCompare);\n for (let i2 = 1; i2 < this.items.length; i2++) {\n if (itemCompare(this.items[i2 - 1], this.items[i2]) === 0)\n throw Error(\"duplicate item inserted\");\n }\n }\n unseal() {\n this.sealed = false;\n }\n size() {\n this._checkSealed();\n return this.items.length;\n }\n getItem(i2) {\n this._checkSealed();\n if (i2 >= this.items.length)\n throw Error(\"out of range\");\n return this.items[i2];\n }\n iterate(begin, end, cb) {\n this._checkSealed();\n this._checkBounds(begin, end);\n for (let i2 = begin; i2 < end; ++i2) {\n if (!cb(this.items[i2], i2))\n break;\n }\n }\n findLowerBound(begin, end, bound) {\n this._checkSealed();\n this._checkBounds(begin, end);\n return this._binarySearch(this.items, begin, end, (a) => itemCompare(a, bound) < 0);\n }\n fingerprint(begin, end) {\n let out = new Accumulator();\n out.setToZero();\n this.iterate(begin, end, (item) => {\n out.add(item.id);\n return true;\n });\n return out.getFingerprint(end - begin);\n }\n _checkSealed() {\n if (!this.sealed)\n throw Error(\"not sealed\");\n }\n _checkBounds(begin, end) {\n if (begin > end || end > this.items.length)\n throw Error(\"bad range\");\n }\n _binarySearch(arr, first, last, cmp) {\n let count = last - first;\n while (count > 0) {\n let it = first;\n let step = Math.floor(count / 2);\n it += step;\n if (cmp(arr[it])) {\n first = ++it;\n count -= step + 1;\n } else {\n count = step;\n }\n }\n return first;\n }\n};\nvar Negentropy = class {\n storage;\n frameSizeLimit;\n lastTimestampIn;\n lastTimestampOut;\n constructor(storage, frameSizeLimit = 6e4) {\n if (frameSizeLimit < 4096)\n throw Error(\"frameSizeLimit too small\");\n this.storage = storage;\n this.frameSizeLimit = frameSizeLimit;\n this.lastTimestampIn = 0;\n this.lastTimestampOut = 0;\n }\n _bound(timestamp, id) {\n return { timestamp, id: id || new Uint8Array(0) };\n }\n initiate() {\n let output = new WrappedBuffer();\n output.extend(new Uint8Array([PROTOCOL_VERSION]));\n this.splitRange(0, this.storage.size(), this._bound(Number.MAX_VALUE), output);\n return bytesToHex5(output.unwrap());\n }\n reconcile(queryMsg, onhave, onneed) {\n const query = new WrappedBuffer(hexToBytes6(queryMsg));\n this.lastTimestampIn = this.lastTimestampOut = 0;\n let fullOutput = new WrappedBuffer();\n fullOutput.extend(new Uint8Array([PROTOCOL_VERSION]));\n let protocolVersion = getByte(query);\n if (protocolVersion < 96 || protocolVersion > 111)\n throw Error(\"invalid negentropy protocol version byte\");\n if (protocolVersion !== PROTOCOL_VERSION) {\n throw Error(\"unsupported negentropy protocol version requested: \" + (protocolVersion - 96));\n }\n let storageSize = this.storage.size();\n let prevBound = this._bound(0);\n let prevIndex = 0;\n let skip = false;\n while (query.length !== 0) {\n let o = new WrappedBuffer();\n let doSkip = () => {\n if (skip) {\n skip = false;\n o.extend(this.encodeBound(prevBound));\n o.extend(encodeVarInt(Mode.Skip));\n }\n };\n let currBound = this.decodeBound(query);\n let mode = decodeVarInt(query);\n let lower = prevIndex;\n let upper = this.storage.findLowerBound(prevIndex, storageSize, currBound);\n if (mode === Mode.Skip) {\n skip = true;\n } else if (mode === Mode.Fingerprint) {\n let theirFingerprint = getBytes(query, FINGERPRINT_SIZE);\n let ourFingerprint = this.storage.fingerprint(lower, upper);\n if (compareUint8Array(theirFingerprint, ourFingerprint) !== 0) {\n doSkip();\n this.splitRange(lower, upper, currBound, o);\n } else {\n skip = true;\n }\n } else if (mode === Mode.IdList) {\n let numIds = decodeVarInt(query);\n let theirElems = {};\n for (let i2 = 0; i2 < numIds; i2++) {\n let e = getBytes(query, ID_SIZE);\n theirElems[bytesToHex5(e)] = e;\n }\n skip = true;\n this.storage.iterate(lower, upper, (item) => {\n let k = item.id;\n const id = bytesToHex5(k);\n if (!theirElems[id]) {\n onhave?.(id);\n } else {\n delete theirElems[bytesToHex5(k)];\n }\n return true;\n });\n if (onneed) {\n for (let v of Object.values(theirElems)) {\n onneed(bytesToHex5(v));\n }\n }\n } else {\n throw Error(\"unexpected mode\");\n }\n if (this.exceededFrameSizeLimit(fullOutput.length + o.length)) {\n let remainingFingerprint = this.storage.fingerprint(upper, storageSize);\n fullOutput.extend(this.encodeBound(this._bound(Number.MAX_VALUE)));\n fullOutput.extend(encodeVarInt(Mode.Fingerprint));\n fullOutput.extend(remainingFingerprint);\n break;\n } else {\n fullOutput.extend(o);\n }\n prevIndex = upper;\n prevBound = currBound;\n }\n return fullOutput.length === 1 ? null : bytesToHex5(fullOutput.unwrap());\n }\n splitRange(lower, upper, upperBound, o) {\n let numElems = upper - lower;\n let buckets = 16;\n if (numElems < buckets * 2) {\n o.extend(this.encodeBound(upperBound));\n o.extend(encodeVarInt(Mode.IdList));\n o.extend(encodeVarInt(numElems));\n this.storage.iterate(lower, upper, (item) => {\n o.extend(item.id);\n return true;\n });\n } else {\n let itemsPerBucket = Math.floor(numElems / buckets);\n let bucketsWithExtra = numElems % buckets;\n let curr = lower;\n for (let i2 = 0; i2 < buckets; i2++) {\n let bucketSize = itemsPerBucket + (i2 < bucketsWithExtra ? 1 : 0);\n let ourFingerprint = this.storage.fingerprint(curr, curr + bucketSize);\n curr += bucketSize;\n let nextBound;\n if (curr === upper) {\n nextBound = upperBound;\n } else {\n let prevItem;\n let currItem;\n this.storage.iterate(curr - 1, curr + 1, (item, index) => {\n if (index === curr - 1)\n prevItem = item;\n else\n currItem = item;\n return true;\n });\n nextBound = this.getMinimalBound(prevItem, currItem);\n }\n o.extend(this.encodeBound(nextBound));\n o.extend(encodeVarInt(Mode.Fingerprint));\n o.extend(ourFingerprint);\n }\n }\n }\n exceededFrameSizeLimit(n) {\n return n > this.frameSizeLimit - 200;\n }\n decodeTimestampIn(encoded) {\n let timestamp = decodeVarInt(encoded);\n timestamp = timestamp === 0 ? Number.MAX_VALUE : timestamp - 1;\n if (this.lastTimestampIn === Number.MAX_VALUE || timestamp === Number.MAX_VALUE) {\n this.lastTimestampIn = Number.MAX_VALUE;\n return Number.MAX_VALUE;\n }\n timestamp += this.lastTimestampIn;\n this.lastTimestampIn = timestamp;\n return timestamp;\n }\n decodeBound(encoded) {\n let timestamp = this.decodeTimestampIn(encoded);\n let len = decodeVarInt(encoded);\n if (len > ID_SIZE)\n throw Error(\"bound key too long\");\n let id = getBytes(encoded, len);\n return { timestamp, id };\n }\n encodeTimestampOut(timestamp) {\n if (timestamp === Number.MAX_VALUE) {\n this.lastTimestampOut = Number.MAX_VALUE;\n return encodeVarInt(0);\n }\n let temp = timestamp;\n timestamp -= this.lastTimestampOut;\n this.lastTimestampOut = temp;\n return encodeVarInt(timestamp + 1);\n }\n encodeBound(key) {\n let output = new WrappedBuffer();\n output.extend(this.encodeTimestampOut(key.timestamp));\n output.extend(encodeVarInt(key.id.length));\n output.extend(key.id);\n return output;\n }\n getMinimalBound(prev, curr) {\n if (curr.timestamp !== prev.timestamp) {\n return this._bound(curr.timestamp);\n } else {\n let sharedPrefixBytes = 0;\n let currKey = curr.id;\n let prevKey = prev.id;\n for (let i2 = 0; i2 < ID_SIZE; i2++) {\n if (currKey[i2] !== prevKey[i2])\n break;\n sharedPrefixBytes++;\n }\n return this._bound(curr.timestamp, curr.id.subarray(0, sharedPrefixBytes + 1));\n }\n }\n};\nfunction compareUint8Array(a, b) {\n for (let i2 = 0; i2 < a.byteLength; i2++) {\n if (a[i2] < b[i2])\n return -1;\n if (a[i2] > b[i2])\n return 1;\n }\n if (a.byteLength > b.byteLength)\n return 1;\n if (a.byteLength < b.byteLength)\n return -1;\n return 0;\n}\nfunction itemCompare(a, b) {\n if (a.timestamp === b.timestamp) {\n return compareUint8Array(a.id, b.id);\n }\n return a.timestamp - b.timestamp;\n}\nvar NegentropySync = class {\n relay;\n storage;\n neg;\n filter;\n subscription;\n onhave;\n onneed;\n constructor(relay, storage, filter, params = {}) {\n this.relay = relay;\n this.storage = storage;\n this.neg = new Negentropy(storage);\n this.onhave = params.onhave;\n this.onneed = params.onneed;\n this.filter = filter;\n this.subscription = this.relay.prepareSubscription([{}], { label: params.label || \"negentropy\" });\n this.subscription.oncustom = (data) => {\n switch (data[0]) {\n case \"NEG-MSG\": {\n if (data.length < 3) {\n console.warn(`got invalid NEG-MSG from ${this.relay.url}: ${data}`);\n }\n try {\n const response = this.neg.reconcile(data[2], this.onhave, this.onneed);\n if (response) {\n this.relay.send(`[\"NEG-MSG\", \"${this.subscription.id}\", \"${response}\"]`);\n } else {\n this.close();\n params.onclose?.();\n }\n } catch (error) {\n console.error(\"negentropy reconcile error:\", error);\n params?.onclose?.(`reconcile error: ${error}`);\n }\n break;\n }\n case \"NEG-CLOSE\": {\n const reason = data[2];\n console.warn(\"negentropy error:\", reason);\n params.onclose?.(reason);\n break;\n }\n case \"NEG-ERR\": {\n params.onclose?.();\n }\n }\n };\n }\n async start() {\n const initMsg = this.neg.initiate();\n this.relay.send(`[\"NEG-OPEN\",\"${this.subscription.id}\",${JSON.stringify(this.filter)},\"${initMsg}\"]`);\n }\n close() {\n this.relay.send(`[\"NEG-CLOSE\",\"${this.subscription.id}\"]`);\n this.subscription.close();\n }\n};\n\n// nip98.ts\nvar nip98_exports = {};\n__export(nip98_exports, {\n getToken: () => getToken,\n hashPayload: () => hashPayload,\n unpackEventFromToken: () => unpackEventFromToken,\n validateEvent: () => validateEvent2,\n validateEventKind: () => validateEventKind,\n validateEventMethodTag: () => validateEventMethodTag,\n validateEventPayloadTag: () => validateEventPayloadTag,\n validateEventTimestamp: () => validateEventTimestamp,\n validateEventUrlTag: () => validateEventUrlTag,\n validateToken: () => validateToken\n});\nimport { sha256 as sha2565 } from \"@noble/hashes/sha2.js\";\nimport { bytesToHex as bytesToHex6 } from \"@noble/hashes/utils.js\";\nimport { base64 as base643 } from \"@scure/base\";\nvar _authorizationScheme = \"Nostr \";\nasync function getToken(loginUrl, httpMethod, sign, includeAuthorizationScheme = false, payload) {\n const event = {\n kind: HTTPAuth,\n tags: [\n [\"u\", loginUrl],\n [\"method\", httpMethod]\n ],\n created_at: Math.round(new Date().getTime() / 1e3),\n content: \"\"\n };\n if (payload) {\n event.tags.push([\"payload\", hashPayload(payload)]);\n }\n const signedEvent = await sign(event);\n const authorizationScheme = includeAuthorizationScheme ? _authorizationScheme : \"\";\n return authorizationScheme + base643.encode(utf8Encoder.encode(JSON.stringify(signedEvent)));\n}\nasync function validateToken(token, url, method) {\n const event = await unpackEventFromToken(token).catch((error) => {\n throw error;\n });\n const valid = await validateEvent2(event, url, method).catch((error) => {\n throw error;\n });\n return valid;\n}\nasync function unpackEventFromToken(token) {\n if (!token) {\n throw new Error(\"Missing token\");\n }\n token = token.replace(_authorizationScheme, \"\");\n const eventB64 = utf8Decoder.decode(base643.decode(token));\n if (!eventB64 || eventB64.length === 0 || !eventB64.startsWith(\"{\")) {\n throw new Error(\"Invalid token\");\n }\n const event = JSON.parse(eventB64);\n return event;\n}\nfunction validateEventTimestamp(event) {\n if (!event.created_at) {\n return false;\n }\n return Math.round(new Date().getTime() / 1e3) - event.created_at < 60;\n}\nfunction validateEventKind(event) {\n return event.kind === HTTPAuth;\n}\nfunction validateEventUrlTag(event, url) {\n const urlTag = event.tags.find((t) => t[0] === \"u\");\n if (!urlTag) {\n return false;\n }\n return urlTag.length > 0 && urlTag[1] === url;\n}\nfunction validateEventMethodTag(event, method) {\n const methodTag = event.tags.find((t) => t[0] === \"method\");\n if (!methodTag) {\n return false;\n }\n return methodTag.length > 0 && methodTag[1].toLowerCase() === method.toLowerCase();\n}\nfunction hashPayload(payload) {\n const hash = sha2565(utf8Encoder.encode(JSON.stringify(payload)));\n return bytesToHex6(hash);\n}\nfunction validateEventPayloadTag(event, payload) {\n const payloadTag = event.tags.find((t) => t[0] === \"payload\");\n if (!payloadTag) {\n return false;\n }\n const payloadHash = hashPayload(payload);\n return payloadTag.length > 0 && payloadTag[1] === payloadHash;\n}\nasync function validateEvent2(event, url, method, body) {\n if (!verifyEvent(event)) {\n throw new Error(\"Invalid nostr event, signature invalid\");\n }\n if (!validateEventKind(event)) {\n throw new Error(\"Invalid nostr event, kind invalid\");\n }\n if (!validateEventTimestamp(event)) {\n throw new Error(\"Invalid nostr event, created_at timestamp invalid\");\n }\n if (!validateEventUrlTag(event, url)) {\n throw new Error(\"Invalid nostr event, url tag invalid\");\n }\n if (!validateEventMethodTag(event, method)) {\n throw new Error(\"Invalid nostr event, method tag invalid\");\n }\n if (Boolean(body) && typeof body === \"object\" && Object.keys(body).length > 0) {\n if (!validateEventPayloadTag(event, body)) {\n throw new Error(\"Invalid nostr event, payload tag does not match request body hash\");\n }\n }\n return true;\n}\nexport {\n Relay,\n SimplePool,\n finalizeEvent,\n fakejson_exports as fj,\n generateSecretKey,\n getEventHash,\n getFilterLimit,\n getPublicKey,\n kinds_exports as kinds,\n matchFilter,\n matchFilters,\n mergeFilters,\n nip04_exports as nip04,\n nip05_exports as nip05,\n nip10_exports as nip10,\n nip11_exports as nip11,\n nip13_exports as nip13,\n nip17_exports as nip17,\n nip18_exports as nip18,\n nip19_exports as nip19,\n nip21_exports as nip21,\n nip25_exports as nip25,\n nip27_exports as nip27,\n nip28_exports as nip28,\n nip30_exports as nip30,\n nip39_exports as nip39,\n nip42_exports as nip42,\n nip44_exports as nip44,\n nip47_exports as nip47,\n nip54_exports as nip54,\n nip57_exports as nip57,\n nip59_exports as nip59,\n nip77_exports as nip77,\n nip98_exports as nip98,\n parseReferences,\n serializeEvent,\n sortEvents,\n utils_exports as utils,\n validateEvent,\n verifiedSymbol,\n verifyEvent\n};\n","/**\n * Buzz/Nostr forge event kinds verified live against desktop-v0.5.3 (ADR-002).\n * Kind numbers are load-bearing and must match the deployed relay.\n */\nexport const BUZZ_FORGE_KINDS = {\n repositoryAnnouncement: 30617,\n refUpdate: 30618,\n patch: 1617,\n statusOpen: 1630,\n statusApplied: 1631,\n statusClosed: 1632,\n statusDraft: 1633,\n reaction: 7,\n channelMembers: 39002,\n} as const;\n\nexport type BuzzForgeKind =\n (typeof BUZZ_FORGE_KINDS)[keyof typeof BUZZ_FORGE_KINDS];\n\n/** Minimal Nostr event shape consumed by the buzz forge adapter. */\nexport interface NostrForgeEvent {\n id: string;\n pubkey: string;\n created_at: number;\n kind: number;\n tags: readonly (readonly string[])[];\n content: string;\n sig: string;\n}\n\n/** Channel role floor used when validating kind:7 approvals (ADR-002). */\nexport type BuzzChannelRole = 'owner' | 'admin' | 'member' | 'guest' | 'bot';\n\nexport interface BuzzRoleResolution {\n pubkey: string;\n role: BuzzChannelRole;\n}\n\nexport interface BuzzRelayClientOptions {\n /** WebSocket or HTTP relay endpoints. */\n relays: readonly string[];\n /** Optional filter limiting which kinds are accepted. */\n kinds?: readonly number[];\n /** Bound channel ids watched for forge activity. */\n channelIds?: readonly string[];\n /** Fetch implementation override for tests. */\n fetch?: typeof fetch;\n /** Poll interval in ms when using HTTP REQ polling. Default 5000. */\n pollIntervalMs?: number;\n}\n\nexport interface BuzzRelaySubscription {\n close(): void;\n}\n","import { createHash } from 'node:crypto';\nimport { verifyEvent } from 'nostr-tools';\nimport { ForgeError, ForgeSignatureError } from '../forge/errors.js';\nimport type {\n CheckRun,\n ForgeActor,\n ForgeEventEnvelope,\n ForgeObservation,\n ForgePullRequestRef,\n ForgeRepositoryRef,\n} from '../forge/types.js';\nimport {\n BUZZ_FORGE_KINDS,\n type BuzzChannelRole,\n type BuzzRoleResolution,\n type NostrForgeEvent,\n} from './types.js';\n\nconst ROLE_RANK: Record<BuzzChannelRole, number> = {\n owner: 40,\n admin: 30,\n member: 20,\n guest: 10,\n bot: 5,\n};\n\n/**\n * Compute the NIP-01 event id for a Nostr event (sha256 of serialized fields).\n * Used by fixtures and verification when the caller supplies an unsigned skeleton.\n */\nexport function computeNostrEventId(\n event: Omit<NostrForgeEvent, 'id' | 'sig'>,\n): string {\n const serialized = JSON.stringify([\n 0,\n event.pubkey,\n event.created_at,\n event.kind,\n event.tags,\n event.content,\n ]);\n return createHash('sha256').update(serialized).digest('hex');\n}\n\nfunction tagValue(event: NostrForgeEvent, name: string): string | undefined {\n for (const tag of event.tags) {\n if (tag[0] === name && typeof tag[1] === 'string' && tag[1] !== '') {\n return tag[1];\n }\n }\n return undefined;\n}\n\nfunction optionalJson(content: string): Record<string, unknown> {\n if (!content) return {};\n try {\n const parsed: unknown = JSON.parse(content);\n return parsed && typeof parsed === 'object' && !Array.isArray(parsed)\n ? (parsed as Record<string, unknown>)\n : {};\n } catch {\n return {};\n }\n}\n\nfunction actorFromPubkey(pubkey: string): ForgeActor {\n return {\n id: pubkey,\n login: pubkey,\n type: 'User',\n };\n}\n\nfunction repositoryFromEvent(event: NostrForgeEvent): ForgeRepositoryRef {\n const owner =\n tagValue(event, 'p') ?? tagValue(event, 'owner') ?? event.pubkey;\n const name =\n tagValue(event, 'd') ??\n tagValue(event, 'repo') ??\n tagValue(event, 'name') ??\n 'unknown';\n const fullName =\n tagValue(event, 'a')?.replace(/^30617:/, '') ?? `${owner}/${name}`;\n return {\n id: tagValue(event, 'repo-id') ?? fullName,\n owner,\n name: name.includes('/') ? (name.split('/').pop() ?? name) : name,\n fullName: fullName.includes('/') ? fullName : `${owner}/${name}`,\n url: tagValue(event, 'clone') ?? tagValue(event, 'url'),\n };\n}\n\nfunction pullRequestFromEvent(event: NostrForgeEvent): ForgePullRequestRef {\n const body = optionalJson(event.content);\n const numberRaw =\n tagValue(event, 't') ??\n tagValue(event, 'pr') ??\n (typeof body.number === 'number' || typeof body.number === 'string'\n ? String(body.number)\n : '0');\n const number = Number.parseInt(numberRaw, 10);\n const headSha =\n tagValue(event, 'commit') ??\n tagValue(event, 'head') ??\n (typeof body.headSha === 'string' ? body.headSha : '') ??\n (typeof body.head_sha === 'string' ? body.head_sha : '') ??\n '';\n const stateTag = tagValue(event, 'status') ?? tagValue(event, 'state');\n const state =\n stateTag === 'closed' ||\n stateTag === 'merged' ||\n event.kind === BUZZ_FORGE_KINDS.statusClosed\n ? 'closed'\n : 'open';\n return {\n id: event.id,\n number: Number.isFinite(number) && number > 0 ? number : 0,\n state,\n headSha,\n headRef: tagValue(event, 'head-ref') ?? tagValue(event, 'branch'),\n baseSha: tagValue(event, 'base') ?? tagValue(event, 'base-sha'),\n baseRef: tagValue(event, 'base-ref') ?? 'refs/heads/main',\n merged:\n event.kind === BUZZ_FORGE_KINDS.statusApplied ||\n stateTag === 'merged' ||\n body.merged === true,\n mergeCommitSha:\n typeof body.mergeCommitSha === 'string'\n ? body.mergeCommitSha\n : tagValue(event, 'merge-commit'),\n url: tagValue(event, 'url'),\n };\n}\n\nfunction pullRequestForReaction(\n event: NostrForgeEvent,\n referencedPatchEvent?: NostrForgeEvent,\n): ForgePullRequestRef {\n const pullRequest = pullRequestFromEvent(event);\n if (pullRequest.number > 0) return pullRequest;\n const targetId = tagValue(event, 'e');\n if (\n targetId &&\n referencedPatchEvent?.id === targetId &&\n referencedPatchEvent.kind === BUZZ_FORGE_KINDS.patch\n ) {\n return pullRequestFromEvent(referencedPatchEvent);\n }\n throw new ForgeError(\n 'Buzz approval reaction must include pull-request metadata or its referenced patch event',\n 'INVALID_INPUT',\n { provider: 'buzz' },\n );\n}\n\nfunction checkFromStatusEvent(event: NostrForgeEvent): CheckRun {\n const body = optionalJson(event.content);\n const context =\n tagValue(event, 'context') ??\n tagValue(event, 'l') ??\n (typeof body.context === 'string' ? body.context : 'ci');\n const conclusionRaw =\n tagValue(event, 'conclusion') ??\n (typeof body.conclusion === 'string' ? body.conclusion : undefined) ??\n (typeof body.state === 'string' ? body.state : undefined);\n let conclusion: CheckRun['conclusion'];\n let status: CheckRun['status'] = 'completed';\n if (\n conclusionRaw === 'success' ||\n conclusionRaw === 'failure' ||\n conclusionRaw === 'neutral' ||\n conclusionRaw === 'cancelled' ||\n conclusionRaw === 'skipped' ||\n conclusionRaw === 'timed_out' ||\n conclusionRaw === 'action_required' ||\n conclusionRaw === 'stale' ||\n conclusionRaw === 'startup_failure'\n ) {\n conclusion = conclusionRaw;\n } else if (event.kind === BUZZ_FORGE_KINDS.statusApplied) {\n conclusion = 'success';\n } else if (event.kind === BUZZ_FORGE_KINDS.statusClosed) {\n conclusion = 'cancelled';\n } else if (event.kind === BUZZ_FORGE_KINDS.statusDraft) {\n status = 'in_progress';\n conclusion = undefined;\n } else {\n status = 'queued';\n conclusion = undefined;\n }\n return {\n id: event.id,\n name: context,\n headSha:\n tagValue(event, 'commit') ??\n tagValue(event, 'head') ??\n (typeof body.headSha === 'string' ? body.headSha : '') ??\n '',\n status,\n conclusion,\n detailsUrl: tagValue(event, 'url'),\n startedAt: new Date(event.created_at * 1000),\n completedAt:\n status === 'completed' ? new Date(event.created_at * 1000) : undefined,\n raw: event as unknown as Record<string, unknown>,\n };\n}\n\n/**\n * Resolve a reactor's channel role from a kind:39002 members list.\n * Returns null when the pubkey is absent from the membership event.\n */\nexport function resolveBuzzChannelRole(\n membersEvent: NostrForgeEvent,\n pubkey: string,\n): BuzzRoleResolution | null {\n if (membersEvent.kind !== BUZZ_FORGE_KINDS.channelMembers) {\n throw new ForgeError(\n 'Role resolution requires a kind:39002 members event',\n 'INVALID_INPUT',\n { provider: 'buzz' },\n );\n }\n for (const tag of membersEvent.tags) {\n if (tag[0] !== 'p' || tag[1] !== pubkey) continue;\n const roleRaw = (tag[2] ?? 'member').toLowerCase();\n const role: BuzzChannelRole =\n roleRaw === 'owner' ||\n roleRaw === 'admin' ||\n roleRaw === 'member' ||\n roleRaw === 'guest' ||\n roleRaw === 'bot'\n ? roleRaw\n : 'member';\n return { pubkey, role };\n }\n return null;\n}\n\n/** True when the reactor's role rank is at or above the configured floor. */\nexport function roleMeetsFloor(\n role: BuzzChannelRole,\n floor: BuzzChannelRole,\n): boolean {\n return ROLE_RANK[role] >= ROLE_RANK[floor];\n}\n\n/**\n * Normalize one already-verified Nostr forge event into a provider-neutral\n * envelope. Signature verification is the caller's responsibility (or use\n * {@link verifyAndNormalizeBuzzEvent}).\n */\nexport function normalizeBuzzEvent(\n event: NostrForgeEvent,\n receivedAt = new Date(),\n options: {\n roleFloor?: BuzzChannelRole;\n membersEvent?: NostrForgeEvent;\n referencedPatchEvent?: NostrForgeEvent;\n } = {},\n): ForgeEventEnvelope {\n const repository = repositoryFromEvent(event);\n const actor = actorFromPubkey(event.pubkey);\n const observation = normalizeObservation(event, options);\n return {\n provider: 'buzz',\n deliveryId: event.id,\n event: String(event.kind),\n action: tagValue(event, 'action'),\n occurredAt: new Date(event.created_at * 1000),\n receivedAt,\n repository,\n actor,\n observation,\n raw: event,\n };\n}\n\nfunction normalizeObservation(\n event: NostrForgeEvent,\n options: {\n roleFloor?: BuzzChannelRole;\n membersEvent?: NostrForgeEvent;\n referencedPatchEvent?: NostrForgeEvent;\n },\n): ForgeObservation {\n switch (event.kind) {\n case BUZZ_FORGE_KINDS.repositoryAnnouncement:\n return {\n kind: 'repository',\n repository: repositoryFromEvent(event),\n };\n case BUZZ_FORGE_KINDS.refUpdate: {\n const body = optionalJson(event.content);\n const ref =\n tagValue(event, 'ref') ??\n (typeof body.ref === 'string' ? body.ref : 'refs/heads/main');\n const afterSha =\n tagValue(event, 'commit') ??\n tagValue(event, 'head') ??\n (typeof body.head === 'string' ? body.head : '') ??\n (typeof body.after === 'string' ? body.after : '') ??\n '';\n const beforeSha =\n tagValue(event, 'previous') ??\n tagValue(event, 'before') ??\n (typeof body.before === 'string' ? body.before : undefined) ??\n (typeof body.previous === 'string' ? body.previous : undefined);\n return {\n kind: 'push',\n ref,\n beforeSha,\n afterSha,\n forced: body.forced === true,\n created: body.created === true,\n deleted:\n body.deleted === true ||\n afterSha === '' ||\n afterSha === '0'.repeat(40),\n };\n }\n case BUZZ_FORGE_KINDS.patch:\n return {\n kind: 'pull_request',\n pullRequest: pullRequestFromEvent(event),\n };\n case BUZZ_FORGE_KINDS.statusOpen:\n case BUZZ_FORGE_KINDS.statusDraft:\n return {\n kind: 'check',\n check: checkFromStatusEvent(event),\n };\n case BUZZ_FORGE_KINDS.statusClosed:\n return {\n kind: 'check',\n check: checkFromStatusEvent(event),\n };\n case BUZZ_FORGE_KINDS.statusApplied: {\n // kind:1631 is posted after a coordinator merge (ADR-002).\n const pullRequest = pullRequestFromEvent(event);\n return {\n kind: 'merge',\n pullRequest: { ...pullRequest, state: 'closed', merged: true },\n mergeCommitSha: pullRequest.mergeCommitSha ?? pullRequest.headSha,\n };\n }\n case BUZZ_FORGE_KINDS.reaction: {\n const body = optionalJson(event.content);\n const content =\n event.content.trim() ||\n (typeof body.content === 'string' ? body.content : '');\n const isApproval =\n content === '✅' ||\n content === '+' ||\n content.toLowerCase() === 'approved' ||\n body.approved === true;\n const commitSha =\n tagValue(event, 'commit') ??\n tagValue(event, 'e') ??\n (typeof body.commitSha === 'string' ? body.commitSha : undefined);\n let author = actorFromPubkey(event.pubkey);\n const pullRequest = pullRequestForReaction(\n event,\n options.referencedPatchEvent,\n );\n if (options.membersEvent) {\n const resolved = resolveBuzzChannelRole(\n options.membersEvent,\n event.pubkey,\n );\n if (!resolved) {\n throw new ForgeError(\n 'Buzz approval actor is not a member of the configured channel',\n 'AUTHORITY_MISMATCH',\n { provider: 'buzz' },\n );\n }\n author = { ...author, type: `role:${resolved.role}` };\n const floor = options.roleFloor ?? 'member';\n if (!roleMeetsFloor(resolved.role, floor)) {\n return {\n kind: 'review',\n pullRequest,\n review: {\n id: event.id,\n state: 'COMMENTED',\n body: content,\n commitSha,\n submittedAt: new Date(event.created_at * 1000),\n author,\n },\n };\n }\n }\n return {\n kind: 'review',\n pullRequest,\n review: {\n id: event.id,\n state: isApproval ? 'APPROVED' : 'COMMENTED',\n body: content,\n commitSha,\n submittedAt: new Date(event.created_at * 1000),\n author,\n },\n };\n }\n default:\n return { kind: 'unknown' };\n }\n}\n\n/**\n * Structural signature verification for Nostr events.\n *\n * When `nostr-tools` is available it performs full Schnorr verification.\n * Otherwise it fails closed unless `allowUnverifiedFixtures` is set (tests\n * that inject pre-trusted fixture events with matching id digests).\n */\nexport function verifyNostrEventSignature(\n event: NostrForgeEvent,\n options: { allowUnverifiedFixtures?: boolean } = {},\n): void {\n if (!event.id || !event.pubkey || !event.sig) {\n throw new ForgeSignatureError(\n 'Buzz forge event is missing id, pubkey, or sig',\n );\n }\n const expectedId = computeNostrEventId({\n pubkey: event.pubkey,\n created_at: event.created_at,\n kind: event.kind,\n tags: event.tags,\n content: event.content,\n });\n if (expectedId !== event.id) {\n throw new ForgeSignatureError(\n 'Buzz forge event id does not match NIP-01 digest',\n );\n }\n if (options.allowUnverifiedFixtures) {\n // Fixture path: id digest already matched; signature bytes are placeholders.\n if (event.sig.length < 64) {\n throw new ForgeSignatureError(\n 'Buzz forge fixture signature is malformed',\n );\n }\n return;\n }\n if (!verifyEvent(event as never)) {\n throw new ForgeSignatureError(\n 'Buzz forge event Schnorr signature is invalid',\n );\n }\n}\n\n/**\n * Verify then normalize a buzz forge event. Rejects invalid signatures without\n * producing an observation.\n */\nexport function verifyAndNormalizeBuzzEvent(\n event: NostrForgeEvent,\n receivedAt = new Date(),\n options: {\n roleFloor?: BuzzChannelRole;\n membersEvent?: NostrForgeEvent;\n referencedPatchEvent?: NostrForgeEvent;\n allowUnverifiedFixtures?: boolean;\n } = {},\n): ForgeEventEnvelope {\n verifyNostrEventSignature(event, {\n allowUnverifiedFixtures: options.allowUnverifiedFixtures,\n });\n return normalizeBuzzEvent(event, receivedAt, {\n roleFloor: options.roleFloor,\n membersEvent: options.membersEvent,\n referencedPatchEvent: options.referencedPatchEvent,\n });\n}\n\n/** Extract a channel id from common buzz tags when present. */\nexport function channelIdFromEvent(event: NostrForgeEvent): string | undefined {\n return tagValue(event, 'channel') ?? tagValue(event, 'h');\n}\n","import { computeNostrEventId } from './events.js';\nimport { BUZZ_FORGE_KINDS, type NostrForgeEvent } from './types.js';\n\nconst FIXTURE_PUBKEY =\n '2ad53df8aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa4f05';\nconst FIXTURE_ATTESTOR =\n 'bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb';\nconst FIXTURE_REACTOR =\n 'cccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc';\nconst PLACEHOLDER_SIG = 'a'.repeat(128);\n\nexport interface BuzzFixtureOptions {\n /** Override event id after computing the NIP-01 digest (duplicate/replay cases). */\n id?: string;\n pubkey?: string;\n created_at?: number;\n tags?: readonly (readonly string[])[];\n content?: string;\n sig?: string;\n}\n\n/**\n * Build a deterministic unsigned-then-id-bound Nostr event for tests.\n * Signature bytes are placeholders; pair with `allowUnverifiedFixtures: true`.\n */\nexport function createBuzzFixtureEvent(\n kind: number,\n options: BuzzFixtureOptions = {},\n): NostrForgeEvent {\n const skeleton = {\n pubkey: options.pubkey ?? FIXTURE_PUBKEY,\n created_at: options.created_at ?? 1_725_000_000,\n kind,\n tags: options.tags ?? [],\n content: options.content ?? '',\n };\n const id = options.id ?? computeNostrEventId(skeleton);\n return {\n ...skeleton,\n id,\n sig: options.sig ?? PLACEHOLDER_SIG,\n };\n}\n\nexport function createRepositoryAnnouncementFixture(\n options: BuzzFixtureOptions & {\n owner?: string;\n repoId?: string;\n channelId?: string;\n } = {},\n): NostrForgeEvent {\n const owner = options.owner ?? FIXTURE_PUBKEY;\n const repoId = options.repoId ?? 'happyvertical.com';\n return createBuzzFixtureEvent(BUZZ_FORGE_KINDS.repositoryAnnouncement, {\n ...options,\n pubkey: owner,\n tags: options.tags ?? [\n ['d', repoId],\n ['p', owner],\n ['channel', options.channelId ?? 'channel-hv'],\n ['clone', `https://buzz.happyvertical.com/git/${owner}/${repoId}.git`],\n ],\n });\n}\n\nexport function createRefUpdateFixture(\n options: BuzzFixtureOptions & {\n ref?: string;\n head?: string;\n previous?: string;\n repoId?: string;\n owner?: string;\n } = {},\n): NostrForgeEvent {\n const head = options.head ?? '1111111111111111111111111111111111111111';\n const previous =\n options.previous ?? '0000000000000000000000000000000000000000';\n const owner = options.owner ?? FIXTURE_PUBKEY;\n const repoId = options.repoId ?? 'happyvertical.com';\n return createBuzzFixtureEvent(BUZZ_FORGE_KINDS.refUpdate, {\n ...options,\n tags: options.tags ?? [\n ['d', repoId],\n ['p', owner],\n ['ref', options.ref ?? 'refs/heads/main'],\n ['commit', head],\n ['previous', previous],\n ],\n content:\n options.content ??\n JSON.stringify({\n ref: options.ref ?? 'refs/heads/main',\n head,\n before: previous,\n }),\n });\n}\n\nexport function createPatchFixture(\n options: BuzzFixtureOptions & {\n headSha?: string;\n number?: number;\n repoId?: string;\n } = {},\n): NostrForgeEvent {\n const headSha = options.headSha ?? '2222222222222222222222222222222222222222';\n return createBuzzFixtureEvent(BUZZ_FORGE_KINDS.patch, {\n ...options,\n tags: options.tags ?? [\n ['d', options.repoId ?? 'happyvertical.com'],\n ['p', FIXTURE_PUBKEY],\n ['commit', headSha],\n ['t', String(options.number ?? 1)],\n ['head-ref', 'refs/heads/feature'],\n ['base-ref', 'refs/heads/main'],\n ],\n content:\n options.content ??\n JSON.stringify({ number: options.number ?? 1, headSha }),\n });\n}\n\nexport function createStatusFixture(\n options: BuzzFixtureOptions & {\n kind?:\n | typeof BUZZ_FORGE_KINDS.statusOpen\n | typeof BUZZ_FORGE_KINDS.statusApplied\n | typeof BUZZ_FORGE_KINDS.statusClosed\n | typeof BUZZ_FORGE_KINDS.statusDraft;\n context?: string;\n headSha?: string;\n conclusion?: string;\n } = {},\n): NostrForgeEvent {\n const kind = options.kind ?? BUZZ_FORGE_KINDS.statusOpen;\n const headSha = options.headSha ?? '2222222222222222222222222222222222222222';\n return createBuzzFixtureEvent(kind, {\n ...options,\n pubkey: options.pubkey ?? FIXTURE_ATTESTOR,\n tags: options.tags ?? [\n ['d', 'happyvertical.com'],\n ['p', FIXTURE_PUBKEY],\n ['commit', headSha],\n ['context', options.context ?? 'ci'],\n ...(options.conclusion\n ? ([['conclusion', options.conclusion]] as const)\n : []),\n ],\n content:\n options.content ??\n JSON.stringify({\n context: options.context ?? 'ci',\n conclusion: options.conclusion ?? 'success',\n headSha,\n }),\n });\n}\n\nexport function createApprovalFixture(\n options: BuzzFixtureOptions & {\n content?: string;\n headSha?: string;\n targetEventId?: string;\n } = {},\n): NostrForgeEvent {\n return createBuzzFixtureEvent(BUZZ_FORGE_KINDS.reaction, {\n ...options,\n pubkey: options.pubkey ?? FIXTURE_REACTOR,\n tags: options.tags ?? [\n ['e', options.targetEventId ?? 'merge-request-event-id'],\n ['p', FIXTURE_PUBKEY],\n ['commit', options.headSha ?? '2222222222222222222222222222222222222222'],\n ],\n content: options.content ?? '✅',\n });\n}\n\nexport function createMembersFixture(\n options: BuzzFixtureOptions & {\n members?: readonly { pubkey: string; role: string }[];\n } = {},\n): NostrForgeEvent {\n const members = options.members ?? [\n { pubkey: FIXTURE_PUBKEY, role: 'owner' },\n { pubkey: FIXTURE_REACTOR, role: 'admin' },\n { pubkey: FIXTURE_ATTESTOR, role: 'bot' },\n ];\n return createBuzzFixtureEvent(BUZZ_FORGE_KINDS.channelMembers, {\n ...options,\n tags: options.tags ?? [\n ['d', 'channel-hv'],\n ...members.map((m) => ['p', m.pubkey, m.role] as const),\n ],\n });\n}\n\n/**\n * Deterministic sequences for convergence suites (duplicate / delayed /\n * out-of-order / replay). Each sequence is an ordered list of Nostr events;\n * consumers may reshuffle delivery while asserting identical projection state.\n */\nexport function createBuzzConvergenceSequences(): {\n canonical: NostrForgeEvent[];\n duplicate: NostrForgeEvent[];\n delayed: NostrForgeEvent[];\n outOfOrder: NostrForgeEvent[];\n replay: NostrForgeEvent[];\n} {\n const repo = createRepositoryAnnouncementFixture({\n created_at: 1_725_000_000,\n });\n const pushH1 = createRefUpdateFixture({\n created_at: 1_725_000_010,\n head: 'aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa',\n previous: '0000000000000000000000000000000000000000',\n });\n const patch = createPatchFixture({\n created_at: 1_725_000_020,\n headSha: 'aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa',\n number: 7,\n });\n const ci = createStatusFixture({\n created_at: 1_725_000_030,\n headSha: 'aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa',\n conclusion: 'success',\n });\n const approval = createApprovalFixture({\n created_at: 1_725_000_040,\n headSha: 'aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa',\n targetEventId: patch.id,\n });\n const merge = createStatusFixture({\n kind: BUZZ_FORGE_KINDS.statusApplied,\n created_at: 1_725_000_050,\n headSha: 'aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa',\n });\n const pushH2 = createRefUpdateFixture({\n created_at: 1_725_000_060,\n head: 'bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb',\n previous: 'aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa',\n });\n\n const canonical = [repo, pushH1, patch, ci, approval, merge, pushH2];\n return {\n canonical,\n // Same events delivered twice in order.\n duplicate: [...canonical, ...canonical],\n // Same events with a multi-second gap encoded via created_at only (delivery delay).\n delayed: canonical.map((event, index) =>\n createBuzzFixtureEvent(event.kind, {\n id: event.id,\n pubkey: event.pubkey,\n created_at: event.created_at,\n tags: event.tags,\n content: event.content,\n sig: event.sig,\n }),\n ),\n // Later push arrives before CI/approval/merge for the prior head.\n outOfOrder: [repo, pushH1, pushH2, patch, ci, approval, merge],\n // Full replay of the canonical sequence after completion.\n replay: [...canonical, ...canonical.map((e) => ({ ...e }))],\n };\n}\n\nexport const BUZZ_FIXTURE_PUBKEYS = {\n owner: FIXTURE_PUBKEY,\n attestor: FIXTURE_ATTESTOR,\n reactor: FIXTURE_REACTOR,\n} as const;\n","import { ForgeError } from '../forge/errors.js';\nimport type { ForgeEventEnvelope } from '../forge/types.js';\nimport {\n channelIdFromEvent,\n normalizeBuzzEvent,\n verifyAndNormalizeBuzzEvent,\n} from './events.js';\nimport {\n BUZZ_FORGE_KINDS,\n type BuzzRelayClientOptions,\n type BuzzRelaySubscription,\n type NostrForgeEvent,\n} from './types.js';\n\nconst DEFAULT_KINDS: readonly number[] = [\n BUZZ_FORGE_KINDS.repositoryAnnouncement,\n BUZZ_FORGE_KINDS.refUpdate,\n BUZZ_FORGE_KINDS.patch,\n BUZZ_FORGE_KINDS.statusOpen,\n BUZZ_FORGE_KINDS.statusApplied,\n BUZZ_FORGE_KINDS.statusClosed,\n BUZZ_FORGE_KINDS.statusDraft,\n BUZZ_FORGE_KINDS.reaction,\n BUZZ_FORGE_KINDS.channelMembers,\n];\n\nfunction isNostrForgeEvent(value: unknown): value is NostrForgeEvent {\n if (!value || typeof value !== 'object') return false;\n const event = value as Record<string, unknown>;\n return (\n typeof event.id === 'string' &&\n typeof event.pubkey === 'string' &&\n typeof event.created_at === 'number' &&\n typeof event.kind === 'number' &&\n Array.isArray(event.tags) &&\n typeof event.content === 'string' &&\n typeof event.sig === 'string'\n );\n}\n\n/**\n * Minimal buzz relay client: HTTP REQ polling plus an injectable event source\n * for tests and WebSocket adapters.\n *\n * The client never mutates process-global state. Each subscribe/poll call is\n * scoped to the constructed options.\n */\nexport class BuzzRelayClient {\n private readonly relays: readonly string[];\n private readonly kinds: readonly number[];\n private readonly channelIds: readonly string[] | undefined;\n private readonly fetchImpl: typeof fetch;\n private readonly pollIntervalMs: number;\n private readonly seenIds = new Set<string>();\n\n constructor(options: BuzzRelayClientOptions) {\n if (!options.relays.length) {\n throw new ForgeError(\n 'Buzz relay client requires at least one relay',\n 'CONFIGURATION_ERROR',\n {\n provider: 'buzz',\n },\n );\n }\n this.relays = options.relays;\n this.kinds = options.kinds ?? DEFAULT_KINDS;\n this.channelIds = options.channelIds;\n this.fetchImpl = options.fetch ?? fetch;\n this.pollIntervalMs = options.pollIntervalMs ?? 5000;\n }\n\n /**\n * Poll every configured relay once with a NIP-01-style HTTP REQ body and\n * return newly observed, verified envelopes (deduped by event id).\n */\n async pollOnce(\n options: {\n since?: number;\n allowUnverifiedFixtures?: boolean;\n membersEvent?: NostrForgeEvent;\n referencedPatchEvent?: NostrForgeEvent;\n } = {},\n ): Promise<ForgeEventEnvelope[]> {\n const envelopes: ForgeEventEnvelope[] = [];\n for (const relay of this.relays) {\n const events = await this.fetchEvents(relay, options.since);\n const patches = new Map(\n events\n .filter((event) => event.kind === BUZZ_FORGE_KINDS.patch)\n .map((event) => [event.id, event]),\n );\n for (const event of events) {\n if (this.seenIds.has(event.id)) continue;\n if (!this.kinds.includes(event.kind)) continue;\n if (this.channelIds?.length) {\n const channelId = channelIdFromEvent(event);\n if (!channelId || !this.channelIds.includes(channelId)) continue;\n }\n try {\n const envelope = verifyAndNormalizeBuzzEvent(event, new Date(), {\n allowUnverifiedFixtures: options.allowUnverifiedFixtures,\n membersEvent: options.membersEvent,\n referencedPatchEvent:\n options.referencedPatchEvent ??\n patches.get(event.tags.find((tag) => tag[0] === 'e')?.[1] ?? ''),\n });\n this.seenIds.add(event.id);\n envelopes.push(envelope);\n } catch {\n // Fail closed per event; continue scanning the rest of the batch.\n }\n }\n }\n return envelopes;\n }\n\n /**\n * Poll on an interval until `close()` is called. Useful for long-running\n * Aedile adapters. Returns a subscription handle.\n */\n subscribe(\n onEvent: (envelope: ForgeEventEnvelope) => void | Promise<void>,\n options: {\n since?: number;\n allowUnverifiedFixtures?: boolean;\n membersEvent?: NostrForgeEvent;\n referencedPatchEvent?: NostrForgeEvent;\n onError?: (error: unknown) => void;\n } = {},\n ): BuzzRelaySubscription {\n let stopped = false;\n let timer: ReturnType<typeof setTimeout> | undefined;\n\n const tick = async () => {\n if (stopped) return;\n try {\n const envelopes = await this.pollOnce(options);\n for (const envelope of envelopes) {\n await onEvent(envelope);\n }\n } catch (error) {\n options.onError?.(error);\n }\n if (!stopped) {\n timer = setTimeout(() => {\n void tick();\n }, this.pollIntervalMs);\n }\n };\n\n void tick();\n\n return {\n close() {\n stopped = true;\n clearTimeout(timer);\n },\n };\n }\n\n /**\n * Normalize a pre-fetched event list (tests / custom transports) without\n * contacting a relay. Applies the same kind/channel filters and id dedupe.\n */\n ingestEvents(\n events: readonly NostrForgeEvent[],\n options: {\n allowUnverifiedFixtures?: boolean;\n membersEvent?: NostrForgeEvent;\n referencedPatchEvent?: NostrForgeEvent;\n verify?: boolean;\n } = {},\n ): ForgeEventEnvelope[] {\n const envelopes: ForgeEventEnvelope[] = [];\n const patches = new Map(\n events\n .filter((event) => event.kind === BUZZ_FORGE_KINDS.patch)\n .map((event) => [event.id, event]),\n );\n for (const event of events) {\n if (this.seenIds.has(event.id)) continue;\n if (!this.kinds.includes(event.kind)) continue;\n if (this.channelIds?.length) {\n const channelId = channelIdFromEvent(event);\n if (!channelId || !this.channelIds.includes(channelId)) continue;\n }\n const envelope =\n options.verify === false\n ? normalizeBuzzEvent(event, new Date(), {\n membersEvent: options.membersEvent,\n referencedPatchEvent:\n options.referencedPatchEvent ??\n patches.get(\n event.tags.find((tag) => tag[0] === 'e')?.[1] ?? '',\n ),\n })\n : verifyAndNormalizeBuzzEvent(event, new Date(), {\n allowUnverifiedFixtures: options.allowUnverifiedFixtures,\n membersEvent: options.membersEvent,\n referencedPatchEvent:\n options.referencedPatchEvent ??\n patches.get(\n event.tags.find((tag) => tag[0] === 'e')?.[1] ?? '',\n ),\n });\n this.seenIds.add(event.id);\n envelopes.push(envelope);\n }\n return envelopes;\n }\n\n /** Forget delivered ids (operator replay). */\n resetSeen(): void {\n this.seenIds.clear();\n }\n\n private async fetchEvents(\n relay: string,\n since?: number,\n ): Promise<NostrForgeEvent[]> {\n const filter: Record<string, unknown> = { kinds: [...this.kinds] };\n if (since !== undefined) filter.since = since;\n if (this.channelIds?.length) filter['#channel'] = [...this.channelIds];\n\n // HTTP REQ convention used by HappyVertical relay helpers: POST JSON array.\n const body = JSON.stringify(['REQ', 'buzz-forge', filter]);\n let response: Response;\n try {\n response = await this.fetchImpl(relay, {\n method: 'POST',\n headers: { 'content-type': 'application/json' },\n body,\n });\n } catch (error) {\n throw new ForgeError('Buzz relay transport failed', 'TRANSPORT_ERROR', {\n provider: 'buzz',\n cause: error,\n retryable: true,\n });\n }\n if (!response.ok) {\n throw new ForgeError(\n `Buzz relay returned HTTP ${response.status}`,\n 'PROVIDER_ERROR',\n {\n provider: 'buzz',\n status: response.status,\n retryable: response.status >= 500,\n },\n );\n }\n const payload: unknown = await response.json();\n return extractEvents(payload);\n }\n}\n\nfunction extractEvents(payload: unknown): NostrForgeEvent[] {\n if (!Array.isArray(payload)) return [];\n const events: NostrForgeEvent[] = [];\n for (const item of payload) {\n if (\n Array.isArray(item) &&\n item[0] === 'EVENT' &&\n isNostrForgeEvent(item[2])\n ) {\n events.push(item[2]);\n continue;\n }\n if (isNostrForgeEvent(item)) {\n events.push(item);\n }\n }\n return events;\n}\n","import type {\n CheckRun,\n CommitStatus,\n CreateCheckRunInput,\n CreateCommitStatusInput,\n ForgeOperations,\n ForgePullRequestRef,\n ForgeRepositoryRef,\n ForgeResponse,\n ForgeTransport,\n UpdateCheckRunInput,\n} from '../forge/types.js';\n\n/** Repository coordinates and transport for a GitHub forge provider. */\nexport interface GitHubForgeProviderOptions {\n owner: string;\n repo: string;\n transport: ForgeTransport;\n}\n\nfunction repositoryPath(owner: string, repo: string): string {\n return `/repos/${encodeURIComponent(owner)}/${encodeURIComponent(repo)}`;\n}\n\nfunction normalizeRepository(\n data: Record<string, unknown>,\n): ForgeRepositoryRef {\n const owner = (data.owner as { login?: string } | undefined)?.login ?? '';\n const name = typeof data.name === 'string' ? data.name : '';\n return {\n id: data.node_id === undefined ? undefined : String(data.node_id),\n owner,\n name,\n fullName:\n typeof data.full_name === 'string' ? data.full_name : `${owner}/${name}`,\n defaultBranch:\n typeof data.default_branch === 'string' ? data.default_branch : undefined,\n private: typeof data.private === 'boolean' ? data.private : undefined,\n url: typeof data.html_url === 'string' ? data.html_url : undefined,\n };\n}\n\nfunction normalizePullRequest(\n data: Record<string, unknown>,\n): ForgePullRequestRef {\n const head = (data.head ?? {}) as Record<string, unknown>;\n const base = (data.base ?? {}) as Record<string, unknown>;\n return {\n id: data.node_id === undefined ? undefined : String(data.node_id),\n number: Number(data.number),\n state: data.state === 'closed' ? 'closed' : 'open',\n draft: typeof data.draft === 'boolean' ? data.draft : undefined,\n headSha: String(head.sha ?? ''),\n headRef: typeof head.ref === 'string' ? head.ref : undefined,\n baseSha: typeof base.sha === 'string' ? base.sha : undefined,\n baseRef: typeof base.ref === 'string' ? base.ref : undefined,\n merged: typeof data.merged === 'boolean' ? data.merged : undefined,\n mergeCommitSha:\n typeof data.merge_commit_sha === 'string'\n ? data.merge_commit_sha\n : undefined,\n url: typeof data.html_url === 'string' ? data.html_url : undefined,\n };\n}\n\nfunction normalizeStatus(data: Record<string, unknown>): CommitStatus {\n return {\n id: String(data.id ?? data.node_id ?? ''),\n sha: String(data.sha ?? ''),\n state: String(data.state ?? ''),\n context: String(data.context ?? ''),\n description:\n typeof data.description === 'string' ? data.description : undefined,\n targetUrl:\n typeof data.target_url === 'string' ? data.target_url : undefined,\n createdAt:\n typeof data.created_at === 'string'\n ? new Date(data.created_at)\n : undefined,\n raw: data,\n };\n}\n\nfunction normalizeCheck(data: Record<string, unknown>): CheckRun {\n return {\n id: String(data.id ?? data.node_id ?? ''),\n name: String(data.name ?? ''),\n headSha: String(data.head_sha ?? ''),\n status: (data.status ?? 'queued') as CheckRun['status'],\n conclusion:\n typeof data.conclusion === 'string'\n ? (data.conclusion as CheckRun['conclusion'])\n : undefined,\n detailsUrl:\n typeof data.details_url === 'string' ? data.details_url : undefined,\n externalId:\n typeof data.external_id === 'string' ? data.external_id : undefined,\n startedAt:\n typeof data.started_at === 'string'\n ? new Date(data.started_at)\n : undefined,\n completedAt:\n typeof data.completed_at === 'string'\n ? new Date(data.completed_at)\n : undefined,\n raw: data,\n };\n}\n\nfunction checkInput(input: CreateCheckRunInput | UpdateCheckRunInput) {\n return {\n ...('name' in input ? { name: input.name } : {}),\n ...('headSha' in input ? { head_sha: input.headSha } : {}),\n status: input.status,\n conclusion: input.conclusion,\n details_url: input.detailsUrl,\n external_id: input.externalId,\n started_at:\n input.startedAt instanceof Date\n ? input.startedAt.toISOString()\n : input.startedAt,\n completed_at:\n input.completedAt instanceof Date\n ? input.completedAt.toISOString()\n : input.completedAt,\n output: input.output,\n };\n}\n\n/**\n * Repository-scoped GitHub implementation of provider-neutral forge operations.\n * Every operation may throw `ForgeError` for transport or provider failures.\n */\nexport class GitHubForgeProvider implements ForgeOperations {\n private readonly transport: ForgeTransport;\n private readonly path: string;\n\n /**\n * Creates a repository-scoped GitHub forge provider.\n * @param options Repository coordinates and authenticated transport.\n */\n constructor(options: GitHubForgeProviderOptions) {\n this.transport = options.transport;\n this.path = repositoryPath(options.owner, options.repo);\n }\n\n /** @returns Normalized repository data and request metadata. */\n async getRepository(): Promise<ForgeResponse<ForgeRepositoryRef>> {\n const response = await this.transport.request<Record<string, unknown>>({\n method: 'GET',\n path: this.path,\n });\n return { ...response, data: normalizeRepository(response.data) };\n }\n\n /**\n * Returns one normalized pull request.\n * @param number Repository-local pull-request number.\n * @returns Pull-request data and request metadata.\n * @throws {ForgeError} When GitHub rejects the request.\n */\n async getPullRequest(\n number: number,\n ): Promise<ForgeResponse<ForgePullRequestRef>> {\n const response = await this.transport.request<Record<string, unknown>>({\n method: 'GET',\n path: `${this.path}/pulls/${number}`,\n });\n return { ...response, data: normalizePullRequest(response.data) };\n }\n\n /**\n * Lists every raw provider review for one pull request.\n * @param number Repository-local pull-request number.\n * @returns All reviews and final-page request metadata.\n */\n listPullRequestReviews(\n number: number,\n ): Promise<ForgeResponse<readonly unknown[]>> {\n return this.paginate(\n `${this.path}/pulls/${number}/reviews`,\n (data) => data as unknown[],\n );\n }\n\n /**\n * Returns one raw provider commit payload.\n * @param sha Exact commit SHA.\n * @returns Commit payload and request metadata.\n */\n getCommit(sha: string): Promise<ForgeResponse<unknown>> {\n return this.transport.request({\n method: 'GET',\n path: `${this.path}/commits/${encodeURIComponent(sha)}`,\n });\n }\n\n /**\n * Returns complete normalized commit-status history.\n * @param sha Exact commit SHA.\n * @returns All status pages and final-page request metadata.\n */\n async listCommitStatuses(\n sha: string,\n ): Promise<ForgeResponse<readonly CommitStatus[]>> {\n return this.paginate(\n `${this.path}/commits/${encodeURIComponent(sha)}/statuses`,\n (data) => (data as Record<string, unknown>[]).map(normalizeStatus),\n );\n }\n\n /**\n * Publishes one commit status.\n * @param input Exact SHA and status attributes.\n * @returns Published status and request metadata.\n */\n async createCommitStatus(\n input: CreateCommitStatusInput,\n ): Promise<ForgeResponse<CommitStatus>> {\n const response = await this.transport.request<Record<string, unknown>>({\n method: 'POST',\n path: `${this.path}/statuses/${encodeURIComponent(input.sha)}`,\n body: {\n state: input.state,\n context: input.context,\n description: input.description,\n target_url: input.targetUrl,\n },\n });\n return { ...response, data: normalizeStatus(response.data) };\n }\n\n /**\n * Returns all normalized check runs, including reruns.\n * @param sha Exact commit SHA.\n * @returns All check pages and final-page request metadata.\n */\n async listCheckRuns(\n sha: string,\n ): Promise<ForgeResponse<readonly CheckRun[]>> {\n return this.paginate(\n `${this.path}/commits/${encodeURIComponent(sha)}/check-runs?filter=all`,\n (data) =>\n (\n (data as { check_runs?: Record<string, unknown>[] }).check_runs ?? []\n ).map(normalizeCheck),\n (data) => (data as { total_count?: number }).total_count,\n );\n }\n\n /**\n * Publishes one check run.\n * @param input Check identity, exact head SHA, state, and output.\n * @returns Published check and request metadata.\n */\n async createCheckRun(\n input: CreateCheckRunInput,\n ): Promise<ForgeResponse<CheckRun>> {\n const response = await this.transport.request<Record<string, unknown>>({\n method: 'POST',\n path: `${this.path}/check-runs`,\n body: checkInput(input),\n });\n return { ...response, data: normalizeCheck(response.data) };\n }\n\n /**\n * Changes one check run by provider ID.\n * @param id GitHub check-run ID.\n * @param input Attributes to change.\n * @returns Updated check and request metadata.\n */\n async updateCheckRun(\n id: string,\n input: UpdateCheckRunInput,\n ): Promise<ForgeResponse<CheckRun>> {\n const response = await this.transport.request<Record<string, unknown>>({\n method: 'PATCH',\n path: `${this.path}/check-runs/${encodeURIComponent(id)}`,\n body: checkInput(input),\n });\n return { ...response, data: normalizeCheck(response.data) };\n }\n\n /**\n * Lists raw deployment payloads using narrow filters.\n * @param options Optional SHA, environment, and result limit.\n * @returns Matching deployments and request metadata.\n */\n listDeployments(\n options: { sha?: string; environment?: string; limit?: number } = {},\n ): Promise<ForgeResponse<unknown[]>> {\n const params = new URLSearchParams();\n if (options.sha) params.set('sha', options.sha);\n if (options.environment) params.set('environment', options.environment);\n params.set('per_page', String(options.limit ?? 30));\n return this.transport.request({\n method: 'GET',\n path: `${this.path}/deployments?${params}`,\n });\n }\n\n /**\n * Returns one raw deployment payload.\n * @param id GitHub deployment ID.\n * @returns Deployment payload and request metadata.\n */\n getDeployment(id: string): Promise<ForgeResponse<unknown>> {\n return this.transport.request({\n method: 'GET',\n path: `${this.path}/deployments/${encodeURIComponent(id)}`,\n });\n }\n\n private async paginate<T>(\n path: string,\n items: (data: unknown) => readonly T[],\n totalCount?: (data: unknown) => number | undefined,\n ): Promise<ForgeResponse<readonly T[]>> {\n const separator = path.includes('?') ? '&' : '?';\n const collected: T[] = [];\n let page = 1;\n let response: ForgeResponse<unknown>;\n let providerTotal: number | undefined;\n do {\n response = await this.transport.request({\n method: 'GET',\n path: `${path}${separator}per_page=100&page=${page}`,\n });\n const pageItems = items(response.data);\n collected.push(...pageItems);\n providerTotal ??= totalCount?.(response.data);\n page += 1;\n if (pageItems.length < 100) break;\n } while (providerTotal === undefined || collected.length < providerTotal);\n\n return {\n data: collected,\n metadata: {\n ...response.metadata,\n pagination: {\n pages: page - 1,\n totalCount: providerTotal ?? collected.length,\n },\n },\n };\n }\n}\n","import { ForgeError, type ForgeErrorCode } from '../forge/errors.js';\nimport type {\n ForgeRateLimit,\n ForgeResponse,\n ForgeTransport,\n ForgeTransportRequest,\n} from '../forge/types.js';\n\nexport type GitHubTokenSource = string | (() => string | Promise<string>);\n\n/** Construction options for an authenticated GitHub REST transport. */\nexport interface GitHubTransportOptions {\n token: GitHubTokenSource;\n baseUrl?: string;\n fetch?: typeof globalThis.fetch;\n}\n\nfunction optionalInteger(value: string | null): number | undefined {\n if (value === null || value.trim() === '') return undefined;\n const parsed = Number.parseInt(value, 10);\n return Number.isFinite(parsed) ? parsed : undefined;\n}\n\nfunction responseRateLimit(headers: Headers): ForgeRateLimit | undefined {\n const limit = optionalInteger(headers.get('x-ratelimit-limit'));\n const remaining = optionalInteger(headers.get('x-ratelimit-remaining'));\n const used = optionalInteger(headers.get('x-ratelimit-used'));\n const reset = optionalInteger(headers.get('x-ratelimit-reset'));\n const retryAfter = optionalInteger(headers.get('retry-after'));\n if (\n limit === undefined &&\n remaining === undefined &&\n used === undefined &&\n reset === undefined &&\n retryAfter === undefined\n ) {\n return undefined;\n }\n return {\n limit,\n remaining,\n used,\n resetAt: reset === undefined ? undefined : new Date(reset * 1_000),\n retryAfterMs:\n retryAfter === undefined ? undefined : Math.max(0, retryAfter * 1_000),\n };\n}\n\nfunction errorCode(status: number, rateLimit?: ForgeRateLimit): ForgeErrorCode {\n if (status === 401) return 'AUTHENTICATION_FAILED';\n if (status === 404) return 'NOT_FOUND';\n if (status === 422) return 'INVALID_INPUT';\n if (\n status === 429 ||\n (status === 403 &&\n (rateLimit?.remaining === 0 || rateLimit?.retryAfterMs !== undefined))\n ) {\n return 'RATE_LIMITED';\n }\n return 'PROVIDER_ERROR';\n}\n\nexport class GitHubTransport implements ForgeTransport {\n private readonly token: GitHubTokenSource;\n private readonly baseUrl: string;\n private readonly fetchImplementation: typeof globalThis.fetch;\n\n /**\n * Creates a GitHub REST transport with fixed or lazy credentials.\n * @param options Token source, provider URL, and fetch override.\n */\n constructor(options: GitHubTransportOptions) {\n this.token = options.token;\n this.baseUrl = (options.baseUrl ?? 'https://api.github.com').replace(\n /\\/+$/,\n '',\n );\n this.fetchImplementation = options.fetch ?? globalThis.fetch;\n }\n\n /**\n * Executes one GitHub REST request.\n * @param request Method, provider-relative path, body, headers, and signal.\n * @returns Parsed data and metadata for this exact request.\n * @throws {ForgeError} For transport, authentication, rate, or provider failures.\n */\n async request<T>(request: ForgeTransportRequest): Promise<ForgeResponse<T>> {\n const token =\n typeof this.token === 'function' ? await this.token() : this.token;\n let response: Response;\n try {\n response = await this.fetchImplementation(\n `${this.baseUrl}${request.path}`,\n {\n method: request.method,\n headers: {\n Accept: 'application/vnd.github+json',\n Authorization: `Bearer ${token}`,\n 'Content-Type': 'application/json',\n 'X-GitHub-Api-Version': '2022-11-28',\n ...request.headers,\n },\n body:\n request.body === undefined\n ? undefined\n : JSON.stringify(request.body),\n signal: request.signal,\n },\n );\n } catch (cause) {\n throw new ForgeError(\n 'GitHub transport request failed',\n 'TRANSPORT_ERROR',\n {\n cause,\n provider: 'github',\n retryable: true,\n },\n );\n }\n\n const requestId = response.headers.get('x-github-request-id') ?? undefined;\n const rateLimit = responseRateLimit(response.headers);\n const metadata = {\n provider: 'github' as const,\n requestId,\n status: response.status,\n rateLimit,\n };\n let text: string;\n try {\n text = response.status === 204 ? '' : await response.text();\n } catch (cause) {\n throw new ForgeError(\n 'GitHub transport response body failed',\n 'TRANSPORT_ERROR',\n {\n cause,\n provider: 'github',\n status: response.status,\n requestId,\n rateLimit,\n retryable: true,\n },\n );\n }\n let data: unknown;\n try {\n data = text === '' ? undefined : JSON.parse(text);\n } catch {\n data = text;\n }\n\n if (!response.ok) {\n const code = errorCode(response.status, rateLimit);\n const providerMessage =\n typeof data === 'object' &&\n data !== null &&\n 'message' in data &&\n typeof data.message === 'string'\n ? data.message\n : response.statusText;\n throw new ForgeError(`GitHub API error: ${providerMessage}`, code, {\n provider: 'github',\n status: response.status,\n requestId,\n rateLimit,\n details: data,\n retryable: code === 'RATE_LIMITED' || response.status >= 500,\n });\n }\n\n return { data: data as T, metadata };\n }\n}\n","import { createSign } from 'node:crypto';\nimport { ForgeError } from '../forge/errors.js';\nimport type {\n ForgeInstallationRef,\n ForgeRepositoryRef,\n} from '../forge/types.js';\nimport { GitHubForgeProvider } from './forge.js';\nimport { GitHubTransport } from './transport.js';\n\n/** Credentials required to sign GitHub App JSON Web Tokens. */\nexport interface GitHubAppCredentials {\n appId: string | number;\n privateKey: string;\n}\n\n/** Construction options for one request/job-scoped GitHub App authority. */\nexport interface GitHubAppAuthOptions extends GitHubAppCredentials {\n baseUrl?: string;\n fetch?: typeof globalThis.fetch;\n now?: () => Date;\n /** Refresh before provider expiry. Defaults to 60 seconds. */\n expirySkewMs?: number;\n}\n\n/** Installation and repository boundary requested by a caller. */\nexport interface GitHubInstallationScope {\n installationId: string | number;\n owner: string;\n repo: string;\n}\n\n/** Authorized repository client and explicit token-revocation handle. */\nexport interface GitHubInstallationContext {\n installation: ForgeInstallationRef;\n repository: ForgeRepositoryRef;\n forge: GitHubForgeProvider;\n /** Revokes issued tokens remotely and closes this local context. */\n revoke(): Promise<void>;\n}\n\ninterface CachedToken {\n token: string;\n expiresAt: number;\n generation: number;\n authorizedRepositories: Set<string>;\n}\n\nfunction base64UrlJson(value: unknown): string {\n return Buffer.from(JSON.stringify(value)).toString('base64url');\n}\n\n/**\n * Creates a short-lived GitHub App JWT without mutating process credentials.\n * @param credentials GitHub App ID and RSA private key.\n * @param now Clock value used for issued-at and expiry claims.\n * @returns Signed RS256 GitHub App JWT.\n * @throws {ForgeError} When credentials are missing or the key cannot sign.\n */\nexport function createGitHubAppJwt(\n credentials: GitHubAppCredentials,\n now = new Date(),\n): string {\n if (!credentials.appId || !credentials.privateKey) {\n throw new ForgeError(\n 'GitHub App id and private key are required',\n 'CONFIGURATION_ERROR',\n { provider: 'github' },\n );\n }\n const issuedAt = Math.floor(now.getTime() / 1_000) - 60;\n const header = base64UrlJson({ alg: 'RS256', typ: 'JWT' });\n const payload = base64UrlJson({\n iat: issuedAt,\n exp: issuedAt + 10 * 60,\n iss: String(credentials.appId),\n });\n const unsigned = `${header}.${payload}`;\n try {\n const signer = createSign('RSA-SHA256');\n signer.update(unsigned);\n signer.end();\n return `${unsigned}.${signer.sign(credentials.privateKey, 'base64url')}`;\n } catch (cause) {\n throw new ForgeError(\n 'GitHub App private key could not sign a JWT',\n 'CONFIGURATION_ERROR',\n { cause, provider: 'github' },\n );\n }\n}\n\n/**\n * Request/job-scoped GitHub App authority.\n *\n * Keep this object inside a single request or job. Its token cache and in-flight\n * acquisitions are instance fields, so installations cannot share credentials.\n */\nexport class GitHubAppAuth {\n private readonly credentials: GitHubAppCredentials;\n private readonly baseUrl?: string;\n private readonly fetchImplementation?: typeof globalThis.fetch;\n private readonly now: () => Date;\n private readonly expirySkewMs: number;\n private readonly tokens = new Map<string, CachedToken>();\n private readonly issuedTokens = new Map<string, Map<string, number>>();\n private readonly tokenRequests = new Map<string, Promise<CachedToken>>();\n private readonly authorizationRequests = new Map<string, Promise<void>>();\n private readonly revokedInstallations = new Set<string>();\n private nextTokenGeneration = 1;\n\n /**\n * Creates isolated GitHub App authority from credentials and dependencies.\n * @param options Credentials, clock, provider URL, and fetch override.\n */\n constructor(options: GitHubAppAuthOptions) {\n this.credentials = {\n appId: options.appId,\n privateKey: options.privateKey,\n };\n this.baseUrl = options.baseUrl;\n this.fetchImplementation = options.fetch;\n this.now = options.now ?? (() => new Date());\n this.expirySkewMs = options.expirySkewMs ?? 60_000;\n }\n\n /**\n * Clears locally cached credentials without remote revocation.\n * @param installationId Optional installation to clear; omitted clears all.\n * @returns Nothing.\n */\n clear(installationId?: string | number): void {\n if (installationId === undefined) {\n this.tokens.clear();\n this.issuedTokens.clear();\n this.tokenRequests.clear();\n this.authorizationRequests.clear();\n this.revokedInstallations.clear();\n return;\n }\n const id = String(installationId);\n this.clearCachedInstallation(id);\n this.revokedInstallations.delete(id);\n }\n\n /**\n * Acquires and verifies one installation/repository boundary.\n * @param scope Installation ID and exact repository coordinates.\n * @returns An isolated forge provider and revocation handle.\n * @throws {ForgeError} When authentication, provider access, or scope fails.\n */\n async createInstallationContext(\n scope: GitHubInstallationScope,\n ): Promise<GitHubInstallationContext> {\n const installationId = String(scope.installationId);\n const fullName = `${scope.owner}/${scope.repo}`.toLowerCase();\n await this.getAuthorizedToken(installationId, fullName);\n let active = true;\n let revocationInFlight: Promise<void> | undefined;\n const token = () => {\n if (!active) {\n throw new ForgeError(\n 'GitHub installation context has been revoked',\n 'AUTHENTICATION_FAILED',\n { provider: 'github' },\n );\n }\n return this.getAuthorizedToken(installationId, fullName);\n };\n const forge = new GitHubForgeProvider({\n owner: scope.owner,\n repo: scope.repo,\n transport: new GitHubTransport({\n token,\n baseUrl: this.baseUrl,\n fetch: this.fetchImplementation,\n }),\n });\n return {\n installation: { id: installationId },\n repository: {\n owner: scope.owner,\n name: scope.repo,\n fullName: `${scope.owner}/${scope.repo}`,\n },\n forge,\n revoke: async () => {\n active = false;\n if (!revocationInFlight) {\n revocationInFlight = this.revokeInstallationTokens(\n installationId,\n ).finally(() => {\n revocationInFlight = undefined;\n });\n }\n await revocationInFlight;\n },\n };\n }\n\n private async getAuthorizedToken(\n installationId: string,\n fullName: string,\n ): Promise<string> {\n if (this.revokedInstallations.has(installationId)) {\n throw new ForgeError(\n 'GitHub App installation authority has been revoked',\n 'AUTHENTICATION_FAILED',\n { provider: 'github' },\n );\n }\n const cached = await this.getInstallationToken(installationId);\n if (this.revokedInstallations.has(installationId)) {\n throw new ForgeError(\n 'GitHub App installation authority has been revoked',\n 'AUTHENTICATION_FAILED',\n { provider: 'github' },\n );\n }\n if (cached.authorizedRepositories.has(fullName)) return cached.token;\n\n const key = `${installationId}:${cached.generation}:${fullName}`;\n let pending = this.authorizationRequests.get(key);\n if (!pending) {\n pending = this.verifyRepositoryScope(cached, fullName).finally(() => {\n this.authorizationRequests.delete(key);\n });\n this.authorizationRequests.set(key, pending);\n }\n await pending;\n if (this.revokedInstallations.has(installationId)) {\n throw new ForgeError(\n 'GitHub App installation authority has been revoked',\n 'AUTHENTICATION_FAILED',\n { provider: 'github' },\n );\n }\n return cached.token;\n }\n\n private async getInstallationToken(\n installationId: string,\n ): Promise<CachedToken> {\n const cached = this.tokens.get(installationId);\n if (cached && cached.expiresAt - this.expirySkewMs > this.now().getTime()) {\n return cached;\n }\n\n let pending = this.tokenRequests.get(installationId);\n if (!pending) {\n pending = this.acquireInstallationToken(installationId).finally(() => {\n this.tokenRequests.delete(installationId);\n });\n this.tokenRequests.set(installationId, pending);\n }\n return pending;\n }\n\n private async acquireInstallationToken(\n installationId: string,\n ): Promise<CachedToken> {\n const appTransport = new GitHubTransport({\n token: () => createGitHubAppJwt(this.credentials, this.now()),\n baseUrl: this.baseUrl,\n fetch: this.fetchImplementation,\n });\n const response = await appTransport.request<{\n token?: string;\n expires_at?: string;\n }>({\n method: 'POST',\n path: `/app/installations/${encodeURIComponent(installationId)}/access_tokens`,\n });\n const token = response.data.token;\n const expiresAt = Date.parse(response.data.expires_at ?? '');\n if (!token || !Number.isFinite(expiresAt)) {\n throw new ForgeError(\n 'GitHub returned an invalid installation token',\n 'AUTHENTICATION_FAILED',\n { provider: 'github', requestId: response.metadata.requestId },\n );\n }\n const cached: CachedToken = {\n token,\n expiresAt,\n generation: this.nextTokenGeneration,\n authorizedRepositories: new Set(),\n };\n this.nextTokenGeneration += 1;\n const issued = this.issuedTokens.get(installationId) ?? new Map();\n for (const [issuedToken, issuedExpiry] of issued) {\n if (issuedExpiry <= this.now().getTime()) issued.delete(issuedToken);\n }\n issued.set(token, expiresAt);\n this.issuedTokens.set(installationId, issued);\n if (this.revokedInstallations.has(installationId)) {\n try {\n await this.revokeToken(token);\n issued.delete(token);\n } catch (cause) {\n const providerError = cause instanceof ForgeError ? cause : undefined;\n throw new ForgeError(\n 'A GitHub token acquired during revocation could not be revoked',\n 'PROVIDER_ERROR',\n {\n cause,\n provider: 'github',\n status: providerError?.status,\n requestId: providerError?.requestId,\n rateLimit: providerError?.rateLimit,\n retryable: providerError?.retryable,\n },\n );\n }\n throw new ForgeError(\n 'GitHub App installation authority was revoked during token acquisition',\n 'AUTHENTICATION_FAILED',\n { provider: 'github' },\n );\n }\n this.tokens.set(installationId, cached);\n return cached;\n }\n\n private async verifyRepositoryScope(\n cached: CachedToken,\n fullName: string,\n ): Promise<void> {\n const transport = new GitHubTransport({\n token: cached.token,\n baseUrl: this.baseUrl,\n fetch: this.fetchImplementation,\n });\n const separator = fullName.indexOf('/');\n const owner = fullName.slice(0, separator);\n const repo = fullName.slice(separator + 1);\n try {\n await transport.request({\n method: 'GET',\n path: `/repos/${encodeURIComponent(owner)}/${encodeURIComponent(repo)}`,\n });\n } catch (cause) {\n const providerError = cause instanceof ForgeError ? cause : undefined;\n if (\n providerError?.retryable ||\n providerError?.code === 'AUTHENTICATION_FAILED' ||\n providerError?.code === 'TRANSPORT_ERROR' ||\n (providerError?.status !== 403 && providerError?.status !== 404)\n ) {\n throw cause;\n }\n throw new ForgeError(\n `GitHub App installation is not authorized for ${fullName}`,\n 'AUTHORITY_MISMATCH',\n {\n cause,\n provider: 'github',\n status: providerError?.status,\n requestId: providerError?.requestId,\n rateLimit: providerError?.rateLimit,\n },\n );\n }\n cached.authorizedRepositories.add(fullName);\n }\n\n private async revokeInstallationTokens(\n installationId: string,\n ): Promise<void> {\n this.revokedInstallations.add(installationId);\n const issued = [...(this.issuedTokens.get(installationId)?.keys() ?? [])];\n this.clearCachedInstallation(installationId, false);\n if (issued.length === 0) return;\n\n const retained = this.issuedTokens.get(installationId) ?? new Map();\n const failures: unknown[] = [];\n for (const token of issued) {\n try {\n await this.revokeToken(token);\n retained.delete(token);\n } catch (error) {\n failures.push(error);\n }\n }\n if (retained.size === 0) this.issuedTokens.delete(installationId);\n else this.issuedTokens.set(installationId, retained);\n if (failures.length > 0) {\n const failure = failures[0];\n const providerError = failure instanceof ForgeError ? failure : undefined;\n throw new ForgeError(\n 'One or more GitHub installation tokens could not be revoked',\n 'PROVIDER_ERROR',\n {\n cause: failure,\n provider: 'github',\n status: providerError?.status,\n requestId: providerError?.requestId,\n rateLimit: providerError?.rateLimit,\n retryable: providerError?.retryable,\n },\n );\n }\n }\n\n private async revokeToken(token: string): Promise<void> {\n const transport = new GitHubTransport({\n token,\n baseUrl: this.baseUrl,\n fetch: this.fetchImplementation,\n });\n await transport.request<void>({\n method: 'DELETE',\n path: '/installation/token',\n });\n }\n\n private clearCachedInstallation(\n installationId: string,\n clearIssued = true,\n ): void {\n this.tokens.delete(installationId);\n if (clearIssued) this.issuedTokens.delete(installationId);\n this.tokenRequests.delete(installationId);\n for (const key of this.authorizationRequests.keys()) {\n if (key.startsWith(`${installationId}:`)) {\n this.authorizationRequests.delete(key);\n }\n }\n }\n}\n","import { createHmac } from 'node:crypto';\nimport type { GitHubWebhookHeaders } from './webhooks.js';\n\n/** Exact webhook bytes and headers suitable for deterministic tests. */\nexport interface GitHubWebhookFixture {\n rawBody: Uint8Array;\n headers: GitHubWebhookHeaders;\n}\n\n/**\n * Produces exact, repeatable webhook bytes and headers for integration suites.\n * Pass the same delivery id for duplicates, or a new id with the same payload\n * for a provider redelivery.\n * @param options Secret, delivery identity, event name, and payload.\n * @returns Exact bytes and matching GitHub delivery headers.\n */\nexport function createGitHubWebhookFixture(options: {\n secret: string;\n deliveryId: string;\n event: string;\n payload: unknown;\n}): GitHubWebhookFixture {\n const rawBody = new TextEncoder().encode(JSON.stringify(options.payload));\n const signature = createHmac('sha256', options.secret)\n .update(rawBody)\n .digest('hex');\n return {\n rawBody,\n headers: {\n 'x-github-delivery': options.deliveryId,\n 'x-github-event': options.event,\n 'x-hub-signature-256': `sha256=${signature}`,\n },\n };\n}\n","/**\n * GitHub REST API client\n */\n\nimport { RepositoryError } from '../errors.js';\n\nexport interface GitHubRestConfig {\n token: string;\n baseUrl?: string;\n}\n\n/**\n * GitHub REST API client\n */\nexport class GitHubRest {\n private token: string;\n private baseUrl: string;\n\n constructor(config: GitHubRestConfig) {\n this.token = config.token;\n this.baseUrl = config.baseUrl || 'https://api.github.com';\n }\n\n /**\n * Make a REST API request\n */\n async request(\n method: string,\n path: string,\n body?: unknown,\n ): Promise<unknown> {\n const url = `${this.baseUrl}${path}`;\n const headers = {\n Authorization: `Bearer ${this.token}`,\n Accept: 'application/vnd.github+json',\n 'X-GitHub-Api-Version': '2022-11-28',\n 'Content-Type': 'application/json',\n };\n\n const response = await fetch(url, {\n method,\n headers,\n body: body ? JSON.stringify(body) : undefined,\n });\n\n if (!response.ok) {\n const error = await response.text();\n throw RepositoryError.fromHTTPStatus(\n response.status,\n `GitHub API error: ${response.statusText}\\n${error}`,\n error,\n );\n }\n\n return response.json();\n }\n\n /**\n * GET request\n */\n async get(path: string): Promise<unknown> {\n return this.request('GET', path);\n }\n\n /**\n * POST request\n */\n async post(path: string, body: unknown): Promise<unknown> {\n return this.request('POST', path, body);\n }\n\n /**\n * PATCH request\n */\n async patch(path: string, body: unknown): Promise<unknown> {\n return this.request('PATCH', path, body);\n }\n\n /**\n * PUT request\n */\n async put(path: string, body?: unknown): Promise<unknown> {\n return this.request('PUT', path, body);\n }\n\n /**\n * DELETE request\n */\n async delete(path: string): Promise<void> {\n await this.request('DELETE', path);\n }\n}\n","/**\n * GitHub repository implementation\n */\n\nimport { GraphQLClient, type IGraphQLClient } from '@happyvertical/graphql';\nimport type {\n CheckRun,\n CommitStatus,\n CreateCheckRunInput,\n CreateCommitStatusInput,\n UpdateCheckRunInput,\n} from '../forge/types.js';\nimport type {\n Branch,\n Comment,\n CreateFromTemplateOptions,\n CreateIssueInput,\n CreatePRInput,\n IRepository,\n Issue,\n Label,\n MergeMethod,\n PullRequest,\n Repository,\n RepositoryConfig,\n SearchFilters,\n UpdateIssueInput,\n} from '../types.js';\nimport { GitHubRest } from './rest.js';\n\n/**\n * GitHub repository implementation\n */\nexport class GitHubRepository implements IRepository {\n private rest: GitHubRest;\n private graphql: IGraphQLClient;\n private owner: string;\n private repo: string;\n\n constructor(config: RepositoryConfig) {\n if (config.type !== 'github') {\n throw new Error('Invalid config type for GitHubRepository');\n }\n\n this.owner = config.owner;\n this.repo = config.repo;\n this.rest = new GitHubRest({\n token: config.token,\n baseUrl: config.baseUrl,\n });\n this.graphql = new GraphQLClient({\n endpoint: config.baseUrl\n ? `${config.baseUrl}/graphql`\n : 'https://api.github.com/graphql',\n token: config.token,\n });\n }\n\n // Repository Info\n async getRepository(): Promise<Repository> {\n const data = (await this.rest.get(`/repos/${this.owner}/${this.repo}`)) as {\n name: string;\n owner: { login: string };\n description: string;\n default_branch: string;\n html_url: string;\n private: boolean;\n };\n\n return {\n owner: data.owner.login,\n name: data.name,\n description: data.description,\n defaultBranch: data.default_branch,\n url: data.html_url,\n isPrivate: data.private,\n };\n }\n\n // Issues\n async getIssue(number: number): Promise<Issue> {\n const data = (await this.rest.get(\n `/repos/${this.owner}/${this.repo}/issues/${number}`,\n )) as {\n number: number;\n node_id: string;\n title: string;\n body: string | null;\n state: string;\n labels: Array<{ name: string; color: string; description: string }>;\n assignees: Array<{ login: string; id: number; type: string }>;\n user: { login: string; id: number; type: string };\n created_at: string;\n updated_at: string;\n closed_at: string | null;\n html_url: string;\n comments: number;\n };\n\n return {\n number: data.number,\n id: data.node_id,\n title: data.title,\n body: data.body || '',\n state: data.state === 'open' ? 'open' : 'closed',\n labels: data.labels.map((l) => ({\n name: l.name,\n color: l.color,\n description: l.description,\n })),\n assignees: data.assignees.map((a) => ({\n login: a.login,\n id: String(a.id),\n type: a.type === 'Bot' ? 'Bot' : 'User',\n })),\n author: {\n login: data.user.login,\n id: String(data.user.id),\n type: data.user.type === 'Bot' ? 'Bot' : 'User',\n },\n createdAt: new Date(data.created_at),\n updatedAt: new Date(data.updated_at),\n closedAt: data.closed_at ? new Date(data.closed_at) : undefined,\n url: data.html_url,\n commentsCount: data.comments,\n };\n }\n\n async createIssue(data: CreateIssueInput): Promise<Issue> {\n const result = (await this.rest.post(\n `/repos/${this.owner}/${this.repo}/issues`,\n data,\n )) as ReturnType<typeof this.getIssue> extends Promise<infer T> ? T : never;\n return this.getIssue(result.number);\n }\n\n async updateIssue(number: number, data: UpdateIssueInput): Promise<Issue> {\n await this.rest.patch(\n `/repos/${this.owner}/${this.repo}/issues/${number}`,\n data,\n );\n return this.getIssue(number);\n }\n\n async closeIssue(number: number): Promise<void> {\n await this.updateIssue(number, { state: 'closed' });\n }\n\n // Labels\n async addLabels(issueNumber: number, labels: string[]): Promise<void> {\n await this.rest.post(\n `/repos/${this.owner}/${this.repo}/issues/${issueNumber}/labels`,\n { labels },\n );\n }\n\n async removeLabel(issueNumber: number, label: string): Promise<void> {\n const encodedLabel = encodeURIComponent(label);\n await this.rest.delete(\n `/repos/${this.owner}/${this.repo}/issues/${issueNumber}/labels/${encodedLabel}`,\n );\n }\n\n async createLabel(label: Label): Promise<void> {\n await this.rest.post(`/repos/${this.owner}/${this.repo}/labels`, label);\n }\n\n async updateLabel(name: string, label: Label): Promise<void> {\n await this.rest.patch(\n `/repos/${this.owner}/${this.repo}/labels/${encodeURIComponent(name)}`,\n label,\n );\n }\n\n async listLabels(): Promise<Label[]> {\n const data = (await this.rest.get(\n `/repos/${this.owner}/${this.repo}/labels`,\n )) as Array<{ name: string; color: string; description: string }>;\n\n return data.map((l) => ({\n name: l.name,\n color: l.color,\n description: l.description,\n }));\n }\n\n // Comments\n async addComment(issueNumber: number, body: string): Promise<Comment> {\n const data = (await this.rest.post(\n `/repos/${this.owner}/${this.repo}/issues/${issueNumber}/comments`,\n { body },\n )) as {\n id: number;\n body: string;\n user: { login: string; id: number; type: string };\n created_at: string;\n updated_at: string;\n html_url: string;\n };\n\n return {\n id: String(data.id),\n body: data.body,\n author: {\n login: data.user.login,\n id: String(data.user.id),\n type: data.user.type === 'Bot' ? 'Bot' : 'User',\n },\n createdAt: new Date(data.created_at),\n updatedAt: new Date(data.updated_at),\n url: data.html_url,\n };\n }\n\n async updateComment(commentId: string, body: string): Promise<Comment> {\n const data = (await this.rest.patch(\n `/repos/${this.owner}/${this.repo}/issues/comments/${commentId}`,\n { body },\n )) as ReturnType<typeof this.addComment> extends Promise<infer T>\n ? T\n : never;\n return data as Comment;\n }\n\n async deleteComment(commentId: string): Promise<void> {\n await this.rest.delete(\n `/repos/${this.owner}/${this.repo}/issues/comments/${commentId}`,\n );\n }\n\n async listComments(issueNumber: number): Promise<Comment[]> {\n const data = (await this.rest.get(\n `/repos/${this.owner}/${this.repo}/issues/${issueNumber}/comments`,\n )) as Array<{\n id: number;\n body: string;\n user: { login: string; id: number; type: string };\n created_at: string;\n updated_at: string;\n html_url: string;\n }>;\n\n return data.map((c) => ({\n id: String(c.id),\n body: c.body,\n author: {\n login: c.user.login,\n id: String(c.user.id),\n type: c.user.type === 'Bot' ? 'Bot' : 'User',\n },\n createdAt: new Date(c.created_at),\n updatedAt: new Date(c.updated_at),\n url: c.html_url,\n }));\n }\n\n // Assignments\n async assignIssue(issueNumber: number, assignees: string[]): Promise<void> {\n await this.rest.post(\n `/repos/${this.owner}/${this.repo}/issues/${issueNumber}/assignees`,\n { assignees },\n );\n }\n\n async unassignIssue(issueNumber: number, assignees: string[]): Promise<void> {\n await this.rest.delete(\n `/repos/${this.owner}/${this.repo}/issues/${issueNumber}/assignees`,\n );\n }\n\n // Pull Requests\n async getPullRequest(number: number): Promise<PullRequest> {\n const issue = await this.getIssue(number);\n const data = (await this.rest.get(\n `/repos/${this.owner}/${this.repo}/pulls/${number}`,\n )) as {\n head: { ref: string };\n base: { ref: string };\n merged: boolean;\n merged_at: string | null;\n mergeable: boolean;\n draft: boolean;\n };\n\n return {\n ...issue,\n headRef: data.head.ref,\n baseRef: data.base.ref,\n merged: data.merged,\n mergedAt: data.merged_at ? new Date(data.merged_at) : undefined,\n mergeable: data.mergeable,\n draft: data.draft,\n };\n }\n\n async createPullRequest(data: CreatePRInput): Promise<PullRequest> {\n const result = (await this.rest.post(\n `/repos/${this.owner}/${this.repo}/pulls`,\n {\n title: data.title,\n body: data.body,\n head: data.headRef,\n base: data.baseRef,\n draft: data.draft,\n },\n )) as { number: number };\n return this.getPullRequest(result.number);\n }\n\n async mergePullRequest(number: number, method?: MergeMethod): Promise<void> {\n await this.rest.put(\n `/repos/${this.owner}/${this.repo}/pulls/${number}/merge`,\n {\n merge_method: method || 'merge',\n },\n );\n }\n\n // Search\n async searchIssues(query: string, filters?: SearchFilters): Promise<Issue[]> {\n let searchQuery = `${query} repo:${this.owner}/${this.repo}`;\n\n if (filters?.state) {\n searchQuery += ` state:${filters.state}`;\n }\n if (filters?.labels) {\n searchQuery += ` ${filters.labels.map((l) => `label:\"${l}\"`).join(' ')}`;\n }\n if (filters?.author) {\n searchQuery += ` author:${filters.author}`;\n }\n if (filters?.assignee) {\n searchQuery += ` assignee:${filters.assignee}`;\n }\n\n const params = new URLSearchParams({\n q: searchQuery,\n sort: filters?.sort || 'created',\n order: filters?.order || 'desc',\n per_page: String(filters?.limit || 30),\n });\n\n const data = (await this.rest.get(`/search/issues?${params}`)) as {\n items: Array<{\n number: number;\n }>;\n };\n\n return Promise.all(data.items.map((item) => this.getIssue(item.number)));\n }\n\n // Node ID resolution\n async getIssueNodeId(issueNumber: number): Promise<string> {\n const issue = await this.getIssue(issueNumber);\n return issue.id;\n }\n\n async getPRNodeId(prNumber: number): Promise<string> {\n const pr = await this.getPullRequest(prNumber);\n return pr.id;\n }\n\n // Branch Management\n async createBranch(name: string, fromRef: string): Promise<Branch> {\n // First get the SHA for the reference\n const refData = (await this.rest.get(\n `/repos/${this.owner}/${this.repo}/git/ref/heads/${fromRef}`,\n )) as { object: { sha: string } };\n\n // Create the new branch\n await this.rest.post(`/repos/${this.owner}/${this.repo}/git/refs`, {\n ref: `refs/heads/${name}`,\n sha: refData.object.sha,\n });\n\n return {\n name,\n sha: refData.object.sha,\n protected: false,\n };\n }\n\n async deleteBranch(name: string): Promise<void> {\n await this.rest.delete(\n `/repos/${this.owner}/${this.repo}/git/refs/heads/${name}`,\n );\n }\n\n async getBranch(name: string): Promise<Branch | null> {\n try {\n const data = (await this.rest.get(\n `/repos/${this.owner}/${this.repo}/branches/${encodeURIComponent(name)}`,\n )) as {\n name: string;\n commit: { sha: string };\n protected: boolean;\n };\n\n return {\n name: data.name,\n sha: data.commit.sha,\n protected: data.protected,\n };\n } catch (error) {\n // Return null if branch not found (404)\n if (\n error instanceof Error &&\n 'code' in error &&\n (error as { code: string }).code === 'NOT_FOUND'\n ) {\n return null;\n }\n throw error;\n }\n }\n\n // PR Draft/Review\n async markPRReady(prNumber: number): Promise<void> {\n const pr = await this.getPullRequest(prNumber);\n const mutation = `\n mutation($pullRequestId: ID!) {\n markPullRequestReadyForReview(input: {\n pullRequestId: $pullRequestId\n }) {\n pullRequest {\n id\n }\n }\n }\n `;\n await this.graphql.mutate(mutation, { pullRequestId: pr.id });\n }\n\n async convertPRToDraft(prNumber: number): Promise<void> {\n const pr = await this.getPullRequest(prNumber);\n const mutation = `\n mutation($pullRequestId: ID!) {\n convertPullRequestToDraft(input: {\n pullRequestId: $pullRequestId\n }) {\n pullRequest {\n id\n }\n }\n }\n `;\n await this.graphql.mutate(mutation, { pullRequestId: pr.id });\n }\n\n async requestReview(prNumber: number, reviewers: string[]): Promise<void> {\n await this.rest.post(\n `/repos/${this.owner}/${this.repo}/pulls/${prNumber}/requested_reviewers`,\n { reviewers },\n );\n }\n\n // Workflow\n async triggerWorkflow(\n workflowId: string,\n ref: string,\n inputs?: Record<string, string>,\n ): Promise<void> {\n await this.rest.post(\n `/repos/${this.owner}/${this.repo}/actions/workflows/${workflowId}/dispatches`,\n { ref, inputs: inputs || {} },\n );\n }\n\n // Linking\n async findPRsForIssue(issueNumber: number): Promise<PullRequest[]> {\n // Search for PRs that reference this issue with closing keywords\n const keywords = ['closes', 'fixes', 'resolves'];\n const searchTerms = keywords\n .map((k) => `${k} #${issueNumber}`)\n .join(' OR ');\n const query = `is:pr repo:${this.owner}/${this.repo} ${searchTerms}`;\n\n const data = (await this.rest.get(\n `/search/issues?q=${encodeURIComponent(query)}`,\n )) as {\n items: Array<{ number: number }>;\n };\n\n return Promise.all(\n data.items.map((item) => this.getPullRequest(item.number)),\n );\n }\n\n async findIssueForPR(prNumber: number): Promise<Issue | null> {\n const pr = await this.getPullRequest(prNumber);\n\n // Look for closing keywords in PR body\n const closingPattern = /(?:closes?|fixes?|resolves?)\\s+#(\\d+)/gi;\n const matches = [...pr.body.matchAll(closingPattern)];\n\n if (matches.length === 0) {\n return null;\n }\n\n // Return the first linked issue\n const issueNumber = Number.parseInt(matches[0][1], 10);\n try {\n return await this.getIssue(issueNumber);\n } catch {\n return null;\n }\n }\n\n // File Content\n async getFileContent(path: string, ref?: string): Promise<string | null> {\n try {\n const url = `/repos/${this.owner}/${this.repo}/contents/${path}${ref ? `?ref=${ref}` : ''}`;\n const data = (await this.rest.get(url)) as {\n type: string;\n content?: string;\n encoding?: string;\n };\n\n if (data.type !== 'file' || !data.content) {\n return null;\n }\n\n // GitHub returns base64-encoded content\n if (data.encoding === 'base64') {\n return Buffer.from(data.content, 'base64').toString('utf-8');\n }\n\n return data.content;\n } catch {\n // 404 means file doesn't exist\n return null;\n }\n }\n\n async listDirectoryFiles(path: string, ref?: string): Promise<string[]> {\n try {\n const url = `/repos/${this.owner}/${this.repo}/contents/${path}${ref ? `?ref=${ref}` : ''}`;\n const data = (await this.rest.get(url)) as Array<{\n name: string;\n type: string;\n }>;\n\n if (!Array.isArray(data)) {\n return [];\n }\n\n return data\n .filter((item) => item.type === 'file')\n .map((item) => item.name);\n } catch {\n // 404 means directory doesn't exist\n return [];\n }\n }\n\n /**\n * Publishes one GitHub commit status.\n * @param input Exact commit SHA and status attributes.\n * @returns Normalized published status.\n */\n async createCommitStatus(\n input: CreateCommitStatusInput,\n ): Promise<CommitStatus> {\n const data = (await this.rest.post(\n `/repos/${this.owner}/${this.repo}/statuses/${encodeURIComponent(input.sha)}`,\n {\n state: input.state,\n context: input.context,\n description: input.description,\n target_url: input.targetUrl,\n },\n )) as Record<string, unknown>;\n return this.mapCommitStatus(data);\n }\n\n /**\n * Returns complete commit-status history across GitHub pages.\n * @param sha Exact commit SHA.\n * @returns Every normalized status for the commit.\n */\n async listCommitStatuses(sha: string): Promise<readonly CommitStatus[]> {\n const statuses: CommitStatus[] = [];\n let page = 1;\n while (true) {\n const data = (await this.rest.get(\n `/repos/${this.owner}/${this.repo}/commits/${encodeURIComponent(sha)}/statuses?per_page=100&page=${page}`,\n )) as Record<string, unknown>[];\n statuses.push(...data.map((status) => this.mapCommitStatus(status)));\n if (data.length < 100) return statuses;\n page += 1;\n }\n }\n\n /**\n * Publishes one GitHub check run.\n * @param input Check identity, exact head SHA, state, and output.\n * @returns Normalized published check run.\n */\n async createCheckRun(input: CreateCheckRunInput): Promise<CheckRun> {\n const data = (await this.rest.post(\n `/repos/${this.owner}/${this.repo}/check-runs`,\n this.mapCheckRunInput(input),\n )) as Record<string, unknown>;\n return this.mapCheckRun(data);\n }\n\n /**\n * Changes one GitHub check run.\n * @param id GitHub check-run ID.\n * @param input Attributes to change.\n * @returns Normalized updated check run.\n */\n async updateCheckRun(\n id: string,\n input: UpdateCheckRunInput,\n ): Promise<CheckRun> {\n const data = (await this.rest.patch(\n `/repos/${this.owner}/${this.repo}/check-runs/${encodeURIComponent(id)}`,\n this.mapCheckRunInput(input),\n )) as Record<string, unknown>;\n return this.mapCheckRun(data);\n }\n\n /**\n * Returns complete GitHub check history, including reruns.\n * @param sha Exact commit SHA.\n * @returns Every normalized check run for the commit.\n */\n async listCheckRuns(sha: string): Promise<readonly CheckRun[]> {\n const checkRuns: CheckRun[] = [];\n let page = 1;\n let totalCount: number | undefined;\n while (true) {\n const data = (await this.rest.get(\n `/repos/${this.owner}/${this.repo}/commits/${encodeURIComponent(sha)}/check-runs?filter=all&per_page=100&page=${page}`,\n )) as {\n check_runs?: Record<string, unknown>[];\n total_count?: number;\n };\n const pageRuns = data.check_runs ?? [];\n totalCount ??= data.total_count;\n checkRuns.push(...pageRuns.map((checkRun) => this.mapCheckRun(checkRun)));\n if (\n pageRuns.length < 100 ||\n (totalCount !== undefined && checkRuns.length >= totalCount)\n ) {\n return checkRuns;\n }\n page += 1;\n }\n }\n\n private mapCommitStatus(data: Record<string, unknown>): CommitStatus {\n return {\n id: String(data.id ?? data.node_id ?? ''),\n sha: String(data.sha ?? ''),\n state: String(data.state ?? ''),\n context: String(data.context ?? ''),\n description:\n typeof data.description === 'string' ? data.description : undefined,\n targetUrl:\n typeof data.target_url === 'string' ? data.target_url : undefined,\n createdAt:\n typeof data.created_at === 'string'\n ? new Date(data.created_at)\n : undefined,\n raw: data,\n };\n }\n\n private mapCheckRunInput(\n input: CreateCheckRunInput | UpdateCheckRunInput,\n ): Record<string, unknown> {\n return {\n ...('name' in input ? { name: input.name } : {}),\n ...('headSha' in input ? { head_sha: input.headSha } : {}),\n status: input.status,\n conclusion: input.conclusion,\n details_url: input.detailsUrl,\n external_id: input.externalId,\n started_at:\n input.startedAt instanceof Date\n ? input.startedAt.toISOString()\n : input.startedAt,\n completed_at:\n input.completedAt instanceof Date\n ? input.completedAt.toISOString()\n : input.completedAt,\n output: input.output,\n };\n }\n\n private mapCheckRun(data: Record<string, unknown>): CheckRun {\n return {\n id: String(data.id ?? data.node_id ?? ''),\n name: String(data.name ?? ''),\n headSha: String(data.head_sha ?? ''),\n status: (data.status ?? 'queued') as CheckRun['status'],\n conclusion:\n typeof data.conclusion === 'string'\n ? (data.conclusion as CheckRun['conclusion'])\n : undefined,\n detailsUrl:\n typeof data.details_url === 'string' ? data.details_url : undefined,\n externalId:\n typeof data.external_id === 'string' ? data.external_id : undefined,\n startedAt:\n typeof data.started_at === 'string'\n ? new Date(data.started_at)\n : undefined,\n completedAt:\n typeof data.completed_at === 'string'\n ? new Date(data.completed_at)\n : undefined,\n raw: data,\n };\n }\n\n // Repository Creation from Template\n\n /**\n * Create a new repository from this repository as a template.\n *\n * Uses the GitHub \"Generate\" API: POST /repos/{template_owner}/{template_repo}/generate\n * The current repository (this.owner/this.repo) is used as the template.\n */\n async createRepositoryFromTemplate(\n options: CreateFromTemplateOptions,\n ): Promise<Repository> {\n const data = (await this.rest.post(\n `/repos/${this.owner}/${this.repo}/generate`,\n {\n owner: options.owner,\n name: options.name,\n description: options.description || '',\n private: options.isPrivate ?? true,\n include_all_branches: options.includeAllBranches ?? false,\n },\n )) as {\n name: string;\n owner: { login: string };\n description: string;\n default_branch: string;\n html_url: string;\n private: boolean;\n };\n\n return {\n owner: data.owner.login,\n name: data.name,\n description: data.description || '',\n defaultBranch: data.default_branch,\n url: data.html_url,\n isPrivate: data.private,\n };\n }\n}\n","import { createHmac, timingSafeEqual } from 'node:crypto';\nimport { ForgeError, ForgeSignatureError } from '../forge/errors.js';\nimport type {\n CheckRun,\n ForgeActor,\n ForgeEventEnvelope,\n ForgeInstallationRef,\n ForgeObservation,\n ForgePullRequestRef,\n ForgeRepositoryRef,\n} from '../forge/types.js';\n\nexport type GitHubWebhookHeaders =\n | Headers\n | Readonly<Record<string, string | readonly string[] | undefined>>;\n\n/** Construction options for raw GitHub webhook verification. */\nexport interface GitHubWebhookVerifierOptions {\n /** Current secret first, followed by still-valid rotation secrets. */\n secrets: string | readonly string[];\n now?: () => Date;\n}\n\nfunction headerValue(\n headers: GitHubWebhookHeaders,\n requestedName: string,\n): string | undefined {\n if (headers instanceof Headers) {\n return headers.get(requestedName) ?? undefined;\n }\n const requested = requestedName.toLowerCase();\n for (const [name, value] of Object.entries(headers)) {\n if (name.toLowerCase() !== requested) continue;\n return typeof value === 'string' ? value : value?.[0];\n }\n return undefined;\n}\n\nfunction object(value: unknown): Record<string, unknown> {\n return typeof value === 'object' && value !== null\n ? (value as Record<string, unknown>)\n : {};\n}\n\nfunction optionalString(value: unknown): string | undefined {\n return typeof value === 'string' && value !== '' ? value : undefined;\n}\n\nfunction actor(value: unknown): ForgeActor | undefined {\n const data = object(value);\n const login = optionalString(data.login);\n if (!login) return undefined;\n return {\n id: data.id === undefined ? undefined : String(data.id),\n login,\n type: optionalString(data.type),\n };\n}\n\nfunction repository(value: unknown): ForgeRepositoryRef | undefined {\n const data = object(value);\n const ownerData = object(data.owner);\n const fullName = optionalString(data.full_name);\n const name = optionalString(data.name);\n const owner = optionalString(ownerData.login);\n if (!name || (!owner && !fullName)) return undefined;\n const resolvedOwner = owner ?? fullName?.split('/')[0] ?? '';\n return {\n id: data.node_id === undefined ? undefined : String(data.node_id),\n owner: resolvedOwner,\n name,\n fullName: fullName ?? `${resolvedOwner}/${name}`,\n defaultBranch: optionalString(data.default_branch),\n private: typeof data.private === 'boolean' ? data.private : undefined,\n url: optionalString(data.html_url),\n };\n}\n\nfunction installation(value: unknown): ForgeInstallationRef | undefined {\n const data = object(value);\n if (data.id === undefined) return undefined;\n const accountData = object(data.account);\n return {\n id: String(data.id),\n account: optionalString(accountData.login),\n repositorySelection:\n data.repository_selection === 'all' ||\n data.repository_selection === 'selected'\n ? data.repository_selection\n : undefined,\n };\n}\n\nfunction pullRequest(value: unknown): ForgePullRequestRef {\n const data = object(value);\n const head = object(data.head);\n const base = object(data.base);\n return {\n id: data.node_id === undefined ? undefined : String(data.node_id),\n number: Number(data.number),\n state: data.state === 'closed' ? 'closed' : 'open',\n draft: typeof data.draft === 'boolean' ? data.draft : undefined,\n headSha: String(head.sha ?? ''),\n headRef: optionalString(head.ref),\n baseSha: optionalString(base.sha),\n baseRef: optionalString(base.ref),\n merged: typeof data.merged === 'boolean' ? data.merged : undefined,\n mergeCommitSha: optionalString(data.merge_commit_sha),\n url: optionalString(data.html_url),\n };\n}\n\nfunction check(value: unknown): CheckRun {\n const data = object(value);\n const app = object(data.app);\n return {\n id: String(data.id ?? data.node_id ?? ''),\n name: String(data.name ?? app.name ?? 'check_suite'),\n headSha: String(data.head_sha ?? ''),\n status: (data.status ?? 'queued') as CheckRun['status'],\n conclusion:\n typeof data.conclusion === 'string'\n ? (data.conclusion as CheckRun['conclusion'])\n : undefined,\n detailsUrl: optionalString(data.details_url),\n externalId: optionalString(data.external_id),\n startedAt: optionalString(data.started_at)\n ? new Date(String(data.started_at))\n : undefined,\n completedAt: optionalString(data.completed_at)\n ? new Date(String(data.completed_at))\n : undefined,\n raw: data,\n };\n}\n\nfunction occurrence(payload: Record<string, unknown>): Date | undefined {\n const candidates = [\n object(payload.review).submitted_at,\n object(payload.check_run).completed_at,\n object(payload.check_run).started_at,\n payload.created_at,\n object(payload.status).created_at,\n object(payload.deployment_status).created_at,\n object(payload.deployment).created_at,\n object(payload.pull_request).updated_at,\n object(payload.head_commit).timestamp,\n ];\n for (const candidate of candidates) {\n if (typeof candidate !== 'string') continue;\n const timestamp = new Date(candidate);\n if (!Number.isNaN(timestamp.getTime())) return timestamp;\n }\n return undefined;\n}\n\nfunction normalizeObservation(\n event: string,\n payload: Record<string, unknown>,\n action?: string,\n): ForgeObservation {\n if (event === 'ping') {\n return {\n kind: 'availability',\n available: true,\n message: optionalString(payload.zen),\n };\n }\n if (event === 'installation' || event === 'installation_repositories') {\n const installationRef = installation(payload.installation);\n if (!installationRef) return { kind: 'unknown' };\n const repositories = [\n ...(Array.isArray(payload.repositories) ? payload.repositories : []),\n ...(Array.isArray(payload.repositories_added)\n ? payload.repositories_added\n : []),\n ...(Array.isArray(payload.repositories_removed)\n ? payload.repositories_removed\n : []),\n ]\n .map(repository)\n .filter((item): item is ForgeRepositoryRef => item !== undefined);\n return {\n kind: 'installation',\n installation: installationRef,\n repositories,\n };\n }\n if (event === 'repository') {\n const repositoryRef = repository(payload.repository);\n return repositoryRef\n ? { kind: 'repository', repository: repositoryRef }\n : { kind: 'unknown' };\n }\n if (event === 'pull_request') {\n const pullRequestRef = pullRequest(payload.pull_request);\n return action === 'closed' && pullRequestRef.merged\n ? {\n kind: 'merge',\n pullRequest: pullRequestRef,\n mergeCommitSha: pullRequestRef.mergeCommitSha,\n }\n : { kind: 'pull_request', pullRequest: pullRequestRef };\n }\n if (event === 'pull_request_review') {\n const review = object(payload.review);\n return {\n kind: 'review',\n pullRequest: pullRequest(payload.pull_request),\n review: {\n id: String(review.id ?? review.node_id ?? ''),\n state: String(review.state ?? ''),\n body: optionalString(review.body),\n commitSha: optionalString(review.commit_id),\n submittedAt: optionalString(review.submitted_at)\n ? new Date(String(review.submitted_at))\n : undefined,\n author: actor(review.user),\n },\n };\n }\n if (event === 'push') {\n return {\n kind: 'push',\n ref: String(payload.ref ?? ''),\n beforeSha: optionalString(payload.before),\n afterSha: String(payload.after ?? ''),\n forced: typeof payload.forced === 'boolean' ? payload.forced : undefined,\n created:\n typeof payload.created === 'boolean' ? payload.created : undefined,\n deleted:\n typeof payload.deleted === 'boolean' ? payload.deleted : undefined,\n };\n }\n if (event === 'status') {\n return {\n kind: 'status',\n status: {\n id: String(payload.id ?? ''),\n sha: String(payload.sha ?? ''),\n state: String(payload.state ?? ''),\n context: String(payload.context ?? ''),\n description: optionalString(payload.description),\n targetUrl: optionalString(payload.target_url),\n createdAt: optionalString(payload.created_at)\n ? new Date(String(payload.created_at))\n : undefined,\n raw: payload,\n },\n };\n }\n if (event === 'check_run' || event === 'check_suite') {\n return {\n kind: 'check',\n check: check(payload.check_run ?? payload.check_suite),\n };\n }\n if (event === 'merge_group') {\n const mergeGroup = object(payload.merge_group);\n return {\n kind: 'merge_group',\n headSha: String(mergeGroup.head_sha ?? ''),\n headRef: optionalString(mergeGroup.head_ref),\n baseSha: optionalString(mergeGroup.base_sha),\n baseRef: optionalString(mergeGroup.base_ref),\n };\n }\n if (event === 'deployment' || event === 'deployment_status') {\n const deployment = object(payload.deployment);\n const deploymentStatus = object(payload.deployment_status);\n return {\n kind: 'deployment',\n deployment: {\n id: String(deployment.id ?? ''),\n sha: optionalString(deployment.sha),\n ref: optionalString(deployment.ref),\n environment:\n optionalString(deploymentStatus.environment) ??\n optionalString(deployment.environment),\n state: optionalString(deploymentStatus.state),\n url:\n optionalString(deploymentStatus.environment_url) ??\n optionalString(deploymentStatus.target_url),\n },\n };\n }\n return { kind: 'unknown' };\n}\n\n/**\n * Normalizes one already-verified GitHub payload.\n * @param deliveryId Stable provider delivery identity.\n * @param event GitHub event header value.\n * @param raw Parsed provider payload.\n * @param receivedAt Local receipt timestamp.\n * @returns A provider-neutral event envelope preserving the parsed payload.\n */\nexport function normalizeGitHubWebhook(\n deliveryId: string,\n event: string,\n raw: unknown,\n receivedAt = new Date(),\n): ForgeEventEnvelope {\n const payload = object(raw);\n const action = optionalString(payload.action);\n return {\n provider: 'github',\n deliveryId,\n event,\n action,\n occurredAt: occurrence(payload),\n receivedAt,\n installation: installation(payload.installation),\n repository: repository(payload.repository),\n actor: actor(payload.sender),\n observation: normalizeObservation(event, payload, action),\n raw,\n };\n}\n\nexport class GitHubWebhookVerifier {\n private readonly secrets: readonly string[];\n private readonly now: () => Date;\n\n /**\n * Creates a verifier with a current secret and optional rotation secrets.\n * @param options Current/rotation secrets and optional clock.\n * @throws {ForgeError} When no non-empty secret is configured.\n */\n constructor(options: GitHubWebhookVerifierOptions) {\n this.secrets =\n typeof options.secrets === 'string'\n ? [options.secrets]\n : [...options.secrets];\n if (this.secrets.length === 0 || this.secrets.some((secret) => !secret)) {\n throw new ForgeError(\n 'At least one non-empty GitHub webhook secret is required',\n 'CONFIGURATION_ERROR',\n { provider: 'github' },\n );\n }\n this.now = options.now ?? (() => new Date());\n }\n\n /**\n * Verifies unchanged provider bytes with constant-time comparisons.\n * @param rawBody Exact bytes received from the HTTP server.\n * @param signature GitHub SHA-256 signature header.\n * @returns Index of the configured secret that matched.\n * @throws {ForgeSignatureError} When the signature is missing or invalid.\n */\n verify(rawBody: Uint8Array, signature: string | undefined): number {\n if (!signature?.startsWith('sha256=')) throw new ForgeSignatureError();\n const suppliedHex = signature.slice('sha256='.length);\n if (!/^[a-fA-F0-9]{64}$/.test(suppliedHex)) {\n throw new ForgeSignatureError();\n }\n const supplied = Buffer.from(suppliedHex, 'hex');\n let matchedIndex = -1;\n this.secrets.forEach((secret, index) => {\n const expected = createHmac('sha256', secret).update(rawBody).digest();\n if (timingSafeEqual(expected, supplied)) matchedIndex = index;\n });\n if (matchedIndex === -1) throw new ForgeSignatureError();\n return matchedIndex;\n }\n\n /**\n * Verifies raw bytes before decoding and normalizes the delivery.\n * @param rawBody Exact bytes received from the HTTP server.\n * @param headers Case-insensitive GitHub delivery headers.\n * @returns Verified normalized delivery.\n * @throws {ForgeError} For invalid signatures, headers, UTF-8, or JSON.\n */\n verifyAndNormalize(\n rawBody: Uint8Array,\n headers: GitHubWebhookHeaders,\n ): ForgeEventEnvelope {\n this.verify(rawBody, headerValue(headers, 'x-hub-signature-256'));\n const deliveryId = headerValue(headers, 'x-github-delivery');\n const event = headerValue(headers, 'x-github-event');\n if (!deliveryId || !event) {\n throw new ForgeError(\n 'GitHub delivery identity and event headers are required',\n 'INVALID_INPUT',\n { provider: 'github' },\n );\n }\n let payload: unknown;\n try {\n payload = JSON.parse(\n new TextDecoder('utf-8', { fatal: true }).decode(rawBody),\n );\n } catch (cause) {\n throw new ForgeError(\n 'GitHub webhook body is not valid UTF-8 JSON',\n 'INVALID_INPUT',\n { cause, provider: 'github' },\n );\n }\n return normalizeGitHubWebhook(deliveryId, event, payload, this.now());\n }\n}\n","/**\n * Issue body parsing and rendering utilities\n *\n * Parses GitHub issue bodies created from YAML form templates.\n * GitHub renders form fields as markdown sections with ### headings.\n */\n\nimport { readFile } from 'node:fs/promises';\nimport yaml from 'js-yaml';\nimport type { IRepository } from './types.js';\n\n/**\n * Template field definition - mirrors GitHub ISSUE_TEMPLATE YAML structure\n */\nexport interface TemplateField {\n type: 'textarea' | 'input' | 'dropdown' | 'checkboxes' | 'markdown';\n id?: string;\n attributes: {\n label: string;\n description?: string;\n placeholder?: string;\n value?: string;\n options?: string[];\n };\n validations?: {\n required?: boolean;\n };\n}\n\n/**\n * Issue template definition\n */\nexport interface IssueTemplate {\n name: string;\n description?: string;\n title?: string;\n labels?: string[];\n assignees?: string[];\n body: TemplateField[];\n}\n\n/**\n * Load and parse an issue template from a YAML file\n *\n * @param yamlPath - Path to the YAML template file\n * @returns Parsed issue template\n *\n * @example\n * ```typescript\n * const template = await loadIssueTemplate('.github/ISSUE_TEMPLATE/bug_report.yml');\n * ```\n */\nexport async function loadIssueTemplate(\n yamlPath: string,\n): Promise<IssueTemplate> {\n const content = await readFile(yamlPath, 'utf-8');\n return parseIssueTemplate(content);\n}\n\n/**\n * Parse an issue template from YAML content\n *\n * @param yamlContent - YAML content string\n * @returns Parsed issue template\n *\n * @example\n * ```typescript\n * const template = parseIssueTemplate(`\n * name: Bug Report\n * body:\n * - type: textarea\n * id: description\n * attributes:\n * label: Description\n * `);\n * ```\n */\nexport function parseIssueTemplate(yamlContent: string): IssueTemplate {\n const parsed = yaml.load(yamlContent) as IssueTemplate;\n\n if (!parsed.name) {\n throw new Error('Issue template must have a name');\n }\n\n if (!parsed.body || !Array.isArray(parsed.body)) {\n throw new Error('Issue template must have a body array');\n }\n\n return parsed;\n}\n\n/**\n * Parse an issue body into field values\n *\n * GitHub renders form fields as markdown sections:\n * ```\n * ### Label\n *\n * Content here\n *\n * ### Next Label\n * ```\n *\n * Without a template, returns a Record<string, string> keyed by label.\n * With a template, returns a Record<string, string> keyed by field ID.\n *\n * @param body - The issue body markdown\n * @param template - Optional template for mapping labels to field IDs\n * @returns Parsed fields as key-value pairs\n *\n * @example\n * ```typescript\n * // Without template - keyed by label\n * const fields = parseIssueBody(issue.body);\n * // { 'Description': '...', 'Steps to Reproduce': '...' }\n *\n * // With template - keyed by field ID\n * const template = await loadIssueTemplate('.github/ISSUE_TEMPLATE/bug_report.yml');\n * const fields = parseIssueBody(issue.body, template);\n * // { description: '...', reproduction: '...' }\n * ```\n */\nexport function parseIssueBody(\n body: string,\n template?: IssueTemplate,\n): Record<string, string> {\n const sections = parseSections(body);\n\n if (!template) {\n return sections;\n }\n\n // Build label-to-id mapping from template\n const labelToId = new Map<string, string>();\n for (const field of template.body) {\n if (field.id && field.attributes?.label) {\n labelToId.set(field.attributes.label, field.id);\n }\n }\n\n // Map labels to field IDs\n const result: Record<string, string> = {};\n for (const [label, content] of Object.entries(sections)) {\n const id = labelToId.get(label);\n if (id) {\n result[id] = content;\n } else {\n // Keep original label if no ID mapping found\n result[label] = content;\n }\n }\n\n return result;\n}\n\n/**\n * Parse markdown sections (### headers) into key-value pairs\n */\nfunction parseSections(body: string): Record<string, string> {\n const result: Record<string, string> = {};\n\n // Match ### headers and their content\n // Content is everything until the next ### or --- or end of string\n const sectionRegex =\n /^### (.+?)\\r?\\n\\r?\\n([\\s\\S]*?)(?=\\r?\\n### |\\r?\\n---|\\s*$)/gm;\n\n for (const match of body.matchAll(sectionRegex)) {\n const label = match[1].trim();\n const content = match[2].trim();\n result[label] = content;\n }\n\n return result;\n}\n\n/**\n * Render fields into an issue body markdown string\n *\n * Without a template, uses field keys as labels.\n * With a template, uses field IDs to look up labels and renders in template order.\n *\n * @param fields - Field values as key-value pairs\n * @param template - Optional template for field ordering and labels\n * @returns Markdown string for issue body\n *\n * @example\n * ```typescript\n * // Without template\n * const body = renderIssueBody({\n * 'Description': 'Bug description here',\n * 'Steps to Reproduce': '1. Do X\\n2. See error'\n * });\n *\n * // With template\n * const template = await loadIssueTemplate('.github/ISSUE_TEMPLATE/bug_report.yml');\n * const body = renderIssueBody({\n * description: 'Bug description here',\n * reproduction: '1. Do X\\n2. See error'\n * }, template);\n * ```\n */\nexport function renderIssueBody(\n fields: Record<string, string>,\n template?: IssueTemplate,\n): string {\n const sections: string[] = [];\n\n if (!template) {\n // Without template, render in field order\n for (const [label, content] of Object.entries(fields)) {\n sections.push(`### ${label}\\n\\n${content}`);\n }\n } else {\n // With template, render in template order using field IDs\n const idToContent = new Map(Object.entries(fields));\n\n for (const field of template.body) {\n // Skip markdown-only fields (no id)\n if (!field.id || field.type === 'markdown') {\n continue;\n }\n\n const label = field.attributes?.label || field.id;\n const content = idToContent.get(field.id);\n\n if (content !== undefined) {\n sections.push(`### ${label}\\n\\n${content}`);\n }\n }\n }\n\n return sections.join('\\n\\n');\n}\n\n/**\n * Get a specific field value from an issue body\n *\n * @param body - The issue body markdown\n * @param fieldIdOrLabel - Field ID (with template) or label (without template)\n * @param template - Optional template for field ID lookup\n * @returns Field value or undefined if not found\n */\nexport function getIssueField(\n body: string,\n fieldIdOrLabel: string,\n template?: IssueTemplate,\n): string | undefined {\n const fields = parseIssueBody(body, template);\n return fields[fieldIdOrLabel];\n}\n\n/**\n * Update a specific field in an issue body\n *\n * @param body - The issue body markdown\n * @param fieldIdOrLabel - Field ID (with template) or label (without template)\n * @param value - New value for the field\n * @param template - Optional template for field ID lookup\n * @returns Updated issue body markdown\n */\nexport function updateIssueField(\n body: string,\n fieldIdOrLabel: string,\n value: string,\n template?: IssueTemplate,\n): string {\n const fields = parseIssueBody(body, template);\n fields[fieldIdOrLabel] = value;\n return renderIssueBody(fields, template);\n}\n\n/**\n * Fetch issue templates from a repository via GitHub API\n *\n * @param repo - Repository client implementing IRepository\n * @returns Array of parsed issue templates\n *\n * @example\n * ```typescript\n * const repo = await getRepository({ type: 'github', owner: 'org', repo: 'name', token });\n * const templates = await fetchIssueTemplates(repo);\n * // [{ name: 'Bug Report', labels: ['bug'], body: [...] }, ...]\n * ```\n */\nexport async function fetchIssueTemplates(\n repo: IRepository,\n): Promise<IssueTemplate[]> {\n const templatePath = '.github/ISSUE_TEMPLATE';\n const files = await repo.listDirectoryFiles(templatePath);\n const templates: IssueTemplate[] = [];\n\n for (const file of files) {\n if (file.endsWith('.yml') || file.endsWith('.yaml')) {\n const content = await repo.getFileContent(`${templatePath}/${file}`);\n if (content) {\n try {\n templates.push(parseIssueTemplate(content));\n } catch (e) {\n console.warn(`[repos] Failed to parse template ${file}:`, e);\n }\n }\n }\n }\n\n return templates;\n}\n\n/**\n * Detect which template an issue was created from based on labels\n *\n * Matches issue labels against template labels to find the best match.\n * Returns the template with the most matching labels.\n *\n * @param labels - Issue labels\n * @param templates - Available templates\n * @returns Matching template or undefined if no match\n *\n * @example\n * ```typescript\n * const templates = await fetchIssueTemplates(repo);\n * const template = detectTemplateFromLabels(['bug', 'critical'], templates);\n * if (template) {\n * const fields = parseIssueBody(issue.body, template);\n * }\n * ```\n */\nexport function detectTemplateFromLabels(\n labels: string[],\n templates: IssueTemplate[],\n): IssueTemplate | undefined {\n const labelSet = new Set(labels.map((l) => l.toLowerCase()));\n\n let bestMatch: IssueTemplate | undefined;\n let bestScore = 0;\n\n for (const template of templates) {\n if (!template.labels || template.labels.length === 0) continue;\n\n const matchCount = template.labels.filter((l) =>\n labelSet.has(l.toLowerCase()),\n ).length;\n\n // Require at least one matching label\n if (matchCount > 0 && matchCount > bestScore) {\n bestScore = matchCount;\n bestMatch = template;\n }\n }\n\n return bestMatch;\n}\n"],"x_google_ignoreList":[3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19],"mappings":"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AAO,MAAM,MAAO;EACpB,MAAM,KAAK,MAAM,KAAK,EAAE;EACxB,MAAO,MAAM,MAAO;EACpB,MAAM,KAAK,MAAM,KAAK,CAAC;EACvB,MAAO,MAAM,MAAO;EACpB,MAAM,KAAK,MAAM,KAAK,CAAC;EACvB,MAAO,MAAM,MAAO;EACpB,MAAM,KAAK,MAAM,KAAK,EAAE;EACxB,MAAO,MAAM,MAAO;EACpB,MAAM,KAAK,MAAM,KAAK,EAAE;EACxB,MAAO,MAAM,MAAO;EACpB,MAAM,KAAK,MAAM,KAAK,CAAC;EACvB,MAAO,MAAM,MAAO;EACpB,MAAM,KAAK,MAAM,KAAK,CAAC;EACvB,MAAO,MAAM,MAAO;EACpB,MAAM,KAAK,MAAM,KAAK,EAAE;EACxB,MAAO,MAAM,MAAO;EACpB,MAAM,KAAK,MAAM,KAAK,EAAE;EACxB,MAAO,MAAM,MAAO;EACpB,MAAM,KAAK,MAAM,KAAK,CAAC;EACvB,MAAO,MAAM,MAAO;EACpB,MAAM,KAAK,MAAM,KAAK,CAAC;EACvB,MAAO,MAAM,MAAO;EACpB,MAAM,KAAK,MAAM,KAAK,EAAE;EACxB,MAAO,MAAM,MAAO;EACpB,MAAM,KAAK,MAAM,KAAK,EAAE;EACxB,MAAO,MAAM,MAAO;EACpB,MAAM,KAAK,MAAM,KAAK,CAAC;EACvB,MAAO,MAAM,MAAO;EACpB,MAAM,KAAK,MAAM,KAAK,CAAC;EACvB,MAAO,MAAM,MAAO;EACpB,MAAM,KAAK,MAAM,KAAK,EAAE;EACxB,MAAO,MAAM,MAAO;EACpB,MAAM,KAAK,MAAM,KAAK,EAAE;EACxB,MAAO,MAAM,MAAO;EACpB,MAAM,KAAK,MAAM,KAAK,CAAC;EACvB,MAAO,MAAM,MAAO;EACpB,MAAM,KAAK,MAAM,KAAK,CAAC;EACvB,MAAO,MAAM,MAAO;EACpB,MAAM,KAAK,MAAM,KAAK,EAAE;EACxB,MAAO,MAAM,MAAO;EACpB,MAAM,KAAK,MAAM,KAAK,EAAE;EACxB,MAAO,MAAM,MAAO;EACpB,MAAM,KAAK,MAAM,KAAK,CAAC;EACvB,MAAO,MAAM,MAAO;EACpB,MAAM,KAAK,MAAM,KAAK,CAAC;EACvB,MAAO,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"}
|