@ledgerhq/revault-sdk 0.25.0 → 0.26.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/lib/bake.cjs +1214 -1361
- package/lib/bake.cjs.map +1 -1
- package/lib/bake.d.cts +564 -562
- package/lib/bake.d.ts +564 -562
- package/lib/bake.js +1204 -1359
- package/lib/bake.js.map +1 -1
- package/lib/chunk-CKQMccvm.cjs +28 -0
- package/lib/crypto-BDBF_rfw.cjs +266 -0
- package/lib/crypto-BDBF_rfw.cjs.map +1 -0
- package/lib/crypto-CPCBrCSZ.js +245 -0
- package/lib/crypto-CPCBrCSZ.js.map +1 -0
- package/lib/crypto.cjs +5 -11
- package/lib/crypto.d.cts +10 -7
- package/lib/crypto.d.ts +10 -7
- package/lib/crypto.js +2 -11
- package/lib/device-0lcfYGHr.cjs +791 -0
- package/lib/device-0lcfYGHr.cjs.map +1 -0
- package/lib/device-B8Fww8_6.js +719 -0
- package/lib/device-B8Fww8_6.js.map +1 -0
- package/lib/device.cjs +6 -13
- package/lib/device.d.cts +2 -50
- package/lib/device.d.ts +2 -50
- package/lib/device.js +2 -13
- package/lib/engine.cjs +851 -888
- package/lib/engine.cjs.map +1 -1
- package/lib/engine.d.cts +3 -25
- package/lib/engine.d.ts +3 -25
- package/lib/engine.js +844 -885
- package/lib/engine.js.map +1 -1
- package/lib/index--fscLDTT.d.ts +237 -0
- package/lib/index-BE7oUpCb.d.cts +237 -0
- package/lib/index-DOn7RPPt.d.cts +23 -0
- package/lib/index-U0iFMp3g.d.ts +23 -0
- package/lib/index.cjs +0 -1
- package/lib/index.d.cts +10 -5
- package/lib/index.d.ts +10 -5
- package/lib/index.js +1 -1
- package/lib/logger-Cme0iL1f.d.cts +10 -0
- package/lib/logger-DWLViq7U.d.ts +10 -0
- package/lib/onboarding.cjs +215 -183
- package/lib/onboarding.cjs.map +1 -1
- package/lib/onboarding.d.cts +1918 -1722
- package/lib/onboarding.d.ts +1918 -1722
- package/lib/onboarding.js +211 -181
- package/lib/onboarding.js.map +1 -1
- package/lib/trpc-CWGPr8Ox.d.ts +20 -0
- package/lib/trpc-C_dUOB1u.d.cts +20 -0
- package/lib/types-BXkDuD6i.d.ts +207 -0
- package/lib/types-CQROu0nu.d.cts +6 -0
- package/lib/types-Ngwgtu_U.d.cts +207 -0
- package/lib/types-_QeBv1U4.d.ts +6 -0
- package/lib/types.cjs +0 -1
- package/lib/types.d.cts +3 -4
- package/lib/types.d.ts +3 -4
- package/lib/types.js +1 -1
- package/lib/utils-BGbdjOP9.js +61 -0
- package/lib/utils-BGbdjOP9.js.map +1 -0
- package/lib/utils-DbSFXp4c.cjs +84 -0
- package/lib/utils-DbSFXp4c.cjs.map +1 -0
- package/package.json +6 -6
- package/lib/chunk-2WGM7EWA.cjs +0 -282
- package/lib/chunk-2WGM7EWA.cjs.map +0 -1
- package/lib/chunk-AXI72NFY.js +0 -50
- package/lib/chunk-AXI72NFY.js.map +0 -1
- package/lib/chunk-DRMYBKL3.cjs +0 -820
- package/lib/chunk-DRMYBKL3.cjs.map +0 -1
- package/lib/chunk-KV5FO7N5.js +0 -282
- package/lib/chunk-KV5FO7N5.js.map +0 -1
- package/lib/chunk-LH4QQXUH.cjs +0 -50
- package/lib/chunk-LH4QQXUH.cjs.map +0 -1
- package/lib/chunk-PFZIW6UP.js +0 -820
- package/lib/chunk-PFZIW6UP.js.map +0 -1
- package/lib/crypto.cjs.map +0 -1
- package/lib/crypto.js.map +0 -1
- package/lib/device.cjs.map +0 -1
- package/lib/device.js.map +0 -1
- package/lib/index.cjs.map +0 -1
- package/lib/index.js.map +0 -1
- package/lib/logger-C-TPbnjv.d.cts +0 -9
- package/lib/logger-C-TPbnjv.d.ts +0 -9
- package/lib/types-C-ngtI5m.d.ts +0 -202
- package/lib/types-CpGEbAxh.d.cts +0 -19
- package/lib/types-CpGEbAxh.d.ts +0 -19
- package/lib/types-CryvY9pW.d.cts +0 -202
- package/lib/types-DJfbanPz.d.cts +0 -167
- package/lib/types-DJfbanPz.d.ts +0 -167
- package/lib/types.cjs.map +0 -1
- package/lib/types.js.map +0 -1
package/lib/onboarding.js
CHANGED
|
@@ -1,188 +1,218 @@
|
|
|
1
|
-
// src/onboarding.ts
|
|
2
1
|
import invariant from "invariant";
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
|
|
2
|
+
import { match } from "ts-pattern";
|
|
3
|
+
//#region src/onboarding.ts
|
|
4
|
+
const roleLabels = {
|
|
5
|
+
WRAPPING_KEY_OWNER: "Wrapping Key",
|
|
6
|
+
MASTER_ADMIN: "Admin",
|
|
7
|
+
SHARED_OWNER: "Shared Owner"
|
|
7
8
|
};
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
9
|
+
const devices = [
|
|
10
|
+
{
|
|
11
|
+
index: 1,
|
|
12
|
+
role: "WRAPPING_KEY_OWNER",
|
|
13
|
+
name: `${roleLabels.WRAPPING_KEY_OWNER} 1`
|
|
14
|
+
},
|
|
15
|
+
{
|
|
16
|
+
index: 2,
|
|
17
|
+
role: "WRAPPING_KEY_OWNER",
|
|
18
|
+
name: `${roleLabels.WRAPPING_KEY_OWNER} 2`
|
|
19
|
+
},
|
|
20
|
+
{
|
|
21
|
+
index: 3,
|
|
22
|
+
role: "WRAPPING_KEY_OWNER",
|
|
23
|
+
name: `${roleLabels.WRAPPING_KEY_OWNER} 3`
|
|
24
|
+
},
|
|
25
|
+
{
|
|
26
|
+
index: 4,
|
|
27
|
+
role: "MASTER_ADMIN",
|
|
28
|
+
name: `${roleLabels.MASTER_ADMIN} 1`
|
|
29
|
+
},
|
|
30
|
+
{
|
|
31
|
+
index: 5,
|
|
32
|
+
role: "MASTER_ADMIN",
|
|
33
|
+
name: `${roleLabels.MASTER_ADMIN} 2`
|
|
34
|
+
},
|
|
35
|
+
{
|
|
36
|
+
index: 6,
|
|
37
|
+
role: "MASTER_ADMIN",
|
|
38
|
+
name: `${roleLabels.MASTER_ADMIN} 3`
|
|
39
|
+
},
|
|
40
|
+
{
|
|
41
|
+
index: 7,
|
|
42
|
+
role: "SHARED_OWNER",
|
|
43
|
+
name: `${roleLabels.SHARED_OWNER} 1`
|
|
44
|
+
},
|
|
45
|
+
{
|
|
46
|
+
index: 8,
|
|
47
|
+
role: "SHARED_OWNER",
|
|
48
|
+
name: `${roleLabels.SHARED_OWNER} 2`
|
|
49
|
+
},
|
|
50
|
+
{
|
|
51
|
+
index: 9,
|
|
52
|
+
role: "SHARED_OWNER",
|
|
53
|
+
name: `${roleLabels.SHARED_OWNER} 3`
|
|
54
|
+
}
|
|
18
55
|
];
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
56
|
+
const deviceNameToIndex = (name) => {
|
|
57
|
+
const index = devices.find((d) => d.name === name)?.index;
|
|
58
|
+
invariant(index !== void 0, `Unknown device ${name}`);
|
|
59
|
+
return index;
|
|
23
60
|
};
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
*/
|
|
28
|
-
PENDING_DEVICE_CLAIMS: async ({ state, engine }, logger) => {
|
|
29
|
-
const promises = [];
|
|
30
|
-
for (const device of devices) {
|
|
31
|
-
if (state.claimedDevices.find(
|
|
32
|
-
/* v8 ignore next -- @preserve */
|
|
33
|
-
(c) => c.deviceName === device.name
|
|
34
|
-
) === void 0) {
|
|
35
|
-
const promise = engine.withDeviceIndex(device.index).claimDevice({ role: device.role, deviceName: device.name }).then(() => logger.info(`Claimed ${device.name}`));
|
|
36
|
-
promises.push(promise);
|
|
37
|
-
}
|
|
38
|
-
}
|
|
39
|
-
await Promise.all(promises);
|
|
40
|
-
return engine.client.onboarding.commitDeviceClaims.mutate({ onboardingId: state.id });
|
|
41
|
-
},
|
|
42
|
-
/**
|
|
43
|
-
* Wrapping Key provisioning
|
|
44
|
-
*/
|
|
45
|
-
PENDING_WRAPPING_KEY_PROVISIONING: async ({ state, engine }, logger) => {
|
|
46
|
-
const { id: onboardingId } = state;
|
|
47
|
-
state = await engine.client.onboarding.startWrappingKeyProvisioning.mutate({ onboardingId });
|
|
48
|
-
const wrappingKey = state.wrappingKey;
|
|
49
|
-
const toCollect = state.claimedDevices.filter((claimed) => {
|
|
50
|
-
if (claimed.role !== "WRAPPING_KEY_OWNER") return false;
|
|
51
|
-
const inFragment = !!state.wrappingKey?.fragments.find(
|
|
52
|
-
/* v8 ignore next -- @preserve */
|
|
53
|
-
(f) => f.pubKey === claimed.pubKey
|
|
54
|
-
);
|
|
55
|
-
return !inFragment;
|
|
56
|
-
}).map((c) => {
|
|
57
|
-
const index = deviceNameToIndex(c.deviceName);
|
|
58
|
-
return index;
|
|
59
|
-
});
|
|
60
|
-
await Promise.all(
|
|
61
|
-
toCollect.map(
|
|
62
|
-
(index) => engine.withDeviceIndex(index).collectWrappingKeyFragment(wrappingKey).then(() => logger.info(`Collected Wrapping Key ${index}`))
|
|
63
|
-
)
|
|
64
|
-
);
|
|
65
|
-
return engine.client.onboarding.commitWrappingKey.mutate({ onboardingId });
|
|
66
|
-
},
|
|
67
|
-
/**
|
|
68
|
-
* Init Master Admins registration
|
|
69
|
-
*/
|
|
70
|
-
PENDING_MASTER_ADMINS_REGISTRATION_INIT: async ({ engine, state }) => engine.client.onboarding.startMasterAdminsRegistration.mutate({ onboardingId: state.id }),
|
|
71
|
-
/**
|
|
72
|
-
* Master Admins registration
|
|
73
|
-
*/
|
|
74
|
-
PENDING_MASTER_ADMINS_REGISTRATION: async ({ state, engine }, logger) => {
|
|
75
|
-
const { id: onboardingId } = state;
|
|
76
|
-
const toRegister = state.claimedDevices.filter((claimed) => {
|
|
77
|
-
if (claimed.role !== "MASTER_ADMIN") return false;
|
|
78
|
-
const hasRegistered = !!state.masterAdmins.find(
|
|
79
|
-
/* v8 ignore next -- @preserve */
|
|
80
|
-
(a) => a.pubKey === claimed.pubKey
|
|
81
|
-
);
|
|
82
|
-
return !hasRegistered;
|
|
83
|
-
});
|
|
84
|
-
await Promise.all(
|
|
85
|
-
toRegister.map(async ({ deviceName: name }) => {
|
|
86
|
-
const index = deviceNameToIndex(name);
|
|
87
|
-
await engine.withDeviceIndex(index).registerDevice({ role: "ADMIN", name });
|
|
88
|
-
logger.info(`Registered ${name}`);
|
|
89
|
-
})
|
|
90
|
-
);
|
|
91
|
-
return engine.client.onboarding.createMasterAdminGroup.mutate({ onboardingId });
|
|
92
|
-
},
|
|
93
|
-
/**
|
|
94
|
-
* Init Shared Owners registration
|
|
95
|
-
*/
|
|
96
|
-
PENDING_SHARED_OWNERS_REGISTRATION_INIT: async ({ engine, state }) => engine.client.onboarding.startSharedOwnersRegistration.mutate({ onboardingId: state.id }),
|
|
97
|
-
/**
|
|
98
|
-
* Shared Owners registration
|
|
99
|
-
*/
|
|
100
|
-
PENDING_SHARED_OWNERS_REGISTRATION: async ({ state, engine }, logger) => {
|
|
101
|
-
const { id: onboardingId } = state;
|
|
102
|
-
const toRegister = state.claimedDevices.filter((claimed) => {
|
|
103
|
-
if (claimed.role !== "SHARED_OWNER") return false;
|
|
104
|
-
const hasRegistered = !!state.sharedOwners.find(
|
|
105
|
-
/* v8 ignore next -- @preserve */
|
|
106
|
-
(a) => a.pubKey === claimed.pubKey
|
|
107
|
-
);
|
|
108
|
-
return !hasRegistered;
|
|
109
|
-
});
|
|
110
|
-
await Promise.all(
|
|
111
|
-
toRegister.map(async ({ deviceName: name }) => {
|
|
112
|
-
const index = deviceNameToIndex(name);
|
|
113
|
-
await engine.withDeviceIndex(index).registerDevice({ role: "SHARED_OWNER", name });
|
|
114
|
-
logger.info(`Registered ${name}`);
|
|
115
|
-
})
|
|
116
|
-
);
|
|
117
|
-
return engine.client.onboarding.commitSharedOwnersRegistration.mutate({ onboardingId });
|
|
118
|
-
},
|
|
119
|
-
/**
|
|
120
|
-
* Review by master admins
|
|
121
|
-
*/
|
|
122
|
-
PENDING_REVIEW_BY_MASTER_ADMINS: async ({ state, engine }, logger) => {
|
|
123
|
-
const { id: onboardingId } = state;
|
|
124
|
-
state = await engine.client.onboarding.startReviewByMasterAdmins.mutate({ onboardingId });
|
|
125
|
-
const toCollect = state.masterAdmins.filter((admin) => !admin.review?.signature);
|
|
126
|
-
await Promise.all(
|
|
127
|
-
toCollect.map(async (admin) => {
|
|
128
|
-
const index = deviceNameToIndex(admin.name);
|
|
129
|
-
const challenge = admin.review?.challenge;
|
|
130
|
-
await engine.withDeviceIndex(index).reviewSharedOwner(challenge);
|
|
131
|
-
logger.info(`Approved with ${admin.name}`);
|
|
132
|
-
})
|
|
133
|
-
);
|
|
134
|
-
return engine.client.onboarding.commitReviewByMasterAdmins.mutate({ onboardingId });
|
|
135
|
-
},
|
|
136
|
-
/**
|
|
137
|
-
* Seed provisioning
|
|
138
|
-
*/
|
|
139
|
-
PENDING_SEED_PROVISIONING: async ({ state, engine }, logger) => {
|
|
140
|
-
const { id: onboardingId } = state;
|
|
141
|
-
state = await engine.client.onboarding.startSeedProvisioning.mutate({ onboardingId });
|
|
142
|
-
const toCollect = state.sharedOwners.filter((so) => !so.review?.seedFragment);
|
|
143
|
-
await Promise.all(
|
|
144
|
-
toCollect.map(async (so) => {
|
|
145
|
-
const index = deviceNameToIndex(so.name);
|
|
146
|
-
const challenge = so.review?.seedChallenge;
|
|
147
|
-
await engine.withDeviceIndex(index).collectSeedFragment(challenge);
|
|
148
|
-
logger.info(`Collected fragment for ${so.name}`);
|
|
149
|
-
})
|
|
150
|
-
);
|
|
151
|
-
return engine.client.onboarding.commitSeedProvisioning.mutate({ onboardingId });
|
|
152
|
-
},
|
|
153
|
-
/**
|
|
154
|
-
* Workspace initialization
|
|
155
|
-
*/
|
|
156
|
-
PENDING_WORKSPACE_INITIALIZATION: async ({ state, engine }) => engine.client.onboarding.initializeWorkspace.mutate({ onboardingId: state.id }),
|
|
157
|
-
/**
|
|
158
|
-
* Onboarding completed
|
|
159
|
-
*/
|
|
160
|
-
COMPLETED: async ({ state }) => state
|
|
61
|
+
const checkHsmHostingMode = (state, expectedMode) => {
|
|
62
|
+
/* v8 ignore next -- @preserve */
|
|
63
|
+
if (state.hsmHostingMode !== expectedMode) throw new Error(`HSM hosting mode should be ${expectedMode} but is ${state.hsmHostingMode}`);
|
|
161
64
|
};
|
|
162
|
-
|
|
163
|
-
|
|
164
|
-
|
|
165
|
-
|
|
166
|
-
|
|
167
|
-
|
|
168
|
-
|
|
169
|
-
|
|
170
|
-
|
|
171
|
-
|
|
172
|
-
|
|
173
|
-
|
|
174
|
-
|
|
175
|
-
|
|
176
|
-
|
|
177
|
-
|
|
178
|
-
|
|
179
|
-
|
|
180
|
-
|
|
181
|
-
|
|
182
|
-
|
|
183
|
-
|
|
184
|
-
|
|
185
|
-
|
|
65
|
+
/* v8 ignore next -- @preserve */
|
|
66
|
+
const checkExternalSigners = (state, externalSigners) => {
|
|
67
|
+
const hasExternalSigners = externalSigners && externalSigners.length > 0;
|
|
68
|
+
const errorMessage = match(state.hsmHostingMode).with("HOSTED", () => !hasExternalSigners ? null : "Hosted HSM does not support external signers").with("ON_PREM", () => hasExternalSigners ? null : "On-premises HSM requires at least 1 external signer").exhaustive();
|
|
69
|
+
if (errorMessage !== null) throw new Error(errorMessage);
|
|
70
|
+
};
|
|
71
|
+
const STEPS = {
|
|
72
|
+
PENDING_DEVICE_CLAIMS: async ({ state, engine }, logger) => {
|
|
73
|
+
const promises = [];
|
|
74
|
+
for (const device of devices) {
|
|
75
|
+
if (state.hsmHostingMode === "ON_PREM" && device.role === "SHARED_OWNER") continue;
|
|
76
|
+
/* v8 ignore else -- @preserve */
|
|
77
|
+
if (state.claimedDevices.find(
|
|
78
|
+
/* v8 ignore next -- @preserve */
|
|
79
|
+
(c) => c.deviceName === device.name
|
|
80
|
+
) === void 0) {
|
|
81
|
+
const promise = engine.withDeviceIndex(device.index).claimDevice({
|
|
82
|
+
role: device.role,
|
|
83
|
+
deviceName: device.name
|
|
84
|
+
}).then(() => logger.info(`Claimed ${device.name}`));
|
|
85
|
+
promises.push(promise);
|
|
86
|
+
}
|
|
87
|
+
}
|
|
88
|
+
await Promise.all(promises);
|
|
89
|
+
return engine.client.onboarding.commitDeviceClaims.mutate({ onboardingId: state.id });
|
|
90
|
+
},
|
|
91
|
+
PENDING_WRAPPING_KEY_PROVISIONING: async ({ state, engine }, logger) => {
|
|
92
|
+
const { id: onboardingId } = state;
|
|
93
|
+
state = await engine.client.onboarding.startWrappingKeyProvisioning.mutate({ onboardingId });
|
|
94
|
+
const wrappingKey = state.wrappingKey;
|
|
95
|
+
const toCollect = state.claimedDevices.filter((claimed) => {
|
|
96
|
+
if (claimed.role !== "WRAPPING_KEY_OWNER") return false;
|
|
97
|
+
return !!!state.wrappingKey?.fragments.find(
|
|
98
|
+
/* v8 ignore next -- @preserve */
|
|
99
|
+
(f) => f.pubKey === claimed.pubKey
|
|
100
|
+
);
|
|
101
|
+
}).map((c) => {
|
|
102
|
+
return deviceNameToIndex(c.deviceName);
|
|
103
|
+
});
|
|
104
|
+
await Promise.all(toCollect.map((index) => engine.withDeviceIndex(index).collectWrappingKeyFragment(wrappingKey).then(() => logger.info(`Collected Wrapping Key ${index}`))));
|
|
105
|
+
return engine.client.onboarding.commitWrappingKey.mutate({ onboardingId });
|
|
106
|
+
},
|
|
107
|
+
PENDING_MASTER_ADMINS_REGISTRATION_INIT: async ({ engine, state }) => engine.client.onboarding.startMasterAdminsRegistration.mutate({ onboardingId: state.id }),
|
|
108
|
+
PENDING_MASTER_ADMINS_REGISTRATION: async ({ state, engine }, logger) => {
|
|
109
|
+
const { id: onboardingId } = state;
|
|
110
|
+
const toRegister = state.claimedDevices.filter((claimed) => {
|
|
111
|
+
if (claimed.role !== "MASTER_ADMIN") return false;
|
|
112
|
+
return !!!state.masterAdmins.find(
|
|
113
|
+
/* v8 ignore next -- @preserve */
|
|
114
|
+
(a) => a.pubKey === claimed.pubKey
|
|
115
|
+
);
|
|
116
|
+
});
|
|
117
|
+
await Promise.all(toRegister.map(async ({ deviceName: name }) => {
|
|
118
|
+
const index = deviceNameToIndex(name);
|
|
119
|
+
await engine.withDeviceIndex(index).registerDevice({
|
|
120
|
+
role: "ADMIN",
|
|
121
|
+
name
|
|
122
|
+
});
|
|
123
|
+
logger.info(`Registered ${name}`);
|
|
124
|
+
}));
|
|
125
|
+
return engine.client.onboarding.createMasterAdminGroup.mutate({ onboardingId });
|
|
126
|
+
},
|
|
127
|
+
PENDING_SHARED_OWNERS_REGISTRATION_INIT: async ({ engine, state }) => {
|
|
128
|
+
checkHsmHostingMode(state, "HOSTED");
|
|
129
|
+
return engine.client.onboarding.startSharedOwnersRegistration.mutate({ onboardingId: state.id });
|
|
130
|
+
},
|
|
131
|
+
PENDING_SHARED_OWNERS_REGISTRATION: async ({ state, engine }, logger) => {
|
|
132
|
+
checkHsmHostingMode(state, "HOSTED");
|
|
133
|
+
const { id: onboardingId } = state;
|
|
134
|
+
const toRegister = state.claimedDevices.filter((claimed) => {
|
|
135
|
+
if (claimed.role !== "SHARED_OWNER") return false;
|
|
136
|
+
return !!!state.sharedOwners.find(
|
|
137
|
+
/* v8 ignore next -- @preserve */
|
|
138
|
+
(a) => a.pubKey === claimed.pubKey
|
|
139
|
+
);
|
|
140
|
+
});
|
|
141
|
+
await Promise.all(toRegister.map(async ({ deviceName: name }) => {
|
|
142
|
+
const index = deviceNameToIndex(name);
|
|
143
|
+
await engine.withDeviceIndex(index).registerDevice({
|
|
144
|
+
role: "SHARED_OWNER",
|
|
145
|
+
name
|
|
146
|
+
});
|
|
147
|
+
logger.info(`Registered ${name}`);
|
|
148
|
+
}));
|
|
149
|
+
return engine.client.onboarding.commitSharedOwnersRegistration.mutate({ onboardingId });
|
|
150
|
+
},
|
|
151
|
+
PENDING_REVIEW_BY_MASTER_ADMINS: async ({ state, engine }, logger) => {
|
|
152
|
+
const { id: onboardingId } = state;
|
|
153
|
+
state = await engine.client.onboarding.startReviewByMasterAdmins.mutate({ onboardingId });
|
|
154
|
+
const toCollect = state.masterAdmins.filter((admin) => !admin.review?.signature);
|
|
155
|
+
await Promise.all(toCollect.map(async (admin) => {
|
|
156
|
+
const index = deviceNameToIndex(admin.name);
|
|
157
|
+
const challenge = admin.review?.challenge;
|
|
158
|
+
await engine.withDeviceIndex(index).reviewSharedOwner(challenge);
|
|
159
|
+
logger.info(`Approved with ${admin.name}`);
|
|
160
|
+
}));
|
|
161
|
+
return engine.client.onboarding.commitReviewByMasterAdmins.mutate({ onboardingId });
|
|
162
|
+
},
|
|
163
|
+
PENDING_EXTERNAL_SIGNERS_REGISTRATION: async ({ state, engine, externalSigners }, logger) => {
|
|
164
|
+
checkHsmHostingMode(state, "ON_PREM");
|
|
165
|
+
invariant(externalSigners && externalSigners.length > 0, "External signers must exist");
|
|
166
|
+
const { id: onboardingId } = state;
|
|
167
|
+
state = await engine.client.onboarding.startExternalSignersRegistration.mutate({
|
|
168
|
+
onboardingId,
|
|
169
|
+
externalSigners
|
|
170
|
+
});
|
|
171
|
+
const toCollect = state.masterAdmins.filter((admin) => !admin.reviewOfExternalSigners?.signature);
|
|
172
|
+
await Promise.all(toCollect.map(async (admin) => {
|
|
173
|
+
const index = deviceNameToIndex(admin.name);
|
|
174
|
+
const challenge = admin.reviewOfExternalSigners?.challenge;
|
|
175
|
+
await engine.withDeviceIndex(index).reviewExternalSigners(challenge);
|
|
176
|
+
logger.info(`Approved with ${admin.name}`);
|
|
177
|
+
}));
|
|
178
|
+
return engine.client.onboarding.commitExternalSignersRegistration.mutate({ onboardingId });
|
|
179
|
+
},
|
|
180
|
+
PENDING_SEED_PROVISIONING: async ({ state, engine }, logger) => {
|
|
181
|
+
checkHsmHostingMode(state, "HOSTED");
|
|
182
|
+
const { id: onboardingId } = state;
|
|
183
|
+
state = await engine.client.onboarding.startSeedProvisioning.mutate({ onboardingId });
|
|
184
|
+
const toCollect = state.sharedOwners.filter((so) => !so.review?.seedFragment);
|
|
185
|
+
await Promise.all(toCollect.map(async (so) => {
|
|
186
|
+
const index = deviceNameToIndex(so.name);
|
|
187
|
+
const challenge = so.review?.seedChallenge;
|
|
188
|
+
await engine.withDeviceIndex(index).collectSeedFragment(challenge);
|
|
189
|
+
logger.info(`Collected fragment for ${so.name}`);
|
|
190
|
+
}));
|
|
191
|
+
return engine.client.onboarding.commitSeedProvisioning.mutate({ onboardingId });
|
|
192
|
+
},
|
|
193
|
+
PENDING_WORKSPACE_INITIALIZATION: async ({ state, engine }) => engine.client.onboarding.initializeWorkspace.mutate({ onboardingId: state.id })
|
|
186
194
|
};
|
|
187
|
-
|
|
195
|
+
async function onboard(opts, logger) {
|
|
196
|
+
const { engine, externalSigners, untilStep } = opts;
|
|
197
|
+
const { __onboardingId } = engine;
|
|
198
|
+
logger.info(`Joining onboarding ${__onboardingId}`);
|
|
199
|
+
let state = await engine.client.onboarding.getOnboarding.query({ onboardingId: __onboardingId });
|
|
200
|
+
checkExternalSigners(state, externalSigners);
|
|
201
|
+
while (state.step !== "COMPLETED") {
|
|
202
|
+
if (untilStep && state.step === untilStep) {
|
|
203
|
+
logger.info("Skipping the rest of the onboarding");
|
|
204
|
+
break;
|
|
205
|
+
}
|
|
206
|
+
const step = STEPS[state.step];
|
|
207
|
+
logger.info(step.name);
|
|
208
|
+
state = await step({
|
|
209
|
+
engine,
|
|
210
|
+
state,
|
|
211
|
+
externalSigners
|
|
212
|
+
}, logger);
|
|
213
|
+
}
|
|
214
|
+
}
|
|
215
|
+
//#endregion
|
|
216
|
+
export { STEPS, onboard };
|
|
217
|
+
|
|
188
218
|
//# sourceMappingURL=onboarding.js.map
|
package/lib/onboarding.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/onboarding.ts"],"sourcesContent":["import type {\n ClaimedRole,\n OnboardingFullStateResponse,\n OnboardingStep,\n} from \"@ledgerhq/revault-api\";\nimport invariant from \"invariant\";\n\nimport type { Logger } from \"@/logger\";\n\nimport type { Engine, WithOnboarding } from \"./engine/types\";\n\ntype StepAction = (\n options: {\n engine: Engine<WithOnboarding>;\n state: OnboardingFullStateResponse;\n },\n logger: Logger,\n) => Promise<OnboardingFullStateResponse>;\n\nconst roleLabels: Record<ClaimedRole, string> = {\n WRAPPING_KEY_OWNER: \"Wrapping Key\",\n MASTER_ADMIN: \"Admin\",\n SHARED_OWNER: \"Shared Owner\",\n};\n\nconst devices: { index: number; role: ClaimedRole; name: string }[] = [\n { index: 1, role: \"WRAPPING_KEY_OWNER\", name: `${roleLabels.WRAPPING_KEY_OWNER} 1` },\n { index: 2, role: \"WRAPPING_KEY_OWNER\", name: `${roleLabels.WRAPPING_KEY_OWNER} 2` },\n { index: 3, role: \"WRAPPING_KEY_OWNER\", name: `${roleLabels.WRAPPING_KEY_OWNER} 3` },\n { index: 4, role: \"MASTER_ADMIN\", name: `${roleLabels.MASTER_ADMIN} 1` },\n { index: 5, role: \"MASTER_ADMIN\", name: `${roleLabels.MASTER_ADMIN} 2` },\n { index: 6, role: \"MASTER_ADMIN\", name: `${roleLabels.MASTER_ADMIN} 3` },\n { index: 7, role: \"SHARED_OWNER\", name: `${roleLabels.SHARED_OWNER} 1` },\n { index: 8, role: \"SHARED_OWNER\", name: `${roleLabels.SHARED_OWNER} 2` },\n { index: 9, role: \"SHARED_OWNER\", name: `${roleLabels.SHARED_OWNER} 3` },\n];\n\nconst deviceNameToIndex = (name: string): number => {\n const index = devices.find((d) => d.name === name)?.index;\n invariant(index !== undefined, `Unknown device ${name}`);\n return index;\n};\n\nexport const STEPS = {\n /**\n * Devices claiming\n */\n PENDING_DEVICE_CLAIMS: async ({ state, engine }, logger) => {\n const promises: Promise<void>[] = [];\n for (const device of devices) {\n /* v8 ignore else -- @preserve */\n if (\n state.claimedDevices.find(\n /* v8 ignore next -- @preserve */\n (c) => c.deviceName === device.name,\n ) === undefined\n ) {\n const promise = engine\n .withDeviceIndex(device.index)\n .claimDevice({ role: device.role, deviceName: device.name })\n .then(() => logger.info(`Claimed ${device.name}`));\n promises.push(promise);\n }\n }\n await Promise.all(promises);\n return engine.client.onboarding.commitDeviceClaims.mutate({ onboardingId: state.id });\n },\n\n /**\n * Wrapping Key provisioning\n */\n PENDING_WRAPPING_KEY_PROVISIONING: async ({ state, engine }, logger) => {\n const { id: onboardingId } = state;\n state = await engine.client.onboarding.startWrappingKeyProvisioning.mutate({ onboardingId });\n const wrappingKey = state.wrappingKey!;\n const toCollect = state.claimedDevices\n .filter((claimed) => {\n if (claimed.role !== \"WRAPPING_KEY_OWNER\") return false;\n const inFragment = !!state.wrappingKey?.fragments.find(\n /* v8 ignore next -- @preserve */\n (f) => f.pubKey === claimed.pubKey,\n );\n return !inFragment;\n })\n .map((c) => {\n const index = deviceNameToIndex(c.deviceName);\n return index;\n });\n await Promise.all(\n toCollect.map((index) =>\n engine\n .withDeviceIndex(index)\n .collectWrappingKeyFragment(wrappingKey)\n .then(() => logger.info(`Collected Wrapping Key ${index}`)),\n ),\n );\n return engine.client.onboarding.commitWrappingKey.mutate({ onboardingId });\n },\n\n /**\n * Init Master Admins registration\n */\n PENDING_MASTER_ADMINS_REGISTRATION_INIT: async ({ engine, state }) =>\n engine.client.onboarding.startMasterAdminsRegistration.mutate({ onboardingId: state.id }),\n\n /**\n * Master Admins registration\n */\n PENDING_MASTER_ADMINS_REGISTRATION: async ({ state, engine }, logger) => {\n const { id: onboardingId } = state;\n const toRegister = state.claimedDevices.filter((claimed) => {\n if (claimed.role !== \"MASTER_ADMIN\") return false;\n const hasRegistered = !!state.masterAdmins.find(\n /* v8 ignore next -- @preserve */\n (a) => a.pubKey === claimed.pubKey,\n );\n return !hasRegistered;\n });\n await Promise.all(\n toRegister.map(async ({ deviceName: name }) => {\n const index = deviceNameToIndex(name);\n await engine.withDeviceIndex(index).registerDevice({ role: \"ADMIN\", name });\n logger.info(`Registered ${name}`);\n }),\n );\n return engine.client.onboarding.createMasterAdminGroup.mutate({ onboardingId });\n },\n\n /**\n * Init Shared Owners registration\n */\n PENDING_SHARED_OWNERS_REGISTRATION_INIT: async ({ engine, state }) =>\n engine.client.onboarding.startSharedOwnersRegistration.mutate({ onboardingId: state.id }),\n\n /**\n * Shared Owners registration\n */\n PENDING_SHARED_OWNERS_REGISTRATION: async ({ state, engine }, logger) => {\n const { id: onboardingId } = state;\n const toRegister = state.claimedDevices.filter((claimed) => {\n if (claimed.role !== \"SHARED_OWNER\") return false;\n const hasRegistered = !!state.sharedOwners.find(\n /* v8 ignore next -- @preserve */ (a) => a.pubKey === claimed.pubKey,\n );\n return !hasRegistered;\n });\n await Promise.all(\n toRegister.map(async ({ deviceName: name }) => {\n const index = deviceNameToIndex(name);\n await engine.withDeviceIndex(index).registerDevice({ role: \"SHARED_OWNER\", name });\n logger.info(`Registered ${name}`);\n }),\n );\n return engine.client.onboarding.commitSharedOwnersRegistration.mutate({ onboardingId });\n },\n\n /**\n * Review by master admins\n */\n PENDING_REVIEW_BY_MASTER_ADMINS: async ({ state, engine }, logger) => {\n const { id: onboardingId } = state;\n state = await engine.client.onboarding.startReviewByMasterAdmins.mutate({ onboardingId });\n const toCollect = state.masterAdmins.filter((admin) => !admin.review?.signature);\n await Promise.all(\n toCollect.map(async (admin) => {\n const index = deviceNameToIndex(admin.name);\n const challenge = admin.review?.challenge;\n await engine.withDeviceIndex(index).reviewSharedOwner(challenge!);\n logger.info(`Approved with ${admin.name}`);\n }),\n );\n return engine.client.onboarding.commitReviewByMasterAdmins.mutate({ onboardingId });\n },\n\n /**\n * Seed provisioning\n */\n PENDING_SEED_PROVISIONING: async ({ state, engine }, logger) => {\n const { id: onboardingId } = state;\n state = await engine.client.onboarding.startSeedProvisioning.mutate({ onboardingId });\n const toCollect = state.sharedOwners.filter((so) => !so.review?.seedFragment);\n await Promise.all(\n toCollect.map(async (so) => {\n const index = deviceNameToIndex(so.name);\n const challenge = so.review?.seedChallenge;\n await engine.withDeviceIndex(index).collectSeedFragment(challenge!);\n logger.info(`Collected fragment for ${so.name}`);\n }),\n );\n return engine.client.onboarding.commitSeedProvisioning.mutate({ onboardingId });\n },\n\n /**\n * Workspace initialization\n */\n PENDING_WORKSPACE_INITIALIZATION: async ({ state, engine }) =>\n engine.client.onboarding.initializeWorkspace.mutate({ onboardingId: state.id }),\n\n /**\n * Onboarding completed\n */\n COMPLETED: async ({ state }) => state,\n} as const satisfies Record<OnboardingStep, StepAction>;\n\nconst STEPS_LIST = Object.values(STEPS);\n\nexport async function onboard(\n {\n engine,\n untilStep,\n }: {\n engine: Engine<WithOnboarding>;\n untilStep?: OnboardingStep;\n },\n logger: Logger,\n): Promise<void> {\n const { __onboardingId } = engine;\n logger.info(`Joining onboarding ${__onboardingId}`);\n let state = await engine.client.onboarding.getOnboarding.query({\n onboardingId: __onboardingId,\n });\n\n for (const step of STEPS_LIST.slice(STEPS_LIST.indexOf(STEPS[state.step]))) {\n if (untilStep && state.step === untilStep) {\n logger.info(\"Skipping the rest of the onboarding\");\n break;\n }\n const index = STEPS_LIST.indexOf(step);\n const stepProgress = `${(index + 1).toString().padStart(2, \"0\")}/${STEPS_LIST.length}`;\n logger.info(`(${stepProgress}) ${step.name}`);\n state = await step({ engine, state }, logger);\n }\n}\n"],"mappings":"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","names":[]}
|
|
1
|
+
{"version":3,"file":"onboarding.js","names":[],"sources":["../src/onboarding.ts"],"sourcesContent":["import type {\n ClaimedRole,\n HsmHostingMode,\n OnboardingFullStateResponse,\n OnboardingStep,\n} from \"@ledgerhq/revault-api\";\nimport invariant from \"invariant\";\nimport { match } from \"ts-pattern\";\n\nimport type { Logger } from \"@/logger\";\n\nimport type { Engine, WithOnboarding } from \"./engine/types\";\n\ntype StepAction = (\n options: {\n engine: Engine<WithOnboarding>;\n state: OnboardingFullStateResponse;\n externalSigners?: string[];\n },\n logger: Logger,\n) => Promise<OnboardingFullStateResponse>;\n\nconst roleLabels: Record<ClaimedRole, string> = {\n WRAPPING_KEY_OWNER: \"Wrapping Key\",\n MASTER_ADMIN: \"Admin\",\n SHARED_OWNER: \"Shared Owner\",\n};\n\nconst devices: { index: number; role: ClaimedRole; name: string }[] = [\n { index: 1, role: \"WRAPPING_KEY_OWNER\", name: `${roleLabels.WRAPPING_KEY_OWNER} 1` },\n { index: 2, role: \"WRAPPING_KEY_OWNER\", name: `${roleLabels.WRAPPING_KEY_OWNER} 2` },\n { index: 3, role: \"WRAPPING_KEY_OWNER\", name: `${roleLabels.WRAPPING_KEY_OWNER} 3` },\n { index: 4, role: \"MASTER_ADMIN\", name: `${roleLabels.MASTER_ADMIN} 1` },\n { index: 5, role: \"MASTER_ADMIN\", name: `${roleLabels.MASTER_ADMIN} 2` },\n { index: 6, role: \"MASTER_ADMIN\", name: `${roleLabels.MASTER_ADMIN} 3` },\n { index: 7, role: \"SHARED_OWNER\", name: `${roleLabels.SHARED_OWNER} 1` },\n { index: 8, role: \"SHARED_OWNER\", name: `${roleLabels.SHARED_OWNER} 2` },\n { index: 9, role: \"SHARED_OWNER\", name: `${roleLabels.SHARED_OWNER} 3` },\n];\n\nconst deviceNameToIndex = (name: string): number => {\n const index = devices.find((d) => d.name === name)?.index;\n invariant(index !== undefined, `Unknown device ${name}`);\n return index;\n};\n\nconst checkHsmHostingMode = (\n state: OnboardingFullStateResponse,\n expectedMode: HsmHostingMode,\n): void => {\n /* v8 ignore next -- @preserve */\n if (state.hsmHostingMode !== expectedMode) {\n throw new Error(`HSM hosting mode should be ${expectedMode} but is ${state.hsmHostingMode}`);\n }\n};\n\n/* v8 ignore next -- @preserve */\nconst checkExternalSigners = (\n state: OnboardingFullStateResponse,\n externalSigners: string[] | undefined,\n): void => {\n const hasExternalSigners = externalSigners && externalSigners.length > 0;\n const errorMessage = match(state.hsmHostingMode)\n .with(\"HOSTED\", () =>\n !hasExternalSigners ? null : \"Hosted HSM does not support external signers\",\n )\n .with(\"ON_PREM\", () =>\n hasExternalSigners ? null : \"On-premises HSM requires at least 1 external signer\",\n )\n .exhaustive();\n if (errorMessage !== null) {\n throw new Error(errorMessage);\n }\n};\n\nexport const STEPS = {\n /**\n * Devices claiming\n */\n PENDING_DEVICE_CLAIMS: async ({ state, engine }, logger) => {\n const promises: Promise<void>[] = [];\n for (const device of devices) {\n if (state.hsmHostingMode === \"ON_PREM\" && device.role === \"SHARED_OWNER\") {\n continue;\n }\n /* v8 ignore else -- @preserve */\n if (\n state.claimedDevices.find(\n /* v8 ignore next -- @preserve */\n (c) => c.deviceName === device.name,\n ) === undefined\n ) {\n const promise = engine\n .withDeviceIndex(device.index)\n .claimDevice({ role: device.role, deviceName: device.name })\n .then(() => logger.info(`Claimed ${device.name}`));\n promises.push(promise);\n }\n }\n await Promise.all(promises);\n return engine.client.onboarding.commitDeviceClaims.mutate({ onboardingId: state.id });\n },\n\n /**\n * Wrapping Key provisioning\n */\n PENDING_WRAPPING_KEY_PROVISIONING: async ({ state, engine }, logger) => {\n const { id: onboardingId } = state;\n state = await engine.client.onboarding.startWrappingKeyProvisioning.mutate({ onboardingId });\n const wrappingKey = state.wrappingKey!;\n const toCollect = state.claimedDevices\n .filter((claimed) => {\n if (claimed.role !== \"WRAPPING_KEY_OWNER\") return false;\n const inFragment = !!state.wrappingKey?.fragments.find(\n /* v8 ignore next -- @preserve */\n (f) => f.pubKey === claimed.pubKey,\n );\n return !inFragment;\n })\n .map((c) => {\n const index = deviceNameToIndex(c.deviceName);\n return index;\n });\n await Promise.all(\n toCollect.map((index) =>\n engine\n .withDeviceIndex(index)\n .collectWrappingKeyFragment(wrappingKey)\n .then(() => logger.info(`Collected Wrapping Key ${index}`)),\n ),\n );\n return engine.client.onboarding.commitWrappingKey.mutate({ onboardingId });\n },\n\n /**\n * Init Master Admins registration\n */\n PENDING_MASTER_ADMINS_REGISTRATION_INIT: async ({ engine, state }) =>\n engine.client.onboarding.startMasterAdminsRegistration.mutate({ onboardingId: state.id }),\n\n /**\n * Master Admins registration\n */\n PENDING_MASTER_ADMINS_REGISTRATION: async ({ state, engine }, logger) => {\n const { id: onboardingId } = state;\n const toRegister = state.claimedDevices.filter((claimed) => {\n if (claimed.role !== \"MASTER_ADMIN\") return false;\n const hasRegistered = !!state.masterAdmins.find(\n /* v8 ignore next -- @preserve */\n (a) => a.pubKey === claimed.pubKey,\n );\n return !hasRegistered;\n });\n await Promise.all(\n toRegister.map(async ({ deviceName: name }) => {\n const index = deviceNameToIndex(name);\n await engine.withDeviceIndex(index).registerDevice({ role: \"ADMIN\", name });\n logger.info(`Registered ${name}`);\n }),\n );\n return engine.client.onboarding.createMasterAdminGroup.mutate({ onboardingId });\n },\n\n /**\n * Init Shared Owners registration\n */\n PENDING_SHARED_OWNERS_REGISTRATION_INIT: async ({ engine, state }) => {\n checkHsmHostingMode(state, \"HOSTED\");\n return engine.client.onboarding.startSharedOwnersRegistration.mutate({\n onboardingId: state.id,\n });\n },\n\n /**\n * Shared Owners registration\n */\n PENDING_SHARED_OWNERS_REGISTRATION: async ({ state, engine }, logger) => {\n checkHsmHostingMode(state, \"HOSTED\");\n const { id: onboardingId } = state;\n const toRegister = state.claimedDevices.filter((claimed) => {\n if (claimed.role !== \"SHARED_OWNER\") return false;\n const hasRegistered = !!state.sharedOwners.find(\n /* v8 ignore next -- @preserve */ (a) => a.pubKey === claimed.pubKey,\n );\n return !hasRegistered;\n });\n await Promise.all(\n toRegister.map(async ({ deviceName: name }) => {\n const index = deviceNameToIndex(name);\n await engine.withDeviceIndex(index).registerDevice({ role: \"SHARED_OWNER\", name });\n logger.info(`Registered ${name}`);\n }),\n );\n return engine.client.onboarding.commitSharedOwnersRegistration.mutate({ onboardingId });\n },\n\n /**\n * Review by master admins\n */\n PENDING_REVIEW_BY_MASTER_ADMINS: async ({ state, engine }, logger) => {\n const { id: onboardingId } = state;\n state = await engine.client.onboarding.startReviewByMasterAdmins.mutate({ onboardingId });\n const toCollect = state.masterAdmins.filter((admin) => !admin.review?.signature);\n await Promise.all(\n toCollect.map(async (admin) => {\n const index = deviceNameToIndex(admin.name);\n const challenge = admin.review?.challenge;\n await engine.withDeviceIndex(index).reviewSharedOwner(challenge!);\n logger.info(`Approved with ${admin.name}`);\n }),\n );\n return engine.client.onboarding.commitReviewByMasterAdmins.mutate({ onboardingId });\n },\n\n PENDING_EXTERNAL_SIGNERS_REGISTRATION: async ({ state, engine, externalSigners }, logger) => {\n checkHsmHostingMode(state, \"ON_PREM\");\n invariant(externalSigners && externalSigners.length > 0, \"External signers must exist\");\n const { id: onboardingId } = state;\n state = await engine.client.onboarding.startExternalSignersRegistration.mutate({\n onboardingId,\n externalSigners,\n });\n const toCollect = state.masterAdmins.filter(\n (admin) => !admin.reviewOfExternalSigners?.signature,\n );\n await Promise.all(\n toCollect.map(async (admin) => {\n const index = deviceNameToIndex(admin.name);\n const challenge = admin.reviewOfExternalSigners?.challenge;\n await engine.withDeviceIndex(index).reviewExternalSigners(challenge!); // same as review for shared owner, but with different challenge\n logger.info(`Approved with ${admin.name}`);\n }),\n );\n return engine.client.onboarding.commitExternalSignersRegistration.mutate({ onboardingId });\n },\n\n /**\n * Seed provisioning\n */\n PENDING_SEED_PROVISIONING: async ({ state, engine }, logger) => {\n checkHsmHostingMode(state, \"HOSTED\");\n const { id: onboardingId } = state;\n state = await engine.client.onboarding.startSeedProvisioning.mutate({ onboardingId });\n const toCollect = state.sharedOwners.filter((so) => !so.review?.seedFragment);\n await Promise.all(\n toCollect.map(async (so) => {\n const index = deviceNameToIndex(so.name);\n const challenge = so.review?.seedChallenge;\n await engine.withDeviceIndex(index).collectSeedFragment(challenge!);\n logger.info(`Collected fragment for ${so.name}`);\n }),\n );\n return engine.client.onboarding.commitSeedProvisioning.mutate({ onboardingId });\n },\n\n /**\n * Workspace initialization\n */\n PENDING_WORKSPACE_INITIALIZATION: async ({ state, engine }) =>\n engine.client.onboarding.initializeWorkspace.mutate({ onboardingId: state.id }),\n} as const satisfies Record<Exclude<OnboardingStep, \"COMPLETED\">, StepAction>;\n\nexport async function onboard(\n opts: {\n engine: Engine<WithOnboarding>;\n externalSigners?: string[];\n untilStep?: OnboardingStep;\n },\n logger: Logger,\n): Promise<void> {\n const { engine, externalSigners, untilStep } = opts;\n\n const { __onboardingId } = engine;\n logger.info(`Joining onboarding ${__onboardingId}`);\n let state = await engine.client.onboarding.getOnboarding.query({\n onboardingId: __onboardingId,\n });\n\n checkExternalSigners(state, externalSigners);\n\n while (state.step !== \"COMPLETED\") {\n if (untilStep && state.step === untilStep) {\n logger.info(\"Skipping the rest of the onboarding\");\n break;\n }\n const step = STEPS[state.step];\n logger.info(step.name);\n state = await step({ engine, state, externalSigners }, logger);\n }\n}\n"],"mappings":"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"}
|
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
import { AppRouter } from "@ledgerhq/revault-api";
|
|
2
|
+
import { TRPCClient } from "@trpc/client";
|
|
3
|
+
import { inferRouterInputs, inferRouterOutputs } from "@trpc/server";
|
|
4
|
+
|
|
5
|
+
//#region src/trpc.d.ts
|
|
6
|
+
type TRPCClientOptions = {
|
|
7
|
+
baseUrl: string;
|
|
8
|
+
debugAuthToken?: string;
|
|
9
|
+
rootAuthToken?: string;
|
|
10
|
+
apiAccessToken?: string;
|
|
11
|
+
psdAuth?: string;
|
|
12
|
+
};
|
|
13
|
+
type RevaultApiTRPCClient = TRPCClient<AppRouter>;
|
|
14
|
+
type RouterInputs = inferRouterInputs<AppRouter>;
|
|
15
|
+
type RouterOutputs = inferRouterOutputs<AppRouter>;
|
|
16
|
+
type TRPCContext = {
|
|
17
|
+
context: Record<string, unknown>;
|
|
18
|
+
} | undefined;
|
|
19
|
+
//#endregion
|
|
20
|
+
export { TRPCContext as a, TRPCClientOptions as i, RouterInputs as n, RouterOutputs as r, RevaultApiTRPCClient as t };
|
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
import { AppRouter } from "@ledgerhq/revault-api";
|
|
2
|
+
import { TRPCClient } from "@trpc/client";
|
|
3
|
+
import { inferRouterInputs, inferRouterOutputs } from "@trpc/server";
|
|
4
|
+
|
|
5
|
+
//#region src/trpc.d.ts
|
|
6
|
+
type TRPCClientOptions = {
|
|
7
|
+
baseUrl: string;
|
|
8
|
+
debugAuthToken?: string;
|
|
9
|
+
rootAuthToken?: string;
|
|
10
|
+
apiAccessToken?: string;
|
|
11
|
+
psdAuth?: string;
|
|
12
|
+
};
|
|
13
|
+
type RevaultApiTRPCClient = TRPCClient<AppRouter>;
|
|
14
|
+
type RouterInputs = inferRouterInputs<AppRouter>;
|
|
15
|
+
type RouterOutputs = inferRouterOutputs<AppRouter>;
|
|
16
|
+
type TRPCContext = {
|
|
17
|
+
context: Record<string, unknown>;
|
|
18
|
+
} | undefined;
|
|
19
|
+
//#endregion
|
|
20
|
+
export { TRPCContext as a, TRPCClientOptions as i, RouterInputs as n, RouterOutputs as r, RevaultApiTRPCClient as t };
|