@pelican-identity/auth-core 1.2.43 → 1.2.45
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 +62 -37
- package/dist/engine/engine.js.map +1 -1
- package/dist/index.d.mts +8 -1
- package/dist/index.d.ts +8 -1
- package/dist/index.js +67 -38
- package/dist/index.js.map +1 -1
- package/dist/index.mjs +67 -38
- 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;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;
|
|
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;IACzC,OAAO,CAAC,QAAQ,CAAC,oBAAoB,CAAiB;IACtD,OAAO,CAAC,QAAQ,CAAC,aAAa,CAAQ;IACtC,OAAO,CAAC,QAAQ,CAAC,SAAS,CAAS;IACnC,OAAO,CAAC,gBAAgB,CAAa;IAErC,OAAO,CAAC,iBAAiB,CAAC,CAAa;IACvC,OAAO,CAAC,kBAAkB,CAAC,CAAS;IACpC,OAAO,CAAC,YAAY,CAAQ;IAC5B,OAAO,CAAC,WAAW,CAAuB;IAC1C,OAAO,CAAC,aAAa,CAA8C;IAEnE,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;IAYxB,YAAY;IA6BnB,OAAO,CAAC,gBAAgB;IAOxB,OAAO,CAAC,cAAc,CAA8C;YAEtD,YAAY;IAsE1B,OAAO,CAAC,WAAW;YASL,UAAU;YAkBV,YAAY;IAe1B,OAAO,CAAC,wBAAwB;IAuBhC,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
|
@@ -10,9 +10,15 @@ export class PelicanAuthentication {
|
|
|
10
10
|
this.stateMachine = new StateMachine();
|
|
11
11
|
this.sessionId = "";
|
|
12
12
|
this.sessionKey = null;
|
|
13
|
+
this.MAX_POLLING_DURATION = 2 * 60 * 1000;
|
|
14
|
+
this.INITIAL_DELAY = 2000;
|
|
15
|
+
this.MAX_DELAY = 10000;
|
|
16
|
+
this.pollingStartTime = 0;
|
|
13
17
|
this.useWebSocket = true;
|
|
14
18
|
this.deeplinkUrl = null;
|
|
19
|
+
this.fallbackTimer = null;
|
|
15
20
|
this.listeners = {};
|
|
21
|
+
this.pollingTimeout = null;
|
|
16
22
|
if (!config.publicKey)
|
|
17
23
|
throw new Error("Missing publicKey");
|
|
18
24
|
if (!config.projectId)
|
|
@@ -259,7 +265,6 @@ export class PelicanAuthentication {
|
|
|
259
265
|
storeAuthSession(this.sessionId, this.sessionKey, 10 * 60000);
|
|
260
266
|
}
|
|
261
267
|
await this.emitDeepLink(deeplinkUrl);
|
|
262
|
-
this.deeplinkUrl = deeplinkUrl;
|
|
263
268
|
this.stateMachine.transition("awaiting-pair");
|
|
264
269
|
}
|
|
265
270
|
openDeepLink() {
|
|
@@ -267,7 +272,6 @@ export class PelicanAuthentication {
|
|
|
267
272
|
this.fail(new Error("Deep link not found"));
|
|
268
273
|
return;
|
|
269
274
|
}
|
|
270
|
-
this.attachVisibilityRecovery();
|
|
271
275
|
const userAgent = navigator.userAgent;
|
|
272
276
|
let fallbackUrl = FALLBACK_URL;
|
|
273
277
|
if (/iPad|iPhone|iPod/.test(userAgent)) {
|
|
@@ -277,12 +281,17 @@ export class PelicanAuthentication {
|
|
|
277
281
|
fallbackUrl = PLAY_STORE_URL;
|
|
278
282
|
}
|
|
279
283
|
const start = Date.now();
|
|
280
|
-
|
|
281
|
-
setTimeout(() => {
|
|
284
|
+
this.fallbackTimer = setTimeout(() => {
|
|
282
285
|
if (Date.now() - start < 3500) {
|
|
283
286
|
window.location.href = fallbackUrl;
|
|
287
|
+
this.fail(new Error("Pelican Vault not installed on your device"));
|
|
288
|
+
setTimeout(() => {
|
|
289
|
+
this.terminate(false);
|
|
290
|
+
}, 2000);
|
|
284
291
|
}
|
|
285
292
|
}, 3000);
|
|
293
|
+
this.attachVisibilityRecovery();
|
|
294
|
+
window.location.href = this.deeplinkUrl;
|
|
286
295
|
}
|
|
287
296
|
clearBackupCheck() {
|
|
288
297
|
if (this.backupCheckTimeout) {
|
|
@@ -297,45 +306,56 @@ export class PelicanAuthentication {
|
|
|
297
306
|
this.restartIfContinuous();
|
|
298
307
|
return;
|
|
299
308
|
}
|
|
309
|
+
this.stopPolling();
|
|
310
|
+
this.pollingStartTime = Date.now();
|
|
300
311
|
this.stateMachine.transition("awaiting-auth");
|
|
301
|
-
|
|
302
|
-
|
|
303
|
-
if (
|
|
304
|
-
this.
|
|
305
|
-
this.
|
|
312
|
+
let currentDelay = this.INITIAL_DELAY;
|
|
313
|
+
const performCheck = async () => {
|
|
314
|
+
if (Date.now() - this.pollingStartTime > this.MAX_POLLING_DURATION) {
|
|
315
|
+
this.stopPolling();
|
|
316
|
+
this.fail(new Error("Authentication timed out. Please try again."));
|
|
306
317
|
return;
|
|
307
318
|
}
|
|
308
|
-
|
|
309
|
-
|
|
310
|
-
|
|
311
|
-
|
|
312
|
-
|
|
313
|
-
|
|
314
|
-
|
|
315
|
-
|
|
316
|
-
|
|
317
|
-
|
|
319
|
+
try {
|
|
320
|
+
const res = await fetch(`${BASEURL}/session?session_id=${cached.sessionId}`);
|
|
321
|
+
if (res.ok) {
|
|
322
|
+
const data = await res.json();
|
|
323
|
+
const decrypted = this.crypto.decryptSymmetric({
|
|
324
|
+
encrypted: { cipher: data.cipher, nonce: data.nonce },
|
|
325
|
+
keyString: cached.sessionKey,
|
|
326
|
+
});
|
|
327
|
+
if (!decrypted) {
|
|
328
|
+
this.stopPolling();
|
|
329
|
+
this.fail(new Error("Failed to decrypt session"));
|
|
330
|
+
return;
|
|
331
|
+
}
|
|
332
|
+
this.stopPolling();
|
|
333
|
+
this.clearBackupCheck();
|
|
334
|
+
clearAuthSession();
|
|
335
|
+
const result = JSON.parse(decrypted);
|
|
336
|
+
this.emit("success", result);
|
|
337
|
+
this.stateMachine.transition("authenticated");
|
|
338
|
+
this.restartIfContinuous();
|
|
339
|
+
return;
|
|
340
|
+
}
|
|
341
|
+
console.debug("Session not ready yet...");
|
|
318
342
|
}
|
|
319
|
-
|
|
320
|
-
|
|
321
|
-
clearAuthSession();
|
|
322
|
-
this.emit("success", result);
|
|
323
|
-
this.stateMachine.transition("authenticated");
|
|
324
|
-
if (this.config.continuousMode) {
|
|
325
|
-
setTimeout(() => {
|
|
326
|
-
this.stateMachine.transition("idle");
|
|
327
|
-
this.start();
|
|
328
|
-
}, 1500);
|
|
343
|
+
catch (err) {
|
|
344
|
+
console.debug("Network error during session check, retrying:", err);
|
|
329
345
|
}
|
|
330
|
-
|
|
331
|
-
this.
|
|
346
|
+
if (this.stateMachine.current === "awaiting-auth") {
|
|
347
|
+
this.pollingTimeout = setTimeout(() => {
|
|
348
|
+
currentDelay = Math.min(currentDelay * 1.5, this.MAX_DELAY);
|
|
349
|
+
performCheck();
|
|
350
|
+
}, currentDelay);
|
|
332
351
|
}
|
|
333
|
-
}
|
|
334
|
-
|
|
335
|
-
|
|
336
|
-
|
|
337
|
-
|
|
338
|
-
|
|
352
|
+
};
|
|
353
|
+
await performCheck();
|
|
354
|
+
}
|
|
355
|
+
stopPolling() {
|
|
356
|
+
if (this.pollingTimeout) {
|
|
357
|
+
clearTimeout(this.pollingTimeout);
|
|
358
|
+
this.pollingTimeout = null;
|
|
339
359
|
}
|
|
340
360
|
}
|
|
341
361
|
async emitQRCode(deeplinkUrl) {
|
|
@@ -349,11 +369,16 @@ export class PelicanAuthentication {
|
|
|
349
369
|
}
|
|
350
370
|
async emitDeepLink(deeplinkUrl) {
|
|
351
371
|
const deeplink = `${deeplinkUrl}?sessionID=${encodeURIComponent(this.sessionId)}&sessionKey=${encodeURIComponent(this.sessionKey)}&publicKey=${encodeURIComponent(this.config.publicKey)}&authType=${this.config.authType}&projectId=${encodeURIComponent(this.config.projectId)}`;
|
|
372
|
+
this.deeplinkUrl = deeplink;
|
|
352
373
|
this.emit("deeplink", deeplink);
|
|
353
374
|
}
|
|
354
375
|
attachVisibilityRecovery() {
|
|
355
376
|
let fired = false;
|
|
356
377
|
this.visibilityHandler = async () => {
|
|
378
|
+
if (this.fallbackTimer) {
|
|
379
|
+
clearTimeout(this.fallbackTimer);
|
|
380
|
+
this.fallbackTimer = null;
|
|
381
|
+
}
|
|
357
382
|
if (document.visibilityState !== "visible")
|
|
358
383
|
return;
|
|
359
384
|
if (this.useWebSocket)
|
|
@@ -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
|
@@ -116,10 +116,15 @@ declare class PelicanAuthentication {
|
|
|
116
116
|
private transport?;
|
|
117
117
|
private sessionId;
|
|
118
118
|
private sessionKey;
|
|
119
|
+
private readonly MAX_POLLING_DURATION;
|
|
120
|
+
private readonly INITIAL_DELAY;
|
|
121
|
+
private readonly MAX_DELAY;
|
|
122
|
+
private pollingStartTime;
|
|
119
123
|
private visibilityHandler?;
|
|
120
124
|
private backupCheckTimeout?;
|
|
121
125
|
private useWebSocket;
|
|
122
126
|
private deeplinkUrl;
|
|
127
|
+
private fallbackTimer;
|
|
123
128
|
private listeners;
|
|
124
129
|
private readonly config;
|
|
125
130
|
constructor(config: PelicanAuthConfig);
|
|
@@ -137,10 +142,12 @@ declare class PelicanAuthentication {
|
|
|
137
142
|
private startDeepLinkFlow;
|
|
138
143
|
openDeepLink(): void;
|
|
139
144
|
private clearBackupCheck;
|
|
145
|
+
private pollingTimeout;
|
|
140
146
|
private checkSession;
|
|
147
|
+
private stopPolling;
|
|
141
148
|
private emitQRCode;
|
|
142
149
|
private emitDeepLink;
|
|
143
|
-
attachVisibilityRecovery
|
|
150
|
+
private attachVisibilityRecovery;
|
|
144
151
|
private detachVisibilityRecovery;
|
|
145
152
|
private fetchRelayUrl;
|
|
146
153
|
private terminate;
|
package/dist/index.d.ts
CHANGED
|
@@ -116,10 +116,15 @@ declare class PelicanAuthentication {
|
|
|
116
116
|
private transport?;
|
|
117
117
|
private sessionId;
|
|
118
118
|
private sessionKey;
|
|
119
|
+
private readonly MAX_POLLING_DURATION;
|
|
120
|
+
private readonly INITIAL_DELAY;
|
|
121
|
+
private readonly MAX_DELAY;
|
|
122
|
+
private pollingStartTime;
|
|
119
123
|
private visibilityHandler?;
|
|
120
124
|
private backupCheckTimeout?;
|
|
121
125
|
private useWebSocket;
|
|
122
126
|
private deeplinkUrl;
|
|
127
|
+
private fallbackTimer;
|
|
123
128
|
private listeners;
|
|
124
129
|
private readonly config;
|
|
125
130
|
constructor(config: PelicanAuthConfig);
|
|
@@ -137,10 +142,12 @@ declare class PelicanAuthentication {
|
|
|
137
142
|
private startDeepLinkFlow;
|
|
138
143
|
openDeepLink(): void;
|
|
139
144
|
private clearBackupCheck;
|
|
145
|
+
private pollingTimeout;
|
|
140
146
|
private checkSession;
|
|
147
|
+
private stopPolling;
|
|
141
148
|
private emitQRCode;
|
|
142
149
|
private emitDeepLink;
|
|
143
|
-
attachVisibilityRecovery
|
|
150
|
+
private attachVisibilityRecovery;
|
|
144
151
|
private detachVisibilityRecovery;
|
|
145
152
|
private fetchRelayUrl;
|
|
146
153
|
private terminate;
|
package/dist/index.js
CHANGED
|
@@ -329,9 +329,18 @@ var PelicanAuthentication = class {
|
|
|
329
329
|
this.stateMachine = new StateMachine();
|
|
330
330
|
this.sessionId = "";
|
|
331
331
|
this.sessionKey = null;
|
|
332
|
+
this.MAX_POLLING_DURATION = 2 * 60 * 1e3;
|
|
333
|
+
// 2 Minutes total
|
|
334
|
+
this.INITIAL_DELAY = 2e3;
|
|
335
|
+
// Start at 2s
|
|
336
|
+
this.MAX_DELAY = 1e4;
|
|
337
|
+
// Cap at 10s
|
|
338
|
+
this.pollingStartTime = 0;
|
|
332
339
|
this.useWebSocket = true;
|
|
333
340
|
this.deeplinkUrl = null;
|
|
341
|
+
this.fallbackTimer = null;
|
|
334
342
|
this.listeners = {};
|
|
343
|
+
this.pollingTimeout = null;
|
|
335
344
|
if (!config.publicKey) throw new Error("Missing publicKey");
|
|
336
345
|
if (!config.projectId) throw new Error("Missing projectId");
|
|
337
346
|
if (!config.authType) throw new Error("Missing authType");
|
|
@@ -583,7 +592,6 @@ var PelicanAuthentication = class {
|
|
|
583
592
|
storeAuthSession(this.sessionId, this.sessionKey, 10 * 6e4);
|
|
584
593
|
}
|
|
585
594
|
await this.emitDeepLink(deeplinkUrl);
|
|
586
|
-
this.deeplinkUrl = deeplinkUrl;
|
|
587
595
|
this.stateMachine.transition("awaiting-pair");
|
|
588
596
|
}
|
|
589
597
|
openDeepLink() {
|
|
@@ -591,7 +599,6 @@ var PelicanAuthentication = class {
|
|
|
591
599
|
this.fail(new Error("Deep link not found"));
|
|
592
600
|
return;
|
|
593
601
|
}
|
|
594
|
-
this.attachVisibilityRecovery();
|
|
595
602
|
const userAgent = navigator.userAgent;
|
|
596
603
|
let fallbackUrl = FALLBACK_URL;
|
|
597
604
|
if (/iPad|iPhone|iPod/.test(userAgent)) {
|
|
@@ -600,12 +607,17 @@ var PelicanAuthentication = class {
|
|
|
600
607
|
fallbackUrl = PLAY_STORE_URL;
|
|
601
608
|
}
|
|
602
609
|
const start = Date.now();
|
|
603
|
-
|
|
604
|
-
setTimeout(() => {
|
|
610
|
+
this.fallbackTimer = setTimeout(() => {
|
|
605
611
|
if (Date.now() - start < 3500) {
|
|
606
612
|
window.location.href = fallbackUrl;
|
|
613
|
+
this.fail(new Error("Pelican Vault not installed on your device"));
|
|
614
|
+
setTimeout(() => {
|
|
615
|
+
this.terminate(false);
|
|
616
|
+
}, 2e3);
|
|
607
617
|
}
|
|
608
618
|
}, 3e3);
|
|
619
|
+
this.attachVisibilityRecovery();
|
|
620
|
+
window.location.href = this.deeplinkUrl;
|
|
609
621
|
}
|
|
610
622
|
clearBackupCheck() {
|
|
611
623
|
if (this.backupCheckTimeout) {
|
|
@@ -620,45 +632,57 @@ var PelicanAuthentication = class {
|
|
|
620
632
|
this.restartIfContinuous();
|
|
621
633
|
return;
|
|
622
634
|
}
|
|
635
|
+
this.stopPolling();
|
|
636
|
+
this.pollingStartTime = Date.now();
|
|
623
637
|
this.stateMachine.transition("awaiting-auth");
|
|
624
|
-
|
|
625
|
-
|
|
626
|
-
|
|
627
|
-
|
|
628
|
-
|
|
629
|
-
this.fail(new Error("Session not found"));
|
|
630
|
-
this.restartIfContinuous();
|
|
638
|
+
let currentDelay = this.INITIAL_DELAY;
|
|
639
|
+
const performCheck = async () => {
|
|
640
|
+
if (Date.now() - this.pollingStartTime > this.MAX_POLLING_DURATION) {
|
|
641
|
+
this.stopPolling();
|
|
642
|
+
this.fail(new Error("Authentication timed out. Please try again."));
|
|
631
643
|
return;
|
|
632
644
|
}
|
|
633
|
-
|
|
634
|
-
|
|
635
|
-
|
|
636
|
-
|
|
637
|
-
|
|
638
|
-
|
|
639
|
-
|
|
640
|
-
|
|
641
|
-
|
|
642
|
-
|
|
645
|
+
try {
|
|
646
|
+
const res = await fetch(
|
|
647
|
+
`${BASEURL}/session?session_id=${cached.sessionId}`
|
|
648
|
+
);
|
|
649
|
+
if (res.ok) {
|
|
650
|
+
const data = await res.json();
|
|
651
|
+
const decrypted = this.crypto.decryptSymmetric({
|
|
652
|
+
encrypted: { cipher: data.cipher, nonce: data.nonce },
|
|
653
|
+
keyString: cached.sessionKey
|
|
654
|
+
});
|
|
655
|
+
if (!decrypted) {
|
|
656
|
+
this.stopPolling();
|
|
657
|
+
this.fail(new Error("Failed to decrypt session"));
|
|
658
|
+
return;
|
|
659
|
+
}
|
|
660
|
+
this.stopPolling();
|
|
661
|
+
this.clearBackupCheck();
|
|
662
|
+
clearAuthSession();
|
|
663
|
+
const result = JSON.parse(decrypted);
|
|
664
|
+
this.emit("success", result);
|
|
665
|
+
this.stateMachine.transition("authenticated");
|
|
666
|
+
this.restartIfContinuous();
|
|
667
|
+
return;
|
|
668
|
+
}
|
|
669
|
+
console.debug("Session not ready yet...");
|
|
670
|
+
} catch (err) {
|
|
671
|
+
console.debug("Network error during session check, retrying:", err);
|
|
643
672
|
}
|
|
644
|
-
|
|
645
|
-
|
|
646
|
-
|
|
647
|
-
|
|
648
|
-
|
|
649
|
-
if (this.config.continuousMode) {
|
|
650
|
-
setTimeout(() => {
|
|
651
|
-
this.stateMachine.transition("idle");
|
|
652
|
-
this.start();
|
|
653
|
-
}, 1500);
|
|
654
|
-
} else {
|
|
655
|
-
this.stateMachine.transition("idle");
|
|
673
|
+
if (this.stateMachine.current === "awaiting-auth") {
|
|
674
|
+
this.pollingTimeout = setTimeout(() => {
|
|
675
|
+
currentDelay = Math.min(currentDelay * 1.5, this.MAX_DELAY);
|
|
676
|
+
performCheck();
|
|
677
|
+
}, currentDelay);
|
|
656
678
|
}
|
|
657
|
-
}
|
|
658
|
-
|
|
659
|
-
|
|
660
|
-
|
|
661
|
-
|
|
679
|
+
};
|
|
680
|
+
await performCheck();
|
|
681
|
+
}
|
|
682
|
+
stopPolling() {
|
|
683
|
+
if (this.pollingTimeout) {
|
|
684
|
+
clearTimeout(this.pollingTimeout);
|
|
685
|
+
this.pollingTimeout = null;
|
|
662
686
|
}
|
|
663
687
|
}
|
|
664
688
|
/* -------------------- Entry Point Generation -------------------- */
|
|
@@ -681,12 +705,17 @@ var PelicanAuthentication = class {
|
|
|
681
705
|
)}&sessionKey=${encodeURIComponent(
|
|
682
706
|
this.sessionKey
|
|
683
707
|
)}&publicKey=${encodeURIComponent(this.config.publicKey)}&authType=${this.config.authType}&projectId=${encodeURIComponent(this.config.projectId)}`;
|
|
708
|
+
this.deeplinkUrl = deeplink;
|
|
684
709
|
this.emit("deeplink", deeplink);
|
|
685
710
|
}
|
|
686
711
|
/* -------------------- Visibility Recovery -------------------- */
|
|
687
712
|
attachVisibilityRecovery() {
|
|
688
713
|
let fired = false;
|
|
689
714
|
this.visibilityHandler = async () => {
|
|
715
|
+
if (this.fallbackTimer) {
|
|
716
|
+
clearTimeout(this.fallbackTimer);
|
|
717
|
+
this.fallbackTimer = null;
|
|
718
|
+
}
|
|
690
719
|
if (document.visibilityState !== "visible") return;
|
|
691
720
|
if (this.useWebSocket) return;
|
|
692
721
|
if (fired) return;
|
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\";\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"]}
|
|
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 private readonly MAX_POLLING_DURATION = 2 * 60 * 1000; // 2 Minutes total\n private readonly INITIAL_DELAY = 2000; // Start at 2s\n private readonly MAX_DELAY = 10000; // Cap at 10s\n private pollingStartTime: number = 0;\n\n private visibilityHandler?: () => void;\n private backupCheckTimeout?: number;\n private useWebSocket = true;\n private deeplinkUrl: string | null = null;\n private fallbackTimer: ReturnType<typeof setTimeout> | 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\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 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\n this.fallbackTimer = setTimeout(() => {\n if (Date.now() - start < 3500) {\n window.location.href = fallbackUrl;\n this.fail(new Error(\"Pelican Vault not installed on your device\"));\n setTimeout(() => {\n this.terminate(false);\n }, 2000);\n }\n }, 3000);\n this.attachVisibilityRecovery();\n window.location.href = this.deeplinkUrl;\n }\n\n private clearBackupCheck() {\n if (this.backupCheckTimeout) {\n clearTimeout(this.backupCheckTimeout);\n this.backupCheckTimeout = undefined;\n }\n }\n\n private pollingTimeout: ReturnType<typeof setTimeout> | null = null;\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 // 1. Reset state for a fresh polling cycle\n this.stopPolling();\n this.pollingStartTime = Date.now();\n this.stateMachine.transition(\"awaiting-auth\");\n\n let currentDelay = this.INITIAL_DELAY;\n\n const performCheck = async () => {\n // 2. Check for global timeout (2 minutes)\n if (Date.now() - this.pollingStartTime > this.MAX_POLLING_DURATION) {\n this.stopPolling();\n this.fail(new Error(\"Authentication timed out. Please try again.\"));\n return;\n }\n\n try {\n const res = await fetch(\n `${BASEURL}/session?session_id=${cached.sessionId}`,\n );\n\n if (res.ok) {\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 this.stopPolling();\n this.fail(new Error(\"Failed to decrypt session\"));\n return;\n }\n\n // Success Path\n this.stopPolling();\n this.clearBackupCheck();\n clearAuthSession();\n\n const result: IdentityResult = JSON.parse(decrypted);\n this.emit(\"success\", result);\n this.stateMachine.transition(\"authenticated\");\n this.restartIfContinuous();\n return; // Loop terminates here\n }\n\n // If res.ok is false (404/400), we do nothing and fall through to the next timeout\n console.debug(\"Session not ready yet...\");\n } catch (err) {\n console.debug(\"Network error during session check, retrying:\", err);\n }\n\n // 3. Schedule the NEXT check with backoff (Only if still awaiting-auth)\n if (this.stateMachine.current === \"awaiting-auth\") {\n this.pollingTimeout = setTimeout(() => {\n currentDelay = Math.min(currentDelay * 1.5, this.MAX_DELAY);\n performCheck();\n }, currentDelay);\n }\n };\n await performCheck();\n }\n\n private stopPolling() {\n if (this.pollingTimeout) {\n clearTimeout(this.pollingTimeout);\n this.pollingTimeout = null;\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.deeplinkUrl = deeplink;\n this.emit(\"deeplink\", deeplink);\n }\n\n /* -------------------- Visibility Recovery -------------------- */\n\n private attachVisibilityRecovery() {\n let fired = false;\n this.visibilityHandler = async () => {\n if (this.fallbackTimer) {\n clearTimeout(this.fallbackTimer);\n this.fallbackTimer = null;\n }\n\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
|
@@ -322,9 +322,18 @@ var PelicanAuthentication = class {
|
|
|
322
322
|
this.stateMachine = new StateMachine();
|
|
323
323
|
this.sessionId = "";
|
|
324
324
|
this.sessionKey = null;
|
|
325
|
+
this.MAX_POLLING_DURATION = 2 * 60 * 1e3;
|
|
326
|
+
// 2 Minutes total
|
|
327
|
+
this.INITIAL_DELAY = 2e3;
|
|
328
|
+
// Start at 2s
|
|
329
|
+
this.MAX_DELAY = 1e4;
|
|
330
|
+
// Cap at 10s
|
|
331
|
+
this.pollingStartTime = 0;
|
|
325
332
|
this.useWebSocket = true;
|
|
326
333
|
this.deeplinkUrl = null;
|
|
334
|
+
this.fallbackTimer = null;
|
|
327
335
|
this.listeners = {};
|
|
336
|
+
this.pollingTimeout = null;
|
|
328
337
|
if (!config.publicKey) throw new Error("Missing publicKey");
|
|
329
338
|
if (!config.projectId) throw new Error("Missing projectId");
|
|
330
339
|
if (!config.authType) throw new Error("Missing authType");
|
|
@@ -576,7 +585,6 @@ var PelicanAuthentication = class {
|
|
|
576
585
|
storeAuthSession(this.sessionId, this.sessionKey, 10 * 6e4);
|
|
577
586
|
}
|
|
578
587
|
await this.emitDeepLink(deeplinkUrl);
|
|
579
|
-
this.deeplinkUrl = deeplinkUrl;
|
|
580
588
|
this.stateMachine.transition("awaiting-pair");
|
|
581
589
|
}
|
|
582
590
|
openDeepLink() {
|
|
@@ -584,7 +592,6 @@ var PelicanAuthentication = class {
|
|
|
584
592
|
this.fail(new Error("Deep link not found"));
|
|
585
593
|
return;
|
|
586
594
|
}
|
|
587
|
-
this.attachVisibilityRecovery();
|
|
588
595
|
const userAgent = navigator.userAgent;
|
|
589
596
|
let fallbackUrl = FALLBACK_URL;
|
|
590
597
|
if (/iPad|iPhone|iPod/.test(userAgent)) {
|
|
@@ -593,12 +600,17 @@ var PelicanAuthentication = class {
|
|
|
593
600
|
fallbackUrl = PLAY_STORE_URL;
|
|
594
601
|
}
|
|
595
602
|
const start = Date.now();
|
|
596
|
-
|
|
597
|
-
setTimeout(() => {
|
|
603
|
+
this.fallbackTimer = setTimeout(() => {
|
|
598
604
|
if (Date.now() - start < 3500) {
|
|
599
605
|
window.location.href = fallbackUrl;
|
|
606
|
+
this.fail(new Error("Pelican Vault not installed on your device"));
|
|
607
|
+
setTimeout(() => {
|
|
608
|
+
this.terminate(false);
|
|
609
|
+
}, 2e3);
|
|
600
610
|
}
|
|
601
611
|
}, 3e3);
|
|
612
|
+
this.attachVisibilityRecovery();
|
|
613
|
+
window.location.href = this.deeplinkUrl;
|
|
602
614
|
}
|
|
603
615
|
clearBackupCheck() {
|
|
604
616
|
if (this.backupCheckTimeout) {
|
|
@@ -613,45 +625,57 @@ var PelicanAuthentication = class {
|
|
|
613
625
|
this.restartIfContinuous();
|
|
614
626
|
return;
|
|
615
627
|
}
|
|
628
|
+
this.stopPolling();
|
|
629
|
+
this.pollingStartTime = Date.now();
|
|
616
630
|
this.stateMachine.transition("awaiting-auth");
|
|
617
|
-
|
|
618
|
-
|
|
619
|
-
|
|
620
|
-
|
|
621
|
-
|
|
622
|
-
this.fail(new Error("Session not found"));
|
|
623
|
-
this.restartIfContinuous();
|
|
631
|
+
let currentDelay = this.INITIAL_DELAY;
|
|
632
|
+
const performCheck = async () => {
|
|
633
|
+
if (Date.now() - this.pollingStartTime > this.MAX_POLLING_DURATION) {
|
|
634
|
+
this.stopPolling();
|
|
635
|
+
this.fail(new Error("Authentication timed out. Please try again."));
|
|
624
636
|
return;
|
|
625
637
|
}
|
|
626
|
-
|
|
627
|
-
|
|
628
|
-
|
|
629
|
-
|
|
630
|
-
|
|
631
|
-
|
|
632
|
-
|
|
633
|
-
|
|
634
|
-
|
|
635
|
-
|
|
638
|
+
try {
|
|
639
|
+
const res = await fetch(
|
|
640
|
+
`${BASEURL}/session?session_id=${cached.sessionId}`
|
|
641
|
+
);
|
|
642
|
+
if (res.ok) {
|
|
643
|
+
const data = await res.json();
|
|
644
|
+
const decrypted = this.crypto.decryptSymmetric({
|
|
645
|
+
encrypted: { cipher: data.cipher, nonce: data.nonce },
|
|
646
|
+
keyString: cached.sessionKey
|
|
647
|
+
});
|
|
648
|
+
if (!decrypted) {
|
|
649
|
+
this.stopPolling();
|
|
650
|
+
this.fail(new Error("Failed to decrypt session"));
|
|
651
|
+
return;
|
|
652
|
+
}
|
|
653
|
+
this.stopPolling();
|
|
654
|
+
this.clearBackupCheck();
|
|
655
|
+
clearAuthSession();
|
|
656
|
+
const result = JSON.parse(decrypted);
|
|
657
|
+
this.emit("success", result);
|
|
658
|
+
this.stateMachine.transition("authenticated");
|
|
659
|
+
this.restartIfContinuous();
|
|
660
|
+
return;
|
|
661
|
+
}
|
|
662
|
+
console.debug("Session not ready yet...");
|
|
663
|
+
} catch (err) {
|
|
664
|
+
console.debug("Network error during session check, retrying:", err);
|
|
636
665
|
}
|
|
637
|
-
|
|
638
|
-
|
|
639
|
-
|
|
640
|
-
|
|
641
|
-
|
|
642
|
-
if (this.config.continuousMode) {
|
|
643
|
-
setTimeout(() => {
|
|
644
|
-
this.stateMachine.transition("idle");
|
|
645
|
-
this.start();
|
|
646
|
-
}, 1500);
|
|
647
|
-
} else {
|
|
648
|
-
this.stateMachine.transition("idle");
|
|
666
|
+
if (this.stateMachine.current === "awaiting-auth") {
|
|
667
|
+
this.pollingTimeout = setTimeout(() => {
|
|
668
|
+
currentDelay = Math.min(currentDelay * 1.5, this.MAX_DELAY);
|
|
669
|
+
performCheck();
|
|
670
|
+
}, currentDelay);
|
|
649
671
|
}
|
|
650
|
-
}
|
|
651
|
-
|
|
652
|
-
|
|
653
|
-
|
|
654
|
-
|
|
672
|
+
};
|
|
673
|
+
await performCheck();
|
|
674
|
+
}
|
|
675
|
+
stopPolling() {
|
|
676
|
+
if (this.pollingTimeout) {
|
|
677
|
+
clearTimeout(this.pollingTimeout);
|
|
678
|
+
this.pollingTimeout = null;
|
|
655
679
|
}
|
|
656
680
|
}
|
|
657
681
|
/* -------------------- Entry Point Generation -------------------- */
|
|
@@ -674,12 +698,17 @@ var PelicanAuthentication = class {
|
|
|
674
698
|
)}&sessionKey=${encodeURIComponent(
|
|
675
699
|
this.sessionKey
|
|
676
700
|
)}&publicKey=${encodeURIComponent(this.config.publicKey)}&authType=${this.config.authType}&projectId=${encodeURIComponent(this.config.projectId)}`;
|
|
701
|
+
this.deeplinkUrl = deeplink;
|
|
677
702
|
this.emit("deeplink", deeplink);
|
|
678
703
|
}
|
|
679
704
|
/* -------------------- Visibility Recovery -------------------- */
|
|
680
705
|
attachVisibilityRecovery() {
|
|
681
706
|
let fired = false;
|
|
682
707
|
this.visibilityHandler = async () => {
|
|
708
|
+
if (this.fallbackTimer) {
|
|
709
|
+
clearTimeout(this.fallbackTimer);
|
|
710
|
+
this.fallbackTimer = null;
|
|
711
|
+
}
|
|
683
712
|
if (document.visibilityState !== "visible") return;
|
|
684
713
|
if (this.useWebSocket) return;
|
|
685
714
|
if (fired) return;
|
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\";\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"]}
|
|
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 private readonly MAX_POLLING_DURATION = 2 * 60 * 1000; // 2 Minutes total\n private readonly INITIAL_DELAY = 2000; // Start at 2s\n private readonly MAX_DELAY = 10000; // Cap at 10s\n private pollingStartTime: number = 0;\n\n private visibilityHandler?: () => void;\n private backupCheckTimeout?: number;\n private useWebSocket = true;\n private deeplinkUrl: string | null = null;\n private fallbackTimer: ReturnType<typeof setTimeout> | 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\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 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\n this.fallbackTimer = setTimeout(() => {\n if (Date.now() - start < 3500) {\n window.location.href = fallbackUrl;\n this.fail(new Error(\"Pelican Vault not installed on your device\"));\n setTimeout(() => {\n this.terminate(false);\n }, 2000);\n }\n }, 3000);\n this.attachVisibilityRecovery();\n window.location.href = this.deeplinkUrl;\n }\n\n private clearBackupCheck() {\n if (this.backupCheckTimeout) {\n clearTimeout(this.backupCheckTimeout);\n this.backupCheckTimeout = undefined;\n }\n }\n\n private pollingTimeout: ReturnType<typeof setTimeout> | null = null;\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 // 1. Reset state for a fresh polling cycle\n this.stopPolling();\n this.pollingStartTime = Date.now();\n this.stateMachine.transition(\"awaiting-auth\");\n\n let currentDelay = this.INITIAL_DELAY;\n\n const performCheck = async () => {\n // 2. Check for global timeout (2 minutes)\n if (Date.now() - this.pollingStartTime > this.MAX_POLLING_DURATION) {\n this.stopPolling();\n this.fail(new Error(\"Authentication timed out. Please try again.\"));\n return;\n }\n\n try {\n const res = await fetch(\n `${BASEURL}/session?session_id=${cached.sessionId}`,\n );\n\n if (res.ok) {\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 this.stopPolling();\n this.fail(new Error(\"Failed to decrypt session\"));\n return;\n }\n\n // Success Path\n this.stopPolling();\n this.clearBackupCheck();\n clearAuthSession();\n\n const result: IdentityResult = JSON.parse(decrypted);\n this.emit(\"success\", result);\n this.stateMachine.transition(\"authenticated\");\n this.restartIfContinuous();\n return; // Loop terminates here\n }\n\n // If res.ok is false (404/400), we do nothing and fall through to the next timeout\n console.debug(\"Session not ready yet...\");\n } catch (err) {\n console.debug(\"Network error during session check, retrying:\", err);\n }\n\n // 3. Schedule the NEXT check with backoff (Only if still awaiting-auth)\n if (this.stateMachine.current === \"awaiting-auth\") {\n this.pollingTimeout = setTimeout(() => {\n currentDelay = Math.min(currentDelay * 1.5, this.MAX_DELAY);\n performCheck();\n }, currentDelay);\n }\n };\n await performCheck();\n }\n\n private stopPolling() {\n if (this.pollingTimeout) {\n clearTimeout(this.pollingTimeout);\n this.pollingTimeout = null;\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.deeplinkUrl = deeplink;\n this.emit(\"deeplink\", deeplink);\n }\n\n /* -------------------- Visibility Recovery -------------------- */\n\n private attachVisibilityRecovery() {\n let fired = false;\n this.visibilityHandler = async () => {\n if (this.fallbackTimer) {\n clearTimeout(this.fallbackTimer);\n this.fallbackTimer = null;\n }\n\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"]}
|