@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,131 @@
1
+ /**
2
+ * Identity import flows.
3
+ *
4
+ * - Import from BIP-39 recovery phrase (re-derive vault + identity).
5
+ * - Import from PortableIdentity JSON.
6
+ * @module
7
+ */
8
+ var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {
9
+ function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }
10
+ return new (P || (P = Promise))(function (resolve, reject) {
11
+ function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
12
+ function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } }
13
+ function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }
14
+ step((generator = generator.apply(thisArg, _arguments || [])).next());
15
+ });
16
+ };
17
+ import { DEFAULT_DWN_ENDPOINTS } from '../types.js';
18
+ import { registerWithDwnEndpoints } from '../registration.js';
19
+ import { createDefaultIdentity, ensureVaultReady, finalizeSession, resolveIdentityDids, startSyncIfEnabled } from './lifecycle.js';
20
+ /**
21
+ * Import (or recover) an identity from a BIP-39 recovery phrase.
22
+ *
23
+ * This re-initializes the vault with the given phrase and password,
24
+ * recovering the agent DID and all derived keys.
25
+ */
26
+ export function importFromPhrase(ctx, options) {
27
+ return __awaiter(this, void 0, void 0, function* () {
28
+ var _a, _b, _c;
29
+ const { userAgent, emitter, storage } = ctx;
30
+ const { recoveryPhrase, password } = options;
31
+ const sync = (_a = options.sync) !== null && _a !== void 0 ? _a : ctx.defaultSync;
32
+ const dwnEndpoints = (_c = (_b = options.dwnEndpoints) !== null && _b !== void 0 ? _b : ctx.defaultDwnEndpoints) !== null && _c !== void 0 ? _c : DEFAULT_DWN_ENDPOINTS;
33
+ // Initialize the vault with the recovery phrase and start the agent.
34
+ const isFirstLaunch = yield userAgent.firstLaunch();
35
+ yield ensureVaultReady({
36
+ userAgent,
37
+ emitter,
38
+ password,
39
+ isFirstLaunch,
40
+ recoveryPhrase,
41
+ dwnEndpoints,
42
+ });
43
+ // The recovery phrase re-derives the same agent DID,
44
+ // but the user identity might not exist yet — create one if needed.
45
+ const identities = yield userAgent.identity.list();
46
+ let identity = identities[0];
47
+ let isNewIdentity = false;
48
+ if (!identity) {
49
+ isNewIdentity = true;
50
+ identity = yield createDefaultIdentity(userAgent, dwnEndpoints);
51
+ }
52
+ const { connectedDid, delegateDid } = resolveIdentityDids(identity);
53
+ // Register with DWN endpoints (if registration options are provided).
54
+ if (ctx.registration) {
55
+ yield registerWithDwnEndpoints({
56
+ userAgent: userAgent,
57
+ dwnEndpoints,
58
+ agentDid: userAgent.agentDid.uri,
59
+ connectedDid,
60
+ storage: storage,
61
+ }, ctx.registration);
62
+ }
63
+ // Register sync for new identities.
64
+ if (isNewIdentity && sync !== 'off') {
65
+ yield userAgent.sync.registerIdentity({
66
+ did: connectedDid,
67
+ options: { delegateDid, protocols: [] },
68
+ });
69
+ }
70
+ // Start sync.
71
+ startSyncIfEnabled(userAgent, sync);
72
+ // Persist session info, build AuthSession, and emit lifecycle events.
73
+ return finalizeSession({
74
+ userAgent,
75
+ emitter,
76
+ storage,
77
+ connectedDid,
78
+ delegateDid,
79
+ identityName: identity.metadata.name,
80
+ identityConnectedDid: identity.metadata.connectedDid,
81
+ });
82
+ });
83
+ }
84
+ /**
85
+ * Import an identity from a PortableIdentity JSON object.
86
+ *
87
+ * The portable identity contains the DID's private keys and metadata,
88
+ * allowing it to be used on this device.
89
+ */
90
+ export function importFromPortable(ctx, options) {
91
+ return __awaiter(this, void 0, void 0, function* () {
92
+ var _a, _b;
93
+ const { userAgent, emitter, storage } = ctx;
94
+ const sync = (_a = options.sync) !== null && _a !== void 0 ? _a : ctx.defaultSync;
95
+ const identity = yield userAgent.identity.import({
96
+ portableIdentity: options.portableIdentity,
97
+ });
98
+ const { connectedDid, delegateDid } = resolveIdentityDids(identity);
99
+ // Register with DWN endpoints (if registration options are provided).
100
+ // For portable imports, extract endpoints from the DID document's DWN service.
101
+ if (ctx.registration) {
102
+ const dwnEndpoints = (_b = ctx.defaultDwnEndpoints) !== null && _b !== void 0 ? _b : DEFAULT_DWN_ENDPOINTS;
103
+ yield registerWithDwnEndpoints({
104
+ userAgent: userAgent,
105
+ dwnEndpoints,
106
+ agentDid: userAgent.agentDid.uri,
107
+ connectedDid,
108
+ storage: storage,
109
+ }, ctx.registration);
110
+ }
111
+ // Register and start sync.
112
+ if (sync !== 'off') {
113
+ yield userAgent.sync.registerIdentity({
114
+ did: connectedDid,
115
+ options: { delegateDid, protocols: [] },
116
+ });
117
+ }
118
+ startSyncIfEnabled(userAgent, sync);
119
+ // Persist session info, build AuthSession, and emit lifecycle events.
120
+ return finalizeSession({
121
+ userAgent,
122
+ emitter,
123
+ storage,
124
+ connectedDid,
125
+ delegateDid,
126
+ identityName: identity.metadata.name,
127
+ identityConnectedDid: identity.metadata.connectedDid,
128
+ });
129
+ });
130
+ }
131
+ //# sourceMappingURL=import.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"import.js","sourceRoot":"","sources":["../../../src/connect/import.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,235 @@
1
+ /**
2
+ * Shared helpers for connect flows.
3
+ *
4
+ * Consolidates duplicated logic across `local-connect`, `session-restore`,
5
+ * `wallet-connect`, and `import-identity` flows:
6
+ *
7
+ * - Password resolution chain
8
+ * - Vault init/start lifecycle
9
+ * - Sync mode/interval calculation and startup
10
+ * - `connectedDid` / `delegateDid` derivation from identity metadata
11
+ * - Session finalization (storage persistence + AuthSession construction + events)
12
+ *
13
+ * @module
14
+ * @internal
15
+ */
16
+ var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {
17
+ function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }
18
+ return new (P || (P = Promise))(function (resolve, reject) {
19
+ function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
20
+ function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } }
21
+ function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }
22
+ step((generator = generator.apply(thisArg, _arguments || [])).next());
23
+ });
24
+ };
25
+ import { AuthSession } from '../identity-session.js';
26
+ import { DEFAULT_DWN_ENDPOINTS, INSECURE_DEFAULT_PASSWORD, STORAGE_KEYS } from '../types.js';
27
+ // ─── resolvePassword ─────────────────────────────────────────────
28
+ /**
29
+ * Resolve a password through the standard chain:
30
+ * explicit option → manager default → provider → insecure fallback.
31
+ *
32
+ * Emits a console warning when the insecure default is used.
33
+ *
34
+ * @param ctx - The flow context (provides `defaultPassword` and `passwordProvider`).
35
+ * @param explicit - An explicit password from the caller (highest priority).
36
+ * @param isFirstLaunch - Whether the vault has never been initialized.
37
+ * @returns The resolved password string.
38
+ *
39
+ * @internal
40
+ */
41
+ export function resolvePassword(ctx, explicit, isFirstLaunch) {
42
+ return __awaiter(this, void 0, void 0, function* () {
43
+ let password = explicit !== null && explicit !== void 0 ? explicit : ctx.defaultPassword;
44
+ if (!password && ctx.passwordProvider) {
45
+ try {
46
+ password = yield ctx.passwordProvider.getPassword({
47
+ reason: isFirstLaunch ? 'create' : 'unlock',
48
+ });
49
+ }
50
+ catch (_a) {
51
+ // Provider failed — fall through to insecure default.
52
+ }
53
+ }
54
+ password !== null && password !== void 0 ? password : (password = INSECURE_DEFAULT_PASSWORD);
55
+ if (password === INSECURE_DEFAULT_PASSWORD) {
56
+ console.warn('[@enbox/auth] SECURITY WARNING: No password set. Using insecure default. ' +
57
+ 'Set a password via AuthManager.create({ password }) or connect({ password }) ' +
58
+ 'to protect your identity vault.');
59
+ }
60
+ return password;
61
+ });
62
+ }
63
+ // ─── ensureVaultReady ────────────────────────────────────────────
64
+ /**
65
+ * Initialize (on first launch) and start the agent, then emit `vault-unlocked`.
66
+ *
67
+ * This consolidates the 5 copies of:
68
+ * ```ts
69
+ * if (isFirstLaunch) { await userAgent.initialize({ password, ... }); }
70
+ * await userAgent.start({ password });
71
+ * emitter.emit('vault-unlocked', {});
72
+ * ```
73
+ *
74
+ * @returns The recovery phrase if the vault was just initialized, otherwise `undefined`.
75
+ *
76
+ * @internal
77
+ */
78
+ export function ensureVaultReady(params) {
79
+ return __awaiter(this, void 0, void 0, function* () {
80
+ const { userAgent, emitter, password, isFirstLaunch } = params;
81
+ let recoveryPhrase;
82
+ if (isFirstLaunch) {
83
+ recoveryPhrase = yield userAgent.initialize({
84
+ password,
85
+ recoveryPhrase: params.recoveryPhrase,
86
+ dwnEndpoints: params.dwnEndpoints,
87
+ });
88
+ }
89
+ yield userAgent.start({ password });
90
+ emitter.emit('vault-unlocked', {});
91
+ return recoveryPhrase;
92
+ });
93
+ }
94
+ // ─── startSyncIfEnabled ─────────────────────────────────────────
95
+ /**
96
+ * Start DWN synchronisation if `sync` is not `'off'`.
97
+ *
98
+ * Consolidates 6 copies of:
99
+ * ```ts
100
+ * const syncMode = sync === undefined ? 'live' : 'poll';
101
+ * const syncInterval = sync ?? (syncMode === 'live' ? '5m' : '2m');
102
+ * userAgent.sync.startSync({ mode: syncMode, interval: syncInterval })
103
+ * .catch((err) => console.error('[@enbox/auth] Sync failed:', err));
104
+ * ```
105
+ *
106
+ * @internal
107
+ */
108
+ export function startSyncIfEnabled(userAgent, sync) {
109
+ if (sync === 'off') {
110
+ return;
111
+ }
112
+ const syncMode = sync === undefined ? 'live' : 'poll';
113
+ const syncInterval = sync !== null && sync !== void 0 ? sync : (syncMode === 'live' ? '5m' : '2m');
114
+ userAgent.sync.startSync({ mode: syncMode, interval: syncInterval })
115
+ .catch((err) => {
116
+ console.error('[@enbox/auth] Sync failed:', err);
117
+ });
118
+ }
119
+ // ─── createDefaultIdentity ──────────────────────────────────────
120
+ /**
121
+ * Create a new `did:dht` identity with Ed25519 signing and X25519
122
+ * encryption keys, and a DWN service endpoint.
123
+ *
124
+ * This consolidates the identical identity creation block that was
125
+ * duplicated in `localConnect` and `importFromPhrase`.
126
+ *
127
+ * @internal
128
+ */
129
+ export function createDefaultIdentity(userAgent_1) {
130
+ return __awaiter(this, arguments, void 0, function* (userAgent, dwnEndpoints = DEFAULT_DWN_ENDPOINTS, name = 'Default') {
131
+ return userAgent.identity.create({
132
+ didMethod: 'dht',
133
+ metadata: { name },
134
+ didOptions: {
135
+ services: [
136
+ {
137
+ id: 'dwn',
138
+ type: 'DecentralizedWebNode',
139
+ serviceEndpoint: dwnEndpoints,
140
+ }
141
+ ],
142
+ verificationMethods: [
143
+ {
144
+ algorithm: 'Ed25519',
145
+ id: 'sig',
146
+ purposes: ['assertionMethod', 'authentication'],
147
+ },
148
+ {
149
+ algorithm: 'X25519',
150
+ id: 'enc',
151
+ purposes: ['keyAgreement'],
152
+ },
153
+ ],
154
+ },
155
+ });
156
+ });
157
+ }
158
+ // ─── resolveIdentityDids ────────────────────────────────────────
159
+ /**
160
+ * Derive `connectedDid` and `delegateDid` from identity metadata.
161
+ *
162
+ * For a **local** identity: `connectedDid` is the identity's own DID URI
163
+ * and `delegateDid` is `undefined`.
164
+ *
165
+ * For a **wallet-connected** identity: `connectedDid` is the external wallet
166
+ * DID, and `delegateDid` is the local identity's DID URI.
167
+ *
168
+ * @param identity - The bearer identity to extract DIDs from.
169
+ * @param storedDelegateDid - Optional fallback delegate DID from storage,
170
+ * used by session-restore when the identity metadata doesn't include a
171
+ * `connectedDid` but a delegate DID was persisted in a prior session.
172
+ *
173
+ * @internal
174
+ */
175
+ export function resolveIdentityDids(identity, storedDelegateDid) {
176
+ var _a;
177
+ const connectedDid = (_a = identity.metadata.connectedDid) !== null && _a !== void 0 ? _a : identity.did.uri;
178
+ const delegateDid = identity.metadata.connectedDid
179
+ ? identity.did.uri
180
+ : (storedDelegateDid !== null && storedDelegateDid !== void 0 ? storedDelegateDid : undefined);
181
+ return { connectedDid, delegateDid };
182
+ }
183
+ // ─── finalizeSession ────────────────────────────────────────────
184
+ /**
185
+ * Persist session markers, build an `AuthSession`, and emit lifecycle events.
186
+ *
187
+ * Consolidates 5 copies of:
188
+ * ```ts
189
+ * await storage.set(STORAGE_KEYS.PREVIOUSLY_CONNECTED, 'true');
190
+ * await storage.set(STORAGE_KEYS.ACTIVE_IDENTITY, connectedDid);
191
+ * const session = new AuthSession({ ... });
192
+ * emitter.emit('identity-added', { identity: identityInfo });
193
+ * emitter.emit('session-start', { session: { ... } });
194
+ * ```
195
+ *
196
+ * @param params.emitIdentityAdded - Whether to emit `identity-added`. Defaults to `true`.
197
+ * Set to `false` for session-restore (identity was already added in the original flow).
198
+ * @param params.extraStorageKeys - Additional key-value pairs to persist (e.g. delegate/connected DIDs
199
+ * for wallet-connect flows).
200
+ *
201
+ * @internal
202
+ */
203
+ export function finalizeSession(params) {
204
+ return __awaiter(this, void 0, void 0, function* () {
205
+ const { userAgent, emitter, storage, connectedDid, delegateDid, recoveryPhrase, identityName, identityConnectedDid, emitIdentityAdded = true, extraStorageKeys, } = params;
206
+ // Persist session markers.
207
+ yield storage.set(STORAGE_KEYS.PREVIOUSLY_CONNECTED, 'true');
208
+ yield storage.set(STORAGE_KEYS.ACTIVE_IDENTITY, connectedDid);
209
+ if (extraStorageKeys) {
210
+ for (const [key, value] of Object.entries(extraStorageKeys)) {
211
+ yield storage.set(key, value);
212
+ }
213
+ }
214
+ const identityInfo = {
215
+ didUri: connectedDid,
216
+ name: identityName,
217
+ connectedDid: identityConnectedDid,
218
+ };
219
+ const session = new AuthSession({
220
+ agent: userAgent,
221
+ did: connectedDid,
222
+ delegateDid,
223
+ recoveryPhrase,
224
+ identity: identityInfo,
225
+ });
226
+ if (emitIdentityAdded) {
227
+ emitter.emit('identity-added', { identity: identityInfo });
228
+ }
229
+ emitter.emit('session-start', {
230
+ session: { did: connectedDid, delegateDid, identity: identityInfo },
231
+ });
232
+ return session;
233
+ });
234
+ }
235
+ //# sourceMappingURL=lifecycle.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"lifecycle.js","sourceRoot":"","sources":["../../../src/connect/lifecycle.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,91 @@
1
+ /**
2
+ * Local DID connect flow.
3
+ *
4
+ * Creates or reconnects a local identity with vault-protected keys.
5
+ * This replaces the "Mode D/E" paths in Enbox.connect().
6
+ * @module
7
+ */
8
+ var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {
9
+ function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }
10
+ return new (P || (P = Promise))(function (resolve, reject) {
11
+ function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
12
+ function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } }
13
+ function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }
14
+ step((generator = generator.apply(thisArg, _arguments || [])).next());
15
+ });
16
+ };
17
+ import { applyLocalDwnDiscovery } from '../discovery.js';
18
+ import { DEFAULT_DWN_ENDPOINTS } from '../types.js';
19
+ import { registerWithDwnEndpoints } from '../registration.js';
20
+ import { createDefaultIdentity, ensureVaultReady, finalizeSession, resolveIdentityDids, resolvePassword, startSyncIfEnabled } from './lifecycle.js';
21
+ /**
22
+ * Execute the local connect flow.
23
+ *
24
+ * - On first launch: initializes the vault, creates a new DID, returns recovery phrase.
25
+ * - On subsequent launches: unlocks the vault and reconnects to the existing identity.
26
+ */
27
+ export function localConnect(ctx_1) {
28
+ return __awaiter(this, arguments, void 0, function* (ctx, options = {}) {
29
+ var _a, _b, _c, _d, _e;
30
+ const { userAgent, emitter, storage } = ctx;
31
+ // Resolve password through the standard chain.
32
+ const isFirstLaunch = yield userAgent.firstLaunch();
33
+ const password = yield resolvePassword(ctx, options.password, isFirstLaunch);
34
+ const sync = (_a = options.sync) !== null && _a !== void 0 ? _a : ctx.defaultSync;
35
+ const dwnEndpoints = (_c = (_b = options.dwnEndpoints) !== null && _b !== void 0 ? _b : ctx.defaultDwnEndpoints) !== null && _c !== void 0 ? _c : DEFAULT_DWN_ENDPOINTS;
36
+ // Initialize vault on first launch and start the agent.
37
+ const recoveryPhrase = yield ensureVaultReady({
38
+ userAgent,
39
+ emitter,
40
+ password,
41
+ isFirstLaunch,
42
+ recoveryPhrase: options.recoveryPhrase,
43
+ dwnEndpoints,
44
+ });
45
+ // Apply local DWN discovery (browser redirect payload or persisted endpoint).
46
+ // In remote mode, discovery already ran before agent creation — skip.
47
+ if (!userAgent.dwn.isRemoteMode) {
48
+ yield applyLocalDwnDiscovery(userAgent, storage, emitter);
49
+ }
50
+ // Find or create the user identity.
51
+ const identities = yield userAgent.identity.list();
52
+ let identity = identities[0];
53
+ let isNewIdentity = false;
54
+ if (!identity) {
55
+ isNewIdentity = true;
56
+ identity = yield createDefaultIdentity(userAgent, dwnEndpoints, (_e = (_d = options.metadata) === null || _d === void 0 ? void 0 : _d.name) !== null && _e !== void 0 ? _e : 'Default');
57
+ }
58
+ const { connectedDid, delegateDid } = resolveIdentityDids(identity);
59
+ // Register with DWN endpoints (if registration options are provided).
60
+ if (ctx.registration) {
61
+ yield registerWithDwnEndpoints({
62
+ userAgent: userAgent,
63
+ dwnEndpoints,
64
+ agentDid: userAgent.agentDid.uri,
65
+ connectedDid,
66
+ storage: storage,
67
+ }, ctx.registration);
68
+ }
69
+ // Register sync for new identities.
70
+ if (isNewIdentity && sync !== 'off') {
71
+ yield userAgent.sync.registerIdentity({
72
+ did: connectedDid,
73
+ options: { delegateDid, protocols: [] },
74
+ });
75
+ }
76
+ // Start sync.
77
+ startSyncIfEnabled(userAgent, sync);
78
+ // Persist session info, build AuthSession, and emit lifecycle events.
79
+ return finalizeSession({
80
+ userAgent,
81
+ emitter,
82
+ storage,
83
+ connectedDid,
84
+ delegateDid,
85
+ recoveryPhrase,
86
+ identityName: identity.metadata.name,
87
+ identityConnectedDid: identity.metadata.connectedDid,
88
+ });
89
+ });
90
+ }
91
+ //# sourceMappingURL=local.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"local.js","sourceRoot":"","sources":["../../../src/connect/local.ts"],"names":[],"mappings":"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"}
@@ -14,9 +14,9 @@ var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, ge
14
14
  step((generator = generator.apply(thisArg, _arguments || [])).next());
