@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.
- package/dist/esm/auth-manager.js +244 -121
- package/dist/esm/auth-manager.js.map +1 -1
- package/dist/esm/connect/import.js +131 -0
- package/dist/esm/connect/import.js.map +1 -0
- package/dist/esm/connect/lifecycle.js +235 -0
- package/dist/esm/connect/lifecycle.js.map +1 -0
- package/dist/esm/connect/local.js +91 -0
- package/dist/esm/connect/local.js.map +1 -0
- package/dist/esm/{flows/session-restore.js → connect/restore.js} +39 -50
- package/dist/esm/connect/restore.js.map +1 -0
- package/dist/esm/{flows/wallet-connect.js → connect/wallet.js} +33 -39
- package/dist/esm/connect/wallet.js.map +1 -0
- package/dist/esm/{flows/dwn-discovery.js → discovery.js} +98 -83
- package/dist/esm/discovery.js.map +1 -0
- package/dist/esm/index.js +7 -3
- package/dist/esm/index.js.map +1 -1
- package/dist/esm/password-provider.js +319 -0
- package/dist/esm/password-provider.js.map +1 -0
- package/dist/esm/{flows/dwn-registration.js → registration.js} +50 -4
- package/dist/esm/registration.js.map +1 -0
- package/dist/esm/types.js +11 -1
- package/dist/esm/types.js.map +1 -1
- package/dist/esm/wallet-connect-client.js +188 -0
- package/dist/esm/wallet-connect-client.js.map +1 -0
- package/dist/types/auth-manager.d.ts +86 -7
- package/dist/types/auth-manager.d.ts.map +1 -1
- package/dist/types/connect/import.d.ts +25 -0
- package/dist/types/connect/import.d.ts.map +1 -0
- package/dist/types/connect/lifecycle.d.ts +152 -0
- package/dist/types/connect/lifecycle.d.ts.map +1 -0
- package/dist/types/connect/local.d.ts +18 -0
- package/dist/types/connect/local.d.ts.map +1 -0
- package/dist/types/connect/restore.d.ts +18 -0
- package/dist/types/connect/restore.d.ts.map +1 -0
- package/dist/types/{flows/wallet-connect.d.ts → connect/wallet.d.ts} +7 -16
- package/dist/types/connect/wallet.d.ts.map +1 -0
- package/dist/types/{flows/dwn-discovery.d.ts → discovery.d.ts} +43 -56
- package/dist/types/discovery.d.ts.map +1 -0
- package/dist/types/index.d.ts +8 -4
- package/dist/types/index.d.ts.map +1 -1
- package/dist/types/password-provider.d.ts +194 -0
- package/dist/types/password-provider.d.ts.map +1 -0
- package/dist/types/{flows/dwn-registration.d.ts → registration.d.ts} +21 -2
- package/dist/types/registration.d.ts.map +1 -0
- package/dist/types/types.d.ts +92 -4
- package/dist/types/types.d.ts.map +1 -1
- package/dist/types/wallet-connect-client.d.ts +89 -0
- package/dist/types/wallet-connect-client.d.ts.map +1 -0
- package/package.json +15 -12
- package/src/auth-manager.ts +279 -145
- package/src/connect/import.ts +148 -0
- package/src/connect/lifecycle.ts +321 -0
- package/src/connect/local.ts +101 -0
- package/src/connect/restore.ts +117 -0
- package/src/{flows/wallet-connect.ts → connect/wallet.ts} +42 -58
- package/src/{flows/dwn-discovery.ts → discovery.ts} +103 -82
- package/src/index.ts +14 -4
- package/src/password-provider.ts +383 -0
- package/src/{flows/dwn-registration.ts → registration.ts} +61 -6
- package/src/types.ts +100 -4
- package/src/wallet-connect-client.ts +278 -0
- package/dist/esm/flows/dwn-discovery.js.map +0 -1
- package/dist/esm/flows/dwn-registration.js.map +0 -1
- package/dist/esm/flows/import-identity.js +0 -175
- package/dist/esm/flows/import-identity.js.map +0 -1
- package/dist/esm/flows/local-connect.js +0 -141
- package/dist/esm/flows/local-connect.js.map +0 -1
- package/dist/esm/flows/session-restore.js.map +0 -1
- package/dist/esm/flows/wallet-connect.js.map +0 -1
- package/dist/esm/vault/vault-manager.js +0 -95
- package/dist/esm/vault/vault-manager.js.map +0 -1
- package/dist/types/flows/dwn-discovery.d.ts.map +0 -1
- package/dist/types/flows/dwn-registration.d.ts.map +0 -1
- package/dist/types/flows/import-identity.d.ts +0 -35
- package/dist/types/flows/import-identity.d.ts.map +0 -1
- package/dist/types/flows/local-connect.d.ts +0 -29
- package/dist/types/flows/local-connect.d.ts.map +0 -1
- package/dist/types/flows/session-restore.d.ts +0 -27
- package/dist/types/flows/session-restore.d.ts.map +0 -1
- package/dist/types/flows/wallet-connect.d.ts.map +0 -1
- package/dist/types/vault/vault-manager.d.ts +0 -57
- package/dist/types/vault/vault-manager.d.ts.map +0 -1
- package/src/flows/import-identity.ts +0 -217
- package/src/flows/local-connect.ts +0 -171
- package/src/flows/session-restore.ts +0 -142
- 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 '
|
|
18
|
-
import {
|
|
19
|
-
import {
|
|
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
|
-
|
|
37
|
-
|
|
38
|
-
|
|
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
|
-
|
|
41
|
-
//
|
|
42
|
-
|
|
43
|
-
|
|
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
|
|
54
|
-
|
|
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
|
-
|
|
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
|
|
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
|
-
|
|
87
|
-
|
|
88
|
-
|
|
89
|
-
|
|
90
|
-
userAgent
|
|
91
|
-
|
|
92
|
-
|
|
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
|
-
|
|
107
|
-
|
|
108
|
-
|
|
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=
|
|
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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"}
|