@enbox/auth 0.4.0 → 0.6.0

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 (86) hide show
  1. package/dist/esm/auth-manager.js +244 -121
  2. package/dist/esm/auth-manager.js.map +1 -1
  3. package/dist/esm/connect/import.js +131 -0
  4. package/dist/esm/connect/import.js.map +1 -0
  5. package/dist/esm/connect/lifecycle.js +235 -0
  6. package/dist/esm/connect/lifecycle.js.map +1 -0
  7. package/dist/esm/connect/local.js +91 -0
  8. package/dist/esm/connect/local.js.map +1 -0
  9. package/dist/esm/{flows/session-restore.js → connect/restore.js} +39 -50
  10. package/dist/esm/connect/restore.js.map +1 -0
  11. package/dist/esm/{flows/wallet-connect.js → connect/wallet.js} +33 -39
  12. package/dist/esm/connect/wallet.js.map +1 -0
  13. package/dist/esm/{flows/dwn-discovery.js → discovery.js} +98 -83
  14. package/dist/esm/discovery.js.map +1 -0
  15. package/dist/esm/index.js +7 -3
  16. package/dist/esm/index.js.map +1 -1
  17. package/dist/esm/password-provider.js +319 -0
  18. package/dist/esm/password-provider.js.map +1 -0
  19. package/dist/esm/{flows/dwn-registration.js → registration.js} +50 -4
  20. package/dist/esm/registration.js.map +1 -0
  21. package/dist/esm/types.js +11 -1
  22. package/dist/esm/types.js.map +1 -1
  23. package/dist/esm/wallet-connect-client.js +188 -0
  24. package/dist/esm/wallet-connect-client.js.map +1 -0
  25. package/dist/types/auth-manager.d.ts +86 -7
  26. package/dist/types/auth-manager.d.ts.map +1 -1
  27. package/dist/types/connect/import.d.ts +25 -0
  28. package/dist/types/connect/import.d.ts.map +1 -0
  29. package/dist/types/connect/lifecycle.d.ts +152 -0
  30. package/dist/types/connect/lifecycle.d.ts.map +1 -0
  31. package/dist/types/connect/local.d.ts +18 -0
  32. package/dist/types/connect/local.d.ts.map +1 -0
  33. package/dist/types/connect/restore.d.ts +18 -0
  34. package/dist/types/connect/restore.d.ts.map +1 -0
  35. package/dist/types/{flows/wallet-connect.d.ts → connect/wallet.d.ts} +7 -16
  36. package/dist/types/connect/wallet.d.ts.map +1 -0
  37. package/dist/types/{flows/dwn-discovery.d.ts → discovery.d.ts} +43 -56
  38. package/dist/types/discovery.d.ts.map +1 -0
  39. package/dist/types/index.d.ts +8 -4
  40. package/dist/types/index.d.ts.map +1 -1
  41. package/dist/types/password-provider.d.ts +194 -0
  42. package/dist/types/password-provider.d.ts.map +1 -0
  43. package/dist/types/{flows/dwn-registration.d.ts → registration.d.ts} +21 -2
  44. package/dist/types/registration.d.ts.map +1 -0
  45. package/dist/types/types.d.ts +92 -4
  46. package/dist/types/types.d.ts.map +1 -1
  47. package/dist/types/wallet-connect-client.d.ts +89 -0
  48. package/dist/types/wallet-connect-client.d.ts.map +1 -0
  49. package/package.json +15 -12
  50. package/src/auth-manager.ts +279 -145
  51. package/src/connect/import.ts +148 -0
  52. package/src/connect/lifecycle.ts +321 -0
  53. package/src/connect/local.ts +101 -0
  54. package/src/connect/restore.ts +117 -0
  55. package/src/{flows/wallet-connect.ts → connect/wallet.ts} +42 -58
  56. package/src/{flows/dwn-discovery.ts → discovery.ts} +103 -82
  57. package/src/index.ts +14 -4
  58. package/src/password-provider.ts +383 -0
  59. package/src/{flows/dwn-registration.ts → registration.ts} +61 -6
  60. package/src/types.ts +100 -4
  61. package/src/wallet-connect-client.ts +278 -0
  62. package/dist/esm/flows/dwn-discovery.js.map +0 -1
  63. package/dist/esm/flows/dwn-registration.js.map +0 -1
  64. package/dist/esm/flows/import-identity.js +0 -175
  65. package/dist/esm/flows/import-identity.js.map +0 -1
  66. package/dist/esm/flows/local-connect.js +0 -141
  67. package/dist/esm/flows/local-connect.js.map +0 -1
  68. package/dist/esm/flows/session-restore.js.map +0 -1
  69. package/dist/esm/flows/wallet-connect.js.map +0 -1
  70. package/dist/esm/vault/vault-manager.js +0 -95
  71. package/dist/esm/vault/vault-manager.js.map +0 -1
  72. package/dist/types/flows/dwn-discovery.d.ts.map +0 -1
  73. package/dist/types/flows/dwn-registration.d.ts.map +0 -1
  74. package/dist/types/flows/import-identity.d.ts +0 -35
  75. package/dist/types/flows/import-identity.d.ts.map +0 -1
  76. package/dist/types/flows/local-connect.d.ts +0 -29
  77. package/dist/types/flows/local-connect.d.ts.map +0 -1
  78. package/dist/types/flows/session-restore.d.ts +0 -27
  79. package/dist/types/flows/session-restore.d.ts.map +0 -1
  80. package/dist/types/flows/wallet-connect.d.ts.map +0 -1
  81. package/dist/types/vault/vault-manager.d.ts +0 -57
  82. package/dist/types/vault/vault-manager.d.ts.map +0 -1
  83. package/src/flows/import-identity.ts +0 -217
  84. package/src/flows/local-connect.ts +0 -171
  85. package/src/flows/session-restore.ts +0 -142
  86. package/src/vault/vault-manager.ts +0 -89