15
15
  });
16
16
  };
17
- import { applyLocalDwnDiscovery } from './dwn-discovery.js';
18
- import { AuthSession } from '../identity-session.js';
19
- import { INSECURE_DEFAULT_PASSWORD, STORAGE_KEYS } from '../types.js';
17
+ import { applyLocalDwnDiscovery } from '../discovery.js';
18
+ import { STORAGE_KEYS } from '../types.js';
19
+ import { ensureVaultReady, finalizeSession, resolveIdentityDids, resolvePassword, startSyncIfEnabled } from './lifecycle.js';
20
20
  /**
21
21
  * Attempt to restore a previous session.
22
22
  *
@@ -25,35 +25,40 @@ import { INSECURE_DEFAULT_PASSWORD, STORAGE_KEYS } from '../types.js';
25
25
  */
26
26
  export function restoreSession(ctx_1) {
27
27
  return __awaiter(this, arguments, void 0, function* (ctx, options = {}) {
28
- var _a, _b;
29
28
  const { userAgent, emitter, storage } = ctx;
30
29
  // Check if there was a previous session.
31
30
  const previouslyConnected = yield storage.get(STORAGE_KEYS.PREVIOUSLY_CONNECTED);
32
31
  if (previouslyConnected !== 'true') {
33
32
  return undefined;
34
33
  }
35
- // Resolve password: explicit option → callback → manager default → insecure fallback.
36
- let password = (_a = options.password) !== null && _a !== void 0 ? _a : ctx.defaultPassword;
37
- if (!password && options.onPasswordRequired) {
38
- password = yield options.onPasswordRequired();
34
+ // Resolve password: explicit option → callback → provider → manager default → insecure fallback.
35
+ // Note: restoreSession has an extra `onPasswordRequired` callback that sits between
36
+ // the explicit password and the provider. We handle that here, then delegate the
37
+ // remainder of the chain to `resolvePassword()`.
38
+ let explicitPassword = options.password;
39
+ if (!explicitPassword && !ctx.defaultPassword && options.onPasswordRequired) {
40
+ explicitPassword = yield options.onPasswordRequired();
39
41
  }
40
- password !== null && password !== void 0 ? password : (password = INSECURE_DEFAULT_PASSWORD);
41
- // Warn if using insecure default.
42
- if (password === INSECURE_DEFAULT_PASSWORD) {
43
- console.warn('[@enbox/auth] SECURITY WARNING: No password set. Using insecure default. ' +
44
- 'Set a password to protect your identity vault.');
45
- }
46
- // Start the agent (initializes + unlocks vault).
47
- if (yield userAgent.firstLaunch()) {
48
- // Vault doesn't exist yet — this shouldn't happen if previouslyConnected is true.
49
- // Clean up the stale flag and return undefined.
42
+ // Check for stale session marker: if the vault was never initialized,
43
+ // previouslyConnected is a leftover — clean up and bail.
44
+ const isFirstLaunch = yield userAgent.firstLaunch();
45
+ if (isFirstLaunch) {
50
46
  yield storage.remove(STORAGE_KEYS.PREVIOUSLY_CONNECTED);
51
47
  return undefined;
52
48
  }
53
- yield userAgent.start({ password });
54
- emitter.emit('vault-unlocked', {});
49
+ const password = yield resolvePassword(ctx, explicitPassword, false);
50
+ // Start the agent (vault is known to exist).
51
+ yield ensureVaultReady({
52
+ userAgent,
53
+ emitter,
54
+ password,
55
+ isFirstLaunch: false,
56
+ });
55
57
  // Apply local DWN discovery (browser redirect payload or persisted endpoint).
56
- yield applyLocalDwnDiscovery(userAgent, storage, emitter);
58
+ // In remote mode, discovery already ran before agent creation — skip.
59
+ if (!userAgent.dwn.isRemoteMode) {
60
+ yield applyLocalDwnDiscovery(userAgent, storage, emitter);
61
+ }
57
62
  // Determine which identity to reconnect.
58
63
  const activeIdentityDid = yield storage.get(STORAGE_KEYS.ACTIVE_IDENTITY);
59
64
  const storedDelegateDid = yield storage.get(STORAGE_KEYS.DELEGATE_DID);
@@ -78,37 +83,21 @@ export function restoreSession(ctx_1) {
78
83
  yield storage.remove(STORAGE_KEYS.CONNECTED_DID);
79
84
  return undefined;
80
85
  }
81
- const connectedDid = (_b = identity.metadata.connectedDid) !== null && _b !== void 0 ? _b : identity.did.uri;
82
- const delegateDid = identity.metadata.connectedDid
83
- ? identity.did.uri
84
- : (storedDelegateDid !== null && storedDelegateDid !== void 0 ? storedDelegateDid : undefined);
86
+ const { connectedDid, delegateDid } = resolveIdentityDids(identity, storedDelegateDid !== null && storedDelegateDid !== void 0 ? storedDelegateDid : undefined);
85
87
  // Start sync.
86
- const sync = ctx.defaultSync;
87
- if (sync !== 'off') {
88
- const syncMode = sync === undefined ? 'live' : 'poll';
89
- const syncInterval = sync !== null && sync !== void 0 ? sync : (syncMode === 'live' ? '5m' : '2m');
90
- userAgent.sync.startSync({ mode: syncMode, interval: syncInterval })
91
- .catch((err) => {
92
- console.error('[@enbox/auth] Sync failed:', err);
93
- });
94
- }
95
- // Update persisted session info.
96
- yield storage.set(STORAGE_KEYS.ACTIVE_IDENTITY, connectedDid);
97
- const identityInfo = {
98
- didUri: connectedDid,
99
- name: identity.metadata.name,
100
- connectedDid: identity.metadata.connectedDid,
101
- };
102
- const session = new AuthSession({
103
- agent: userAgent,
104
- did: connectedDid,
88
+ startSyncIfEnabled(userAgent, ctx.defaultSync);
89
+ // Persist session info, build AuthSession, and emit lifecycle events.
90
+ // Session restore does not emit `identity-added` (identity was already added in the original flow).
91
+ return finalizeSession({
92
+ userAgent,
93
+ emitter,
94
+ storage,
95
+ connectedDid,
105
96
  delegateDid,
106
- identity: identityInfo,
107
- });
108
- emitter.emit('session-start', {
109
- session: { did: connectedDid, delegateDid, identity: identityInfo },
97
+ identityName: identity.metadata.name,
98
+ identityConnectedDid: identity.metadata.connectedDid,
99
+ emitIdentityAdded: false,
110
100
  });
111
- return session;
112
101
  });
113
102
  }
114
- //# sourceMappingURL=session-restore.js.map
103
+ //# sourceMappingURL=restore.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"restore.js","sourceRoot":"","sources":["../../../src/connect/restore.ts"],"names":[],"mappings":"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"}