@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.
@@ -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"}