@renown/sdk 6.2.2-dev.5 → 6.2.2-dev.50

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.
Files changed (75) hide show
  1. package/README.md +162 -1
  2. package/dist/{browser-key-storage-v4O-fjz0.js → browser-key-storage-e3RQsnLS.js} +1 -1
  3. package/dist/{browser-key-storage-v4O-fjz0.js.map → browser-key-storage-e3RQsnLS.js.map} +1 -1
  4. package/dist/constants-B7wOp9oo.js +79 -0
  5. package/dist/constants-B7wOp9oo.js.map +1 -0
  6. package/dist/crypto.d.ts +2 -2
  7. package/dist/crypto.js +2 -2
  8. package/dist/index-BF2qTv7d.d.ts +131 -0
  9. package/dist/index-BF2qTv7d.d.ts.map +1 -0
  10. package/dist/index.d.ts +11 -8
  11. package/dist/index.d.ts.map +1 -1
  12. package/dist/index.js +21 -9
  13. package/dist/index.js.map +1 -1
  14. package/dist/meta-CHgd9Qd0.js +31 -0
  15. package/dist/meta-CHgd9Qd0.js.map +1 -0
  16. package/dist/meta-D-5kvwx8.js +27 -0
  17. package/dist/meta-D-5kvwx8.js.map +1 -0
  18. package/dist/meta-DY5WCada.d.ts +19 -0
  19. package/dist/meta-DY5WCada.d.ts.map +1 -0
  20. package/dist/meta-DbqBJa4j.d.ts +19 -0
  21. package/dist/meta-DbqBJa4j.d.ts.map +1 -0
  22. package/dist/meta-DjoNJy1t.d.ts +16 -0
  23. package/dist/meta-DjoNJy1t.d.ts.map +1 -0
  24. package/dist/node.d.ts +11 -11
  25. package/dist/node.d.ts.map +1 -1
  26. package/dist/node.js +104 -12
  27. package/dist/node.js.map +1 -1
  28. package/dist/renown-builder-KOzzCXrQ.js +804 -0
  29. package/dist/renown-builder-KOzzCXrQ.js.map +1 -0
  30. package/dist/{signer-CgYhXTV7.js → signer-BpvojvCh.js} +13 -6
  31. package/dist/signer-BpvojvCh.js.map +1 -0
  32. package/dist/types-C_qc_62W.js +20 -0
  33. package/dist/types-C_qc_62W.js.map +1 -0
  34. package/dist/types-CxKG5UsV.d.ts +59 -0
  35. package/dist/types-CxKG5UsV.d.ts.map +1 -0
  36. package/dist/{signer-DYKGoYHB.d.ts → types-ocCFjR5j.d.ts} +128 -118
  37. package/dist/types-ocCFjR5j.d.ts.map +1 -0
  38. package/dist/{utils-C9ZgMs_C.d.ts → utils-DS2Ha4Bg.d.ts} +91 -96
  39. package/dist/utils-DS2Ha4Bg.d.ts.map +1 -0
  40. package/dist/wallet/index.d.ts +8 -0
  41. package/dist/wallet/index.d.ts.map +1 -0
  42. package/dist/wallet/index.js +30 -0
  43. package/dist/wallet/index.js.map +1 -0
  44. package/dist/wallet/mock/factory.d.ts +9 -0
  45. package/dist/wallet/mock/factory.d.ts.map +1 -0
  46. package/dist/wallet/mock/factory.js +35 -0
  47. package/dist/wallet/mock/factory.js.map +1 -0
  48. package/dist/wallet/mock/index.d.ts +9 -0
  49. package/dist/wallet/mock/index.d.ts.map +1 -0
  50. package/dist/wallet/mock/index.js +16 -0
  51. package/dist/wallet/mock/index.js.map +1 -0
  52. package/dist/wallet/privy/factory.d.ts +58 -0
  53. package/dist/wallet/privy/factory.d.ts.map +1 -0
  54. package/dist/wallet/privy/factory.js +258 -0
  55. package/dist/wallet/privy/factory.js.map +1 -0
  56. package/dist/wallet/privy/index.d.ts +9 -0
  57. package/dist/wallet/privy/index.d.ts.map +1 -0
  58. package/dist/wallet/privy/index.js +16 -0
  59. package/dist/wallet/privy/index.js.map +1 -0
  60. package/dist/wallet/rainbow/factory.d.ts +7 -0
  61. package/dist/wallet/rainbow/factory.d.ts.map +1 -0
  62. package/dist/wallet/rainbow/factory.js +219 -0
  63. package/dist/wallet/rainbow/factory.js.map +1 -0
  64. package/dist/wallet/rainbow/index.d.ts +9 -0
  65. package/dist/wallet/rainbow/index.d.ts.map +1 -0
  66. package/dist/wallet/rainbow/index.js +21 -0
  67. package/dist/wallet/rainbow/index.js.map +1 -0
  68. package/package.json +76 -3
  69. package/dist/browser-key-storage-DSkDBAhU.d.ts +0 -14
  70. package/dist/browser-key-storage-DSkDBAhU.d.ts.map +0 -1
  71. package/dist/renown-builder-Sn_Y2Cb2.js +0 -496
  72. package/dist/renown-builder-Sn_Y2Cb2.js.map +0 -1
  73. package/dist/signer-CgYhXTV7.js.map +0 -1
  74. package/dist/signer-DYKGoYHB.d.ts.map +0 -1
  75. package/dist/utils-C9ZgMs_C.d.ts.map +0 -1