@@ -0,0 +1,319 @@
1
+ /**
2
+ * PasswordProvider — composable password acquisition strategies.
3
+ *
4
+ * Replaces ad-hoc password prompting scattered across CLI consumers
5
+ * (env vars, raw-mode TTY, `/dev/tty` + `stty`, `@clack/prompts`, etc.)
6
+ * with a single, composable abstraction.
7
+ *
8
+ * @example Chained provider (env first, fall back to TTY)
9
+ * ```ts
10
+ * import { PasswordProvider } from '@enbox/auth';
11
+ *
12
+ * const provider = PasswordProvider.chain([
13
+ * PasswordProvider.fromEnv('ENBOX_PASSWORD'),
14
+ * PasswordProvider.fromTty({ prompt: 'Vault password: ' }),
15
+ * ]);
16
+ *
17
+ * const auth = await AuthManager.create({ passwordProvider: provider });
18
+ * ```
19
+ *
20
+ * @module
21
+ */
22
+ var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {
23
+ function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }
24
+ return new (P || (P = Promise))(function (resolve, reject) {
25
+ function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
26
+ function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } }
27
+ function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }
28
+ step((generator = generator.apply(thisArg, _arguments || [])).next());
29
+ });
30
+ };
31
+ // ─── Internal helpers ────────────────────────────────────────────
32
+ /**
33
+ * Read a password from a raw-mode TTY stream.
34
+ *
35
+ * Reads character-by-character with no echo. Handles Enter (resolve),
36
+ * Ctrl-C (reject), backspace, and printable characters.
37
+ *
38
+ * @internal Exported for testing only.
39
+ */
40
+ export function readPasswordRawMode(stdin, stdout, prompt) {
41
+ stdout.write(prompt);
42
+ return new Promise((resolve, reject) => {
43
+ let buf = '';
44
+ stdin.setRawMode(true);
45
+ stdin.setEncoding('utf8');
46
+ stdin.resume();
47
+ const onData = (ch) => {
48
+ const code = ch.charCodeAt(0);
49
+ if (ch === '\r' || ch === '\n') {
50
+ // Enter — done.
51
+ stdin.setRawMode(false);
52
+ stdin.pause();
53
+ stdin.removeListener('data', onData);
54
+ stdout.write('\n');
55
+ resolve(buf);
56
+ }
57
+ else if (code === 3) {
58
+ // Ctrl-C — abort.
59
+ stdin.setRawMode(false);
60
+ stdin.pause();
61
+ stdin.removeListener('data', onData);
62
+ stdout.write('\n');
63
+ reject(new Error('[@enbox/auth] PasswordProvider.fromTty: cancelled by user.'));
64
+ }
65
+ else if (code === 127 || code === 8) {
66
+ // Backspace / Delete.
67
+ if (buf.length > 0) {
68
+ buf = buf.slice(0, -1);
69
+ }
70
+ }
71
+ else if (code >= 32) {
72
+ // Printable character.
73
+ buf += ch;
74
+ }
75
+ };
76
+ stdin.on('data', onData);
77
+ });
78
+ }
79
+ /**
80
+ * Read a password from `/dev/tty` using synchronous I/O.
81
+ *
82
+ * Opens `/dev/tty` directly, uses `stty -echo` to suppress input,
83
+ * reads until newline, then restores echo and closes file descriptors.
84
+ *
85
+ * @param prompt - The prompt string to display.
86
+ * @param io - Injectable I/O functions (defaults to `node:fs` + `node:child_process`).
87
+ * @internal Exported for testing only.
88
+ */
89
+ export function readPasswordDevTty(prompt, io) {
90
+ return __awaiter(this, void 0, void 0, function* () {
91
+ // Use injected I/O or import real modules.
92
+ let fsIo;
93
+ if (io) {
94
+ fsIo = io;
95
+ }
96
+ else {
97
+ const { openSync, readSync, writeSync, closeSync } = yield import('node:fs');
98
+ const { execSync } = yield import('node:child_process');
99
+ fsIo = {
100
+ openSync,
101
+ readSync,
102
+ writeSync,
103
+ closeSync,
104
+ execSync: (cmd, opts) => { execSync(cmd, opts); },
105
+ };
106
+ }
107
+ let readFd;
108
+ let writeFd;
109
+ try {
110
+ readFd = fsIo.openSync('/dev/tty', 'r');
111
+ writeFd = fsIo.openSync('/dev/tty', 'w');
112
+ }
113
+ catch (_a) {
114
+ throw new Error('[@enbox/auth] PasswordProvider.fromDevTty: cannot open /dev/tty. ' +
115
+ 'No controlling terminal available.');
116
+ }
117
+ try {
118
+ // Suppress echo.
119
+ try {
120
+ fsIo.execSync('stty -echo < /dev/tty', { stdio: 'ignore' });
121
+ }
122
+ catch (_b) {
123
+ // Continue — the user sees their password but the flow works.
124
+ }
125
+ fsIo.writeSync(writeFd, prompt);
126
+ // Cooked-mode read (line-buffered; terminal handles backspace).
127
+ const readBuf = new Uint8Array(256);
128
+ const decoder = new TextDecoder('utf-8');
129
+ let password = '';
130
+ while (true) {
131
+ const bytesRead = fsIo.readSync(readFd, readBuf, 0, readBuf.length, null);
132
+ if (bytesRead === 0) {
133
+ break;
134
+ }
135
+ password += decoder.decode(readBuf.subarray(0, bytesRead), { stream: true });
136
+ const nlIdx = password.indexOf('\n');
137
+ if (nlIdx !== -1) {
138
+ password = password.slice(0, nlIdx);
139
+ break;
140
+ }
141
+ const crIdx = password.indexOf('\r');
142
+ if (crIdx !== -1) {
143
+ password = password.slice(0, crIdx);
144
+ break;
145
+ }
146
+ }
147
+ fsIo.writeSync(writeFd, '\n');
148
+ return password;
149
+ }
150
+ finally {
151
+ // Restore echo.
152
+ try {
153
+ fsIo.execSync('stty echo < /dev/tty', { stdio: 'ignore' });
154
+ }
155
+ catch ( /* best-effort */_c) { /* best-effort */ }
156
+ fsIo.closeSync(readFd);
157
+ fsIo.closeSync(writeFd);
158
+ }
159
+ });
160
+ }
161
+ // ─── Factory functions ───────────────────────────────────────────
162
+ export var PasswordProvider;
163
+ (function (PasswordProvider) {
164
+ /**
165
+ * Read the password from an environment variable.
166
+ *
167
+ * Throws if the variable is not set or is empty, allowing `chain()`
168
+ * to fall through to the next provider.
169
+ *
170
+ * @param envVar - Name of the environment variable. Default: `'ENBOX_PASSWORD'`.
171
+ *
172
+ * @example
173
+ * ```ts
174
+ * const provider = PasswordProvider.fromEnv('MY_APP_PASSWORD');
175
+ * ```
176
+ */
177
+ function fromEnv(envVar = 'ENBOX_PASSWORD') {
178
+ return {
179
+ getPassword() {
180
+ return __awaiter(this, void 0, void 0, function* () {
181
+ const value = process.env[envVar];
182
+ if (!value) {
183
+ throw new Error(`[@enbox/auth] PasswordProvider.fromEnv: environment variable '${envVar}' is not set.`);
184
+ }
185
+ return value;
186
+ });
187
+ },
188
+ };
189
+ }
190
+ PasswordProvider.fromEnv = fromEnv;
191
+ /**
192
+ * Wrap an async callback as a password provider.
193
+ *
194
+ * This is the escape hatch for custom UI (e.g. `@clack/prompts`,
195
+ * Electron dialog, browser modal).
196
+ *
197
+ * @param callback - Called with the password context; must return a password string.
198
+ *
199
+ * @example
200
+ * ```ts
201
+ * const provider = PasswordProvider.fromCallback(async ({ reason }) => {
202
+ * if (reason === 'create') {
203
+ * return await showCreatePasswordDialog();
204
+ * }
205
+ * return await showUnlockDialog();
206
+ * });
207
+ * ```
208
+ */
209
+ function fromCallback(callback) {
210
+ return { getPassword: callback };
211
+ }
212
+ PasswordProvider.fromCallback = fromCallback;
213
+ /**
214
+ * Prompt for a password via `process.stdin` in raw mode.
215
+ *
216
+ * Input is read character-by-character with no echo. Handles
217
+ * backspace and Ctrl-C (rejects with an error). Only works when
218
+ * `process.stdin.isTTY` is `true`; throws otherwise so `chain()`
219
+ * can fall through to the next provider.
220
+ *
221
+ * Suitable for main CLI processes that own stdin/stdout.
222
+ *
223
+ * @param options - Optional configuration.
224
+ * @param options.prompt - Text to display before reading. Default: `'Vault password: '`.
225
+ *
226
+ * @example
227
+ * ```ts
228
+ * const provider = PasswordProvider.fromTty({ prompt: 'Password: ' });
229
+ * ```
230
+ */
231
+ function fromTty(options = {}) {
232
+ var _a;
233
+ const prompt = (_a = options.prompt) !== null && _a !== void 0 ? _a : 'Vault password: ';
234
+ return {
235
+ getPassword() {
236
+ return __awaiter(this, void 0, void 0, function* () {
237
+ if (!process.stdin.isTTY) {
238
+ throw new Error('[@enbox/auth] PasswordProvider.fromTty: stdin is not a TTY.');
239
+ }
240
+ return readPasswordRawMode(process.stdin, process.stdout, prompt);
241
+ });
242
+ },
243
+ };
244
+ }
245
+ PasswordProvider.fromTty = fromTty;
246
+ /**
247
+ * Prompt for a password via `/dev/tty` (Unix only).
248
+ *
249
+ * Opens `/dev/tty` directly, bypassing `process.stdin`. This is
250
+ * essential for subprocesses where stdin is owned by the parent
251
+ * (e.g. Git credential helpers, SSH, GPG). Uses `stty -echo` to
252
+ * suppress input echo.
253
+ *
254
+ * Throws if `/dev/tty` cannot be opened (e.g. non-Unix platform,
255
+ * no controlling terminal), allowing `chain()` to fall through.
256
+ *
257
+ * @param options - Optional configuration.
258
+ * @param options.prompt - Text to display before reading. Default: `'Vault password: '`.
259
+ *
260
+ * @example
261
+ * ```ts
262
+ * // For git credential helpers:
263
+ * const provider = PasswordProvider.fromDevTty();
264
+ * ```
265
+ */
266
+ function fromDevTty(options = {}) {
267
+ var _a;
268
+ const prompt = (_a = options.prompt) !== null && _a !== void 0 ? _a : 'Vault password: ';
269
+ return {
270
+ getPassword() {
271
+ return __awaiter(this, void 0, void 0, function* () {
272
+ return readPasswordDevTty(prompt);
273
+ });
274
+ },
275
+ };
276
+ }
277
+ PasswordProvider.fromDevTty = fromDevTty;
278
+ /**
279
+ * Compose multiple providers with automatic fallback.
280
+ *
281
+ * Tries each provider in order. If a provider throws, the next one
282
+ * is tried. If all providers fail, the last error is rethrown.
283
+ *
284
+ * @param providers - Ordered list of providers to try.
285
+ *
286
+ * @example
287
+ * ```ts
288
+ * // Try env var first, then interactive TTY, then /dev/tty for subprocesses.
289
+ * const provider = PasswordProvider.chain([
290
+ * PasswordProvider.fromEnv('ENBOX_PASSWORD'),
291
+ * PasswordProvider.fromTty(),
292
+ * PasswordProvider.fromDevTty(),
293
+ * ]);
294
+ * ```
295
+ */
296
+ function chain(providers) {
297
+ if (providers.length === 0) {
298
+ throw new Error('[@enbox/auth] PasswordProvider.chain: at least one provider is required.');
299
+ }
300
+ return {
301
+ getPassword(context) {
302
+ return __awaiter(this, void 0, void 0, function* () {
303
+ let lastError;
304
+ for (const provider of providers) {
305
+ try {
306
+ return yield provider.getPassword(context);
307
+ }
308
+ catch (err) {
309
+ lastError = err instanceof Error ? err : new Error(String(err));
310
+ }
311
+ }
312
+ throw lastError !== null && lastError !== void 0 ? lastError : new Error('[@enbox/auth] PasswordProvider.chain: all providers failed.');
313
+ });
314
+ },
315
+ };
316
+ }
317
+ PasswordProvider.chain = chain;
318
+ })(PasswordProvider || (PasswordProvider = {}));
319
+ //# sourceMappingURL=password-provider.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"password-provider.js","sourceRoot":"","sources":["../../src/password-provider.ts"],"names":[],"mappings":"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"}
@@ -20,6 +20,7 @@ var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, ge
20
20
  });
