@seedkey/sdk-client 0.0.1
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/CHANGELOG.md +3 -0
- package/LICENSE +21 -0
- package/README.md +262 -0
- package/dist/api.d.ts +34 -0
- package/dist/api.d.ts.map +1 -0
- package/dist/api.js +115 -0
- package/dist/api.js.map +1 -0
- package/dist/index.d.ts +55 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +59 -0
- package/dist/index.js.map +1 -0
- package/dist/logger.d.ts +111 -0
- package/dist/logger.d.ts.map +1 -0
- package/dist/logger.js +130 -0
- package/dist/logger.js.map +1 -0
- package/dist/seedkey.d.ts +186 -0
- package/dist/seedkey.d.ts.map +1 -0
- package/dist/seedkey.js +567 -0
- package/dist/seedkey.js.map +1 -0
- package/dist/storage.d.ts +42 -0
- package/dist/storage.d.ts.map +1 -0
- package/dist/storage.js +104 -0
- package/dist/storage.js.map +1 -0
- package/dist/types.d.ts +166 -0
- package/dist/types.d.ts.map +1 -0
- package/dist/types.js +70 -0
- package/dist/types.js.map +1 -0
- package/package.json +96 -0
package/dist/seedkey.js
ADDED
|
@@ -0,0 +1,567 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* SeedKey Auth SDK
|
|
3
|
+
*
|
|
4
|
+
* COMMUNICATION:
|
|
5
|
+
* - Events are versioned: 'seedkey:v1:request' / 'seedkey:v1:response'
|
|
6
|
+
*
|
|
7
|
+
* 🔑 TWO USAGE MODES:
|
|
8
|
+
*
|
|
9
|
+
* 1. Ready-to-use methods (REST API):
|
|
10
|
+
* - auth(), register(), authenticate() - full flow
|
|
11
|
+
* - getUser(), logout(), refreshToken() - session management
|
|
12
|
+
*
|
|
13
|
+
* 2. Low-level methods (custom implementation):
|
|
14
|
+
* - checkExtension() - extension check
|
|
15
|
+
* - getPublicKey() - get public key
|
|
16
|
+
* - signChallenge() - sign challenge
|
|
17
|
+
* - signMessage() - sign an arbitrary message
|
|
18
|
+
* - requestChallenge() - request challenge from backend
|
|
19
|
+
*/
|
|
20
|
+
import { SeedKeyError, ERROR_CODES, EXTENSION_DOWNLOAD_URL, ExtensionNotFoundError, ExtensionNotConfiguredError, } from './types';
|
|
21
|
+
import { sdkLogger as log, enableDebug } from './logger';
|
|
22
|
+
import { REQUEST_EVENT, RESPONSE_EVENT, SDK_VERSION } from './types';
|
|
23
|
+
/**
|
|
24
|
+
* Get the request event name for the current SDK version
|
|
25
|
+
*/
|
|
26
|
+
export function getRequestEventName() {
|
|
27
|
+
return REQUEST_EVENT;
|
|
28
|
+
}
|
|
29
|
+
/**
|
|
30
|
+
* Get the response event name for the current SDK version
|
|
31
|
+
*/
|
|
32
|
+
export function getResponseEventName() {
|
|
33
|
+
return RESPONSE_EVENT;
|
|
34
|
+
}
|
|
35
|
+
export class SeedKey {
|
|
36
|
+
constructor(options) {
|
|
37
|
+
this.pendingRequests = new Map();
|
|
38
|
+
// ============================================================================
|
|
39
|
+
// Extension Communication (CustomEvent)
|
|
40
|
+
// ============================================================================
|
|
41
|
+
this.handleResponse = (event) => {
|
|
42
|
+
const customEvent = event;
|
|
43
|
+
const data = customEvent.detail;
|
|
44
|
+
// Check message type
|
|
45
|
+
if (!data || data.type !== 'SEEDKEY_RESPONSE')
|
|
46
|
+
return;
|
|
47
|
+
log.debug('← Response received from extension', {
|
|
48
|
+
requestId: data.requestId,
|
|
49
|
+
success: data.success,
|
|
50
|
+
hasError: !!data.error
|
|
51
|
+
});
|
|
52
|
+
const pending = this.pendingRequests.get(data.requestId);
|
|
53
|
+
if (!pending) {
|
|
54
|
+
log.warn('Received response for unknown request', { requestId: data.requestId });
|
|
55
|
+
return;
|
|
56
|
+
}
|
|
57
|
+
// Clear timeout and remove from pending
|
|
58
|
+
clearTimeout(pending.timeoutId);
|
|
59
|
+
this.pendingRequests.delete(data.requestId);
|
|
60
|
+
// Resolve promise
|
|
61
|
+
if (data.success) {
|
|
62
|
+
pending.resolve(data.result);
|
|
63
|
+
}
|
|
64
|
+
else {
|
|
65
|
+
pending.reject(new SeedKeyError(data.error?.code || ERROR_CODES.SERVER_ERROR, data.error?.message || 'Extension error'));
|
|
66
|
+
}
|
|
67
|
+
};
|
|
68
|
+
this.backendUrl = options.backendUrl;
|
|
69
|
+
this.timeout = options.timeout || 60000;
|
|
70
|
+
// Enable debug if specified in options
|
|
71
|
+
if (options.debug) {
|
|
72
|
+
enableDebug();
|
|
73
|
+
}
|
|
74
|
+
log.info(`SDK v${SDK_VERSION} initialized`, { backendUrl: this.backendUrl, timeout: this.timeout });
|
|
75
|
+
// Listen for responses from the extension via CustomEvent
|
|
76
|
+
if (typeof document !== 'undefined') {
|
|
77
|
+
document.addEventListener(RESPONSE_EVENT, this.handleResponse);
|
|
78
|
+
log.debug('CustomEvent listener added:', RESPONSE_EVENT);
|
|
79
|
+
}
|
|
80
|
+
}
|
|
81
|
+
/**
|
|
82
|
+
* Cleanup resources on shutdown
|
|
83
|
+
*/
|
|
84
|
+
destroy() {
|
|
85
|
+
log.info('Destroying SDK', { pendingRequests: this.pendingRequests.size });
|
|
86
|
+
if (typeof document !== 'undefined') {
|
|
87
|
+
document.removeEventListener(RESPONSE_EVENT, this.handleResponse);
|
|
88
|
+
}
|
|
89
|
+
// Cancel all pending requests
|
|
90
|
+
for (const [requestId, { reject, timeoutId }] of this.pendingRequests) {
|
|
91
|
+
clearTimeout(timeoutId);
|
|
92
|
+
reject(new SeedKeyError(ERROR_CODES.TIMEOUT, 'SDK destroyed'));
|
|
93
|
+
log.debug('Cancelled pending request', { requestId });
|
|
94
|
+
}
|
|
95
|
+
this.pendingRequests.clear();
|
|
96
|
+
}
|
|
97
|
+
// ============================================================================
|
|
98
|
+
// Extension API - Status checks
|
|
99
|
+
// ============================================================================
|
|
100
|
+
/**
|
|
101
|
+
* Check whether the extension is installed
|
|
102
|
+
* → Extension: check_available
|
|
103
|
+
*/
|
|
104
|
+
async isAvailable() {
|
|
105
|
+
log.debug('Checking extension availability...');
|
|
106
|
+
try {
|
|
107
|
+
const response = await this.sendToExtension('check_available', {}, 3000);
|
|
108
|
+
const available = response.available === true;
|
|
109
|
+
log.info('Extension available:', available);
|
|
110
|
+
return available;
|
|
111
|
+
}
|
|
112
|
+
catch (error) {
|
|
113
|
+
log.warn('Extension not found', error);
|
|
114
|
+
return false;
|
|
115
|
+
}
|
|
116
|
+
}
|
|
117
|
+
/**
|
|
118
|
+
* Check whether the extension is initialized (has an identity)
|
|
119
|
+
* → Extension: is_initialized
|
|
120
|
+
*/
|
|
121
|
+
async isInitialized() {
|
|
122
|
+
log.debug('Checking extension initialization...');
|
|
123
|
+
try {
|
|
124
|
+
const response = await this.sendToExtension('is_initialized', {}, 3000);
|
|
125
|
+
const initialized = response.initialized === true;
|
|
126
|
+
log.info('Extension initialized:', initialized);
|
|
127
|
+
return initialized;
|
|
128
|
+
}
|
|
129
|
+
catch (error) {
|
|
130
|
+
log.warn('Initialization check error', error);
|
|
131
|
+
return false;
|
|
132
|
+
}
|
|
133
|
+
}
|
|
134
|
+
/**
|
|
135
|
+
* Full extension check: installed + configured
|
|
136
|
+
*
|
|
137
|
+
* @returns Extension status
|
|
138
|
+
* @throws ExtensionNotFoundError - if the extension is not installed
|
|
139
|
+
* @throws ExtensionNotConfiguredError - if the extension is not configured
|
|
140
|
+
*
|
|
141
|
+
* @example
|
|
142
|
+
* ```ts
|
|
143
|
+
* try {
|
|
144
|
+
* const status = await sdk.checkExtension();
|
|
145
|
+
* console.log('Extension ready:', status);
|
|
146
|
+
* } catch (error) {
|
|
147
|
+
* if (error instanceof ExtensionNotFoundError) {
|
|
148
|
+
* console.log('Install from:', error.downloadUrl);
|
|
149
|
+
* }
|
|
150
|
+
* }
|
|
151
|
+
* ```
|
|
152
|
+
*/
|
|
153
|
+
async checkExtension() {
|
|
154
|
+
log.debug('Full extension check...');
|
|
155
|
+
// Check installation
|
|
156
|
+
const installed = await this.isAvailable();
|
|
157
|
+
if (!installed) {
|
|
158
|
+
log.error('Extension is not installed');
|
|
159
|
+
throw new ExtensionNotFoundError();
|
|
160
|
+
}
|
|
161
|
+
// Check configuration
|
|
162
|
+
const initialized = await this.isInitialized();
|
|
163
|
+
if (!initialized) {
|
|
164
|
+
log.error('Extension is not configured');
|
|
165
|
+
throw new ExtensionNotConfiguredError();
|
|
166
|
+
}
|
|
167
|
+
log.info('Extension is ready');
|
|
168
|
+
return {
|
|
169
|
+
installed: true,
|
|
170
|
+
initialized: true,
|
|
171
|
+
};
|
|
172
|
+
}
|
|
173
|
+
/**
|
|
174
|
+
* Get extension status without throwing errors
|
|
175
|
+
*
|
|
176
|
+
* @returns Extension status with downloadUrl if not installed
|
|
177
|
+
*/
|
|
178
|
+
async getExtensionStatus() {
|
|
179
|
+
log.debug('Getting extension status...');
|
|
180
|
+
const installed = await this.isAvailable();
|
|
181
|
+
if (!installed) {
|
|
182
|
+
return {
|
|
183
|
+
installed: false,
|
|
184
|
+
initialized: false,
|
|
185
|
+
downloadUrl: EXTENSION_DOWNLOAD_URL,
|
|
186
|
+
};
|
|
187
|
+
}
|
|
188
|
+
const initialized = await this.isInitialized();
|
|
189
|
+
return {
|
|
190
|
+
installed: true,
|
|
191
|
+
initialized,
|
|
192
|
+
};
|
|
193
|
+
}
|
|
194
|
+
/**
|
|
195
|
+
* Get extension download URL
|
|
196
|
+
*/
|
|
197
|
+
getDownloadUrl() {
|
|
198
|
+
return EXTENSION_DOWNLOAD_URL;
|
|
199
|
+
}
|
|
200
|
+
/**
|
|
201
|
+
* Get public key for the current domain
|
|
202
|
+
* → Extension: get_public_key
|
|
203
|
+
*/
|
|
204
|
+
async getPublicKey() {
|
|
205
|
+
log.debug('Requesting public key...');
|
|
206
|
+
const response = await this.sendToExtension('get_public_key', {
|
|
207
|
+
domain: window.location.hostname
|
|
208
|
+
});
|
|
209
|
+
log.info('Public key received', { publicKey: `${response.publicKey.slice(0, 16)}...` });
|
|
210
|
+
return response.publicKey;
|
|
211
|
+
}
|
|
212
|
+
/**
|
|
213
|
+
* Sign an arbitrary message
|
|
214
|
+
* → Extension: sign_message
|
|
215
|
+
*/
|
|
216
|
+
async signMessage(message) {
|
|
217
|
+
log.debug('Requesting message signature...', { messageLength: message.length });
|
|
218
|
+
const response = await this.sendToExtension('sign_message', {
|
|
219
|
+
message,
|
|
220
|
+
domain: window.location.hostname
|
|
221
|
+
});
|
|
222
|
+
log.info('Message signed', { signatureLength: response.signature.length });
|
|
223
|
+
return response;
|
|
224
|
+
}
|
|
225
|
+
/**
|
|
226
|
+
* Get SDK version
|
|
227
|
+
*/
|
|
228
|
+
getVersion() {
|
|
229
|
+
return SDK_VERSION;
|
|
230
|
+
}
|
|
231
|
+
// ============================================================================
|
|
232
|
+
// Extension API - Low-level methods for custom authentication
|
|
233
|
+
// ============================================================================
|
|
234
|
+
/**
|
|
235
|
+
* Sign challenge via Extension
|
|
236
|
+
*
|
|
237
|
+
* Use this method for custom authentication implementation.
|
|
238
|
+
*
|
|
239
|
+
* → Extension: sign_challenge
|
|
240
|
+
*
|
|
241
|
+
* @param challenge - Challenge from backend
|
|
242
|
+
* @returns Signature and public key
|
|
243
|
+
*
|
|
244
|
+
* @example
|
|
245
|
+
* ```ts
|
|
246
|
+
* // Custom authentication
|
|
247
|
+
* const publicKey = await sdk.getPublicKey();
|
|
248
|
+
* const { challenge } = await sdk.requestChallenge(publicKey, 'authenticate');
|
|
249
|
+
* const { signature } = await sdk.signChallenge(challenge);
|
|
250
|
+
* // Send signature to your backend
|
|
251
|
+
* ```
|
|
252
|
+
*/
|
|
253
|
+
async signChallenge(challenge) {
|
|
254
|
+
log.debug('Requesting challenge signature...', { action: challenge.action });
|
|
255
|
+
const response = await this.sendToExtension('sign_challenge', {
|
|
256
|
+
challenge,
|
|
257
|
+
domain: window.location.hostname
|
|
258
|
+
});
|
|
259
|
+
log.info('Challenge signed', { signatureLength: response.signature.length });
|
|
260
|
+
return response;
|
|
261
|
+
}
|
|
262
|
+
// ============================================================================
|
|
263
|
+
// HTTP API Methods
|
|
264
|
+
// ============================================================================
|
|
265
|
+
/**
|
|
266
|
+
* Register a new account
|
|
267
|
+
*
|
|
268
|
+
* Flow:
|
|
269
|
+
* 1. SDK → Extension: getPublicKey()
|
|
270
|
+
* 2. SDK → Backend: POST /challenge {publicKey, action: 'register'}
|
|
271
|
+
* 3. SDK → Extension: signChallenge()
|
|
272
|
+
* 4. SDK → Backend: POST /register
|
|
273
|
+
*/
|
|
274
|
+
async register(opts) {
|
|
275
|
+
log.group('User registration');
|
|
276
|
+
try {
|
|
277
|
+
// Get public key from Extension
|
|
278
|
+
log.info('Get public key from Extension');
|
|
279
|
+
const publicKey = await this.getPublicKey();
|
|
280
|
+
// Request challenge from backend
|
|
281
|
+
log.info('Request challenge from backend');
|
|
282
|
+
const { challenge } = await this.requestChallenge(publicKey, 'register');
|
|
283
|
+
// Pass challenge to Extension for signing
|
|
284
|
+
log.info('Sign challenge via Extension');
|
|
285
|
+
const { signature } = await this.signChallenge(challenge);
|
|
286
|
+
// Send registration request to backend
|
|
287
|
+
log.info('Send registration request to backend');
|
|
288
|
+
const result = await this.httpPost('/api/v1/seedkey/register', {
|
|
289
|
+
publicKey,
|
|
290
|
+
challenge,
|
|
291
|
+
signature,
|
|
292
|
+
metadata: {
|
|
293
|
+
deviceName: opts?.metadata?.deviceName || this.getDeviceName(),
|
|
294
|
+
sdkVersion: SDK_VERSION
|
|
295
|
+
}
|
|
296
|
+
});
|
|
297
|
+
log.info('Registration successful', { userId: result.user.id });
|
|
298
|
+
log.groupEnd();
|
|
299
|
+
return {
|
|
300
|
+
...result,
|
|
301
|
+
action: 'register'
|
|
302
|
+
};
|
|
303
|
+
}
|
|
304
|
+
catch (error) {
|
|
305
|
+
log.error('Registration error', error);
|
|
306
|
+
log.groupEnd();
|
|
307
|
+
throw error;
|
|
308
|
+
}
|
|
309
|
+
}
|
|
310
|
+
/**
|
|
311
|
+
* Authenticate an existing account
|
|
312
|
+
*
|
|
313
|
+
* Flow:
|
|
314
|
+
* 1. SDK → Extension: getPublicKey()
|
|
315
|
+
* 2. SDK → Backend: POST /challenge {publicKey, action: 'authenticate'}
|
|
316
|
+
* 3. SDK → Extension: signChallenge()
|
|
317
|
+
* 4. SDK → Backend: POST /verify
|
|
318
|
+
*/
|
|
319
|
+
async authenticate() {
|
|
320
|
+
log.group('User authentication');
|
|
321
|
+
try {
|
|
322
|
+
// Get public key from Extension
|
|
323
|
+
log.info('Get public key from Extension');
|
|
324
|
+
const publicKey = await this.getPublicKey();
|
|
325
|
+
// Request challenge from backend
|
|
326
|
+
log.info('Request challenge from backend');
|
|
327
|
+
const { challenge, challengeId } = await this.requestChallenge(publicKey, 'authenticate');
|
|
328
|
+
// Pass challenge to Extension for signing
|
|
329
|
+
log.info('Sign challenge via Extension');
|
|
330
|
+
const { signature } = await this.signChallenge(challenge);
|
|
331
|
+
// Send verification request to backend
|
|
332
|
+
log.info('Send verification request to backend');
|
|
333
|
+
const result = await this.httpPost('/api/v1/seedkey/verify', {
|
|
334
|
+
challengeId,
|
|
335
|
+
challenge,
|
|
336
|
+
signature,
|
|
337
|
+
publicKey
|
|
338
|
+
});
|
|
339
|
+
log.info('Authentication successful', { userId: result.user.id });
|
|
340
|
+
log.groupEnd();
|
|
341
|
+
return {
|
|
342
|
+
...result,
|
|
343
|
+
action: 'login'
|
|
344
|
+
};
|
|
345
|
+
}
|
|
346
|
+
catch (error) {
|
|
347
|
+
log.error('Authentication error', error);
|
|
348
|
+
log.groupEnd();
|
|
349
|
+
throw error;
|
|
350
|
+
}
|
|
351
|
+
}
|
|
352
|
+
/**
|
|
353
|
+
* Smart authentication: register if user doesn't exist, authenticate if user exists
|
|
354
|
+
*/
|
|
355
|
+
async auth(opts) {
|
|
356
|
+
log.info('Smart authentication (auth): try login; if user not found, register');
|
|
357
|
+
try {
|
|
358
|
+
return await this.authenticate();
|
|
359
|
+
}
|
|
360
|
+
catch (error) {
|
|
361
|
+
if (error instanceof SeedKeyError && error.code === ERROR_CODES.USER_NOT_FOUND) {
|
|
362
|
+
log.info('User not found, switching to registration');
|
|
363
|
+
return await this.register(opts);
|
|
364
|
+
}
|
|
365
|
+
throw error;
|
|
366
|
+
}
|
|
367
|
+
}
|
|
368
|
+
// ============================================================================
|
|
369
|
+
// HTTP API Methods - Token management
|
|
370
|
+
// ============================================================================
|
|
371
|
+
/**
|
|
372
|
+
* Get user information
|
|
373
|
+
* → Backend: GET /api/v1/seedkey/user
|
|
374
|
+
*/
|
|
375
|
+
async getUser(accessToken) {
|
|
376
|
+
log.debug('Requesting user information...');
|
|
377
|
+
const response = await this.httpGet('/api/v1/seedkey/user', {
|
|
378
|
+
'Authorization': `Bearer ${accessToken}`
|
|
379
|
+
});
|
|
380
|
+
log.info('User information received', { userId: response.user.id });
|
|
381
|
+
return response.user;
|
|
382
|
+
}
|
|
383
|
+
/**
|
|
384
|
+
* Logout (invalidate token)
|
|
385
|
+
* → Backend: POST /api/v1/seedkey/logout
|
|
386
|
+
*/
|
|
387
|
+
async logout(accessToken) {
|
|
388
|
+
log.debug('Logging out...');
|
|
389
|
+
await this.httpPost('/api/v1/seedkey/logout', {}, {
|
|
390
|
+
'Authorization': `Bearer ${accessToken}`
|
|
391
|
+
});
|
|
392
|
+
log.info('Logged out successfully');
|
|
393
|
+
}
|
|
394
|
+
/**
|
|
395
|
+
* Refresh token
|
|
396
|
+
* → Backend: POST /api/v1/seedkey/refresh
|
|
397
|
+
*/
|
|
398
|
+
async refreshToken(refreshToken) {
|
|
399
|
+
log.debug('Refreshing token...');
|
|
400
|
+
const result = await this.httpPost('/api/v1/seedkey/refresh', {
|
|
401
|
+
refreshToken
|
|
402
|
+
});
|
|
403
|
+
log.info('Token refreshed', { expiresIn: result.expiresIn });
|
|
404
|
+
return result;
|
|
405
|
+
}
|
|
406
|
+
/**
|
|
407
|
+
* Request challenge from backend
|
|
408
|
+
*
|
|
409
|
+
* Use this method for custom authentication implementation.
|
|
410
|
+
*
|
|
411
|
+
* @param publicKey - Public key from getPublicKey()
|
|
412
|
+
* @param action - Action: 'register' or 'authenticate'
|
|
413
|
+
* @returns Challenge and its ID
|
|
414
|
+
*
|
|
415
|
+
* @example
|
|
416
|
+
* ```ts
|
|
417
|
+
* // Custom authentication
|
|
418
|
+
* const publicKey = await sdk.getPublicKey();
|
|
419
|
+
* const { challenge, challengeId } = await sdk.requestChallenge(publicKey, 'authenticate');
|
|
420
|
+
* const { signature } = await sdk.signChallenge(challenge);
|
|
421
|
+
* // Send to your backend: { challengeId, signature, publicKey }
|
|
422
|
+
* ```
|
|
423
|
+
*/
|
|
424
|
+
async requestChallenge(publicKey, action) {
|
|
425
|
+
log.debug('POST /api/v1/seedkey/challenge', { action });
|
|
426
|
+
return await this.httpPost('/api/v1/seedkey/challenge', {
|
|
427
|
+
publicKey,
|
|
428
|
+
action
|
|
429
|
+
});
|
|
430
|
+
}
|
|
431
|
+
// ============================================================================
|
|
432
|
+
// HTTP Methods
|
|
433
|
+
// ============================================================================
|
|
434
|
+
async httpGet(path, headers = {}) {
|
|
435
|
+
const url = `${this.backendUrl}${path}`;
|
|
436
|
+
log.debug(`GET ${path}`);
|
|
437
|
+
try {
|
|
438
|
+
const response = await fetch(url, {
|
|
439
|
+
method: 'GET',
|
|
440
|
+
headers: {
|
|
441
|
+
'Content-Type': 'application/json',
|
|
442
|
+
...headers
|
|
443
|
+
}
|
|
444
|
+
});
|
|
445
|
+
const data = await response.json();
|
|
446
|
+
if (!response.ok) {
|
|
447
|
+
const error = new SeedKeyError(data.error || ERROR_CODES.SERVER_ERROR, data.message || 'Server error', data.hint);
|
|
448
|
+
log.error(`HTTP Error ${response.status}`, { code: error.code, message: error.message });
|
|
449
|
+
throw error;
|
|
450
|
+
}
|
|
451
|
+
log.debug(`GET ${path} succeeded`, { status: response.status });
|
|
452
|
+
return data;
|
|
453
|
+
}
|
|
454
|
+
catch (error) {
|
|
455
|
+
if (error instanceof SeedKeyError) {
|
|
456
|
+
throw error;
|
|
457
|
+
}
|
|
458
|
+
log.error(`Network error: ${path}`, error);
|
|
459
|
+
throw new SeedKeyError(ERROR_CODES.NETWORK_ERROR, `Network error: ${error instanceof Error ? error.message : 'Unknown error'}`);
|
|
460
|
+
}
|
|
461
|
+
}
|
|
462
|
+
async httpPost(path, body, headers = {}) {
|
|
463
|
+
const url = `${this.backendUrl}${path}`;
|
|
464
|
+
log.debug(`POST ${path}`);
|
|
465
|
+
try {
|
|
466
|
+
const response = await fetch(url, {
|
|
467
|
+
method: 'POST',
|
|
468
|
+
headers: {
|
|
469
|
+
'Content-Type': 'application/json',
|
|
470
|
+
...headers
|
|
471
|
+
},
|
|
472
|
+
body: JSON.stringify(body)
|
|
473
|
+
});
|
|
474
|
+
const data = await response.json();
|
|
475
|
+
if (!response.ok) {
|
|
476
|
+
const error = new SeedKeyError(data.error || ERROR_CODES.SERVER_ERROR, data.message || 'Server error', data.hint);
|
|
477
|
+
log.error(`HTTP Error ${response.status}`, { code: error.code, message: error.message });
|
|
478
|
+
throw error;
|
|
479
|
+
}
|
|
480
|
+
log.debug(`POST ${path} succeeded`, { status: response.status });
|
|
481
|
+
return data;
|
|
482
|
+
}
|
|
483
|
+
catch (error) {
|
|
484
|
+
if (error instanceof SeedKeyError) {
|
|
485
|
+
throw error;
|
|
486
|
+
}
|
|
487
|
+
log.error(`Network error: ${path}`, error);
|
|
488
|
+
throw new SeedKeyError(ERROR_CODES.NETWORK_ERROR, `Network error: ${error instanceof Error ? error.message : 'Unknown error'}`);
|
|
489
|
+
}
|
|
490
|
+
}
|
|
491
|
+
async sendToExtension(action, payload, customTimeout) {
|
|
492
|
+
const requestId = this.generateRequestId();
|
|
493
|
+
const timeout = customTimeout || this.timeout;
|
|
494
|
+
const request = {
|
|
495
|
+
type: 'SEEDKEY_REQUEST',
|
|
496
|
+
version: SDK_VERSION,
|
|
497
|
+
action,
|
|
498
|
+
requestId,
|
|
499
|
+
origin: window.location.origin,
|
|
500
|
+
payload,
|
|
501
|
+
};
|
|
502
|
+
log.debug('→ Sending request to extension', { action, requestId, timeout, version: SDK_VERSION });
|
|
503
|
+
return new Promise((resolve, reject) => {
|
|
504
|
+
// Set timeout
|
|
505
|
+
const timeoutId = setTimeout(() => {
|
|
506
|
+
this.pendingRequests.delete(requestId);
|
|
507
|
+
log.error('Request timed out', { action, requestId, timeout });
|
|
508
|
+
reject(new ExtensionNotFoundError('Request timed out. Make sure SeedKey extension is installed.'));
|
|
509
|
+
}, timeout);
|
|
510
|
+
// Store pending request
|
|
511
|
+
this.pendingRequests.set(requestId, {
|
|
512
|
+
resolve,
|
|
513
|
+
reject,
|
|
514
|
+
timeoutId,
|
|
515
|
+
});
|
|
516
|
+
// Dispatch via CustomEvent (visible to content script isolated world)
|
|
517
|
+
const event = new CustomEvent(REQUEST_EVENT, {
|
|
518
|
+
detail: request,
|
|
519
|
+
bubbles: true,
|
|
520
|
+
});
|
|
521
|
+
document.dispatchEvent(event);
|
|
522
|
+
});
|
|
523
|
+
}
|
|
524
|
+
generateRequestId() {
|
|
525
|
+
return `req_${Date.now()}_${Math.random().toString(36).substring(2, 11)}`;
|
|
526
|
+
}
|
|
527
|
+
getDeviceName() {
|
|
528
|
+
const ua = navigator.userAgent;
|
|
529
|
+
const browser = ua.includes('Chrome') ? 'Chrome' :
|
|
530
|
+
ua.includes('Firefox') ? 'Firefox' :
|
|
531
|
+
ua.includes('Safari') ? 'Safari' : 'Browser';
|
|
532
|
+
const os = ua.includes('Windows') ? 'Windows' :
|
|
533
|
+
ua.includes('Mac') ? 'macOS' :
|
|
534
|
+
ua.includes('Linux') ? 'Linux' : 'Unknown';
|
|
535
|
+
return `${browser} on ${os}`;
|
|
536
|
+
}
|
|
537
|
+
}
|
|
538
|
+
// ============================================================================
|
|
539
|
+
// Singleton Instance
|
|
540
|
+
// ============================================================================
|
|
541
|
+
let defaultInstance = null;
|
|
542
|
+
/**
|
|
543
|
+
* Get or create singleton SDK instance
|
|
544
|
+
*/
|
|
545
|
+
export function getSeedKey(options) {
|
|
546
|
+
if (!defaultInstance && options) {
|
|
547
|
+
defaultInstance = new SeedKey(options);
|
|
548
|
+
}
|
|
549
|
+
if (!defaultInstance) {
|
|
550
|
+
throw new Error('SeedKey SDK not initialized. Call getSeedKey with options first.');
|
|
551
|
+
}
|
|
552
|
+
return defaultInstance;
|
|
553
|
+
}
|
|
554
|
+
/**
|
|
555
|
+
* Reset singleton instance
|
|
556
|
+
*/
|
|
557
|
+
export function resetSeedKey() {
|
|
558
|
+
if (defaultInstance) {
|
|
559
|
+
defaultInstance.destroy();
|
|
560
|
+
defaultInstance = null;
|
|
561
|
+
}
|
|
562
|
+
}
|
|
563
|
+
// ============================================================================
|
|
564
|
+
// Default Export
|
|
565
|
+
// ============================================================================
|
|
566
|
+
export default SeedKey;
|
|
567
|
+
//# sourceMappingURL=seedkey.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"seedkey.js","sourceRoot":"","sources":["../src/seedkey.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,42 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Local token storage
|
|
3
|
+
*/
|
|
4
|
+
import { TokenInfo } from './types';
|
|
5
|
+
/**
|
|
6
|
+
* Save tokens to localStorage
|
|
7
|
+
*/
|
|
8
|
+
export declare function saveTokens(tokens: TokenInfo, userId?: string): void;
|
|
9
|
+
/**
|
|
10
|
+
* Get access token
|
|
11
|
+
*/
|
|
12
|
+
export declare function getAccessToken(): string | null;
|
|
13
|
+
/**
|
|
14
|
+
* Get refresh token
|
|
15
|
+
*/
|
|
16
|
+
export declare function getRefreshToken(): string | null;
|
|
17
|
+
/**
|
|
18
|
+
* Get user ID
|
|
19
|
+
*/
|
|
20
|
+
export declare function getUserId(): string | null;
|
|
21
|
+
/**
|
|
22
|
+
* Check whether token is expired
|
|
23
|
+
*/
|
|
24
|
+
export declare function isTokenExpired(): boolean;
|
|
25
|
+
/**
|
|
26
|
+
* Check whether token exists
|
|
27
|
+
*/
|
|
28
|
+
export declare function hasToken(): boolean;
|
|
29
|
+
/**
|
|
30
|
+
* Clear all tokens
|
|
31
|
+
*/
|
|
32
|
+
export declare function clearTokens(): void;
|
|
33
|
+
/**
|
|
34
|
+
* Get full session data
|
|
35
|
+
*/
|
|
36
|
+
export declare function getSession(): {
|
|
37
|
+
accessToken: string | null;
|
|
38
|
+
refreshToken: string | null;
|
|
39
|
+
userId: string | null;
|
|
40
|
+
isExpired: boolean;
|
|
41
|
+
};
|
|
42
|
+
//# sourceMappingURL=storage.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"storage.d.ts","sourceRoot":"","sources":["../src/storage.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,EAAE,SAAS,EAAE,MAAM,SAAS,CAAC;AAUpC;;GAEG;AACH,wBAAgB,UAAU,CAAC,MAAM,EAAE,SAAS,EAAE,MAAM,CAAC,EAAE,MAAM,GAAG,IAAI,CAmBnE;AAED;;GAEG;AACH,wBAAgB,cAAc,IAAI,MAAM,GAAG,IAAI,CAI9C;AAED;;GAEG;AACH,wBAAgB,eAAe,IAAI,MAAM,GAAG,IAAI,CAE/C;AAED;;GAEG;AACH,wBAAgB,SAAS,IAAI,MAAM,GAAG,IAAI,CAEzC;AAED;;GAEG;AACH,wBAAgB,cAAc,IAAI,OAAO,CAmBxC;AAED;;GAEG;AACH,wBAAgB,QAAQ,IAAI,OAAO,CAElC;AAED;;GAEG;AACH,wBAAgB,WAAW,IAAI,IAAI,CAMlC;AAED;;GAEG;AACH,wBAAgB,UAAU,IAAI;IAC5B,WAAW,EAAE,MAAM,GAAG,IAAI,CAAC;IAC3B,YAAY,EAAE,MAAM,GAAG,IAAI,CAAC;IAC5B,MAAM,EAAE,MAAM,GAAG,IAAI,CAAC;IACtB,SAAS,EAAE,OAAO,CAAC;CACpB,CAgBA"}
|