package/dist/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","names":["#eventTarget","#buildKey","#basename","#keyDbName"],"sources":["../src/event/event.browser.ts","../src/storage/storage.browser.ts","../src/init.browser.ts"],"sourcesContent":["import type { IEventEmitter } from \"./types.js\";\n\nexport class TypedCustomEvent<T> extends CustomEvent<T> {\n constructor(type: string, detail?: T) {\n super(type, { detail });\n }\n}\n\nexport class BrowserEventEmitter<\n Events extends Record<string, unknown>,\n> implements IEventEmitter<Events> {\n #eventTarget = new EventTarget();\n\n on<K extends keyof Events>(\n event: K,\n listener: (data: Events[K]) => void,\n ): () => void {\n const wrappedListener = (e: Event) => {\n if (e instanceof TypedCustomEvent) {\n listener(e.detail as Events[K]);\n }\n };\n\n this.#eventTarget.addEventListener(event.toString(), wrappedListener);\n return () => {\n this.#eventTarget.removeEventListener(event.toString(), wrappedListener);\n };\n }\n\n emit<K extends keyof Events>(event: K, data: Events[K]): void {\n const customEvent = new TypedCustomEvent(event.toString(), data);\n this.#eventTarget.dispatchEvent(customEvent);\n }\n}\n","import { BaseStorage } from \"./common.js\";\n\nexport class BrowserStorage<\n T extends Record<string, unknown> = Record<string, unknown>,\n> extends BaseStorage<T> {\n private readonly namespace: string;\n\n constructor(namespace: string, basename: string | undefined) {\n super();\n this.namespace = `${basename}:${namespace}`;\n }\n\n #buildKey(key: keyof T): string {\n return `${this.namespace}:${key.toString()}`;\n }\n get<Key extends keyof T>(key: Key): T[Key] | undefined {\n const value = localStorage.getItem(this.#buildKey(key));\n if (value) {\n return JSON.parse(value) as T[Key];\n }\n return undefined;\n }\n\n set<Key extends keyof T>(key: Key, value?: T[Key]): void {\n return value\n ? localStorage.setItem(this.#buildKey(key), JSON.stringify(value))\n : localStorage.removeItem(this.#buildKey(key));\n }\n\n delete(key: keyof T): void {\n return localStorage.removeItem(this.#buildKey(key));\n }\n}\n","import type { Renown } from \"./common.js\";\nimport { BrowserKeyStorage } from \"./crypto/browser-key-storage.js\";\nimport { BrowserEventEmitter } from \"./event/event.browser.js\";\nimport { BaseRenownBuilder } from \"./renown-builder.js\";\nimport { BrowserStorage } from \"./storage/storage.browser.js\";\nimport type { RenownEvents, RenownStorageMap } from \"./types.js\";\n\nexport class BrowserRenownStorage extends BrowserStorage<RenownStorageMap> {}\nexport class BrowserRenownEventEmitter extends BrowserEventEmitter<RenownEvents> {}\n\nexport interface BrowserRenownBuilderOptions {\n /** Base path for storage keys (e.g., \"/app\" for multi-tenant apps) */\n basename?: string;\n /** Renown server URL. Defaults to https://www.renown.id */\n baseUrl?: string;\n /** IndexedDB database name for key storage. Defaults to \"renownKeyDB\" */\n keyDbName?: string;\n}\n\n/**\n * Browser-specific Renown builder with pre-configured defaults.\n * Uses localStorage for user data and IndexedDB for key storage.\n */\nexport class RenownBuilder extends BaseRenownBuilder {\n #basename?: string;\n #keyDbName?: string;\n\n /**\n * @param appName - Application name used for signing context\n * @param options - Browser-specific configuration options\n */\n constructor(appName: string, options: BrowserRenownBuilderOptions = {}) {\n super(appName);\n this.#basename = options.basename;\n this.#keyDbName = options.keyDbName;\n this.withStorage(new BrowserRenownStorage(\"renown\", this.#basename));\n this.withEventEmitter(new BrowserRenownEventEmitter());\n if (options.baseUrl) {\n this.withBaseUrl(options.baseUrl);\n }\n }\n\n /**\n * Set base path for storage keys (e.g., \"/app\" for multi-tenant apps).\n */\n withBasename(basename: string): this {\n this.#basename = basename;\n this.withStorage(new BrowserRenownStorage(\"renown\", this.#basename));\n return this;\n }\n\n /**\n * Set IndexedDB database name for key storage.\n * Defaults to \"renownKeyDB\".\n */\n withKeyDbName(keyDbName: string): this {\n this.#keyDbName = keyDbName;\n return this;\n }\n\n /**\n * Build and initialize the Renown instance.\n * Initializes IndexedDB for key storage before building.\n */\n async build(): Promise<Renown> {\n const keyStorage = await BrowserKeyStorage.create(this.#keyDbName);\n this.withKeyPairStorage(keyStorage);\n return super.build();\n }\n}\n\n/**\n * @deprecated Use RenownBuilder directly instead.\n * Initialize a browser-specific Renown instance.\n * @param appName - Application name used for signing context\n * @param options - Browser-specific configuration options\n * @returns Initialized Renown instance\n */\nexport function initRenown(\n appName: string,\n options: BrowserRenownBuilderOptions = {},\n) {\n return new RenownBuilder(appName, options).build();\n}\n"],"mappings":";;;;AAEA,IAAa,mBAAb,cAAyC,YAAe;CACtD,YAAY,MAAc,QAAY;AACpC,QAAM,MAAM,EAAE,QAAQ,CAAC;;;AAI3B,IAAa,sBAAb,MAEmC;CACjC,eAAe,IAAI,aAAa;CAEhC,GACE,OACA,UACY;EACZ,MAAM,mBAAmB,MAAa;AACpC,OAAI,aAAa,iBACf,UAAS,EAAE,OAAoB;;AAInC,QAAA,YAAkB,iBAAiB,MAAM,UAAU,EAAE,gBAAgB;AACrE,eAAa;AACX,SAAA,YAAkB,oBAAoB,MAAM,UAAU,EAAE,gBAAgB;;;CAI5E,KAA6B,OAAU,MAAuB;EAC5D,MAAM,cAAc,IAAI,iBAAiB,MAAM,UAAU,EAAE,KAAK;AAChE,QAAA,YAAkB,cAAc,YAAY;;;;;AC7BhD,IAAa,iBAAb,cAEU,YAAe;CACvB;CAEA,YAAY,WAAmB,UAA8B;AAC3D,SAAO;AACP,OAAK,YAAY,GAAG,SAAS,GAAG;;CAGlC,UAAU,KAAsB;AAC9B,SAAO,GAAG,KAAK,UAAU,GAAG,IAAI,UAAU;;CAE5C,IAAyB,KAA8B;EACrD,MAAM,QAAQ,aAAa,QAAQ,MAAA,SAAe,IAAI,CAAC;AACvD,MAAI,MACF,QAAO,KAAK,MAAM,MAAM;;CAK5B,IAAyB,KAAU,OAAsB;AACvD,SAAO,QACH,aAAa,QAAQ,MAAA,SAAe,IAAI,EAAE,KAAK,UAAU,MAAM,CAAC,GAChE,aAAa,WAAW,MAAA,SAAe,IAAI,CAAC;;CAGlD,OAAO,KAAoB;AACzB,SAAO,aAAa,WAAW,MAAA,SAAe,IAAI,CAAC;;;;;ACvBvD,IAAa,uBAAb,cAA0C,eAAiC;AAC3E,IAAa,4BAAb,cAA+C,oBAAkC;;;;;AAejF,IAAa,gBAAb,cAAmC,kBAAkB;CACnD;CACA;;;;;CAMA,YAAY,SAAiB,UAAuC,EAAE,EAAE;AACtE,QAAM,QAAQ;AACd,QAAA,WAAiB,QAAQ;AACzB,QAAA,YAAkB,QAAQ;AAC1B,OAAK,YAAY,IAAI,qBAAqB,UAAU,MAAA,SAAe,CAAC;AACpE,OAAK,iBAAiB,IAAI,2BAA2B,CAAC;AACtD,MAAI,QAAQ,QACV,MAAK,YAAY,QAAQ,QAAQ;;;;;CAOrC,aAAa,UAAwB;AACnC,QAAA,WAAiB;AACjB,OAAK,YAAY,IAAI,qBAAqB,UAAU,MAAA,SAAe,CAAC;AACpE,SAAO;;;;;;CAOT,cAAc,WAAyB;AACrC,QAAA,YAAkB;AAClB,SAAO;;;;;;CAOT,MAAM,QAAyB;EAC7B,MAAM,aAAa,MAAM,kBAAkB,OAAO,MAAA,UAAgB;AAClE,OAAK,mBAAmB,WAAW;AACnC,SAAO,MAAM,OAAO;;;;;;;;;;AAWxB,SAAgB,WACd,SACA,UAAuC,EAAE,EACzC;AACA,QAAO,IAAI,cAAc,SAAS,QAAQ,CAAC,OAAO"}
1
+ {"version":3,"file":"index.js","names":["#eventTarget","#buildKey","#basename","#keyDbName","#revalidate"],"sources":["../src/event/event.browser.ts","../src/storage/storage.browser.ts","../src/init.browser.ts"],"sourcesContent":["import type { IEventEmitter } from \"./types.js\";\n\nexport class TypedCustomEvent<T> extends CustomEvent<T> {\n constructor(type: string, detail?: T) {\n super(type, { detail });\n }\n}\n\nexport class BrowserEventEmitter<\n Events extends Record<string, unknown>,\n> implements IEventEmitter<Events> {\n #eventTarget = new EventTarget();\n\n on<K extends keyof Events>(\n event: K,\n listener: (data: Events[K]) => void,\n ): () => void {\n const wrappedListener = (e: Event) => {\n if (e instanceof TypedCustomEvent) {\n listener(e.detail as Events[K]);\n }\n };\n\n this.#eventTarget.addEventListener(event.toString(), wrappedListener);\n return () => {\n this.#eventTarget.removeEventListener(event.toString(), wrappedListener);\n };\n }\n\n emit<K extends keyof Events>(event: K, data: Events[K]): void {\n const customEvent = new TypedCustomEvent(event.toString(), data);\n this.#eventTarget.dispatchEvent(customEvent);\n }\n}\n","import { BaseStorage } from \"./common.js\";\n\nexport class BrowserStorage<\n T extends Record<string, unknown> = Record<string, unknown>,\n> extends BaseStorage<T> {\n private readonly namespace: string;\n\n constructor(namespace: string, basename: string | undefined) {\n super();\n this.namespace = `${basename}:${namespace}`;\n }\n\n #buildKey(key: keyof T): string {\n return `${this.namespace}:${key.toString()}`;\n }\n get<Key extends keyof T>(key: Key): T[Key] | undefined {\n const value = localStorage.getItem(this.#buildKey(key));\n if (value) {\n return JSON.parse(value) as T[Key];\n }\n return undefined;\n }\n\n set<Key extends keyof T>(key: Key, value?: T[Key]): void {\n return value\n ? localStorage.setItem(this.#buildKey(key), JSON.stringify(value))\n : localStorage.removeItem(this.#buildKey(key));\n }\n\n delete(key: keyof T): void {\n return localStorage.removeItem(this.#buildKey(key));\n }\n}\n","import type { Renown } from \"./common.js\";\nimport { BrowserKeyStorage } from \"./crypto/browser-key-storage.js\";\nimport { BrowserEventEmitter } from \"./event/event.browser.js\";\nimport { BaseRenownBuilder } from \"./renown-builder.js\";\nimport { BrowserStorage } from \"./storage/storage.browser.js\";\nimport type { RenownEvents, RenownStorageMap, User } from \"./types.js\";\n\nexport class BrowserRenownStorage extends BrowserStorage<RenownStorageMap> {}\nexport class BrowserRenownEventEmitter extends BrowserEventEmitter<RenownEvents> {}\n\n// Synchronously read the persisted user from localStorage (browser only) for an\n// instant optimistic first paint, before the async SDK build resolves.\nexport function readPersistedUser(basename?: string): User | undefined {\n if (typeof localStorage === \"undefined\") return undefined;\n try {\n return new BrowserStorage<RenownStorageMap>(\"renown\", basename).get(\"user\");\n } catch {\n return undefined;\n }\n}\n\nexport interface BrowserRenownBuilderOptions {\n /** Base path for storage keys (e.g., \"/app\" for multi-tenant apps) */\n basename?: string;\n /** Renown server URL. Defaults to https://www.renown.id */\n baseUrl?: string;\n /** Switchboard GraphQL endpoint for the direct-to-reactor flow. */\n switchboardUrl?: string;\n /** IndexedDB database name for key storage. Defaults to \"renownKeyDB\" */\n keyDbName?: string;\n /** Re-check a stored credential on build (default \"always\"). */\n revalidate?: \"always\" | \"never\";\n /** Chain id credentials are issued on (default 1). It is part of the issuer DID, so `signIn` rejects a session from another chain. */\n chainId?: number;\n}\n\n/**\n * Browser-specific Renown builder with pre-configured defaults.\n * Uses localStorage for user data and IndexedDB for key storage.\n */\nexport class RenownBuilder extends BaseRenownBuilder {\n #basename?: string;\n #keyDbName?: string;\n #revalidate: \"always\" | \"never\";\n\n constructor(appName: string, options: BrowserRenownBuilderOptions = {}) {\n super(appName);\n this.#basename = options.basename;\n this.#keyDbName = options.keyDbName;\n this.#revalidate = options.revalidate ?? \"always\";\n this.withStorage(new BrowserRenownStorage(\"renown\", this.#basename));\n this.withEventEmitter(new BrowserRenownEventEmitter());\n if (options.baseUrl) {\n this.withBaseUrl(options.baseUrl);\n }\n if (options.switchboardUrl) {\n this.withSwitchboardUrl(options.switchboardUrl);\n }\n if (options.chainId !== undefined) {\n this.withChainId(options.chainId);\n }\n }\n\n /**\n * Set base path for storage keys (e.g., \"/app\" for multi-tenant apps).\n */\n withBasename(basename: string): this {\n this.#basename = basename;\n this.withStorage(new BrowserRenownStorage(\"renown\", this.#basename));\n return this;\n }\n\n /**\n * Set IndexedDB database name for key storage.\n * Defaults to \"renownKeyDB\".\n */\n withKeyDbName(keyDbName: string): this {\n this.#keyDbName = keyDbName;\n return this;\n }\n\n /**\n * Build and initialize the Renown instance.\n * Initializes IndexedDB for key storage before building.\n */\n async build(): Promise<Renown> {\n const keyStorage = await BrowserKeyStorage.create(this.#keyDbName);\n this.withKeyPairStorage(keyStorage);\n const renown = await super.build();\n // Refresh in the background, never blocking the paint. Only the credential\n // check can log a user out, so it stays gated; the profile refresh always runs.\n if (renown.user) {\n if (this.#revalidate === \"always\") {\n void renown.revalidate();\n } else {\n void renown.refreshProfile();\n }\n }\n return renown;\n }\n}\n\n/**\n * @deprecated Use RenownBuilder directly instead.\n * Initialize a browser-specific Renown instance.\n * @param appName - Application name used for signing context\n * @param options - Browser-specific configuration options\n * @returns Initialized Renown instance\n */\nexport function initRenown(\n appName: string,\n options: BrowserRenownBuilderOptions = {},\n) {\n return new RenownBuilder(appName, options).build();\n}\n"],"mappings":";;;;;AAEA,IAAa,mBAAb,cAAyC,YAAe;CACtD,YAAY,MAAc,QAAY;AACpC,QAAM,MAAM,EAAE,QAAQ,CAAC;;;AAI3B,IAAa,sBAAb,MAEmC;CACjC,eAAe,IAAI,aAAa;CAEhC,GACE,OACA,UACY;EACZ,MAAM,mBAAmB,MAAa;AACpC,OAAI,aAAa,iBACf,UAAS,EAAE,OAAoB;;AAInC,QAAA,YAAkB,iBAAiB,MAAM,UAAU,EAAE,gBAAgB;AACrE,eAAa;AACX,SAAA,YAAkB,oBAAoB,MAAM,UAAU,EAAE,gBAAgB;;;CAI5E,KAA6B,OAAU,MAAuB;EAC5D,MAAM,cAAc,IAAI,iBAAiB,MAAM,UAAU,EAAE,KAAK;AAChE,QAAA,YAAkB,cAAc,YAAY;;;;;AC7BhD,IAAa,iBAAb,cAEU,YAAe;CACvB;CAEA,YAAY,WAAmB,UAA8B;AAC3D,SAAO;AACP,OAAK,YAAY,GAAG,SAAS,GAAG;;CAGlC,UAAU,KAAsB;AAC9B,SAAO,GAAG,KAAK,UAAU,GAAG,IAAI,UAAU;;CAE5C,IAAyB,KAA8B;EACrD,MAAM,QAAQ,aAAa,QAAQ,MAAA,SAAe,IAAI,CAAC;AACvD,MAAI,MACF,QAAO,KAAK,MAAM,MAAM;;CAK5B,IAAyB,KAAU,OAAsB;AACvD,SAAO,QACH,aAAa,QAAQ,MAAA,SAAe,IAAI,EAAE,KAAK,UAAU,MAAM,CAAC,GAChE,aAAa,WAAW,MAAA,SAAe,IAAI,CAAC;;CAGlD,OAAO,KAAoB;AACzB,SAAO,aAAa,WAAW,MAAA,SAAe,IAAI,CAAC;;;;;ACvBvD,IAAa,uBAAb,cAA0C,eAAiC;AAC3E,IAAa,4BAAb,cAA+C,oBAAkC;AAIjF,SAAgB,kBAAkB,UAAqC;AACrE,KAAI,OAAO,iBAAiB,YAAa,QAAO,KAAA;AAChD,KAAI;AACF,SAAO,IAAI,eAAiC,UAAU,SAAS,CAAC,IAAI,OAAO;SACrE;AACN;;;;;;;AAuBJ,IAAa,gBAAb,cAAmC,kBAAkB;CACnD;CACA;CACA;CAEA,YAAY,SAAiB,UAAuC,EAAE,EAAE;AACtE,QAAM,QAAQ;AACd,QAAA,WAAiB,QAAQ;AACzB,QAAA,YAAkB,QAAQ;AAC1B,QAAA,aAAmB,QAAQ,cAAc;AACzC,OAAK,YAAY,IAAI,qBAAqB,UAAU,MAAA,SAAe,CAAC;AACpE,OAAK,iBAAiB,IAAI,2BAA2B,CAAC;AACtD,MAAI,QAAQ,QACV,MAAK,YAAY,QAAQ,QAAQ;AAEnC,MAAI,QAAQ,eACV,MAAK,mBAAmB,QAAQ,eAAe;AAEjD,MAAI,QAAQ,YAAY,KAAA,EACtB,MAAK,YAAY,QAAQ,QAAQ;;;;;CAOrC,aAAa,UAAwB;AACnC,QAAA,WAAiB;AACjB,OAAK,YAAY,IAAI,qBAAqB,UAAU,MAAA,SAAe,CAAC;AACpE,SAAO;;;;;;CAOT,cAAc,WAAyB;AACrC,QAAA,YAAkB;AAClB,SAAO;;;;;;CAOT,MAAM,QAAyB;EAC7B,MAAM,aAAa,MAAM,kBAAkB,OAAO,MAAA,UAAgB;AAClE,OAAK,mBAAmB,WAAW;EACnC,MAAM,SAAS,MAAM,MAAM,OAAO;AAGlC,MAAI,OAAO,KACT,KAAI,MAAA,eAAqB,SAClB,QAAO,YAAY;MAEnB,QAAO,gBAAgB;AAGhC,SAAO;;;;;;;;;;AAWX,SAAgB,WACd,SACA,UAAuC,EAAE,EACzC;AACA,QAAO,IAAI,cAAc,SAAS,QAAQ,CAAC,OAAO"}
@@ -0,0 +1,31 @@
1
+ import { t as LoginMethod } from "./types-C_qc_62W.js";
2
+ //#region src/wallet/mock/meta.ts
3
+ const MOCK_SUPPORTED_METHODS = [
4
+ LoginMethod.WALLET,
5
+ LoginMethod.GOOGLE,
6
+ LoginMethod.APPLE,
7
+ LoginMethod.EMAIL
8
+ ];
9
+ const DEFAULT_MOCK_METHODS = [
10
+ LoginMethod.WALLET,
11
+ LoginMethod.GOOGLE,
12
+ LoginMethod.EMAIL
13
+ ];
14
+ function resolveMockMethods(methods) {
15
+ if (!methods || methods.length === 0) return [...DEFAULT_MOCK_METHODS];
16
+ const resolved = [];
17
+ for (const method of methods) {
18
+ const value = method;
19
+ if (!MOCK_SUPPORTED_METHODS.includes(value)) throw new Error(`MockAdapter cannot support login method "${method}"`);
20
+ resolved.push(value);
21
+ }
22
+ return resolved;
23
+ }
24
+ const mockAdapterMeta = {
25
+ id: "mock",
26
+ redirectReturnParams: []
27
+ };
28
+ //#endregion
29
+ export { mockAdapterMeta as n, resolveMockMethods as r, DEFAULT_MOCK_METHODS as t };
30
+
31
+ //# sourceMappingURL=meta-CHgd9Qd0.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"meta-CHgd9Qd0.js","names":[],"sources":["../src/wallet/mock/meta.ts"],"sourcesContent":["import { LoginMethod, type WalletAdapterMeta } from \"../types.js\";\n\nexport type MockLoginMethod = \"wallet\" | \"google\" | \"apple\" | \"email\";\n\nconst MOCK_SUPPORTED_METHODS: MockLoginMethod[] = [\n LoginMethod.WALLET,\n LoginMethod.GOOGLE,\n LoginMethod.APPLE,\n LoginMethod.EMAIL,\n];\n\n// Methods offered when config omits `methods`.\nexport const DEFAULT_MOCK_METHODS: LoginMethod[] = [\n LoginMethod.WALLET,\n LoginMethod.GOOGLE,\n LoginMethod.EMAIL,\n];\n\n/** Config for the mock wallet adapter. TEST/DEV ONLY — signs with a local key; never enable in production. */\nexport interface PHRenownMockAdapterConfig {\n /** Signing key; defaults to the well-known Anvil test account #0. */\n privateKey?: `0x${string}`;\n /** Chain id reported in the session (default 1). */\n chainId?: number;\n /** Methods this adapter answers for; defaults to wallet + google + email. */\n methods?: MockLoginMethod[];\n}\n\n// Resolve config `methods` to the supported set, falling back to the default.\n// Takes string[] because Connect's config arrives from JSON, unvalidated.\nexport function resolveMockMethods(methods?: string[]): LoginMethod[] {\n if (!methods || methods.length === 0) return [...DEFAULT_MOCK_METHODS];\n const resolved: LoginMethod[] = [];\n for (const method of methods) {\n const value = method as MockLoginMethod;\n if (!MOCK_SUPPORTED_METHODS.includes(value)) {\n throw new Error(`MockAdapter cannot support login method \"${method}\"`);\n }\n resolved.push(value);\n }\n return resolved;\n}\n\n// Dependency-free identity (see privy/meta.ts). The mock signer has no\n// full-page OAuth redirect.\nexport const mockAdapterMeta: Omit<WalletAdapterMeta, \"supportedMethods\"> = {\n id: \"mock\",\n redirectReturnParams: [],\n};\n"],"mappings":";;AAIA,MAAM,yBAA4C;CAChD,YAAY;CACZ,YAAY;CACZ,YAAY;CACZ,YAAY;CACb;AAGD,MAAa,uBAAsC;CACjD,YAAY;CACZ,YAAY;CACZ,YAAY;CACb;AAcD,SAAgB,mBAAmB,SAAmC;AACpE,KAAI,CAAC,WAAW,QAAQ,WAAW,EAAG,QAAO,CAAC,GAAG,qBAAqB;CACtE,MAAM,WAA0B,EAAE;AAClC,MAAK,MAAM,UAAU,SAAS;EAC5B,MAAM,QAAQ;AACd,MAAI,CAAC,uBAAuB,SAAS,MAAM,CACzC,OAAM,IAAI,MAAM,4CAA4C,OAAO,GAAG;AAExE,WAAS,KAAK,MAAM;;AAEtB,QAAO;;AAKT,MAAa,kBAA+D;CAC1E,IAAI;CACJ,sBAAsB,EAAE;CACzB"}
@@ -0,0 +1,27 @@
1
+ import { t as LoginMethod } from "./types-C_qc_62W.js";
2
+ //#region src/wallet/privy/meta.ts
3
+ const PRIVY_SUPPORTED_METHODS = [
4
+ LoginMethod.WALLET,
5
+ LoginMethod.GOOGLE,
6
+ LoginMethod.APPLE,
7
+ LoginMethod.EMAIL
8
+ ];
9
+ const DEFAULT_PRIVY_METHODS = [LoginMethod.GOOGLE, LoginMethod.EMAIL];
10
+ function resolvePrivyMethods(methods) {
11
+ if (!methods || methods.length === 0) return [...DEFAULT_PRIVY_METHODS];
12
+ const resolved = [];
13
+ for (const method of methods) {
14
+ const value = method;
15
+ if (!PRIVY_SUPPORTED_METHODS.includes(value)) throw new Error(`PrivyAdapter cannot support login method "${method}"`);
16
+ resolved.push(value);
17
+ }
18
+ return resolved;
19
+ }
20
+ const privyAdapterMeta = {
21
+ id: "privy",
22
+ redirectReturnParams: ["privy_oauth_code", "privy_oauth_state"]
23
+ };
24
+ //#endregion
25
+ export { privyAdapterMeta as n, resolvePrivyMethods as r, DEFAULT_PRIVY_METHODS as t };
26
+
27
+ //# sourceMappingURL=meta-D-5kvwx8.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"meta-D-5kvwx8.js","names":[],"sources":["../src/wallet/privy/meta.ts"],"sourcesContent":["import { LoginMethod, type WalletAdapterMeta } from \"../types.js\";\n\n// Login methods the Privy adapter can drive. adapter.ts maps each to a Privy\n// login-method id, so adding one here without mapping it fails to compile.\nexport type PrivyLoginMethod = \"wallet\" | \"google\" | \"apple\" | \"email\";\n\nexport const PRIVY_SUPPORTED_METHODS: PrivyLoginMethod[] = [\n LoginMethod.WALLET,\n LoginMethod.GOOGLE,\n LoginMethod.APPLE,\n LoginMethod.EMAIL,\n];\n\n// Methods offered when config omits `methods`.\nexport const DEFAULT_PRIVY_METHODS: LoginMethod[] = [\n LoginMethod.GOOGLE,\n LoginMethod.EMAIL,\n];\n\n// Config slice for the Privy adapter (mirrors connect.renown.adapters.privy).\nexport interface PHRenownPrivyAdapterConfig {\n appId: string;\n clientId?: string;\n /** Login methods to offer; defaults to [google, email]. */\n methods?: PrivyLoginMethod[];\n}\n\n// Resolve config `methods` to the supported set, falling back to the default.\n// Takes string[] because Connect's config arrives from JSON, unvalidated.\nexport function resolvePrivyMethods(methods?: string[]): LoginMethod[] {\n if (!methods || methods.length === 0) return [...DEFAULT_PRIVY_METHODS];\n const resolved: LoginMethod[] = [];\n for (const method of methods) {\n const value = method as PrivyLoginMethod;\n if (!PRIVY_SUPPORTED_METHODS.includes(value)) {\n throw new Error(`PrivyAdapter cannot support login method \"${method}\"`);\n }\n resolved.push(value);\n }\n return resolved;\n}\n\n// Dependency-free identity, safe to import eagerly (pulls no wallet library);\n// the heavy factory stays behind the dynamic import in ./index.ts.\nexport const privyAdapterMeta: Omit<WalletAdapterMeta, \"supportedMethods\"> = {\n id: \"privy\",\n redirectReturnParams: [\"privy_oauth_code\", \"privy_oauth_state\"],\n};\n"],"mappings":";;AAMA,MAAa,0BAA8C;CACzD,YAAY;CACZ,YAAY;CACZ,YAAY;CACZ,YAAY;CACb;AAGD,MAAa,wBAAuC,CAClD,YAAY,QACZ,YAAY,MACb;AAYD,SAAgB,oBAAoB,SAAmC;AACrE,KAAI,CAAC,WAAW,QAAQ,WAAW,EAAG,QAAO,CAAC,GAAG,sBAAsB;CACvE,MAAM,WAA0B,EAAE;AAClC,MAAK,MAAM,UAAU,SAAS;EAC5B,MAAM,QAAQ;AACd,MAAI,CAAC,wBAAwB,SAAS,MAAM,CAC1C,OAAM,IAAI,MAAM,6CAA6C,OAAO,GAAG;AAEzE,WAAS,KAAK,MAAM;;AAEtB,QAAO;;AAKT,MAAa,mBAAgE;CAC3E,IAAI;CACJ,sBAAsB,CAAC,oBAAoB,oBAAoB;CAChE"}
@@ -0,0 +1,19 @@
1
+ import { o as WalletAdapterMeta, t as LoginMethod } from "./types-CxKG5UsV.js";
2
+
3
+ //#region src/wallet/mock/meta.d.ts
4
+ type MockLoginMethod = "wallet" | "google" | "apple" | "email";
5
+ declare const DEFAULT_MOCK_METHODS: LoginMethod[];
6
+ /** Config for the mock wallet adapter. TEST/DEV ONLY — signs with a local key; never enable in production. */
7
+ interface PHRenownMockAdapterConfig {
8
+ /** Signing key; defaults to the well-known Anvil test account #0. */
9
+ privateKey?: `0x${string}`;
10
+ /** Chain id reported in the session (default 1). */
11
+ chainId?: number;
12
+ /** Methods this adapter answers for; defaults to wallet + google + email. */
13
+ methods?: MockLoginMethod[];
14
+ }
15
+ declare function resolveMockMethods(methods?: string[]): LoginMethod[];
16
+ declare const mockAdapterMeta: Omit<WalletAdapterMeta, "supportedMethods">;
17
+ //#endregion
18
+ export { resolveMockMethods as a, mockAdapterMeta as i, MockLoginMethod as n, PHRenownMockAdapterConfig as r, DEFAULT_MOCK_METHODS as t };
19
+ //# sourceMappingURL=meta-DY5WCada.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"meta-DY5WCada.d.ts","names":[],"sources":["../src/wallet/mock/meta.ts"],"mappings":";;;KAEY,eAAA;AAAA,cAUC,oBAAA,EAAsB,WAAA;AAVnC;AAAA,UAiBiB,yBAAA;;EAEf,UAAA;EAnByB;EAqBzB,OAAA;EAPD;EASC,OAAA,GAAU,eAAA;AAAA;AAAA,iBAKI,kBAAA,CAAmB,OAAA,cAAqB,WAAA;AAAA,cAe3C,eAAA,EAAiB,IAAA,CAAK,iBAAA"}
@@ -0,0 +1,19 @@
1
+ import { o as WalletAdapterMeta, t as LoginMethod } from "./types-CxKG5UsV.js";
2
+
3
+ //#region src/wallet/rainbow/meta.d.ts
4
+ interface PHRenownChain {
5
+ id: number;
6
+ name: string;
7
+ }
8
+ interface PHRenownRainbowAdapterConfig {
9
+ walletConnectProjectId?: string;
10
+ infuraProjectId?: string;
11
+ appName?: string;
12
+ chains?: readonly [PHRenownChain, ...PHRenownChain[]];
13
+ ssr?: boolean;
14
+ }
15
+ declare const RAINBOW_METHODS: LoginMethod[];
16
+ declare const rainbowAdapterMeta: WalletAdapterMeta;
17
+ //#endregion
18
+ export { rainbowAdapterMeta as i, PHRenownRainbowAdapterConfig as n, RAINBOW_METHODS as r, PHRenownChain as t };
19
+ //# sourceMappingURL=meta-DbqBJa4j.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"meta-DbqBJa4j.d.ts","names":[],"sources":["../src/wallet/rainbow/meta.ts"],"mappings":";;;UAIiB,aAAA;EACf,EAAA;EACA,IAAA;AAAA;AAAA,UAKe,4BAAA;EAGf,sBAAA;EACA,eAAA;EACA,OAAA;EAGA,MAAA,aAAmB,aAAA,KAAkB,aAAA;EAGrC,GAAA;AAAA;AAAA,cAGW,eAAA,EAAiB,WAAA;AAAA,cAIjB,kBAAA,EAAoB,iBAAA"}
@@ -0,0 +1,16 @@
1
+ import { o as WalletAdapterMeta, t as LoginMethod } from "./types-CxKG5UsV.js";
2
+
3
+ //#region src/wallet/privy/meta.d.ts
4
+ type PrivyLoginMethod = "wallet" | "google" | "apple" | "email";
5
+ declare const DEFAULT_PRIVY_METHODS: LoginMethod[];
6
+ interface PHRenownPrivyAdapterConfig {
7
+ appId: string;
8
+ clientId?: string;
9
+ /** Login methods to offer; defaults to [google, email]. */
10
+ methods?: PrivyLoginMethod[];
11
+ }
12
+ declare function resolvePrivyMethods(methods?: string[]): LoginMethod[];
13
+ declare const privyAdapterMeta: Omit<WalletAdapterMeta, "supportedMethods">;
14
+ //#endregion
15
+ export { resolvePrivyMethods as a, privyAdapterMeta as i, PHRenownPrivyAdapterConfig as n, PrivyLoginMethod as r, DEFAULT_PRIVY_METHODS as t };
16
+ //# sourceMappingURL=meta-DjoNJy1t.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"meta-DjoNJy1t.d.ts","names":[],"sources":["../src/wallet/privy/meta.ts"],"mappings":";;;KAIY,gBAAA;AAAA,cAUC,qBAAA,EAAuB,WAAA;AAAA,UAMnB,0BAAA;EACf,KAAA;EACA,QAAA;EAlB0B;EAoB1B,OAAA,GAAU,gBAAA;AAAA;AAAA,iBAKI,mBAAA,CAAoB,OAAA,cAAqB,WAAA;AAAA,cAe5C,gBAAA,EAAkB,IAAA,CAAK,iBAAA"}
package/dist/node.d.ts CHANGED
@@ -1,5 +1,6 @@
1
- import { $ as User, A as ISigner, B as PKHDid, C as DIDResolutionResult, D as IPowerhouseIssuerType, E as IPowerhouseCredentialSubject, F as JWTVerified, G as RenownEvents, H as ProfileFetcher, I as JWTVerifyPolicies, J as RenownStorageMap, K as RenownProfile, L as JsonWebKey, M as InternalUser, N as Issuer, O as IProof, P as JWTPayload, Q as Unsubscribe, R as KeyCapabilitySection, S as DIDResolutionMetadata, T as IAuthCredentialSubject, U as Proof, V as PowerhouseVerifiableCredential, W as RenownEventEmitter, X as ServiceEndpoint, Y as Service, Z as Signer, _ as ConditionWeightedThreshold, a as signatureHasResultingHash, at as BaseStorage, b as DIDDocument, c as ConnectCrypto, ct as CREDENTIAL_SCHEMA_EIP712_TYPE, d as IConnectCrypto, dt as DEFAULT_RENOWN_CHAIN_ID, et as Verifiable, f as IRenownCrypto, ft as DEFAULT_RENOWN_NETWORK_ID, g as AuthVerifiedCredential, gt as VERIFIABLE_CREDENTIAL_EIP712_TYPE, h as AuthVerifiableCredential, ht as ISSUER_TYPE, i as parseSignatureHashField, it as W3CCredential, j as IVerifiableCredential, k as IRenown, l as RenownCrypto, lt as CREDENTIAL_SUBJECT_TYPE, m as JwkKeyPair, mt as DOMAIN_TYPE, n as createSignatureVerifier, nt as VerifiedCredential, o as MemoryKeyStorage, p as JsonWebKeyPairStorage, pt as DEFAULT_RENOWN_URL, q as RenownStorage, r as extractResultingHashFromSignature, rt as VerifiedJWT, s as RenownCryptoBuilder, st as IEventEmitter, t as RenownCryptoSigner, tt as VerificationMethod, u as DID, ut as CREDENTIAL_TYPES, v as CreateBearerTokenOptions, w as EcdsaSignature, x as DIDDocumentMetadata, y as CredentialStatus, z as LoginStatus } from "./signer-DYKGoYHB.js";
2
- import { C as Renown, S as verifyCredentialSignature, _ as VerifyAuthCredentialOptions, a as getResolver, b as recoverCredentialSigner, c as fetchRenownProfile, d as BuildCredentialParams, f as CredentialDomain, g as VerifiedAuthCredential, h as SignCredentialTypedData, i as createAuthBearerToken, l as BaseRenownBuilder, m as FetchDelegationCredentialOptions, n as VerifyAuthBearerTokenOptions, o as parsePkhDid, p as CredentialMessage, r as assertIsAuthCredential, s as verifyAuthBearerToken, t as ILogger, u as RenownBuilderOptions, v as buildAndSignCredential, w as RenownMemoryStorage, x as verifyAuthCredential, y as fetchDelegationCredential } from "./utils-C9ZgMs_C.js";
1
+ import { $ as IEventEmitter, A as LoginStatus, B as Service, C as InternalUser, D as JWTVerifyPolicies, E as JWTVerified, F as RenownEventEmitter, G as User, H as SignInParams, I as RenownEvents, J as VerifiedCredential, K as Verifiable, L as RenownProfile, M as PowerhouseVerifiableCredential, N as ProfileFetcher, O as JsonWebKey, P as Proof, R as RenownStorage, S as IVerifiableCredential, T as JWTPayload, U as Signer, V as ServiceEndpoint, W as Unsubscribe, X as W3CCredential, Y as VerifiedJWT, Z as BaseStorage, _ as IPowerhouseCredentialSubject, _t as DEFAULT_RENOWN_URL, a as JwkKeyPair, at as VerifiedAuthCredential, b as IRenown, bt as RENOWN_SESSION_COOKIE, c as ConditionWeightedThreshold, ct as fetchDelegationCredential, d as DIDDocument, dt as verifyCredentialSignature, et as BuildCredentialParams, f as DIDDocumentMetadata, ft as CREDENTIAL_SCHEMA_EIP712_TYPE, g as IAuthCredentialSubject, gt as DEFAULT_RENOWN_NETWORK_ID, h as EcdsaSignature, ht as DEFAULT_RENOWN_CHAIN_ID, i as JsonWebKeyPairStorage, it as SignCredentialTypedData, j as PKHDid, k as KeyCapabilitySection, l as CreateBearerTokenOptions, lt as recoverCredentialSigner, m as DIDResolutionResult, mt as CREDENTIAL_TYPES, n as IConnectCrypto, nt as CredentialMessage, o as AuthVerifiableCredential, ot as VerifyAuthCredentialOptions, p as DIDResolutionMetadata, pt as CREDENTIAL_SUBJECT_TYPE, q as VerificationMethod, r as IRenownCrypto, rt as FetchDelegationCredentialOptions, s as AuthVerifiedCredential, st as buildAndSignCredential, t as DID, tt as CredentialDomain, u as CredentialStatus, ut as verifyAuthCredential, v as IPowerhouseIssuerType, vt as DOMAIN_TYPE, w as Issuer, x as ISigner, xt as VERIFIABLE_CREDENTIAL_EIP712_TYPE, y as IProof, yt as ISSUER_TYPE, z as RenownStorageMap } from "./types-ocCFjR5j.js";
2
+ import { a as parseSignatureHashField, c as RenownCryptoBuilder, i as extractResultingHashFromSignature, l as ConnectCrypto, n as RenownCryptoSigner, o as signatureHasResultingHash, r as createSignatureVerifier, s as MemoryKeyStorage, u as RenownCrypto } from "./index-BF2qTv7d.js";
3
+ import { C as SwitchboardClient, S as RenownMemoryStorage, _ as BaseRenownBuilder, a as getResolver, b as resolveSwitchboardEndpoint, c as RenownSession, d as RenownSessionProfile, f as VerifyRenownSessionOptions, g as fetchRenownProfile, h as verifyRenownSession, i as createAuthBearerToken, l as RenownSessionClaims, m as serializeRenownSessionCookie, n as VerifyAuthBearerTokenOptions, o as parsePkhDid, p as readSessionClaims, r as assertIsAuthCredential, s as verifyAuthBearerToken, t as ILogger, u as RenownSessionCookie, v as RenownBuilderOptions, x as Renown, y as ResolveSwitchboardEndpointOptions } from "./utils-DS2Ha4Bg.js";
3
4
 