21
21
  };
22
22
  import { DwnRegistrar } from '@enbox/dwn-clients';
23
+ import { STORAGE_KEYS } from './types.js';
23
24
  /**
24
25
  * Register the agent and connected DIDs with the configured DWN endpoints.
25
26
  *
@@ -35,8 +36,17 @@ import { DwnRegistrar } from '@enbox/dwn-clients';
35
36
  export function registerWithDwnEndpoints(ctx, registration) {
36
37
  return __awaiter(this, void 0, void 0, function* () {
37
38
  var _a;
38
- const { userAgent, dwnEndpoints, agentDid, connectedDid } = ctx;
39
- const updatedTokens = Object.assign({}, ((_a = registration.registrationTokens) !== null && _a !== void 0 ? _a : {}));
39
+ const { userAgent, dwnEndpoints, agentDid, connectedDid, storage } = ctx;
40
+ // Load initial tokens: when persistTokens is enabled, load from storage
41
+ // (ignoring any explicit registrationTokens). Otherwise use the explicit map.
42
+ let seedTokens = {};
43
+ if (registration.persistTokens && storage) {
44
+ seedTokens = yield loadTokensFromStorage(storage);
45
+ }
46
+ else {
47
+ seedTokens = (_a = registration.registrationTokens) !== null && _a !== void 0 ? _a : {};
48
+ }
49
+ const updatedTokens = Object.assign({}, seedTokens);
40
50
  try {
41
51
  for (const dwnEndpoint of dwnEndpoints) {
42
52
  const serverInfo = yield userAgent.rpc.getServerInfo(dwnEndpoint);
@@ -108,7 +118,11 @@ export function registerWithDwnEndpoints(ctx, registration) {
108
118
  }
109
119
  }
110
120
  }
111
- // Notify app of updated tokens for persistence.
121
+ // Persist tokens to storage when auto-persistence is enabled.
122
+ if (registration.persistTokens && storage) {
123
+ yield saveTokensToStorage(storage, updatedTokens);
124
+ }
125
+ // Notify app of updated tokens (always, even when auto-persisting).
112
126
  if (registration.onRegistrationTokens) {
113
127
  registration.onRegistrationTokens(updatedTokens);
114
128
  }
@@ -119,4 +133,36 @@ export function registerWithDwnEndpoints(ctx, registration) {
119
133
  }
120
134
  });
121
135
  }
122
- //# sourceMappingURL=dwn-registration.js.map
136
+ // ─── Storage helpers ──────────────────────────────────────────────
137
+ /**
138
+ * Load registration tokens from a `StorageAdapter`.
139
+ *
140
+ * Returns an empty record if no tokens are stored or the stored value
141
+ * is corrupt (best-effort — never throws).
142
+ *
143
+ * @internal
144
+ */
145
+ export function loadTokensFromStorage(storage) {
146
+ return __awaiter(this, void 0, void 0, function* () {
147
+ try {
148
+ const raw = yield storage.get(STORAGE_KEYS.REGISTRATION_TOKENS);
149
+ if (!raw) {
150
+ return {};
151
+ }
152
+ return JSON.parse(raw);
153
+ }
154
+ catch (_a) {
155
+ return {};
156
+ }
157
+ });
158
+ }
159
+ /**
160
+ * Save registration tokens to a `StorageAdapter`.
161
+ * @internal
162
+ */
163
+ export function saveTokensToStorage(storage, tokens) {
164
+ return __awaiter(this, void 0, void 0, function* () {
165
+ yield storage.set(STORAGE_KEYS.REGISTRATION_TOKENS, JSON.stringify(tokens));
166
+ });
167
+ }
168
+ //# sourceMappingURL=registration.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"registration.js","sourceRoot":"","sources":["../../src/registration.ts"],"names":[],"mappings":"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"}
package/dist/esm/types.js CHANGED
@@ -5,6 +5,8 @@
5
5
  // ─── Internal helpers ────────────────────────────────────────────
