@powerhousedao/connect 2.5.0-dev.17 → 2.5.0-dev.18
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/dist/assets/{app-BS8COkjF.js → app-8bvd6AKG.js} +7 -7
- package/dist/assets/{app-BS8COkjF.js.map → app-8bvd6AKG.js.map} +1 -1
- package/dist/assets/{ccip-qln1sJJo.js → ccip-BYwtEP9w.js} +2 -2
- package/dist/assets/{ccip-qln1sJJo.js.map → ccip-BYwtEP9w.js.map} +1 -1
- package/dist/assets/{content-CZd3hDb2.js → content-EGwKzZ1G.js} +2 -2
- package/dist/assets/{content-CZd3hDb2.js.map → content-EGwKzZ1G.js.map} +1 -1
- package/dist/assets/{cookie-banner-CrokB_vD.js → cookie-banner-C3ZcWx-j.js} +2 -2
- package/dist/assets/{cookie-banner-CrokB_vD.js.map → cookie-banner-C3ZcWx-j.js.map} +1 -1
- package/dist/assets/{index-BWDt02oj.js → index-Bh2TgZig.js} +2 -2
- package/dist/assets/{index-BWDt02oj.js.map → index-Bh2TgZig.js.map} +1 -1
- package/dist/assets/{index-B-awVYtW.js → index-CN3h6xJY.js} +2 -2
- package/dist/assets/{index-B-awVYtW.js.map → index-CN3h6xJY.js.map} +1 -1
- package/dist/assets/{index-DpfVZloF.js → index-CbqGoIVm.js} +5 -5
- package/dist/assets/{index-DpfVZloF.js.map → index-CbqGoIVm.js.map} +1 -1
- package/dist/assets/{index-BjU0lLeV.js → index-D4gNXRWw.js} +2 -2
- package/dist/assets/{index-BjU0lLeV.js.map → index-D4gNXRWw.js.map} +1 -1
- package/dist/assets/{index-iJR5zjGJ.js → index-Dn3g-kUx.js} +2 -2
- package/dist/assets/{index-iJR5zjGJ.js.map → index-Dn3g-kUx.js.map} +1 -1
- package/dist/assets/{isAddressEqual-CMSIQaSX.js → isAddressEqual-DM_prmmC.js} +2 -2
- package/dist/assets/{isAddressEqual-CMSIQaSX.js.map → isAddressEqual-DM_prmmC.js.map} +1 -1
- package/dist/assets/{main.CjbcK6O8.js → main.iBRAG6ap.js} +3 -3
- package/dist/assets/{main.CjbcK6O8.js.map → main.iBRAG6ap.js.map} +1 -1
- package/dist/assets/{nodefs-Rikq2UiD.js → nodefs-BEYIbsG8.js} +2 -2
- package/dist/assets/{nodefs-Rikq2UiD.js.map → nodefs-BEYIbsG8.js.map} +1 -1
- package/dist/assets/{opfs-ahp-bPgvpW1b.js → opfs-ahp-CsR1b70b.js} +2 -2
- package/dist/assets/{opfs-ahp-bPgvpW1b.js.map → opfs-ahp-CsR1b70b.js.map} +1 -1
- package/dist/assets/{reactor-analytics-BnP5oDlZ.js → reactor-analytics-CR43qK9d.js} +3 -3
- package/dist/assets/{reactor-analytics-BnP5oDlZ.js.map → reactor-analytics-CR43qK9d.js.map} +1 -1
- package/dist/assets/{router-cx9r8Imw.js → router-Bg3ZdeZs.js} +4 -4
- package/dist/assets/{router-cx9r8Imw.js.map → router-Bg3ZdeZs.js.map} +1 -1
- package/dist/index.html +1 -1
- package/dist/vite-envs.sh +1 -1
- package/nginx.conf +33 -92
- package/package.json +9 -9
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
var U=r=>{throw TypeError(r)};var C=(r,t,e)=>t.has(r)||U("Cannot "+e);var n=(r,t,e)=>(C(r,t,"read from private field"),e?e.call(r):t.get(r)),i=(r,t,e)=>t.has(r)?U("Cannot add the same private member more than once"):t instanceof WeakSet?t.add(r):t.set(r,e),u=(r,t,e,s)=>(C(r,t,"write to private field"),s?s.call(r,e):t.set(r,e),e),a=(r,t,e)=>(C(r,t,"access private method"),e);import{U as W,Z as D,_ as L,x as $}from"./app-
|
|
2
|
-
//# sourceMappingURL=index-
|
|
1
|
+
var U=r=>{throw TypeError(r)};var C=(r,t,e)=>t.has(r)||U("Cannot "+e);var n=(r,t,e)=>(C(r,t,"read from private field"),e?e.call(r):t.get(r)),i=(r,t,e)=>t.has(r)?U("Cannot add the same private member more than once"):t instanceof WeakSet?t.add(r):t.set(r,e),u=(r,t,e,s)=>(C(r,t,"write to private field"),s?s.call(r,e):t.set(r,e),e),a=(r,t,e)=>(C(r,t,"access private method"),e);import{U as W,Z as D,_ as L,x as $}from"./app-8bvd6AKG.js";import{$ as X,a5 as tt,a4 as et,a1 as rt,a6 as st,a0 as nt,a2 as ot,a3 as it}from"./app-8bvd6AKG.js";import"./main.iBRAG6ap.js";import"react/jsx-runtime";import"react";import"./index-CbqGoIVm.js";import"react-dom/client";import"react-dom";import"./isAddressEqual-DM_prmmC.js";var k,p,P,v,N,S;const h=class h{constructor(){i(this,N);i(this,v);u(this,v,new Promise((t,e)=>{const s=indexedDB.open(n(h,k),1);s.onupgradeneeded=()=>{s.result.createObjectStore(n(h,p))},s.onsuccess=()=>t(s.result),s.onerror=()=>e(s.error)}))}async saveKeyPair(t){const s=(await a(this,N,S).call(this)).put(t,n(h,P));return new Promise((o,c)=>{s.onsuccess=()=>{o()},s.onerror=()=>{c(new Error("Failed to save key pair"))}})}async loadKeyPair(){const e=(await a(this,N,S).call(this,"readonly")).getAll();return new Promise((s,o)=>{e.onsuccess=()=>{const c=e.result.length?e.result[0]:void 0;s(c)},e.onerror=()=>{o(new Error("Failed to load key pair"))}})}};k=new WeakMap,p=new WeakMap,P=new WeakMap,v=new WeakMap,N=new WeakSet,S=async function(t="readwrite"){return(await n(this,v)).transaction(n(h,p),t).objectStore(n(h,p))},i(h,k,"browserKeyDB"),i(h,p,"keyPairs"),i(h,P,"keyPair");let x=h;function A(r){const t=r.split(":");if(!r.startsWith("did:pkh:")||t.length!==5)throw new Error("Invalid pkh did");const[,,e,s,o]=t;if(!o.startsWith("0x"))throw new Error(`Invalid address: ${o}`);const c=Number(s);if(isNaN(c))throw new Error(`Invalid chain id: ${s}`);return{chainId:c,networkId:e,address:o}}var w,R,m,y;class M{constructor(t,e){i(this,m);i(this,w);i(this,R);u(this,w,t),u(this,R,e)}get(t){return n(this,w).get(a(this,m,y).call(this,t))}set(t,e){return n(this,w).set(a(this,m,y).call(this,t),e)}delete(t){return n(this,w).delete(a(this,m,y).call(this,t))}}w=new WeakMap,R=new WeakMap,m=new WeakSet,y=function(t){return`${n(this,R)}:${t.toString()}`};const T={get:function(r){const t=localStorage.getItem(r);if(t)return JSON.parse(t)},set:function(r,t){return t?localStorage.setItem(r,JSON.stringify(t)):localStorage.removeItem(r)},delete:function(r){return localStorage.removeItem(r)}};class j extends M{constructor(t){super(T,`${W.routerBasename}:${t}`)}}function z(r){return new q(new j("renown"),r)}var E,g,I,f,d,l,O;class q{constructor(t,e,s=D){i(this,d);i(this,E);i(this,g);i(this,I);i(this,f,new EventTarget);u(this,g,t),u(this,I,e),u(this,E,s),this.user&&this.login(this.user.did).catch(()=>{})}get user(){return n(this,g).get("user")}set connectId(t){u(this,I,t);const e=this.user;a(this,d,l).call(this,void 0),e&&this.login(e.did).catch(s=>{console.log("User no longer authenticated:",s)})}async login(t){try{const e=A(t),s=await a(this,d,O).call(this,e.address,e.chainId,n(this,I));if(!s)throw a(this,d,l).call(this,void 0),new Error("Credential not found");const o={...e,did:t,credential:s};return L(o.address,o.chainId).then(c=>{var b;((b=this.user)==null?void 0:b.address)===o.address&&this.user.chainId===o.chainId&&a(this,d,l).call(this,{...this.user,ens:c})}).catch($.error),a(this,d,l).call(this,o),o}catch(e){throw $.error(e),a(this,d,l).call(this,void 0),e}}logout(){a(this,d,l).call(this,void 0)}on(t,e){const s=o=>{e(o.detail)};return n(this,f).addEventListener(t,s),()=>{n(this,f).removeEventListener(t,s)}}}E=new WeakMap,g=new WeakMap,I=new WeakMap,f=new WeakMap,d=new WeakSet,l=function(t){t?n(this,g).set("user",t):n(this,g).delete("user"),n(this,f).dispatchEvent(new CustomEvent("user",{detail:t}))},O=async function(t,e,s){if(!n(this,E))throw new Error("RENOWN_URL is not set");const o=new URL(`/api/auth/credential?address=${encodeURIComponent(t)}&chainId=${encodeURIComponent(e)}&connectId=${encodeURIComponent(s)}`,n(this,E)),c=await fetch(o,{method:"GET"});if(c.ok)return(await c.json()).credential;throw new Error("Failed to get credential")};export{M as BaseStorage,x as BrowserKeyStorage,X as ConnectCrypto,tt as RENOWN_CHAIN_ID,et as RENOWN_NETWORK_ID,D as RENOWN_URL,q as Renown,rt as addExternalPackage,st as getChain,L as getEnsInfo,nt as getHMRModule,z as initRenownBrowser,A as parsePkhDid,ot as removeExternalPackage,it as subscribeExternalPackages};
|
|
2
|
+
//# sourceMappingURL=index-CN3h6xJY.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index-B-awVYtW.js","sources":["../../src/services/crypto/browser.ts","../../src/services/renown/utils.ts","../../src/services/storage/index.ts","../../src/services/storage/browser.ts","../../src/services/renown/browser.ts","../../src/services/renown/index.ts"],"sourcesContent":["import { type JsonWebKeyPairStorage, type JwkKeyPair } from './index.js';\n\nexport class BrowserKeyStorage implements JsonWebKeyPairStorage {\n static #DB_NAME = 'browserKeyDB';\n static #STORE_NAME = 'keyPairs';\n static #KEY = 'keyPair';\n\n #db: Promise<IDBDatabase>;\n constructor() {\n this.#db = new Promise((resolve, reject) => {\n const req = indexedDB.open(BrowserKeyStorage.#DB_NAME, 1);\n req.onupgradeneeded = () => {\n req.result.createObjectStore(BrowserKeyStorage.#STORE_NAME);\n };\n req.onsuccess = () => resolve(req.result);\n req.onerror = () => reject(req.error as Error);\n });\n }\n\n async #useStore(mode: IDBTransactionMode = 'readwrite') {\n const database = await this.#db;\n const transaction = database.transaction(\n BrowserKeyStorage.#STORE_NAME,\n mode,\n );\n const store = transaction.objectStore(BrowserKeyStorage.#STORE_NAME);\n return store;\n }\n\n async saveKeyPair(keyPair: JwkKeyPair) {\n const store = await this.#useStore();\n const request = store.put(keyPair, BrowserKeyStorage.#KEY);\n return new Promise<void>((resolve, reject) => {\n request.onsuccess = () => {\n resolve();\n };\n request.onerror = () => {\n reject(new Error('Failed to save key pair'));\n };\n });\n }\n\n async loadKeyPair(): Promise<JwkKeyPair | undefined> {\n const store = await this.#useStore('readonly');\n const request = store.getAll();\n\n return new Promise<JwkKeyPair | undefined>((resolve, reject) => {\n request.onsuccess = () => {\n const keyPair = request.result.length\n ? (request.result[0] as JwkKeyPair)\n : undefined;\n resolve(keyPair);\n };\n request.onerror = () => {\n reject(new Error('Failed to load key pair'));\n };\n });\n }\n}\n","export type PKHDid = {\n networkId: string;\n chainId: number;\n address: `0x${string}`;\n};\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","export interface IStorage<\n T extends Record<string, unknown> = Record<string, unknown>,\n> {\n get<Key extends keyof T>(key: Key): T[Key];\n set<Key extends keyof T>(key: Key, value?: T[Key]): void;\n delete<Key extends keyof T>(key: Key): void;\n}\n\nexport class BaseStorage<\n T extends Record<string, unknown> = Record<string, unknown>,\n> implements IStorage<T>\n{\n #store: IStorage<T>;\n #namespace: string;\n\n protected constructor(store: IStorage<T>, namespace: string) {\n this.#store = store;\n this.#namespace = namespace;\n }\n\n #buildKey<Key extends keyof T>(key: Key): Key {\n return `${this.#namespace}:${key.toString()}` as Key;\n }\n\n get<Key extends keyof T>(key: Key): T[Key] {\n return this.#store.get(this.#buildKey(key));\n }\n set<Key extends keyof T>(key: Key, value?: T[Key] | undefined): void {\n return this.#store.set(this.#buildKey(key), value);\n }\n delete<Key extends keyof T>(key: Key): void {\n return this.#store.delete(this.#buildKey(key));\n }\n}\n","import connectConfig from '#connect-config';\nimport { BaseStorage, type IStorage } from './index.js';\n\nconst store: IStorage = {\n get: function <Key extends string>(key: Key): unknown {\n const value = localStorage.getItem(key);\n if (value) {\n return JSON.parse(value);\n }\n return undefined;\n },\n set: function <Key extends string>(key: Key, value?: unknown): void {\n return value\n ? localStorage.setItem(key, JSON.stringify(value))\n : localStorage.removeItem(key);\n },\n delete: function <Key extends string>(key: Key): void {\n return localStorage.removeItem(key);\n },\n};\n\nexport class BrowserStorage<\n T extends Record<string, unknown> = Record<string, unknown>,\n> extends BaseStorage<T> {\n constructor(namespace: string) {\n super(\n store as IStorage<T>,\n `${connectConfig.routerBasename}:${namespace}`,\n );\n }\n}\n","import { Renown } from './index.js';\nimport { BrowserStorage } from '../storage/browser.js';\n\nexport function initRenownBrowser(connectId: string) {\n return new Renown(new BrowserStorage('renown'), connectId);\n}\n","import { logger } from 'document-drive';\nimport type { IStorage } from '../storage/index.js';\nimport { getEnsInfo } from '../viem.js';\nimport { RENOWN_URL } from './constants.js';\nimport {\n type PowerhouseVerifiableCredential,\n type RenownStorage,\n type User,\n} from './types.js';\nimport { parsePkhDid } from './utils.js';\n\nexport * from './browser.js';\nexport * from './constants.js';\nexport * from './types.js';\nexport type {\n PowerhouseVerifiableCredential,\n Unsubscribe,\n User,\n} from './types.js';\nexport * from './utils.js';\n\nexport class Renown {\n #baseUrl: string;\n #store: RenownStorage;\n #connectId: string;\n #eventEmitter = new EventTarget();\n\n constructor(store: IStorage, connectId: string, baseUrl = RENOWN_URL) {\n this.#store = store as RenownStorage;\n this.#connectId = connectId;\n this.#baseUrl = baseUrl;\n\n if (this.user) {\n this.login(this.user.did).catch(() => void 0);\n }\n }\n\n get user() {\n return this.#store.get('user');\n }\n\n #updateUser(user: User | undefined) {\n // eslint-disable-next-line @typescript-eslint/no-unused-expressions\n user ? this.#store.set('user', user) : this.#store.delete('user');\n this.#eventEmitter.dispatchEvent(\n new CustomEvent('user', { detail: user }),\n );\n }\n\n set connectId(connectId: string) {\n this.#connectId = connectId;\n const user = this.user;\n\n this.#updateUser(undefined);\n\n // tries to login with new connectId\n if (user) {\n this.login(user.did).catch(e => {\n console.log('User no longer authenticated:', e);\n });\n }\n }\n\n async login(did: string): Promise<User> {\n try {\n const result = parsePkhDid(did);\n\n const credential = await this.#getCredential(\n result.address,\n result.chainId,\n this.#connectId,\n );\n if (!credential) {\n this.#updateUser(undefined);\n throw new Error('Credential not found');\n }\n const user: User = {\n ...result,\n did,\n credential,\n };\n\n getEnsInfo(user.address, user.chainId)\n .then(ens => {\n if (\n this.user?.address === user.address &&\n this.user.chainId === user.chainId\n ) {\n this.#updateUser({ ...this.user, ens });\n }\n })\n .catch(logger.error);\n\n this.#updateUser(user);\n return user;\n } catch (error) {\n logger.error(error);\n this.#updateUser(undefined);\n throw error;\n }\n }\n\n logout() {\n this.#updateUser(undefined);\n }\n\n on(event: 'user', listener: (user: User) => void) {\n const eventListener = ((e: CustomEvent<User>) => {\n listener(e.detail);\n }) as EventListener;\n\n this.#eventEmitter.addEventListener(event, eventListener);\n return () => {\n this.#eventEmitter.removeEventListener(event, eventListener);\n };\n }\n\n async #getCredential(\n address: string,\n chainId: number,\n connectId: 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(connectId)}`,\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');\n }\n }\n}\n"],"names":["_BrowserKeyStorage","__privateAdd","_BrowserKeyStorage_instances","_db","__privateSet","resolve","reject","req","__privateGet","_DB_NAME","_STORE_NAME","keyPair","request","__privateMethod","useStore_fn","_KEY","mode","BrowserKeyStorage","parsePkhDid","did","parts","networkId","chainIdStr","address","chainId","BaseStorage","store","namespace","_BaseStorage_instances","_store","_namespace","key","buildKey_fn","value","BrowserStorage","connectConfig","initRenownBrowser","connectId","Renown","baseUrl","RENOWN_URL","_Renown_instances","_baseUrl","_connectId","_eventEmitter","user","updateUser_fn","e","result","credential","getCredential_fn","getEnsInfo","ens","_a","logger","error","event","listener","eventListener","url","response"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"index-CN3h6xJY.js","sources":["../../src/services/crypto/browser.ts","../../src/services/renown/utils.ts","../../src/services/storage/index.ts","../../src/services/storage/browser.ts","../../src/services/renown/browser.ts","../../src/services/renown/index.ts"],"sourcesContent":["import { type JsonWebKeyPairStorage, type JwkKeyPair } from './index.js';\n\nexport class BrowserKeyStorage implements JsonWebKeyPairStorage {\n static #DB_NAME = 'browserKeyDB';\n static #STORE_NAME = 'keyPairs';\n static #KEY = 'keyPair';\n\n #db: Promise<IDBDatabase>;\n constructor() {\n this.#db = new Promise((resolve, reject) => {\n const req = indexedDB.open(BrowserKeyStorage.#DB_NAME, 1);\n req.onupgradeneeded = () => {\n req.result.createObjectStore(BrowserKeyStorage.#STORE_NAME);\n };\n req.onsuccess = () => resolve(req.result);\n req.onerror = () => reject(req.error as Error);\n });\n }\n\n async #useStore(mode: IDBTransactionMode = 'readwrite') {\n const database = await this.#db;\n const transaction = database.transaction(\n BrowserKeyStorage.#STORE_NAME,\n mode,\n );\n const store = transaction.objectStore(BrowserKeyStorage.#STORE_NAME);\n return store;\n }\n\n async saveKeyPair(keyPair: JwkKeyPair) {\n const store = await this.#useStore();\n const request = store.put(keyPair, BrowserKeyStorage.#KEY);\n return new Promise<void>((resolve, reject) => {\n request.onsuccess = () => {\n resolve();\n };\n request.onerror = () => {\n reject(new Error('Failed to save key pair'));\n };\n });\n }\n\n async loadKeyPair(): Promise<JwkKeyPair | undefined> {\n const store = await this.#useStore('readonly');\n const request = store.getAll();\n\n return new Promise<JwkKeyPair | undefined>((resolve, reject) => {\n request.onsuccess = () => {\n const keyPair = request.result.length\n ? (request.result[0] as JwkKeyPair)\n : undefined;\n resolve(keyPair);\n };\n request.onerror = () => {\n reject(new Error('Failed to load key pair'));\n };\n });\n }\n}\n","export type PKHDid = {\n networkId: string;\n chainId: number;\n address: `0x${string}`;\n};\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","export interface IStorage<\n T extends Record<string, unknown> = Record<string, unknown>,\n> {\n get<Key extends keyof T>(key: Key): T[Key];\n set<Key extends keyof T>(key: Key, value?: T[Key]): void;\n delete<Key extends keyof T>(key: Key): void;\n}\n\nexport class BaseStorage<\n T extends Record<string, unknown> = Record<string, unknown>,\n> implements IStorage<T>\n{\n #store: IStorage<T>;\n #namespace: string;\n\n protected constructor(store: IStorage<T>, namespace: string) {\n this.#store = store;\n this.#namespace = namespace;\n }\n\n #buildKey<Key extends keyof T>(key: Key): Key {\n return `${this.#namespace}:${key.toString()}` as Key;\n }\n\n get<Key extends keyof T>(key: Key): T[Key] {\n return this.#store.get(this.#buildKey(key));\n }\n set<Key extends keyof T>(key: Key, value?: T[Key] | undefined): void {\n return this.#store.set(this.#buildKey(key), value);\n }\n delete<Key extends keyof T>(key: Key): void {\n return this.#store.delete(this.#buildKey(key));\n }\n}\n","import connectConfig from '#connect-config';\nimport { BaseStorage, type IStorage } from './index.js';\n\nconst store: IStorage = {\n get: function <Key extends string>(key: Key): unknown {\n const value = localStorage.getItem(key);\n if (value) {\n return JSON.parse(value);\n }\n return undefined;\n },\n set: function <Key extends string>(key: Key, value?: unknown): void {\n return value\n ? localStorage.setItem(key, JSON.stringify(value))\n : localStorage.removeItem(key);\n },\n delete: function <Key extends string>(key: Key): void {\n return localStorage.removeItem(key);\n },\n};\n\nexport class BrowserStorage<\n T extends Record<string, unknown> = Record<string, unknown>,\n> extends BaseStorage<T> {\n constructor(namespace: string) {\n super(\n store as IStorage<T>,\n `${connectConfig.routerBasename}:${namespace}`,\n );\n }\n}\n","import { Renown } from './index.js';\nimport { BrowserStorage } from '../storage/browser.js';\n\nexport function initRenownBrowser(connectId: string) {\n return new Renown(new BrowserStorage('renown'), connectId);\n}\n","import { logger } from 'document-drive';\nimport type { IStorage } from '../storage/index.js';\nimport { getEnsInfo } from '../viem.js';\nimport { RENOWN_URL } from './constants.js';\nimport {\n type PowerhouseVerifiableCredential,\n type RenownStorage,\n type User,\n} from './types.js';\nimport { parsePkhDid } from './utils.js';\n\nexport * from './browser.js';\nexport * from './constants.js';\nexport * from './types.js';\nexport type {\n PowerhouseVerifiableCredential,\n Unsubscribe,\n User,\n} from './types.js';\nexport * from './utils.js';\n\nexport class Renown {\n #baseUrl: string;\n #store: RenownStorage;\n #connectId: string;\n #eventEmitter = new EventTarget();\n\n constructor(store: IStorage, connectId: string, baseUrl = RENOWN_URL) {\n this.#store = store as RenownStorage;\n this.#connectId = connectId;\n this.#baseUrl = baseUrl;\n\n if (this.user) {\n this.login(this.user.did).catch(() => void 0);\n }\n }\n\n get user() {\n return this.#store.get('user');\n }\n\n #updateUser(user: User | undefined) {\n // eslint-disable-next-line @typescript-eslint/no-unused-expressions\n user ? this.#store.set('user', user) : this.#store.delete('user');\n this.#eventEmitter.dispatchEvent(\n new CustomEvent('user', { detail: user }),\n );\n }\n\n set connectId(connectId: string) {\n this.#connectId = connectId;\n const user = this.user;\n\n this.#updateUser(undefined);\n\n // tries to login with new connectId\n if (user) {\n this.login(user.did).catch(e => {\n console.log('User no longer authenticated:', e);\n });\n }\n }\n\n async login(did: string): Promise<User> {\n try {\n const result = parsePkhDid(did);\n\n const credential = await this.#getCredential(\n result.address,\n result.chainId,\n this.#connectId,\n );\n if (!credential) {\n this.#updateUser(undefined);\n throw new Error('Credential not found');\n }\n const user: User = {\n ...result,\n did,\n credential,\n };\n\n getEnsInfo(user.address, user.chainId)\n .then(ens => {\n if (\n this.user?.address === user.address &&\n this.user.chainId === user.chainId\n ) {\n this.#updateUser({ ...this.user, ens });\n }\n })\n .catch(logger.error);\n\n this.#updateUser(user);\n return user;\n } catch (error) {\n logger.error(error);\n this.#updateUser(undefined);\n throw error;\n }\n }\n\n logout() {\n this.#updateUser(undefined);\n }\n\n on(event: 'user', listener: (user: User) => void) {\n const eventListener = ((e: CustomEvent<User>) => {\n listener(e.detail);\n }) as EventListener;\n\n this.#eventEmitter.addEventListener(event, eventListener);\n return () => {\n this.#eventEmitter.removeEventListener(event, eventListener);\n };\n }\n\n async #getCredential(\n address: string,\n chainId: number,\n connectId: 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(connectId)}`,\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');\n }\n }\n}\n"],"names":["_BrowserKeyStorage","__privateAdd","_BrowserKeyStorage_instances","_db","__privateSet","resolve","reject","req","__privateGet","_DB_NAME","_STORE_NAME","keyPair","request","__privateMethod","useStore_fn","_KEY","mode","BrowserKeyStorage","parsePkhDid","did","parts","networkId","chainIdStr","address","chainId","BaseStorage","store","namespace","_BaseStorage_instances","_store","_namespace","key","buildKey_fn","value","BrowserStorage","connectConfig","initRenownBrowser","connectId","Renown","baseUrl","RENOWN_URL","_Renown_instances","_baseUrl","_connectId","_eventEmitter","user","updateUser_fn","e","result","credential","getCredential_fn","getEnsInfo","ens","_a","logger","error","event","listener","eventListener","url","response"],"mappings":"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"}
|