@renown/sdk 6.0.0-dev.17 → 6.0.0-dev.170
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +47 -437
- package/dist/index.d.ts +67 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +173 -0
- package/dist/index.js.map +1 -0
- package/dist/node.d.ts +67 -0
- package/dist/node.d.ts.map +1 -0
- package/dist/node.js +151 -0
- package/dist/node.js.map +1 -0
- package/dist/renown-builder-Duj--zQl.js +816 -0
- package/dist/renown-builder-Duj--zQl.js.map +1 -0
- package/dist/utils-Dx7V4t4D.d.ts +548 -0
- package/dist/utils-Dx7V4t4D.d.ts.map +1 -0
- package/package.json +15 -38
- package/dist/e2e/fixtures/main.d.ts +0 -2
- package/dist/e2e/fixtures/main.d.ts.map +0 -1
- package/dist/e2e/fixtures/main.js +0 -97
- package/dist/e2e/fixtures/main.js.map +0 -1
- package/dist/e2e/fixtures/vite.config.d.ts +0 -3
- package/dist/e2e/fixtures/vite.config.d.ts.map +0 -1
- package/dist/e2e/fixtures/vite.config.js +0 -10
- package/dist/e2e/fixtures/vite.config.js.map +0 -1
- package/dist/e2e/renown-components.spec.d.ts +0 -2
- package/dist/e2e/renown-components.spec.d.ts.map +0 -1
- package/dist/e2e/renown-components.spec.js +0 -155
- package/dist/e2e/renown-components.spec.js.map +0 -1
- package/dist/playwright.config.d.ts +0 -3
- package/dist/playwright.config.d.ts.map +0 -1
- package/dist/playwright.config.js +0 -25
- package/dist/playwright.config.js.map +0 -1
- package/dist/src/assets/assets.d.ts +0 -19
- package/dist/src/assets/renown-hover.svg +0 -17
- package/dist/src/assets/renown-light.svg +0 -15
- package/dist/src/assets/renown-short-hover.png +0 -0
- package/dist/src/assets/renown-short.png +0 -0
- package/dist/src/assets/renown.svg +0 -16
- package/dist/src/common.d.ts +0 -15
- package/dist/src/common.d.ts.map +0 -1
- package/dist/src/common.js +0 -105
- package/dist/src/common.js.map +0 -1
- package/dist/src/components/RenownAuthButton.d.ts +0 -62
- package/dist/src/components/RenownAuthButton.d.ts.map +0 -1
- package/dist/src/components/RenownAuthButton.js +0 -82
- package/dist/src/components/RenownAuthButton.js.map +0 -1
- package/dist/src/components/RenownLoginButton.d.ts +0 -48
- package/dist/src/components/RenownLoginButton.d.ts.map +0 -1
- package/dist/src/components/RenownLoginButton.js +0 -175
- package/dist/src/components/RenownLoginButton.js.map +0 -1
- package/dist/src/components/RenownUserButton.d.ts +0 -66
- package/dist/src/components/RenownUserButton.d.ts.map +0 -1
- package/dist/src/components/RenownUserButton.js +0 -216
- package/dist/src/components/RenownUserButton.js.map +0 -1
- package/dist/src/components/icons.d.ts +0 -25
- package/dist/src/components/icons.d.ts.map +0 -1
- package/dist/src/components/icons.js +0 -24
- package/dist/src/components/icons.js.map +0 -1
- package/dist/src/components/image-data.d.ts +0 -3
- package/dist/src/components/image-data.d.ts.map +0 -1
- package/dist/src/components/image-data.js +0 -4
- package/dist/src/components/image-data.js.map +0 -1
- package/dist/src/components/index.d.ts +0 -8
- package/dist/src/components/index.d.ts.map +0 -1
- package/dist/src/components/index.js +0 -5
- package/dist/src/components/index.js.map +0 -1
- package/dist/src/constants.d.ts +0 -130
- package/dist/src/constants.d.ts.map +0 -1
- package/dist/src/constants.js +0 -40
- package/dist/src/constants.js.map +0 -1
- package/dist/src/crypto/browser-key-storage.d.ts +0 -8
- package/dist/src/crypto/browser-key-storage.d.ts.map +0 -1
- package/dist/src/crypto/browser-key-storage.js +0 -73
- package/dist/src/crypto/browser-key-storage.js.map +0 -1
- package/dist/src/crypto/index.d.ts +0 -36
- package/dist/src/crypto/index.d.ts.map +0 -1
- package/dist/src/crypto/index.js +0 -130
- package/dist/src/crypto/index.js.map +0 -1
- package/dist/src/crypto/node-key-storage.d.ts +0 -8
- package/dist/src/crypto/node-key-storage.d.ts.map +0 -1
- package/dist/src/crypto/node-key-storage.js +0 -67
- package/dist/src/crypto/node-key-storage.js.map +0 -1
- package/dist/src/crypto/node.d.ts +0 -2
- package/dist/src/crypto/node.d.ts.map +0 -1
- package/dist/src/crypto/node.js +0 -3
- package/dist/src/crypto/node.js.map +0 -1
- package/dist/src/crypto/signer.d.ts +0 -21
- package/dist/src/crypto/signer.d.ts.map +0 -1
- package/dist/src/crypto/signer.js +0 -236
- package/dist/src/crypto/signer.js.map +0 -1
- package/dist/src/event/event.browser.d.ts +0 -10
- package/dist/src/event/event.browser.d.ts.map +0 -1
- package/dist/src/event/event.browser.js +0 -24
- package/dist/src/event/event.browser.js.map +0 -1
- package/dist/src/event/event.node.d.ts +0 -8
- package/dist/src/event/event.node.d.ts.map +0 -1
- package/dist/src/event/event.node.js +0 -17
- package/dist/src/event/event.node.js.map +0 -1
- package/dist/src/event/types.d.ts +0 -16
- package/dist/src/event/types.d.ts.map +0 -1
- package/dist/src/event/types.js +0 -2
- package/dist/src/event/types.js.map +0 -1
- package/dist/src/hooks/index.d.ts +0 -2
- package/dist/src/hooks/index.d.ts.map +0 -1
- package/dist/src/hooks/index.js +0 -2
- package/dist/src/hooks/index.js.map +0 -1
- package/dist/src/hooks/use-user.d.ts +0 -21
- package/dist/src/hooks/use-user.d.ts.map +0 -1
- package/dist/src/hooks/use-user.js +0 -30
- package/dist/src/hooks/use-user.js.map +0 -1
- package/dist/src/index.browser.d.ts +0 -4
- package/dist/src/index.browser.d.ts.map +0 -1
- package/dist/src/index.browser.js +0 -4
- package/dist/src/index.browser.js.map +0 -1
- package/dist/src/index.d.ts +0 -13
- package/dist/src/index.d.ts.map +0 -1
- package/dist/src/index.js +0 -13
- package/dist/src/index.js.map +0 -1
- package/dist/src/index.node.d.ts +0 -4
- package/dist/src/index.node.d.ts.map +0 -1
- package/dist/src/index.node.js +0 -4
- package/dist/src/index.node.js.map +0 -1
- package/dist/src/init.browser.d.ts +0 -3
- package/dist/src/init.browser.d.ts.map +0 -1
- package/dist/src/init.browser.js +0 -7
- package/dist/src/init.browser.js.map +0 -1
- package/dist/src/init.node.d.ts +0 -3
- package/dist/src/init.node.d.ts.map +0 -1
- package/dist/src/init.node.js +0 -8
- package/dist/src/init.node.js.map +0 -1
- package/dist/src/lib/crypto/browser.d.ts +0 -8
- package/dist/src/lib/crypto/browser.d.ts.map +0 -1
- package/dist/src/lib/crypto/browser.js +0 -73
- package/dist/src/lib/crypto/browser.js.map +0 -1
- package/dist/src/lib/crypto/index.d.ts +0 -36
- package/dist/src/lib/crypto/index.d.ts.map +0 -1
- package/dist/src/lib/crypto/index.js +0 -150
- package/dist/src/lib/crypto/index.js.map +0 -1
- package/dist/src/lib/crypto/node.d.ts +0 -8
- package/dist/src/lib/crypto/node.d.ts.map +0 -1
- package/dist/src/lib/crypto/node.js +0 -67
- package/dist/src/lib/crypto/node.js.map +0 -1
- package/dist/src/lib/renown/constants.d.ts +0 -130
- package/dist/src/lib/renown/constants.d.ts.map +0 -1
- package/dist/src/lib/renown/constants.js +0 -40
- package/dist/src/lib/renown/constants.js.map +0 -1
- package/dist/src/lib/renown/did-parser.d.ts +0 -28
- package/dist/src/lib/renown/did-parser.d.ts.map +0 -1
- package/dist/src/lib/renown/did-parser.js +0 -57
- package/dist/src/lib/renown/did-parser.js.map +0 -1
- package/dist/src/lib/renown/index.d.ts +0 -4
- package/dist/src/lib/renown/index.d.ts.map +0 -1
- package/dist/src/lib/renown/index.js +0 -4
- package/dist/src/lib/renown/index.js.map +0 -1
- package/dist/src/lib/renown/utils.d.ts +0 -33
- package/dist/src/lib/renown/utils.d.ts.map +0 -1
- package/dist/src/lib/renown/utils.js +0 -207
- package/dist/src/lib/renown/utils.js.map +0 -1
- package/dist/src/lib/session-storage.d.ts +0 -40
- package/dist/src/lib/session-storage.d.ts.map +0 -1
- package/dist/src/lib/session-storage.js +0 -107
- package/dist/src/lib/session-storage.js.map +0 -1
- package/dist/src/node.d.ts +0 -6
- package/dist/src/node.d.ts.map +0 -1
- package/dist/src/node.js +0 -6
- package/dist/src/node.js.map +0 -1
- package/dist/src/providers/index.d.ts +0 -3
- package/dist/src/providers/index.d.ts.map +0 -1
- package/dist/src/providers/index.js +0 -2
- package/dist/src/providers/index.js.map +0 -1
- package/dist/src/providers/renown-user-provider.d.ts +0 -72
- package/dist/src/providers/renown-user-provider.d.ts.map +0 -1
- package/dist/src/providers/renown-user-provider.js +0 -171
- package/dist/src/providers/renown-user-provider.js.map +0 -1
- package/dist/src/storage/common.d.ts +0 -13
- package/dist/src/storage/common.d.ts.map +0 -1
- package/dist/src/storage/common.js +0 -7
- package/dist/src/storage/common.js.map +0 -1
- package/dist/src/storage/storage.browser.d.ts +0 -9
- package/dist/src/storage/storage.browser.d.ts.map +0 -1
- package/dist/src/storage/storage.browser.js +0 -25
- package/dist/src/storage/storage.browser.js.map +0 -1
- package/dist/src/storage/storage.node.d.ts +0 -11
- package/dist/src/storage/storage.node.d.ts.map +0 -1
- package/dist/src/storage/storage.node.js +0 -40
- package/dist/src/storage/storage.node.js.map +0 -1
- package/dist/src/types.d.ts +0 -80
- package/dist/src/types.d.ts.map +0 -1
- package/dist/src/types.js +0 -2
- package/dist/src/types.js.map +0 -1
- package/dist/src/utils.d.ts +0 -17
- package/dist/src/utils.d.ts.map +0 -1
- package/dist/src/utils.js +0 -80
- package/dist/src/utils.js.map +0 -1
- package/dist/tests/auth.test.d.ts +0 -2
- package/dist/tests/auth.test.d.ts.map +0 -1
- package/dist/tests/auth.test.js +0 -13
- package/dist/tests/auth.test.js.map +0 -1
- package/dist/tsconfig.tsbuildinfo +0 -1
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-Duj--zQl.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,67 @@
|
|
|
1
|
+
import { $ as CREDENTIAL_TYPES, A as ISigner, B as RenownStorage, C as AuthVerifiedCredential, D as IPowerhouseIssuerType, E as IPowerhouseCredentialSubject, F as PowerhouseVerifiableCredential, G as IEventEmitter, H as Unsubscribe, I as ProfileFetcher, J as IRenownCrypto, K as DID, L as RenownEventEmitter, M as InternalUser, N as LoginStatus, O as IProof, P as PKHDid, Q as CREDENTIAL_SUBJECT_TYPE, R as RenownEvents, S as AuthVerifiableCredential, T as IAuthCredentialSubject, U as User, V as RenownStorageMap, W as BaseStorage, X as JwkKeyPair, Y as JsonWebKeyPairStorage, Z as CREDENTIAL_SCHEMA_EIP712_TYPE, _ as signatureHasResultingHash, a as parsePkhDid, at as VERIFIABLE_CREDENTIAL_EIP712_TYPE, b as ConnectCrypto, c as BaseRenownBuilder, d as RenownMemoryStorage, et as DEFAULT_RENOWN_CHAIN_ID, g as parseSignatureHashField, h as extractResultingHashFromSignature, i as getResolver, it as ISSUER_TYPE, j as IVerifiableCredential, k as IRenown, l as RenownBuilderOptions, m as createSignatureVerifier, n as assertIsAuthCredential, nt as DEFAULT_RENOWN_URL, o as verifyAuthBearerToken, p as RenownCryptoSigner, q as IConnectCrypto, r as createAuthBearerToken, rt as DOMAIN_TYPE, s as fetchRenownProfile, t as ILogger, tt as DEFAULT_RENOWN_NETWORK_ID, u as Renown, v as MemoryKeyStorage, w as CreateBearerTokenOptions, x as RenownCrypto, y as RenownCryptoBuilder, z as RenownProfile } from "./utils-Dx7V4t4D.js";
|
|
2
|
+
|
|
3
|
+
//#region src/crypto/node-key-storage.d.ts
|
|
4
|
+
/**
|
|
5
|
+
* Key storage that supports:
|
|
6
|
+
* 1. PH_RENOWN_PRIVATE_KEY environment variable (JSON-encoded JwkKeyPair)
|
|
7
|
+
* 2. Custom file path passed via options
|
|
8
|
+
* 3. Falls back to file storage at .ph/.keypair.json in current working directory
|
|
9
|
+
*/
|
|
10
|
+
declare class NodeKeyStorage implements JsonWebKeyPairStorage {
|
|
11
|
+
#private;
|
|
12
|
+
static readonly DEFAULT_KEYPAIR_PATH: string;
|
|
13
|
+
static readonly ENV_KEY_NAME = "PH_RENOWN_PRIVATE_KEY";
|
|
14
|
+
constructor(filePath?: string, options?: {
|
|
15
|
+
envKeyName?: string;
|
|
16
|
+
logger?: ILogger;
|
|
17
|
+
});
|
|
18
|
+
loadKeyPair(): Promise<JwkKeyPair | undefined>;
|
|
19
|
+
saveKeyPair(keyPair: JwkKeyPair): Promise<void>;
|
|
20
|
+
removeKeyPair(): Promise<void>;
|
|
21
|
+
}
|
|
22
|
+
//#endregion
|
|
23
|
+
//#region src/event/event.node.d.ts
|
|
24
|
+
declare class NodeEventEmitter<Events extends Record<string, unknown>> implements IEventEmitter<Events> {
|
|
25
|
+
#private;
|
|
26
|
+
constructor();
|
|
27
|
+
on<K extends keyof Events>(event: K, listener: (data: Events[K]) => void): () => void;
|
|
28
|
+
emit<K extends keyof Events>(event: K, data: Events[K]): void;
|
|
29
|
+
}
|
|
30
|
+
//#endregion
|
|
31
|
+
//#region src/storage/storage.node.d.ts
|
|
32
|
+
declare class NodeStorage<T extends Record<string, unknown> = Record<string, unknown>> extends BaseStorage<T> {
|
|
33
|
+
private readonly filePath;
|
|
34
|
+
constructor(filePath: string);
|
|
35
|
+
private readData;
|
|
36
|
+
private writeData;
|
|
37
|
+
get<Key extends keyof T>(key: Key): T[Key] | undefined;
|
|
38
|
+
set<Key extends keyof T>(key: Key, value?: T[Key]): void;
|
|
39
|
+
delete(key: keyof T): void;
|
|
40
|
+
}
|
|
41
|
+
//#endregion
|
|
42
|
+
//#region src/init.node.d.ts
|
|
43
|
+
declare class NodeRenownEventEmitter extends NodeEventEmitter<RenownEvents> {}
|
|
44
|
+
declare class NodeRenownStorage extends NodeStorage<RenownStorageMap> {}
|
|
45
|
+
declare const DEFAULT_RENOWN_STORAGE_PATH = "./.ph/.renown.json";
|
|
46
|
+
interface NodeRenownBuilderOptions {
|
|
47
|
+
/** File path for user storage. Defaults to ".ph/.renown.json" in cwd */
|
|
48
|
+
storagePath?: string;
|
|
49
|
+
/** File path for keypair storage. Defaults to ".ph/.keypair.json" in cwd */
|
|
50
|
+
keyPath?: string;
|
|
51
|
+
/** Renown server URL. Defaults to https://www.renown.id */
|
|
52
|
+
baseUrl?: string;
|
|
53
|
+
}
|
|
54
|
+
/**
|
|
55
|
+
* Node.js-specific Renown builder with pre-configured defaults.
|
|
56
|
+
* Uses file-based storage for both user data and key storage.
|
|
57
|
+
*/
|
|
58
|
+
declare class RenownBuilder extends BaseRenownBuilder {
|
|
59
|
+
/**
|
|
60
|
+
* @param appName - Application name used for signing context
|
|
61
|
+
* @param options - Node.js-specific configuration options
|
|
62
|
+
*/
|
|
63
|
+
constructor(appName: string, options?: NodeRenownBuilderOptions);
|
|
64
|
+
}
|
|
65
|
+
//#endregion
|
|
66
|
+
export { AuthVerifiableCredential, AuthVerifiedCredential, BaseRenownBuilder, CREDENTIAL_SCHEMA_EIP712_TYPE, CREDENTIAL_SUBJECT_TYPE, CREDENTIAL_TYPES, ConnectCrypto, CreateBearerTokenOptions, DEFAULT_RENOWN_CHAIN_ID, DEFAULT_RENOWN_NETWORK_ID, DEFAULT_RENOWN_STORAGE_PATH, DEFAULT_RENOWN_URL, DID, DOMAIN_TYPE, IAuthCredentialSubject, IConnectCrypto, ILogger, IPowerhouseCredentialSubject, IPowerhouseIssuerType, IProof, IRenown, IRenownCrypto, ISSUER_TYPE, ISigner, IVerifiableCredential, InternalUser, JsonWebKeyPairStorage, JwkKeyPair, LoginStatus, MemoryKeyStorage, NodeEventEmitter, NodeKeyStorage, NodeRenownBuilderOptions, NodeRenownEventEmitter, NodeRenownStorage, NodeStorage, PKHDid, PowerhouseVerifiableCredential, ProfileFetcher, Renown, RenownBuilder, RenownBuilderOptions, RenownCrypto, RenownCryptoBuilder, RenownCryptoSigner, RenownEventEmitter, RenownEvents, RenownMemoryStorage, RenownProfile, RenownStorage, RenownStorageMap, Unsubscribe, User, VERIFIABLE_CREDENTIAL_EIP712_TYPE, assertIsAuthCredential, createAuthBearerToken, createSignatureVerifier, extractResultingHashFromSignature, fetchRenownProfile, getResolver, parsePkhDid, parseSignatureHashField, signatureHasResultingHash, verifyAuthBearerToken };
|
|
67
|
+
//# 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"],"mappings":";;;;AAoBA;;;;;cAAa,cAAA,YAA0B,qBAAA;EAAA;kBAKrB,oBAAA;EAAA,gBACA,YAAA;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;EHyDyB;EGvDxC,WAAA;EHOqC;EGLrC,OAAA;EHK0D;EGH1D,OAAA;AAAA;;;;;cAOW,aAAA,SAAsB,iBAAA;EHMC;;;;cGDtB,OAAA,UAAiB,OAAA,GAAS,wBAAA;AAAA"}
|
package/dist/node.js
ADDED
|
@@ -0,0 +1,151 @@
|
|
|
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-Duj--zQl.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 ENV_KEY_NAME = "PH_RENOWN_PRIVATE_KEY";
|
|
7
|
+
const DEFAULT_KEYPAIR_PATH = join(process.cwd(), ".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 ENV_KEY_NAME = ENV_KEY_NAME;
|
|
20
|
+
constructor(filePath, options = {}) {
|
|
21
|
+
this.#filePath = filePath || DEFAULT_KEYPAIR_PATH;
|
|
22
|
+
this.#envKeyName = options.envKeyName || ENV_KEY_NAME;
|
|
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
|
+
export { BaseRenownBuilder, CREDENTIAL_SCHEMA_EIP712_TYPE, CREDENTIAL_SUBJECT_TYPE, CREDENTIAL_TYPES, ConnectCrypto, 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, RenownBuilder, RenownCrypto, RenownCryptoBuilder, RenownCryptoSigner, RenownMemoryStorage, VERIFIABLE_CREDENTIAL_EIP712_TYPE, assertIsAuthCredential, createAuthBearerToken, createSignatureVerifier, extractResultingHashFromSignature, fetchRenownProfile, getResolver, parsePkhDid, parseSignatureHashField, signatureHasResultingHash, verifyAuthBearerToken };
|
|
150
|
+
|
|
151
|
+
//# sourceMappingURL=node.js.map
|
package/dist/node.js.map
ADDED
|
@@ -0,0 +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"],"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\nconst ENV_KEY_NAME = \"PH_RENOWN_PRIVATE_KEY\";\nconst DEFAULT_KEYPAIR_PATH = join(process.cwd(), \".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 ENV_KEY_NAME = ENV_KEY_NAME;\n\n constructor(\n filePath?: string,\n options: { envKeyName?: string; logger?: ILogger } = {},\n ) {\n this.#filePath = filePath || DEFAULT_KEYPAIR_PATH;\n this.#envKeyName = options.envKeyName || ENV_KEY_NAME;\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"],"mappings":"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"}
|