4
5
  //#region src/crypto/node-key-storage.d.ts
5
6
  declare const RENOWN_PRIVATE_KEY_ENV = "PH_RENOWN_PRIVATE_KEY";
@@ -53,17 +54,16 @@ interface NodeRenownBuilderOptions {
53
54
  keyPath?: string;
54
55
  /** Renown server URL. Defaults to https://www.renown.id */
55
56
  baseUrl?: string;
57
+ /** Switchboard GraphQL endpoint for the direct-to-reactor flow. */
58
+ switchboardUrl?: string;
59
+ /** Re-check a stored credential on build (default "always"). */
60
+ revalidate?: "always" | "never";
56
61
  }
57
- /**
58
- * Node.js-specific Renown builder with pre-configured defaults.
59
- * Uses file-based storage for both user data and key storage.
60
- */
62
+ /** Node.js Renown builder: file-based user + key storage. */
61
63
  declare class RenownBuilder extends BaseRenownBuilder {
62
- /**
63
- * @param appName - Application name used for signing context
64
- * @param options - Node.js-specific configuration options
65
- */
64
+ #private;
66
65
  constructor(appName: string, options?: NodeRenownBuilderOptions);
66
+ build(): Promise<Renown>;
67
67
  }
68
68
  //#endregion
69
69
  //#region src/login.node.d.ts
