@renown/sdk 6.0.0-dev.19 → 6.0.0-dev.190
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/README.md +47 -437
- package/dist/index.d.ts +67 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +173 -0
- package/dist/index.js.map +1 -0
- package/dist/node.d.ts +136 -0
- package/dist/node.d.ts.map +1 -0
- package/dist/node.js +305 -0
- package/dist/node.js.map +1 -0
- package/dist/renown-builder-xQpZet3I.js +816 -0
- package/dist/renown-builder-xQpZet3I.js.map +1 -0
- package/dist/utils-Dx7V4t4D.d.ts +548 -0
- package/dist/utils-Dx7V4t4D.d.ts.map +1 -0
- package/package.json +15 -38
- package/dist/e2e/fixtures/main.d.ts +0 -2
- package/dist/e2e/fixtures/main.d.ts.map +0 -1
- package/dist/e2e/fixtures/main.js +0 -97
- package/dist/e2e/fixtures/main.js.map +0 -1
- package/dist/e2e/fixtures/vite.config.d.ts +0 -3
- package/dist/e2e/fixtures/vite.config.d.ts.map +0 -1
- package/dist/e2e/fixtures/vite.config.js +0 -10
- package/dist/e2e/fixtures/vite.config.js.map +0 -1
- package/dist/e2e/renown-components.spec.d.ts +0 -2
- package/dist/e2e/renown-components.spec.d.ts.map +0 -1
- package/dist/e2e/renown-components.spec.js +0 -155
- package/dist/e2e/renown-components.spec.js.map +0 -1
- package/dist/playwright.config.d.ts +0 -3
- package/dist/playwright.config.d.ts.map +0 -1
- package/dist/playwright.config.js +0 -25
- package/dist/playwright.config.js.map +0 -1
- package/dist/src/assets/assets.d.ts +0 -19
- package/dist/src/assets/renown-hover.svg +0 -17
- package/dist/src/assets/renown-light.svg +0 -15
- package/dist/src/assets/renown-short-hover.png +0 -0
- package/dist/src/assets/renown-short.png +0 -0
- package/dist/src/assets/renown.svg +0 -16
- package/dist/src/common.d.ts +0 -15
- package/dist/src/common.d.ts.map +0 -1
- package/dist/src/common.js +0 -105
- package/dist/src/common.js.map +0 -1
- package/dist/src/components/RenownAuthButton.d.ts +0 -62
- package/dist/src/components/RenownAuthButton.d.ts.map +0 -1
- package/dist/src/components/RenownAuthButton.js +0 -82
- package/dist/src/components/RenownAuthButton.js.map +0 -1
- package/dist/src/components/RenownLoginButton.d.ts +0 -48
- package/dist/src/components/RenownLoginButton.d.ts.map +0 -1
- package/dist/src/components/RenownLoginButton.js +0 -175
- package/dist/src/components/RenownLoginButton.js.map +0 -1
- package/dist/src/components/RenownUserButton.d.ts +0 -66
- package/dist/src/components/RenownUserButton.d.ts.map +0 -1
- package/dist/src/components/RenownUserButton.js +0 -216
- package/dist/src/components/RenownUserButton.js.map +0 -1
- package/dist/src/components/icons.d.ts +0 -25
- package/dist/src/components/icons.d.ts.map +0 -1
- package/dist/src/components/icons.js +0 -24
- package/dist/src/components/icons.js.map +0 -1
- package/dist/src/components/image-data.d.ts +0 -3
- package/dist/src/components/image-data.d.ts.map +0 -1
- package/dist/src/components/image-data.js +0 -4
- package/dist/src/components/image-data.js.map +0 -1
- package/dist/src/components/index.d.ts +0 -8
- package/dist/src/components/index.d.ts.map +0 -1
- package/dist/src/components/index.js +0 -5
- package/dist/src/components/index.js.map +0 -1
- package/dist/src/constants.d.ts +0 -130
- package/dist/src/constants.d.ts.map +0 -1
- package/dist/src/constants.js +0 -40
- package/dist/src/constants.js.map +0 -1
- package/dist/src/crypto/browser-key-storage.d.ts +0 -8
- package/dist/src/crypto/browser-key-storage.d.ts.map +0 -1
- package/dist/src/crypto/browser-key-storage.js +0 -73
- package/dist/src/crypto/browser-key-storage.js.map +0 -1
- package/dist/src/crypto/index.d.ts +0 -36
- package/dist/src/crypto/index.d.ts.map +0 -1
- package/dist/src/crypto/index.js +0 -130
- package/dist/src/crypto/index.js.map +0 -1
- package/dist/src/crypto/node-key-storage.d.ts +0 -8
- package/dist/src/crypto/node-key-storage.d.ts.map +0 -1
- package/dist/src/crypto/node-key-storage.js +0 -67
- package/dist/src/crypto/node-key-storage.js.map +0 -1
- package/dist/src/crypto/node.d.ts +0 -2
- package/dist/src/crypto/node.d.ts.map +0 -1
- package/dist/src/crypto/node.js +0 -3
- package/dist/src/crypto/node.js.map +0 -1
- package/dist/src/crypto/signer.d.ts +0 -21
- package/dist/src/crypto/signer.d.ts.map +0 -1
- package/dist/src/crypto/signer.js +0 -236
- package/dist/src/crypto/signer.js.map +0 -1
- package/dist/src/event/event.browser.d.ts +0 -10
- package/dist/src/event/event.browser.d.ts.map +0 -1
- package/dist/src/event/event.browser.js +0 -24
- package/dist/src/event/event.browser.js.map +0 -1
- package/dist/src/event/event.node.d.ts +0 -8
- package/dist/src/event/event.node.d.ts.map +0 -1
- package/dist/src/event/event.node.js +0 -17
- package/dist/src/event/event.node.js.map +0 -1
- package/dist/src/event/types.d.ts +0 -16
- package/dist/src/event/types.d.ts.map +0 -1
- package/dist/src/event/types.js +0 -2
- package/dist/src/event/types.js.map +0 -1
- package/dist/src/hooks/index.d.ts +0 -2
- package/dist/src/hooks/index.d.ts.map +0 -1
- package/dist/src/hooks/index.js +0 -2
- package/dist/src/hooks/index.js.map +0 -1
- package/dist/src/hooks/use-user.d.ts +0 -21
- package/dist/src/hooks/use-user.d.ts.map +0 -1
- package/dist/src/hooks/use-user.js +0 -30
- package/dist/src/hooks/use-user.js.map +0 -1
- package/dist/src/index.browser.d.ts +0 -4
- package/dist/src/index.browser.d.ts.map +0 -1
- package/dist/src/index.browser.js +0 -4
- package/dist/src/index.browser.js.map +0 -1
- package/dist/src/index.d.ts +0 -13
- package/dist/src/index.d.ts.map +0 -1
- package/dist/src/index.js +0 -13
- package/dist/src/index.js.map +0 -1
- package/dist/src/index.node.d.ts +0 -4
- package/dist/src/index.node.d.ts.map +0 -1
- package/dist/src/index.node.js +0 -4
- package/dist/src/index.node.js.map +0 -1
- package/dist/src/init.browser.d.ts +0 -3
- package/dist/src/init.browser.d.ts.map +0 -1
- package/dist/src/init.browser.js +0 -7
- package/dist/src/init.browser.js.map +0 -1
- package/dist/src/init.node.d.ts +0 -3
- package/dist/src/init.node.d.ts.map +0 -1
- package/dist/src/init.node.js +0 -8
- package/dist/src/init.node.js.map +0 -1
- package/dist/src/lib/crypto/browser.d.ts +0 -8
- package/dist/src/lib/crypto/browser.d.ts.map +0 -1
- package/dist/src/lib/crypto/browser.js +0 -73
- package/dist/src/lib/crypto/browser.js.map +0 -1
- package/dist/src/lib/crypto/index.d.ts +0 -36
- package/dist/src/lib/crypto/index.d.ts.map +0 -1
- package/dist/src/lib/crypto/index.js +0 -150
- package/dist/src/lib/crypto/index.js.map +0 -1
- package/dist/src/lib/crypto/node.d.ts +0 -8
- package/dist/src/lib/crypto/node.d.ts.map +0 -1
- package/dist/src/lib/crypto/node.js +0 -67
- package/dist/src/lib/crypto/node.js.map +0 -1
- package/dist/src/lib/renown/constants.d.ts +0 -130
- package/dist/src/lib/renown/constants.d.ts.map +0 -1
- package/dist/src/lib/renown/constants.js +0 -40
- package/dist/src/lib/renown/constants.js.map +0 -1
- package/dist/src/lib/renown/did-parser.d.ts +0 -28
- package/dist/src/lib/renown/did-parser.d.ts.map +0 -1
- package/dist/src/lib/renown/did-parser.js +0 -57
- package/dist/src/lib/renown/did-parser.js.map +0 -1
- package/dist/src/lib/renown/index.d.ts +0 -4
- package/dist/src/lib/renown/index.d.ts.map +0 -1
- package/dist/src/lib/renown/index.js +0 -4
- package/dist/src/lib/renown/index.js.map +0 -1
- package/dist/src/lib/renown/utils.d.ts +0 -33
- package/dist/src/lib/renown/utils.d.ts.map +0 -1
- package/dist/src/lib/renown/utils.js +0 -207
- package/dist/src/lib/renown/utils.js.map +0 -1
- package/dist/src/lib/session-storage.d.ts +0 -40
- package/dist/src/lib/session-storage.d.ts.map +0 -1
- package/dist/src/lib/session-storage.js +0 -107
- package/dist/src/lib/session-storage.js.map +0 -1
- package/dist/src/node.d.ts +0 -6
- package/dist/src/node.d.ts.map +0 -1
- package/dist/src/node.js +0 -6
- package/dist/src/node.js.map +0 -1
- package/dist/src/providers/index.d.ts +0 -3
- package/dist/src/providers/index.d.ts.map +0 -1
- package/dist/src/providers/index.js +0 -2
- package/dist/src/providers/index.js.map +0 -1
- package/dist/src/providers/renown-user-provider.d.ts +0 -72
- package/dist/src/providers/renown-user-provider.d.ts.map +0 -1
- package/dist/src/providers/renown-user-provider.js +0 -171
- package/dist/src/providers/renown-user-provider.js.map +0 -1
- package/dist/src/storage/common.d.ts +0 -13
- package/dist/src/storage/common.d.ts.map +0 -1
- package/dist/src/storage/common.js +0 -7
- package/dist/src/storage/common.js.map +0 -1
- package/dist/src/storage/storage.browser.d.ts +0 -9
- package/dist/src/storage/storage.browser.d.ts.map +0 -1
- package/dist/src/storage/storage.browser.js +0 -25
- package/dist/src/storage/storage.browser.js.map +0 -1
- package/dist/src/storage/storage.node.d.ts +0 -11
- package/dist/src/storage/storage.node.d.ts.map +0 -1
- package/dist/src/storage/storage.node.js +0 -40
- package/dist/src/storage/storage.node.js.map +0 -1
- package/dist/src/types.d.ts +0 -80
- package/dist/src/types.d.ts.map +0 -1
- package/dist/src/types.js +0 -2
- package/dist/src/types.js.map +0 -1
- package/dist/src/utils.d.ts +0 -17
- package/dist/src/utils.d.ts.map +0 -1
- package/dist/src/utils.js +0 -80
- package/dist/src/utils.js.map +0 -1
- package/dist/tests/auth.test.d.ts +0 -2
- package/dist/tests/auth.test.d.ts.map +0 -1
- package/dist/tests/auth.test.js +0 -13
- package/dist/tests/auth.test.js.map +0 -1
- package/dist/tsconfig.tsbuildinfo +0 -1
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"renown-builder-xQpZet3I.js","names":["getResolver","keyDidResolver","#keyPairStorage","#subtleCrypto","#keyPair","#stringToBytes","#initializeKeyPair","#store","#eventEmitter","#baseUrl","#crypto","#appName","#profileFetcher","#signer","#status","#updateStatus","#getCredential","#updateUser","#listeners","#appName","#storage","#eventEmitter","#crypto","#keyPairStorage","#baseUrl","#profileFetcher"],"sources":["../src/constants.ts","../src/utils.ts","../src/crypto/utils.ts","../src/crypto/renown-crypto.ts","../src/crypto/renown-crypto-builder.ts","../src/crypto/memory-key-storage.ts","../src/crypto/signer.ts","../src/storage/common.ts","../src/common.ts","../src/event/memory.ts","../src/profile.ts","../src/renown-builder.ts"],"sourcesContent":["export const DEFAULT_RENOWN_URL = \"https://www.renown.id\";\nexport const DEFAULT_RENOWN_NETWORK_ID = \"eip155\";\nexport const DEFAULT_RENOWN_CHAIN_ID = \"1\";\n\nexport const DOMAIN_TYPE = [\n { name: \"name\", type: \"string\" },\n { name: \"version\", type: \"string\" },\n { name: \"chainId\", type: \"uint256\" },\n { name: \"verifyingContract\", type: \"address\" },\n] as const;\n\nexport const VERIFIABLE_CREDENTIAL_EIP712_TYPE = [\n { name: \"@context\", type: \"string[]\" },\n { name: \"type\", type: \"string[]\" },\n { name: \"id\", type: \"string\" },\n { name: \"issuer\", type: \"Issuer\" },\n { name: \"credentialSubject\", type: \"CredentialSubject\" },\n { name: \"credentialSchema\", type: \"CredentialSchema\" },\n { name: \"issuanceDate\", type: \"string\" },\n { name: \"expirationDate\", type: \"string\" },\n] as const;\n\nexport const CREDENTIAL_SCHEMA_EIP712_TYPE = [\n { name: \"id\", type: \"string\" },\n { name: \"type\", type: \"string\" },\n] as const;\n\nexport const CREDENTIAL_SUBJECT_TYPE = [\n { name: \"app\", type: \"string\" },\n { name: \"id\", type: \"string\" },\n { name: \"name\", type: \"string\" },\n] as const;\n\nexport const ISSUER_TYPE = [\n { name: \"id\", type: \"string\" },\n { name: \"ethereumAddress\", type: \"string\" },\n] as const;\n\nexport const CREDENTIAL_TYPES = {\n EIP712Domain: DOMAIN_TYPE,\n VerifiableCredential: VERIFIABLE_CREDENTIAL_EIP712_TYPE,\n CredentialSchema: CREDENTIAL_SCHEMA_EIP712_TYPE,\n CredentialSubject: CREDENTIAL_SUBJECT_TYPE,\n Issuer: ISSUER_TYPE,\n} as const;\n","import type {\n Issuer,\n JwtCredentialPayload,\n VerifiedCredential,\n} from \"did-jwt-vc\";\nimport { createVerifiableCredentialJwt, verifyCredential } from \"did-jwt-vc\";\nimport { Resolver } from \"did-resolver\";\nimport { getResolver as keyDidResolver } from \"key-did-resolver\";\nimport type {\n AuthVerifiedCredential,\n CreateBearerTokenOptions,\n IAuthCredentialSubject,\n PKHDid,\n} from \"./types.js\";\n\nexport type ILogger = {\n level: \"verbose\" | \"debug\" | \"info\" | \"warn\" | \"error\";\n\n verbose: (message: string, ...replacements: any[]) => void;\n debug: (message: string, ...replacements: any[]) => void;\n info: (message: string, ...replacements: any[]) => void;\n warn: (message: string, ...replacements: any[]) => void;\n error: (message: string, ...replacements: any[]) => void;\n};\n\n/**\n * Parse a DID:pkh string to extract network, chain ID, and address information\n * @param did - The DID string in format \"did:pkh:networkId:chainId:address\"\n * @returns Parsed DID information\n * @throws Error if the DID format is invalid\n */\nexport function parsePkhDid(did: string): PKHDid {\n const parts = did.split(\":\");\n if (!did.startsWith(\"did:pkh:\") || parts.length !== 5) {\n throw new Error(\"Invalid pkh did\");\n }\n const [, , networkId, chainIdStr, address] = parts;\n\n if (!address.startsWith(\"0x\")) {\n throw new Error(`Invalid address: ${address}`);\n }\n\n const chainId = Number(chainIdStr);\n if (isNaN(chainId)) {\n throw new Error(`Invalid chain id: ${chainIdStr}`);\n }\n\n return {\n chainId,\n networkId,\n address: address as PKHDid[\"address\"],\n };\n}\n\nexport async function verifyAuthBearerToken(\n jwt: string,\n): Promise<false | AuthVerifiedCredential> {\n try {\n const now = parseInt(String(Date.now() / 1000));\n const verified = await verifyCredential(jwt, getResolver(), {\n policies: {\n now: parseInt(String(Date.now() / 1000)),\n expirationDate: true,\n issuanceDate: true,\n },\n });\n\n if (verified.payload.exp && verified.payload.exp! < now) {\n return false;\n }\n assertIsAuthCredential(verified);\n return verified;\n } catch (e) {\n console.error(e);\n return false;\n }\n}\n\nexport function assertIsAuthCredential(\n credential: VerifiedCredential,\n): asserts credential is AuthVerifiedCredential {\n const subjectKeys = Object.keys(\n credential.verifiableCredential.credentialSubject,\n );\n if (\n ![\"address\", \"chainId\", \"networkId\"].every((key) =>\n subjectKeys.includes(key),\n )\n ) {\n throw new Error(\n \"Invalid Auth Credential Subject:\" +\n JSON.stringify(\n credential.verifiableCredential.credentialSubject,\n null,\n 2,\n ),\n );\n }\n}\n\nexport async function createAuthBearerToken(\n chainId: number,\n networkId: string,\n address: string,\n issuer: Issuer,\n options?: CreateBearerTokenOptions,\n) {\n const vcPayload: JwtCredentialPayload = {\n sub: issuer.did,\n vc: {\n \"@context\": [\"https://www.w3.org/2018/credentials/v1\"],\n type: [\"VerifiableCredential\"],\n credentialSubject: {\n chainId,\n networkId,\n address,\n } satisfies IAuthCredentialSubject,\n },\n aud: options?.aud,\n };\n\n const jwt = await createVerifiableCredentialJwt(vcPayload, issuer, {\n expiresIn: options?.expiresIn,\n });\n return jwt;\n}\n\nexport const getResolver = () => {\n const keyResolver = keyDidResolver();\n if (!keyResolver) {\n throw new Error(\"Failed to get key resolver\");\n }\n\n return new Resolver(keyResolver);\n};\n","import {\n compressedKeyInHexfromRaw,\n encodeDIDfromHexString,\n rawKeyInHexfromUncompressed,\n} from \"did-key-creator\";\nimport type { DID, JwkKeyPair } from \"./types.js\";\n\nexport const ECDSA_ALGORITHM: EcKeyAlgorithm = {\n name: \"ECDSA\",\n namedCurve: \"P-256\",\n};\n\nexport const ECDSA_SIGN_ALGORITHM = {\n name: \"ECDSA\",\n namedCurve: \"P-256\",\n hash: \"SHA-256\",\n};\n\nexport function ab2hex(ab: ArrayBuffer): string {\n return Array.prototype.map\n .call(new Uint8Array(ab), (x: number) => (\"00\" + x.toString(16)).slice(-2))\n .join(\"\");\n}\n\nexport async function parseDid(\n keyPair: CryptoKeyPair,\n subtleCrypto: SubtleCrypto,\n): Promise<DID> {\n const publicKeyRaw = await subtleCrypto.exportKey(\"raw\", keyPair.publicKey);\n const multicodecName = \"p256-pub\";\n const rawKey = rawKeyInHexfromUncompressed(ab2hex(publicKeyRaw));\n const compressedKey = compressedKeyInHexfromRaw(rawKey);\n const did = encodeDIDfromHexString(multicodecName, compressedKey);\n return did as DID;\n}\n\nexport async function exportKeyPair(\n keyPair: CryptoKeyPair,\n subtleCrypto: SubtleCrypto,\n): Promise<JwkKeyPair> {\n return {\n publicKey: await subtleCrypto.exportKey(\"jwk\", keyPair.publicKey),\n privateKey: await subtleCrypto.exportKey(\"jwk\", keyPair.privateKey),\n };\n}\n\nexport async function importKeyPair(\n jwkKeyPair: JwkKeyPair,\n subtleCrypto: SubtleCrypto,\n algorithm: EcKeyAlgorithm = ECDSA_ALGORITHM,\n): Promise<CryptoKeyPair> {\n return {\n publicKey: await subtleCrypto.importKey(\n \"jwk\",\n jwkKeyPair.publicKey,\n algorithm,\n true,\n [\"verify\"],\n ),\n privateKey: await subtleCrypto.importKey(\n \"jwk\",\n jwkKeyPair.privateKey,\n algorithm,\n true,\n [\"sign\"],\n ),\n };\n}\n\nexport async function generateKeyPair(\n subtleCrypto: SubtleCrypto,\n algorithm: EcKeyAlgorithm = ECDSA_ALGORITHM,\n): Promise<CryptoKeyPair> {\n return subtleCrypto.generateKey(algorithm, true, [\"sign\", \"verify\"]);\n}\n","import { bytesToBase64url } from \"did-jwt\";\nimport type { Issuer } from \"did-jwt-vc\";\nimport { fromString } from \"uint8arrays\";\nimport type { CreateBearerTokenOptions } from \"../types.js\";\nimport { createAuthBearerToken } from \"../utils.js\";\nimport type { DID, IRenownCrypto, JsonWebKeyPairStorage } from \"./types.js\";\nimport { ECDSA_ALGORITHM, ECDSA_SIGN_ALGORITHM } from \"./utils.js\";\n\nconst RENOWN_NETWORK_ID = \"eip155\";\nconst RENOWN_CHAIN_ID = 1;\n\nexport class RenownCrypto implements IRenownCrypto {\n #subtleCrypto: SubtleCrypto;\n #keyPair: CryptoKeyPair;\n #keyPairStorage: JsonWebKeyPairStorage;\n\n readonly did: DID;\n\n static algorithm = ECDSA_ALGORITHM;\n static signAlgorithm = ECDSA_SIGN_ALGORITHM;\n\n constructor(\n keyPairStorage: JsonWebKeyPairStorage,\n crypto: SubtleCrypto,\n keyPair: CryptoKeyPair,\n did: DID,\n ) {\n this.#keyPairStorage = keyPairStorage;\n this.#subtleCrypto = crypto;\n this.#keyPair = keyPair;\n this.did = did;\n }\n\n get publicKey() {\n return this.#keyPair.publicKey;\n }\n\n async getBearerToken(\n address: string | undefined,\n options?: CreateBearerTokenOptions,\n ): Promise<string> {\n return await createAuthBearerToken(\n Number(RENOWN_CHAIN_ID),\n RENOWN_NETWORK_ID,\n address || this.did,\n this.issuer,\n options,\n );\n }\n\n async removeDid(): Promise<void> {\n await this.#keyPairStorage.removeKeyPair();\n }\n\n #stringToBytes(s: string): Uint8Array {\n return fromString(s, \"utf-8\");\n }\n\n async sign(data: Uint8Array | string): Promise<Uint8Array> {\n const dataBytes: Uint8Array =\n typeof data === \"string\" ? this.#stringToBytes(data) : data;\n\n const arrayBuffer = await this.#subtleCrypto.sign(\n RenownCrypto.signAlgorithm,\n this.#keyPair.privateKey,\n dataBytes.buffer as ArrayBuffer,\n );\n\n return new Uint8Array(arrayBuffer);\n }\n\n async verify(data: Uint8Array, signature: Uint8Array): Promise<boolean> {\n return this.#subtleCrypto.verify(\n { name: \"ECDSA\", hash: \"SHA-256\" },\n this.#keyPair.publicKey,\n signature.buffer as ArrayBuffer,\n data.buffer as ArrayBuffer,\n );\n }\n\n get issuer(): Issuer {\n return {\n did: this.did,\n signer: async (data: string | Uint8Array) => {\n const signature = await this.sign(\n typeof data === \"string\" ? new TextEncoder().encode(data) : data,\n );\n return bytesToBase64url(signature);\n },\n alg: \"ES256\",\n };\n }\n}\n\n/**\n * @deprecated Use RenownCrypto instead\n */\nexport class ConnectCrypto extends RenownCrypto {}\n","import { RenownCrypto } from \"./renown-crypto.js\";\nimport type { JsonWebKeyPairStorage } from \"./types.js\";\nimport {\n exportKeyPair,\n generateKeyPair,\n importKeyPair,\n parseDid,\n} from \"./utils.js\";\n\nexport class RenownCryptoBuilder {\n private keyPairStorage?: JsonWebKeyPairStorage;\n private subtleCrypto?: SubtleCrypto;\n\n withKeyPairStorage(storage: JsonWebKeyPairStorage): this {\n this.keyPairStorage = storage;\n return this;\n }\n\n withSubtleCrypto(crypto: SubtleCrypto): this {\n this.subtleCrypto = crypto;\n return this;\n }\n\n async build(): Promise<RenownCrypto> {\n if (!this.keyPairStorage) {\n throw new Error(\n \"KeyPairStorage is required. Use withKeyPairStorage() to set it.\",\n );\n }\n\n const subtleCrypto = this.subtleCrypto ?? globalThis.crypto.subtle;\n const keyPair = await this.#initializeKeyPair(\n subtleCrypto,\n this.keyPairStorage,\n );\n const did = await parseDid(keyPair, subtleCrypto);\n\n return new RenownCrypto(this.keyPairStorage, subtleCrypto, keyPair, did);\n }\n\n async #initializeKeyPair(\n subtleCrypto: SubtleCrypto,\n keyPairStorage: JsonWebKeyPairStorage,\n ): Promise<CryptoKeyPair> {\n const loadedKeyPair = await keyPairStorage.loadKeyPair();\n if (loadedKeyPair) {\n return importKeyPair(loadedKeyPair, subtleCrypto);\n }\n\n const keyPair = await generateKeyPair(subtleCrypto);\n const exported = await exportKeyPair(keyPair, subtleCrypto);\n await keyPairStorage.saveKeyPair(exported);\n return keyPair;\n }\n}\n","import type { JsonWebKeyPairStorage, JwkKeyPair } from \"./types.js\";\n\nexport class MemoryKeyStorage implements JsonWebKeyPairStorage {\n private keyPair: JwkKeyPair | undefined;\n\n constructor(keyPair?: JwkKeyPair) {\n this.keyPair = keyPair;\n }\n\n loadKeyPair() {\n return Promise.resolve(this.keyPair);\n }\n\n saveKeyPair(keyPair: JwkKeyPair) {\n this.keyPair = keyPair;\n return Promise.resolve();\n }\n\n removeKeyPair() {\n this.keyPair = undefined;\n return Promise.resolve();\n }\n}\n","import type {\n Action,\n AppActionSigner,\n ISigner,\n Operation,\n Signature,\n SignatureVerificationHandler,\n UserActionSigner,\n} from \"@powerhousedao/shared/document-model\";\nimport type { IRenownCrypto } from \"./index.js\";\n\nexport class InvalidSignatureError extends Error {\n constructor() {\n super(\"Invalid signature\");\n }\n}\n\nexport class RenownCryptoSigner implements ISigner {\n readonly app: AppActionSigner;\n\n constructor(\n private readonly crypto: IRenownCrypto,\n private readonly appName: string,\n public user?: UserActionSigner,\n ) {\n this.app = {\n key: this.crypto.did,\n name: this.appName,\n };\n }\n\n get publicKey() {\n return this.crypto.publicKey;\n }\n\n async sign(data: Uint8Array): Promise<Uint8Array> {\n return this.crypto.sign(data);\n }\n\n async verify(data: Uint8Array, signature: Uint8Array): Promise<void> {\n const isValid = await this.crypto.verify(data, signature);\n if (!isValid) {\n throw new InvalidSignatureError();\n }\n }\n\n async signAction(\n action: Action,\n abortSignal?: AbortSignal,\n ): Promise<Signature> {\n const hashField = action.context?.prevOpHash ?? \"\";\n return this._signAction(action, hashField, abortSignal);\n }\n\n /**\n * Signs an action including a predicted resulting state hash.\n *\n * The resulting hash is packed into the signature tuple's 4th element (index 3)\n * using the format: `${prevStateHash}:${resultingStateHash}`\n *\n * This allows offline verification of documents without reducer logic:\n * - Verifier can check that the signature is valid for the claimed resulting state\n * - Verifier can compare claimed resulting state to actual operation.hash\n *\n * @param action - The action to sign\n * @param resultingStateHash - The predicted hash of document state AFTER this action runs\n * @param abortSignal - Optional abort signal\n * @returns A Signature tuple with the resulting hash encoded in element [3]\n */\n async signActionWithResultingState(\n action: Action,\n resultingStateHash: string,\n abortSignal?: AbortSignal,\n ): Promise<Signature> {\n const prevStateHash = action.context?.prevOpHash ?? \"\";\n const hashField = `${prevStateHash}:${resultingStateHash}`;\n return this._signAction(action, hashField, abortSignal);\n }\n\n /**\n * Internal signing implementation shared by signAction and signActionWithResultingState.\n */\n private async _signAction(\n action: Action,\n hashField: string,\n abortSignal?: AbortSignal,\n ): Promise<Signature> {\n if (abortSignal?.aborted) {\n throw new Error(\"Signing aborted\");\n }\n\n const timestamp = (new Date().getTime() / 1000).toFixed(0);\n const hash = await this.hashAction(action);\n\n if (abortSignal?.aborted) {\n throw new Error(\"Signing aborted\");\n }\n\n const params: [string, string, string, string] = [\n timestamp,\n this.crypto.did,\n hash,\n hashField,\n ];\n const message = this.buildSignatureMessage(params);\n const signatureBytes = await this.crypto.sign(message);\n const signatureHex = `0x${this.arrayBufferToHex(signatureBytes)}`;\n\n if (abortSignal?.aborted) {\n throw new Error(\"Signing aborted\");\n }\n\n return [...params, signatureHex];\n }\n\n private async hashAction(action: Action): Promise<string> {\n const payload = [\n action.scope,\n action.type,\n JSON.stringify(action.input),\n ].join(\"\");\n const encoder = new TextEncoder();\n const data = encoder.encode(payload);\n const hashBuffer = await crypto.subtle.digest(\"SHA-256\", data);\n return this.arrayBufferToBase64(hashBuffer);\n }\n\n private buildSignatureMessage(\n params: [string, string, string, string],\n ): Uint8Array {\n const message = params.join(\"\");\n const prefix = \"\\x19Signed Operation:\\n\" + message.length.toString();\n const encoder = new TextEncoder();\n return encoder.encode(prefix + message);\n }\n\n private arrayBufferToHex(buffer: Uint8Array | ArrayBuffer): string {\n const bytes =\n buffer instanceof Uint8Array ? buffer : new Uint8Array(buffer);\n return Array.from(bytes)\n .map((byte) => byte.toString(16).padStart(2, \"0\"))\n .join(\"\");\n }\n\n private arrayBufferToBase64(buffer: ArrayBuffer): string {\n const bytes = new Uint8Array(buffer);\n let binary = \"\";\n for (let i = 0; i < bytes.length; i++) {\n binary += String.fromCharCode(bytes[i]);\n }\n return btoa(binary);\n }\n}\n\n/**\n * Creates a signature verification handler that verifies signatures using the Web Crypto API.\n * The verification uses ECDSA with P-256 curve and SHA-256 hash, matching the RenownCrypto signing algorithm.\n */\nexport function createSignatureVerifier(\n requireSignature = false,\n): SignatureVerificationHandler {\n return async (operation: Operation, publicKey: string): Promise<boolean> => {\n const signer = operation.action.context?.signer;\n if (!signer || !publicKey) {\n return !requireSignature;\n }\n\n const signatures = signer.signatures;\n if (signatures.length === 0) {\n return false;\n }\n\n const signature = signatures[signatures.length - 1];\n const [timestamp, signerKey, hash, prevStateHash, signatureHex] = signature;\n\n if (signerKey !== publicKey) {\n return false;\n }\n\n const params: [string, string, string, string] = [\n timestamp,\n signerKey,\n hash,\n prevStateHash,\n ];\n const message = buildSignatureMessage(params);\n const signatureBytes = hexToUint8Array(signatureHex);\n\n const cryptoKey = await importPublicKey(publicKey);\n\n const isValid = await crypto.subtle.verify(\n { name: \"ECDSA\", hash: \"SHA-256\" },\n cryptoKey,\n signatureBytes.buffer as ArrayBuffer,\n message.buffer as ArrayBuffer,\n );\n\n return isValid;\n };\n}\n\nfunction buildSignatureMessage(\n params: [string, string, string, string],\n): Uint8Array {\n const message = params.join(\"\");\n const prefix = \"\\x19Signed Operation:\\n\" + message.length.toString();\n const encoder = new TextEncoder();\n return encoder.encode(prefix + message);\n}\n\nfunction hexToUint8Array(hex: string): Uint8Array {\n const cleanHex = hex.startsWith(\"0x\") ? hex.slice(2) : hex;\n const bytes = new Uint8Array(cleanHex.length / 2);\n for (let i = 0; i < cleanHex.length; i += 2) {\n bytes[i / 2] = parseInt(cleanHex.substring(i, i + 2), 16);\n }\n return bytes;\n}\n\nasync function importPublicKey(did: string): Promise<CryptoKey> {\n const keyData = extractKeyFromDid(did);\n return crypto.subtle.importKey(\n \"raw\",\n keyData.buffer as ArrayBuffer,\n { name: \"ECDSA\", namedCurve: \"P-256\" },\n true,\n [\"verify\"],\n );\n}\n\nfunction extractKeyFromDid(did: string): Uint8Array {\n const parts = did.split(\":\");\n if (parts.length < 3 || parts[0] !== \"did\" || parts[1] !== \"key\") {\n throw new Error(`Invalid DID format: ${did}`);\n }\n\n const multibaseKey = parts[2];\n if (!multibaseKey.startsWith(\"z\")) {\n throw new Error(`Unsupported multibase encoding: ${multibaseKey[0]}`);\n }\n\n const decoded = base58Decode(multibaseKey.slice(1));\n\n if (decoded[0] !== 0x80 || decoded[1] !== 0x24) {\n throw new Error(\"Not a P-256 public key multicodec\");\n }\n\n const compressedKey = decoded.slice(2);\n return decompressP256PublicKey(compressedKey);\n}\n\nfunction base58Decode(input: string): Uint8Array {\n const ALPHABET = \"123456789ABCDEFGHJKLMNPQRSTUVWXYZabcdefghijkmnopqrstuvwxyz\";\n const ALPHABET_MAP = new Map<string, number>();\n for (let i = 0; i < ALPHABET.length; i++) {\n ALPHABET_MAP.set(ALPHABET[i], i);\n }\n\n if (input.length === 0) {\n return new Uint8Array(0);\n }\n\n const bytes: number[] = [0];\n for (const char of input) {\n const value = ALPHABET_MAP.get(char);\n if (value === undefined) {\n throw new Error(`Invalid base58 character: ${char}`);\n }\n\n let carry = value;\n for (let j = 0; j < bytes.length; j++) {\n carry += bytes[j] * 58;\n bytes[j] = carry & 0xff;\n carry >>= 8;\n }\n\n while (carry > 0) {\n bytes.push(carry & 0xff);\n carry >>= 8;\n }\n }\n\n for (const char of input) {\n if (char !== \"1\") break;\n bytes.push(0);\n }\n\n return new Uint8Array(bytes.reverse());\n}\n\nfunction decompressP256PublicKey(compressed: Uint8Array): Uint8Array {\n if (compressed.length !== 33) {\n throw new Error(`Invalid compressed key length: ${compressed.length}`);\n }\n\n const prefix = compressed[0];\n if (prefix !== 0x02 && prefix !== 0x03) {\n throw new Error(`Invalid compression prefix: ${prefix}`);\n }\n\n const p = BigInt(\n \"0xffffffff00000001000000000000000000000000ffffffffffffffffffffffff\",\n );\n const a = BigInt(\n \"0xffffffff00000001000000000000000000000000fffffffffffffffffffffffc\",\n );\n const b = BigInt(\n \"0x5ac635d8aa3a93e7b3ebbd55769886bc651d06b0cc53b0f63bce3c3e27d2604b\",\n );\n\n let x = BigInt(0);\n for (let i = 1; i < compressed.length; i++) {\n x = (x << BigInt(8)) | BigInt(compressed[i]);\n }\n\n const ySquared = (modPow(x, BigInt(3), p) + a * x + b) % p;\n let y = modPow(ySquared, (p + BigInt(1)) / BigInt(4), p);\n\n const isYEven = y % BigInt(2) === BigInt(0);\n const shouldBeEven = prefix === 0x02;\n if (isYEven !== shouldBeEven) {\n y = p - y;\n }\n\n const uncompressed = new Uint8Array(65);\n uncompressed[0] = 0x04;\n\n const xBytes = bigIntToBytes(x, 32);\n const yBytes = bigIntToBytes(y, 32);\n\n uncompressed.set(xBytes, 1);\n uncompressed.set(yBytes, 33);\n\n return uncompressed;\n}\n\nfunction modPow(base: bigint, exp: bigint, mod: bigint): bigint {\n let result = BigInt(1);\n base = base % mod;\n while (exp > BigInt(0)) {\n if (exp % BigInt(2) === BigInt(1)) {\n result = (result * base) % mod;\n }\n exp = exp >> BigInt(1);\n base = (base * base) % mod;\n }\n return result;\n}\n\nfunction bigIntToBytes(n: bigint, length: number): Uint8Array {\n const bytes = new Uint8Array(length);\n for (let i = length - 1; i >= 0; i--) {\n bytes[i] = Number(n & BigInt(0xff));\n n = n >> BigInt(8);\n }\n return bytes;\n}\n\n/**\n * Parses the hash field (element [3]) from a signature tuple.\n *\n * Supports two formats:\n * - Old format: just `prevStateHash` (no colon)\n * - New format: `prevStateHash:resultingStateHash` (colon-separated)\n *\n * @param hashField - The 4th element of a Signature tuple\n * @returns Object with prevStateHash and optional resultingStateHash\n */\nexport function parseSignatureHashField(hashField: string): {\n prevStateHash: string;\n resultingStateHash: string | undefined;\n} {\n const colonIndex = hashField.indexOf(\":\");\n\n if (colonIndex === -1) {\n return {\n prevStateHash: hashField,\n resultingStateHash: undefined,\n };\n }\n\n return {\n prevStateHash: hashField.substring(0, colonIndex),\n resultingStateHash: hashField.substring(colonIndex + 1),\n };\n}\n\n/**\n * Extracts the resulting state hash from a signature, if present.\n *\n * @param signature - A Signature tuple\n * @returns The resulting state hash, or undefined if not present\n */\nexport function extractResultingHashFromSignature(\n signature: Signature,\n): string | undefined {\n const hashField = signature[3];\n const { resultingStateHash } = parseSignatureHashField(hashField);\n return resultingStateHash;\n}\n\n/**\n * Checks if a signature includes a resulting state hash.\n *\n * @param signature - A Signature tuple\n * @returns true if the signature includes a resulting state hash\n */\nexport function signatureHasResultingHash(signature: Signature): boolean {\n return extractResultingHashFromSignature(signature) !== undefined;\n}\n","export interface IStorage<\n T extends Record<string, unknown> = Record<string, unknown>,\n Key extends keyof T = keyof T,\n> {\n get(key: Key): T[Key] | undefined;\n set(key: Key, value?: T[Key]): void;\n delete(key: Key): void;\n}\n\nexport abstract class BaseStorage<\n T extends Record<string, unknown> = Record<string, unknown>,\n Key extends keyof T = keyof T,\n> implements IStorage<T> {\n abstract get(key: Key): T[Key] | undefined;\n abstract set(key: Key, value?: T[Key]): void;\n abstract delete(key: Key): void;\n}\n\nexport class MemoryStorage<\n T extends Record<string, unknown> = Record<string, unknown>,\n Key extends keyof T = keyof T,\n> extends BaseStorage<T> {\n private readonly data = new Map<Key, T[Key]>();\n\n get(key: Key) {\n return this.data.get(key);\n }\n\n set(key: Key, value?: T[Key]): void {\n if (value === undefined) {\n this.data.delete(key);\n } else {\n this.data.set(key, value);\n }\n }\n\n delete(key: Key): void {\n this.data.delete(key);\n }\n}\n","import { DEFAULT_RENOWN_URL } from \"./constants.js\";\nimport { RenownCryptoSigner, type IRenownCrypto } from \"./crypto/index.js\";\nimport { MemoryStorage } from \"./storage/common.js\";\nimport type {\n CreateBearerTokenOptions,\n IRenown,\n ISigner,\n LoginStatus,\n PowerhouseVerifiableCredential,\n ProfileFetcher,\n RenownEventEmitter,\n RenownEvents,\n RenownStorage,\n RenownStorageMap,\n User,\n} from \"./types.js\";\nimport { parsePkhDid, verifyAuthBearerToken } from \"./utils.js\";\nexport * from \"./constants.js\";\n\nexport class RenownMemoryStorage extends MemoryStorage<RenownStorageMap> {}\n\nexport class Renown implements IRenown {\n #baseUrl: string;\n #store: RenownStorage;\n #eventEmitter: RenownEventEmitter;\n #appName: string;\n #crypto: IRenownCrypto;\n #signer: ISigner;\n #profileFetcher?: ProfileFetcher;\n #status: LoginStatus = \"initial\";\n\n constructor(\n store: RenownStorage,\n eventEmitter: RenownEventEmitter,\n crypto: IRenownCrypto,\n appName: string,\n baseUrl = DEFAULT_RENOWN_URL,\n profileFetcher?: ProfileFetcher,\n ) {\n this.#store = store;\n this.#eventEmitter = eventEmitter;\n this.#baseUrl = baseUrl;\n this.#crypto = crypto;\n this.#appName = appName;\n this.#profileFetcher = profileFetcher;\n this.#signer = new RenownCryptoSigner(crypto, this.#appName, this.user);\n\n this.on(\"user\", (user) => {\n this.#signer.user = user;\n });\n }\n\n get baseUrl() {\n return this.#baseUrl;\n }\n\n get user() {\n return this.#store.get(\"user\");\n }\n\n get status() {\n return this.#status;\n }\n\n get signer() {\n return this.#signer;\n }\n\n get crypto() {\n return this.#crypto;\n }\n\n get did() {\n return this.#crypto.did;\n }\n\n get profileFetcher() {\n return this.#profileFetcher;\n }\n\n #updateStatus(status: LoginStatus) {\n this.#status = status;\n this.#eventEmitter.emit(\"status\", status);\n }\n\n #updateUser(user: User | undefined) {\n if (user) {\n this.#store.set(\"user\", user);\n } else {\n this.#store.delete(\"user\");\n }\n this.#eventEmitter.emit(\"user\", user);\n }\n\n async login(userDid: string): Promise<User> {\n this.#updateStatus(\"checking\");\n try {\n const result = parsePkhDid(userDid);\n const credential = await this.#getCredential(\n result.address,\n result.chainId,\n this.#crypto.did,\n );\n\n if (!credential) {\n this.#updateUser(undefined);\n throw new Error(\"Credential not found\");\n }\n\n if (\n !(\n credential.issuer.id === userDid &&\n credential.credentialSubject.id === this.did\n )\n ) {\n throw new Error(\"Invalid credential\");\n }\n\n const user: User = {\n ...result,\n address: credential.issuer.ethereumAddress,\n did: userDid,\n credential,\n };\n\n this.#updateUser(user);\n this.#updateStatus(\"authorized\");\n\n // Fetch profile data in the background if a fetcher is configured\n if (this.#profileFetcher) {\n this.#profileFetcher(user, this.#baseUrl)\n .then((profile) => {\n if (\n profile &&\n this.user?.address === user.address &&\n this.user.chainId === user.chainId\n ) {\n this.#updateUser({\n ...this.user,\n profile,\n ens: {\n name: profile.username ?? undefined,\n avatarUrl: profile.userImage ?? undefined,\n },\n });\n }\n })\n .catch(console.error);\n }\n\n return user;\n } catch (error) {\n this.#updateUser(undefined);\n this.#updateStatus(\"not-authorized\");\n throw error;\n }\n }\n\n logout() {\n this.#updateUser(undefined);\n this.#updateStatus(\"initial\");\n return Promise.resolve();\n }\n\n on<K extends keyof RenownEvents>(\n event: K,\n listener: (data: RenownEvents[K]) => void,\n ): () => void {\n return this.#eventEmitter.on(event, listener);\n }\n\n async #getCredential(\n address: string,\n chainId: number,\n appDid: string,\n ): Promise<PowerhouseVerifiableCredential | undefined> {\n if (!this.#baseUrl) {\n throw new Error(\"RENOWN_URL is not set\");\n }\n const url = new URL(\n `/api/auth/credential?address=${encodeURIComponent(address)}&chainId=${encodeURIComponent(chainId)}&connectId=${encodeURIComponent(appDid)}&appId=${encodeURIComponent(appDid)}`,\n this.#baseUrl,\n );\n const response = await fetch(url, {\n method: \"GET\",\n });\n if (response.ok) {\n const result = (await response.json()) as {\n credential: PowerhouseVerifiableCredential;\n };\n return result.credential;\n } else {\n throw new Error(`Failed to get credential: ${response.status}`);\n }\n }\n\n async verifyBearerToken(token: string) {\n return verifyAuthBearerToken(token);\n }\n\n async getBearerToken(options: CreateBearerTokenOptions) {\n if (!this.user) {\n throw new Error(\"User not found\");\n }\n return this.#crypto.getBearerToken(this.user.address, options);\n }\n}\n","import type { RenownEvents } from \"../types.js\";\nimport type { IEventEmitter } from \"./types.js\";\n\nexport class MemoryEventEmitter implements IEventEmitter<RenownEvents> {\n #listeners = new Map<keyof RenownEvents, Set<(data: unknown) => void>>();\n\n on<K extends keyof RenownEvents>(\n event: K,\n listener: (data: RenownEvents[K]) => void,\n ): () => void {\n if (!this.#listeners.has(event)) {\n this.#listeners.set(event, new Set());\n }\n this.#listeners.get(event)!.add(listener as (data: unknown) => void);\n return () => {\n this.#listeners.get(event)?.delete(listener as (data: unknown) => void);\n };\n }\n\n emit<K extends keyof RenownEvents>(event: K, data: RenownEvents[K]): void {\n this.#listeners.get(event)?.forEach((listener) => listener(data));\n }\n}\n","import type { ProfileFetcher, RenownProfile } from \"./types.js\";\n\nexport const fetchRenownProfile: ProfileFetcher = async (user, baseUrl) => {\n try {\n const response = await fetch(`${baseUrl}/api/profile`, {\n method: \"POST\",\n headers: {\n \"Content-Type\": \"application/json\",\n },\n body: JSON.stringify({\n ethAddress: user.address,\n }),\n });\n\n if (!response.ok) {\n return undefined;\n }\n\n const result = (await response.json()) as {\n profile?: RenownProfile;\n };\n\n return result.profile ?? undefined;\n } catch {\n return undefined;\n }\n};\n","import { Renown, RenownMemoryStorage } from \"./common.js\";\nimport { DEFAULT_RENOWN_URL } from \"./constants.js\";\nimport { RenownCryptoBuilder } from \"./crypto/renown-crypto-builder.js\";\nimport type { IRenownCrypto, JsonWebKeyPairStorage } from \"./crypto/types.js\";\nimport { MemoryEventEmitter } from \"./event/memory.js\";\nimport { fetchRenownProfile } from \"./profile.js\";\nimport type {\n ProfileFetcher,\n RenownEventEmitter,\n RenownStorage,\n} from \"./types.js\";\n\nexport interface RenownBuilderOptions {\n appName: string;\n storage?: RenownStorage;\n eventEmitter?: RenownEventEmitter;\n crypto?: IRenownCrypto;\n keyPairStorage?: JsonWebKeyPairStorage;\n baseUrl?: string;\n profileFetcher?: ProfileFetcher;\n}\n\n/**\n * Base builder for creating Renown instances.\n * Use platform-specific builders (RenownBuilder from init.browser.js or init.node.js)\n * for pre-configured defaults.\n */\nexport class BaseRenownBuilder {\n #appName: string;\n #storage?: RenownStorage;\n #eventEmitter?: RenownEventEmitter;\n #crypto?: IRenownCrypto;\n #keyPairStorage?: JsonWebKeyPairStorage;\n #baseUrl?: string;\n #profileFetcher?: ProfileFetcher;\n\n /**\n * @param appName - Application name used for signing context\n */\n constructor(appName: string) {\n this.#appName = appName;\n }\n\n /**\n * Set custom storage for user data persistence.\n * Defaults to in-memory storage if not set.\n */\n withStorage(storage: RenownStorage): this {\n this.#storage = storage;\n return this;\n }\n\n /**\n * Set custom event emitter for user state changes.\n * Defaults to in-memory event emitter if not set.\n */\n withEventEmitter(eventEmitter: RenownEventEmitter): this {\n this.#eventEmitter = eventEmitter;\n return this;\n }\n\n /**\n * Set a pre-built crypto instance.\n * Either crypto or keyPairStorage must be provided.\n */\n withCrypto(crypto: IRenownCrypto): this {\n this.#crypto = crypto;\n return this;\n }\n\n /**\n * Set key pair storage for cryptographic keys.\n * A crypto instance will be built from this storage.\n * Either crypto or keyPairStorage must be provided.\n */\n withKeyPairStorage(keyPairStorage: JsonWebKeyPairStorage): this {\n this.#keyPairStorage = keyPairStorage;\n return this;\n }\n\n /**\n * Set the Renown server URL for credential verification.\n * Defaults to https://www.renown.id\n */\n withBaseUrl(baseUrl: string): this {\n this.#baseUrl = baseUrl;\n return this;\n }\n\n /**\n * Set a profile fetcher strategy for enriching user data after login.\n * The fetcher receives the authenticated user and the base URL,\n * and returns a RenownProfile. Called in the background after each login.\n * Defaults to fetchRenownProfile which calls the Renown API.\n */\n withProfileFetcher(profileFetcher: ProfileFetcher): this {\n this.#profileFetcher = profileFetcher;\n return this;\n }\n\n /**\n * Build and initialize the Renown instance.\n * If a user is stored, attempts to re-authenticate them.\n * @throws Error if neither crypto nor keyPairStorage is provided\n */\n async build(): Promise<Renown> {\n if (!this.#crypto && !this.#keyPairStorage) {\n throw new Error(\n \"Either crypto or keyPairStorage is required. Use withCrypto() or withKeyPairStorage() to set one.\",\n );\n }\n\n const crypto =\n this.#crypto ??\n (await new RenownCryptoBuilder()\n .withKeyPairStorage(this.#keyPairStorage!)\n .build());\n\n const storage = this.#storage ?? new RenownMemoryStorage();\n const eventEmitter = this.#eventEmitter ?? new MemoryEventEmitter();\n const baseUrl = this.#baseUrl ?? DEFAULT_RENOWN_URL;\n\n const renown = new Renown(\n storage,\n eventEmitter,\n crypto,\n this.#appName,\n baseUrl,\n this.#profileFetcher ?? fetchRenownProfile,\n );\n\n // Re-authenticate stored user if present\n if (renown.user) {\n try {\n await renown.login(renown.user.did);\n } catch (error) {\n console.error(\"Failed to re-authenticate user:\", error);\n }\n }\n\n return renown;\n }\n\n /**\n * Create a BaseRenownBuilder from options object for a more concise API\n */\n static from(options: RenownBuilderOptions): BaseRenownBuilder {\n const builder = new BaseRenownBuilder(options.appName);\n\n if (options.storage) {\n builder.withStorage(options.storage);\n }\n if (options.eventEmitter) {\n builder.withEventEmitter(options.eventEmitter);\n }\n if (options.crypto) {\n builder.withCrypto(options.crypto);\n }\n if (options.keyPairStorage) {\n builder.withKeyPairStorage(options.keyPairStorage);\n }\n if (options.baseUrl) {\n builder.withBaseUrl(options.baseUrl);\n }\n if (options.profileFetcher) {\n builder.withProfileFetcher(options.profileFetcher);\n }\n\n return builder;\n }\n}\n"],"mappings":"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"}
|
|
@@ -0,0 +1,548 @@
|
|
|
1
|
+
import { Issuer, Verifiable, VerifiedCredential } from "did-jwt-vc";
|
|
2
|
+
import { Resolver } from "did-resolver";
|
|
3
|
+
import { Action, AppActionSigner, ISigner, ISigner as ISigner$1, Signature, SignatureVerificationHandler, User, UserActionSigner } from "@powerhousedao/shared/document-model";
|
|
4
|
+
|
|
5
|
+
//#region src/constants.d.ts
|
|
6
|
+
declare const DEFAULT_RENOWN_URL = "https://www.renown.id";
|
|
7
|
+
declare const DEFAULT_RENOWN_NETWORK_ID = "eip155";
|
|
8
|
+
declare const DEFAULT_RENOWN_CHAIN_ID = "1";
|
|
9
|
+
declare const DOMAIN_TYPE: readonly [{
|
|
10
|
+
readonly name: "name";
|
|
11
|
+
readonly type: "string";
|
|
12
|
+
}, {
|
|
13
|
+
readonly name: "version";
|
|
14
|
+
readonly type: "string";
|
|
15
|
+
}, {
|
|
16
|
+
readonly name: "chainId";
|
|
17
|
+
readonly type: "uint256";
|
|
18
|
+
}, {
|
|
19
|
+
readonly name: "verifyingContract";
|
|
20
|
+
readonly type: "address";
|
|
21
|
+
}];
|
|
22
|
+
declare const VERIFIABLE_CREDENTIAL_EIP712_TYPE: readonly [{
|
|
23
|
+
readonly name: "@context";
|
|
24
|
+
readonly type: "string[]";
|
|
25
|
+
}, {
|
|
26
|
+
readonly name: "type";
|
|
27
|
+
readonly type: "string[]";
|
|
28
|
+
}, {
|
|
29
|
+
readonly name: "id";
|
|
30
|
+
readonly type: "string";
|
|
31
|
+
}, {
|
|
32
|
+
readonly name: "issuer";
|
|
33
|
+
readonly type: "Issuer";
|
|
34
|
+
}, {
|
|
35
|
+
readonly name: "credentialSubject";
|
|
36
|
+
readonly type: "CredentialSubject";
|
|
37
|
+
}, {
|
|
38
|
+
readonly name: "credentialSchema";
|
|
39
|
+
readonly type: "CredentialSchema";
|
|
40
|
+
}, {
|
|
41
|
+
readonly name: "issuanceDate";
|
|
42
|
+
readonly type: "string";
|
|
43
|
+
}, {
|
|
44
|
+
readonly name: "expirationDate";
|
|
45
|
+
readonly type: "string";
|
|
46
|
+
}];
|
|
47
|
+
declare const CREDENTIAL_SCHEMA_EIP712_TYPE: readonly [{
|
|
48
|
+
readonly name: "id";
|
|
49
|
+
readonly type: "string";
|
|
50
|
+
}, {
|
|
51
|
+
readonly name: "type";
|
|
52
|
+
readonly type: "string";
|
|
53
|
+
}];
|
|
54
|
+
declare const CREDENTIAL_SUBJECT_TYPE: readonly [{
|
|
55
|
+
readonly name: "app";
|
|
56
|
+
readonly type: "string";
|
|
57
|
+
}, {
|
|
58
|
+
readonly name: "id";
|
|
59
|
+
readonly type: "string";
|
|
60
|
+
}, {
|
|
61
|
+
readonly name: "name";
|
|
62
|
+
readonly type: "string";
|
|
63
|
+
}];
|
|
64
|
+
declare const ISSUER_TYPE: readonly [{
|
|
65
|
+
readonly name: "id";
|
|
66
|
+
readonly type: "string";
|
|
67
|
+
}, {
|
|
68
|
+
readonly name: "ethereumAddress";
|
|
69
|
+
readonly type: "string";
|
|
70
|
+
}];
|
|
71
|
+
declare const CREDENTIAL_TYPES: {
|
|
72
|
+
readonly EIP712Domain: readonly [{
|
|
73
|
+
readonly name: "name";
|
|
74
|
+
readonly type: "string";
|
|
75
|
+
}, {
|
|
76
|
+
readonly name: "version";
|
|
77
|
+
readonly type: "string";
|
|
78
|
+
}, {
|
|
79
|
+
readonly name: "chainId";
|
|
80
|
+
readonly type: "uint256";
|
|
81
|
+
}, {
|
|
82
|
+
readonly name: "verifyingContract";
|
|
83
|
+
readonly type: "address";
|
|
84
|
+
}];
|
|
85
|
+
readonly VerifiableCredential: readonly [{
|
|
86
|
+
readonly name: "@context";
|
|
87
|
+
readonly type: "string[]";
|
|
88
|
+
}, {
|
|
89
|
+
readonly name: "type";
|
|
90
|
+
readonly type: "string[]";
|
|
91
|
+
}, {
|
|
92
|
+
readonly name: "id";
|
|
93
|
+
readonly type: "string";
|
|
94
|
+
}, {
|
|
95
|
+
readonly name: "issuer";
|
|
96
|
+
readonly type: "Issuer";
|
|
97
|
+
}, {
|
|
98
|
+
readonly name: "credentialSubject";
|
|
99
|
+
readonly type: "CredentialSubject";
|
|
100
|
+
}, {
|
|
101
|
+
readonly name: "credentialSchema";
|
|
102
|
+
readonly type: "CredentialSchema";
|
|
103
|
+
}, {
|
|
104
|
+
readonly name: "issuanceDate";
|
|
105
|
+
readonly type: "string";
|
|
106
|
+
}, {
|
|
107
|
+
readonly name: "expirationDate";
|
|
108
|
+
readonly type: "string";
|
|
109
|
+
}];
|
|
110
|
+
readonly CredentialSchema: readonly [{
|
|
111
|
+
readonly name: "id";
|
|
112
|
+
readonly type: "string";
|
|
113
|
+
}, {
|
|
114
|
+
readonly name: "type";
|
|
115
|
+
readonly type: "string";
|
|
116
|
+
}];
|
|
117
|
+
readonly CredentialSubject: readonly [{
|
|
118
|
+
readonly name: "app";
|
|
119
|
+
readonly type: "string";
|
|
120
|
+
}, {
|
|
121
|
+
readonly name: "id";
|
|
122
|
+
readonly type: "string";
|
|
123
|
+
}, {
|
|
124
|
+
readonly name: "name";
|
|
125
|
+
readonly type: "string";
|
|
126
|
+
}];
|
|
127
|
+
readonly Issuer: readonly [{
|
|
128
|
+
readonly name: "id";
|
|
129
|
+
readonly type: "string";
|
|
130
|
+
}, {
|
|
131
|
+
readonly name: "ethereumAddress";
|
|
132
|
+
readonly type: "string";
|
|
133
|
+
}];
|
|
134
|
+
};
|
|
135
|
+
//#endregion
|
|
136
|
+
//#region src/crypto/types.d.ts
|
|
137
|
+
type JwkKeyPair = {
|
|
138
|
+
publicKey: JsonWebKey;
|
|
139
|
+
privateKey: JsonWebKey;
|
|
140
|
+
};
|
|
141
|
+
interface JsonWebKeyPairStorage {
|
|
142
|
+
loadKeyPair(): Promise<JwkKeyPair | undefined>;
|
|
143
|
+
saveKeyPair(keyPair: JwkKeyPair): Promise<void>;
|
|
144
|
+
removeKeyPair(): Promise<void>;
|
|
145
|
+
}
|
|
146
|
+
type DID = `did:${string}`;
|
|
147
|
+
interface IRenownCrypto {
|
|
148
|
+
did: DID;
|
|
149
|
+
publicKey: CryptoKey;
|
|
150
|
+
removeDid(): Promise<void>;
|
|
151
|
+
sign: (data: Uint8Array) => Promise<Uint8Array>;
|
|
152
|
+
verify: (data: Uint8Array, signature: Uint8Array) => Promise<boolean>;
|
|
153
|
+
issuer: Issuer;
|
|
154
|
+
getBearerToken: (address: string | undefined, options?: CreateBearerTokenOptions) => Promise<string>;
|
|
155
|
+
}
|
|
156
|
+
/**
|
|
157
|
+
* @deprecated Use IRenownCrypto instead
|
|
158
|
+
*/
|
|
159
|
+
interface IConnectCrypto extends IRenownCrypto {}
|
|
160
|
+
//#endregion
|
|
161
|
+
//#region src/event/types.d.ts
|
|
162
|
+
interface IEventEmitter<Events extends Record<string, unknown>> {
|
|
163
|
+
/**
|
|
164
|
+
* Registers a listener for the specified event.
|
|
165
|
+
* @param event - The event name.
|
|
166
|
+
* @param listener - The listener function for the event.
|
|
167
|
+
* @returns A function to remove the listener.
|
|
168
|
+
*/
|
|
169
|
+
on<K extends keyof Events>(event: K, listener: (data: Events[K]) => void): () => void;
|
|
170
|
+
/**
|
|
171
|
+
* Emits an event with the specified data.
|
|
172
|
+
* @param event - The event name.
|
|
173
|
+
* @param data - The data to pass to listeners.
|
|
174
|
+
*/
|
|
175
|
+
emit<K extends keyof Events>(event: K, data: Events[K]): void;
|
|
176
|
+
}
|
|
177
|
+
//#endregion
|
|
178
|
+
//#region src/storage/common.d.ts
|
|
179
|
+
interface IStorage<T extends Record<string, unknown> = Record<string, unknown>, Key extends keyof T = keyof T> {
|
|
180
|
+
get(key: Key): T[Key] | undefined;
|
|
181
|
+
set(key: Key, value?: T[Key]): void;
|
|
182
|
+
delete(key: Key): void;
|
|
183
|
+
}
|
|
184
|
+
declare abstract class BaseStorage<T extends Record<string, unknown> = Record<string, unknown>, Key extends keyof T = keyof T> implements IStorage<T> {
|
|
185
|
+
abstract get(key: Key): T[Key] | undefined;
|
|
186
|
+
abstract set(key: Key, value?: T[Key]): void;
|
|
187
|
+
abstract delete(key: Key): void;
|
|
188
|
+
}
|
|
189
|
+
declare class MemoryStorage<T extends Record<string, unknown> = Record<string, unknown>, Key extends keyof T = keyof T> extends BaseStorage<T> {
|
|
190
|
+
private readonly data;
|
|
191
|
+
get(key: Key): T[Key] | undefined;
|
|
192
|
+
set(key: Key, value?: T[Key]): void;
|
|
193
|
+
delete(key: Key): void;
|
|
194
|
+
}
|
|
195
|
+
//#endregion
|
|
196
|
+
//#region src/types.d.ts
|
|
197
|
+
type RenownProfile = {
|
|
198
|
+
documentId: string;
|
|
199
|
+
username: string | null;
|
|
200
|
+
ethAddress: string | null;
|
|
201
|
+
userImage: string | null;
|
|
202
|
+
createdAt: string;
|
|
203
|
+
updatedAt: string;
|
|
204
|
+
};
|
|
205
|
+
type InternalUser = User & {
|
|
206
|
+
did: string;
|
|
207
|
+
credential: PowerhouseVerifiableCredential | undefined;
|
|
208
|
+
profile?: RenownProfile;
|
|
209
|
+
};
|
|
210
|
+
type User$1 = InternalUser;
|
|
211
|
+
/**
|
|
212
|
+
* Strategy function for fetching user profile data.
|
|
213
|
+
* Called after successful authentication to enrich the user object.
|
|
214
|
+
* Should return the user's Renown profile, or undefined if not available.
|
|
215
|
+
* Must not throw — return undefined on failure.
|
|
216
|
+
*/
|
|
217
|
+
type ProfileFetcher = (user: User$1, baseUrl: string) => Promise<RenownProfile | undefined>;
|
|
218
|
+
type Unsubscribe = () => void;
|
|
219
|
+
type LoginStatus = "initial" | "checking" | "authorized" | "not-authorized";
|
|
220
|
+
type RenownStorageMap = {
|
|
221
|
+
user: InternalUser | undefined;
|
|
222
|
+
};
|
|
223
|
+
type RenownStorage = IStorage<RenownStorageMap>;
|
|
224
|
+
type RenownEvents = {
|
|
225
|
+
user: User$1 | undefined;
|
|
226
|
+
status: LoginStatus;
|
|
227
|
+
};
|
|
228
|
+
type RenownEventEmitter = IEventEmitter<RenownEvents>;
|
|
229
|
+
interface IRenown extends Pick<RenownEventEmitter, "on"> {
|
|
230
|
+
readonly baseUrl: string;
|
|
231
|
+
readonly user: User$1 | undefined;
|
|
232
|
+
readonly status: LoginStatus;
|
|
233
|
+
login: (userDid: string) => Promise<User$1>;
|
|
234
|
+
logout: () => Promise<void>;
|
|
235
|
+
readonly crypto: IRenownCrypto;
|
|
236
|
+
readonly signer: ISigner$1;
|
|
237
|
+
readonly did: string;
|
|
238
|
+
readonly profileFetcher: ProfileFetcher | undefined;
|
|
239
|
+
verifyBearerToken: (token: string) => Promise<false | VerifiedCredential>;
|
|
240
|
+
getBearerToken: (options: CreateBearerTokenOptions, refresh?: boolean) => Promise<string>;
|
|
241
|
+
}
|
|
242
|
+
type IssuerType<T> = {
|
|
243
|
+
id: string;
|
|
244
|
+
} & T;
|
|
245
|
+
type CredentialSubjecType<T> = {
|
|
246
|
+
id?: string;
|
|
247
|
+
} & T;
|
|
248
|
+
interface CredentialStatus {
|
|
249
|
+
id: string;
|
|
250
|
+
type: string;
|
|
251
|
+
}
|
|
252
|
+
interface CredentialSchema {
|
|
253
|
+
id: string;
|
|
254
|
+
type: string;
|
|
255
|
+
}
|
|
256
|
+
interface IVerifiableCredentialPayload<Subject, Issuer> {
|
|
257
|
+
"@context": string[];
|
|
258
|
+
id: string;
|
|
259
|
+
type: string[];
|
|
260
|
+
issuer: IssuerType<Issuer>;
|
|
261
|
+
issuanceDate: string;
|
|
262
|
+
expirationDate?: string;
|
|
263
|
+
credentialSubject: CredentialSubjecType<Subject>;
|
|
264
|
+
credentialStatus?: CredentialStatus;
|
|
265
|
+
credentialSchema: CredentialSchema;
|
|
266
|
+
}
|
|
267
|
+
interface IProof {
|
|
268
|
+
verificationMethod: string;
|
|
269
|
+
ethereumAddress: `0x${string}`;
|
|
270
|
+
created: string;
|
|
271
|
+
proofPurpose: string;
|
|
272
|
+
type: string;
|
|
273
|
+
proofValue: string;
|
|
274
|
+
eip712: {
|
|
275
|
+
domain: {
|
|
276
|
+
name: string;
|
|
277
|
+
version: string;
|
|
278
|
+
chainId: number;
|
|
279
|
+
verifyingContract: string;
|
|
280
|
+
};
|
|
281
|
+
types: typeof CREDENTIAL_TYPES;
|
|
282
|
+
primaryType: "VerifiableCredential";
|
|
283
|
+
};
|
|
284
|
+
}
|
|
285
|
+
interface IVerifiableCredential<Subject, Issuer> extends IVerifiableCredentialPayload<Subject, Issuer> {
|
|
286
|
+
proof: IProof;
|
|
287
|
+
}
|
|
288
|
+
interface IPowerhouseCredentialSubject {
|
|
289
|
+
id: string;
|
|
290
|
+
app: string;
|
|
291
|
+
name?: string;
|
|
292
|
+
}
|
|
293
|
+
interface IPowerhouseIssuerType {
|
|
294
|
+
ethereumAddress: `0x${string}`;
|
|
295
|
+
}
|
|
296
|
+
type PowerhouseVerifiableCredential = IVerifiableCredential<IPowerhouseCredentialSubject, IPowerhouseIssuerType>;
|
|
297
|
+
interface IAuthCredentialSubject {
|
|
298
|
+
chainId: number;
|
|
299
|
+
networkId: string;
|
|
300
|
+
address: string;
|
|
301
|
+
}
|
|
302
|
+
type AuthVerifiableCredential = IVerifiableCredential<IAuthCredentialSubject, {}>;
|
|
303
|
+
type AuthVerifiedCredential = VerifiedCredential & {
|
|
304
|
+
verifiableCredential: Verifiable<AuthVerifiableCredential>;
|
|
305
|
+
};
|
|
306
|
+
type PKHDid = {
|
|
307
|
+
networkId: string;
|
|
308
|
+
chainId: number;
|
|
309
|
+
address: `0x${string}`;
|
|
310
|
+
};
|
|
311
|
+
interface CreateBearerTokenOptions {
|
|
312
|
+
expiresIn?: number;
|
|
313
|
+
aud?: string;
|
|
314
|
+
}
|
|
315
|
+
//#endregion
|
|
316
|
+
//#region src/crypto/renown-crypto.d.ts
|
|
317
|
+
declare class RenownCrypto implements IRenownCrypto {
|
|
318
|
+
#private;
|
|
319
|
+
readonly did: DID;
|
|
320
|
+
static algorithm: EcKeyAlgorithm;
|
|
321
|
+
static signAlgorithm: {
|
|
322
|
+
name: string;
|
|
323
|
+
namedCurve: string;
|
|
324
|
+
hash: string;
|
|
325
|
+
};
|
|
326
|
+
constructor(keyPairStorage: JsonWebKeyPairStorage, crypto: SubtleCrypto, keyPair: CryptoKeyPair, did: DID);
|
|
327
|
+
get publicKey(): CryptoKey;
|
|
328
|
+
getBearerToken(address: string | undefined, options?: CreateBearerTokenOptions): Promise<string>;
|
|
329
|
+
removeDid(): Promise<void>;
|
|
330
|
+
sign(data: Uint8Array | string): Promise<Uint8Array>;
|
|
331
|
+
verify(data: Uint8Array, signature: Uint8Array): Promise<boolean>;
|
|
332
|
+
get issuer(): Issuer;
|
|
333
|
+
}
|
|
334
|
+
/**
|
|
335
|
+
* @deprecated Use RenownCrypto instead
|
|
336
|
+
*/
|
|
337
|
+
declare class ConnectCrypto extends RenownCrypto {}
|
|
338
|
+
//#endregion
|
|
339
|
+
//#region src/crypto/renown-crypto-builder.d.ts
|
|
340
|
+
declare class RenownCryptoBuilder {
|
|
341
|
+
#private;
|
|
342
|
+
private keyPairStorage?;
|
|
343
|
+
private subtleCrypto?;
|
|
344
|
+
withKeyPairStorage(storage: JsonWebKeyPairStorage): this;
|
|
345
|
+
withSubtleCrypto(crypto: SubtleCrypto): this;
|
|
346
|
+
build(): Promise<RenownCrypto>;
|
|
347
|
+
}
|
|
348
|
+
//#endregion
|
|
349
|
+
//#region src/crypto/memory-key-storage.d.ts
|
|
350
|
+
declare class MemoryKeyStorage implements JsonWebKeyPairStorage {
|
|
351
|
+
private keyPair;
|
|
352
|
+
constructor(keyPair?: JwkKeyPair);
|
|
353
|
+
loadKeyPair(): Promise<JwkKeyPair | undefined>;
|
|
354
|
+
saveKeyPair(keyPair: JwkKeyPair): Promise<void>;
|
|
355
|
+
removeKeyPair(): Promise<void>;
|
|
356
|
+
}
|
|
357
|
+
//#endregion
|
|
358
|
+
//#region src/crypto/signer.d.ts
|
|
359
|
+
declare class RenownCryptoSigner implements ISigner {
|
|
360
|
+
private readonly crypto;
|
|
361
|
+
private readonly appName;
|
|
362
|
+
user?: UserActionSigner | undefined;
|
|
363
|
+
readonly app: AppActionSigner;
|
|
364
|
+
constructor(crypto: IRenownCrypto, appName: string, user?: UserActionSigner | undefined);
|
|
365
|
+
get publicKey(): CryptoKey;
|
|
366
|
+
sign(data: Uint8Array): Promise<Uint8Array>;
|
|
367
|
+
verify(data: Uint8Array, signature: Uint8Array): Promise<void>;
|
|
368
|
+
signAction(action: Action, abortSignal?: AbortSignal): Promise<Signature>;
|
|
369
|
+
/**
|
|
370
|
+
* Signs an action including a predicted resulting state hash.
|
|
371
|
+
*
|
|
372
|
+
* The resulting hash is packed into the signature tuple's 4th element (index 3)
|
|
373
|
+
* using the format: `${prevStateHash}:${resultingStateHash}`
|
|
374
|
+
*
|
|
375
|
+
* This allows offline verification of documents without reducer logic:
|
|
376
|
+
* - Verifier can check that the signature is valid for the claimed resulting state
|
|
377
|
+
* - Verifier can compare claimed resulting state to actual operation.hash
|
|
378
|
+
*
|
|
379
|
+
* @param action - The action to sign
|
|
380
|
+
* @param resultingStateHash - The predicted hash of document state AFTER this action runs
|
|
381
|
+
* @param abortSignal - Optional abort signal
|
|
382
|
+
* @returns A Signature tuple with the resulting hash encoded in element [3]
|
|
383
|
+
*/
|
|
384
|
+
signActionWithResultingState(action: Action, resultingStateHash: string, abortSignal?: AbortSignal): Promise<Signature>;
|
|
385
|
+
/**
|
|
386
|
+
* Internal signing implementation shared by signAction and signActionWithResultingState.
|
|
387
|
+
*/
|
|
388
|
+
private _signAction;
|
|
389
|
+
private hashAction;
|
|
390
|
+
private buildSignatureMessage;
|
|
391
|
+
private arrayBufferToHex;
|
|
392
|
+
private arrayBufferToBase64;
|
|
393
|
+
}
|
|
394
|
+
/**
|
|
395
|
+
* Creates a signature verification handler that verifies signatures using the Web Crypto API.
|
|
396
|
+
* The verification uses ECDSA with P-256 curve and SHA-256 hash, matching the RenownCrypto signing algorithm.
|
|
397
|
+
*/
|
|
398
|
+
declare function createSignatureVerifier(requireSignature?: boolean): SignatureVerificationHandler;
|
|
399
|
+
/**
|
|
400
|
+
* Parses the hash field (element [3]) from a signature tuple.
|
|
401
|
+
*
|
|
402
|
+
* Supports two formats:
|
|
403
|
+
* - Old format: just `prevStateHash` (no colon)
|
|
404
|
+
* - New format: `prevStateHash:resultingStateHash` (colon-separated)
|
|
405
|
+
*
|
|
406
|
+
* @param hashField - The 4th element of a Signature tuple
|
|
407
|
+
* @returns Object with prevStateHash and optional resultingStateHash
|
|
408
|
+
*/
|
|
409
|
+
declare function parseSignatureHashField(hashField: string): {
|
|
410
|
+
prevStateHash: string;
|
|
411
|
+
resultingStateHash: string | undefined;
|
|
412
|
+
};
|
|
413
|
+
/**
|
|
414
|
+
* Extracts the resulting state hash from a signature, if present.
|
|
415
|
+
*
|
|
416
|
+
* @param signature - A Signature tuple
|
|
417
|
+
* @returns The resulting state hash, or undefined if not present
|
|
418
|
+
*/
|
|
419
|
+
declare function extractResultingHashFromSignature(signature: Signature): string | undefined;
|
|
420
|
+
/**
|
|
421
|
+
* Checks if a signature includes a resulting state hash.
|
|
422
|
+
*
|
|
423
|
+
* @param signature - A Signature tuple
|
|
424
|
+
* @returns true if the signature includes a resulting state hash
|
|
425
|
+
*/
|
|
426
|
+
declare function signatureHasResultingHash(signature: Signature): boolean;
|
|
427
|
+
//#endregion
|
|
428
|
+
//#region src/crypto/browser-key-storage.d.ts
|
|
429
|
+
declare class BrowserKeyStorage implements JsonWebKeyPairStorage {
|
|
430
|
+
#private;
|
|
431
|
+
constructor(db: IDBDatabase);
|
|
432
|
+
static create(dbName?: string): Promise<BrowserKeyStorage>;
|
|
433
|
+
saveKeyPair(keyPair: JwkKeyPair): Promise<void>;
|
|
434
|
+
loadKeyPair(): Promise<JwkKeyPair | undefined>;
|
|
435
|
+
removeKeyPair(): Promise<void>;
|
|
436
|
+
}
|
|
437
|
+
//#endregion
|
|
438
|
+
//#region src/common.d.ts
|
|
439
|
+
declare class RenownMemoryStorage extends MemoryStorage<RenownStorageMap> {}
|
|
440
|
+
declare class Renown implements IRenown {
|
|
441
|
+
#private;
|
|
442
|
+
constructor(store: RenownStorage, eventEmitter: RenownEventEmitter, crypto: IRenownCrypto, appName: string, baseUrl?: string, profileFetcher?: ProfileFetcher);
|
|
443
|
+
get baseUrl(): string;
|
|
444
|
+
get user(): InternalUser | undefined;
|
|
445
|
+
get status(): LoginStatus;
|
|
446
|
+
get signer(): ISigner$1;
|
|
447
|
+
get crypto(): IRenownCrypto;
|
|
448
|
+
get did(): `did:${string}`;
|
|
449
|
+
get profileFetcher(): ProfileFetcher | undefined;
|
|
450
|
+
login(userDid: string): Promise<User$1>;
|
|
451
|
+
logout(): Promise<void>;
|
|
452
|
+
on<K extends keyof RenownEvents>(event: K, listener: (data: RenownEvents[K]) => void): () => void;
|
|
453
|
+
verifyBearerToken(token: string): Promise<false | AuthVerifiedCredential>;
|
|
454
|
+
getBearerToken(options: CreateBearerTokenOptions): Promise<string>;
|
|
455
|
+
}
|
|
456
|
+
//#endregion
|
|
457
|
+
//#region src/renown-builder.d.ts
|
|
458
|
+
interface RenownBuilderOptions {
|
|
459
|
+
appName: string;
|
|
460
|
+
storage?: RenownStorage;
|
|
461
|
+
eventEmitter?: RenownEventEmitter;
|
|
462
|
+
crypto?: IRenownCrypto;
|
|
463
|
+
keyPairStorage?: JsonWebKeyPairStorage;
|
|
464
|
+
baseUrl?: string;
|
|
465
|
+
profileFetcher?: ProfileFetcher;
|
|
466
|
+
}
|
|
467
|
+
/**
|
|
468
|
+
* Base builder for creating Renown instances.
|
|
469
|
+
* Use platform-specific builders (RenownBuilder from init.browser.js or init.node.js)
|
|
470
|
+
* for pre-configured defaults.
|
|
471
|
+
*/
|
|
472
|
+
declare class BaseRenownBuilder {
|
|
473
|
+
#private;
|
|
474
|
+
/**
|
|
475
|
+
* @param appName - Application name used for signing context
|
|
476
|
+
*/
|
|
477
|
+
constructor(appName: string);
|
|
478
|
+
/**
|
|
479
|
+
* Set custom storage for user data persistence.
|
|
480
|
+
* Defaults to in-memory storage if not set.
|
|
481
|
+
*/
|
|
482
|
+
withStorage(storage: RenownStorage): this;
|
|
483
|
+
/**
|
|
484
|
+
* Set custom event emitter for user state changes.
|
|
485
|
+
* Defaults to in-memory event emitter if not set.
|
|
486
|
+
*/
|
|
487
|
+
withEventEmitter(eventEmitter: RenownEventEmitter): this;
|
|
488
|
+
/**
|
|
489
|
+
* Set a pre-built crypto instance.
|
|
490
|
+
* Either crypto or keyPairStorage must be provided.
|
|
491
|
+
*/
|
|
492
|
+
withCrypto(crypto: IRenownCrypto): this;
|
|
493
|
+
/**
|
|
494
|
+
* Set key pair storage for cryptographic keys.
|
|
495
|
+
* A crypto instance will be built from this storage.
|
|
496
|
+
* Either crypto or keyPairStorage must be provided.
|
|
497
|
+
*/
|
|
498
|
+
withKeyPairStorage(keyPairStorage: JsonWebKeyPairStorage): this;
|
|
499
|
+
/**
|
|
500
|
+
* Set the Renown server URL for credential verification.
|
|
501
|
+
* Defaults to https://www.renown.id
|
|
502
|
+
*/
|
|
503
|
+
withBaseUrl(baseUrl: string): this;
|
|
504
|
+
/**
|
|
505
|
+
* Set a profile fetcher strategy for enriching user data after login.
|
|
506
|
+
* The fetcher receives the authenticated user and the base URL,
|
|
507
|
+
* and returns a RenownProfile. Called in the background after each login.
|
|
508
|
+
* Defaults to fetchRenownProfile which calls the Renown API.
|
|
509
|
+
*/
|
|
510
|
+
withProfileFetcher(profileFetcher: ProfileFetcher): this;
|
|
511
|
+
/**
|
|
512
|
+
* Build and initialize the Renown instance.
|
|
513
|
+
* If a user is stored, attempts to re-authenticate them.
|
|
514
|
+
* @throws Error if neither crypto nor keyPairStorage is provided
|
|
515
|
+
*/
|
|
516
|
+
build(): Promise<Renown>;
|
|
517
|
+
/**
|
|
518
|
+
* Create a BaseRenownBuilder from options object for a more concise API
|
|
519
|
+
*/
|
|
520
|
+
static from(options: RenownBuilderOptions): BaseRenownBuilder;
|
|
521
|
+
}
|
|
522
|
+
//#endregion
|
|
523
|
+
//#region src/profile.d.ts
|
|
524
|
+
declare const fetchRenownProfile: ProfileFetcher;
|
|
525
|
+
//#endregion
|
|
526
|
+
//#region src/utils.d.ts
|
|
527
|
+
type ILogger = {
|
|
528
|
+
level: "verbose" | "debug" | "info" | "warn" | "error";
|
|
529
|
+
verbose: (message: string, ...replacements: any[]) => void;
|
|
530
|
+
debug: (message: string, ...replacements: any[]) => void;
|
|
531
|
+
info: (message: string, ...replacements: any[]) => void;
|
|
532
|
+
warn: (message: string, ...replacements: any[]) => void;
|
|
533
|
+
error: (message: string, ...replacements: any[]) => void;
|
|
534
|
+
};
|
|
535
|
+
/**
|
|
536
|
+
* Parse a DID:pkh string to extract network, chain ID, and address information
|
|
537
|
+
* @param did - The DID string in format "did:pkh:networkId:chainId:address"
|
|
538
|
+
* @returns Parsed DID information
|
|
539
|
+
* @throws Error if the DID format is invalid
|
|
540
|
+
*/
|
|
541
|
+
declare function parsePkhDid(did: string): PKHDid;
|
|
542
|
+
declare function verifyAuthBearerToken(jwt: string): Promise<false | AuthVerifiedCredential>;
|
|
543
|
+
declare function assertIsAuthCredential(credential: VerifiedCredential): asserts credential is AuthVerifiedCredential;
|
|
544
|
+
declare function createAuthBearerToken(chainId: number, networkId: string, address: string, issuer: Issuer, options?: CreateBearerTokenOptions): Promise<string>;
|
|
545
|
+
declare const getResolver: () => Resolver;
|
|
546
|
+
//#endregion
|
|
547
|
+
export { CREDENTIAL_TYPES as $, ISigner$1 as A, RenownStorage as B, AuthVerifiedCredential as C, IPowerhouseIssuerType as D, IPowerhouseCredentialSubject as E, PowerhouseVerifiableCredential as F, IEventEmitter as G, Unsubscribe as H, ProfileFetcher as I, IRenownCrypto as J, DID as K, RenownEventEmitter as L, InternalUser as M, LoginStatus as N, IProof as O, PKHDid as P, CREDENTIAL_SUBJECT_TYPE as Q, RenownEvents as R, AuthVerifiableCredential as S, IAuthCredentialSubject as T, User$1 as U, RenownStorageMap as V, BaseStorage as W, JwkKeyPair as X, JsonWebKeyPairStorage as Y, CREDENTIAL_SCHEMA_EIP712_TYPE as Z, signatureHasResultingHash as _, parsePkhDid as a, VERIFIABLE_CREDENTIAL_EIP712_TYPE as at, ConnectCrypto as b, BaseRenownBuilder as c, RenownMemoryStorage as d, DEFAULT_RENOWN_CHAIN_ID as et, BrowserKeyStorage as f, parseSignatureHashField as g, extractResultingHashFromSignature as h, getResolver as i, ISSUER_TYPE as it, IVerifiableCredential as j, IRenown as k, RenownBuilderOptions as l, createSignatureVerifier as m, assertIsAuthCredential as n, DEFAULT_RENOWN_URL as nt, verifyAuthBearerToken as o, RenownCryptoSigner as p, IConnectCrypto as q, createAuthBearerToken as r, DOMAIN_TYPE as rt, fetchRenownProfile as s, ILogger as t, DEFAULT_RENOWN_NETWORK_ID as tt, Renown as u, MemoryKeyStorage as v, CreateBearerTokenOptions as w, RenownCrypto as x, RenownCryptoBuilder as y, RenownProfile as z };
|
|
548
|
+
//# sourceMappingURL=utils-Dx7V4t4D.d.ts.map
|