@sparkvault/sdk-mobile 0.1.3
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +186 -0
- package/dist/auth.d.ts +74 -0
- package/dist/auth.js +515 -0
- package/dist/auth.js.map +1 -0
- package/dist/billing.d.ts +21 -0
- package/dist/billing.js +10 -0
- package/dist/billing.js.map +1 -0
- package/dist/client.d.ts +27 -0
- package/dist/client.js +36 -0
- package/dist/client.js.map +1 -0
- package/dist/config.d.ts +39 -0
- package/dist/config.js +69 -0
- package/dist/config.js.map +1 -0
- package/dist/encoding.d.ts +7 -0
- package/dist/encoding.js +113 -0
- package/dist/encoding.js.map +1 -0
- package/dist/entropy.d.ts +18 -0
- package/dist/entropy.js +35 -0
- package/dist/entropy.js.map +1 -0
- package/dist/errors.d.ts +46 -0
- package/dist/errors.js +72 -0
- package/dist/errors.js.map +1 -0
- package/dist/folders.d.ts +15 -0
- package/dist/folders.js +54 -0
- package/dist/folders.js.map +1 -0
- package/dist/health.d.ts +19 -0
- package/dist/health.js +60 -0
- package/dist/health.js.map +1 -0
- package/dist/http.d.ts +45 -0
- package/dist/http.js +351 -0
- package/dist/http.js.map +1 -0
- package/dist/identity-dialog.d.ts +19 -0
- package/dist/identity-dialog.js +656 -0
- package/dist/identity-dialog.js.map +1 -0
- package/dist/index.d.ts +24 -0
- package/dist/index.js +15 -0
- package/dist/index.js.map +1 -0
- package/dist/ingots.d.ts +99 -0
- package/dist/ingots.js +365 -0
- package/dist/ingots.js.map +1 -0
- package/dist/mutex.d.ts +6 -0
- package/dist/mutex.js +20 -0
- package/dist/mutex.js.map +1 -0
- package/dist/push-tokens.d.ts +12 -0
- package/dist/push-tokens.js +15 -0
- package/dist/push-tokens.js.map +1 -0
- package/dist/sparks.d.ts +39 -0
- package/dist/sparks.js +32 -0
- package/dist/sparks.js.map +1 -0
- package/dist/tus.d.ts +24 -0
- package/dist/tus.js +202 -0
- package/dist/tus.js.map +1 -0
- package/dist/types.d.ts +406 -0
- package/dist/types.js +2 -0
- package/dist/types.js.map +1 -0
- package/dist/validation.d.ts +5 -0
- package/dist/validation.js +45 -0
- package/dist/validation.js.map +1 -0
- package/dist/vaults.d.ts +94 -0
- package/dist/vaults.js +106 -0
- package/dist/vaults.js.map +1 -0
- package/package.json +58 -0
- package/src/auth.ts +707 -0
- package/src/billing.ts +30 -0
- package/src/client.ts +51 -0
- package/src/config.ts +123 -0
- package/src/encoding.ts +150 -0
- package/src/entropy.ts +56 -0
- package/src/errors.ts +110 -0
- package/src/folders.ts +76 -0
- package/src/health.ts +81 -0
- package/src/http.ts +429 -0
- package/src/identity-dialog.tsx +955 -0
- package/src/index.ts +103 -0
- package/src/ingots.ts +593 -0
- package/src/mutex.ts +26 -0
- package/src/push-tokens.ts +26 -0
- package/src/sparks.ts +73 -0
- package/src/tus.ts +280 -0
- package/src/types.ts +487 -0
- package/src/validation.ts +49 -0
- package/src/vaults.ts +271 -0
package/dist/auth.js
ADDED
|
@@ -0,0 +1,515 @@
|
|
|
1
|
+
import { identityUrl } from './config.js';
|
|
2
|
+
import { base64UrlToBytes, base64UrlToUtf8, utf8ToBytes } from './encoding.js';
|
|
3
|
+
import { SparkVaultAuthenticationError, SparkVaultMobileError, SparkVaultValidationError } from './errors.js';
|
|
4
|
+
import nacl from 'tweetnacl';
|
|
5
|
+
const JWKS_CACHE_TTL_MS = 10 * 60 * 1000;
|
|
6
|
+
export class MobileAuthClient {
|
|
7
|
+
constructor(config, http) {
|
|
8
|
+
this.configCache = null;
|
|
9
|
+
this.jwksCache = null;
|
|
10
|
+
this.jwksCachedAt = 0;
|
|
11
|
+
this.config = config;
|
|
12
|
+
this.http = http;
|
|
13
|
+
}
|
|
14
|
+
getJwksUri() {
|
|
15
|
+
return identityUrl(this.config, '/.well-known/jwks.json');
|
|
16
|
+
}
|
|
17
|
+
async getConfig() {
|
|
18
|
+
const configRequest = this.configCache ?? this.startConfigLoad();
|
|
19
|
+
try {
|
|
20
|
+
return await configRequest;
|
|
21
|
+
}
|
|
22
|
+
catch (error) {
|
|
23
|
+
this.configCache = null;
|
|
24
|
+
throw error;
|
|
25
|
+
}
|
|
26
|
+
}
|
|
27
|
+
preloadConfig() {
|
|
28
|
+
if (!this.configCache) {
|
|
29
|
+
this.startConfigLoad().catch(() => undefined);
|
|
30
|
+
}
|
|
31
|
+
}
|
|
32
|
+
isConfigPreloaded() {
|
|
33
|
+
return this.configCache !== null;
|
|
34
|
+
}
|
|
35
|
+
async getJwks(options = {}) {
|
|
36
|
+
const now = Date.now();
|
|
37
|
+
const expired = now - this.jwksCachedAt > JWKS_CACHE_TTL_MS;
|
|
38
|
+
if (!this.jwksCache || expired || options.forceRefresh) {
|
|
39
|
+
this.jwksCache = this.getIdentity('/.well-known/jwks.json');
|
|
40
|
+
this.jwksCachedAt = now;
|
|
41
|
+
}
|
|
42
|
+
try {
|
|
43
|
+
return await this.jwksCache;
|
|
44
|
+
}
|
|
45
|
+
catch (error) {
|
|
46
|
+
this.jwksCache = null;
|
|
47
|
+
this.jwksCachedAt = 0;
|
|
48
|
+
throw error;
|
|
49
|
+
}
|
|
50
|
+
}
|
|
51
|
+
async verifyIdentityToken(token, options = {}) {
|
|
52
|
+
if (!token || typeof token !== 'string') {
|
|
53
|
+
throw new SparkVaultValidationError('Identity token is required', { field: 'token' });
|
|
54
|
+
}
|
|
55
|
+
const parts = token.split('.');
|
|
56
|
+
if (parts.length !== 3) {
|
|
57
|
+
throw new SparkVaultValidationError('Invalid identity token format');
|
|
58
|
+
}
|
|
59
|
+
const [headerPart, payloadPart, signaturePart] = parts;
|
|
60
|
+
let header;
|
|
61
|
+
let claims;
|
|
62
|
+
try {
|
|
63
|
+
header = JSON.parse(base64UrlToUtf8(headerPart));
|
|
64
|
+
const parsedClaims = JSON.parse(base64UrlToUtf8(payloadPart));
|
|
65
|
+
if (!this.isIdentityTokenClaims(parsedClaims)) {
|
|
66
|
+
throw new Error('Invalid claims');
|
|
67
|
+
}
|
|
68
|
+
claims = parsedClaims;
|
|
69
|
+
}
|
|
70
|
+
catch {
|
|
71
|
+
throw new SparkVaultValidationError('Invalid identity token payload');
|
|
72
|
+
}
|
|
73
|
+
if (header.alg !== 'EdDSA') {
|
|
74
|
+
throw new SparkVaultValidationError('Unsupported identity token algorithm', { alg: header.alg });
|
|
75
|
+
}
|
|
76
|
+
// Verify the signature BEFORE any claim is acted upon. JWKS is refreshed
|
|
77
|
+
// once on a kid miss so Identity App key rotation propagates without a
|
|
78
|
+
// process restart.
|
|
79
|
+
const jwk = await this.resolveJwk(header.kid, options.jwks);
|
|
80
|
+
const signatureValid = nacl.sign.detached.verify(utf8ToBytes(`${headerPart}.${payloadPart}`), base64UrlToBytes(signaturePart), base64UrlToBytes(jwk.x));
|
|
81
|
+
if (!signatureValid) {
|
|
82
|
+
throw new SparkVaultAuthenticationError('Identity token signature is invalid');
|
|
83
|
+
}
|
|
84
|
+
const now = Math.floor(Date.now() / 1000);
|
|
85
|
+
const clockSkewSeconds = options.clockSkewSeconds ?? 60;
|
|
86
|
+
if (claims.exp + clockSkewSeconds < now) {
|
|
87
|
+
throw new SparkVaultValidationError('Identity token has expired');
|
|
88
|
+
}
|
|
89
|
+
if (claims.iat - clockSkewSeconds > now) {
|
|
90
|
+
throw new SparkVaultValidationError('Identity token was issued in the future');
|
|
91
|
+
}
|
|
92
|
+
if (claims.nbf !== undefined && claims.nbf - clockSkewSeconds > now) {
|
|
93
|
+
throw new SparkVaultValidationError('Identity token is not valid yet');
|
|
94
|
+
}
|
|
95
|
+
if (typeof claims.nbf === 'number' && claims.nbf > now + clockSkewSeconds) {
|
|
96
|
+
throw new SparkVaultValidationError('Identity token is not yet valid');
|
|
97
|
+
}
|
|
98
|
+
const expectedIssuer = `${this.config.identityBaseUrl}/${this.config.identityAccountId}`;
|
|
99
|
+
if (claims.iss !== expectedIssuer) {
|
|
100
|
+
throw new SparkVaultValidationError('Invalid identity token issuer', {
|
|
101
|
+
expected: expectedIssuer,
|
|
102
|
+
received: claims.iss,
|
|
103
|
+
});
|
|
104
|
+
}
|
|
105
|
+
const expectedAudience = options.audience ?? this.config.identityAccountId;
|
|
106
|
+
if (claims.aud !== expectedAudience) {
|
|
107
|
+
throw new SparkVaultValidationError('Invalid identity token audience', {
|
|
108
|
+
expected: expectedAudience,
|
|
109
|
+
received: claims.aud,
|
|
110
|
+
});
|
|
111
|
+
}
|
|
112
|
+
return claims;
|
|
113
|
+
}
|
|
114
|
+
async resolveJwk(kid, providedJwks) {
|
|
115
|
+
if (providedJwks) {
|
|
116
|
+
return this.selectJwk(providedJwks, kid);
|
|
117
|
+
}
|
|
118
|
+
const jwks = await this.getJwks();
|
|
119
|
+
const match = this.tryFindJwk(jwks, kid);
|
|
120
|
+
if (match) {
|
|
121
|
+
return match;
|
|
122
|
+
}
|
|
123
|
+
// Cache miss for the requested kid: Identity App may have rotated keys.
|
|
124
|
+
// Force-refresh the JWKS exactly once and retry before failing.
|
|
125
|
+
const refreshed = await this.getJwks({ forceRefresh: true });
|
|
126
|
+
return this.selectJwk(refreshed, kid);
|
|
127
|
+
}
|
|
128
|
+
tryFindJwk(jwks, kid) {
|
|
129
|
+
const key = kid
|
|
130
|
+
? jwks.keys.find(candidate => candidate.kid === kid)
|
|
131
|
+
: jwks.keys.find(candidate => candidate.kty === 'OKP' && candidate.crv === 'Ed25519');
|
|
132
|
+
if (!key)
|
|
133
|
+
return null;
|
|
134
|
+
if (key.kty !== 'OKP' || key.crv !== 'Ed25519' || typeof key.x !== 'string') {
|
|
135
|
+
return null;
|
|
136
|
+
}
|
|
137
|
+
return key;
|
|
138
|
+
}
|
|
139
|
+
async sendTotp(request) {
|
|
140
|
+
const identity = this.normalizeIdentity(request.identity, request.identityType);
|
|
141
|
+
const result = await this.postIdentity('/totp/send', {
|
|
142
|
+
recipient: identity,
|
|
143
|
+
method: request.method,
|
|
144
|
+
});
|
|
145
|
+
return {
|
|
146
|
+
kindling: result.kindling,
|
|
147
|
+
expires_at: result.expires_at ?? Math.floor(Date.now() / 1000) + 900,
|
|
148
|
+
retry_after: result.retry_after,
|
|
149
|
+
is_signup: false,
|
|
150
|
+
};
|
|
151
|
+
}
|
|
152
|
+
async requestPin(request) {
|
|
153
|
+
return this.sendTotp({
|
|
154
|
+
identity: request.email,
|
|
155
|
+
identityType: 'email',
|
|
156
|
+
method: 'email',
|
|
157
|
+
});
|
|
158
|
+
}
|
|
159
|
+
async verifyTotp(request) {
|
|
160
|
+
const verifyResult = await this.verifyTotpWithRetryErrors(request);
|
|
161
|
+
if (!verifyResult.verified || !verifyResult.token) {
|
|
162
|
+
if (verifyResult.kindling) {
|
|
163
|
+
const error = new SparkVaultMobileError('Invalid code. Please try again.', {
|
|
164
|
+
code: 400,
|
|
165
|
+
statusCode: 400,
|
|
166
|
+
});
|
|
167
|
+
error.data = {
|
|
168
|
+
kindling: verifyResult.kindling,
|
|
169
|
+
expires_at: verifyResult.expires_at,
|
|
170
|
+
};
|
|
171
|
+
throw error;
|
|
172
|
+
}
|
|
173
|
+
throw new SparkVaultMobileError('Verification failed. Please request a new code.', {
|
|
174
|
+
code: 400,
|
|
175
|
+
statusCode: 400,
|
|
176
|
+
});
|
|
177
|
+
}
|
|
178
|
+
return this.toIdentityVerifyResult(verifyResult.token, {
|
|
179
|
+
identity: verifyResult.identity ?? request.recipient,
|
|
180
|
+
identityType: verifyResult.identity_type,
|
|
181
|
+
method: verifyResult.method,
|
|
182
|
+
redirect: verifyResult.redirect,
|
|
183
|
+
});
|
|
184
|
+
}
|
|
185
|
+
async verifyPin(request) {
|
|
186
|
+
const verifyResult = await this.verifyTotpWithRetryErrors(request);
|
|
187
|
+
if (!verifyResult.verified || !verifyResult.token) {
|
|
188
|
+
if (verifyResult.kindling) {
|
|
189
|
+
const error = new SparkVaultMobileError('Invalid code. Please try again.', {
|
|
190
|
+
code: 400,
|
|
191
|
+
statusCode: 400,
|
|
192
|
+
});
|
|
193
|
+
error.data = {
|
|
194
|
+
kindling: verifyResult.kindling,
|
|
195
|
+
expires_at: verifyResult.expires_at,
|
|
196
|
+
};
|
|
197
|
+
throw error;
|
|
198
|
+
}
|
|
199
|
+
throw new SparkVaultMobileError('Verification failed. Please request a new code.', {
|
|
200
|
+
code: 400,
|
|
201
|
+
statusCode: 400,
|
|
202
|
+
});
|
|
203
|
+
}
|
|
204
|
+
return this.exchangeIdentityToken(verifyResult.token);
|
|
205
|
+
}
|
|
206
|
+
async completeSignup(signupToken, request) {
|
|
207
|
+
const response = await this.http.post('/auth/complete-signup', request, {
|
|
208
|
+
skipAuth: true,
|
|
209
|
+
headers: { Authorization: `Bearer ${signupToken}` },
|
|
210
|
+
});
|
|
211
|
+
await this.storeSession(response.data);
|
|
212
|
+
return response.data;
|
|
213
|
+
}
|
|
214
|
+
async signup(params) {
|
|
215
|
+
return this.completeSignup(params.signup_token, {
|
|
216
|
+
organization_name: params.organization_name,
|
|
217
|
+
full_name: params.full_name,
|
|
218
|
+
});
|
|
219
|
+
}
|
|
220
|
+
async checkPasskeyStatus(identity, identityType) {
|
|
221
|
+
try {
|
|
222
|
+
const result = await this.postIdentity('/passkey/check', this.identityLookupBody(identity, identityType));
|
|
223
|
+
return { hasPasskey: Boolean(result.has_passkey) };
|
|
224
|
+
}
|
|
225
|
+
catch {
|
|
226
|
+
return { hasPasskey: false };
|
|
227
|
+
}
|
|
228
|
+
}
|
|
229
|
+
async getPasskeyAuthOptions(identity, identityType) {
|
|
230
|
+
return this.postIdentity('/passkey/verify', this.identityLookupBody(identity, identityType));
|
|
231
|
+
}
|
|
232
|
+
async completePasskeyAuthentication(credential, session) {
|
|
233
|
+
const result = await this.postIdentity('/passkey/verify/complete', { session, credential });
|
|
234
|
+
if (result.verified === false || !result.token) {
|
|
235
|
+
throw new SparkVaultAuthenticationError('Passkey verification failed');
|
|
236
|
+
}
|
|
237
|
+
return this.toIdentityVerifyResult(result.token, {
|
|
238
|
+
identity: result.identity,
|
|
239
|
+
identityType: result.identity_type,
|
|
240
|
+
method: result.method,
|
|
241
|
+
redirect: result.redirect,
|
|
242
|
+
});
|
|
243
|
+
}
|
|
244
|
+
async verifyPasskeyAuth(credential, session) {
|
|
245
|
+
const result = await this.completePasskeyAuthentication(credential, session);
|
|
246
|
+
return this.exchangeIdentityToken(result.token);
|
|
247
|
+
}
|
|
248
|
+
async getPasskeyRegisterOptions(params = {}) {
|
|
249
|
+
const email = params.email ?? await this.getStoredUserEmail();
|
|
250
|
+
if (!email) {
|
|
251
|
+
throw new SparkVaultAuthenticationError('You must be signed in to register a passkey');
|
|
252
|
+
}
|
|
253
|
+
return this.postIdentity('/passkey/register', {
|
|
254
|
+
email: email.trim().toLowerCase(),
|
|
255
|
+
device_name: params.deviceName ?? this.config.userAgent,
|
|
256
|
+
});
|
|
257
|
+
}
|
|
258
|
+
async registerPasskey(credential, session) {
|
|
259
|
+
const result = await this.postIdentity('/passkey/register/complete', { session, credential });
|
|
260
|
+
const success = result.verified !== false;
|
|
261
|
+
if (success && this.config.tokenStorage.getUser && this.config.tokenStorage.setUser) {
|
|
262
|
+
const user = await this.config.tokenStorage.getUser();
|
|
263
|
+
if (user) {
|
|
264
|
+
await this.config.tokenStorage.setUser({ ...user, has_passkey: true });
|
|
265
|
+
}
|
|
266
|
+
}
|
|
267
|
+
return { success, credential_id: credential.id };
|
|
268
|
+
}
|
|
269
|
+
async getMyPasskeyStatus() {
|
|
270
|
+
const email = await this.getStoredUserEmail();
|
|
271
|
+
if (!email) {
|
|
272
|
+
return { has_passkey: false };
|
|
273
|
+
}
|
|
274
|
+
const { hasPasskey } = await this.checkPasskeyStatus(email, 'email');
|
|
275
|
+
return { has_passkey: hasPasskey };
|
|
276
|
+
}
|
|
277
|
+
async getProfile() {
|
|
278
|
+
const response = await this.http.get('/profile');
|
|
279
|
+
if (this.config.tokenStorage.setUser) {
|
|
280
|
+
await this.config.tokenStorage.setUser(response.data);
|
|
281
|
+
}
|
|
282
|
+
return response.data;
|
|
283
|
+
}
|
|
284
|
+
async updateProfile(updates) {
|
|
285
|
+
const response = await this.http.put('/profile', updates);
|
|
286
|
+
if (this.config.tokenStorage.setUser) {
|
|
287
|
+
await this.config.tokenStorage.setUser(response.data);
|
|
288
|
+
}
|
|
289
|
+
return response.data;
|
|
290
|
+
}
|
|
291
|
+
async getAccount() {
|
|
292
|
+
const response = await this.http.get('/account');
|
|
293
|
+
if (this.config.tokenStorage.setAccount) {
|
|
294
|
+
await this.config.tokenStorage.setAccount(response.data);
|
|
295
|
+
}
|
|
296
|
+
return response.data;
|
|
297
|
+
}
|
|
298
|
+
async revokeRefreshToken(refreshToken) {
|
|
299
|
+
const token = refreshToken ?? await this.config.tokenStorage.getRefreshToken();
|
|
300
|
+
if (!token)
|
|
301
|
+
return;
|
|
302
|
+
await this.http.post('/auth/logout', { refresh_token: token }).catch(err => {
|
|
303
|
+
this.config.logger.warn('Logout API call failed', { error: String(err) });
|
|
304
|
+
});
|
|
305
|
+
}
|
|
306
|
+
async logout(options = {}) {
|
|
307
|
+
if (options.revoke !== false) {
|
|
308
|
+
await this.revokeRefreshToken();
|
|
309
|
+
}
|
|
310
|
+
if (options.clearTokens !== false) {
|
|
311
|
+
await this.config.tokenStorage.clearTokens();
|
|
312
|
+
}
|
|
313
|
+
}
|
|
314
|
+
async exchangeIdentityToken(identityToken) {
|
|
315
|
+
const sessionResponse = await this.http.post('/auth/identity/verify', { token: identityToken }, { skipAuth: true });
|
|
316
|
+
const session = sessionResponse.data;
|
|
317
|
+
if (session.user) {
|
|
318
|
+
await this.storeSession(session);
|
|
319
|
+
return {
|
|
320
|
+
access_token: session.access_token,
|
|
321
|
+
refresh_token: session.refresh_token,
|
|
322
|
+
token_type: session.token_type ?? 'Bearer',
|
|
323
|
+
expires_in: session.expires_in ?? 3600,
|
|
324
|
+
user: session.user,
|
|
325
|
+
};
|
|
326
|
+
}
|
|
327
|
+
return {
|
|
328
|
+
verified: true,
|
|
329
|
+
needs_signup_info: true,
|
|
330
|
+
signup_token: session.access_token,
|
|
331
|
+
expires_at: Math.floor(Date.now() / 1000) + (session.expires_in ?? 3600),
|
|
332
|
+
};
|
|
333
|
+
}
|
|
334
|
+
async storeSession(session) {
|
|
335
|
+
if (!session.access_token || !session.refresh_token) {
|
|
336
|
+
throw new SparkVaultValidationError('Invalid session response from SparkVault');
|
|
337
|
+
}
|
|
338
|
+
if (this.config.tokenStorage.setTokens) {
|
|
339
|
+
await this.config.tokenStorage.setTokens(session.access_token, session.refresh_token);
|
|
340
|
+
}
|
|
341
|
+
else {
|
|
342
|
+
await Promise.all([
|
|
343
|
+
this.config.tokenStorage.setAccessToken(session.access_token),
|
|
344
|
+
this.config.tokenStorage.setRefreshToken(session.refresh_token),
|
|
345
|
+
]);
|
|
346
|
+
}
|
|
347
|
+
const writes = [];
|
|
348
|
+
if (session.user && this.config.tokenStorage.setUser) {
|
|
349
|
+
writes.push(this.config.tokenStorage.setUser(session.user));
|
|
350
|
+
}
|
|
351
|
+
if (session.account && this.config.tokenStorage.setAccount) {
|
|
352
|
+
writes.push(this.config.tokenStorage.setAccount(session.account));
|
|
353
|
+
}
|
|
354
|
+
await Promise.all(writes);
|
|
355
|
+
}
|
|
356
|
+
async verifyTotpWithRetryErrors(request) {
|
|
357
|
+
try {
|
|
358
|
+
return await this.postIdentity('/totp/verify', {
|
|
359
|
+
kindling: request.kindling,
|
|
360
|
+
pin: request.pin,
|
|
361
|
+
recipient: request.recipient.trim().toLowerCase(),
|
|
362
|
+
});
|
|
363
|
+
}
|
|
364
|
+
catch (err) {
|
|
365
|
+
const apiError = err;
|
|
366
|
+
const message = apiError.message || 'Verification failed';
|
|
367
|
+
const code = apiError.statusCode ?? apiError.code;
|
|
368
|
+
if (code === 403 ||
|
|
369
|
+
code === 410 ||
|
|
370
|
+
message.toLowerCase().includes('burned') ||
|
|
371
|
+
message.toLowerCase().includes('expired')) {
|
|
372
|
+
throw new SparkVaultMobileError('Verification session expired. Please request a new code.', {
|
|
373
|
+
code: code || 410,
|
|
374
|
+
statusCode: typeof code === 'number' ? code : 410,
|
|
375
|
+
});
|
|
376
|
+
}
|
|
377
|
+
throw apiError;
|
|
378
|
+
}
|
|
379
|
+
}
|
|
380
|
+
startConfigLoad() {
|
|
381
|
+
const request = this.getIdentity('/config').catch((error) => {
|
|
382
|
+
this.configCache = null;
|
|
383
|
+
throw error;
|
|
384
|
+
});
|
|
385
|
+
this.configCache = request;
|
|
386
|
+
return request;
|
|
387
|
+
}
|
|
388
|
+
toIdentityVerifyResult(token, details) {
|
|
389
|
+
const claims = this.decodeIdentityTokenClaims(token);
|
|
390
|
+
return {
|
|
391
|
+
token,
|
|
392
|
+
identity: details.identity ?? claims.identity,
|
|
393
|
+
identityType: details.identityType ?? claims.identity_type,
|
|
394
|
+
method: details.method ?? claims.method,
|
|
395
|
+
redirect: details.redirect,
|
|
396
|
+
jwksUri: this.getJwksUri(),
|
|
397
|
+
};
|
|
398
|
+
}
|
|
399
|
+
decodeIdentityTokenClaims(token) {
|
|
400
|
+
const parts = token.split('.');
|
|
401
|
+
if (parts.length !== 3) {
|
|
402
|
+
throw new SparkVaultValidationError('Invalid identity token format');
|
|
403
|
+
}
|
|
404
|
+
try {
|
|
405
|
+
const payload = JSON.parse(base64UrlToUtf8(parts[1]));
|
|
406
|
+
if (!this.isIdentityTokenClaims(payload)) {
|
|
407
|
+
throw new Error('Invalid claims');
|
|
408
|
+
}
|
|
409
|
+
return payload;
|
|
410
|
+
}
|
|
411
|
+
catch {
|
|
412
|
+
throw new SparkVaultValidationError('Invalid identity token payload');
|
|
413
|
+
}
|
|
414
|
+
}
|
|
415
|
+
async getIdentity(path) {
|
|
416
|
+
const response = await this.config.fetch(identityUrl(this.config, path), {
|
|
417
|
+
method: 'GET',
|
|
418
|
+
headers: this.identityHeaders(),
|
|
419
|
+
timeoutMs: this.config.timeoutMs,
|
|
420
|
+
});
|
|
421
|
+
if (!response.ok) {
|
|
422
|
+
const errorBody = await response.json().catch(() => ({}));
|
|
423
|
+
const message = errorBody.error?.message ?? errorBody.message ?? 'Identity request failed';
|
|
424
|
+
throw new SparkVaultMobileError(message, {
|
|
425
|
+
code: errorBody.error?.code ?? response.status,
|
|
426
|
+
statusCode: response.status,
|
|
427
|
+
details: errorBody.error?.details,
|
|
428
|
+
meta: errorBody.meta,
|
|
429
|
+
});
|
|
430
|
+
}
|
|
431
|
+
const data = await response.json();
|
|
432
|
+
return (data.data ?? data);
|
|
433
|
+
}
|
|
434
|
+
async postIdentity(path, body, options = {}) {
|
|
435
|
+
const headers = this.identityHeaders(options.bearerToken);
|
|
436
|
+
const response = await this.config.fetch(identityUrl(this.config, path), {
|
|
437
|
+
method: 'POST',
|
|
438
|
+
headers,
|
|
439
|
+
body: JSON.stringify(body),
|
|
440
|
+
timeoutMs: this.config.timeoutMs,
|
|
441
|
+
});
|
|
442
|
+
if (!response.ok) {
|
|
443
|
+
const errorBody = await response.json().catch(() => ({}));
|
|
444
|
+
const message = errorBody.error?.message ?? errorBody.message ?? 'Identity verification failed';
|
|
445
|
+
const error = new SparkVaultMobileError(message, {
|
|
446
|
+
code: errorBody.error?.code ?? response.status,
|
|
447
|
+
statusCode: response.status,
|
|
448
|
+
details: errorBody.error?.details,
|
|
449
|
+
meta: errorBody.meta,
|
|
450
|
+
});
|
|
451
|
+
error.data = errorBody.data ?? errorBody;
|
|
452
|
+
throw error;
|
|
453
|
+
}
|
|
454
|
+
const data = await response.json();
|
|
455
|
+
return (data.data ?? data);
|
|
456
|
+
}
|
|
457
|
+
identityHeaders(bearerToken) {
|
|
458
|
+
const headers = {
|
|
459
|
+
'Content-Type': 'application/json',
|
|
460
|
+
Accept: 'application/json',
|
|
461
|
+
'User-Agent': this.config.userAgent,
|
|
462
|
+
};
|
|
463
|
+
if (bearerToken) {
|
|
464
|
+
headers.Authorization = `Bearer ${bearerToken}`;
|
|
465
|
+
}
|
|
466
|
+
return headers;
|
|
467
|
+
}
|
|
468
|
+
identityLookupBody(identity, identityType) {
|
|
469
|
+
const inferredType = identityType ?? (identity.includes('@') ? 'email' : 'phone');
|
|
470
|
+
const normalized = this.normalizeIdentity(identity, inferredType);
|
|
471
|
+
return inferredType === 'phone' ? { phone: normalized } : { email: normalized };
|
|
472
|
+
}
|
|
473
|
+
normalizeIdentity(identity, identityType) {
|
|
474
|
+
const trimmed = identity.trim();
|
|
475
|
+
if (!trimmed) {
|
|
476
|
+
throw new SparkVaultValidationError('Identity is required', { field: 'identity' });
|
|
477
|
+
}
|
|
478
|
+
return identityType === 'email' ? trimmed.toLowerCase() : trimmed;
|
|
479
|
+
}
|
|
480
|
+
selectJwk(jwks, kid) {
|
|
481
|
+
const key = kid
|
|
482
|
+
? jwks.keys.find(candidate => candidate.kid === kid)
|
|
483
|
+
: jwks.keys.find(candidate => candidate.kty === 'OKP' && candidate.crv === 'Ed25519');
|
|
484
|
+
if (!key) {
|
|
485
|
+
throw new SparkVaultValidationError('No matching Identity JWKS key was found', { kid });
|
|
486
|
+
}
|
|
487
|
+
if (key.kty !== 'OKP' || key.crv !== 'Ed25519' || typeof key.x !== 'string') {
|
|
488
|
+
throw new SparkVaultValidationError('Identity JWKS key is not an Ed25519 public key');
|
|
489
|
+
}
|
|
490
|
+
return key;
|
|
491
|
+
}
|
|
492
|
+
isIdentityTokenClaims(value) {
|
|
493
|
+
if (typeof value !== 'object' || value === null)
|
|
494
|
+
return false;
|
|
495
|
+
const claims = value;
|
|
496
|
+
return (typeof claims.iss === 'string' &&
|
|
497
|
+
typeof claims.sub === 'string' &&
|
|
498
|
+
typeof claims.aud === 'string' &&
|
|
499
|
+
typeof claims.exp === 'number' &&
|
|
500
|
+
typeof claims.iat === 'number' &&
|
|
501
|
+
(claims.nbf === undefined || typeof claims.nbf === 'number') &&
|
|
502
|
+
(claims.jti === undefined || typeof claims.jti === 'string') &&
|
|
503
|
+
typeof claims.identity === 'string' &&
|
|
504
|
+
(claims.identity_type === 'email' || claims.identity_type === 'phone') &&
|
|
505
|
+
typeof claims.verified_at === 'number' &&
|
|
506
|
+
typeof claims.method === 'string');
|
|
507
|
+
}
|
|
508
|
+
async getStoredUserEmail() {
|
|
509
|
+
if (!this.config.tokenStorage.getUser)
|
|
510
|
+
return null;
|
|
511
|
+
const user = await this.config.tokenStorage.getUser();
|
|
512
|
+
return user?.email ?? null;
|
|
513
|
+
}
|
|
514
|
+
}
|
|
515
|
+
//# sourceMappingURL=auth.js.map
|
package/dist/auth.js.map
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"auth.js","sourceRoot":"","sources":["../src/auth.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
import type { MobileHttpClient } from './http.js';
|
|
2
|
+
export interface BillingBalance {
|
|
3
|
+
balance: string;
|
|
4
|
+
balance_usd?: number;
|
|
5
|
+
currency?: string;
|
|
6
|
+
monthly_spend?: string;
|
|
7
|
+
monthly_spend_usd?: number;
|
|
8
|
+
transaction_count?: number;
|
|
9
|
+
recent_transactions?: Array<{
|
|
10
|
+
type: string;
|
|
11
|
+
amount: string;
|
|
12
|
+
balance_after?: string;
|
|
13
|
+
reference_id?: string;
|
|
14
|
+
created_at: number;
|
|
15
|
+
}>;
|
|
16
|
+
}
|
|
17
|
+
export declare class MobileBillingClient {
|
|
18
|
+
private readonly http;
|
|
19
|
+
constructor(http: MobileHttpClient);
|
|
20
|
+
getBalance(): Promise<BillingBalance>;
|
|
21
|
+
}
|
package/dist/billing.js
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"billing.js","sourceRoot":"","sources":["../src/billing.ts"],"names":[],"mappings":"AAkBA,MAAM,OAAO,mBAAmB;IAG9B,YAAY,IAAsB;QAChC,IAAI,CAAC,IAAI,GAAG,IAAI,CAAC;IACnB,CAAC;IAED,KAAK,CAAC,UAAU;QACd,MAAM,QAAQ,GAAG,MAAM,IAAI,CAAC,IAAI,CAAC,GAAG,CAAiB,kBAAkB,CAAC,CAAC;QACzE,OAAO,QAAQ,CAAC,IAAI,CAAC;IACvB,CAAC;CACF"}
|
package/dist/client.d.ts
ADDED
|
@@ -0,0 +1,27 @@
|
|
|
1
|
+
import { MobileAuthClient } from './auth.js';
|
|
2
|
+
import { MobileBillingClient } from './billing.js';
|
|
3
|
+
import { type SparkVaultMobileConfig, type ResolvedMobileConfig } from './config.js';
|
|
4
|
+
import { MobileEntropyClient } from './entropy.js';
|
|
5
|
+
import { MobileFoldersClient } from './folders.js';
|
|
6
|
+
import { MobileHealthClient } from './health.js';
|
|
7
|
+
import { type AuthEventListener } from './http.js';
|
|
8
|
+
import { MobileIngotsClient } from './ingots.js';
|
|
9
|
+
import { MobilePushTokensClient } from './push-tokens.js';
|
|
10
|
+
import { MobileSparksClient } from './sparks.js';
|
|
11
|
+
import { MobileVaultsClient } from './vaults.js';
|
|
12
|
+
export declare class SparkVaultMobile {
|
|
13
|
+
readonly config: ResolvedMobileConfig;
|
|
14
|
+
readonly auth: MobileAuthClient;
|
|
15
|
+
readonly vaults: MobileVaultsClient;
|
|
16
|
+
readonly ingots: MobileIngotsClient;
|
|
17
|
+
readonly folders: MobileFoldersClient;
|
|
18
|
+
readonly health: MobileHealthClient;
|
|
19
|
+
readonly sparks: MobileSparksClient;
|
|
20
|
+
readonly entropy: MobileEntropyClient;
|
|
21
|
+
readonly pushTokens: MobilePushTokensClient;
|
|
22
|
+
readonly billing: MobileBillingClient;
|
|
23
|
+
private readonly http;
|
|
24
|
+
constructor(config: SparkVaultMobileConfig);
|
|
25
|
+
onAuthEvent(listener: AuthEventListener): () => void;
|
|
26
|
+
}
|
|
27
|
+
export declare function createSparkVaultMobileClient(config: SparkVaultMobileConfig): SparkVaultMobile;
|
package/dist/client.js
ADDED
|
@@ -0,0 +1,36 @@
|
|
|
1
|
+
import { MobileAuthClient } from './auth.js';
|
|
2
|
+
import { MobileBillingClient } from './billing.js';
|
|
3
|
+
import { resolveMobileConfig } from './config.js';
|
|
4
|
+
import { MobileEntropyClient } from './entropy.js';
|
|
5
|
+
import { MobileFoldersClient } from './folders.js';
|
|
6
|
+
import { MobileHealthClient } from './health.js';
|
|
7
|
+
import { MobileHttpClient } from './http.js';
|
|
8
|
+
import { MobileIngotsClient } from './ingots.js';
|
|
9
|
+
import { MobilePushTokensClient } from './push-tokens.js';
|
|
10
|
+
import { MobileSparksClient } from './sparks.js';
|
|
11
|
+
import { MobileVaultsClient } from './vaults.js';
|
|
12
|
+
export class SparkVaultMobile {
|
|
13
|
+
constructor(config) {
|
|
14
|
+
this.config = resolveMobileConfig(config);
|
|
15
|
+
this.http = new MobileHttpClient(this.config);
|
|
16
|
+
this.auth = new MobileAuthClient(this.config, this.http);
|
|
17
|
+
this.vaults = new MobileVaultsClient(this.http);
|
|
18
|
+
this.ingots = new MobileIngotsClient(this.config, this.http);
|
|
19
|
+
this.folders = new MobileFoldersClient(this.http);
|
|
20
|
+
this.health = new MobileHealthClient(this.config);
|
|
21
|
+
this.sparks = new MobileSparksClient(this.http);
|
|
22
|
+
this.entropy = new MobileEntropyClient(this.http);
|
|
23
|
+
this.pushTokens = new MobilePushTokensClient(this.http);
|
|
24
|
+
this.billing = new MobileBillingClient(this.http);
|
|
25
|
+
if (this.config.preloadIdentityConfig) {
|
|
26
|
+
this.auth.preloadConfig();
|
|
27
|
+
}
|
|
28
|
+
}
|
|
29
|
+
onAuthEvent(listener) {
|
|
30
|
+
return this.http.onAuthEvent(listener);
|
|
31
|
+
}
|
|
32
|
+
}
|
|
33
|
+
export function createSparkVaultMobileClient(config) {
|
|
34
|
+
return new SparkVaultMobile(config);
|
|
35
|
+
}
|
|
36
|
+
//# sourceMappingURL=client.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"client.js","sourceRoot":"","sources":["../src/client.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,gBAAgB,EAAE,MAAM,WAAW,CAAC;AAC7C,OAAO,EAAE,mBAAmB,EAAE,MAAM,cAAc,CAAC;AACnD,OAAO,EAAE,mBAAmB,EAA0D,MAAM,aAAa,CAAC;AAC1G,OAAO,EAAE,mBAAmB,EAAE,MAAM,cAAc,CAAC;AACnD,OAAO,EAAE,mBAAmB,EAAE,MAAM,cAAc,CAAC;AACnD,OAAO,EAAE,kBAAkB,EAAE,MAAM,aAAa,CAAC;AACjD,OAAO,EAAE,gBAAgB,EAA0B,MAAM,WAAW,CAAC;AACrE,OAAO,EAAE,kBAAkB,EAAE,MAAM,aAAa,CAAC;AACjD,OAAO,EAAE,sBAAsB,EAAE,MAAM,kBAAkB,CAAC;AAC1D,OAAO,EAAE,kBAAkB,EAAE,MAAM,aAAa,CAAC;AACjD,OAAO,EAAE,kBAAkB,EAAE,MAAM,aAAa,CAAC;AAEjD,MAAM,OAAO,gBAAgB;IAa3B,YAAY,MAA8B;QACxC,IAAI,CAAC,MAAM,GAAG,mBAAmB,CAAC,MAAM,CAAC,CAAC;QAC1C,IAAI,CAAC,IAAI,GAAG,IAAI,gBAAgB,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;QAC9C,IAAI,CAAC,IAAI,GAAG,IAAI,gBAAgB,CAAC,IAAI,CAAC,MAAM,EAAE,IAAI,CAAC,IAAI,CAAC,CAAC;QACzD,IAAI,CAAC,MAAM,GAAG,IAAI,kBAAkB,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QAChD,IAAI,CAAC,MAAM,GAAG,IAAI,kBAAkB,CAAC,IAAI,CAAC,MAAM,EAAE,IAAI,CAAC,IAAI,CAAC,CAAC;QAC7D,IAAI,CAAC,OAAO,GAAG,IAAI,mBAAmB,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QAClD,IAAI,CAAC,MAAM,GAAG,IAAI,kBAAkB,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;QAClD,IAAI,CAAC,MAAM,GAAG,IAAI,kBAAkB,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QAChD,IAAI,CAAC,OAAO,GAAG,IAAI,mBAAmB,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QAClD,IAAI,CAAC,UAAU,GAAG,IAAI,sBAAsB,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QACxD,IAAI,CAAC,OAAO,GAAG,IAAI,mBAAmB,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QAElD,IAAI,IAAI,CAAC,MAAM,CAAC,qBAAqB,EAAE,CAAC;YACtC,IAAI,CAAC,IAAI,CAAC,aAAa,EAAE,CAAC;QAC5B,CAAC;IACH,CAAC;IAED,WAAW,CAAC,QAA2B;QACrC,OAAO,IAAI,CAAC,IAAI,CAAC,WAAW,CAAC,QAAQ,CAAC,CAAC;IACzC,CAAC;CACF;AAED,MAAM,UAAU,4BAA4B,CAAC,MAA8B;IACzE,OAAO,IAAI,gBAAgB,CAAC,MAAM,CAAC,CAAC;AACtC,CAAC"}
|