@pelican-identity/auth-core 1.2.41 → 1.2.43
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/engine/engine.d.ts.map +1 -1
- package/dist/engine/engine.js +33 -14
- package/dist/engine/engine.js.map +1 -1
- package/dist/index.d.mts +3 -1
- package/dist/index.d.ts +3 -1
- package/dist/index.js +33 -13
- package/dist/index.js.map +1 -1
- package/dist/index.mjs +33 -13
- package/dist/index.mjs.map +1 -1
- package/package.json +1 -1
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"engine.d.ts","sourceRoot":"","sources":["../../src/engine/engine.ts"],"names":[],"mappings":"AAEA,OAAO,EACL,iBAAiB,EACjB,mBAAmB,EAGpB,MAAM,gBAAgB,CAAC;
|
|
1
|
+
{"version":3,"file":"engine.d.ts","sourceRoot":"","sources":["../../src/engine/engine.ts"],"names":[],"mappings":"AAEA,OAAO,EACL,iBAAiB,EACjB,mBAAmB,EAGpB,MAAM,gBAAgB,CAAC;AAgBxB,KAAK,QAAQ,CAAC,CAAC,IAAI,CAAC,OAAO,EAAE,CAAC,KAAK,IAAI,CAAC;AAQxC,qBAAa,qBAAqB;IAChC,OAAO,CAAC,QAAQ,CAAC,MAAM,CAAuB;IAC9C,OAAO,CAAC,QAAQ,CAAC,YAAY,CAAsB;IAEnD,OAAO,CAAC,SAAS,CAAC,CAAY;IAC9B,OAAO,CAAC,SAAS,CAAM;IACvB,OAAO,CAAC,UAAU,CAAuB;IAEzC,OAAO,CAAC,iBAAiB,CAAC,CAAa;IACvC,OAAO,CAAC,kBAAkB,CAAC,CAAS;IACpC,OAAO,CAAC,YAAY,CAAQ;IAC5B,OAAO,CAAC,WAAW,CAAuB;IAE1C,OAAO,CAAC,SAAS,CAEV;IAEP,OAAO,CAAC,QAAQ,CAAC,MAAM,CAA8B;gBAEzC,MAAM,EAAE,iBAAiB;IAgBrC,EAAE,CAAC,CAAC,SAAS,MAAM,mBAAmB,EACpC,KAAK,EAAE,CAAC,EACR,EAAE,EAAE,QAAQ,CAAC,mBAAmB,CAAC,CAAC,CAAC,CAAC;IAOhC,KAAK;IA2CX,IAAI;IAIJ,WAAW;IA6HX,OAAO;IAQP,YAAY;IAQZ,kBAAkB;IAOlB,OAAO,CAAC,kBAAkB;YAeZ,kBAAkB;IAuBhC,OAAO,CAAC,sBAAsB;IA4B9B,OAAO,CAAC,iBAAiB;YAqCX,iBAAiB;IAaxB,YAAY;IA8BnB,OAAO,CAAC,gBAAgB;YAOV,YAAY;YA8DZ,UAAU;YAkBV,YAAY;IAcnB,wBAAwB;IAkB/B,OAAO,CAAC,wBAAwB;YASlB,aAAa;IAkB3B,OAAO,CAAC,SAAS;IA6BjB,OAAO,CAAC,mBAAmB;IAc3B,OAAO,CAAC,YAAY;IAKpB,OAAO,CAAC,IAAI;IAOZ,OAAO,CAAC,IAAI;CAIb"}
|
package/dist/engine/engine.js
CHANGED
|
@@ -3,7 +3,7 @@ import QRCode from "qrcode";
|
|
|
3
3
|
import { storeAuthSession, getAuthSession, clearAuthSession, } from "../utilities/storage";
|
|
4
4
|
import { StateMachine } from "../utilities/stateMachine";
|
|
5
5
|
import { Transport } from "../utilities/transport";
|
|
6
|
-
import { BASEURL } from "../constants";
|
|
6
|
+
import { APPLE_APP_STORE_URL, BASEURL, FALLBACK_URL, PLAY_STORE_URL, } from "../constants";
|
|
7
7
|
export class PelicanAuthentication {
|
|
8
8
|
constructor(config) {
|
|
9
9
|
this.crypto = new CryptoService();
|
|
@@ -11,6 +11,7 @@ export class PelicanAuthentication {
|
|
|
11
11
|
this.sessionId = "";
|
|
12
12
|
this.sessionKey = null;
|
|
13
13
|
this.useWebSocket = true;
|
|
14
|
+
this.deeplinkUrl = null;
|
|
14
15
|
this.listeners = {};
|
|
15
16
|
if (!config.publicKey)
|
|
16
17
|
throw new Error("Missing publicKey");
|
|
@@ -257,10 +258,32 @@ export class PelicanAuthentication {
|
|
|
257
258
|
if (this.sessionKey) {
|
|
258
259
|
storeAuthSession(this.sessionId, this.sessionKey, 10 * 60000);
|
|
259
260
|
}
|
|
260
|
-
this.attachVisibilityRecovery();
|
|
261
261
|
await this.emitDeepLink(deeplinkUrl);
|
|
262
|
+
this.deeplinkUrl = deeplinkUrl;
|
|
262
263
|
this.stateMachine.transition("awaiting-pair");
|
|
263
264
|
}
|
|
265
|
+
openDeepLink() {
|
|
266
|
+
if (!this.deeplinkUrl) {
|
|
267
|
+
this.fail(new Error("Deep link not found"));
|
|
268
|
+
return;
|
|
269
|
+
}
|
|
270
|
+
this.attachVisibilityRecovery();
|
|
271
|
+
const userAgent = navigator.userAgent;
|
|
272
|
+
let fallbackUrl = FALLBACK_URL;
|
|
273
|
+
if (/iPad|iPhone|iPod/.test(userAgent)) {
|
|
274
|
+
fallbackUrl = APPLE_APP_STORE_URL;
|
|
275
|
+
}
|
|
276
|
+
else if (/android/i.test(userAgent)) {
|
|
277
|
+
fallbackUrl = PLAY_STORE_URL;
|
|
278
|
+
}
|
|
279
|
+
const start = Date.now();
|
|
280
|
+
window.location.href = this.deeplinkUrl;
|
|
281
|
+
setTimeout(() => {
|
|
282
|
+
if (Date.now() - start < 3500) {
|
|
283
|
+
window.location.href = fallbackUrl;
|
|
284
|
+
}
|
|
285
|
+
}, 3000);
|
|
286
|
+
}
|
|
264
287
|
clearBackupCheck() {
|
|
265
288
|
if (this.backupCheckTimeout) {
|
|
266
289
|
clearTimeout(this.backupCheckTimeout);
|
|
@@ -271,9 +294,7 @@ export class PelicanAuthentication {
|
|
|
271
294
|
const cached = getAuthSession();
|
|
272
295
|
if (!cached) {
|
|
273
296
|
this.fail(new Error("Authentication session not found"));
|
|
274
|
-
|
|
275
|
-
this.stateMachine.transition("idle");
|
|
276
|
-
}, 2000);
|
|
297
|
+
this.restartIfContinuous();
|
|
277
298
|
return;
|
|
278
299
|
}
|
|
279
300
|
this.stateMachine.transition("awaiting-auth");
|
|
@@ -281,9 +302,7 @@ export class PelicanAuthentication {
|
|
|
281
302
|
const res = await fetch(`${BASEURL}/session?session_id=${cached.sessionId}`);
|
|
282
303
|
if (!res.ok) {
|
|
283
304
|
this.fail(new Error("Session not found"));
|
|
284
|
-
|
|
285
|
-
this.stateMachine.transition("idle");
|
|
286
|
-
}, 2000);
|
|
305
|
+
this.restartIfContinuous();
|
|
287
306
|
return;
|
|
288
307
|
}
|
|
289
308
|
const data = await res.json();
|
|
@@ -294,9 +313,7 @@ export class PelicanAuthentication {
|
|
|
294
313
|
if (!decrypted) {
|
|
295
314
|
console.warn("Failed to decrypt session");
|
|
296
315
|
this.fail(new Error("Failed to decrypt session"));
|
|
297
|
-
|
|
298
|
-
this.stateMachine.transition("idle");
|
|
299
|
-
}, 2000);
|
|
316
|
+
this.restartIfContinuous();
|
|
300
317
|
return;
|
|
301
318
|
}
|
|
302
319
|
const result = JSON.parse(decrypted);
|
|
@@ -317,9 +334,7 @@ export class PelicanAuthentication {
|
|
|
317
334
|
catch (err) {
|
|
318
335
|
console.debug("Session check failed:", err);
|
|
319
336
|
this.fail(new Error("Session check failed"));
|
|
320
|
-
|
|
321
|
-
this.stateMachine.transition("idle");
|
|
322
|
-
}, 2000);
|
|
337
|
+
this.restartIfContinuous();
|
|
323
338
|
return;
|
|
324
339
|
}
|
|
325
340
|
}
|
|
@@ -337,11 +352,15 @@ export class PelicanAuthentication {
|
|
|
337
352
|
this.emit("deeplink", deeplink);
|
|
338
353
|
}
|
|
339
354
|
attachVisibilityRecovery() {
|
|
355
|
+
let fired = false;
|
|
340
356
|
this.visibilityHandler = async () => {
|
|
341
357
|
if (document.visibilityState !== "visible")
|
|
342
358
|
return;
|
|
343
359
|
if (this.useWebSocket)
|
|
344
360
|
return;
|
|
361
|
+
if (fired)
|
|
362
|
+
return;
|
|
363
|
+
fired = true;
|
|
345
364
|
await this.checkSession();
|
|
346
365
|
};
|
|
347
366
|
document.addEventListener("visibilitychange", this.visibilityHandler);
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"engine.js","sourceRoot":"","sources":["../../src/engine/engine.ts"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"engine.js","sourceRoot":"","sources":["../../src/engine/engine.ts"],"names":[],"mappings":"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"}
|
package/dist/index.d.mts
CHANGED
|
@@ -119,6 +119,7 @@ declare class PelicanAuthentication {
|
|
|
119
119
|
private visibilityHandler?;
|
|
120
120
|
private backupCheckTimeout?;
|
|
121
121
|
private useWebSocket;
|
|
122
|
+
private deeplinkUrl;
|
|
122
123
|
private listeners;
|
|
123
124
|
private readonly config;
|
|
124
125
|
constructor(config: PelicanAuthConfig);
|
|
@@ -134,11 +135,12 @@ declare class PelicanAuthentication {
|
|
|
134
135
|
private handleWebSocketMessage;
|
|
135
136
|
private handleAuthSuccess;
|
|
136
137
|
private startDeepLinkFlow;
|
|
138
|
+
openDeepLink(): void;
|
|
137
139
|
private clearBackupCheck;
|
|
138
140
|
private checkSession;
|
|
139
141
|
private emitQRCode;
|
|
140
142
|
private emitDeepLink;
|
|
141
|
-
|
|
143
|
+
attachVisibilityRecovery(): void;
|
|
142
144
|
private detachVisibilityRecovery;
|
|
143
145
|
private fetchRelayUrl;
|
|
144
146
|
private terminate;
|
package/dist/index.d.ts
CHANGED
|
@@ -119,6 +119,7 @@ declare class PelicanAuthentication {
|
|
|
119
119
|
private visibilityHandler?;
|
|
120
120
|
private backupCheckTimeout?;
|
|
121
121
|
private useWebSocket;
|
|
122
|
+
private deeplinkUrl;
|
|
122
123
|
private listeners;
|
|
123
124
|
private readonly config;
|
|
124
125
|
constructor(config: PelicanAuthConfig);
|
|
@@ -134,11 +135,12 @@ declare class PelicanAuthentication {
|
|
|
134
135
|
private handleWebSocketMessage;
|
|
135
136
|
private handleAuthSuccess;
|
|
136
137
|
private startDeepLinkFlow;
|
|
138
|
+
openDeepLink(): void;
|
|
137
139
|
private clearBackupCheck;
|
|
138
140
|
private checkSession;
|
|
139
141
|
private emitQRCode;
|
|
140
142
|
private emitDeepLink;
|
|
141
|
-
|
|
143
|
+
attachVisibilityRecovery(): void;
|
|
142
144
|
private detachVisibilityRecovery;
|
|
143
145
|
private fetchRelayUrl;
|
|
144
146
|
private terminate;
|
package/dist/index.js
CHANGED
|
@@ -318,6 +318,9 @@ var Transport = class {
|
|
|
318
318
|
|
|
319
319
|
// src/constants.ts
|
|
320
320
|
var BASEURL = "https://identityapi.pelicanidentity.com";
|
|
321
|
+
var APPLE_APP_STORE_URL = "https://apps.apple.com/us/app/pelican-vault/id6755097751";
|
|
322
|
+
var PLAY_STORE_URL = "https://play.google.com/store/apps/details?id=com.HeraculesDesignTechLtd.pelican";
|
|
323
|
+
var FALLBACK_URL = "https://pelicanidentity.com/pelican-vault";
|
|
321
324
|
|
|
322
325
|
// src/engine/engine.ts
|
|
323
326
|
var PelicanAuthentication = class {
|
|
@@ -327,6 +330,7 @@ var PelicanAuthentication = class {
|
|
|
327
330
|
this.sessionId = "";
|
|
328
331
|
this.sessionKey = null;
|
|
329
332
|
this.useWebSocket = true;
|
|
333
|
+
this.deeplinkUrl = null;
|
|
330
334
|
this.listeners = {};
|
|
331
335
|
if (!config.publicKey) throw new Error("Missing publicKey");
|
|
332
336
|
if (!config.projectId) throw new Error("Missing projectId");
|
|
@@ -578,10 +582,31 @@ var PelicanAuthentication = class {
|
|
|
578
582
|
if (this.sessionKey) {
|
|
579
583
|
storeAuthSession(this.sessionId, this.sessionKey, 10 * 6e4);
|
|
580
584
|
}
|
|
581
|
-
this.attachVisibilityRecovery();
|
|
582
585
|
await this.emitDeepLink(deeplinkUrl);
|
|
586
|
+
this.deeplinkUrl = deeplinkUrl;
|
|
583
587
|
this.stateMachine.transition("awaiting-pair");
|
|
584
588
|
}
|
|
589
|
+
openDeepLink() {
|
|
590
|
+
if (!this.deeplinkUrl) {
|
|
591
|
+
this.fail(new Error("Deep link not found"));
|
|
592
|
+
return;
|
|
593
|
+
}
|
|
594
|
+
this.attachVisibilityRecovery();
|
|
595
|
+
const userAgent = navigator.userAgent;
|
|
596
|
+
let fallbackUrl = FALLBACK_URL;
|
|
597
|
+
if (/iPad|iPhone|iPod/.test(userAgent)) {
|
|
598
|
+
fallbackUrl = APPLE_APP_STORE_URL;
|
|
599
|
+
} else if (/android/i.test(userAgent)) {
|
|
600
|
+
fallbackUrl = PLAY_STORE_URL;
|
|
601
|
+
}
|
|
602
|
+
const start = Date.now();
|
|
603
|
+
window.location.href = this.deeplinkUrl;
|
|
604
|
+
setTimeout(() => {
|
|
605
|
+
if (Date.now() - start < 3500) {
|
|
606
|
+
window.location.href = fallbackUrl;
|
|
607
|
+
}
|
|
608
|
+
}, 3e3);
|
|
609
|
+
}
|
|
585
610
|
clearBackupCheck() {
|
|
586
611
|
if (this.backupCheckTimeout) {
|
|
587
612
|
clearTimeout(this.backupCheckTimeout);
|
|
@@ -592,9 +617,7 @@ var PelicanAuthentication = class {
|
|
|
592
617
|
const cached = getAuthSession();
|
|
593
618
|
if (!cached) {
|
|
594
619
|
this.fail(new Error("Authentication session not found"));
|
|
595
|
-
|
|
596
|
-
this.stateMachine.transition("idle");
|
|
597
|
-
}, 2e3);
|
|
620
|
+
this.restartIfContinuous();
|
|
598
621
|
return;
|
|
599
622
|
}
|
|
600
623
|
this.stateMachine.transition("awaiting-auth");
|
|
@@ -604,9 +627,7 @@ var PelicanAuthentication = class {
|
|
|
604
627
|
);
|
|
605
628
|
if (!res.ok) {
|
|
606
629
|
this.fail(new Error("Session not found"));
|
|
607
|
-
|
|
608
|
-
this.stateMachine.transition("idle");
|
|
609
|
-
}, 2e3);
|
|
630
|
+
this.restartIfContinuous();
|
|
610
631
|
return;
|
|
611
632
|
}
|
|
612
633
|
const data = await res.json();
|
|
@@ -617,9 +638,7 @@ var PelicanAuthentication = class {
|
|
|
617
638
|
if (!decrypted) {
|
|
618
639
|
console.warn("Failed to decrypt session");
|
|
619
640
|
this.fail(new Error("Failed to decrypt session"));
|
|
620
|
-
|
|
621
|
-
this.stateMachine.transition("idle");
|
|
622
|
-
}, 2e3);
|
|
641
|
+
this.restartIfContinuous();
|
|
623
642
|
return;
|
|
624
643
|
}
|
|
625
644
|
const result = JSON.parse(decrypted);
|
|
@@ -638,9 +657,7 @@ var PelicanAuthentication = class {
|
|
|
638
657
|
} catch (err) {
|
|
639
658
|
console.debug("Session check failed:", err);
|
|
640
659
|
this.fail(new Error("Session check failed"));
|
|
641
|
-
|
|
642
|
-
this.stateMachine.transition("idle");
|
|
643
|
-
}, 2e3);
|
|
660
|
+
this.restartIfContinuous();
|
|
644
661
|
return;
|
|
645
662
|
}
|
|
646
663
|
}
|
|
@@ -668,9 +685,12 @@ var PelicanAuthentication = class {
|
|
|
668
685
|
}
|
|
669
686
|
/* -------------------- Visibility Recovery -------------------- */
|
|
670
687
|
attachVisibilityRecovery() {
|
|
688
|
+
let fired = false;
|
|
671
689
|
this.visibilityHandler = async () => {
|
|
672
690
|
if (document.visibilityState !== "visible") return;
|
|
673
691
|
if (this.useWebSocket) return;
|
|
692
|
+
if (fired) return;
|
|
693
|
+
fired = true;
|
|
674
694
|
await this.checkSession();
|
|
675
695
|
};
|
|
676
696
|
document.addEventListener("visibilitychange", this.visibilityHandler);
|
package/dist/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/utilities/crypto.ts","../src/utilities/storage.ts","../src/utilities/stateMachine.ts","../src/utilities/transport.ts","../src/constants.ts","../src/engine/engine.ts"],"names":["nacl","encodeBase64","decodeBase64","QRCode"],"mappings":"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","file":"index.js","sourcesContent":["import nacl from \"tweetnacl\";\nimport { decodeBase64, encodeBase64 } from \"tweetnacl-util\";\n\ninterface EncryptedMessage {\n cipher: string; // Base64 encoded\n nonce: string; // Base64 encoded\n}\n\nexport class CryptoService {\n generateSymmetricKey(): string {\n const key = nacl.randomBytes(32);\n return encodeBase64(key);\n }\n\n /**\n * Encrypt with symmetric key (secret-key encryption)\n * Use this when both parties share the same secret key\n * @param plaintext - Message to encrypt\n * @param keyString - Symmetric key (base64)\n * @returns Encrypted message with nonce\n */\n encryptSymmetric({\n plaintext,\n keyString,\n }: {\n plaintext: string;\n keyString: string;\n }): EncryptedMessage {\n const key = decodeBase64(keyString);\n const nonce = nacl.randomBytes(24);\n\n const messageBytes = new TextEncoder().encode(plaintext);\n\n const ciphertext = nacl.secretbox(messageBytes, nonce, key);\n\n return {\n cipher: encodeBase64(ciphertext),\n nonce: encodeBase64(nonce),\n };\n }\n\n /**\n * Decrypt with symmetric key\n * @param encrypted - Encrypted message with nonce\n * @param keyString - Symmetric key (base64)\n * @returns Decrypted plaintext\n */\n decryptSymmetric({\n encrypted,\n keyString,\n }: {\n encrypted: EncryptedMessage;\n keyString: string;\n }): string | null {\n try {\n const key = decodeBase64(keyString);\n const ciphertextBytes = decodeBase64(encrypted.cipher);\n const nonceBytes = decodeBase64(encrypted.nonce);\n\n const decrypted = nacl.secretbox.open(ciphertextBytes, nonceBytes, key);\n\n if (!decrypted) {\n throw new Error(\"Decryption failed - invalid key or corrupted data\");\n }\n\n const decoded = new TextDecoder().decode(decrypted);\n return decoded;\n } catch (error) {\n console.error(\"Decryption failed\", error);\n return null;\n }\n }\n}\n\nexport default CryptoService;\nexport type { EncryptedMessage };\n","// hybridStorage.ts\n/**\n * Hybrid storage: Try sessionStorage first, fallback to memory\n * Best of both worlds - survives page refresh but auto-cleans\n */\n\ninterface StorageOptions {\n ttlMs?: number;\n useSessionStorage?: boolean;\n}\n\nclass AuthStorage {\n private readonly prefix = \"pelican_auth_\";\n private readonly defaultTTL = 5 * 60 * 1000; // 5 minutes\n private memoryCache: Map<string, { value: any; expiresAt: number }> =\n new Map();\n\n /**\n * Store auth session with automatic cleanup\n */\n set(key: string, value: any, options: StorageOptions = {}): void {\n const { ttlMs = this.defaultTTL, useSessionStorage = true } = options;\n\n const expiresAt = Date.now() + ttlMs;\n const data = { value, expiresAt };\n\n // Try sessionStorage first\n if (useSessionStorage) {\n try {\n sessionStorage.setItem(`${this.prefix}${key}`, JSON.stringify(data));\n } catch (error) {\n console.warn(\"SessionStorage unavailable, using memory:\", error);\n this.setMemory(key, data);\n }\n } else {\n this.setMemory(key, data);\n }\n }\n\n /**\n * Get stored value if not expired\n */\n get(key: string): any | null {\n // Try sessionStorage first\n try {\n const stored = sessionStorage.getItem(`${this.prefix}${key}`);\n if (stored) {\n const data = JSON.parse(stored);\n\n // Check expiration\n if (Date.now() > data.expiresAt) {\n this.remove(key);\n return null;\n }\n\n return data.value;\n }\n } catch (error) {\n // Fallback to memory\n }\n\n // Try memory cache\n return this.getMemory(key);\n }\n\n /**\n * Remove specific key\n */\n remove(key: string): void {\n try {\n sessionStorage.removeItem(`${this.prefix}${key}`);\n } catch (error) {\n // Ignore\n }\n this.memoryCache.delete(key);\n }\n\n /**\n * Clear all auth data\n */\n clear(): void {\n // Clear sessionStorage\n try {\n Object.keys(sessionStorage).forEach((key) => {\n if (key.startsWith(this.prefix)) {\n sessionStorage.removeItem(key);\n }\n });\n } catch (error) {\n // Ignore\n }\n\n // Clear memory\n this.memoryCache.clear();\n }\n\n // ========================================\n // Memory cache helpers\n // ========================================\n\n private setMemory(\n key: string,\n data: { value: any; expiresAt: number }\n ): void {\n this.memoryCache.set(key, data);\n\n // Schedule cleanup\n const ttl = data.expiresAt - Date.now();\n setTimeout(() => {\n this.memoryCache.delete(key);\n }, ttl);\n }\n\n private getMemory(key: string): any | null {\n const data = this.memoryCache.get(key);\n if (!data) return null;\n\n if (Date.now() > data.expiresAt) {\n this.memoryCache.delete(key);\n return null;\n }\n\n return data.value;\n }\n}\n\n// Singleton instance\nconst storage = new AuthStorage();\n\n// ========================================\n// Convenience functions for auth flow\n// ========================================\n\nexport interface AuthSession {\n sessionId: string;\n sessionKey: string;\n}\n\nexport const storeAuthSession = (\n sessionId: string,\n sessionKey: string,\n ttlMs?: number\n): void => {\n storage.set(\"session\", { sessionId, sessionKey }, { ttlMs });\n};\n\nexport const getAuthSession = (): AuthSession | null => {\n return storage.get(\"session\");\n};\n\nexport const clearAuthSession = (): void => {\n storage.remove(\"session\");\n};\n\nexport const clearAllAuthData = (): void => {\n storage.clear();\n};\n\nexport default storage;\n","import type { PelicanAuthState } from \"../types/types\";\n\nexport class StateMachine {\n private state: PelicanAuthState = \"idle\";\n private listeners = new Set<(s: PelicanAuthState) => void>();\n\n get current() {\n return this.state;\n }\n\n transition(next: PelicanAuthState) {\n this.state = next;\n this.listeners.forEach((l) => l(next));\n }\n\n subscribe(fn: (s: PelicanAuthState) => void) {\n this.listeners.add(fn);\n return () => this.listeners.delete(fn);\n }\n}\n","import { ISocketMessage } from \"../types/types\";\n\ntype TransportHandlers = {\n onOpen?: () => void;\n onMessage?: (msg: ISocketMessage) => void;\n onError?: (err: Event) => void;\n onClose?: (ev: CloseEvent) => void;\n};\n\n/**\n * WebSocket Transport with automatic reconnection\n * Handles connection lifecycle and message passing\n */\nexport class Transport {\n private socket?: WebSocket;\n private handlers: TransportHandlers;\n private reconnectAttempts = 0;\n private maxReconnectAttempts = 3; // Reduced from 5 for mobile\n private isExplicitlyClosed = false;\n private url?: string;\n private reconnectTimeout?: number;\n private isReconnecting = false;\n\n constructor(handlers: TransportHandlers) {\n this.handlers = handlers;\n }\n\n /**\n * Establish WebSocket connection\n * @param url - WebSocket URL\n */\n connect(url: string) {\n this.url = url;\n this.isExplicitlyClosed = false;\n\n // Clean up any existing socket\n if (this.socket) {\n this.socket.onclose = null;\n this.socket.onerror = null;\n this.socket.onmessage = null;\n this.socket.onopen = null;\n\n if (\n this.socket.readyState === WebSocket.OPEN ||\n this.socket.readyState === WebSocket.CONNECTING\n ) {\n this.socket.close();\n }\n }\n\n this.socket = new WebSocket(url);\n\n this.socket.onopen = () => {\n this.reconnectAttempts = 0;\n this.isReconnecting = false;\n this.handlers.onOpen?.();\n };\n\n this.socket.onmessage = (e: MessageEvent) => {\n try {\n const data = JSON.parse(e.data);\n this.handlers.onMessage?.(data);\n } catch (err) {\n console.error(\"Failed to parse WebSocket message\", err);\n }\n };\n\n this.socket.onerror = (e: Event) => {\n // Only emit error if not reconnecting and not explicitly closed\n if (!this.isReconnecting && !this.isExplicitlyClosed) {\n this.handlers.onError?.(e);\n }\n };\n\n this.socket.onclose = (e: CloseEvent) => {\n // Clear any pending reconnect timeout\n if (this.reconnectTimeout) {\n clearTimeout(this.reconnectTimeout);\n this.reconnectTimeout = undefined;\n }\n\n // Emit close event\n if (!this.isReconnecting) {\n this.handlers.onClose?.(e);\n }\n\n // Only reconnect if:\n // 1. Not explicitly closed by user\n // 2. Not already reconnecting\n // 3. Haven't exceeded max attempts\n if (\n !this.isExplicitlyClosed &&\n !this.isReconnecting &&\n this.reconnectAttempts < this.maxReconnectAttempts\n ) {\n this.attemptReconnect();\n }\n };\n }\n\n /**\n * Attempt to reconnect with exponential backoff\n */\n private attemptReconnect() {\n if (this.reconnectAttempts >= this.maxReconnectAttempts) {\n console.warn(\"Max WebSocket reconnect attempts reached\");\n return;\n }\n\n this.isReconnecting = true;\n this.reconnectAttempts++;\n\n // Exponential backoff: 500ms, 1s, 2s\n const delay = Math.min(Math.pow(2, this.reconnectAttempts - 1) * 500, 2000);\n\n console.log(\n `Reconnecting WebSocket (attempt ${this.reconnectAttempts}/${this.maxReconnectAttempts}) in ${delay}ms...`\n );\n\n this.reconnectTimeout = window.setTimeout(() => {\n if (this.url && !this.isExplicitlyClosed) {\n this.connect(this.url);\n }\n }, delay);\n }\n\n /**\n * Send a message through the WebSocket\n * Queues message if connection is not open\n */\n send(payload: ISocketMessage) {\n if (this.socket?.readyState === WebSocket.OPEN) {\n try {\n this.socket.send(JSON.stringify(payload));\n } catch (err) {\n console.error(\"Failed to send WebSocket message:\", err);\n }\n } else {\n console.warn(\n \"WebSocket not open, message not sent:\",\n this.socket?.readyState\n );\n }\n }\n\n /**\n * Close the WebSocket connection\n * Prevents automatic reconnection\n */\n close() {\n this.isExplicitlyClosed = true;\n this.isReconnecting = false;\n\n // Clear reconnect timeout\n if (this.reconnectTimeout) {\n clearTimeout(this.reconnectTimeout);\n this.reconnectTimeout = undefined;\n }\n\n // Close socket\n if (this.socket) {\n // Remove event listeners to prevent callbacks\n this.socket.onclose = null;\n this.socket.onerror = null;\n this.socket.onmessage = null;\n this.socket.onopen = null;\n\n if (\n this.socket.readyState === WebSocket.OPEN ||\n this.socket.readyState === WebSocket.CONNECTING\n ) {\n this.socket.close();\n }\n\n this.socket = undefined;\n }\n }\n\n /**\n * Get current connection state\n */\n get readyState(): number | undefined {\n return this.socket?.readyState;\n }\n\n /**\n * Check if connection is open\n */\n get isOpen(): boolean {\n return this.socket?.readyState === WebSocket.OPEN;\n }\n}\n","export const BASEURL = \"https://identityapi.pelicanidentity.com\";\n","import CryptoService from \"../utilities/crypto\";\nimport QRCode from \"qrcode\";\nimport {\n PelicanAuthConfig,\n PelicanAuthEventMap,\n ISocketMessage,\n IdentityResult,\n} from \"../types/types\";\nimport {\n storeAuthSession,\n getAuthSession,\n clearAuthSession,\n} from \"../utilities/storage\";\nimport { StateMachine } from \"../utilities/stateMachine\";\nimport { Transport } from \"../utilities/transport\";\n\nimport { BASEURL } from \"../constants\";\n\ntype Listener<T> = (payload: T) => void;\n\n/**\n * PelicanAuth SDK\n *\n * Uses WebSocket for QR code flow (desktop)\n * Uses visibility recovery for deep link flow (mobile)\n */\nexport class PelicanAuthentication {\n private readonly crypto = new CryptoService();\n private readonly stateMachine = new StateMachine();\n\n private transport?: Transport;\n private sessionId = \"\";\n private sessionKey: string | null = null;\n\n private visibilityHandler?: () => void;\n private backupCheckTimeout?: number;\n private useWebSocket = true;\n\n private listeners: {\n [K in keyof PelicanAuthEventMap]?: Set<Listener<any>>;\n } = {};\n\n private readonly config: Required<PelicanAuthConfig>;\n\n constructor(config: PelicanAuthConfig) {\n if (!config.publicKey) throw new Error(\"Missing publicKey\");\n if (!config.projectId) throw new Error(\"Missing projectId\");\n if (!config.authType) throw new Error(\"Missing authType\");\n\n this.config = {\n continuousMode: false,\n forceQRCode: false,\n ...config,\n };\n\n this.stateMachine.subscribe((s) => this.emit(\"state\", s));\n }\n\n /* -------------------- Public API -------------------- */\n\n on<K extends keyof PelicanAuthEventMap>(\n event: K,\n cb: Listener<PelicanAuthEventMap[K]>,\n ) {\n this.listeners[event] ??= new Set();\n this.listeners[event]!.add(cb);\n return () => this.listeners[event]!.delete(cb);\n }\n\n async start() {\n if (\n this.config.authType !== \"id-verification\" &&\n this.config.authType !== \"signup\" &&\n this.config.authType !== \"login\"\n ) {\n this.fail(new Error(\"Invalid authType\"));\n return;\n }\n\n if (!this.config.projectId) {\n this.fail(new Error(\"Missing projectId\"));\n return;\n }\n\n if (!this.config.publicKey) {\n this.fail(new Error(\"Missing publicKey\"));\n return;\n }\n if (this.stateMachine.current !== \"idle\") return;\n\n this.resetSession();\n clearAuthSession();\n this.stateMachine.transition(\"initializing\");\n\n try {\n // Generate session credentials\n this.sessionKey = this.crypto.generateSymmetricKey();\n this.sessionId = crypto.randomUUID() + crypto.randomUUID();\n\n // Decide: WebSocket (QR) or Deep Link\n this.useWebSocket = this.shouldUseWebSocket();\n\n if (this.useWebSocket) {\n await this.startWebSocketFlow();\n } else {\n await this.startDeepLinkFlow();\n }\n } catch (err) {\n this.fail(err instanceof Error ? err : new Error(\"Start failed\"));\n }\n }\n\n stop() {\n this.terminate(false);\n }\n\n openWebAuth() {\n if (!this.sessionKey || !this.sessionId) {\n this.fail(\n new Error(\"No active session. Call start() before openWebAuth().\"),\n );\n return;\n }\n\n const openerOrigin = window.location.origin;\n\n const urlParams = new URLSearchParams({\n projectId: this.config.projectId,\n publicKey: this.config.publicKey,\n authType: this.config.authType,\n sessionId: this.sessionId,\n sessionKey: this.sessionKey,\n origin: openerOrigin,\n });\n\n const authUrl = `https://vault.pelicanidentity.com/auth?${urlParams.toString()}`;\n\n // Try popup first, fall back to new tab if blocked\n const authWindow =\n window.open(\n authUrl,\n \"pelican-auth\",\n \"width=480,height=640,left=400,top=100,resizable=no,scrollbars=no\",\n ) ?? window.open(authUrl, \"_blank\");\n\n if (!authWindow) {\n // Both popup and new tab blocked — nothing we can do\n this.fail(\n new Error(\n \"Unable to open authentication window. Please allow popups for this site and try again.\",\n ),\n );\n return;\n }\n\n this.detachVisibilityRecovery();\n this.transport?.close();\n this.transport = undefined;\n\n authWindow.focus();\n this.stateMachine.transition(\"awaiting-pair\");\n\n const cleanup = () => {\n window.removeEventListener(\"message\", handleMessage);\n clearInterval(closedPoller);\n };\n\n const handleMessage = (event: MessageEvent) => {\n // Only accept messages from the vault — prevents origin spoofing\n if (event.origin !== \"https://vault.pelicanidentity.com\") return;\n\n // Ensure message came from the specific window we opened\n // Works for both popup and new tab since window.opener is preserved either way\n if (event.source !== authWindow) return;\n\n const { type, payload } = event.data ?? {};\n\n if (type === \"pelican-auth-success\") {\n console.log(\"Web auth success\");\n cleanup();\n\n if (!payload?.cipher || !payload?.nonce) {\n this.fail(new Error(\"Invalid web auth payload\"));\n this.restartIfContinuous();\n return;\n }\n\n try {\n const decrypted = this.crypto.decryptSymmetric({\n encrypted: { cipher: payload.cipher, nonce: payload.nonce },\n keyString: this.sessionKey!,\n });\n\n if (!decrypted) {\n this.fail(new Error(\"Failed to decrypt web auth response\"));\n this.restartIfContinuous();\n return;\n }\n\n const result: IdentityResult = JSON.parse(decrypted);\n this.emit(\"success\", result);\n this.stateMachine.transition(\"authenticated\");\n this.restartIfContinuous();\n } catch {\n this.fail(new Error(\"Failed to decrypt web auth response\"));\n this.restartIfContinuous();\n }\n }\n\n if (type === \"pelican-auth-cancelled\") {\n cleanup();\n this.fail(new Error(\"Authentication cancelled\"));\n this.restartIfContinuous();\n }\n\n if (type === \"pelican-auth-error\") {\n cleanup();\n this.fail(new Error(payload?.message ?? \"Web auth failed\"));\n this.restartIfContinuous();\n }\n };\n\n window.addEventListener(\"message\", handleMessage);\n\n // Poll for manual close — works for both popup and new tab\n // New tab edge case: if user navigates away without closing, closed stays false\n // until they actually close the tab — acceptable tradeoff vs hard failing\n const closedPoller = setInterval(() => {\n if (!authWindow.closed) return;\n cleanup();\n if (\n ![\"authenticated\", \"confirmed\", \"error\"].includes(\n this.stateMachine.current,\n )\n ) {\n this.fail(new Error(\"Authentication window closed\"));\n this.restartIfContinuous();\n }\n }, 500);\n }\n\n destroy() {\n this.detachVisibilityRecovery();\n this.clearBackupCheck();\n this.transport?.close();\n this.transport = undefined;\n this.listeners = {};\n }\n\n useQrInstead() {\n this.useWebSocket = true;\n\n this.emit(\"deeplink\", \"\");\n this.stateMachine.transition(\"initializing\");\n this.startWebSocketFlow();\n }\n\n useDeepLinkInstead() {\n this.useWebSocket = false;\n this.stateMachine.transition(\"initializing\");\n this.startDeepLinkFlow();\n }\n /* -------------------- Flow Selection -------------------- */\n\n private shouldUseWebSocket(): boolean {\n const userAgent = navigator.userAgent;\n\n const isTablet = /(iPad|Android(?!.*Mobile))/i.test(userAgent);\n const isMobile =\n /Android|webOS|iPhone|iPod|BlackBerry|IEMobile|Opera Mini/i.test(\n userAgent,\n );\n\n const useWebSocket = isMobile && !isTablet;\n return this.config.forceQRCode || !useWebSocket;\n }\n\n /* -------------------- WebSocket Flow (QR Code) -------------------- */\n\n private async startWebSocketFlow() {\n const { relayUrl, deeplinkUrl } = await this.fetchRelayUrl();\n\n this.transport = new Transport({\n onOpen: () => {\n this.transport!.send({\n type: \"register\",\n sessionID: this.sessionId,\n ...this.config,\n });\n this.stateMachine.transition(\"awaiting-pair\");\n },\n onMessage: (msg: ISocketMessage) => this.handleWebSocketMessage(msg),\n onError: (err) => {\n console.error(\"WebSocket error:\", err);\n this.fail(new Error(\"WebSocket connection failed\"));\n },\n });\n\n this.transport.connect(relayUrl);\n await this.emitQRCode(deeplinkUrl);\n }\n\n private handleWebSocketMessage(msg: ISocketMessage) {\n switch (msg.type) {\n case \"paired\":\n this.stateMachine.transition(\"paired\");\n this.transport!.send({\n type: \"authenticate\",\n sessionID: this.sessionId,\n ...this.config,\n url: window.location.href,\n });\n return;\n\n case \"phone-auth-success\":\n this.handleAuthSuccess(msg);\n return;\n\n case \"phone-terminated\":\n this.fail(new Error(\"Authentication cancelled on device\"));\n this.restartIfContinuous();\n return;\n\n case \"confirmed\":\n this.terminate(true);\n this.restartIfContinuous();\n return;\n }\n }\n\n private handleAuthSuccess(msg: ISocketMessage) {\n if (!this.sessionKey || !msg.cipher || !msg.nonce) {\n this.fail(new Error(\"Invalid authentication payload\"));\n this.restartIfContinuous();\n return;\n }\n\n try {\n const decrypted = this.crypto.decryptSymmetric({\n encrypted: { cipher: msg.cipher, nonce: msg.nonce },\n keyString: this.sessionKey,\n });\n\n if (!decrypted) {\n this.fail(new Error(\"Invalid authentication data\"));\n this.restartIfContinuous();\n return;\n }\n\n const result: IdentityResult = JSON.parse(decrypted);\n\n this.emit(\"success\", result);\n this.stateMachine.transition(\"authenticated\");\n\n // Confirm receipt\n this.transport?.send({\n type: \"confirm\",\n sessionID: this.sessionId,\n });\n } catch {\n this.fail(new Error(\"Failed to decrypt authentication data\"));\n this.restartIfContinuous();\n }\n }\n\n /* -------------------- Deep Link Flow (Mobile) -------------------- */\n\n private async startDeepLinkFlow() {\n const { deeplinkUrl } = await this.fetchRelayUrl();\n\n // Store session for later recovery\n if (this.sessionKey) {\n storeAuthSession(this.sessionId, this.sessionKey, 10 * 60_000); // 10 min TTL\n }\n\n this.attachVisibilityRecovery();\n // Emit deep link\n await this.emitDeepLink(deeplinkUrl);\n\n // Move to awaiting state\n this.stateMachine.transition(\"awaiting-pair\");\n }\n\n private clearBackupCheck() {\n if (this.backupCheckTimeout) {\n clearTimeout(this.backupCheckTimeout);\n this.backupCheckTimeout = undefined;\n }\n }\n\n private async checkSession() {\n const cached = getAuthSession();\n if (!cached) {\n this.fail(new Error(\"Authentication session not found\"));\n setTimeout(() => {\n this.stateMachine.transition(\"idle\");\n }, 2000);\n return;\n }\n\n this.stateMachine.transition(\"awaiting-auth\");\n try {\n const res = await fetch(\n `${BASEURL}/session?session_id=${cached.sessionId}`,\n );\n\n // Session not ready yet\n if (!res.ok) {\n this.fail(new Error(\"Session not found\"));\n setTimeout(() => {\n this.stateMachine.transition(\"idle\");\n }, 2000);\n return;\n }\n\n const data = await res.json();\n const decrypted = this.crypto.decryptSymmetric({\n encrypted: { cipher: data.cipher, nonce: data.nonce },\n keyString: cached.sessionKey,\n });\n\n if (!decrypted) {\n console.warn(\"Failed to decrypt session\");\n this.fail(new Error(\"Failed to decrypt session\"));\n setTimeout(() => {\n this.stateMachine.transition(\"idle\");\n }, 2000);\n return;\n }\n\n const result: IdentityResult = JSON.parse(decrypted);\n\n // Success!\n this.clearBackupCheck();\n clearAuthSession();\n\n this.emit(\"success\", result);\n this.stateMachine.transition(\"authenticated\");\n\n // In continuous mode, restart after delay\n if (this.config.continuousMode) {\n setTimeout(() => {\n this.stateMachine.transition(\"idle\");\n this.start();\n }, 1500);\n } else {\n this.stateMachine.transition(\"idle\");\n }\n } catch (err) {\n console.debug(\"Session check failed:\", err);\n this.fail(new Error(\"Session check failed\"));\n setTimeout(() => {\n this.stateMachine.transition(\"idle\");\n }, 2000);\n return;\n }\n }\n\n /* -------------------- Entry Point Generation -------------------- */\n\n private async emitQRCode(deeplinkUrl: string) {\n const embeddedUrl = `${deeplinkUrl}?sessionID=${encodeURIComponent(\n this.sessionId,\n )}&sessionKey=${encodeURIComponent(\n this.sessionKey!,\n )}&publicKey=${encodeURIComponent(this.config.publicKey)}&authType=${\n this.config.authType\n }&projectId=${encodeURIComponent(this.config.projectId)}`;\n\n const qr = await QRCode.toDataURL(embeddedUrl, {\n type: \"image/png\",\n scale: 3,\n color: { light: \"#ffffff\", dark: \"#424242ff\" },\n });\n\n this.emit(\"qr\", qr);\n }\n\n private async emitDeepLink(deeplinkUrl: string) {\n const deeplink = `${deeplinkUrl}?sessionID=${encodeURIComponent(\n this.sessionId,\n )}&sessionKey=${encodeURIComponent(\n this.sessionKey!,\n )}&publicKey=${encodeURIComponent(this.config.publicKey)}&authType=${\n this.config.authType\n }&projectId=${encodeURIComponent(this.config.projectId)}`;\n\n this.emit(\"deeplink\", deeplink);\n }\n\n /* -------------------- Visibility Recovery -------------------- */\n\n private attachVisibilityRecovery() {\n this.visibilityHandler = async () => {\n if (document.visibilityState !== \"visible\") return;\n\n // Only check for deep link flow\n if (this.useWebSocket) return;\n\n // Check session when page becomes visible\n await this.checkSession();\n };\n\n document.addEventListener(\"visibilitychange\", this.visibilityHandler);\n }\n\n private detachVisibilityRecovery() {\n if (this.visibilityHandler) {\n document.removeEventListener(\"visibilitychange\", this.visibilityHandler);\n this.visibilityHandler = undefined;\n }\n }\n\n /* -------------------- Helpers -------------------- */\n\n private async fetchRelayUrl(): Promise<{\n deeplinkUrl: string;\n relayUrl: string;\n }> {\n const { publicKey, projectId, authType } = this.config;\n const res = await fetch(\n `${BASEURL}/relay?public_key=${publicKey}&auth_type=${authType}&project_id=${projectId}`,\n );\n\n if (!res.ok) {\n const error = await res.text();\n throw new Error(error);\n }\n\n const json = await res.json();\n return { deeplinkUrl: json.deeplink_url, relayUrl: json.relay_url };\n }\n\n private terminate(success: boolean) {\n // Clear backup check\n this.clearBackupCheck();\n\n // Close WebSocket if active\n if (this.transport) {\n if (!success) {\n this.transport.send({\n type: \"client-terminated\",\n sessionID: this.sessionId,\n projectId: this.config.projectId,\n publicKey: this.config.publicKey,\n authType: this.config.authType,\n });\n }\n this.transport.close();\n this.transport = undefined;\n }\n\n clearAuthSession();\n this.resetSession();\n\n if (!this.config.continuousMode) {\n this.detachVisibilityRecovery();\n }\n\n this.stateMachine.transition(success ? \"confirmed\" : \"idle\");\n }\n\n private restartIfContinuous() {\n if (this.config.continuousMode) {\n this.stateMachine.transition(\"idle\");\n this.clearBackupCheck();\n this.transport?.close();\n this.transport = undefined;\n setTimeout(() => {\n this.start();\n }, 150);\n } else {\n this.stateMachine.transition(\"idle\");\n }\n }\n\n private resetSession() {\n this.sessionId = \"\";\n this.sessionKey = null;\n }\n\n private emit<K extends keyof PelicanAuthEventMap>(\n event: K,\n payload: PelicanAuthEventMap[K],\n ) {\n this.listeners[event]?.forEach((cb) => cb(payload));\n }\n\n private fail(err: Error) {\n this.emit(\"error\", err);\n this.stateMachine.transition(\"error\");\n }\n}\n"]}
|
|
1
|
+
{"version":3,"sources":["../src/utilities/crypto.ts","../src/utilities/storage.ts","../src/utilities/stateMachine.ts","../src/utilities/transport.ts","../src/constants.ts","../src/engine/engine.ts"],"names":["nacl","encodeBase64","decodeBase64","QRCode"],"mappings":"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","file":"index.js","sourcesContent":["import nacl from \"tweetnacl\";\nimport { decodeBase64, encodeBase64 } from \"tweetnacl-util\";\n\ninterface EncryptedMessage {\n cipher: string; // Base64 encoded\n nonce: string; // Base64 encoded\n}\n\nexport class CryptoService {\n generateSymmetricKey(): string {\n const key = nacl.randomBytes(32);\n return encodeBase64(key);\n }\n\n /**\n * Encrypt with symmetric key (secret-key encryption)\n * Use this when both parties share the same secret key\n * @param plaintext - Message to encrypt\n * @param keyString - Symmetric key (base64)\n * @returns Encrypted message with nonce\n */\n encryptSymmetric({\n plaintext,\n keyString,\n }: {\n plaintext: string;\n keyString: string;\n }): EncryptedMessage {\n const key = decodeBase64(keyString);\n const nonce = nacl.randomBytes(24);\n\n const messageBytes = new TextEncoder().encode(plaintext);\n\n const ciphertext = nacl.secretbox(messageBytes, nonce, key);\n\n return {\n cipher: encodeBase64(ciphertext),\n nonce: encodeBase64(nonce),\n };\n }\n\n /**\n * Decrypt with symmetric key\n * @param encrypted - Encrypted message with nonce\n * @param keyString - Symmetric key (base64)\n * @returns Decrypted plaintext\n */\n decryptSymmetric({\n encrypted,\n keyString,\n }: {\n encrypted: EncryptedMessage;\n keyString: string;\n }): string | null {\n try {\n const key = decodeBase64(keyString);\n const ciphertextBytes = decodeBase64(encrypted.cipher);\n const nonceBytes = decodeBase64(encrypted.nonce);\n\n const decrypted = nacl.secretbox.open(ciphertextBytes, nonceBytes, key);\n\n if (!decrypted) {\n throw new Error(\"Decryption failed - invalid key or corrupted data\");\n }\n\n const decoded = new TextDecoder().decode(decrypted);\n return decoded;\n } catch (error) {\n console.error(\"Decryption failed\", error);\n return null;\n }\n }\n}\n\nexport default CryptoService;\nexport type { EncryptedMessage };\n","// hybridStorage.ts\n/**\n * Hybrid storage: Try sessionStorage first, fallback to memory\n * Best of both worlds - survives page refresh but auto-cleans\n */\n\ninterface StorageOptions {\n ttlMs?: number;\n useSessionStorage?: boolean;\n}\n\nclass AuthStorage {\n private readonly prefix = \"pelican_auth_\";\n private readonly defaultTTL = 5 * 60 * 1000; // 5 minutes\n private memoryCache: Map<string, { value: any; expiresAt: number }> =\n new Map();\n\n /**\n * Store auth session with automatic cleanup\n */\n set(key: string, value: any, options: StorageOptions = {}): void {\n const { ttlMs = this.defaultTTL, useSessionStorage = true } = options;\n\n const expiresAt = Date.now() + ttlMs;\n const data = { value, expiresAt };\n\n // Try sessionStorage first\n if (useSessionStorage) {\n try {\n sessionStorage.setItem(`${this.prefix}${key}`, JSON.stringify(data));\n } catch (error) {\n console.warn(\"SessionStorage unavailable, using memory:\", error);\n this.setMemory(key, data);\n }\n } else {\n this.setMemory(key, data);\n }\n }\n\n /**\n * Get stored value if not expired\n */\n get(key: string): any | null {\n // Try sessionStorage first\n try {\n const stored = sessionStorage.getItem(`${this.prefix}${key}`);\n if (stored) {\n const data = JSON.parse(stored);\n\n // Check expiration\n if (Date.now() > data.expiresAt) {\n this.remove(key);\n return null;\n }\n\n return data.value;\n }\n } catch (error) {\n // Fallback to memory\n }\n\n // Try memory cache\n return this.getMemory(key);\n }\n\n /**\n * Remove specific key\n */\n remove(key: string): void {\n try {\n sessionStorage.removeItem(`${this.prefix}${key}`);\n } catch (error) {\n // Ignore\n }\n this.memoryCache.delete(key);\n }\n\n /**\n * Clear all auth data\n */\n clear(): void {\n // Clear sessionStorage\n try {\n Object.keys(sessionStorage).forEach((key) => {\n if (key.startsWith(this.prefix)) {\n sessionStorage.removeItem(key);\n }\n });\n } catch (error) {\n // Ignore\n }\n\n // Clear memory\n this.memoryCache.clear();\n }\n\n // ========================================\n // Memory cache helpers\n // ========================================\n\n private setMemory(\n key: string,\n data: { value: any; expiresAt: number }\n ): void {\n this.memoryCache.set(key, data);\n\n // Schedule cleanup\n const ttl = data.expiresAt - Date.now();\n setTimeout(() => {\n this.memoryCache.delete(key);\n }, ttl);\n }\n\n private getMemory(key: string): any | null {\n const data = this.memoryCache.get(key);\n if (!data) return null;\n\n if (Date.now() > data.expiresAt) {\n this.memoryCache.delete(key);\n return null;\n }\n\n return data.value;\n }\n}\n\n// Singleton instance\nconst storage = new AuthStorage();\n\n// ========================================\n// Convenience functions for auth flow\n// ========================================\n\nexport interface AuthSession {\n sessionId: string;\n sessionKey: string;\n}\n\nexport const storeAuthSession = (\n sessionId: string,\n sessionKey: string,\n ttlMs?: number\n): void => {\n storage.set(\"session\", { sessionId, sessionKey }, { ttlMs });\n};\n\nexport const getAuthSession = (): AuthSession | null => {\n return storage.get(\"session\");\n};\n\nexport const clearAuthSession = (): void => {\n storage.remove(\"session\");\n};\n\nexport const clearAllAuthData = (): void => {\n storage.clear();\n};\n\nexport default storage;\n","import type { PelicanAuthState } from \"../types/types\";\n\nexport class StateMachine {\n private state: PelicanAuthState = \"idle\";\n private listeners = new Set<(s: PelicanAuthState) => void>();\n\n get current() {\n return this.state;\n }\n\n transition(next: PelicanAuthState) {\n this.state = next;\n this.listeners.forEach((l) => l(next));\n }\n\n subscribe(fn: (s: PelicanAuthState) => void) {\n this.listeners.add(fn);\n return () => this.listeners.delete(fn);\n }\n}\n","import { ISocketMessage } from \"../types/types\";\n\ntype TransportHandlers = {\n onOpen?: () => void;\n onMessage?: (msg: ISocketMessage) => void;\n onError?: (err: Event) => void;\n onClose?: (ev: CloseEvent) => void;\n};\n\n/**\n * WebSocket Transport with automatic reconnection\n * Handles connection lifecycle and message passing\n */\nexport class Transport {\n private socket?: WebSocket;\n private handlers: TransportHandlers;\n private reconnectAttempts = 0;\n private maxReconnectAttempts = 3; // Reduced from 5 for mobile\n private isExplicitlyClosed = false;\n private url?: string;\n private reconnectTimeout?: number;\n private isReconnecting = false;\n\n constructor(handlers: TransportHandlers) {\n this.handlers = handlers;\n }\n\n /**\n * Establish WebSocket connection\n * @param url - WebSocket URL\n */\n connect(url: string) {\n this.url = url;\n this.isExplicitlyClosed = false;\n\n // Clean up any existing socket\n if (this.socket) {\n this.socket.onclose = null;\n this.socket.onerror = null;\n this.socket.onmessage = null;\n this.socket.onopen = null;\n\n if (\n this.socket.readyState === WebSocket.OPEN ||\n this.socket.readyState === WebSocket.CONNECTING\n ) {\n this.socket.close();\n }\n }\n\n this.socket = new WebSocket(url);\n\n this.socket.onopen = () => {\n this.reconnectAttempts = 0;\n this.isReconnecting = false;\n this.handlers.onOpen?.();\n };\n\n this.socket.onmessage = (e: MessageEvent) => {\n try {\n const data = JSON.parse(e.data);\n this.handlers.onMessage?.(data);\n } catch (err) {\n console.error(\"Failed to parse WebSocket message\", err);\n }\n };\n\n this.socket.onerror = (e: Event) => {\n // Only emit error if not reconnecting and not explicitly closed\n if (!this.isReconnecting && !this.isExplicitlyClosed) {\n this.handlers.onError?.(e);\n }\n };\n\n this.socket.onclose = (e: CloseEvent) => {\n // Clear any pending reconnect timeout\n if (this.reconnectTimeout) {\n clearTimeout(this.reconnectTimeout);\n this.reconnectTimeout = undefined;\n }\n\n // Emit close event\n if (!this.isReconnecting) {\n this.handlers.onClose?.(e);\n }\n\n // Only reconnect if:\n // 1. Not explicitly closed by user\n // 2. Not already reconnecting\n // 3. Haven't exceeded max attempts\n if (\n !this.isExplicitlyClosed &&\n !this.isReconnecting &&\n this.reconnectAttempts < this.maxReconnectAttempts\n ) {\n this.attemptReconnect();\n }\n };\n }\n\n /**\n * Attempt to reconnect with exponential backoff\n */\n private attemptReconnect() {\n if (this.reconnectAttempts >= this.maxReconnectAttempts) {\n console.warn(\"Max WebSocket reconnect attempts reached\");\n return;\n }\n\n this.isReconnecting = true;\n this.reconnectAttempts++;\n\n // Exponential backoff: 500ms, 1s, 2s\n const delay = Math.min(Math.pow(2, this.reconnectAttempts - 1) * 500, 2000);\n\n console.log(\n `Reconnecting WebSocket (attempt ${this.reconnectAttempts}/${this.maxReconnectAttempts}) in ${delay}ms...`\n );\n\n this.reconnectTimeout = window.setTimeout(() => {\n if (this.url && !this.isExplicitlyClosed) {\n this.connect(this.url);\n }\n }, delay);\n }\n\n /**\n * Send a message through the WebSocket\n * Queues message if connection is not open\n */\n send(payload: ISocketMessage) {\n if (this.socket?.readyState === WebSocket.OPEN) {\n try {\n this.socket.send(JSON.stringify(payload));\n } catch (err) {\n console.error(\"Failed to send WebSocket message:\", err);\n }\n } else {\n console.warn(\n \"WebSocket not open, message not sent:\",\n this.socket?.readyState\n );\n }\n }\n\n /**\n * Close the WebSocket connection\n * Prevents automatic reconnection\n */\n close() {\n this.isExplicitlyClosed = true;\n this.isReconnecting = false;\n\n // Clear reconnect timeout\n if (this.reconnectTimeout) {\n clearTimeout(this.reconnectTimeout);\n this.reconnectTimeout = undefined;\n }\n\n // Close socket\n if (this.socket) {\n // Remove event listeners to prevent callbacks\n this.socket.onclose = null;\n this.socket.onerror = null;\n this.socket.onmessage = null;\n this.socket.onopen = null;\n\n if (\n this.socket.readyState === WebSocket.OPEN ||\n this.socket.readyState === WebSocket.CONNECTING\n ) {\n this.socket.close();\n }\n\n this.socket = undefined;\n }\n }\n\n /**\n * Get current connection state\n */\n get readyState(): number | undefined {\n return this.socket?.readyState;\n }\n\n /**\n * Check if connection is open\n */\n get isOpen(): boolean {\n return this.socket?.readyState === WebSocket.OPEN;\n }\n}\n","export const BASEURL = \"https://identityapi.pelicanidentity.com\";\nexport const APPLE_APP_STORE_URL =\n \"https://apps.apple.com/us/app/pelican-vault/id6755097751\";\nexport const PLAY_STORE_URL =\n \"https://play.google.com/store/apps/details?id=com.HeraculesDesignTechLtd.pelican\";\nexport const FALLBACK_URL = \"https://pelicanidentity.com/pelican-vault\";\n","import CryptoService from \"../utilities/crypto\";\nimport QRCode from \"qrcode\";\nimport {\n PelicanAuthConfig,\n PelicanAuthEventMap,\n ISocketMessage,\n IdentityResult,\n} from \"../types/types\";\nimport {\n storeAuthSession,\n getAuthSession,\n clearAuthSession,\n} from \"../utilities/storage\";\nimport { StateMachine } from \"../utilities/stateMachine\";\nimport { Transport } from \"../utilities/transport\";\n\nimport {\n APPLE_APP_STORE_URL,\n BASEURL,\n FALLBACK_URL,\n PLAY_STORE_URL,\n} from \"../constants\";\n\ntype Listener<T> = (payload: T) => void;\n\n/**\n * PelicanAuth SDK\n *\n * Uses WebSocket for QR code flow (desktop)\n * Uses visibility recovery for deep link flow (mobile)\n */\nexport class PelicanAuthentication {\n private readonly crypto = new CryptoService();\n private readonly stateMachine = new StateMachine();\n\n private transport?: Transport;\n private sessionId = \"\";\n private sessionKey: string | null = null;\n\n private visibilityHandler?: () => void;\n private backupCheckTimeout?: number;\n private useWebSocket = true;\n private deeplinkUrl: string | null = null;\n\n private listeners: {\n [K in keyof PelicanAuthEventMap]?: Set<Listener<any>>;\n } = {};\n\n private readonly config: Required<PelicanAuthConfig>;\n\n constructor(config: PelicanAuthConfig) {\n if (!config.publicKey) throw new Error(\"Missing publicKey\");\n if (!config.projectId) throw new Error(\"Missing projectId\");\n if (!config.authType) throw new Error(\"Missing authType\");\n\n this.config = {\n continuousMode: false,\n forceQRCode: false,\n ...config,\n };\n\n this.stateMachine.subscribe((s) => this.emit(\"state\", s));\n }\n\n /* -------------------- Public API -------------------- */\n\n on<K extends keyof PelicanAuthEventMap>(\n event: K,\n cb: Listener<PelicanAuthEventMap[K]>,\n ) {\n this.listeners[event] ??= new Set();\n this.listeners[event]!.add(cb);\n return () => this.listeners[event]!.delete(cb);\n }\n\n async start() {\n if (\n this.config.authType !== \"id-verification\" &&\n this.config.authType !== \"signup\" &&\n this.config.authType !== \"login\"\n ) {\n this.fail(new Error(\"Invalid authType\"));\n return;\n }\n\n if (!this.config.projectId) {\n this.fail(new Error(\"Missing projectId\"));\n return;\n }\n\n if (!this.config.publicKey) {\n this.fail(new Error(\"Missing publicKey\"));\n return;\n }\n if (this.stateMachine.current !== \"idle\") return;\n\n this.resetSession();\n clearAuthSession();\n this.stateMachine.transition(\"initializing\");\n\n try {\n // Generate session credentials\n this.sessionKey = this.crypto.generateSymmetricKey();\n this.sessionId = crypto.randomUUID() + crypto.randomUUID();\n\n // Decide: WebSocket (QR) or Deep Link\n this.useWebSocket = this.shouldUseWebSocket();\n\n if (this.useWebSocket) {\n await this.startWebSocketFlow();\n } else {\n await this.startDeepLinkFlow();\n }\n } catch (err) {\n this.fail(err instanceof Error ? err : new Error(\"Start failed\"));\n }\n }\n\n stop() {\n this.terminate(false);\n }\n\n openWebAuth() {\n if (!this.sessionKey || !this.sessionId) {\n this.fail(\n new Error(\"No active session. Call start() before openWebAuth().\"),\n );\n return;\n }\n\n const openerOrigin = window.location.origin;\n\n const urlParams = new URLSearchParams({\n projectId: this.config.projectId,\n publicKey: this.config.publicKey,\n authType: this.config.authType,\n sessionId: this.sessionId,\n sessionKey: this.sessionKey,\n origin: openerOrigin,\n });\n\n const authUrl = `https://vault.pelicanidentity.com/auth?${urlParams.toString()}`;\n\n // Try popup first, fall back to new tab if blocked\n const authWindow =\n window.open(\n authUrl,\n \"pelican-auth\",\n \"width=480,height=640,left=400,top=100,resizable=no,scrollbars=no\",\n ) ?? window.open(authUrl, \"_blank\");\n\n if (!authWindow) {\n // Both popup and new tab blocked — nothing we can do\n this.fail(\n new Error(\n \"Unable to open authentication window. Please allow popups for this site and try again.\",\n ),\n );\n return;\n }\n\n this.detachVisibilityRecovery();\n this.transport?.close();\n this.transport = undefined;\n\n authWindow.focus();\n this.stateMachine.transition(\"awaiting-pair\");\n\n const cleanup = () => {\n window.removeEventListener(\"message\", handleMessage);\n clearInterval(closedPoller);\n };\n\n const handleMessage = (event: MessageEvent) => {\n // Only accept messages from the vault — prevents origin spoofing\n if (event.origin !== \"https://vault.pelicanidentity.com\") return;\n\n // Ensure message came from the specific window we opened\n // Works for both popup and new tab since window.opener is preserved either way\n if (event.source !== authWindow) return;\n\n const { type, payload } = event.data ?? {};\n\n if (type === \"pelican-auth-success\") {\n console.log(\"Web auth success\");\n cleanup();\n\n if (!payload?.cipher || !payload?.nonce) {\n this.fail(new Error(\"Invalid web auth payload\"));\n this.restartIfContinuous();\n return;\n }\n\n try {\n const decrypted = this.crypto.decryptSymmetric({\n encrypted: { cipher: payload.cipher, nonce: payload.nonce },\n keyString: this.sessionKey!,\n });\n\n if (!decrypted) {\n this.fail(new Error(\"Failed to decrypt web auth response\"));\n this.restartIfContinuous();\n return;\n }\n\n const result: IdentityResult = JSON.parse(decrypted);\n this.emit(\"success\", result);\n this.stateMachine.transition(\"authenticated\");\n this.restartIfContinuous();\n } catch {\n this.fail(new Error(\"Failed to decrypt web auth response\"));\n this.restartIfContinuous();\n }\n }\n\n if (type === \"pelican-auth-cancelled\") {\n cleanup();\n this.fail(new Error(\"Authentication cancelled\"));\n this.restartIfContinuous();\n }\n\n if (type === \"pelican-auth-error\") {\n cleanup();\n this.fail(new Error(payload?.message ?? \"Web auth failed\"));\n this.restartIfContinuous();\n }\n };\n\n window.addEventListener(\"message\", handleMessage);\n\n // Poll for manual close — works for both popup and new tab\n // New tab edge case: if user navigates away without closing, closed stays false\n // until they actually close the tab — acceptable tradeoff vs hard failing\n const closedPoller = setInterval(() => {\n if (!authWindow.closed) return;\n cleanup();\n if (\n ![\"authenticated\", \"confirmed\", \"error\"].includes(\n this.stateMachine.current,\n )\n ) {\n this.fail(new Error(\"Authentication window closed\"));\n this.restartIfContinuous();\n }\n }, 500);\n }\n\n destroy() {\n this.detachVisibilityRecovery();\n this.clearBackupCheck();\n this.transport?.close();\n this.transport = undefined;\n this.listeners = {};\n }\n\n useQrInstead() {\n this.useWebSocket = true;\n\n this.emit(\"deeplink\", \"\");\n this.stateMachine.transition(\"initializing\");\n this.startWebSocketFlow();\n }\n\n useDeepLinkInstead() {\n this.useWebSocket = false;\n this.stateMachine.transition(\"initializing\");\n this.startDeepLinkFlow();\n }\n /* -------------------- Flow Selection -------------------- */\n\n private shouldUseWebSocket(): boolean {\n const userAgent = navigator.userAgent;\n\n const isTablet = /(iPad|Android(?!.*Mobile))/i.test(userAgent);\n const isMobile =\n /Android|webOS|iPhone|iPod|BlackBerry|IEMobile|Opera Mini/i.test(\n userAgent,\n );\n\n const useWebSocket = isMobile && !isTablet;\n return this.config.forceQRCode || !useWebSocket;\n }\n\n /* -------------------- WebSocket Flow (QR Code) -------------------- */\n\n private async startWebSocketFlow() {\n const { relayUrl, deeplinkUrl } = await this.fetchRelayUrl();\n\n this.transport = new Transport({\n onOpen: () => {\n this.transport!.send({\n type: \"register\",\n sessionID: this.sessionId,\n ...this.config,\n });\n this.stateMachine.transition(\"awaiting-pair\");\n },\n onMessage: (msg: ISocketMessage) => this.handleWebSocketMessage(msg),\n onError: (err) => {\n console.error(\"WebSocket error:\", err);\n this.fail(new Error(\"WebSocket connection failed\"));\n },\n });\n\n this.transport.connect(relayUrl);\n await this.emitQRCode(deeplinkUrl);\n }\n\n private handleWebSocketMessage(msg: ISocketMessage) {\n switch (msg.type) {\n case \"paired\":\n this.stateMachine.transition(\"paired\");\n this.transport!.send({\n type: \"authenticate\",\n sessionID: this.sessionId,\n ...this.config,\n url: window.location.href,\n });\n return;\n\n case \"phone-auth-success\":\n this.handleAuthSuccess(msg);\n return;\n\n case \"phone-terminated\":\n this.fail(new Error(\"Authentication cancelled on device\"));\n this.restartIfContinuous();\n return;\n\n case \"confirmed\":\n this.terminate(true);\n this.restartIfContinuous();\n return;\n }\n }\n\n private handleAuthSuccess(msg: ISocketMessage) {\n if (!this.sessionKey || !msg.cipher || !msg.nonce) {\n this.fail(new Error(\"Invalid authentication payload\"));\n this.restartIfContinuous();\n return;\n }\n\n try {\n const decrypted = this.crypto.decryptSymmetric({\n encrypted: { cipher: msg.cipher, nonce: msg.nonce },\n keyString: this.sessionKey,\n });\n\n if (!decrypted) {\n this.fail(new Error(\"Invalid authentication data\"));\n this.restartIfContinuous();\n return;\n }\n\n const result: IdentityResult = JSON.parse(decrypted);\n\n this.emit(\"success\", result);\n this.stateMachine.transition(\"authenticated\");\n\n // Confirm receipt\n this.transport?.send({\n type: \"confirm\",\n sessionID: this.sessionId,\n });\n } catch {\n this.fail(new Error(\"Failed to decrypt authentication data\"));\n this.restartIfContinuous();\n }\n }\n\n /* -------------------- Deep Link Flow (Mobile) -------------------- */\n\n private async startDeepLinkFlow() {\n const { deeplinkUrl } = await this.fetchRelayUrl();\n\n if (this.sessionKey) {\n storeAuthSession(this.sessionId, this.sessionKey, 10 * 60_000); // 10 min TTL\n }\n\n await this.emitDeepLink(deeplinkUrl);\n this.deeplinkUrl = deeplinkUrl;\n\n this.stateMachine.transition(\"awaiting-pair\");\n }\n\n public openDeepLink() {\n if (!this.deeplinkUrl) {\n this.fail(new Error(\"Deep link not found\"));\n return;\n }\n\n this.attachVisibilityRecovery();\n\n const userAgent = navigator.userAgent;\n let fallbackUrl = FALLBACK_URL;\n\n if (/iPad|iPhone|iPod/.test(userAgent)) {\n fallbackUrl = APPLE_APP_STORE_URL;\n } else if (/android/i.test(userAgent)) {\n fallbackUrl = PLAY_STORE_URL;\n }\n\n const start = Date.now();\n window.location.href = this.deeplinkUrl;\n\n setTimeout(() => {\n // Increased to 3 seconds for better UX/Reliability\n // We check if the elapsed time is less than 3500ms\n // to ensure the tab hasn't been suspended/backgrounded.\n if (Date.now() - start < 3500) {\n window.location.href = fallbackUrl;\n }\n }, 3000);\n }\n\n private clearBackupCheck() {\n if (this.backupCheckTimeout) {\n clearTimeout(this.backupCheckTimeout);\n this.backupCheckTimeout = undefined;\n }\n }\n\n private async checkSession() {\n const cached = getAuthSession();\n if (!cached) {\n this.fail(new Error(\"Authentication session not found\"));\n this.restartIfContinuous();\n return;\n }\n\n this.stateMachine.transition(\"awaiting-auth\");\n try {\n const res = await fetch(\n `${BASEURL}/session?session_id=${cached.sessionId}`,\n );\n\n // Session not ready yet\n if (!res.ok) {\n this.fail(new Error(\"Session not found\"));\n this.restartIfContinuous();\n return;\n }\n\n const data = await res.json();\n const decrypted = this.crypto.decryptSymmetric({\n encrypted: { cipher: data.cipher, nonce: data.nonce },\n keyString: cached.sessionKey,\n });\n\n if (!decrypted) {\n console.warn(\"Failed to decrypt session\");\n this.fail(new Error(\"Failed to decrypt session\"));\n this.restartIfContinuous();\n return;\n }\n\n const result: IdentityResult = JSON.parse(decrypted);\n\n // Success!\n this.clearBackupCheck();\n clearAuthSession();\n\n this.emit(\"success\", result);\n this.stateMachine.transition(\"authenticated\");\n\n // In continuous mode, restart after delay\n if (this.config.continuousMode) {\n setTimeout(() => {\n this.stateMachine.transition(\"idle\");\n this.start();\n }, 1500);\n } else {\n this.stateMachine.transition(\"idle\");\n }\n } catch (err) {\n console.debug(\"Session check failed:\", err);\n this.fail(new Error(\"Session check failed\"));\n this.restartIfContinuous();\n return;\n }\n }\n\n /* -------------------- Entry Point Generation -------------------- */\n\n private async emitQRCode(deeplinkUrl: string) {\n const embeddedUrl = `${deeplinkUrl}?sessionID=${encodeURIComponent(\n this.sessionId,\n )}&sessionKey=${encodeURIComponent(\n this.sessionKey!,\n )}&publicKey=${encodeURIComponent(this.config.publicKey)}&authType=${\n this.config.authType\n }&projectId=${encodeURIComponent(this.config.projectId)}`;\n\n const qr = await QRCode.toDataURL(embeddedUrl, {\n type: \"image/png\",\n scale: 3,\n color: { light: \"#ffffff\", dark: \"#424242ff\" },\n });\n\n this.emit(\"qr\", qr);\n }\n\n private async emitDeepLink(deeplinkUrl: string) {\n const deeplink = `${deeplinkUrl}?sessionID=${encodeURIComponent(\n this.sessionId,\n )}&sessionKey=${encodeURIComponent(\n this.sessionKey!,\n )}&publicKey=${encodeURIComponent(this.config.publicKey)}&authType=${\n this.config.authType\n }&projectId=${encodeURIComponent(this.config.projectId)}`;\n\n this.emit(\"deeplink\", deeplink);\n }\n\n /* -------------------- Visibility Recovery -------------------- */\n\n public attachVisibilityRecovery() {\n let fired = false;\n this.visibilityHandler = async () => {\n if (document.visibilityState !== \"visible\") return;\n\n // Only check for deep link flow\n if (this.useWebSocket) return;\n\n if (fired) return;\n fired = true;\n\n // Check session when page becomes visible\n await this.checkSession();\n };\n\n document.addEventListener(\"visibilitychange\", this.visibilityHandler);\n }\n\n private detachVisibilityRecovery() {\n if (this.visibilityHandler) {\n document.removeEventListener(\"visibilitychange\", this.visibilityHandler);\n this.visibilityHandler = undefined;\n }\n }\n\n /* -------------------- Helpers -------------------- */\n\n private async fetchRelayUrl(): Promise<{\n deeplinkUrl: string;\n relayUrl: string;\n }> {\n const { publicKey, projectId, authType } = this.config;\n const res = await fetch(\n `${BASEURL}/relay?public_key=${publicKey}&auth_type=${authType}&project_id=${projectId}`,\n );\n\n if (!res.ok) {\n const error = await res.text();\n throw new Error(error);\n }\n\n const json = await res.json();\n return { deeplinkUrl: json.deeplink_url, relayUrl: json.relay_url };\n }\n\n private terminate(success: boolean) {\n // Clear backup check\n this.clearBackupCheck();\n\n // Close WebSocket if active\n if (this.transport) {\n if (!success) {\n this.transport.send({\n type: \"client-terminated\",\n sessionID: this.sessionId,\n projectId: this.config.projectId,\n publicKey: this.config.publicKey,\n authType: this.config.authType,\n });\n }\n this.transport.close();\n this.transport = undefined;\n }\n\n clearAuthSession();\n this.resetSession();\n\n if (!this.config.continuousMode) {\n this.detachVisibilityRecovery();\n }\n\n this.stateMachine.transition(success ? \"confirmed\" : \"idle\");\n }\n\n private restartIfContinuous() {\n if (this.config.continuousMode) {\n this.stateMachine.transition(\"idle\");\n this.clearBackupCheck();\n this.transport?.close();\n this.transport = undefined;\n setTimeout(() => {\n this.start();\n }, 150);\n } else {\n this.stateMachine.transition(\"idle\");\n }\n }\n\n private resetSession() {\n this.sessionId = \"\";\n this.sessionKey = null;\n }\n\n private emit<K extends keyof PelicanAuthEventMap>(\n event: K,\n payload: PelicanAuthEventMap[K],\n ) {\n this.listeners[event]?.forEach((cb) => cb(payload));\n }\n\n private fail(err: Error) {\n this.emit(\"error\", err);\n this.stateMachine.transition(\"error\");\n }\n}\n"]}
|
package/dist/index.mjs
CHANGED
|
@@ -311,6 +311,9 @@ var Transport = class {
|
|
|
311
311
|
|
|
312
312
|
// src/constants.ts
|
|
313
313
|
var BASEURL = "https://identityapi.pelicanidentity.com";
|
|
314
|
+
var APPLE_APP_STORE_URL = "https://apps.apple.com/us/app/pelican-vault/id6755097751";
|
|
315
|
+
var PLAY_STORE_URL = "https://play.google.com/store/apps/details?id=com.HeraculesDesignTechLtd.pelican";
|
|
316
|
+
var FALLBACK_URL = "https://pelicanidentity.com/pelican-vault";
|
|
314
317
|
|
|
315
318
|
// src/engine/engine.ts
|
|
316
319
|
var PelicanAuthentication = class {
|
|
@@ -320,6 +323,7 @@ var PelicanAuthentication = class {
|
|
|
320
323
|
this.sessionId = "";
|
|
321
324
|
this.sessionKey = null;
|
|
322
325
|
this.useWebSocket = true;
|
|
326
|
+
this.deeplinkUrl = null;
|
|
323
327
|
this.listeners = {};
|
|
324
328
|
if (!config.publicKey) throw new Error("Missing publicKey");
|
|
325
329
|
if (!config.projectId) throw new Error("Missing projectId");
|
|
@@ -571,10 +575,31 @@ var PelicanAuthentication = class {
|
|
|
571
575
|
if (this.sessionKey) {
|
|
572
576
|
storeAuthSession(this.sessionId, this.sessionKey, 10 * 6e4);
|
|
573
577
|
}
|
|
574
|
-
this.attachVisibilityRecovery();
|
|
575
578
|
await this.emitDeepLink(deeplinkUrl);
|
|
579
|
+
this.deeplinkUrl = deeplinkUrl;
|
|
576
580
|
this.stateMachine.transition("awaiting-pair");
|
|
577
581
|
}
|
|
582
|
+
openDeepLink() {
|
|
583
|
+
if (!this.deeplinkUrl) {
|
|
584
|
+
this.fail(new Error("Deep link not found"));
|
|
585
|
+
return;
|
|
586
|
+
}
|
|
587
|
+
this.attachVisibilityRecovery();
|
|
588
|
+
const userAgent = navigator.userAgent;
|
|
589
|
+
let fallbackUrl = FALLBACK_URL;
|
|
590
|
+
if (/iPad|iPhone|iPod/.test(userAgent)) {
|
|
591
|
+
fallbackUrl = APPLE_APP_STORE_URL;
|
|
592
|
+
} else if (/android/i.test(userAgent)) {
|
|
593
|
+
fallbackUrl = PLAY_STORE_URL;
|
|
594
|
+
}
|
|
595
|
+
const start = Date.now();
|
|
596
|
+
window.location.href = this.deeplinkUrl;
|
|
597
|
+
setTimeout(() => {
|
|
598
|
+
if (Date.now() - start < 3500) {
|
|
599
|
+
window.location.href = fallbackUrl;
|
|
600
|
+
}
|
|
601
|
+
}, 3e3);
|
|
602
|
+
}
|
|
578
603
|
clearBackupCheck() {
|
|
579
604
|
if (this.backupCheckTimeout) {
|
|
580
605
|
clearTimeout(this.backupCheckTimeout);
|
|
@@ -585,9 +610,7 @@ var PelicanAuthentication = class {
|
|
|
585
610
|
const cached = getAuthSession();
|
|
586
611
|
if (!cached) {
|
|
587
612
|
this.fail(new Error("Authentication session not found"));
|
|
588
|
-
|
|
589
|
-
this.stateMachine.transition("idle");
|
|
590
|
-
}, 2e3);
|
|
613
|
+
this.restartIfContinuous();
|
|
591
614
|
return;
|
|
592
615
|
}
|
|
593
616
|
this.stateMachine.transition("awaiting-auth");
|
|
@@ -597,9 +620,7 @@ var PelicanAuthentication = class {
|
|
|
597
620
|
);
|
|
598
621
|
if (!res.ok) {
|
|
599
622
|
this.fail(new Error("Session not found"));
|
|
600
|
-
|
|
601
|
-
this.stateMachine.transition("idle");
|
|
602
|
-
}, 2e3);
|
|
623
|
+
this.restartIfContinuous();
|
|
603
624
|
return;
|
|
604
625
|
}
|
|
605
626
|
const data = await res.json();
|
|
@@ -610,9 +631,7 @@ var PelicanAuthentication = class {
|
|
|
610
631
|
if (!decrypted) {
|
|
611
632
|
console.warn("Failed to decrypt session");
|
|
612
633
|
this.fail(new Error("Failed to decrypt session"));
|
|
613
|
-
|
|
614
|
-
this.stateMachine.transition("idle");
|
|
615
|
-
}, 2e3);
|
|
634
|
+
this.restartIfContinuous();
|
|
616
635
|
return;
|
|
617
636
|
}
|
|
618
637
|
const result = JSON.parse(decrypted);
|
|
@@ -631,9 +650,7 @@ var PelicanAuthentication = class {
|
|
|
631
650
|
} catch (err) {
|
|
632
651
|
console.debug("Session check failed:", err);
|
|
633
652
|
this.fail(new Error("Session check failed"));
|
|
634
|
-
|
|
635
|
-
this.stateMachine.transition("idle");
|
|
636
|
-
}, 2e3);
|
|
653
|
+
this.restartIfContinuous();
|
|
637
654
|
return;
|
|
638
655
|
}
|
|
639
656
|
}
|
|
@@ -661,9 +678,12 @@ var PelicanAuthentication = class {
|
|
|
661
678
|
}
|
|
662
679
|
/* -------------------- Visibility Recovery -------------------- */
|
|
663
680
|
attachVisibilityRecovery() {
|
|
681
|
+
let fired = false;
|
|
664
682
|
this.visibilityHandler = async () => {
|
|
665
683
|
if (document.visibilityState !== "visible") return;
|
|
666
684
|
if (this.useWebSocket) return;
|
|
685
|
+
if (fired) return;
|
|
686
|
+
fired = true;
|
|
667
687
|
await this.checkSession();
|
|
668
688
|
};
|
|
669
689
|
document.addEventListener("visibilitychange", this.visibilityHandler);
|
package/dist/index.mjs.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/utilities/crypto.ts","../src/utilities/storage.ts","../src/utilities/stateMachine.ts","../src/utilities/transport.ts","../src/constants.ts","../src/engine/engine.ts"],"names":[],"mappings":"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","file":"index.mjs","sourcesContent":["import nacl from \"tweetnacl\";\nimport { decodeBase64, encodeBase64 } from \"tweetnacl-util\";\n\ninterface EncryptedMessage {\n cipher: string; // Base64 encoded\n nonce: string; // Base64 encoded\n}\n\nexport class CryptoService {\n generateSymmetricKey(): string {\n const key = nacl.randomBytes(32);\n return encodeBase64(key);\n }\n\n /**\n * Encrypt with symmetric key (secret-key encryption)\n * Use this when both parties share the same secret key\n * @param plaintext - Message to encrypt\n * @param keyString - Symmetric key (base64)\n * @returns Encrypted message with nonce\n */\n encryptSymmetric({\n plaintext,\n keyString,\n }: {\n plaintext: string;\n keyString: string;\n }): EncryptedMessage {\n const key = decodeBase64(keyString);\n const nonce = nacl.randomBytes(24);\n\n const messageBytes = new TextEncoder().encode(plaintext);\n\n const ciphertext = nacl.secretbox(messageBytes, nonce, key);\n\n return {\n cipher: encodeBase64(ciphertext),\n nonce: encodeBase64(nonce),\n };\n }\n\n /**\n * Decrypt with symmetric key\n * @param encrypted - Encrypted message with nonce\n * @param keyString - Symmetric key (base64)\n * @returns Decrypted plaintext\n */\n decryptSymmetric({\n encrypted,\n keyString,\n }: {\n encrypted: EncryptedMessage;\n keyString: string;\n }): string | null {\n try {\n const key = decodeBase64(keyString);\n const ciphertextBytes = decodeBase64(encrypted.cipher);\n const nonceBytes = decodeBase64(encrypted.nonce);\n\n const decrypted = nacl.secretbox.open(ciphertextBytes, nonceBytes, key);\n\n if (!decrypted) {\n throw new Error(\"Decryption failed - invalid key or corrupted data\");\n }\n\n const decoded = new TextDecoder().decode(decrypted);\n return decoded;\n } catch (error) {\n console.error(\"Decryption failed\", error);\n return null;\n }\n }\n}\n\nexport default CryptoService;\nexport type { EncryptedMessage };\n","// hybridStorage.ts\n/**\n * Hybrid storage: Try sessionStorage first, fallback to memory\n * Best of both worlds - survives page refresh but auto-cleans\n */\n\ninterface StorageOptions {\n ttlMs?: number;\n useSessionStorage?: boolean;\n}\n\nclass AuthStorage {\n private readonly prefix = \"pelican_auth_\";\n private readonly defaultTTL = 5 * 60 * 1000; // 5 minutes\n private memoryCache: Map<string, { value: any; expiresAt: number }> =\n new Map();\n\n /**\n * Store auth session with automatic cleanup\n */\n set(key: string, value: any, options: StorageOptions = {}): void {\n const { ttlMs = this.defaultTTL, useSessionStorage = true } = options;\n\n const expiresAt = Date.now() + ttlMs;\n const data = { value, expiresAt };\n\n // Try sessionStorage first\n if (useSessionStorage) {\n try {\n sessionStorage.setItem(`${this.prefix}${key}`, JSON.stringify(data));\n } catch (error) {\n console.warn(\"SessionStorage unavailable, using memory:\", error);\n this.setMemory(key, data);\n }\n } else {\n this.setMemory(key, data);\n }\n }\n\n /**\n * Get stored value if not expired\n */\n get(key: string): any | null {\n // Try sessionStorage first\n try {\n const stored = sessionStorage.getItem(`${this.prefix}${key}`);\n if (stored) {\n const data = JSON.parse(stored);\n\n // Check expiration\n if (Date.now() > data.expiresAt) {\n this.remove(key);\n return null;\n }\n\n return data.value;\n }\n } catch (error) {\n // Fallback to memory\n }\n\n // Try memory cache\n return this.getMemory(key);\n }\n\n /**\n * Remove specific key\n */\n remove(key: string): void {\n try {\n sessionStorage.removeItem(`${this.prefix}${key}`);\n } catch (error) {\n // Ignore\n }\n this.memoryCache.delete(key);\n }\n\n /**\n * Clear all auth data\n */\n clear(): void {\n // Clear sessionStorage\n try {\n Object.keys(sessionStorage).forEach((key) => {\n if (key.startsWith(this.prefix)) {\n sessionStorage.removeItem(key);\n }\n });\n } catch (error) {\n // Ignore\n }\n\n // Clear memory\n this.memoryCache.clear();\n }\n\n // ========================================\n // Memory cache helpers\n // ========================================\n\n private setMemory(\n key: string,\n data: { value: any; expiresAt: number }\n ): void {\n this.memoryCache.set(key, data);\n\n // Schedule cleanup\n const ttl = data.expiresAt - Date.now();\n setTimeout(() => {\n this.memoryCache.delete(key);\n }, ttl);\n }\n\n private getMemory(key: string): any | null {\n const data = this.memoryCache.get(key);\n if (!data) return null;\n\n if (Date.now() > data.expiresAt) {\n this.memoryCache.delete(key);\n return null;\n }\n\n return data.value;\n }\n}\n\n// Singleton instance\nconst storage = new AuthStorage();\n\n// ========================================\n// Convenience functions for auth flow\n// ========================================\n\nexport interface AuthSession {\n sessionId: string;\n sessionKey: string;\n}\n\nexport const storeAuthSession = (\n sessionId: string,\n sessionKey: string,\n ttlMs?: number\n): void => {\n storage.set(\"session\", { sessionId, sessionKey }, { ttlMs });\n};\n\nexport const getAuthSession = (): AuthSession | null => {\n return storage.get(\"session\");\n};\n\nexport const clearAuthSession = (): void => {\n storage.remove(\"session\");\n};\n\nexport const clearAllAuthData = (): void => {\n storage.clear();\n};\n\nexport default storage;\n","import type { PelicanAuthState } from \"../types/types\";\n\nexport class StateMachine {\n private state: PelicanAuthState = \"idle\";\n private listeners = new Set<(s: PelicanAuthState) => void>();\n\n get current() {\n return this.state;\n }\n\n transition(next: PelicanAuthState) {\n this.state = next;\n this.listeners.forEach((l) => l(next));\n }\n\n subscribe(fn: (s: PelicanAuthState) => void) {\n this.listeners.add(fn);\n return () => this.listeners.delete(fn);\n }\n}\n","import { ISocketMessage } from \"../types/types\";\n\ntype TransportHandlers = {\n onOpen?: () => void;\n onMessage?: (msg: ISocketMessage) => void;\n onError?: (err: Event) => void;\n onClose?: (ev: CloseEvent) => void;\n};\n\n/**\n * WebSocket Transport with automatic reconnection\n * Handles connection lifecycle and message passing\n */\nexport class Transport {\n private socket?: WebSocket;\n private handlers: TransportHandlers;\n private reconnectAttempts = 0;\n private maxReconnectAttempts = 3; // Reduced from 5 for mobile\n private isExplicitlyClosed = false;\n private url?: string;\n private reconnectTimeout?: number;\n private isReconnecting = false;\n\n constructor(handlers: TransportHandlers) {\n this.handlers = handlers;\n }\n\n /**\n * Establish WebSocket connection\n * @param url - WebSocket URL\n */\n connect(url: string) {\n this.url = url;\n this.isExplicitlyClosed = false;\n\n // Clean up any existing socket\n if (this.socket) {\n this.socket.onclose = null;\n this.socket.onerror = null;\n this.socket.onmessage = null;\n this.socket.onopen = null;\n\n if (\n this.socket.readyState === WebSocket.OPEN ||\n this.socket.readyState === WebSocket.CONNECTING\n ) {\n this.socket.close();\n }\n }\n\n this.socket = new WebSocket(url);\n\n this.socket.onopen = () => {\n this.reconnectAttempts = 0;\n this.isReconnecting = false;\n this.handlers.onOpen?.();\n };\n\n this.socket.onmessage = (e: MessageEvent) => {\n try {\n const data = JSON.parse(e.data);\n this.handlers.onMessage?.(data);\n } catch (err) {\n console.error(\"Failed to parse WebSocket message\", err);\n }\n };\n\n this.socket.onerror = (e: Event) => {\n // Only emit error if not reconnecting and not explicitly closed\n if (!this.isReconnecting && !this.isExplicitlyClosed) {\n this.handlers.onError?.(e);\n }\n };\n\n this.socket.onclose = (e: CloseEvent) => {\n // Clear any pending reconnect timeout\n if (this.reconnectTimeout) {\n clearTimeout(this.reconnectTimeout);\n this.reconnectTimeout = undefined;\n }\n\n // Emit close event\n if (!this.isReconnecting) {\n this.handlers.onClose?.(e);\n }\n\n // Only reconnect if:\n // 1. Not explicitly closed by user\n // 2. Not already reconnecting\n // 3. Haven't exceeded max attempts\n if (\n !this.isExplicitlyClosed &&\n !this.isReconnecting &&\n this.reconnectAttempts < this.maxReconnectAttempts\n ) {\n this.attemptReconnect();\n }\n };\n }\n\n /**\n * Attempt to reconnect with exponential backoff\n */\n private attemptReconnect() {\n if (this.reconnectAttempts >= this.maxReconnectAttempts) {\n console.warn(\"Max WebSocket reconnect attempts reached\");\n return;\n }\n\n this.isReconnecting = true;\n this.reconnectAttempts++;\n\n // Exponential backoff: 500ms, 1s, 2s\n const delay = Math.min(Math.pow(2, this.reconnectAttempts - 1) * 500, 2000);\n\n console.log(\n `Reconnecting WebSocket (attempt ${this.reconnectAttempts}/${this.maxReconnectAttempts}) in ${delay}ms...`\n );\n\n this.reconnectTimeout = window.setTimeout(() => {\n if (this.url && !this.isExplicitlyClosed) {\n this.connect(this.url);\n }\n }, delay);\n }\n\n /**\n * Send a message through the WebSocket\n * Queues message if connection is not open\n */\n send(payload: ISocketMessage) {\n if (this.socket?.readyState === WebSocket.OPEN) {\n try {\n this.socket.send(JSON.stringify(payload));\n } catch (err) {\n console.error(\"Failed to send WebSocket message:\", err);\n }\n } else {\n console.warn(\n \"WebSocket not open, message not sent:\",\n this.socket?.readyState\n );\n }\n }\n\n /**\n * Close the WebSocket connection\n * Prevents automatic reconnection\n */\n close() {\n this.isExplicitlyClosed = true;\n this.isReconnecting = false;\n\n // Clear reconnect timeout\n if (this.reconnectTimeout) {\n clearTimeout(this.reconnectTimeout);\n this.reconnectTimeout = undefined;\n }\n\n // Close socket\n if (this.socket) {\n // Remove event listeners to prevent callbacks\n this.socket.onclose = null;\n this.socket.onerror = null;\n this.socket.onmessage = null;\n this.socket.onopen = null;\n\n if (\n this.socket.readyState === WebSocket.OPEN ||\n this.socket.readyState === WebSocket.CONNECTING\n ) {\n this.socket.close();\n }\n\n this.socket = undefined;\n }\n }\n\n /**\n * Get current connection state\n */\n get readyState(): number | undefined {\n return this.socket?.readyState;\n }\n\n /**\n * Check if connection is open\n */\n get isOpen(): boolean {\n return this.socket?.readyState === WebSocket.OPEN;\n }\n}\n","export const BASEURL = \"https://identityapi.pelicanidentity.com\";\n","import CryptoService from \"../utilities/crypto\";\nimport QRCode from \"qrcode\";\nimport {\n PelicanAuthConfig,\n PelicanAuthEventMap,\n ISocketMessage,\n IdentityResult,\n} from \"../types/types\";\nimport {\n storeAuthSession,\n getAuthSession,\n clearAuthSession,\n} from \"../utilities/storage\";\nimport { StateMachine } from \"../utilities/stateMachine\";\nimport { Transport } from \"../utilities/transport\";\n\nimport { BASEURL } from \"../constants\";\n\ntype Listener<T> = (payload: T) => void;\n\n/**\n * PelicanAuth SDK\n *\n * Uses WebSocket for QR code flow (desktop)\n * Uses visibility recovery for deep link flow (mobile)\n */\nexport class PelicanAuthentication {\n private readonly crypto = new CryptoService();\n private readonly stateMachine = new StateMachine();\n\n private transport?: Transport;\n private sessionId = \"\";\n private sessionKey: string | null = null;\n\n private visibilityHandler?: () => void;\n private backupCheckTimeout?: number;\n private useWebSocket = true;\n\n private listeners: {\n [K in keyof PelicanAuthEventMap]?: Set<Listener<any>>;\n } = {};\n\n private readonly config: Required<PelicanAuthConfig>;\n\n constructor(config: PelicanAuthConfig) {\n if (!config.publicKey) throw new Error(\"Missing publicKey\");\n if (!config.projectId) throw new Error(\"Missing projectId\");\n if (!config.authType) throw new Error(\"Missing authType\");\n\n this.config = {\n continuousMode: false,\n forceQRCode: false,\n ...config,\n };\n\n this.stateMachine.subscribe((s) => this.emit(\"state\", s));\n }\n\n /* -------------------- Public API -------------------- */\n\n on<K extends keyof PelicanAuthEventMap>(\n event: K,\n cb: Listener<PelicanAuthEventMap[K]>,\n ) {\n this.listeners[event] ??= new Set();\n this.listeners[event]!.add(cb);\n return () => this.listeners[event]!.delete(cb);\n }\n\n async start() {\n if (\n this.config.authType !== \"id-verification\" &&\n this.config.authType !== \"signup\" &&\n this.config.authType !== \"login\"\n ) {\n this.fail(new Error(\"Invalid authType\"));\n return;\n }\n\n if (!this.config.projectId) {\n this.fail(new Error(\"Missing projectId\"));\n return;\n }\n\n if (!this.config.publicKey) {\n this.fail(new Error(\"Missing publicKey\"));\n return;\n }\n if (this.stateMachine.current !== \"idle\") return;\n\n this.resetSession();\n clearAuthSession();\n this.stateMachine.transition(\"initializing\");\n\n try {\n // Generate session credentials\n this.sessionKey = this.crypto.generateSymmetricKey();\n this.sessionId = crypto.randomUUID() + crypto.randomUUID();\n\n // Decide: WebSocket (QR) or Deep Link\n this.useWebSocket = this.shouldUseWebSocket();\n\n if (this.useWebSocket) {\n await this.startWebSocketFlow();\n } else {\n await this.startDeepLinkFlow();\n }\n } catch (err) {\n this.fail(err instanceof Error ? err : new Error(\"Start failed\"));\n }\n }\n\n stop() {\n this.terminate(false);\n }\n\n openWebAuth() {\n if (!this.sessionKey || !this.sessionId) {\n this.fail(\n new Error(\"No active session. Call start() before openWebAuth().\"),\n );\n return;\n }\n\n const openerOrigin = window.location.origin;\n\n const urlParams = new URLSearchParams({\n projectId: this.config.projectId,\n publicKey: this.config.publicKey,\n authType: this.config.authType,\n sessionId: this.sessionId,\n sessionKey: this.sessionKey,\n origin: openerOrigin,\n });\n\n const authUrl = `https://vault.pelicanidentity.com/auth?${urlParams.toString()}`;\n\n // Try popup first, fall back to new tab if blocked\n const authWindow =\n window.open(\n authUrl,\n \"pelican-auth\",\n \"width=480,height=640,left=400,top=100,resizable=no,scrollbars=no\",\n ) ?? window.open(authUrl, \"_blank\");\n\n if (!authWindow) {\n // Both popup and new tab blocked — nothing we can do\n this.fail(\n new Error(\n \"Unable to open authentication window. Please allow popups for this site and try again.\",\n ),\n );\n return;\n }\n\n this.detachVisibilityRecovery();\n this.transport?.close();\n this.transport = undefined;\n\n authWindow.focus();\n this.stateMachine.transition(\"awaiting-pair\");\n\n const cleanup = () => {\n window.removeEventListener(\"message\", handleMessage);\n clearInterval(closedPoller);\n };\n\n const handleMessage = (event: MessageEvent) => {\n // Only accept messages from the vault — prevents origin spoofing\n if (event.origin !== \"https://vault.pelicanidentity.com\") return;\n\n // Ensure message came from the specific window we opened\n // Works for both popup and new tab since window.opener is preserved either way\n if (event.source !== authWindow) return;\n\n const { type, payload } = event.data ?? {};\n\n if (type === \"pelican-auth-success\") {\n console.log(\"Web auth success\");\n cleanup();\n\n if (!payload?.cipher || !payload?.nonce) {\n this.fail(new Error(\"Invalid web auth payload\"));\n this.restartIfContinuous();\n return;\n }\n\n try {\n const decrypted = this.crypto.decryptSymmetric({\n encrypted: { cipher: payload.cipher, nonce: payload.nonce },\n keyString: this.sessionKey!,\n });\n\n if (!decrypted) {\n this.fail(new Error(\"Failed to decrypt web auth response\"));\n this.restartIfContinuous();\n return;\n }\n\n const result: IdentityResult = JSON.parse(decrypted);\n this.emit(\"success\", result);\n this.stateMachine.transition(\"authenticated\");\n this.restartIfContinuous();\n } catch {\n this.fail(new Error(\"Failed to decrypt web auth response\"));\n this.restartIfContinuous();\n }\n }\n\n if (type === \"pelican-auth-cancelled\") {\n cleanup();\n this.fail(new Error(\"Authentication cancelled\"));\n this.restartIfContinuous();\n }\n\n if (type === \"pelican-auth-error\") {\n cleanup();\n this.fail(new Error(payload?.message ?? \"Web auth failed\"));\n this.restartIfContinuous();\n }\n };\n\n window.addEventListener(\"message\", handleMessage);\n\n // Poll for manual close — works for both popup and new tab\n // New tab edge case: if user navigates away without closing, closed stays false\n // until they actually close the tab — acceptable tradeoff vs hard failing\n const closedPoller = setInterval(() => {\n if (!authWindow.closed) return;\n cleanup();\n if (\n ![\"authenticated\", \"confirmed\", \"error\"].includes(\n this.stateMachine.current,\n )\n ) {\n this.fail(new Error(\"Authentication window closed\"));\n this.restartIfContinuous();\n }\n }, 500);\n }\n\n destroy() {\n this.detachVisibilityRecovery();\n this.clearBackupCheck();\n this.transport?.close();\n this.transport = undefined;\n this.listeners = {};\n }\n\n useQrInstead() {\n this.useWebSocket = true;\n\n this.emit(\"deeplink\", \"\");\n this.stateMachine.transition(\"initializing\");\n this.startWebSocketFlow();\n }\n\n useDeepLinkInstead() {\n this.useWebSocket = false;\n this.stateMachine.transition(\"initializing\");\n this.startDeepLinkFlow();\n }\n /* -------------------- Flow Selection -------------------- */\n\n private shouldUseWebSocket(): boolean {\n const userAgent = navigator.userAgent;\n\n const isTablet = /(iPad|Android(?!.*Mobile))/i.test(userAgent);\n const isMobile =\n /Android|webOS|iPhone|iPod|BlackBerry|IEMobile|Opera Mini/i.test(\n userAgent,\n );\n\n const useWebSocket = isMobile && !isTablet;\n return this.config.forceQRCode || !useWebSocket;\n }\n\n /* -------------------- WebSocket Flow (QR Code) -------------------- */\n\n private async startWebSocketFlow() {\n const { relayUrl, deeplinkUrl } = await this.fetchRelayUrl();\n\n this.transport = new Transport({\n onOpen: () => {\n this.transport!.send({\n type: \"register\",\n sessionID: this.sessionId,\n ...this.config,\n });\n this.stateMachine.transition(\"awaiting-pair\");\n },\n onMessage: (msg: ISocketMessage) => this.handleWebSocketMessage(msg),\n onError: (err) => {\n console.error(\"WebSocket error:\", err);\n this.fail(new Error(\"WebSocket connection failed\"));\n },\n });\n\n this.transport.connect(relayUrl);\n await this.emitQRCode(deeplinkUrl);\n }\n\n private handleWebSocketMessage(msg: ISocketMessage) {\n switch (msg.type) {\n case \"paired\":\n this.stateMachine.transition(\"paired\");\n this.transport!.send({\n type: \"authenticate\",\n sessionID: this.sessionId,\n ...this.config,\n url: window.location.href,\n });\n return;\n\n case \"phone-auth-success\":\n this.handleAuthSuccess(msg);\n return;\n\n case \"phone-terminated\":\n this.fail(new Error(\"Authentication cancelled on device\"));\n this.restartIfContinuous();\n return;\n\n case \"confirmed\":\n this.terminate(true);\n this.restartIfContinuous();\n return;\n }\n }\n\n private handleAuthSuccess(msg: ISocketMessage) {\n if (!this.sessionKey || !msg.cipher || !msg.nonce) {\n this.fail(new Error(\"Invalid authentication payload\"));\n this.restartIfContinuous();\n return;\n }\n\n try {\n const decrypted = this.crypto.decryptSymmetric({\n encrypted: { cipher: msg.cipher, nonce: msg.nonce },\n keyString: this.sessionKey,\n });\n\n if (!decrypted) {\n this.fail(new Error(\"Invalid authentication data\"));\n this.restartIfContinuous();\n return;\n }\n\n const result: IdentityResult = JSON.parse(decrypted);\n\n this.emit(\"success\", result);\n this.stateMachine.transition(\"authenticated\");\n\n // Confirm receipt\n this.transport?.send({\n type: \"confirm\",\n sessionID: this.sessionId,\n });\n } catch {\n this.fail(new Error(\"Failed to decrypt authentication data\"));\n this.restartIfContinuous();\n }\n }\n\n /* -------------------- Deep Link Flow (Mobile) -------------------- */\n\n private async startDeepLinkFlow() {\n const { deeplinkUrl } = await this.fetchRelayUrl();\n\n // Store session for later recovery\n if (this.sessionKey) {\n storeAuthSession(this.sessionId, this.sessionKey, 10 * 60_000); // 10 min TTL\n }\n\n this.attachVisibilityRecovery();\n // Emit deep link\n await this.emitDeepLink(deeplinkUrl);\n\n // Move to awaiting state\n this.stateMachine.transition(\"awaiting-pair\");\n }\n\n private clearBackupCheck() {\n if (this.backupCheckTimeout) {\n clearTimeout(this.backupCheckTimeout);\n this.backupCheckTimeout = undefined;\n }\n }\n\n private async checkSession() {\n const cached = getAuthSession();\n if (!cached) {\n this.fail(new Error(\"Authentication session not found\"));\n setTimeout(() => {\n this.stateMachine.transition(\"idle\");\n }, 2000);\n return;\n }\n\n this.stateMachine.transition(\"awaiting-auth\");\n try {\n const res = await fetch(\n `${BASEURL}/session?session_id=${cached.sessionId}`,\n );\n\n // Session not ready yet\n if (!res.ok) {\n this.fail(new Error(\"Session not found\"));\n setTimeout(() => {\n this.stateMachine.transition(\"idle\");\n }, 2000);\n return;\n }\n\n const data = await res.json();\n const decrypted = this.crypto.decryptSymmetric({\n encrypted: { cipher: data.cipher, nonce: data.nonce },\n keyString: cached.sessionKey,\n });\n\n if (!decrypted) {\n console.warn(\"Failed to decrypt session\");\n this.fail(new Error(\"Failed to decrypt session\"));\n setTimeout(() => {\n this.stateMachine.transition(\"idle\");\n }, 2000);\n return;\n }\n\n const result: IdentityResult = JSON.parse(decrypted);\n\n // Success!\n this.clearBackupCheck();\n clearAuthSession();\n\n this.emit(\"success\", result);\n this.stateMachine.transition(\"authenticated\");\n\n // In continuous mode, restart after delay\n if (this.config.continuousMode) {\n setTimeout(() => {\n this.stateMachine.transition(\"idle\");\n this.start();\n }, 1500);\n } else {\n this.stateMachine.transition(\"idle\");\n }\n } catch (err) {\n console.debug(\"Session check failed:\", err);\n this.fail(new Error(\"Session check failed\"));\n setTimeout(() => {\n this.stateMachine.transition(\"idle\");\n }, 2000);\n return;\n }\n }\n\n /* -------------------- Entry Point Generation -------------------- */\n\n private async emitQRCode(deeplinkUrl: string) {\n const embeddedUrl = `${deeplinkUrl}?sessionID=${encodeURIComponent(\n this.sessionId,\n )}&sessionKey=${encodeURIComponent(\n this.sessionKey!,\n )}&publicKey=${encodeURIComponent(this.config.publicKey)}&authType=${\n this.config.authType\n }&projectId=${encodeURIComponent(this.config.projectId)}`;\n\n const qr = await QRCode.toDataURL(embeddedUrl, {\n type: \"image/png\",\n scale: 3,\n color: { light: \"#ffffff\", dark: \"#424242ff\" },\n });\n\n this.emit(\"qr\", qr);\n }\n\n private async emitDeepLink(deeplinkUrl: string) {\n const deeplink = `${deeplinkUrl}?sessionID=${encodeURIComponent(\n this.sessionId,\n )}&sessionKey=${encodeURIComponent(\n this.sessionKey!,\n )}&publicKey=${encodeURIComponent(this.config.publicKey)}&authType=${\n this.config.authType\n }&projectId=${encodeURIComponent(this.config.projectId)}`;\n\n this.emit(\"deeplink\", deeplink);\n }\n\n /* -------------------- Visibility Recovery -------------------- */\n\n private attachVisibilityRecovery() {\n this.visibilityHandler = async () => {\n if (document.visibilityState !== \"visible\") return;\n\n // Only check for deep link flow\n if (this.useWebSocket) return;\n\n // Check session when page becomes visible\n await this.checkSession();\n };\n\n document.addEventListener(\"visibilitychange\", this.visibilityHandler);\n }\n\n private detachVisibilityRecovery() {\n if (this.visibilityHandler) {\n document.removeEventListener(\"visibilitychange\", this.visibilityHandler);\n this.visibilityHandler = undefined;\n }\n }\n\n /* -------------------- Helpers -------------------- */\n\n private async fetchRelayUrl(): Promise<{\n deeplinkUrl: string;\n relayUrl: string;\n }> {\n const { publicKey, projectId, authType } = this.config;\n const res = await fetch(\n `${BASEURL}/relay?public_key=${publicKey}&auth_type=${authType}&project_id=${projectId}`,\n );\n\n if (!res.ok) {\n const error = await res.text();\n throw new Error(error);\n }\n\n const json = await res.json();\n return { deeplinkUrl: json.deeplink_url, relayUrl: json.relay_url };\n }\n\n private terminate(success: boolean) {\n // Clear backup check\n this.clearBackupCheck();\n\n // Close WebSocket if active\n if (this.transport) {\n if (!success) {\n this.transport.send({\n type: \"client-terminated\",\n sessionID: this.sessionId,\n projectId: this.config.projectId,\n publicKey: this.config.publicKey,\n authType: this.config.authType,\n });\n }\n this.transport.close();\n this.transport = undefined;\n }\n\n clearAuthSession();\n this.resetSession();\n\n if (!this.config.continuousMode) {\n this.detachVisibilityRecovery();\n }\n\n this.stateMachine.transition(success ? \"confirmed\" : \"idle\");\n }\n\n private restartIfContinuous() {\n if (this.config.continuousMode) {\n this.stateMachine.transition(\"idle\");\n this.clearBackupCheck();\n this.transport?.close();\n this.transport = undefined;\n setTimeout(() => {\n this.start();\n }, 150);\n } else {\n this.stateMachine.transition(\"idle\");\n }\n }\n\n private resetSession() {\n this.sessionId = \"\";\n this.sessionKey = null;\n }\n\n private emit<K extends keyof PelicanAuthEventMap>(\n event: K,\n payload: PelicanAuthEventMap[K],\n ) {\n this.listeners[event]?.forEach((cb) => cb(payload));\n }\n\n private fail(err: Error) {\n this.emit(\"error\", err);\n this.stateMachine.transition(\"error\");\n }\n}\n"]}
|
|
1
|
+
{"version":3,"sources":["../src/utilities/crypto.ts","../src/utilities/storage.ts","../src/utilities/stateMachine.ts","../src/utilities/transport.ts","../src/constants.ts","../src/engine/engine.ts"],"names":[],"mappings":"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","file":"index.mjs","sourcesContent":["import nacl from \"tweetnacl\";\nimport { decodeBase64, encodeBase64 } from \"tweetnacl-util\";\n\ninterface EncryptedMessage {\n cipher: string; // Base64 encoded\n nonce: string; // Base64 encoded\n}\n\nexport class CryptoService {\n generateSymmetricKey(): string {\n const key = nacl.randomBytes(32);\n return encodeBase64(key);\n }\n\n /**\n * Encrypt with symmetric key (secret-key encryption)\n * Use this when both parties share the same secret key\n * @param plaintext - Message to encrypt\n * @param keyString - Symmetric key (base64)\n * @returns Encrypted message with nonce\n */\n encryptSymmetric({\n plaintext,\n keyString,\n }: {\n plaintext: string;\n keyString: string;\n }): EncryptedMessage {\n const key = decodeBase64(keyString);\n const nonce = nacl.randomBytes(24);\n\n const messageBytes = new TextEncoder().encode(plaintext);\n\n const ciphertext = nacl.secretbox(messageBytes, nonce, key);\n\n return {\n cipher: encodeBase64(ciphertext),\n nonce: encodeBase64(nonce),\n };\n }\n\n /**\n * Decrypt with symmetric key\n * @param encrypted - Encrypted message with nonce\n * @param keyString - Symmetric key (base64)\n * @returns Decrypted plaintext\n */\n decryptSymmetric({\n encrypted,\n keyString,\n }: {\n encrypted: EncryptedMessage;\n keyString: string;\n }): string | null {\n try {\n const key = decodeBase64(keyString);\n const ciphertextBytes = decodeBase64(encrypted.cipher);\n const nonceBytes = decodeBase64(encrypted.nonce);\n\n const decrypted = nacl.secretbox.open(ciphertextBytes, nonceBytes, key);\n\n if (!decrypted) {\n throw new Error(\"Decryption failed - invalid key or corrupted data\");\n }\n\n const decoded = new TextDecoder().decode(decrypted);\n return decoded;\n } catch (error) {\n console.error(\"Decryption failed\", error);\n return null;\n }\n }\n}\n\nexport default CryptoService;\nexport type { EncryptedMessage };\n","// hybridStorage.ts\n/**\n * Hybrid storage: Try sessionStorage first, fallback to memory\n * Best of both worlds - survives page refresh but auto-cleans\n */\n\ninterface StorageOptions {\n ttlMs?: number;\n useSessionStorage?: boolean;\n}\n\nclass AuthStorage {\n private readonly prefix = \"pelican_auth_\";\n private readonly defaultTTL = 5 * 60 * 1000; // 5 minutes\n private memoryCache: Map<string, { value: any; expiresAt: number }> =\n new Map();\n\n /**\n * Store auth session with automatic cleanup\n */\n set(key: string, value: any, options: StorageOptions = {}): void {\n const { ttlMs = this.defaultTTL, useSessionStorage = true } = options;\n\n const expiresAt = Date.now() + ttlMs;\n const data = { value, expiresAt };\n\n // Try sessionStorage first\n if (useSessionStorage) {\n try {\n sessionStorage.setItem(`${this.prefix}${key}`, JSON.stringify(data));\n } catch (error) {\n console.warn(\"SessionStorage unavailable, using memory:\", error);\n this.setMemory(key, data);\n }\n } else {\n this.setMemory(key, data);\n }\n }\n\n /**\n * Get stored value if not expired\n */\n get(key: string): any | null {\n // Try sessionStorage first\n try {\n const stored = sessionStorage.getItem(`${this.prefix}${key}`);\n if (stored) {\n const data = JSON.parse(stored);\n\n // Check expiration\n if (Date.now() > data.expiresAt) {\n this.remove(key);\n return null;\n }\n\n return data.value;\n }\n } catch (error) {\n // Fallback to memory\n }\n\n // Try memory cache\n return this.getMemory(key);\n }\n\n /**\n * Remove specific key\n */\n remove(key: string): void {\n try {\n sessionStorage.removeItem(`${this.prefix}${key}`);\n } catch (error) {\n // Ignore\n }\n this.memoryCache.delete(key);\n }\n\n /**\n * Clear all auth data\n */\n clear(): void {\n // Clear sessionStorage\n try {\n Object.keys(sessionStorage).forEach((key) => {\n if (key.startsWith(this.prefix)) {\n sessionStorage.removeItem(key);\n }\n });\n } catch (error) {\n // Ignore\n }\n\n // Clear memory\n this.memoryCache.clear();\n }\n\n // ========================================\n // Memory cache helpers\n // ========================================\n\n private setMemory(\n key: string,\n data: { value: any; expiresAt: number }\n ): void {\n this.memoryCache.set(key, data);\n\n // Schedule cleanup\n const ttl = data.expiresAt - Date.now();\n setTimeout(() => {\n this.memoryCache.delete(key);\n }, ttl);\n }\n\n private getMemory(key: string): any | null {\n const data = this.memoryCache.get(key);\n if (!data) return null;\n\n if (Date.now() > data.expiresAt) {\n this.memoryCache.delete(key);\n return null;\n }\n\n return data.value;\n }\n}\n\n// Singleton instance\nconst storage = new AuthStorage();\n\n// ========================================\n// Convenience functions for auth flow\n// ========================================\n\nexport interface AuthSession {\n sessionId: string;\n sessionKey: string;\n}\n\nexport const storeAuthSession = (\n sessionId: string,\n sessionKey: string,\n ttlMs?: number\n): void => {\n storage.set(\"session\", { sessionId, sessionKey }, { ttlMs });\n};\n\nexport const getAuthSession = (): AuthSession | null => {\n return storage.get(\"session\");\n};\n\nexport const clearAuthSession = (): void => {\n storage.remove(\"session\");\n};\n\nexport const clearAllAuthData = (): void => {\n storage.clear();\n};\n\nexport default storage;\n","import type { PelicanAuthState } from \"../types/types\";\n\nexport class StateMachine {\n private state: PelicanAuthState = \"idle\";\n private listeners = new Set<(s: PelicanAuthState) => void>();\n\n get current() {\n return this.state;\n }\n\n transition(next: PelicanAuthState) {\n this.state = next;\n this.listeners.forEach((l) => l(next));\n }\n\n subscribe(fn: (s: PelicanAuthState) => void) {\n this.listeners.add(fn);\n return () => this.listeners.delete(fn);\n }\n}\n","import { ISocketMessage } from \"../types/types\";\n\ntype TransportHandlers = {\n onOpen?: () => void;\n onMessage?: (msg: ISocketMessage) => void;\n onError?: (err: Event) => void;\n onClose?: (ev: CloseEvent) => void;\n};\n\n/**\n * WebSocket Transport with automatic reconnection\n * Handles connection lifecycle and message passing\n */\nexport class Transport {\n private socket?: WebSocket;\n private handlers: TransportHandlers;\n private reconnectAttempts = 0;\n private maxReconnectAttempts = 3; // Reduced from 5 for mobile\n private isExplicitlyClosed = false;\n private url?: string;\n private reconnectTimeout?: number;\n private isReconnecting = false;\n\n constructor(handlers: TransportHandlers) {\n this.handlers = handlers;\n }\n\n /**\n * Establish WebSocket connection\n * @param url - WebSocket URL\n */\n connect(url: string) {\n this.url = url;\n this.isExplicitlyClosed = false;\n\n // Clean up any existing socket\n if (this.socket) {\n this.socket.onclose = null;\n this.socket.onerror = null;\n this.socket.onmessage = null;\n this.socket.onopen = null;\n\n if (\n this.socket.readyState === WebSocket.OPEN ||\n this.socket.readyState === WebSocket.CONNECTING\n ) {\n this.socket.close();\n }\n }\n\n this.socket = new WebSocket(url);\n\n this.socket.onopen = () => {\n this.reconnectAttempts = 0;\n this.isReconnecting = false;\n this.handlers.onOpen?.();\n };\n\n this.socket.onmessage = (e: MessageEvent) => {\n try {\n const data = JSON.parse(e.data);\n this.handlers.onMessage?.(data);\n } catch (err) {\n console.error(\"Failed to parse WebSocket message\", err);\n }\n };\n\n this.socket.onerror = (e: Event) => {\n // Only emit error if not reconnecting and not explicitly closed\n if (!this.isReconnecting && !this.isExplicitlyClosed) {\n this.handlers.onError?.(e);\n }\n };\n\n this.socket.onclose = (e: CloseEvent) => {\n // Clear any pending reconnect timeout\n if (this.reconnectTimeout) {\n clearTimeout(this.reconnectTimeout);\n this.reconnectTimeout = undefined;\n }\n\n // Emit close event\n if (!this.isReconnecting) {\n this.handlers.onClose?.(e);\n }\n\n // Only reconnect if:\n // 1. Not explicitly closed by user\n // 2. Not already reconnecting\n // 3. Haven't exceeded max attempts\n if (\n !this.isExplicitlyClosed &&\n !this.isReconnecting &&\n this.reconnectAttempts < this.maxReconnectAttempts\n ) {\n this.attemptReconnect();\n }\n };\n }\n\n /**\n * Attempt to reconnect with exponential backoff\n */\n private attemptReconnect() {\n if (this.reconnectAttempts >= this.maxReconnectAttempts) {\n console.warn(\"Max WebSocket reconnect attempts reached\");\n return;\n }\n\n this.isReconnecting = true;\n this.reconnectAttempts++;\n\n // Exponential backoff: 500ms, 1s, 2s\n const delay = Math.min(Math.pow(2, this.reconnectAttempts - 1) * 500, 2000);\n\n console.log(\n `Reconnecting WebSocket (attempt ${this.reconnectAttempts}/${this.maxReconnectAttempts}) in ${delay}ms...`\n );\n\n this.reconnectTimeout = window.setTimeout(() => {\n if (this.url && !this.isExplicitlyClosed) {\n this.connect(this.url);\n }\n }, delay);\n }\n\n /**\n * Send a message through the WebSocket\n * Queues message if connection is not open\n */\n send(payload: ISocketMessage) {\n if (this.socket?.readyState === WebSocket.OPEN) {\n try {\n this.socket.send(JSON.stringify(payload));\n } catch (err) {\n console.error(\"Failed to send WebSocket message:\", err);\n }\n } else {\n console.warn(\n \"WebSocket not open, message not sent:\",\n this.socket?.readyState\n );\n }\n }\n\n /**\n * Close the WebSocket connection\n * Prevents automatic reconnection\n */\n close() {\n this.isExplicitlyClosed = true;\n this.isReconnecting = false;\n\n // Clear reconnect timeout\n if (this.reconnectTimeout) {\n clearTimeout(this.reconnectTimeout);\n this.reconnectTimeout = undefined;\n }\n\n // Close socket\n if (this.socket) {\n // Remove event listeners to prevent callbacks\n this.socket.onclose = null;\n this.socket.onerror = null;\n this.socket.onmessage = null;\n this.socket.onopen = null;\n\n if (\n this.socket.readyState === WebSocket.OPEN ||\n this.socket.readyState === WebSocket.CONNECTING\n ) {\n this.socket.close();\n }\n\n this.socket = undefined;\n }\n }\n\n /**\n * Get current connection state\n */\n get readyState(): number | undefined {\n return this.socket?.readyState;\n }\n\n /**\n * Check if connection is open\n */\n get isOpen(): boolean {\n return this.socket?.readyState === WebSocket.OPEN;\n }\n}\n","export const BASEURL = \"https://identityapi.pelicanidentity.com\";\nexport const APPLE_APP_STORE_URL =\n \"https://apps.apple.com/us/app/pelican-vault/id6755097751\";\nexport const PLAY_STORE_URL =\n \"https://play.google.com/store/apps/details?id=com.HeraculesDesignTechLtd.pelican\";\nexport const FALLBACK_URL = \"https://pelicanidentity.com/pelican-vault\";\n","import CryptoService from \"../utilities/crypto\";\nimport QRCode from \"qrcode\";\nimport {\n PelicanAuthConfig,\n PelicanAuthEventMap,\n ISocketMessage,\n IdentityResult,\n} from \"../types/types\";\nimport {\n storeAuthSession,\n getAuthSession,\n clearAuthSession,\n} from \"../utilities/storage\";\nimport { StateMachine } from \"../utilities/stateMachine\";\nimport { Transport } from \"../utilities/transport\";\n\nimport {\n APPLE_APP_STORE_URL,\n BASEURL,\n FALLBACK_URL,\n PLAY_STORE_URL,\n} from \"../constants\";\n\ntype Listener<T> = (payload: T) => void;\n\n/**\n * PelicanAuth SDK\n *\n * Uses WebSocket for QR code flow (desktop)\n * Uses visibility recovery for deep link flow (mobile)\n */\nexport class PelicanAuthentication {\n private readonly crypto = new CryptoService();\n private readonly stateMachine = new StateMachine();\n\n private transport?: Transport;\n private sessionId = \"\";\n private sessionKey: string | null = null;\n\n private visibilityHandler?: () => void;\n private backupCheckTimeout?: number;\n private useWebSocket = true;\n private deeplinkUrl: string | null = null;\n\n private listeners: {\n [K in keyof PelicanAuthEventMap]?: Set<Listener<any>>;\n } = {};\n\n private readonly config: Required<PelicanAuthConfig>;\n\n constructor(config: PelicanAuthConfig) {\n if (!config.publicKey) throw new Error(\"Missing publicKey\");\n if (!config.projectId) throw new Error(\"Missing projectId\");\n if (!config.authType) throw new Error(\"Missing authType\");\n\n this.config = {\n continuousMode: false,\n forceQRCode: false,\n ...config,\n };\n\n this.stateMachine.subscribe((s) => this.emit(\"state\", s));\n }\n\n /* -------------------- Public API -------------------- */\n\n on<K extends keyof PelicanAuthEventMap>(\n event: K,\n cb: Listener<PelicanAuthEventMap[K]>,\n ) {\n this.listeners[event] ??= new Set();\n this.listeners[event]!.add(cb);\n return () => this.listeners[event]!.delete(cb);\n }\n\n async start() {\n if (\n this.config.authType !== \"id-verification\" &&\n this.config.authType !== \"signup\" &&\n this.config.authType !== \"login\"\n ) {\n this.fail(new Error(\"Invalid authType\"));\n return;\n }\n\n if (!this.config.projectId) {\n this.fail(new Error(\"Missing projectId\"));\n return;\n }\n\n if (!this.config.publicKey) {\n this.fail(new Error(\"Missing publicKey\"));\n return;\n }\n if (this.stateMachine.current !== \"idle\") return;\n\n this.resetSession();\n clearAuthSession();\n this.stateMachine.transition(\"initializing\");\n\n try {\n // Generate session credentials\n this.sessionKey = this.crypto.generateSymmetricKey();\n this.sessionId = crypto.randomUUID() + crypto.randomUUID();\n\n // Decide: WebSocket (QR) or Deep Link\n this.useWebSocket = this.shouldUseWebSocket();\n\n if (this.useWebSocket) {\n await this.startWebSocketFlow();\n } else {\n await this.startDeepLinkFlow();\n }\n } catch (err) {\n this.fail(err instanceof Error ? err : new Error(\"Start failed\"));\n }\n }\n\n stop() {\n this.terminate(false);\n }\n\n openWebAuth() {\n if (!this.sessionKey || !this.sessionId) {\n this.fail(\n new Error(\"No active session. Call start() before openWebAuth().\"),\n );\n return;\n }\n\n const openerOrigin = window.location.origin;\n\n const urlParams = new URLSearchParams({\n projectId: this.config.projectId,\n publicKey: this.config.publicKey,\n authType: this.config.authType,\n sessionId: this.sessionId,\n sessionKey: this.sessionKey,\n origin: openerOrigin,\n });\n\n const authUrl = `https://vault.pelicanidentity.com/auth?${urlParams.toString()}`;\n\n // Try popup first, fall back to new tab if blocked\n const authWindow =\n window.open(\n authUrl,\n \"pelican-auth\",\n \"width=480,height=640,left=400,top=100,resizable=no,scrollbars=no\",\n ) ?? window.open(authUrl, \"_blank\");\n\n if (!authWindow) {\n // Both popup and new tab blocked — nothing we can do\n this.fail(\n new Error(\n \"Unable to open authentication window. Please allow popups for this site and try again.\",\n ),\n );\n return;\n }\n\n this.detachVisibilityRecovery();\n this.transport?.close();\n this.transport = undefined;\n\n authWindow.focus();\n this.stateMachine.transition(\"awaiting-pair\");\n\n const cleanup = () => {\n window.removeEventListener(\"message\", handleMessage);\n clearInterval(closedPoller);\n };\n\n const handleMessage = (event: MessageEvent) => {\n // Only accept messages from the vault — prevents origin spoofing\n if (event.origin !== \"https://vault.pelicanidentity.com\") return;\n\n // Ensure message came from the specific window we opened\n // Works for both popup and new tab since window.opener is preserved either way\n if (event.source !== authWindow) return;\n\n const { type, payload } = event.data ?? {};\n\n if (type === \"pelican-auth-success\") {\n console.log(\"Web auth success\");\n cleanup();\n\n if (!payload?.cipher || !payload?.nonce) {\n this.fail(new Error(\"Invalid web auth payload\"));\n this.restartIfContinuous();\n return;\n }\n\n try {\n const decrypted = this.crypto.decryptSymmetric({\n encrypted: { cipher: payload.cipher, nonce: payload.nonce },\n keyString: this.sessionKey!,\n });\n\n if (!decrypted) {\n this.fail(new Error(\"Failed to decrypt web auth response\"));\n this.restartIfContinuous();\n return;\n }\n\n const result: IdentityResult = JSON.parse(decrypted);\n this.emit(\"success\", result);\n this.stateMachine.transition(\"authenticated\");\n this.restartIfContinuous();\n } catch {\n this.fail(new Error(\"Failed to decrypt web auth response\"));\n this.restartIfContinuous();\n }\n }\n\n if (type === \"pelican-auth-cancelled\") {\n cleanup();\n this.fail(new Error(\"Authentication cancelled\"));\n this.restartIfContinuous();\n }\n\n if (type === \"pelican-auth-error\") {\n cleanup();\n this.fail(new Error(payload?.message ?? \"Web auth failed\"));\n this.restartIfContinuous();\n }\n };\n\n window.addEventListener(\"message\", handleMessage);\n\n // Poll for manual close — works for both popup and new tab\n // New tab edge case: if user navigates away without closing, closed stays false\n // until they actually close the tab — acceptable tradeoff vs hard failing\n const closedPoller = setInterval(() => {\n if (!authWindow.closed) return;\n cleanup();\n if (\n ![\"authenticated\", \"confirmed\", \"error\"].includes(\n this.stateMachine.current,\n )\n ) {\n this.fail(new Error(\"Authentication window closed\"));\n this.restartIfContinuous();\n }\n }, 500);\n }\n\n destroy() {\n this.detachVisibilityRecovery();\n this.clearBackupCheck();\n this.transport?.close();\n this.transport = undefined;\n this.listeners = {};\n }\n\n useQrInstead() {\n this.useWebSocket = true;\n\n this.emit(\"deeplink\", \"\");\n this.stateMachine.transition(\"initializing\");\n this.startWebSocketFlow();\n }\n\n useDeepLinkInstead() {\n this.useWebSocket = false;\n this.stateMachine.transition(\"initializing\");\n this.startDeepLinkFlow();\n }\n /* -------------------- Flow Selection -------------------- */\n\n private shouldUseWebSocket(): boolean {\n const userAgent = navigator.userAgent;\n\n const isTablet = /(iPad|Android(?!.*Mobile))/i.test(userAgent);\n const isMobile =\n /Android|webOS|iPhone|iPod|BlackBerry|IEMobile|Opera Mini/i.test(\n userAgent,\n );\n\n const useWebSocket = isMobile && !isTablet;\n return this.config.forceQRCode || !useWebSocket;\n }\n\n /* -------------------- WebSocket Flow (QR Code) -------------------- */\n\n private async startWebSocketFlow() {\n const { relayUrl, deeplinkUrl } = await this.fetchRelayUrl();\n\n this.transport = new Transport({\n onOpen: () => {\n this.transport!.send({\n type: \"register\",\n sessionID: this.sessionId,\n ...this.config,\n });\n this.stateMachine.transition(\"awaiting-pair\");\n },\n onMessage: (msg: ISocketMessage) => this.handleWebSocketMessage(msg),\n onError: (err) => {\n console.error(\"WebSocket error:\", err);\n this.fail(new Error(\"WebSocket connection failed\"));\n },\n });\n\n this.transport.connect(relayUrl);\n await this.emitQRCode(deeplinkUrl);\n }\n\n private handleWebSocketMessage(msg: ISocketMessage) {\n switch (msg.type) {\n case \"paired\":\n this.stateMachine.transition(\"paired\");\n this.transport!.send({\n type: \"authenticate\",\n sessionID: this.sessionId,\n ...this.config,\n url: window.location.href,\n });\n return;\n\n case \"phone-auth-success\":\n this.handleAuthSuccess(msg);\n return;\n\n case \"phone-terminated\":\n this.fail(new Error(\"Authentication cancelled on device\"));\n this.restartIfContinuous();\n return;\n\n case \"confirmed\":\n this.terminate(true);\n this.restartIfContinuous();\n return;\n }\n }\n\n private handleAuthSuccess(msg: ISocketMessage) {\n if (!this.sessionKey || !msg.cipher || !msg.nonce) {\n this.fail(new Error(\"Invalid authentication payload\"));\n this.restartIfContinuous();\n return;\n }\n\n try {\n const decrypted = this.crypto.decryptSymmetric({\n encrypted: { cipher: msg.cipher, nonce: msg.nonce },\n keyString: this.sessionKey,\n });\n\n if (!decrypted) {\n this.fail(new Error(\"Invalid authentication data\"));\n this.restartIfContinuous();\n return;\n }\n\n const result: IdentityResult = JSON.parse(decrypted);\n\n this.emit(\"success\", result);\n this.stateMachine.transition(\"authenticated\");\n\n // Confirm receipt\n this.transport?.send({\n type: \"confirm\",\n sessionID: this.sessionId,\n });\n } catch {\n this.fail(new Error(\"Failed to decrypt authentication data\"));\n this.restartIfContinuous();\n }\n }\n\n /* -------------------- Deep Link Flow (Mobile) -------------------- */\n\n private async startDeepLinkFlow() {\n const { deeplinkUrl } = await this.fetchRelayUrl();\n\n if (this.sessionKey) {\n storeAuthSession(this.sessionId, this.sessionKey, 10 * 60_000); // 10 min TTL\n }\n\n await this.emitDeepLink(deeplinkUrl);\n this.deeplinkUrl = deeplinkUrl;\n\n this.stateMachine.transition(\"awaiting-pair\");\n }\n\n public openDeepLink() {\n if (!this.deeplinkUrl) {\n this.fail(new Error(\"Deep link not found\"));\n return;\n }\n\n this.attachVisibilityRecovery();\n\n const userAgent = navigator.userAgent;\n let fallbackUrl = FALLBACK_URL;\n\n if (/iPad|iPhone|iPod/.test(userAgent)) {\n fallbackUrl = APPLE_APP_STORE_URL;\n } else if (/android/i.test(userAgent)) {\n fallbackUrl = PLAY_STORE_URL;\n }\n\n const start = Date.now();\n window.location.href = this.deeplinkUrl;\n\n setTimeout(() => {\n // Increased to 3 seconds for better UX/Reliability\n // We check if the elapsed time is less than 3500ms\n // to ensure the tab hasn't been suspended/backgrounded.\n if (Date.now() - start < 3500) {\n window.location.href = fallbackUrl;\n }\n }, 3000);\n }\n\n private clearBackupCheck() {\n if (this.backupCheckTimeout) {\n clearTimeout(this.backupCheckTimeout);\n this.backupCheckTimeout = undefined;\n }\n }\n\n private async checkSession() {\n const cached = getAuthSession();\n if (!cached) {\n this.fail(new Error(\"Authentication session not found\"));\n this.restartIfContinuous();\n return;\n }\n\n this.stateMachine.transition(\"awaiting-auth\");\n try {\n const res = await fetch(\n `${BASEURL}/session?session_id=${cached.sessionId}`,\n );\n\n // Session not ready yet\n if (!res.ok) {\n this.fail(new Error(\"Session not found\"));\n this.restartIfContinuous();\n return;\n }\n\n const data = await res.json();\n const decrypted = this.crypto.decryptSymmetric({\n encrypted: { cipher: data.cipher, nonce: data.nonce },\n keyString: cached.sessionKey,\n });\n\n if (!decrypted) {\n console.warn(\"Failed to decrypt session\");\n this.fail(new Error(\"Failed to decrypt session\"));\n this.restartIfContinuous();\n return;\n }\n\n const result: IdentityResult = JSON.parse(decrypted);\n\n // Success!\n this.clearBackupCheck();\n clearAuthSession();\n\n this.emit(\"success\", result);\n this.stateMachine.transition(\"authenticated\");\n\n // In continuous mode, restart after delay\n if (this.config.continuousMode) {\n setTimeout(() => {\n this.stateMachine.transition(\"idle\");\n this.start();\n }, 1500);\n } else {\n this.stateMachine.transition(\"idle\");\n }\n } catch (err) {\n console.debug(\"Session check failed:\", err);\n this.fail(new Error(\"Session check failed\"));\n this.restartIfContinuous();\n return;\n }\n }\n\n /* -------------------- Entry Point Generation -------------------- */\n\n private async emitQRCode(deeplinkUrl: string) {\n const embeddedUrl = `${deeplinkUrl}?sessionID=${encodeURIComponent(\n this.sessionId,\n )}&sessionKey=${encodeURIComponent(\n this.sessionKey!,\n )}&publicKey=${encodeURIComponent(this.config.publicKey)}&authType=${\n this.config.authType\n }&projectId=${encodeURIComponent(this.config.projectId)}`;\n\n const qr = await QRCode.toDataURL(embeddedUrl, {\n type: \"image/png\",\n scale: 3,\n color: { light: \"#ffffff\", dark: \"#424242ff\" },\n });\n\n this.emit(\"qr\", qr);\n }\n\n private async emitDeepLink(deeplinkUrl: string) {\n const deeplink = `${deeplinkUrl}?sessionID=${encodeURIComponent(\n this.sessionId,\n )}&sessionKey=${encodeURIComponent(\n this.sessionKey!,\n )}&publicKey=${encodeURIComponent(this.config.publicKey)}&authType=${\n this.config.authType\n }&projectId=${encodeURIComponent(this.config.projectId)}`;\n\n this.emit(\"deeplink\", deeplink);\n }\n\n /* -------------------- Visibility Recovery -------------------- */\n\n public attachVisibilityRecovery() {\n let fired = false;\n this.visibilityHandler = async () => {\n if (document.visibilityState !== \"visible\") return;\n\n // Only check for deep link flow\n if (this.useWebSocket) return;\n\n if (fired) return;\n fired = true;\n\n // Check session when page becomes visible\n await this.checkSession();\n };\n\n document.addEventListener(\"visibilitychange\", this.visibilityHandler);\n }\n\n private detachVisibilityRecovery() {\n if (this.visibilityHandler) {\n document.removeEventListener(\"visibilitychange\", this.visibilityHandler);\n this.visibilityHandler = undefined;\n }\n }\n\n /* -------------------- Helpers -------------------- */\n\n private async fetchRelayUrl(): Promise<{\n deeplinkUrl: string;\n relayUrl: string;\n }> {\n const { publicKey, projectId, authType } = this.config;\n const res = await fetch(\n `${BASEURL}/relay?public_key=${publicKey}&auth_type=${authType}&project_id=${projectId}`,\n );\n\n if (!res.ok) {\n const error = await res.text();\n throw new Error(error);\n }\n\n const json = await res.json();\n return { deeplinkUrl: json.deeplink_url, relayUrl: json.relay_url };\n }\n\n private terminate(success: boolean) {\n // Clear backup check\n this.clearBackupCheck();\n\n // Close WebSocket if active\n if (this.transport) {\n if (!success) {\n this.transport.send({\n type: \"client-terminated\",\n sessionID: this.sessionId,\n projectId: this.config.projectId,\n publicKey: this.config.publicKey,\n authType: this.config.authType,\n });\n }\n this.transport.close();\n this.transport = undefined;\n }\n\n clearAuthSession();\n this.resetSession();\n\n if (!this.config.continuousMode) {\n this.detachVisibilityRecovery();\n }\n\n this.stateMachine.transition(success ? \"confirmed\" : \"idle\");\n }\n\n private restartIfContinuous() {\n if (this.config.continuousMode) {\n this.stateMachine.transition(\"idle\");\n this.clearBackupCheck();\n this.transport?.close();\n this.transport = undefined;\n setTimeout(() => {\n this.start();\n }, 150);\n } else {\n this.stateMachine.transition(\"idle\");\n }\n }\n\n private resetSession() {\n this.sessionId = \"\";\n this.sessionKey = null;\n }\n\n private emit<K extends keyof PelicanAuthEventMap>(\n event: K,\n payload: PelicanAuthEventMap[K],\n ) {\n this.listeners[event]?.forEach((cb) => cb(payload));\n }\n\n private fail(err: Error) {\n this.emit(\"error\", err);\n this.stateMachine.transition(\"error\");\n }\n}\n"]}
|