6
6
  /** The insecure default password used when none is provided. */
7
7
  export const INSECURE_DEFAULT_PASSWORD = 'insecure-static-phrase';
8
+ /** Default DWN endpoints for new identities when none are configured. */
9
+ export const DEFAULT_DWN_ENDPOINTS = ['https://enbox-dwn.fly.dev'];
8
10
  /**
9
11
  * Storage keys used by the auth manager for session persistence.
10
12
  * @internal
@@ -19,12 +21,20 @@ export const STORAGE_KEYS = {
19
21
  /** The connected DID (for wallet-connected sessions). */
20
22
  CONNECTED_DID: 'enbox:auth:connectedDid',
21
23
  /**
22
- * The base URL of the local DWN server discovered via the `dwn://register`
24
+ * The base URL of the local DWN server discovered via the `dwn://connect`
23
25
  * browser redirect flow. Persisted so subsequent page loads can skip the
24
26
  * redirect and inject the endpoint directly.
25
27
  *
26
28
  * @see https://github.com/enboxorg/enbox/issues/589
27
29
  */
28
30
  LOCAL_DWN_ENDPOINT: 'enbox:auth:localDwnEndpoint',
31
+ /**
32
+ * JSON-serialised `Record<string, RegistrationTokenData>` for DWN endpoint
33
+ * registration tokens. Automatically loaded before registration and saved
34
+ * after new/refreshed tokens are obtained when `persistTokens` is enabled.
35
+ *
36
+ * @see https://github.com/enboxorg/enbox/issues/690
37
+ */
38
+ REGISTRATION_TOKENS: 'enbox:auth:registrationTokens',
29
39
  };