@@ -133,5 +133,5 @@ declare function parseExpiry(expiry: string): number;
133
133
  */
134
134
  declare function formatExpiry(expiresIn: number): string;
135
135
  //#endregion
136
- export { AccessTokenResult, AuthStatusResult, AuthVerifiableCredential, AuthVerifiedCredential, BaseRenownBuilder, BrowserLoginOptions, BrowserLoginResult, BuildCredentialParams, CREDENTIAL_SCHEMA_EIP712_TYPE, CREDENTIAL_SUBJECT_TYPE, CREDENTIAL_TYPES, ConditionWeightedThreshold, ConnectCrypto, CreateBearerTokenOptions, CredentialDomain, CredentialMessage, CredentialStatus, DEFAULT_KEYPAIR_PATH, DEFAULT_RENOWN_CHAIN_ID, DEFAULT_RENOWN_NETWORK_ID, DEFAULT_RENOWN_STORAGE_PATH, DEFAULT_RENOWN_URL, DID, DIDDocument, DIDDocumentMetadata, DIDResolutionMetadata, DIDResolutionResult, DOMAIN_TYPE, EcdsaSignature, FetchDelegationCredentialOptions, IAuthCredentialSubject, IConnectCrypto, ILogger, IPowerhouseCredentialSubject, IPowerhouseIssuerType, IProof, IRenown, IRenownCrypto, ISSUER_TYPE, ISigner, IVerifiableCredential, InternalUser, Issuer, JWTPayload, JWTVerified, JWTVerifyPolicies, JsonWebKey, JsonWebKeyPairStorage, JwkKeyPair, KeyCapabilitySection, LoginStatus, MemoryKeyStorage, NodeEventEmitter, NodeKeyStorage, NodeRenownBuilderOptions, NodeRenownEventEmitter, NodeRenownStorage, NodeStorage, PKHDid, PowerhouseVerifiableCredential, ProfileFetcher, Proof, RENOWN_PRIVATE_KEY_ENV, Renown, RenownBuilder, RenownBuilderOptions, RenownCrypto, RenownCryptoBuilder, RenownCryptoSigner, RenownEventEmitter, RenownEvents, RenownMemoryStorage, RenownProfile, RenownStorage, RenownStorageMap, Service, ServiceEndpoint, SignCredentialTypedData, Signer, Unsubscribe, User, VERIFIABLE_CREDENTIAL_EIP712_TYPE, Verifiable, VerificationMethod, VerifiedAuthCredential, VerifiedCredential, VerifiedJWT, VerifyAuthBearerTokenOptions, VerifyAuthCredentialOptions, W3CCredential, assertIsAuthCredential, browserLogin, buildAndSignCredential, createAuthBearerToken, createSignatureVerifier, extractResultingHashFromSignature, fetchDelegationCredential, fetchRenownProfile, formatExpiry, generateAccessToken, getAuthStatus, getResolver, openBrowser, parseExpiry, parsePkhDid, parseSignatureHashField, recoverCredentialSigner, signatureHasResultingHash, verifyAuthBearerToken, verifyAuthCredential, verifyCredentialSignature };
136
+ export { AccessTokenResult, AuthStatusResult, AuthVerifiableCredential, AuthVerifiedCredential, BaseRenownBuilder, BrowserLoginOptions, BrowserLoginResult, BuildCredentialParams, CREDENTIAL_SCHEMA_EIP712_TYPE, CREDENTIAL_SUBJECT_TYPE, CREDENTIAL_TYPES, ConditionWeightedThreshold, ConnectCrypto, CreateBearerTokenOptions, CredentialDomain, CredentialMessage, CredentialStatus, DEFAULT_KEYPAIR_PATH, DEFAULT_RENOWN_CHAIN_ID, DEFAULT_RENOWN_NETWORK_ID, DEFAULT_RENOWN_STORAGE_PATH, DEFAULT_RENOWN_URL, DID, DIDDocument, DIDDocumentMetadata, DIDResolutionMetadata, DIDResolutionResult, DOMAIN_TYPE, EcdsaSignature, FetchDelegationCredentialOptions, IAuthCredentialSubject, IConnectCrypto, ILogger, IPowerhouseCredentialSubject, IPowerhouseIssuerType, IProof, IRenown, IRenownCrypto, ISSUER_TYPE, ISigner, IVerifiableCredential, InternalUser, Issuer, JWTPayload, JWTVerified, JWTVerifyPolicies, JsonWebKey, JsonWebKeyPairStorage, JwkKeyPair, KeyCapabilitySection, LoginStatus, MemoryKeyStorage, NodeEventEmitter, NodeKeyStorage, NodeRenownBuilderOptions, NodeRenownEventEmitter, NodeRenownStorage, NodeStorage, PKHDid, PowerhouseVerifiableCredential, ProfileFetcher, Proof, RENOWN_PRIVATE_KEY_ENV, RENOWN_SESSION_COOKIE, Renown, RenownBuilder, RenownBuilderOptions, RenownCrypto, RenownCryptoBuilder, RenownCryptoSigner, RenownEventEmitter, RenownEvents, RenownMemoryStorage, RenownProfile, RenownSession, RenownSessionClaims, RenownSessionCookie, RenownSessionProfile, RenownStorage, RenownStorageMap, ResolveSwitchboardEndpointOptions, Service, ServiceEndpoint, SignCredentialTypedData, SignInParams, Signer, SwitchboardClient, Unsubscribe, User, VERIFIABLE_CREDENTIAL_EIP712_TYPE, Verifiable, VerificationMethod, VerifiedAuthCredential, VerifiedCredential, VerifiedJWT, VerifyAuthBearerTokenOptions, VerifyAuthCredentialOptions, VerifyRenownSessionOptions, W3CCredential, assertIsAuthCredential, browserLogin, buildAndSignCredential, createAuthBearerToken, createSignatureVerifier, extractResultingHashFromSignature, fetchDelegationCredential, fetchRenownProfile, formatExpiry, generateAccessToken, getAuthStatus, getResolver, openBrowser, parseExpiry, parsePkhDid, parseSignatureHashField, readSessionClaims, recoverCredentialSigner, resolveSwitchboardEndpoint, serializeRenownSessionCookie, signatureHasResultingHash, verifyAuthBearerToken, verifyAuthCredential, verifyCredentialSignature, verifyRenownSession };
137
137
  //# sourceMappingURL=node.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"node.d.ts","names":[],"sources":["../src/crypto/node-key-storage.ts","../src/event/event.node.ts","../src/storage/storage.node.ts","../src/init.node.ts","../src/login.node.ts"],"mappings":";;;;cAWa,sBAAA;AAAA,cACA,oBAAA;AADb;;;;;AACA;AADA,cASa,cAAA,YAA0B,qBAAA;EAAA;kBAKrB,oBAAA;EAAA,gBACA,sBAAA;cAGd,QAAA,WACA,OAAA;IAAW,UAAA;IAAqB,MAAA,GAAS,OAAA;EAAA;EAa3C,WAAA,CAAA,GAAe,OAAA,CAAQ,UAAA;EAyBjB,WAAA,CAAY,OAAA,EAAS,UAAA,GAAa,OAAA;EAWxC,aAAA,CAAA,GAAiB,OAAA;AAAA;;;cC5EN,gBAAA,gBACI,MAAA,8BACJ,aAAA,CAAc,MAAA;EAAA;;EAOzB,EAAA,iBAAmB,MAAA,CAAA,CACjB,KAAA,EAAO,CAAA,EACP,QAAA,GAAW,IAAA,EAAM,MAAA,CAAO,CAAA;EAQ1B,IAAA,iBAAqB,MAAA,CAAA,CAAQ,KAAA,EAAO,CAAA,EAAG,IAAA,EAAM,MAAA,CAAO,CAAA;AAAA;;;cClBzC,WAAA,WACD,MAAA,oBAA0B,MAAA,2BAC5B,WAAA,CAAY,CAAA;EAAA,iBACH,QAAA;cAEL,QAAA;EAAA,QAYJ,QAAA;EAAA,QAKA,SAAA;EAIR,GAAA,mBAAsB,CAAA,CAAA,CAAG,GAAA,EAAK,GAAA,GAAM,CAAA,CAAE,GAAA;EAKtC,GAAA,mBAAsB,CAAA,CAAA,CAAG,GAAA,EAAK,GAAA,EAAK,KAAA,GAAQ,CAAA,CAAE,GAAA;EAU7C,MAAA,CAAO,GAAA,QAAW,CAAA;AAAA;;;cCvCP,sBAAA,SAA+B,gBAAA,CAAiB,YAAA;AAAA,cAChD,iBAAA,SAA0B,WAAA,CAAY,gBAAA;AAAA,cAEtC,2BAAA;AAAA,UAEI,wBAAA;EHCgB;EGC/B,WAAA;EHD+B;EGG/B,OAAA;EHKW;EGHX,OAAA;AAAA;;;;;cAOW,aAAA,SAAsB,iBAAA;EHuDhB;;;;cGlDL,OAAA,UAAiB,OAAA,GAAS,wBAAA;AAAA;;;UCvBvB,mBAAA;;EAEf,SAAA;EJGW;EIDX,SAAA;;EAEA,UAAA,IAAc,GAAA,UAAa,SAAA;EJDM;EIGjC,UAAA;EJF+B;EII/B,mBAAA,IAAuB,GAAA;EJJQ;EIM/B,MAAA,GAAS,WAAA;AAAA;AAAA,UAGM,kBAAA;EACf,IAAA,EAAM,IAAA;EACN,MAAA;AAAA;AAAA,UAGe,gBAAA;EACf,aAAA;EACA,OAAA;EACA,OAAA;EACA,OAAA;EACA,MAAA;EACA,eAAA,GAAkB,IAAA;EAClB,OAAA;AAAA;;;;iBA+CoB,WAAA,CAAY,GAAA,WAAc,OAAA;;;;;;;;iBAyD1B,YAAA,CACpB,MAAA,EAAQ,OAAA,EACR,OAAA,EAAS,mBAAA,GACR,OAAA,CAAQ,kBAAA;;;;iBA2CK,aAAA,CAAc,MAAA,EAAQ,OAAA,GAAU,gBAAA;AAAA,UAe/B,iBAAA;EACf,KAAA;EACA,GAAA;EACA,OAAA;EACA,SAAA;AAAA;AHvMF;;;;;AAAA,iBG+MsB,mBAAA,CACpB,MAAA,EAAQ,OAAA,EACR,OAAA,GAAU,wBAAA,GACT,OAAA,CAAQ,iBAAA;;;;;;iBAuBK,WAAA,CAAY,MAAA;;;;iBAgCZ,YAAA,CAAa,SAAA"}
