@renown/sdk 6.0.0-dev.23 → 6.0.0-dev.230

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 (197) hide show
  1. package/README.md +47 -437
  2. package/dist/index.d.ts +77 -0
  3. package/dist/index.d.ts.map +1 -0
  4. package/dist/index.js +173 -0
  5. package/dist/index.js.map +1 -0
  6. package/dist/node.d.ts +136 -0
  7. package/dist/node.d.ts.map +1 -0
  8. package/dist/node.js +305 -0
  9. package/dist/node.js.map +1 -0
  10. package/dist/renown-builder-EmbIygby.js +819 -0
  11. package/dist/renown-builder-EmbIygby.js.map +1 -0
  12. package/dist/utils-BGF8Qb5f.d.ts +689 -0
  13. package/dist/utils-BGF8Qb5f.d.ts.map +1 -0
  14. package/package.json +15 -38
  15. package/dist/e2e/fixtures/main.d.ts +0 -2
  16. package/dist/e2e/fixtures/main.d.ts.map +0 -1
  17. package/dist/e2e/fixtures/main.js +0 -97
  18. package/dist/e2e/fixtures/main.js.map +0 -1
  19. package/dist/e2e/fixtures/vite.config.d.ts +0 -3
  20. package/dist/e2e/fixtures/vite.config.d.ts.map +0 -1
  21. package/dist/e2e/fixtures/vite.config.js +0 -10
  22. package/dist/e2e/fixtures/vite.config.js.map +0 -1
  23. package/dist/e2e/renown-components.spec.d.ts +0 -2
  24. package/dist/e2e/renown-components.spec.d.ts.map +0 -1
  25. package/dist/e2e/renown-components.spec.js +0 -155
  26. package/dist/e2e/renown-components.spec.js.map +0 -1
  27. package/dist/playwright.config.d.ts +0 -3
  28. package/dist/playwright.config.d.ts.map +0 -1
  29. package/dist/playwright.config.js +0 -25
  30. package/dist/playwright.config.js.map +0 -1
  31. package/dist/src/assets/assets.d.ts +0 -19
  32. package/dist/src/assets/renown-hover.svg +0 -17
  33. package/dist/src/assets/renown-light.svg +0 -15
  34. package/dist/src/assets/renown-short-hover.png +0 -0
  35. package/dist/src/assets/renown-short.png +0 -0
  36. package/dist/src/assets/renown.svg +0 -16
  37. package/dist/src/common.d.ts +0 -15
  38. package/dist/src/common.d.ts.map +0 -1
  39. package/dist/src/common.js +0 -105
  40. package/dist/src/common.js.map +0 -1
  41. package/dist/src/components/RenownAuthButton.d.ts +0 -62
  42. package/dist/src/components/RenownAuthButton.d.ts.map +0 -1
  43. package/dist/src/components/RenownAuthButton.js +0 -82
  44. package/dist/src/components/RenownAuthButton.js.map +0 -1
  45. package/dist/src/components/RenownLoginButton.d.ts +0 -48
  46. package/dist/src/components/RenownLoginButton.d.ts.map +0 -1
  47. package/dist/src/components/RenownLoginButton.js +0 -175
  48. package/dist/src/components/RenownLoginButton.js.map +0 -1
  49. package/dist/src/components/RenownUserButton.d.ts +0 -66
  50. package/dist/src/components/RenownUserButton.d.ts.map +0 -1
  51. package/dist/src/components/RenownUserButton.js +0 -216
  52. package/dist/src/components/RenownUserButton.js.map +0 -1
  53. package/dist/src/components/icons.d.ts +0 -25
  54. package/dist/src/components/icons.d.ts.map +0 -1
  55. package/dist/src/components/icons.js +0 -24
  56. package/dist/src/components/icons.js.map +0 -1
  57. package/dist/src/components/image-data.d.ts +0 -3
  58. package/dist/src/components/image-data.d.ts.map +0 -1
  59. package/dist/src/components/image-data.js +0 -4
  60. package/dist/src/components/image-data.js.map +0 -1
  61. package/dist/src/components/index.d.ts +0 -8
  62. package/dist/src/components/index.d.ts.map +0 -1
  63. package/dist/src/components/index.js +0 -5
  64. package/dist/src/components/index.js.map +0 -1
  65. package/dist/src/constants.d.ts +0 -130
  66. package/dist/src/constants.d.ts.map +0 -1
  67. package/dist/src/constants.js +0 -40
  68. package/dist/src/constants.js.map +0 -1
  69. package/dist/src/crypto/browser-key-storage.d.ts +0 -8
  70. package/dist/src/crypto/browser-key-storage.d.ts.map +0 -1
  71. package/dist/src/crypto/browser-key-storage.js +0 -73
  72. package/dist/src/crypto/browser-key-storage.js.map +0 -1
  73. package/dist/src/crypto/index.d.ts +0 -36
  74. package/dist/src/crypto/index.d.ts.map +0 -1
  75. package/dist/src/crypto/index.js +0 -130
  76. package/dist/src/crypto/index.js.map +0 -1
  77. package/dist/src/crypto/node-key-storage.d.ts +0 -8
  78. package/dist/src/crypto/node-key-storage.d.ts.map +0 -1
  79. package/dist/src/crypto/node-key-storage.js +0 -67
  80. package/dist/src/crypto/node-key-storage.js.map +0 -1
  81. package/dist/src/crypto/node.d.ts +0 -2
  82. package/dist/src/crypto/node.d.ts.map +0 -1
  83. package/dist/src/crypto/node.js +0 -3
  84. package/dist/src/crypto/node.js.map +0 -1
  85. package/dist/src/crypto/signer.d.ts +0 -21
  86. package/dist/src/crypto/signer.d.ts.map +0 -1
  87. package/dist/src/crypto/signer.js +0 -236
  88. package/dist/src/crypto/signer.js.map +0 -1
  89. package/dist/src/event/event.browser.d.ts +0 -10
  90. package/dist/src/event/event.browser.d.ts.map +0 -1
  91. package/dist/src/event/event.browser.js +0 -24
  92. package/dist/src/event/event.browser.js.map +0 -1
  93. package/dist/src/event/event.node.d.ts +0 -8
  94. package/dist/src/event/event.node.d.ts.map +0 -1
  95. package/dist/src/event/event.node.js +0 -17
  96. package/dist/src/event/event.node.js.map +0 -1
  97. package/dist/src/event/types.d.ts +0 -16
  98. package/dist/src/event/types.d.ts.map +0 -1
  99. package/dist/src/event/types.js +0 -2
  100. package/dist/src/event/types.js.map +0 -1
  101. package/dist/src/hooks/index.d.ts +0 -2
  102. package/dist/src/hooks/index.d.ts.map +0 -1
  103. package/dist/src/hooks/index.js +0 -2
  104. package/dist/src/hooks/index.js.map +0 -1
  105. package/dist/src/hooks/use-user.d.ts +0 -21
  106. package/dist/src/hooks/use-user.d.ts.map +0 -1
  107. package/dist/src/hooks/use-user.js +0 -30
  108. package/dist/src/hooks/use-user.js.map +0 -1
  109. package/dist/src/index.browser.d.ts +0 -4
  110. package/dist/src/index.browser.d.ts.map +0 -1
  111. package/dist/src/index.browser.js +0 -4
  112. package/dist/src/index.browser.js.map +0 -1
  113. package/dist/src/index.d.ts +0 -13
  114. package/dist/src/index.d.ts.map +0 -1
  115. package/dist/src/index.js +0 -13
  116. package/dist/src/index.js.map +0 -1
  117. package/dist/src/index.node.d.ts +0 -4
  118. package/dist/src/index.node.d.ts.map +0 -1
  119. package/dist/src/index.node.js +0 -4
  120. package/dist/src/index.node.js.map +0 -1
  121. package/dist/src/init.browser.d.ts +0 -3
  122. package/dist/src/init.browser.d.ts.map +0 -1
  123. package/dist/src/init.browser.js +0 -7
  124. package/dist/src/init.browser.js.map +0 -1
  125. package/dist/src/init.node.d.ts +0 -3
  126. package/dist/src/init.node.d.ts.map +0 -1
  127. package/dist/src/init.node.js +0 -8
  128. package/dist/src/init.node.js.map +0 -1
  129. package/dist/src/lib/crypto/browser.d.ts +0 -8
  130. package/dist/src/lib/crypto/browser.d.ts.map +0 -1
  131. package/dist/src/lib/crypto/browser.js +0 -73
  132. package/dist/src/lib/crypto/browser.js.map +0 -1
  133. package/dist/src/lib/crypto/index.d.ts +0 -36
  134. package/dist/src/lib/crypto/index.d.ts.map +0 -1
  135. package/dist/src/lib/crypto/index.js +0 -150
  136. package/dist/src/lib/crypto/index.js.map +0 -1
  137. package/dist/src/lib/crypto/node.d.ts +0 -8
  138. package/dist/src/lib/crypto/node.d.ts.map +0 -1
  139. package/dist/src/lib/crypto/node.js +0 -67
  140. package/dist/src/lib/crypto/node.js.map +0 -1
  141. package/dist/src/lib/renown/constants.d.ts +0 -130
  142. package/dist/src/lib/renown/constants.d.ts.map +0 -1
  143. package/dist/src/lib/renown/constants.js +0 -40
  144. package/dist/src/lib/renown/constants.js.map +0 -1
  145. package/dist/src/lib/renown/did-parser.d.ts +0 -28
  146. package/dist/src/lib/renown/did-parser.d.ts.map +0 -1
  147. package/dist/src/lib/renown/did-parser.js +0 -57
  148. package/dist/src/lib/renown/did-parser.js.map +0 -1
  149. package/dist/src/lib/renown/index.d.ts +0 -4
  150. package/dist/src/lib/renown/index.d.ts.map +0 -1
  151. package/dist/src/lib/renown/index.js +0 -4
  152. package/dist/src/lib/renown/index.js.map +0 -1
  153. package/dist/src/lib/renown/utils.d.ts +0 -33
  154. package/dist/src/lib/renown/utils.d.ts.map +0 -1
  155. package/dist/src/lib/renown/utils.js +0 -207
  156. package/dist/src/lib/renown/utils.js.map +0 -1
  157. package/dist/src/lib/session-storage.d.ts +0 -40
  158. package/dist/src/lib/session-storage.d.ts.map +0 -1
  159. package/dist/src/lib/session-storage.js +0 -107
  160. package/dist/src/lib/session-storage.js.map +0 -1
  161. package/dist/src/node.d.ts +0 -6
  162. package/dist/src/node.d.ts.map +0 -1
  163. package/dist/src/node.js +0 -6
  164. package/dist/src/node.js.map +0 -1
  165. package/dist/src/providers/index.d.ts +0 -3
  166. package/dist/src/providers/index.d.ts.map +0 -1
  167. package/dist/src/providers/index.js +0 -2
  168. package/dist/src/providers/index.js.map +0 -1
  169. package/dist/src/providers/renown-user-provider.d.ts +0 -72
  170. package/dist/src/providers/renown-user-provider.d.ts.map +0 -1
  171. package/dist/src/providers/renown-user-provider.js +0 -171
  172. package/dist/src/providers/renown-user-provider.js.map +0 -1
  173. package/dist/src/storage/common.d.ts +0 -13
  174. package/dist/src/storage/common.d.ts.map +0 -1
  175. package/dist/src/storage/common.js +0 -7
  176. package/dist/src/storage/common.js.map +0 -1
  177. package/dist/src/storage/storage.browser.d.ts +0 -9
  178. package/dist/src/storage/storage.browser.d.ts.map +0 -1
  179. package/dist/src/storage/storage.browser.js +0 -25
  180. package/dist/src/storage/storage.browser.js.map +0 -1
  181. package/dist/src/storage/storage.node.d.ts +0 -11
  182. package/dist/src/storage/storage.node.d.ts.map +0 -1
  183. package/dist/src/storage/storage.node.js +0 -40
  184. package/dist/src/storage/storage.node.js.map +0 -1
  185. package/dist/src/types.d.ts +0 -80
  186. package/dist/src/types.d.ts.map +0 -1
  187. package/dist/src/types.js +0 -2
  188. package/dist/src/types.js.map +0 -1
  189. package/dist/src/utils.d.ts +0 -17
  190. package/dist/src/utils.d.ts.map +0 -1
  191. package/dist/src/utils.js +0 -80
  192. package/dist/src/utils.js.map +0 -1
  193. package/dist/tests/auth.test.d.ts +0 -2
  194. package/dist/tests/auth.test.d.ts.map +0 -1
  195. package/dist/tests/auth.test.js +0 -13
  196. package/dist/tests/auth.test.js.map +0 -1
  197. package/dist/tsconfig.tsbuildinfo +0 -1