30
40
  //# sourceMappingURL=types.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"types.js","sourceRoot":"","sources":["../../src/types.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAuXH,oEAAoE;AAEpE,gEAAgE;AAChE,MAAM,CAAC,MAAM,yBAAyB,GAAG,wBAAwB,CAAC;AAElE;;;GAGG;AACH,MAAM,CAAC,MAAM,YAAY,GAAG;IAC1B,oDAAoD;IACpD,oBAAoB,EAAE,gCAAgC;IAEtD,+CAA+C;IAC/C,eAAe,EAAE,2BAA2B;IAE5C,4DAA4D;IAC5D,YAAY,EAAE,wBAAwB;IAEtC,yDAAyD;IACzD,aAAa,EAAE,yBAAyB;IAExC;;;;;;OAMG;IACH,kBAAkB,EAAE,6BAA6B;CACzC,CAAC"}
1
+ {"version":3,"file":"types.js","sourceRoot":"","sources":["../../src/types.ts"],"names":[],"mappings":"AAAA;;;GAGG;AA2cH,oEAAoE;AAEpE,gEAAgE;AAChE,MAAM,CAAC,MAAM,yBAAyB,GAAG,wBAAwB,CAAC;AAElE,yEAAyE;AACzE,MAAM,CAAC,MAAM,qBAAqB,GAAG,CAAC,2BAA2B,CAAC,CAAC;AAEnE;;;GAGG;AACH,MAAM,CAAC,MAAM,YAAY,GAAG;IAC1B,oDAAoD;IACpD,oBAAoB,EAAE,gCAAgC;IAEtD,+CAA+C;IAC/C,eAAe,EAAE,2BAA2B;IAE5C,4DAA4D;IAC5D,YAAY,EAAE,wBAAwB;IAEtC,yDAAyD;IACzD,aAAa,EAAE,yBAAyB;IAExC;;;;;;OAMG;IACH,kBAAkB,EAAE,6BAA6B;IAEjD;;;;;;OAMG;IACH,mBAAmB,EAAE,+BAA+B;CAC5C,CAAC"}
@@ -0,0 +1,188 @@
1
+ /**
2
+ * WalletConnect client — initiates the relay-mediated connect flow.
3
+ *
4
+ * Moved from `@enbox/agent/src/connect.ts` because `initClient` has zero
5
+ * coupling to agent internals (no vault, no key store, no DWN processing,
6
+ * no sync). Its only consumer is `auth/src/connect/wallet.ts`.
7
+ *
8
+ * The server-side counterpart (`EnboxConnectProtocol`) correctly stays in
9
+ * `@enbox/agent` because it uses `agent.processDwnRequest()`,
10
+ * `agent.sendDwnRequest()`, and `AgentPermissionsApi`.
11
+ *
12
+ * @module
13
+ */
14
+ var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {
15
+ function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }
16
+ return new (P || (P = Promise))(function (resolve, reject) {
17
+ function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
18
+ function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } }
19
+ function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }
20
+ step((generator = generator.apply(thisArg, _arguments || [])).next());
21
+ });
22
+ };
23
+ import { CryptoUtils } from '@enbox/crypto';
24
+ import { DidJwk } from '@enbox/dids';
25
+ import { Convert, logger } from '@enbox/common';
26
+ import { DwnInterfaceName, DwnMethodName } from '@enbox/dwn-sdk-js';
27
+ import { EnboxConnectProtocol, pollWithTtl } from '@enbox/agent';
28
+ /**
29
+ * Initiates the wallet connect process. Used when a client wants to obtain
30
+ * a did from a provider.
31
+ */
32
+ function initClient(_a) {
33
+ return __awaiter(this, arguments, void 0, function* ({ displayName, connectServerUrl, walletUri, permissionRequests, onWalletUriReady, validatePin, }) {
34
+ // ephemeral client did for ECDH, signing, verification
35
+ const clientDid = yield DidJwk.create();
36
+ // TODO: properly implement PKCE. this implementation is lacking server side validations and more.
37
+ // https://github.com/enboxorg/enbox/issues/829
38
+ // Derive the code challenge based on the code verifier
39
+ // const { codeChallengeBytes, codeChallengeBase64Url } =
40
+ // await Oidc.generateCodeChallenge();
41
+ const encryptionKey = CryptoUtils.randomBytes(32);
42
+ // Build callback URL for the connect request.
43
+ const callbackEndpoint = EnboxConnectProtocol.buildConnectUrl({
44
+ baseURL: connectServerUrl,
45
+ endpoint: 'callback',
46
+ });
47
+ // Build the connect request.
48
+ const request = yield EnboxConnectProtocol.createConnectRequest({
49
+ clientDid: clientDid.uri,
50
+ callbackUrl: callbackEndpoint,
51
+ permissionRequests: permissionRequests,
52
+ appName: displayName,
53
+ });
54
+ // Sign the request as a JWT.
55
+ const requestJwt = yield EnboxConnectProtocol.signJwt({
56
+ did: clientDid,
57
+ data: request,
58
+ });
59
+ if (!requestJwt) {
60
+ throw new Error('Unable to sign requestObject');
61
+ }
62
+ // Encrypt the request JWT with the symmetric key.
63
+ const requestObjectJwe = yield EnboxConnectProtocol.encryptRequest({
64
+ jwt: requestJwt,
65
+ encryptionKey,
66
+ });
67
+ const pushedAuthorizationRequestEndpoint = EnboxConnectProtocol.buildConnectUrl({
68
+ baseURL: connectServerUrl,
69
+ endpoint: 'pushedAuthorizationRequest',
70
+ });
71
+ const parResponse = yield fetch(pushedAuthorizationRequestEndpoint, {
72
+ body: JSON.stringify({ request: requestObjectJwe }),
73
+ method: 'POST',
74
+ headers: {
75
+ 'Content-Type': 'application/json',
76
+ },
77
+ signal: AbortSignal.timeout(30000),
78
+ });
79
+ if (!parResponse.ok) {
80
+ throw new Error(`${parResponse.status}: ${parResponse.statusText}`);
81
+ }
82
+ const parData = yield parResponse.json();
83
+ // a deeplink to a compatible wallet. if the wallet scans this link it should receive
84
+ // a route to its Connect provider flow and the params of where to fetch the auth request.
85
+ logger.log(`Wallet URI: ${walletUri}`);
86
+ const generatedWalletUri = new URL(walletUri);
87
+ generatedWalletUri.searchParams.set('request_uri', parData.request_uri);
88
+ generatedWalletUri.searchParams.set('encryption_key', Convert.uint8Array(encryptionKey).toBase64Url());
89
+ // call user's callback so they can send the URI to the wallet as they see fit
90
+ onWalletUriReady(generatedWalletUri.toString());
91
+ const tokenUrl = EnboxConnectProtocol.buildConnectUrl({
92
+ baseURL: connectServerUrl,
93
+ endpoint: 'token',
94
+ tokenParam: request.state,
95
+ });
96
+ // subscribe to receiving a response from the wallet with default TTL. receive ciphertext of {@link EnboxConnectResponse}
97
+ const authResponse = yield pollWithTtl(() => fetch(tokenUrl, { signal: AbortSignal.timeout(30000) }));
98
+ if (authResponse) {
99
+ const jwe = yield (authResponse === null || authResponse === void 0 ? void 0 : authResponse.text());
100
+ // Get the PIN from the user and use it as AAD to decrypt.
101
+ const pin = yield validatePin();
102
+ const jwt = yield EnboxConnectProtocol.decryptResponse(clientDid, jwe, pin);
103
+ const verifiedResponse = (yield EnboxConnectProtocol.verifyJwt({
104
+ jwt,
105
+ }));
106
+ return {
107
+ delegateGrants: verifiedResponse.delegateGrants,
108
+ delegatePortableDid: verifiedResponse.delegatePortableDid,
109
+ connectedDid: verifiedResponse.providerDid,
110
+ };
111
+ }
112
+ });
113
+ }
114
+ /**
115
+ * Creates a set of Dwn Permission Scopes to request for a given protocol.
116
+ *
117
+ * If no permissions are provided, the default is to request all relevant record permissions (write, read, delete, query, subscribe).
118
+ * 'configure' is not included by default, as this gives the application a lot of control over the protocol.
119
+ */
120
+ function createPermissionRequestForProtocol({ definition, permissions }) {
121
+ const requests = [];
122
+ // Add the ability to query for the specific protocol
123
+ requests.push({
124
+ protocol: definition.protocol,
125
+ interface: DwnInterfaceName.Protocols,
126
+ method: DwnMethodName.Query,
127
+ });
128
+ // A Messages.Read grant is a unified scope that covers MessagesRead, MessagesSync, and MessagesSubscribe.
129
+ // This single grant enables sync and real-time subscriptions for the protocol.
130
+ requests.push({
131
+ protocol: definition.protocol,
132
+ interface: DwnInterfaceName.Messages,
133
+ method: DwnMethodName.Read,
134
+ });
135
+ // We also request any additional permissions the user has requested for this protocol
136
+ for (const permission of permissions) {
137
+ switch (permission) {
138
+ case 'write':
139
+ requests.push({
140
+ protocol: definition.protocol,
141
+ interface: DwnInterfaceName.Records,
142
+ method: DwnMethodName.Write,
143
+ });
144
+ break;
145
+ case 'read':
146
+ requests.push({
147
+ protocol: definition.protocol,
148
+ interface: DwnInterfaceName.Records,
149
+ method: DwnMethodName.Read,
150
+ });
151
+ break;
152
+ case 'delete':
153
+ requests.push({
154
+ protocol: definition.protocol,
155
+ interface: DwnInterfaceName.Records,
156
+ method: DwnMethodName.Delete,
157
+ });
158
+ break;
159
+ case 'query':
160
+ requests.push({
161
+ protocol: definition.protocol,
162
+ interface: DwnInterfaceName.Records,
163
+ method: DwnMethodName.Query,
164
+ });
165
+ break;
166
+ case 'subscribe':
167
+ requests.push({
168
+ protocol: definition.protocol,
169
+ interface: DwnInterfaceName.Records,
170
+ method: DwnMethodName.Subscribe,
171
+ });
172
+ break;
173
+ case 'configure':
174
+ requests.push({
175
+ protocol: definition.protocol,
176
+ interface: DwnInterfaceName.Protocols,
177
+ method: DwnMethodName.Configure,
178
+ });
179
+ break;
180
+ }
181
+ }
182
+ return {
183
+ protocolDefinition: definition,
184
+ permissionScopes: requests,
185
+ };
186
+ }
187
+ export const WalletConnect = { initClient, createPermissionRequestForProtocol };
188
+ //# sourceMappingURL=wallet-connect-client.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"wallet-connect-client.js","sourceRoot":"","sources":["../../src/wallet-connect-client.ts"],"names":[],"mappings":"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"}