1
+ {"version":3,"file":"node.d.ts","names":[],"sources":["../src/crypto/node-key-storage.ts","../src/event/event.node.ts","../src/storage/storage.node.ts","../src/init.node.ts","../src/login.node.ts"],"mappings":";;;;;cAWa,sBAAA;AAAA,cACA,oBAAA;;AADb;;;;;cASa,cAAA,YAA0B,qBAAA;EAAA;kBAKrB,oBAAA;EAAA,gBACA,sBAAA;cAGd,QAAA,WACA,OAAA;IAAW,UAAA;IAAqB,MAAA,GAAS,OAAA;EAAA;EAa3C,WAAA,CAAA,GAAe,OAAA,CAAQ,UAAA;EAyBjB,WAAA,CAAY,OAAA,EAAS,UAAA,GAAa,OAAA;EAWxC,aAAA,CAAA,GAAiB,OAAA;AAAA;;;cC5EN,gBAAA,gBACI,MAAA,8BACJ,aAAA,CAAc,MAAA;EAAA;;EAOzB,EAAA,iBAAmB,MAAA,CAAA,CACjB,KAAA,EAAO,CAAA,EACP,QAAA,GAAW,IAAA,EAAM,MAAA,CAAO,CAAA;EAQ1B,IAAA,iBAAqB,MAAA,CAAA,CAAQ,KAAA,EAAO,CAAA,EAAG,IAAA,EAAM,MAAA,CAAO,CAAA;AAAA;;;cClBzC,WAAA,WACD,MAAA,oBAA0B,MAAA,2BAC5B,WAAA,CAAY,CAAA;EAAA,iBACH,QAAA;cAEL,QAAA;EAAA,QAYJ,QAAA;EAAA,QAKA,SAAA;EAIR,GAAA,mBAAsB,CAAA,CAAA,CAAG,GAAA,EAAK,GAAA,GAAM,CAAA,CAAE,GAAA;EAKtC,GAAA,mBAAsB,CAAA,CAAA,CAAG,GAAA,EAAK,GAAA,EAAK,KAAA,GAAQ,CAAA,CAAE,GAAA;EAU7C,MAAA,CAAO,GAAA,QAAW,CAAA;AAAA;;;cCtCP,sBAAA,SAA+B,gBAAA,CAAiB,YAAA;AAAA,cAChD,iBAAA,SAA0B,WAAA,CAAY,gBAAA;AAAA,cAEtC,2BAAA;AAAA,UAEI,wBAAA;EHAgB;EGE/B,WAAA;EHF+B;EGI/B,OAAA;EHIW;EGFX,OAAA;;EAEA,cAAA;EHuBuB;EGrBvB,UAAA;AAAA;;cAIW,aAAA,SAAsB,iBAAA;EAAA;cAGrB,OAAA,UAAiB,OAAA,GAAS,wBAAA;EAyBhC,KAAA,CAAA,GAAS,OAAA,CAAQ,MAAA;AAAA;;;UChDR,mBAAA;;EAEf,SAAA;;EAEA,SAAA;EJCiC;EICjC,UAAA,IAAc,GAAA,UAAa,SAAA;EJDM;EIGjC,UAAA;EJFW;EIIX,mBAAA,IAAuB,GAAA;;EAEvB,MAAA,GAAS,WAAA;AAAA;AAAA,UAGM,kBAAA;EACf,IAAA,EAAM,IAAA;EACN,MAAA;AAAA;AAAA,UAGe,gBAAA;EACf,aAAA;EACA,OAAA;EACA,OAAA;EACA,OAAA;EACA,MAAA;EACA,eAAA,GAAkB,IAAA;EAClB,OAAA;AAAA;;;;iBA+CoB,WAAA,CAAY,GAAA,WAAc,OAAA;;;;;;;;iBAyD1B,YAAA,CACpB,MAAA,EAAQ,OAAA,EACR,OAAA,EAAS,mBAAA,GACR,OAAA,CAAQ,kBAAA;;;;iBA2CK,aAAA,CAAc,MAAA,EAAQ,OAAA,GAAU,gBAAA;AAAA,UAe/B,iBAAA;EACf,KAAA;EACA,GAAA;EACA,OAAA;EACA,SAAA;AAAA;;AHvMF;;;;iBG+MsB,mBAAA,CACpB,MAAA,EAAQ,OAAA,EACR,OAAA,GAAU,wBAAA,GACT,OAAA,CAAQ,iBAAA;;;;;;iBAuBK,WAAA,CAAY,MAAA;;;;iBAgCZ,YAAA,CAAa,SAAA"}
package/dist/node.js CHANGED
@@ -1,5 +1,6 @@
1
- import { _ as DOMAIN_TYPE, a as BaseStorage, c as recoverCredentialSigner, d as CREDENTIAL_SCHEMA_EIP712_TYPE, f as CREDENTIAL_SUBJECT_TYPE, g as DEFAULT_RENOWN_URL, h as DEFAULT_RENOWN_NETWORK_ID, i as RenownMemoryStorage, l as verifyAuthCredential, m as DEFAULT_RENOWN_CHAIN_ID, n as fetchRenownProfile, o as buildAndSignCredential, p as CREDENTIAL_TYPES, r as Renown, s as fetchDelegationCredential, t as BaseRenownBuilder, u as verifyCredentialSignature, v as ISSUER_TYPE, y as VERIFIABLE_CREDENTIAL_EIP712_TYPE } from "./renown-builder-Sn_Y2Cb2.js";
2
- import { a as signatureHasResultingHash, c as ConnectCrypto, d as createAuthBearerToken, f as getResolver, i as parseSignatureHashField, l as RenownCrypto, m as verifyAuthBearerToken, n as createSignatureVerifier, o as MemoryKeyStorage, p as parsePkhDid, r as extractResultingHashFromSignature, s as RenownCryptoBuilder, t as RenownCryptoSigner, u as assertIsAuthCredential } from "./signer-CgYhXTV7.js";
1
+ import { a as DEFAULT_RENOWN_NETWORK_ID, c as ISSUER_TYPE, i as DEFAULT_RENOWN_CHAIN_ID, l as RENOWN_SESSION_COOKIE, n as CREDENTIAL_SUBJECT_TYPE, o as DEFAULT_RENOWN_URL, r as CREDENTIAL_TYPES, s as DOMAIN_TYPE, t as CREDENTIAL_SCHEMA_EIP712_TYPE, u as VERIFIABLE_CREDENTIAL_EIP712_TYPE } from "./constants-B7wOp9oo.js";
2
+ import { a as BaseStorage, c as recoverCredentialSigner, d as SwitchboardClient, f as resolveSwitchboardEndpoint, i as RenownMemoryStorage, l as verifyAuthCredential, n as fetchRenownProfile, o as buildAndSignCredential, r as Renown, s as fetchDelegationCredential, t as BaseRenownBuilder, u as verifyCredentialSignature } from "./renown-builder-KOzzCXrQ.js";
3
+ import { a as signatureHasResultingHash, c as ConnectCrypto, d as createAuthBearerToken, f as getResolver, i as parseSignatureHashField, l as RenownCrypto, m as verifyAuthBearerToken, n as createSignatureVerifier, o as MemoryKeyStorage, p as parsePkhDid, r as extractResultingHashFromSignature, s as RenownCryptoBuilder, t as RenownCryptoSigner, u as assertIsAuthCredential } from "./signer-BpvojvCh.js";
3
4
  import { existsSync, mkdirSync, readFileSync, unlinkSync, writeFileSync } from "node:fs";
4
5
  import { dirname, join } from "node:path";
5
6
  import { EventEmitter } from "node:events";