package/dist/index.js ADDED
@@ -0,0 +1,173 @@
1
+ import { C as DEFAULT_RENOWN_CHAIN_ID, D as ISSUER_TYPE, E as DOMAIN_TYPE, O as VERIFIABLE_CREDENTIAL_EIP712_TYPE, S as CREDENTIAL_TYPES, T as DEFAULT_RENOWN_URL, _ as getResolver, a as BaseStorage, b as CREDENTIAL_SCHEMA_EIP712_TYPE, c as extractResultingHashFromSignature, d as MemoryKeyStorage, f as RenownCryptoBuilder, g as createAuthBearerToken, h as assertIsAuthCredential, i as RenownMemoryStorage, l as parseSignatureHashField, m as RenownCrypto, n as fetchRenownProfile, o as RenownCryptoSigner, p as ConnectCrypto, r as Renown, s as createSignatureVerifier, t as BaseRenownBuilder, u as signatureHasResultingHash, v as parsePkhDid, w as DEFAULT_RENOWN_NETWORK_ID, x as CREDENTIAL_SUBJECT_TYPE, y as verifyAuthBearerToken } from "./renown-builder-EmbIygby.js";
2
+ //#region src/crypto/browser-key-storage.ts
3
+ const DEFAULT_DB_NAME = "renownKeyDB";
4
+ const STORE_NAME = "keyPairs";
5
+ const KEY = "keyPair";
6
+ var BrowserKeyStorage = class BrowserKeyStorage {
7
+ #db;
8
+ constructor(db) {
9
+ this.#db = db;
10
+ }
11
+ static async create(dbName = DEFAULT_DB_NAME) {
12
+ return new BrowserKeyStorage(await BrowserKeyStorage.#openDatabase(dbName));
13
+ }
14
+ static #openDatabase(dbName) {
15
+ return new Promise((resolve, reject) => {
16
+ const req = indexedDB.open(dbName);
17
+ req.onupgradeneeded = (event) => {
18
+ const db = event.target.result;
19
+ if (!db.objectStoreNames.contains(STORE_NAME)) db.createObjectStore(STORE_NAME);
20
+ };
21
+ req.onsuccess = () => {
22
+ const db = req.result;
23
+ if (!db.objectStoreNames.contains(STORE_NAME)) {
24
+ const currentVersion = db.version;
25
+ db.close();
26
+ const upgradeReq = indexedDB.open(dbName, currentVersion + 1);
27
+ upgradeReq.onupgradeneeded = (event) => {
28
+ const upgradeDb = event.target.result;
29
+ if (!upgradeDb.objectStoreNames.contains(STORE_NAME)) upgradeDb.createObjectStore(STORE_NAME);
30
+ };
31
+ upgradeReq.onsuccess = () => resolve(upgradeReq.result);
32
+ upgradeReq.onerror = () => reject(upgradeReq.error);
33
+ } else resolve(db);
34
+ };
35
+ req.onerror = () => reject(req.error);
36
+ });
37
+ }
38
+ #useStore(mode = "readwrite") {
39
+ return this.#db.transaction(STORE_NAME, mode).objectStore(STORE_NAME);
40
+ }
41
+ async saveKeyPair(keyPair) {
42
+ const request = this.#useStore().put(keyPair, KEY);
43
+ return new Promise((resolve, reject) => {
44
+ request.onsuccess = () => resolve();
45
+ request.onerror = () => reject(/* @__PURE__ */ new Error("Failed to save key pair"));
46
+ });
47
+ }
48
+ async loadKeyPair() {
49
+ const request = this.#useStore("readonly").get(KEY);
50
+ return new Promise((resolve, reject) => {
51
+ request.onsuccess = () => {
52
+ const keyPair = request.result;
53
+ resolve(keyPair);
54
+ };
55
+ request.onerror = () => reject(/* @__PURE__ */ new Error("Failed to load key pair"));
56
+ });
57
+ }
58
+ async removeKeyPair() {
59
+ const request = this.#useStore().delete(KEY);
60
+ return new Promise((resolve, reject) => {
61
+ request.onsuccess = () => resolve();
62
+ request.onerror = () => reject(/* @__PURE__ */ new Error("Failed to remove key pair"));
63
+ });
64
+ }
65
+ };
66
+ //#endregion
67
+ //#region src/event/event.browser.ts
68
+ var TypedCustomEvent = class extends CustomEvent {
69
+ constructor(type, detail) {
70
+ super(type, { detail });
71
+ }
72
+ };
73
+ var BrowserEventEmitter = class {
74
+ #eventTarget = new EventTarget();
75
+ on(event, listener) {
76
+ const wrappedListener = (e) => {
77
+ if (e instanceof TypedCustomEvent) listener(e.detail);
78
+ };
79
+ this.#eventTarget.addEventListener(event.toString(), wrappedListener);
80
+ return () => {
81
+ this.#eventTarget.removeEventListener(event.toString(), wrappedListener);
82
+ };
83
+ }
84
+ emit(event, data) {
85
+ const customEvent = new TypedCustomEvent(event.toString(), data);
86
+ this.#eventTarget.dispatchEvent(customEvent);
87
+ }
88
+ };
89
+ //#endregion
90
+ //#region src/storage/storage.browser.ts
91
+ var BrowserStorage = class extends BaseStorage {
92
+ namespace;
93
+ constructor(namespace, basename) {
94
+ super();
95
+ this.namespace = `${basename}:${namespace}`;
96
+ }
97
+ #buildKey(key) {
98
+ return `${this.namespace}:${key.toString()}`;
99
+ }
100
+ get(key) {
101
+ const value = localStorage.getItem(this.#buildKey(key));
102
+ if (value) return JSON.parse(value);
103
+ }
104
+ set(key, value) {
105
+ return value ? localStorage.setItem(this.#buildKey(key), JSON.stringify(value)) : localStorage.removeItem(this.#buildKey(key));
106
+ }
107
+ delete(key) {
108
+ return localStorage.removeItem(this.#buildKey(key));
109
+ }
110
+ };
111
+ //#endregion
112
+ //#region src/init.browser.ts
113
+ var BrowserRenownStorage = class extends BrowserStorage {};
114
+ var BrowserRenownEventEmitter = class extends BrowserEventEmitter {};
115
+ /**
116
+ * Browser-specific Renown builder with pre-configured defaults.
117
+ * Uses localStorage for user data and IndexedDB for key storage.
118
+ */
119
+ var RenownBuilder = class extends BaseRenownBuilder {
120
+ #basename;
121
+ #keyDbName;
122
+ /**
123
+ * @param appName - Application name used for signing context
124
+ * @param options - Browser-specific configuration options
125
+ */
126
+ constructor(appName, options = {}) {
127
+ super(appName);
128
+ this.#basename = options.basename;
129
+ this.#keyDbName = options.keyDbName;
130
+ this.withStorage(new BrowserRenownStorage("renown", this.#basename));
131
+ this.withEventEmitter(new BrowserRenownEventEmitter());
132
+ if (options.baseUrl) this.withBaseUrl(options.baseUrl);
133
+ }
134
+ /**
135
+ * Set base path for storage keys (e.g., "/app" for multi-tenant apps).
136
+ */
137
+ withBasename(basename) {
138
+ this.#basename = basename;
139
+ this.withStorage(new BrowserRenownStorage("renown", this.#basename));
140
+ return this;
141
+ }
142
+ /**
143
+ * Set IndexedDB database name for key storage.
144
+ * Defaults to "renownKeyDB".
145
+ */
146
+ withKeyDbName(keyDbName) {
147
+ this.#keyDbName = keyDbName;
148
+ return this;
149
+ }
150
+ /**
151
+ * Build and initialize the Renown instance.
152
+ * Initializes IndexedDB for key storage before building.
153
+ */
154
+ async build() {
155
+ const keyStorage = await BrowserKeyStorage.create(this.#keyDbName);
156
+ this.withKeyPairStorage(keyStorage);
157
+ return super.build();
158
+ }
159
+ };
160
+ /**
161
+ * @deprecated Use RenownBuilder directly instead.
162
+ * Initialize a browser-specific Renown instance.
163
+ * @param appName - Application name used for signing context
164
+ * @param options - Browser-specific configuration options
165
+ * @returns Initialized Renown instance
166
+ */
167
+ function initRenown(appName, options = {}) {
168
+ return new RenownBuilder(appName, options).build();
169
+ }
170
+ //#endregion
171
+ export { BaseRenownBuilder, BrowserKeyStorage, BrowserRenownEventEmitter, BrowserRenownStorage, CREDENTIAL_SCHEMA_EIP712_TYPE, CREDENTIAL_SUBJECT_TYPE, CREDENTIAL_TYPES, ConnectCrypto, DEFAULT_RENOWN_CHAIN_ID, DEFAULT_RENOWN_NETWORK_ID, DEFAULT_RENOWN_URL, DOMAIN_TYPE, ISSUER_TYPE, MemoryKeyStorage, Renown, RenownBuilder, RenownCrypto, RenownCryptoBuilder, RenownCryptoSigner, RenownMemoryStorage, VERIFIABLE_CREDENTIAL_EIP712_TYPE, assertIsAuthCredential, createAuthBearerToken, createSignatureVerifier, extractResultingHashFromSignature, fetchRenownProfile, getResolver, initRenown, parsePkhDid, parseSignatureHashField, signatureHasResultingHash, verifyAuthBearerToken };
172
+
173
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","names":["#db","#openDatabase","#useStore","#eventTarget","#buildKey","#basename","#keyDbName"],"sources":["../src/crypto/browser-key-storage.ts","../src/event/event.browser.ts","../src/storage/storage.browser.ts","../src/init.browser.ts"],"sourcesContent":["import type { JsonWebKeyPairStorage, JwkKeyPair } from \"./types.js\";\n\nconst DEFAULT_DB_NAME = \"renownKeyDB\";\nconst STORE_NAME = \"keyPairs\";\nconst KEY = \"keyPair\";\n\nexport class BrowserKeyStorage implements JsonWebKeyPairStorage {\n #db: IDBDatabase;\n\n constructor(db: IDBDatabase) {\n this.#db = db;\n }\n\n static async create(\n dbName: string = DEFAULT_DB_NAME,\n ): Promise<BrowserKeyStorage> {\n const db = await BrowserKeyStorage.#openDatabase(dbName);\n return new BrowserKeyStorage(db);\n }\n\n static #openDatabase(dbName: string): Promise<IDBDatabase> {\n return new Promise((resolve, reject) => {\n const req = indexedDB.open(dbName);\n\n req.onupgradeneeded = (event) => {\n const db = (event.target as IDBOpenDBRequest).result;\n if (!db.objectStoreNames.contains(STORE_NAME)) {\n db.createObjectStore(STORE_NAME);\n }\n };\n\n req.onsuccess = () => {\n const db = req.result;\n if (!db.objectStoreNames.contains(STORE_NAME)) {\n const currentVersion = db.version;\n db.close();\n const upgradeReq = indexedDB.open(dbName, currentVersion + 1);\n upgradeReq.onupgradeneeded = (event) => {\n const upgradeDb = (event.target as IDBOpenDBRequest).result;\n if (!upgradeDb.objectStoreNames.contains(STORE_NAME)) {\n upgradeDb.createObjectStore(STORE_NAME);\n }\n };\n upgradeReq.onsuccess = () => resolve(upgradeReq.result);\n upgradeReq.onerror = () => reject(upgradeReq.error as Error);\n } else {\n resolve(db);\n }\n };\n\n req.onerror = () => reject(req.error as Error);\n });\n }\n\n #useStore(mode: IDBTransactionMode = \"readwrite\") {\n const transaction = this.#db.transaction(STORE_NAME, mode);\n return transaction.objectStore(STORE_NAME);\n }\n\n async saveKeyPair(keyPair: JwkKeyPair) {\n const store = this.#useStore();\n const request = store.put(keyPair, KEY);\n return new Promise<void>((resolve, reject) => {\n request.onsuccess = () => resolve();\n request.onerror = () => reject(new Error(\"Failed to save key pair\"));\n });\n }\n\n async loadKeyPair(): Promise<JwkKeyPair | undefined> {\n const store = this.#useStore(\"readonly\");\n const request = store.get(KEY);\n\n return new Promise<JwkKeyPair | undefined>((resolve, reject) => {\n request.onsuccess = () => {\n const keyPair = request.result as JwkKeyPair | undefined;\n resolve(keyPair);\n };\n request.onerror = () => reject(new Error(\"Failed to load key pair\"));\n });\n }\n\n async removeKeyPair(): Promise<void> {\n const store = this.#useStore();\n const request = store.delete(KEY);\n\n return new Promise<void>((resolve, reject) => {\n request.onsuccess = () => resolve();\n request.onerror = () => reject(new Error(\"Failed to remove key pair\"));\n });\n }\n}\n","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":"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"}
package/dist/node.d.ts ADDED
@@ -0,0 +1,136 @@
1
+ import { $ as RenownProfile, A as DIDResolutionResult, B as Issuer, C as AuthVerifiedCredential, Ct as DEFAULT_RENOWN_NETWORK_ID, D as DIDDocument, Dt as VERIFIABLE_CREDENTIAL_EIP712_TYPE, E as CredentialStatus, Et as ISSUER_TYPE, F as IProof, G as KeyCapabilitySection, H as JWTVerified, I as IRenown, J as PowerhouseVerifiableCredential, K as LoginStatus, L as ISigner, M as IAuthCredentialSubject, N as IPowerhouseCredentialSubject, O as DIDDocumentMetadata, P as IPowerhouseIssuerType, Q as RenownEvents, R as IVerifiableCredential, S as AuthVerifiableCredential, St as DEFAULT_RENOWN_CHAIN_ID, T as CreateBearerTokenOptions, Tt as DOMAIN_TYPE, U as JWTVerifyPolicies, V as JWTPayload, W as JsonWebKey, X as Proof, Y as ProfileFetcher, Z as RenownEventEmitter, _ as signatureHasResultingHash, _t as JsonWebKeyPairStorage, a as getResolver, at as Unsubscribe, b as ConnectCrypto, bt as CREDENTIAL_SUBJECT_TYPE, c as fetchRenownProfile, ct as VerificationMethod, d as Renown, dt as W3CCredential, et as RenownStorage, f as RenownMemoryStorage, ft as BaseStorage, g as parseSignatureHashField, gt as IRenownCrypto, h as extractResultingHashFromSignature, ht as IConnectCrypto, i as createAuthBearerToken, it as Signer, j as EcdsaSignature, k as DIDResolutionMetadata, l as BaseRenownBuilder, lt as VerifiedCredential, m as createSignatureVerifier, mt as DID, n as VerifyAuthBearerTokenOptions, nt as Service, o as parsePkhDid, ot as User, p as RenownCryptoSigner, pt as IEventEmitter, q as PKHDid, r as assertIsAuthCredential, rt as ServiceEndpoint, s as verifyAuthBearerToken, st as Verifiable, t as ILogger, tt as RenownStorageMap, u as RenownBuilderOptions, ut as VerifiedJWT, v as MemoryKeyStorage, vt as JwkKeyPair, w as ConditionWeightedThreshold, wt as DEFAULT_RENOWN_URL, x as RenownCrypto, xt as CREDENTIAL_TYPES, y as RenownCryptoBuilder, yt as CREDENTIAL_SCHEMA_EIP712_TYPE, z as InternalUser } from "./utils-BGF8Qb5f.js";
2
+
3
+ //#region src/crypto/node-key-storage.d.ts
4
+ declare const RENOWN_PRIVATE_KEY_ENV = "PH_RENOWN_PRIVATE_KEY";
5
+ declare const DEFAULT_KEYPAIR_PATH = ".ph/.keypair.json";
6
+ /**
7
+ * Key storage that supports:
8
+ * 1. PH_RENOWN_PRIVATE_KEY environment variable (JSON-encoded JwkKeyPair)
9
+ * 2. Custom file path passed via options
10
+ * 3. Falls back to file storage at .ph/.keypair.json in current working directory
11
+ */
12
+ declare class NodeKeyStorage implements JsonWebKeyPairStorage {
13
+ #private;
14
+ static readonly DEFAULT_KEYPAIR_PATH = ".ph/.keypair.json";
15
+ static readonly RENOWN_PRIVATE_KEY_ENV = "PH_RENOWN_PRIVATE_KEY";
16
+ constructor(filePath?: string, options?: {
17
+ envKeyName?: string;
18
+ logger?: ILogger;
19
+ });
20
+ loadKeyPair(): Promise<JwkKeyPair | undefined>;
21
+ saveKeyPair(keyPair: JwkKeyPair): Promise<void>;
22
+ removeKeyPair(): Promise<void>;
23
+ }
24
+ //#endregion
25
+ //#region src/event/event.node.d.ts
26
+ declare class NodeEventEmitter<Events extends Record<string, unknown>> implements IEventEmitter<Events> {
27
+ #private;
28
+ constructor();
29
+ on<K extends keyof Events>(event: K, listener: (data: Events[K]) => void): () => void;
30
+ emit<K extends keyof Events>(event: K, data: Events[K]): void;
31
+ }
32
+ //#endregion
33
+ //#region src/storage/storage.node.d.ts
34
+ declare class NodeStorage<T extends Record<string, unknown> = Record<string, unknown>> extends BaseStorage<T> {
35
+ private readonly filePath;
36
+ constructor(filePath: string);
37
+ private readData;
38
+ private writeData;
39
+ get<Key extends keyof T>(key: Key): T[Key] | undefined;
40
+ set<Key extends keyof T>(key: Key, value?: T[Key]): void;
41
+ delete(key: keyof T): void;
42
+ }
43
+ //#endregion
44
+ //#region src/init.node.d.ts
45
+ declare class NodeRenownEventEmitter extends NodeEventEmitter<RenownEvents> {}
46
+ declare class NodeRenownStorage extends NodeStorage<RenownStorageMap> {}
47
+ declare const DEFAULT_RENOWN_STORAGE_PATH = "./.ph/.renown.json";
48
+ interface NodeRenownBuilderOptions {
49
+ /** File path for user storage. Defaults to ".ph/.renown.json" in cwd */
50
+ storagePath?: string;
51
+ /** File path for keypair storage. Defaults to ".ph/.keypair.json" in cwd */
52
+ keyPath?: string;
53
+ /** Renown server URL. Defaults to https://www.renown.id */
54
+ baseUrl?: string;
55
+ }
56
+ /**
57
+ * Node.js-specific Renown builder with pre-configured defaults.
58
+ * Uses file-based storage for both user data and key storage.
59
+ */
60
+ declare class RenownBuilder extends BaseRenownBuilder {
61
+ /**
62
+ * @param appName - Application name used for signing context
63
+ * @param options - Node.js-specific configuration options
64
+ */
65
+ constructor(appName: string, options?: NodeRenownBuilderOptions);
66
+ }
67
+ //#endregion
68
+ //#region src/login.node.d.ts
69
+ interface BrowserLoginOptions {
70
+ /** Renown server URL */
71
+ renownUrl: string;
72
+ /** Timeout in milliseconds. Defaults to 5 minutes. */
73
+ timeoutMs?: number;
74
+ /** Called with the login URL and session ID before the browser is opened */
75
+ onLoginUrl?: (url: string, sessionId: string) => void;
76
+ /** Called on each poll tick while waiting for authentication */
77
+ onPollTick?: () => void;
78
+ /** Called when the browser failed to open automatically */
79
+ onBrowserOpenFailed?: (url: string) => void;
80
+ /** AbortSignal to cancel the login flow */
81
+ signal?: AbortSignal;
82
+ }
83
+ interface BrowserLoginResult {
84
+ user: User;
85
+ cliDid: string;
86
+ }
87
+ interface AuthStatusResult {
88
+ authenticated: boolean;
89
+ address?: string;
90
+ userDid?: string;
91
+ chainId?: number;
92
+ cliDid: string;
93
+ authenticatedAt?: Date;
94
+ baseUrl: string;
95
+ }
96
+ /**
97
+ * Open a URL in the default browser (cross-platform).
98
+ */
99
+ declare function openBrowser(url: string): Promise<void>;
100
+ /**
101
+ * Perform a browser-based login flow with Renown.
102
+ * Opens the user's browser to authenticate, then polls for completion.
103
+ * Throws if already authenticated or if the flow times out.
104
+ * If the browser fails to open, the flow continues polling — callers
105
+ * can use onBrowserOpenFailed to show the URL as a fallback.
106
+ */
107
+ declare function browserLogin(renown: IRenown, options: BrowserLoginOptions): Promise<BrowserLoginResult>;
108
+ /**
109
+ * Get the current authentication status from a Renown instance.
110
+ */
111
+ declare function getAuthStatus(renown: IRenown): AuthStatusResult;
112
+ interface AccessTokenResult {
113
+ token: string;
114
+ did: string;
115
+ address: string;
116
+ expiresIn: number;
117
+ }
118
+ /**
119
+ * Generate a bearer token for API authentication.
120
+ * Requires the user to be authenticated (via browserLogin or equivalent).
121
+ * Throws if not authenticated.
122
+ */
123
+ declare function generateAccessToken(renown: IRenown, options?: CreateBearerTokenOptions): Promise<AccessTokenResult>;
124
+ /**
125
+ * Parse a human-readable expiry string to seconds.
126
+ * Supports formats: "7d" (days), "24h" (hours), "3600" (seconds), "3600s" (seconds).
127
+ * Only accepts positive integers — decimals like "1.5h" are rejected.
128
+ */
129
+ declare function parseExpiry(expiry: string): number;
130
+ /**
131
+ * Format an expiry duration in seconds to a human-readable string.
132
+ */
133
+ declare function formatExpiry(expiresIn: number): string;
134
+ //#endregion
135
+ export { AccessTokenResult, AuthStatusResult, AuthVerifiableCredential, AuthVerifiedCredential, BaseRenownBuilder, BrowserLoginOptions, BrowserLoginResult, CREDENTIAL_SCHEMA_EIP712_TYPE, CREDENTIAL_SUBJECT_TYPE, CREDENTIAL_TYPES, ConditionWeightedThreshold, ConnectCrypto, CreateBearerTokenOptions, 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, 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, Signer, Unsubscribe, User, VERIFIABLE_CREDENTIAL_EIP712_TYPE, Verifiable, VerificationMethod, VerifiedCredential, VerifiedJWT, VerifyAuthBearerTokenOptions, W3CCredential, assertIsAuthCredential, browserLogin, createAuthBearerToken, createSignatureVerifier, extractResultingHashFromSignature, fetchRenownProfile, formatExpiry, generateAccessToken, getAuthStatus, getResolver, openBrowser, parseExpiry, parsePkhDid, parseSignatureHashField, signatureHasResultingHash, verifyAuthBearerToken };
136
+ //# sourceMappingURL=node.d.ts.map
@@ -0,0 +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;;;;;AAAb;;cAQa,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;;EAEf,WAAA;EHD+B;EGG/B,OAAA;EHK0B;EGH1B,OAAA;AAAA;;;;;cAOW,aAAA,SAAsB,iBAAA;EHJI;;;;cGSzB,OAAA,UAAiB,OAAA,GAAS,wBAAA;AAAA;;;UCvBvB,mBAAA;;EAEf,SAAA;EJGiC;EIDjC,SAAA;EJCiC;EICjC,UAAA,IAAc,GAAA,UAAa,SAAA;EJAhB;EIEX,UAAA;;EAEA,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;;;;;;iBAQoB,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 ADDED
@@ -0,0 +1,305 @@
1
+ import { C as DEFAULT_RENOWN_CHAIN_ID, D as ISSUER_TYPE, E as DOMAIN_TYPE, O as VERIFIABLE_CREDENTIAL_EIP712_TYPE, S as CREDENTIAL_TYPES, T as DEFAULT_RENOWN_URL, _ as getResolver, a as BaseStorage, b as CREDENTIAL_SCHEMA_EIP712_TYPE, c as extractResultingHashFromSignature, d as MemoryKeyStorage, f as RenownCryptoBuilder, g as createAuthBearerToken, h as assertIsAuthCredential, i as RenownMemoryStorage, l as parseSignatureHashField, m as RenownCrypto, n as fetchRenownProfile, o as RenownCryptoSigner, p as ConnectCrypto, r as Renown, s as createSignatureVerifier, t as BaseRenownBuilder, u as signatureHasResultingHash, v as parsePkhDid, w as DEFAULT_RENOWN_NETWORK_ID, x as CREDENTIAL_SUBJECT_TYPE, y as verifyAuthBearerToken } from "./renown-builder-EmbIygby.js";
2
+ import { existsSync, mkdirSync, readFileSync, unlinkSync, writeFileSync } from "node:fs";
3
+ import { dirname, join } from "node:path";
4
+ import { EventEmitter } from "node:events";
5
+ //#region src/crypto/node-key-storage.ts
6
+ const RENOWN_PRIVATE_KEY_ENV = "PH_RENOWN_PRIVATE_KEY";
7
+ const DEFAULT_KEYPAIR_PATH = ".ph/.keypair.json";
8
+ /**
9
+ * Key storage that supports:
10
+ * 1. PH_RENOWN_PRIVATE_KEY environment variable (JSON-encoded JwkKeyPair)
11
+ * 2. Custom file path passed via options
12
+ * 3. Falls back to file storage at .ph/.keypair.json in current working directory
13
+ */
14
+ var NodeKeyStorage = class {
15
+ #filePath;
16
+ #envKeyName;
17
+ #logger;
18
+ static DEFAULT_KEYPAIR_PATH = DEFAULT_KEYPAIR_PATH;
19
+ static RENOWN_PRIVATE_KEY_ENV = RENOWN_PRIVATE_KEY_ENV;
20
+ constructor(filePath, options = {}) {
21
+ this.#filePath = filePath || join(process.cwd(), ".ph/.keypair.json");
22
+ this.#envKeyName = options.envKeyName || "PH_RENOWN_PRIVATE_KEY";
23
+ this.#logger = options.logger;
24
+ const dir = dirname(this.#filePath);
25
+ if (!existsSync(dir)) mkdirSync(dir, { recursive: true });
26
+ }
27
+ loadKeyPair() {
28
+ const envKey = process.env[this.#envKeyName];
29
+ if (envKey) try {
30
+ const keyPairJson = JSON.parse(envKey);
31
+ const keyPair = this.#parseKeyPair(keyPairJson);
32
+ this.#logger?.debug("Loaded keypair from environment variable");
33
+ return Promise.resolve(keyPair);
34
+ } catch (e) {
35
+ throw new Error(`Failed to parse ${this.#envKeyName}: ${e instanceof Error ? e.message : String(e)}`, { cause: e });
36
+ }
37
+ return Promise.resolve(this.#loadFromFile());
38
+ }
39
+ async saveKeyPair(keyPair) {
40
+ if (process.env[this.#envKeyName]) return;
41
+ this.#saveToFile(keyPair);
42
+ return Promise.resolve();
43
+ }
44
+ removeKeyPair() {
45
+ if (process.env[this.#envKeyName]) delete process.env[this.#envKeyName];
46
+ if (existsSync(this.#filePath)) unlinkSync(this.#filePath);
47
+ return Promise.resolve();
48
+ }
49
+ #loadFromFile() {
50
+ try {
51
+ if (!existsSync(this.#filePath)) return;
52
+ const data = readFileSync(this.#filePath, "utf-8");
53
+ const parsed = JSON.parse(data);
54
+ const keyPair = this.#parseKeyPair(parsed);
55
+ this.#logger?.debug(`Loaded keypair from ${this.#filePath}`);
56
+ return keyPair;
57
+ } catch (e) {
58
+ throw new Error(`Failed to parse ${this.#filePath}: ${e instanceof Error ? e.message : String(e)}`, { cause: e });
59
+ }
60
+ }
61
+ #saveToFile(keyPair) {
62
+ const data = { keyPair };
63
+ writeFileSync(this.#filePath, JSON.stringify(data, null, 2), "utf-8");
64
+ this.#logger?.debug(`Saved keypair to ${this.#filePath}`);
65
+ }
66
+ #parseKeyPair(json) {
67
+ if (typeof json !== "object") throw new Error("Invalid keyPair format:" + JSON.stringify(json));
68
+ const object = json;
69
+ let keyPair;
70
+ if ("keyPair" in object) keyPair = object.keyPair;
71
+ else keyPair = object;
72
+ if ("publicKey" in keyPair && "privateKey" in keyPair) return keyPair;
73
+ else throw new Error("Invalid keyPair format:" + JSON.stringify(json));
74
+ }
75
+ };
76
+ //#endregion
77
+ //#region src/event/event.node.ts
78
+ var NodeEventEmitter = class {
79
+ #emitter = new EventEmitter();
80
+ constructor() {
81
+ this.#emitter.setMaxListeners(0);
82
+ }
83
+ on(event, listener) {
84
+ this.#emitter.on(event, listener);
85
+ return () => {
86
+ this.#emitter.removeListener(event.toString(), listener);
87
+ };
88
+ }
89
+ emit(event, data) {
90
+ this.#emitter.emit(event.toString(), data);
91
+ }
92
+ };
93
+ //#endregion
94
+ //#region src/storage/storage.node.ts
95
+ var NodeStorage = class extends BaseStorage {
96
+ filePath;
97
+ constructor(filePath) {
98
+ super();
99
+ this.filePath = filePath;
100
+ mkdirSync(dirname(this.filePath), { recursive: true });
101
+ if (!existsSync(this.filePath)) writeFileSync(this.filePath, JSON.stringify({}));
102
+ }
103
+ readData() {
104
+ const data = readFileSync(this.filePath, "utf-8");
105
+ return JSON.parse(data);
106
+ }
107
+ writeData(data) {
108
+ writeFileSync(this.filePath, JSON.stringify(data, null, 2));
109
+ }
110
+ get(key) {
111
+ return this.readData()[key];
112
+ }
113
+ set(key, value) {
114
+ const data = this.readData();
115
+ if (value === void 0) delete data[key];
116
+ else data[key] = value;
117
+ this.writeData(data);
118
+ }
119
+ delete(key) {
120
+ const data = this.readData();
121
+ delete data[key];
122
+ this.writeData(data);
123
+ }
124
+ };
125
+ //#endregion
126
+ //#region src/init.node.ts
127
+ var NodeRenownEventEmitter = class extends NodeEventEmitter {};
128
+ var NodeRenownStorage = class extends NodeStorage {};
129
+ const DEFAULT_RENOWN_STORAGE_PATH = "./.ph/.renown.json";
130
+ /**
131
+ * Node.js-specific Renown builder with pre-configured defaults.
132
+ * Uses file-based storage for both user data and key storage.
133
+ */
134
+ var RenownBuilder = class extends BaseRenownBuilder {
135
+ /**
136
+ * @param appName - Application name used for signing context
137
+ * @param options - Node.js-specific configuration options
138
+ */
139
+ constructor(appName, options = {}) {
140
+ super(appName);
141
+ const { storagePath = DEFAULT_RENOWN_STORAGE_PATH, keyPath, baseUrl } = options;
142
+ this.withKeyPairStorage(new NodeKeyStorage(keyPath));
143
+ this.withStorage(new NodeRenownStorage(storagePath));
144
+ this.withEventEmitter(new NodeRenownEventEmitter());
145
+ if (baseUrl) this.withBaseUrl(baseUrl);
146
+ }
147
+ };
148
+ //#endregion
149
+ //#region src/login.node.ts
150
+ const DEFAULT_TIMEOUT_MS = 300 * 1e3;
151
+ const POLL_INTERVAL_MS = 2e3;
152
+ const SECONDS_IN_DAY = 1440 * 60;
153
+ function abortReason(signal) {
154
+ if (signal.reason instanceof Error) return signal.reason;
155
+ if (signal.reason) return new Error(String(signal.reason));
156
+ return new DOMException("Aborted", "AbortError");
157
+ }
158
+ function sleep(ms, signal) {
159
+ return new Promise((resolve, reject) => {
160
+ if (signal?.aborted) {
161
+ reject(abortReason(signal));
162
+ return;
163
+ }
164
+ const onAbort = () => {
165
+ clearTimeout(timer);
166
+ reject(abortReason(signal));
167
+ };
168
+ const timer = setTimeout(() => {
169
+ signal?.removeEventListener("abort", onAbort);
170
+ resolve();
171
+ }, ms);
172
+ signal?.addEventListener("abort", onAbort, { once: true });
173
+ });
174
+ }
175
+ /**
176
+ * Open a URL in the default browser (cross-platform).
177
+ */
178
+ async function openBrowser(url) {
179
+ const { execFile } = await import("node:child_process");
180
+ const { promisify } = await import("node:util");
181
+ const execFileAsync = promisify(execFile);
182
+ const platform = process.platform;
183
+ if (platform === "darwin") await execFileAsync("open", [url]);
184
+ else if (platform === "win32") await execFileAsync("cmd", [
185
+ "/c",
186
+ "start",
187
+ "",
188
+ url
189
+ ]);
190
+ else await execFileAsync("xdg-open", [url]);
191
+ }
192
+ async function pollSession(renownUrl, sessionId, timeoutMs, onPollTick, signal) {
193
+ const startTime = Date.now();
194
+ const sessionUrl = new URL(`/api/console/session/${sessionId}`, renownUrl).toString();
195
+ while (Date.now() - startTime < timeoutMs) {
196
+ signal?.throwIfAborted();
197
+ try {
198
+ const response = await fetch(sessionUrl, { signal });
199
+ if (response.ok) {
200
+ const data = await response.json();
201
+ if (data.status === "ready") return data;
202
+ }
203
+ } catch (error) {
204
+ if (error instanceof DOMException && error.name === "AbortError") throw error;
205
+ }
206
+ onPollTick?.();
207
+ await sleep(POLL_INTERVAL_MS, signal);
208
+ }
209
+ return null;
210
+ }
211
+ /**
212
+ * Perform a browser-based login flow with Renown.
213
+ * Opens the user's browser to authenticate, then polls for completion.
214
+ * Throws if already authenticated or if the flow times out.
215
+ * If the browser fails to open, the flow continues polling — callers
216
+ * can use onBrowserOpenFailed to show the URL as a fallback.
217
+ */
218
+ async function browserLogin(renown, options) {
219
+ if (renown.user?.credential) throw new Error(`Already authenticated as ${renown.user.address}. Logout first.`);
220
+ const timeoutMs = options.timeoutMs ?? DEFAULT_TIMEOUT_MS;
221
+ const sessionId = crypto.randomUUID();
222
+ const loginUrl = new URL("/console", options.renownUrl);
223
+ loginUrl.searchParams.set("session", sessionId);
224
+ loginUrl.searchParams.set("connect", renown.did);
225
+ loginUrl.searchParams.set("app", renown.did);
226
+ const url = loginUrl.toString();
227
+ options.onLoginUrl?.(url, sessionId);
228
+ try {
229
+ await openBrowser(url);
230
+ } catch {
231
+ options.onBrowserOpenFailed?.(url);
232
+ }
233
+ const result = await pollSession(options.renownUrl, sessionId, timeoutMs, options.onPollTick, options.signal);
234
+ if (!result) throw new Error("Authentication timed out.");
235
+ return {
236
+ user: await renown.login(result.did),
237
+ cliDid: renown.did
238
+ };
239
+ }
240
+ /**
241
+ * Get the current authentication status from a Renown instance.
242
+ */
243
+ function getAuthStatus(renown) {
244
+ const user = renown.user;
245
+ const credential = user?.credential;
246
+ return {
247
+ authenticated: !!credential,
248
+ address: user?.address,
249
+ userDid: user?.did,
250
+ chainId: user?.chainId,
251
+ cliDid: renown.did,
252
+ authenticatedAt: credential ? new Date(credential.issuanceDate) : void 0,
253
+ baseUrl: renown.baseUrl
254
+ };
255
+ }
256
+ /**
257
+ * Generate a bearer token for API authentication.
258
+ * Requires the user to be authenticated (via browserLogin or equivalent).
259
+ * Throws if not authenticated.
260
+ */
261
+ async function generateAccessToken(renown, options) {
262
+ const user = renown.user;
263
+ if (!user?.credential) throw new Error("Not authenticated. Login first to generate access tokens.");
264
+ return {
265
+ token: await renown.getBearerToken(options ?? {}),
266
+ did: renown.did,
267
+ address: user.address,
268
+ expiresIn: options?.expiresIn ?? 0
269
+ };
270
+ }
271
+ /**
272
+ * Parse a human-readable expiry string to seconds.
273
+ * Supports formats: "7d" (days), "24h" (hours), "3600" (seconds), "3600s" (seconds).
274
+ * Only accepts positive integers — decimals like "1.5h" are rejected.
275
+ */
276
+ function parseExpiry(expiry) {
277
+ const match = expiry.trim().toLowerCase().match(/^(\d+)(d|h|s)?$/);
278
+ if (!match) throw new Error(`Invalid expiry format: ${expiry}. Expected a positive integer with optional suffix: "7d", "24h", "3600s", or "3600".`);
279
+ const value = Number(match[1]);
280
+ const unit = match[2];
281
+ if (value <= 0) throw new Error(`Invalid expiry format: ${expiry}. Value must be a positive integer.`);
282
+ switch (unit) {
283
+ case "d": return value * SECONDS_IN_DAY;
284
+ case "h": return value * 60 * 60;
285
+ default: return value;
286
+ }
287
+ }
288
+ /**
289
+ * Format an expiry duration in seconds to a human-readable string.
290
+ */
291
+ function formatExpiry(expiresIn) {
292
+ const days = Math.floor(expiresIn / SECONDS_IN_DAY);
293
+ const hours = Math.floor(expiresIn % SECONDS_IN_DAY / 3600);
294
+ if (days > 0) {
295
+ const dayStr = `${days} day${days !== 1 ? "s" : ""}`;
296
+ if (hours > 0) return `${dayStr} and ${hours} hour${hours !== 1 ? "s" : ""}`;
297
+ return dayStr;
298
+ }
299
+ if (hours > 0) return `${hours} hour${hours !== 1 ? "s" : ""}`;
300
+ return `${expiresIn} second${expiresIn !== 1 ? "s" : ""}`;
301
+ }
302
+ //#endregion
303
+ 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, createAuthBearerToken, createSignatureVerifier, extractResultingHashFromSignature, fetchRenownProfile, formatExpiry, generateAccessToken, getAuthStatus, getResolver, openBrowser, parseExpiry, parsePkhDid, parseSignatureHashField, signatureHasResultingHash, verifyAuthBearerToken };
304
+
305
+ //# sourceMappingURL=node.js.map