@@ -128,22 +129,23 @@ var NodeStorage = class extends BaseStorage {
128
129
  var NodeRenownEventEmitter = class extends NodeEventEmitter {};
129
130
  var NodeRenownStorage = class extends NodeStorage {};
130
131
  const DEFAULT_RENOWN_STORAGE_PATH = "./.ph/.renown.json";
131
- /**
132
- * Node.js-specific Renown builder with pre-configured defaults.
133
- * Uses file-based storage for both user data and key storage.
134
- */
132
+ /** Node.js Renown builder: file-based user + key storage. */
135
133
  var RenownBuilder = class extends BaseRenownBuilder {
136
- /**
137
- * @param appName - Application name used for signing context
138
- * @param options - Node.js-specific configuration options
139
- */
134
+ #revalidate;
140
135
  constructor(appName, options = {}) {
141
136
  super(appName);
142
- const { storagePath = DEFAULT_RENOWN_STORAGE_PATH, keyPath, baseUrl } = options;
137
+ const { storagePath = DEFAULT_RENOWN_STORAGE_PATH, keyPath, baseUrl, switchboardUrl, revalidate = "always" } = options;
138
+ this.#revalidate = revalidate;
143
139
  this.withKeyPairStorage(new NodeKeyStorage(keyPath));
144
140
  this.withStorage(new NodeRenownStorage(storagePath));
145
141
  this.withEventEmitter(new NodeRenownEventEmitter());
146
142
  if (baseUrl) this.withBaseUrl(baseUrl);
143
+ if (switchboardUrl) this.withSwitchboardUrl(switchboardUrl);
144
+ }
145
+ async build() {
146
+ const renown = await super.build();
147
+ if (this.#revalidate === "always" && renown.user) await renown.revalidate();
148
+ return renown;
147
149
  }
148
150
  };
149
151
  //#endregion
@@ -301,6 +303,96 @@ function formatExpiry(expiresIn) {
301
303
  return `${expiresIn} second${expiresIn !== 1 ? "s" : ""}`;
302
304
  }
303
305
  //#endregion
304
- export { BaseRenownBuilder, CREDENTIAL_SCHEMA_EIP712_TYPE, CREDENTIAL_SUBJECT_TYPE, CREDENTIAL_TYPES, ConnectCrypto, DEFAULT_KEYPAIR_PATH, DEFAULT_RENOWN_CHAIN_ID, DEFAULT_RENOWN_NETWORK_ID, DEFAULT_RENOWN_STORAGE_PATH, DEFAULT_RENOWN_URL, DOMAIN_TYPE, ISSUER_TYPE, MemoryKeyStorage, NodeEventEmitter, NodeKeyStorage, NodeRenownEventEmitter, NodeRenownStorage, NodeStorage, RENOWN_PRIVATE_KEY_ENV, Renown, RenownBuilder, RenownCrypto, RenownCryptoBuilder, RenownCryptoSigner, RenownMemoryStorage, VERIFIABLE_CREDENTIAL_EIP712_TYPE, assertIsAuthCredential, browserLogin, buildAndSignCredential, createAuthBearerToken, createSignatureVerifier, extractResultingHashFromSignature, fetchDelegationCredential, fetchRenownProfile, formatExpiry, generateAccessToken, getAuthStatus, getResolver, openBrowser, parseExpiry, parsePkhDid, parseSignatureHashField, recoverCredentialSigner, signatureHasResultingHash, verifyAuthBearerToken, verifyAuthCredential, verifyCredentialSignature };
306
+ //#region src/session.ts
307
+ /** Serialize a session cookie value (token + optional display hint). */
308
+ function serializeRenownSessionCookie(value) {
309
+ return JSON.stringify(value);
310
+ }
311
+ function parseSessionCookie(value) {
312
+ try {
313
+ const parsed = JSON.parse(value);
314
+ if (parsed && typeof parsed === "object" && typeof parsed.token === "string") return parsed;
315
+ } catch {}
316
+ }
317
+ function readSessionClaims(value) {
318
+ const parsed = parseSessionCookie(value);
319
+ if (!parsed) return void 0;
320
+ const parts = parsed.token.split(".");
321
+ if (parts.length < 2) return void 0;
322
+ try {
323
+ const json = Buffer.from(parts[1], "base64url").toString("utf8");
324
+ const payload = JSON.parse(json);
325
+ const subject = payload.vc?.credentialSubject;
326
+ return {
327
+ address: subject?.address,
328
+ chainId: subject?.chainId,
329
+ networkId: subject?.networkId,
330
+ expiresAt: payload.exp
331
+ };
332
+ } catch {
333
+ return;
334
+ }
335
+ }
336
+ async function verifyRenownSession(value, options = {}) {
337
+ const { verifyCredential = false } = options;
338
+ const parsed = parseSessionCookie(value);
339
+ if (!parsed) return void 0;
340
+ const { token, profile } = parsed;
341
+ let session;
342
+ if (verifyCredential) {
343
+ const verified = await verifyAuthCredential(token, {
344
+ audience: options.audience,
345
+ renownUrl: options.renownUrl,
346
+ switchboardUrl: options.switchboardUrl
347
+ });
348
+ if (verified) session = {
349
+ user: {
350
+ address: verified.address,
351
+ chainId: verified.chainId,
352
+ networkId: verified.networkId,
353
+ did: verified.did,
354
+ credential: verified.credential
355
+ },
356
+ appDid: verified.appDid
357
+ };
358
+ } else {
359
+ const verified = await verifyAuthBearerToken(token, { audience: options.audience });
360
+ if (verified) {
361
+ const subject = verified.verifiableCredential.credentialSubject;
362
+ const did = `did:pkh:${subject.networkId}:${subject.chainId}:${subject.address.toLowerCase()}`;
363
+ session = {
364
+ user: {
365
+ address: subject.address,
366
+ chainId: subject.chainId,
367
+ networkId: subject.networkId,
368
+ did,
369
+ credential: void 0
370
+ },
371
+ appDid: verified.issuer,
372
+ expiresAt: verified.payload.exp
373
+ };
374
+ }
375
+ }
376
+ if (!session) return void 0;
377
+ if (profile) {
378
+ const name = profile.name ?? profile.username ?? void 0;
379
+ const avatarUrl = profile.avatar ?? profile.userImage ?? void 0;
380
+ const user = { ...session.user };
381
+ if (name || avatarUrl) user.ens = {
382
+ name,
383
+ avatarUrl
384
+ };
385
+ if (profile.documentId) user.profile = {
386
+ documentId: profile.documentId,
387
+ username: profile.username ?? null,
388
+ userImage: profile.userImage ?? null,
389
+ ethAddress: session.user.address
390
+ };
391
+ session.user = user;
392
+ }
393
+ return session;
394
+ }
395
+ //#endregion
396
+ export { BaseRenownBuilder, CREDENTIAL_SCHEMA_EIP712_TYPE, CREDENTIAL_SUBJECT_TYPE, CREDENTIAL_TYPES, ConnectCrypto, DEFAULT_KEYPAIR_PATH, DEFAULT_RENOWN_CHAIN_ID, DEFAULT_RENOWN_NETWORK_ID, DEFAULT_RENOWN_STORAGE_PATH, DEFAULT_RENOWN_URL, DOMAIN_TYPE, ISSUER_TYPE, MemoryKeyStorage, NodeEventEmitter, NodeKeyStorage, NodeRenownEventEmitter, NodeRenownStorage, NodeStorage, RENOWN_PRIVATE_KEY_ENV, RENOWN_SESSION_COOKIE, Renown, RenownBuilder, RenownCrypto, RenownCryptoBuilder, RenownCryptoSigner, RenownMemoryStorage, SwitchboardClient, VERIFIABLE_CREDENTIAL_EIP712_TYPE, assertIsAuthCredential, browserLogin, buildAndSignCredential, createAuthBearerToken, createSignatureVerifier, extractResultingHashFromSignature, fetchDelegationCredential, fetchRenownProfile, formatExpiry, generateAccessToken, getAuthStatus, getResolver, openBrowser, parseExpiry, parsePkhDid, parseSignatureHashField, readSessionClaims, recoverCredentialSigner, resolveSwitchboardEndpoint, serializeRenownSessionCookie, signatureHasResultingHash, verifyAuthBearerToken, verifyAuthCredential, verifyCredentialSignature, verifyRenownSession };
305
397
 
306
398
  //# sourceMappingURL=node.js.map
package/dist/node.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"node.js","names":["#filePath","#envKeyName","#logger","#parseKeyPair","#loadFromFile","#saveToFile","#emitter"],"sources":["../src/crypto/node-key-storage.ts","../src/event/event.node.ts","../src/storage/storage.node.ts","../src/init.node.ts","../src/login.node.ts"],"sourcesContent":["import {\n existsSync,\n mkdirSync,\n readFileSync,\n unlinkSync,\n writeFileSync,\n} from \"node:fs\";\nimport { dirname, join } from \"node:path\";\nimport type { ILogger } from \"../utils.js\";\nimport type { JsonWebKeyPairStorage, JwkKeyPair } from \"./types.js\";\n\nexport const RENOWN_PRIVATE_KEY_ENV = \"PH_RENOWN_PRIVATE_KEY\";\nexport const DEFAULT_KEYPAIR_PATH = \".ph/.keypair.json\";\n\n/**\n * Key storage that supports:\n * 1. PH_RENOWN_PRIVATE_KEY environment variable (JSON-encoded JwkKeyPair)\n * 2. Custom file path passed via options\n * 3. Falls back to file storage at .ph/.keypair.json in current working directory\n */\nexport class NodeKeyStorage implements JsonWebKeyPairStorage {\n #filePath: string;\n #envKeyName: string;\n #logger?: ILogger;\n\n static readonly DEFAULT_KEYPAIR_PATH = DEFAULT_KEYPAIR_PATH;\n static readonly RENOWN_PRIVATE_KEY_ENV = RENOWN_PRIVATE_KEY_ENV;\n\n constructor(\n filePath?: string,\n options: { envKeyName?: string; logger?: ILogger } = {},\n ) {\n this.#filePath = filePath || join(process.cwd(), DEFAULT_KEYPAIR_PATH);\n this.#envKeyName = options.envKeyName || RENOWN_PRIVATE_KEY_ENV;\n this.#logger = options.logger;\n\n // Ensure directory exists\n const dir = dirname(this.#filePath);\n if (!existsSync(dir)) {\n mkdirSync(dir, { recursive: true });\n }\n }\n\n loadKeyPair(): Promise<JwkKeyPair | undefined> {\n // First check environment variable\n const envKey = process.env[this.#envKeyName];\n if (envKey) {\n try {\n const keyPairJson = JSON.parse(envKey) as unknown;\n const keyPair: JwkKeyPair = this.#parseKeyPair(keyPairJson);\n\n // Validate it has the required structure\n this.#logger?.debug(\"Loaded keypair from environment variable\");\n return Promise.resolve(keyPair);\n } catch (e) {\n throw new Error(\n `Failed to parse ${this.#envKeyName}: ${e instanceof Error ? e.message : String(e)}`,\n {\n cause: e,\n },\n );\n }\n }\n\n // Fall back to file storage\n return Promise.resolve(this.#loadFromFile());\n }\n\n async saveKeyPair(keyPair: JwkKeyPair): Promise<void> {\n // Don't save if using env var\n if (process.env[this.#envKeyName]) {\n return;\n }\n\n // Save to file\n this.#saveToFile(keyPair);\n return Promise.resolve();\n }\n\n removeKeyPair(): Promise<void> {\n if (process.env[this.#envKeyName]) {\n delete process.env[this.#envKeyName];\n }\n if (existsSync(this.#filePath)) {\n unlinkSync(this.#filePath);\n }\n return Promise.resolve();\n }\n\n #loadFromFile(): JwkKeyPair | undefined {\n try {\n if (!existsSync(this.#filePath)) {\n return undefined;\n }\n const data = readFileSync(this.#filePath, \"utf-8\");\n const parsed = JSON.parse(data) as unknown;\n const keyPair: JwkKeyPair = this.#parseKeyPair(parsed);\n this.#logger?.debug(`Loaded keypair from ${this.#filePath}`);\n return keyPair;\n } catch (e) {\n throw new Error(\n `Failed to parse ${this.#filePath}: ${e instanceof Error ? e.message : String(e)}`,\n {\n cause: e,\n },\n );\n }\n }\n\n #saveToFile(keyPair: JwkKeyPair): void {\n const data = { keyPair };\n writeFileSync(this.#filePath, JSON.stringify(data, null, 2), \"utf-8\");\n this.#logger?.debug(`Saved keypair to ${this.#filePath}`);\n }\n\n #parseKeyPair(json: unknown): JwkKeyPair {\n if (typeof json !== \"object\") {\n throw new Error(\"Invalid keyPair format:\" + JSON.stringify(json));\n }\n\n const object = json as JwkKeyPair | { keyPair: JwkKeyPair };\n let keyPair: JwkKeyPair;\n if (\"keyPair\" in object) {\n keyPair = object.keyPair;\n } else {\n keyPair = object;\n }\n\n if (\"publicKey\" in keyPair && \"privateKey\" in keyPair) {\n return keyPair;\n } else {\n throw new Error(\"Invalid keyPair format:\" + JSON.stringify(json));\n }\n }\n}\n","import { EventEmitter } from \"node:events\";\nimport type { IEventEmitter } from \"./types.js\";\n\nexport class NodeEventEmitter<\n Events extends Record<string, unknown>,\n> implements IEventEmitter<Events> {\n #emitter = new EventEmitter();\n\n constructor() {\n this.#emitter.setMaxListeners(0);\n }\n\n on<K extends keyof Events>(\n event: K,\n listener: (data: Events[K]) => void,\n ): () => void {\n this.#emitter.on(event as string, listener);\n return () => {\n this.#emitter.removeListener(event.toString(), listener);\n };\n }\n\n emit<K extends keyof Events>(event: K, data: Events[K]): void {\n this.#emitter.emit(event.toString(), data);\n }\n}\n","import { existsSync, mkdirSync, readFileSync, writeFileSync } from \"node:fs\";\nimport { dirname } from \"node:path\";\nimport { BaseStorage } from \"./common.js\";\n\nexport class NodeStorage<\n T extends Record<string, unknown> = Record<string, unknown>,\n> extends BaseStorage<T> {\n private readonly filePath: string;\n\n constructor(filePath: string) {\n super();\n this.filePath = filePath;\n\n const parentFolder = dirname(this.filePath);\n mkdirSync(parentFolder, { recursive: true });\n\n if (!existsSync(this.filePath)) {\n writeFileSync(this.filePath, JSON.stringify({}));\n }\n }\n\n private readData(): T {\n const data = readFileSync(this.filePath, \"utf-8\");\n return JSON.parse(data) as T;\n }\n\n private writeData(data: T): void {\n writeFileSync(this.filePath, JSON.stringify(data, null, 2));\n }\n\n get<Key extends keyof T>(key: Key): T[Key] | undefined {\n const data = this.readData();\n return data[key];\n }\n\n set<Key extends keyof T>(key: Key, value?: T[Key]): void {\n const data = this.readData();\n if (value === undefined) {\n delete data[key];\n } else {\n data[key] = value;\n }\n this.writeData(data);\n }\n\n delete(key: keyof T): void {\n const data = this.readData();\n delete data[key];\n this.writeData(data);\n }\n}\n","import { NodeKeyStorage } from \"./crypto/node-key-storage.js\";\nimport { NodeEventEmitter } from \"./event/event.node.js\";\nimport { BaseRenownBuilder } from \"./renown-builder.js\";\nimport { NodeStorage } from \"./storage/storage.node.js\";\nimport type { RenownEvents, RenownStorageMap } from \"./types.js\";\n\nexport class NodeRenownEventEmitter extends NodeEventEmitter<RenownEvents> {}\nexport class NodeRenownStorage extends NodeStorage<RenownStorageMap> {}\n\nexport const DEFAULT_RENOWN_STORAGE_PATH = \"./.ph/.renown.json\";\n\nexport interface NodeRenownBuilderOptions {\n /** File path for user storage. Defaults to \".ph/.renown.json\" in cwd */\n storagePath?: string;\n /** File path for keypair storage. Defaults to \".ph/.keypair.json\" in cwd */\n keyPath?: string;\n /** Renown server URL. Defaults to https://www.renown.id */\n baseUrl?: string;\n}\n\n/**\n * Node.js-specific Renown builder with pre-configured defaults.\n * Uses file-based storage for both user data and key storage.\n */\nexport class RenownBuilder extends BaseRenownBuilder {\n /**\n * @param appName - Application name used for signing context\n * @param options - Node.js-specific configuration options\n */\n constructor(appName: string, options: NodeRenownBuilderOptions = {}) {\n super(appName);\n\n const {\n storagePath = DEFAULT_RENOWN_STORAGE_PATH,\n keyPath,\n baseUrl,\n } = options;\n\n this.withKeyPairStorage(new NodeKeyStorage(keyPath));\n this.withStorage(new NodeRenownStorage(storagePath));\n this.withEventEmitter(new NodeRenownEventEmitter());\n if (baseUrl) {\n this.withBaseUrl(baseUrl);\n }\n }\n}\n","import type { CreateBearerTokenOptions, IRenown, User } from \"./types.js\";\n\nconst DEFAULT_TIMEOUT_MS = 5 * 60 * 1000; // 5 minutes\nconst POLL_INTERVAL_MS = 500; // 0.5s: session store is in-memory, cheap to poll\nconst SECONDS_IN_DAY = 24 * 60 * 60;\n\nexport interface BrowserLoginOptions {\n /** Renown server URL */\n renownUrl: string;\n /** Timeout in milliseconds. Defaults to 5 minutes. */\n timeoutMs?: number;\n /** Called with the login URL and session ID before the browser is opened */\n onLoginUrl?: (url: string, sessionId: string) => void;\n /** Called on each poll tick while waiting for authentication */\n onPollTick?: () => void;\n /** Called when the browser failed to open automatically */\n onBrowserOpenFailed?: (url: string) => void;\n /** AbortSignal to cancel the login flow */\n signal?: AbortSignal;\n}\n\nexport interface BrowserLoginResult {\n user: User;\n cliDid: string;\n}\n\nexport interface AuthStatusResult {\n authenticated: boolean;\n address?: string;\n userDid?: string;\n chainId?: number;\n cliDid: string;\n authenticatedAt?: Date;\n baseUrl: string;\n}\n\ninterface PendingSessionResponse {\n sessionId: string;\n status: \"pending\";\n}\n\ninterface ReadySessionResponse {\n sessionId: string;\n status: \"ready\";\n address: string;\n chainId: number;\n did: string;\n credentialId: string;\n userDocumentId: string;\n}\n\ntype SessionResponse = PendingSessionResponse | ReadySessionResponse;\n\nfunction abortReason(signal: AbortSignal): Error {\n if (signal.reason instanceof Error) return signal.reason;\n if (signal.reason) return new Error(String(signal.reason));\n return new DOMException(\"Aborted\", \"AbortError\");\n}\n\nfunction sleep(ms: number, signal?: AbortSignal): Promise<void> {\n return new Promise((resolve, reject) => {\n if (signal?.aborted) {\n reject(abortReason(signal));\n return;\n }\n const onAbort = () => {\n clearTimeout(timer);\n reject(abortReason(signal!));\n };\n const timer = setTimeout(() => {\n signal?.removeEventListener(\"abort\", onAbort);\n resolve();\n }, ms);\n signal?.addEventListener(\"abort\", onAbort, { once: true });\n });\n}\n\n/**\n * Open a URL in the default browser (cross-platform).\n */\nexport async function openBrowser(url: string): Promise<void> {\n const { execFile } = await import(\"node:child_process\");\n const { promisify } = await import(\"node:util\");\n const execFileAsync = promisify(execFile);\n const platform = process.platform;\n\n if (platform === \"darwin\") {\n await execFileAsync(\"open\", [url]);\n } else if (platform === \"win32\") {\n await execFileAsync(\"cmd\", [\"/c\", \"start\", \"\", url]);\n } else {\n await execFileAsync(\"xdg-open\", [url]);\n }\n}\n\nasync function pollSession(\n renownUrl: string,\n sessionId: string,\n timeoutMs: number,\n onPollTick?: () => void,\n signal?: AbortSignal,\n): Promise<ReadySessionResponse | null> {\n const startTime = Date.now();\n const sessionUrl = new URL(\n `/api/console/session/${sessionId}`,\n renownUrl,\n ).toString();\n\n while (Date.now() - startTime < timeoutMs) {\n signal?.throwIfAborted();\n try {\n const response = await fetch(sessionUrl, { signal });\n if (response.ok) {\n const data = (await response.json()) as SessionResponse;\n if (data.status === \"ready\") {\n return data;\n }\n }\n } catch (error) {\n if (error instanceof DOMException && error.name === \"AbortError\")\n throw error;\n // Network error, will retry\n }\n onPollTick?.();\n await sleep(POLL_INTERVAL_MS, signal);\n }\n\n return null;\n}\n\n/**\n * Perform a browser-based login flow with Renown.\n * Opens the user's browser to authenticate, then polls for completion.\n * Throws if already authenticated or if the flow times out.\n * If the browser fails to open, the flow continues polling — callers\n * can use onBrowserOpenFailed to show the URL as a fallback.\n */\nexport async function browserLogin(\n renown: IRenown,\n options: BrowserLoginOptions,\n): Promise<BrowserLoginResult> {\n if (renown.user?.credential) {\n throw new Error(\n `Already authenticated as ${renown.user.address}. Logout first.`,\n );\n }\n\n const timeoutMs = options.timeoutMs ?? DEFAULT_TIMEOUT_MS;\n const sessionId = crypto.randomUUID();\n\n const loginUrl = new URL(\"/console\", options.renownUrl);\n loginUrl.searchParams.set(\"session\", sessionId);\n loginUrl.searchParams.set(\"connect\", renown.did);\n loginUrl.searchParams.set(\"app\", renown.did);\n\n const url = loginUrl.toString();\n options.onLoginUrl?.(url, sessionId);\n\n try {\n await openBrowser(url);\n } catch {\n options.onBrowserOpenFailed?.(url);\n }\n\n const result = await pollSession(\n options.renownUrl,\n sessionId,\n timeoutMs,\n options.onPollTick,\n options.signal,\n );\n\n if (!result) {\n throw new Error(\"Authentication timed out.\");\n }\n\n const user = await renown.login(result.did);\n return { user, cliDid: renown.did };\n}\n\n/**\n * Get the current authentication status from a Renown instance.\n */\nexport function getAuthStatus(renown: IRenown): AuthStatusResult {\n const user = renown.user;\n const credential = user?.credential;\n\n return {\n authenticated: !!credential,\n address: user?.address,\n userDid: user?.did,\n chainId: user?.chainId,\n cliDid: renown.did,\n authenticatedAt: credential ? new Date(credential.issuanceDate) : undefined,\n baseUrl: renown.baseUrl,\n };\n}\n\nexport interface AccessTokenResult {\n token: string;\n did: string;\n address: string;\n expiresIn: number;\n}\n\n/**\n * Generate a bearer token for API authentication.\n * Requires the user to be authenticated (via browserLogin or equivalent).\n * Throws if not authenticated.\n */\nexport async function generateAccessToken(\n renown: IRenown,\n options?: CreateBearerTokenOptions,\n): Promise<AccessTokenResult> {\n const user = renown.user;\n if (!user?.credential) {\n throw new Error(\n \"Not authenticated. Login first to generate access tokens.\",\n );\n }\n\n const token = await renown.getBearerToken(options ?? {});\n\n return {\n token,\n did: renown.did,\n address: user.address,\n expiresIn: options?.expiresIn ?? 0,\n };\n}\n\n/**\n * Parse a human-readable expiry string to seconds.\n * Supports formats: \"7d\" (days), \"24h\" (hours), \"3600\" (seconds), \"3600s\" (seconds).\n * Only accepts positive integers — decimals like \"1.5h\" are rejected.\n */\nexport function parseExpiry(expiry: string): number {\n const trimmed = expiry.trim().toLowerCase();\n const match = trimmed.match(/^(\\d+)(d|h|s)?$/);\n\n if (!match) {\n throw new Error(\n `Invalid expiry format: ${expiry}. Expected a positive integer with optional suffix: \"7d\", \"24h\", \"3600s\", or \"3600\".`,\n );\n }\n\n const value = Number(match[1]);\n const unit = match[2];\n\n if (value <= 0) {\n throw new Error(\n `Invalid expiry format: ${expiry}. Value must be a positive integer.`,\n );\n }\n\n switch (unit) {\n case \"d\":\n return value * SECONDS_IN_DAY;\n case \"h\":\n return value * 60 * 60;\n default:\n return value;\n }\n}\n\n/**\n * Format an expiry duration in seconds to a human-readable string.\n */\nexport function formatExpiry(expiresIn: number): string {\n const days = Math.floor(expiresIn / SECONDS_IN_DAY);\n const hours = Math.floor((expiresIn % SECONDS_IN_DAY) / 3600);\n\n if (days > 0) {\n const dayStr = `${days} day${days !== 1 ? \"s\" : \"\"}`;\n if (hours > 0) {\n return `${dayStr} and ${hours} hour${hours !== 1 ? \"s\" : \"\"}`;\n }\n return dayStr;\n }\n\n if (hours > 0) {\n return `${hours} hour${hours !== 1 ? \"s\" : \"\"}`;\n }\n\n return `${expiresIn} second${expiresIn !== 1 ? \"s\" : \"\"}`;\n}\n"],"mappings":"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"}
1
+ {"version":3,"file":"node.js","names":["#filePath","#envKeyName","#logger","#parseKeyPair","#loadFromFile","#saveToFile","#emitter","#revalidate"],"sources":["../src/crypto/node-key-storage.ts","../src/event/event.node.ts","../src/storage/storage.node.ts","../src/init.node.ts","../src/login.node.ts","../src/session.ts"],"sourcesContent":["import {\n existsSync,\n mkdirSync,\n readFileSync,\n unlinkSync,\n writeFileSync,\n} from \"node:fs\";\nimport { dirname, join } from \"node:path\";\nimport type { ILogger } from \"../utils.js\";\nimport type { JsonWebKeyPairStorage, JwkKeyPair } from \"./types.js\";\n\nexport const RENOWN_PRIVATE_KEY_ENV = \"PH_RENOWN_PRIVATE_KEY\";\nexport const DEFAULT_KEYPAIR_PATH = \".ph/.keypair.json\";\n\n/**\n * Key storage that supports:\n * 1. PH_RENOWN_PRIVATE_KEY environment variable (JSON-encoded JwkKeyPair)\n * 2. Custom file path passed via options\n * 3. Falls back to file storage at .ph/.keypair.json in current working directory\n */\nexport class NodeKeyStorage implements JsonWebKeyPairStorage {\n #filePath: string;\n #envKeyName: string;\n #logger?: ILogger;\n\n static readonly DEFAULT_KEYPAIR_PATH = DEFAULT_KEYPAIR_PATH;\n static readonly RENOWN_PRIVATE_KEY_ENV = RENOWN_PRIVATE_KEY_ENV;\n\n constructor(\n filePath?: string,\n options: { envKeyName?: string; logger?: ILogger } = {},\n ) {\n this.#filePath = filePath || join(process.cwd(), DEFAULT_KEYPAIR_PATH);\n this.#envKeyName = options.envKeyName || RENOWN_PRIVATE_KEY_ENV;\n this.#logger = options.logger;\n\n // Ensure directory exists\n const dir = dirname(this.#filePath);\n if (!existsSync(dir)) {\n mkdirSync(dir, { recursive: true });\n }\n }\n\n loadKeyPair(): Promise<JwkKeyPair | undefined> {\n // First check environment variable\n const envKey = process.env[this.#envKeyName];\n if (envKey) {\n try {\n const keyPairJson = JSON.parse(envKey) as unknown;\n const keyPair: JwkKeyPair = this.#parseKeyPair(keyPairJson);\n\n // Validate it has the required structure\n this.#logger?.debug(\"Loaded keypair from environment variable\");\n return Promise.resolve(keyPair);\n } catch (e) {\n throw new Error(\n `Failed to parse ${this.#envKeyName}: ${e instanceof Error ? e.message : String(e)}`,\n {\n cause: e,\n },\n );\n }\n }\n\n // Fall back to file storage\n return Promise.resolve(this.#loadFromFile());\n }\n\n async saveKeyPair(keyPair: JwkKeyPair): Promise<void> {\n // Don't save if using env var\n if (process.env[this.#envKeyName]) {\n return;\n }\n\n // Save to file\n this.#saveToFile(keyPair);\n return Promise.resolve();\n }\n\n removeKeyPair(): Promise<void> {\n if (process.env[this.#envKeyName]) {\n delete process.env[this.#envKeyName];\n }\n if (existsSync(this.#filePath)) {\n unlinkSync(this.#filePath);\n }\n return Promise.resolve();\n }\n\n #loadFromFile(): JwkKeyPair | undefined {\n try {\n if (!existsSync(this.#filePath)) {\n return undefined;\n }\n const data = readFileSync(this.#filePath, \"utf-8\");\n const parsed = JSON.parse(data) as unknown;\n const keyPair: JwkKeyPair = this.#parseKeyPair(parsed);\n this.#logger?.debug(`Loaded keypair from ${this.#filePath}`);\n return keyPair;\n } catch (e) {\n throw new Error(\n `Failed to parse ${this.#filePath}: ${e instanceof Error ? e.message : String(e)}`,\n {\n cause: e,\n },\n );\n }\n }\n\n #saveToFile(keyPair: JwkKeyPair): void {\n const data = { keyPair };\n writeFileSync(this.#filePath, JSON.stringify(data, null, 2), \"utf-8\");\n this.#logger?.debug(`Saved keypair to ${this.#filePath}`);\n }\n\n #parseKeyPair(json: unknown): JwkKeyPair {\n if (typeof json !== \"object\") {\n throw new Error(\"Invalid keyPair format:\" + JSON.stringify(json));\n }\n\n const object = json as JwkKeyPair | { keyPair: JwkKeyPair };\n let keyPair: JwkKeyPair;\n if (\"keyPair\" in object) {\n keyPair = object.keyPair;\n } else {\n keyPair = object;\n }\n\n if (\"publicKey\" in keyPair && \"privateKey\" in keyPair) {\n return keyPair;\n } else {\n throw new Error(\"Invalid keyPair format:\" + JSON.stringify(json));\n }\n }\n}\n","import { EventEmitter } from \"node:events\";\nimport type { IEventEmitter } from \"./types.js\";\n\nexport class NodeEventEmitter<\n Events extends Record<string, unknown>,\n> implements IEventEmitter<Events> {\n #emitter = new EventEmitter();\n\n constructor() {\n this.#emitter.setMaxListeners(0);\n }\n\n on<K extends keyof Events>(\n event: K,\n listener: (data: Events[K]) => void,\n ): () => void {\n this.#emitter.on(event as string, listener);\n return () => {\n this.#emitter.removeListener(event.toString(), listener);\n };\n }\n\n emit<K extends keyof Events>(event: K, data: Events[K]): void {\n this.#emitter.emit(event.toString(), data);\n }\n}\n","import { existsSync, mkdirSync, readFileSync, writeFileSync } from \"node:fs\";\nimport { dirname } from \"node:path\";\nimport { BaseStorage } from \"./common.js\";\n\nexport class NodeStorage<\n T extends Record<string, unknown> = Record<string, unknown>,\n> extends BaseStorage<T> {\n private readonly filePath: string;\n\n constructor(filePath: string) {\n super();\n this.filePath = filePath;\n\n const parentFolder = dirname(this.filePath);\n mkdirSync(parentFolder, { recursive: true });\n\n if (!existsSync(this.filePath)) {\n writeFileSync(this.filePath, JSON.stringify({}));\n }\n }\n\n private readData(): T {\n const data = readFileSync(this.filePath, \"utf-8\");\n return JSON.parse(data) as T;\n }\n\n private writeData(data: T): void {\n writeFileSync(this.filePath, JSON.stringify(data, null, 2));\n }\n\n get<Key extends keyof T>(key: Key): T[Key] | undefined {\n const data = this.readData();\n return data[key];\n }\n\n set<Key extends keyof T>(key: Key, value?: T[Key]): void {\n const data = this.readData();\n if (value === undefined) {\n delete data[key];\n } else {\n data[key] = value;\n }\n this.writeData(data);\n }\n\n delete(key: keyof T): void {\n const data = this.readData();\n delete data[key];\n this.writeData(data);\n }\n}\n","import type { Renown } from \"./common.js\";\nimport { NodeKeyStorage } from \"./crypto/node-key-storage.js\";\nimport { NodeEventEmitter } from \"./event/event.node.js\";\nimport { BaseRenownBuilder } from \"./renown-builder.js\";\nimport { NodeStorage } from \"./storage/storage.node.js\";\nimport type { RenownEvents, RenownStorageMap } from \"./types.js\";\n\nexport class NodeRenownEventEmitter extends NodeEventEmitter<RenownEvents> {}\nexport class NodeRenownStorage extends NodeStorage<RenownStorageMap> {}\n\nexport const DEFAULT_RENOWN_STORAGE_PATH = \"./.ph/.renown.json\";\n\nexport interface NodeRenownBuilderOptions {\n /** File path for user storage. Defaults to \".ph/.renown.json\" in cwd */\n storagePath?: string;\n /** File path for keypair storage. Defaults to \".ph/.keypair.json\" in cwd */\n keyPath?: string;\n /** Renown server URL. Defaults to https://www.renown.id */\n baseUrl?: string;\n /** Switchboard GraphQL endpoint for the direct-to-reactor flow. */\n switchboardUrl?: string;\n /** Re-check a stored credential on build (default \"always\"). */\n revalidate?: \"always\" | \"never\";\n}\n\n/** Node.js Renown builder: file-based user + key storage. */\nexport class RenownBuilder extends BaseRenownBuilder {\n #revalidate: \"always\" | \"never\";\n\n constructor(appName: string, options: NodeRenownBuilderOptions = {}) {\n super(appName);\n\n const {\n storagePath = DEFAULT_RENOWN_STORAGE_PATH,\n keyPath,\n baseUrl,\n switchboardUrl,\n revalidate = \"always\",\n } = options;\n\n this.#revalidate = revalidate;\n this.withKeyPairStorage(new NodeKeyStorage(keyPath));\n this.withStorage(new NodeRenownStorage(storagePath));\n this.withEventEmitter(new NodeRenownEventEmitter());\n if (baseUrl) {\n this.withBaseUrl(baseUrl);\n }\n if (switchboardUrl) {\n this.withSwitchboardUrl(switchboardUrl);\n }\n }\n\n // Node scripts/CLI act on auth state once and exit, so revalidation must\n // finish before build() resolves — block on it (unlike the browser builder).\n async build(): Promise<Renown> {\n const renown = await super.build();\n if (this.#revalidate === \"always\" && renown.user) {\n await renown.revalidate();\n }\n return renown;\n }\n}\n","import type { CreateBearerTokenOptions, IRenown, User } from \"./types.js\";\n\nconst DEFAULT_TIMEOUT_MS = 5 * 60 * 1000; // 5 minutes\nconst POLL_INTERVAL_MS = 500; // 0.5s: session store is in-memory, cheap to poll\nconst SECONDS_IN_DAY = 24 * 60 * 60;\n\nexport interface BrowserLoginOptions {\n /** Renown server URL */\n renownUrl: string;\n /** Timeout in milliseconds. Defaults to 5 minutes. */\n timeoutMs?: number;\n /** Called with the login URL and session ID before the browser is opened */\n onLoginUrl?: (url: string, sessionId: string) => void;\n /** Called on each poll tick while waiting for authentication */\n onPollTick?: () => void;\n /** Called when the browser failed to open automatically */\n onBrowserOpenFailed?: (url: string) => void;\n /** AbortSignal to cancel the login flow */\n signal?: AbortSignal;\n}\n\nexport interface BrowserLoginResult {\n user: User;\n cliDid: string;\n}\n\nexport interface AuthStatusResult {\n authenticated: boolean;\n address?: string;\n userDid?: string;\n chainId?: number;\n cliDid: string;\n authenticatedAt?: Date;\n baseUrl: string;\n}\n\ninterface PendingSessionResponse {\n sessionId: string;\n status: \"pending\";\n}\n\ninterface ReadySessionResponse {\n sessionId: string;\n status: \"ready\";\n address: string;\n chainId: number;\n did: string;\n credentialId: string;\n userDocumentId: string;\n}\n\ntype SessionResponse = PendingSessionResponse | ReadySessionResponse;\n\nfunction abortReason(signal: AbortSignal): Error {\n if (signal.reason instanceof Error) return signal.reason;\n if (signal.reason) return new Error(String(signal.reason));\n return new DOMException(\"Aborted\", \"AbortError\");\n}\n\nfunction sleep(ms: number, signal?: AbortSignal): Promise<void> {\n return new Promise((resolve, reject) => {\n if (signal?.aborted) {\n reject(abortReason(signal));\n return;\n }\n const onAbort = () => {\n clearTimeout(timer);\n reject(abortReason(signal!));\n };\n const timer = setTimeout(() => {\n signal?.removeEventListener(\"abort\", onAbort);\n resolve();\n }, ms);\n signal?.addEventListener(\"abort\", onAbort, { once: true });\n });\n}\n\n/**\n * Open a URL in the default browser (cross-platform).\n */\nexport async function openBrowser(url: string): Promise<void> {\n const { execFile } = await import(\"node:child_process\");\n const { promisify } = await import(\"node:util\");\n const execFileAsync = promisify(execFile);\n const platform = process.platform;\n\n if (platform === \"darwin\") {\n await execFileAsync(\"open\", [url]);\n } else if (platform === \"win32\") {\n await execFileAsync(\"cmd\", [\"/c\", \"start\", \"\", url]);\n } else {\n await execFileAsync(\"xdg-open\", [url]);\n }\n}\n\nasync function pollSession(\n renownUrl: string,\n sessionId: string,\n timeoutMs: number,\n onPollTick?: () => void,\n signal?: AbortSignal,\n): Promise<ReadySessionResponse | null> {\n const startTime = Date.now();\n const sessionUrl = new URL(\n `/api/console/session/${sessionId}`,\n renownUrl,\n ).toString();\n\n while (Date.now() - startTime < timeoutMs) {\n signal?.throwIfAborted();\n try {\n const response = await fetch(sessionUrl, { signal });\n if (response.ok) {\n const data = (await response.json()) as SessionResponse;\n if (data.status === \"ready\") {\n return data;\n }\n }\n } catch (error) {\n if (error instanceof DOMException && error.name === \"AbortError\")\n throw error;\n // Network error, will retry\n }\n onPollTick?.();\n await sleep(POLL_INTERVAL_MS, signal);\n }\n\n return null;\n}\n\n/**\n * Perform a browser-based login flow with Renown.\n * Opens the user's browser to authenticate, then polls for completion.\n * Throws if already authenticated or if the flow times out.\n * If the browser fails to open, the flow continues polling — callers\n * can use onBrowserOpenFailed to show the URL as a fallback.\n */\nexport async function browserLogin(\n renown: IRenown,\n options: BrowserLoginOptions,\n): Promise<BrowserLoginResult> {\n if (renown.user?.credential) {\n throw new Error(\n `Already authenticated as ${renown.user.address}. Logout first.`,\n );\n }\n\n const timeoutMs = options.timeoutMs ?? DEFAULT_TIMEOUT_MS;\n const sessionId = crypto.randomUUID();\n\n const loginUrl = new URL(\"/console\", options.renownUrl);\n loginUrl.searchParams.set(\"session\", sessionId);\n loginUrl.searchParams.set(\"connect\", renown.did);\n loginUrl.searchParams.set(\"app\", renown.did);\n\n const url = loginUrl.toString();\n options.onLoginUrl?.(url, sessionId);\n\n try {\n await openBrowser(url);\n } catch {\n options.onBrowserOpenFailed?.(url);\n }\n\n const result = await pollSession(\n options.renownUrl,\n sessionId,\n timeoutMs,\n options.onPollTick,\n options.signal,\n );\n\n if (!result) {\n throw new Error(\"Authentication timed out.\");\n }\n\n const user = await renown.login(result.did);\n return { user, cliDid: renown.did };\n}\n\n/**\n * Get the current authentication status from a Renown instance.\n */\nexport function getAuthStatus(renown: IRenown): AuthStatusResult {\n const user = renown.user;\n const credential = user?.credential;\n\n return {\n authenticated: !!credential,\n address: user?.address,\n userDid: user?.did,\n chainId: user?.chainId,\n cliDid: renown.did,\n authenticatedAt: credential ? new Date(credential.issuanceDate) : undefined,\n baseUrl: renown.baseUrl,\n };\n}\n\nexport interface AccessTokenResult {\n token: string;\n did: string;\n address: string;\n expiresIn: number;\n}\n\n/**\n * Generate a bearer token for API authentication.\n * Requires the user to be authenticated (via browserLogin or equivalent).\n * Throws if not authenticated.\n */\nexport async function generateAccessToken(\n renown: IRenown,\n options?: CreateBearerTokenOptions,\n): Promise<AccessTokenResult> {\n const user = renown.user;\n if (!user?.credential) {\n throw new Error(\n \"Not authenticated. Login first to generate access tokens.\",\n );\n }\n\n const token = await renown.getBearerToken(options ?? {});\n\n return {\n token,\n did: renown.did,\n address: user.address,\n expiresIn: options?.expiresIn ?? 0,\n };\n}\n\n/**\n * Parse a human-readable expiry string to seconds.\n * Supports formats: \"7d\" (days), \"24h\" (hours), \"3600\" (seconds), \"3600s\" (seconds).\n * Only accepts positive integers — decimals like \"1.5h\" are rejected.\n */\nexport function parseExpiry(expiry: string): number {\n const trimmed = expiry.trim().toLowerCase();\n const match = trimmed.match(/^(\\d+)(d|h|s)?$/);\n\n if (!match) {\n throw new Error(\n `Invalid expiry format: ${expiry}. Expected a positive integer with optional suffix: \"7d\", \"24h\", \"3600s\", or \"3600\".`,\n );\n }\n\n const value = Number(match[1]);\n const unit = match[2];\n\n if (value <= 0) {\n throw new Error(\n `Invalid expiry format: ${expiry}. Value must be a positive integer.`,\n );\n }\n\n switch (unit) {\n case \"d\":\n return value * SECONDS_IN_DAY;\n case \"h\":\n return value * 60 * 60;\n default:\n return value;\n }\n}\n\n/**\n * Format an expiry duration in seconds to a human-readable string.\n */\nexport function formatExpiry(expiresIn: number): string {\n const days = Math.floor(expiresIn / SECONDS_IN_DAY);\n const hours = Math.floor((expiresIn % SECONDS_IN_DAY) / 3600);\n\n if (days > 0) {\n const dayStr = `${days} day${days !== 1 ? \"s\" : \"\"}`;\n if (hours > 0) {\n return `${dayStr} and ${hours} hour${hours !== 1 ? \"s\" : \"\"}`;\n }\n return dayStr;\n }\n\n if (hours > 0) {\n return `${hours} hour${hours !== 1 ? \"s\" : \"\"}`;\n }\n\n return `${expiresIn} second${expiresIn !== 1 ? \"s\" : \"\"}`;\n}\n","import { verifyAuthCredential } from \"./credential.js\";\nimport type { User } from \"./types.js\";\nimport { verifyAuthBearerToken } from \"./utils.js\";\n\n/** Server-side view of an authenticated Renown session. */\nexport interface RenownSession {\n /** Authenticated user identity derived from the session token. */\n user: User;\n /** App/client DID the token was issued by. */\n appDid: string;\n /** Token expiry (epoch seconds), when present. */\n expiresAt?: number;\n}\n\n/** Display hint carried alongside the token (unverified; not for auth). */\nexport interface RenownSessionProfile {\n name?: string | null;\n avatar?: string | null;\n /** Renown profile document id, so SSR can resolve profile links. */\n documentId?: string | null;\n username?: string | null;\n userImage?: string | null;\n}\n\n/** The `renown_session` cookie payload: the bearer token + a display hint. */\nexport interface RenownSessionCookie {\n token: string;\n profile?: RenownSessionProfile | null;\n}\n\nexport interface VerifyRenownSessionOptions {\n /** Expected `aud` claim on the token. */\n audience?: string;\n /** Switchboard GraphQL endpoint used when re-verifying the credential. */\n switchboardUrl?: string;\n /** Renown service base URL used when re-verifying the credential. */\n renownUrl?: string;\n /** Also re-verify the credential against Switchboard (default false = token-only, no network). */\n verifyCredential?: boolean;\n}\n\n/** Claims read from a session token without verifying its signature. */\nexport interface RenownSessionClaims {\n address?: string;\n chainId?: number;\n networkId?: string;\n /** Expiry in epoch seconds. */\n expiresAt?: number;\n}\n\n/** Serialize a session cookie value (token + optional display hint). */\nexport function serializeRenownSessionCookie(\n value: RenownSessionCookie,\n): string {\n return JSON.stringify(value);\n}\n\n// Parse the JSON cookie envelope { token, profile }; undefined if malformed.\nfunction parseSessionCookie(value: string): RenownSessionCookie | undefined {\n try {\n const parsed = JSON.parse(value) as unknown;\n if (\n parsed &&\n typeof parsed === \"object\" &&\n typeof (parsed as RenownSessionCookie).token === \"string\"\n ) {\n return parsed as RenownSessionCookie;\n }\n } catch {\n // Malformed cookie.\n }\n return undefined;\n}\n\n// Decode a session cookie's claims WITHOUT verifying the signature — cheap\n// optimistic checks only (e.g. proxy redirect); never trust for access control.\nexport function readSessionClaims(\n value: string,\n): RenownSessionClaims | undefined {\n const parsed = parseSessionCookie(value);\n if (!parsed) return undefined;\n const parts = parsed.token.split(\".\");\n if (parts.length < 2) return undefined;\n try {\n const json = Buffer.from(parts[1], \"base64url\").toString(\"utf8\");\n const payload = JSON.parse(json) as {\n exp?: number;\n vc?: {\n credentialSubject?: {\n address?: string;\n chainId?: number;\n networkId?: string;\n };\n };\n };\n const subject = payload.vc?.credentialSubject;\n return {\n address: subject?.address,\n chainId: subject?.chainId,\n networkId: subject?.networkId,\n expiresAt: payload.exp,\n };\n } catch {\n return undefined;\n }\n}\n\n// Verify a session cookie (envelope or bare token) → user, or undefined. Pass\n// verifyCredential:true to also check vs Switchboard; envelope hint is merged.\nexport async function verifyRenownSession(\n value: string,\n options: VerifyRenownSessionOptions = {},\n): Promise<RenownSession | undefined> {\n const { verifyCredential = false } = options;\n const parsed = parseSessionCookie(value);\n if (!parsed) return undefined;\n const { token, profile } = parsed;\n\n let session: RenownSession | undefined;\n if (verifyCredential) {\n const verified = await verifyAuthCredential(token, {\n audience: options.audience,\n renownUrl: options.renownUrl,\n switchboardUrl: options.switchboardUrl,\n });\n if (verified) {\n session = {\n user: {\n address: verified.address as `0x${string}`,\n chainId: verified.chainId,\n networkId: verified.networkId,\n did: verified.did,\n credential: verified.credential,\n },\n appDid: verified.appDid,\n };\n }\n } else {\n const verified = await verifyAuthBearerToken(token, {\n audience: options.audience,\n });\n if (verified) {\n const subject = verified.verifiableCredential.credentialSubject;\n const did = `did:pkh:${subject.networkId}:${subject.chainId}:${subject.address.toLowerCase()}`;\n session = {\n user: {\n address: subject.address as `0x${string}`,\n chainId: subject.chainId,\n networkId: subject.networkId,\n did,\n credential: undefined,\n },\n appDid: verified.issuer,\n expiresAt: verified.payload.exp,\n };\n }\n }\n\n if (!session) return undefined;\n\n // Merge the (unverified) display hint from the envelope — display only. The\n // richer fields make this seed shape-identical to the client's restored user.\n if (profile) {\n const name = profile.name ?? profile.username ?? undefined;\n const avatarUrl = profile.avatar ?? profile.userImage ?? undefined;\n const user = { ...session.user };\n if (name || avatarUrl) {\n user.ens = { name, avatarUrl };\n }\n // Only `documentId` makes a seeded profile useful (profile links); display\n // already flows through `ens`, so there is nothing to seed without it.\n if (profile.documentId) {\n user.profile = {\n documentId: profile.documentId,\n username: profile.username ?? null,\n userImage: profile.userImage ?? null,\n ethAddress: session.user.address,\n };\n }\n session.user = user;\n }\n return session;\n}\n"],"mappings":"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"}