@pelican-identity/auth-core 1.2.40 → 1.2.42

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -0,0 +1,5 @@
1
+ export declare const BASEURL = "https://identityapi.pelicanidentity.com";
2
+ export declare const APPLE_APP_STORE_URL = "https://apps.apple.com/us/app/pelican-vault/id6755097751";
3
+ export declare const PLAY_STORE_URL = "https://play.google.com/store/apps/details?id=com.HeraculesDesignTechLtd.pelican";
4
+ export declare const FALLBACK_URL = "https://pelicanidentity.com/pelican-vault";
5
+ //# sourceMappingURL=constants.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"constants.d.ts","sourceRoot":"","sources":["../src/constants.ts"],"names":[],"mappings":"AAAA,eAAO,MAAM,OAAO,4CAA4C,CAAC;AACjE,eAAO,MAAM,mBAAmB,6DAC4B,CAAC;AAC7D,eAAO,MAAM,cAAc,qFACyD,CAAC;AACrF,eAAO,MAAM,YAAY,8CAA8C,CAAC"}
@@ -0,0 +1,5 @@
1
+ export const BASEURL = "https://identityapi.pelicanidentity.com";
2
+ export const APPLE_APP_STORE_URL = "https://apps.apple.com/us/app/pelican-vault/id6755097751";
3
+ export const PLAY_STORE_URL = "https://play.google.com/store/apps/details?id=com.HeraculesDesignTechLtd.pelican";
4
+ export const FALLBACK_URL = "https://pelicanidentity.com/pelican-vault";
5
+ //# sourceMappingURL=constants.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"constants.js","sourceRoot":"","sources":["../src/constants.ts"],"names":[],"mappings":"AAAA,MAAM,CAAC,MAAM,OAAO,GAAG,yCAAyC,CAAC;AACjE,MAAM,CAAC,MAAM,mBAAmB,GAC9B,0DAA0D,CAAC;AAC7D,MAAM,CAAC,MAAM,cAAc,GACzB,kFAAkF,CAAC;AACrF,MAAM,CAAC,MAAM,YAAY,GAAG,2CAA2C,CAAC"}
@@ -0,0 +1,43 @@
1
+ import { PelicanAuthConfig, PelicanAuthEventMap } from "../types/types";
2
+ type Listener<T> = (payload: T) => void;
3
+ export declare class PelicanAuthentication {
4
+ private readonly crypto;
5
+ private readonly stateMachine;
6
+ private transport?;
7
+ private sessionId;
8
+ private sessionKey;
9
+ private visibilityHandler?;
10
+ private backupCheckTimeout?;
11
+ private useWebSocket;
12
+ private deeplinkUrl;
13
+ private listeners;
14
+ private readonly config;
15
+ constructor(config: PelicanAuthConfig);
16
+ on<K extends keyof PelicanAuthEventMap>(event: K, cb: Listener<PelicanAuthEventMap[K]>): () => boolean;
17
+ start(): Promise<void>;
18
+ stop(): void;
19
+ openWebAuth(): void;
20
+ destroy(): void;
21
+ useQrInstead(): void;
22
+ useDeepLinkInstead(): void;
23
+ private shouldUseWebSocket;
24
+ private startWebSocketFlow;
25
+ private handleWebSocketMessage;
26
+ private handleAuthSuccess;
27
+ private startDeepLinkFlow;
28
+ openDeepLink(): void;
29
+ private clearBackupCheck;
30
+ private checkSession;
31
+ private emitQRCode;
32
+ private emitDeepLink;
33
+ attachVisibilityRecovery(): void;
34
+ private detachVisibilityRecovery;
35
+ private fetchRelayUrl;
36
+ private terminate;
37
+ private restartIfContinuous;
38
+ private resetSession;
39
+ private emit;
40
+ private fail;
41
+ }
42
+ export {};
43
+ //# sourceMappingURL=engine.d.ts.map
@@ -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;AAWxB,KAAK,QAAQ,CAAC,CAAC,IAAI,CAAC,OAAO,EAAE,CAAC,KAAK,IAAI,CAAC;AAQxC,qBAAa,qBAAqB;IAChC,OAAO,CAAC,QAAQ,CAAC,MAAM,CAAuB;IAC9C,OAAO,CAAC,QAAQ,CAAC,YAAY,CAAsB;IAEnD,OAAO,CAAC,SAAS,CAAC,CAAY;IAC9B,OAAO,CAAC,SAAS,CAAM;IACvB,OAAO,CAAC,UAAU,CAAuB;IAEzC,OAAO,CAAC,iBAAiB,CAAC,CAAa;IACvC,OAAO,CAAC,kBAAkB,CAAC,CAAS;IACpC,OAAO,CAAC,YAAY,CAAQ;IAE5B,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;IA+HX,OAAO;IAQP,YAAY;IAQZ,kBAAkB;IAOlB,OAAO,CAAC,kBAAkB;YAeZ,kBAAkB;IAuBhC,OAAO,CAAC,sBAAsB;IA4B9B,OAAO,CAAC,iBAAiB;YAqCX,iBAAiB;IAgB/B,OAAO,CAAC,gBAAgB;YAOV,YAAY;YAsEZ,UAAU;YAkBV,YAAY;IAc1B,OAAO,CAAC,wBAAwB;IAchC,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"}
1
+ {"version":3,"file":"engine.d.ts","sourceRoot":"","sources":["../../src/engine/engine.ts"],"names":[],"mappings":"AAEA,OAAO,EACL,iBAAiB,EACjB,mBAAmB,EAGpB,MAAM,gBAAgB,CAAC;AAgBxB,KAAK,QAAQ,CAAC,CAAC,IAAI,CAAC,OAAO,EAAE,CAAC,KAAK,IAAI,CAAC;AAQxC,qBAAa,qBAAqB;IAChC,OAAO,CAAC,QAAQ,CAAC,MAAM,CAAuB;IAC9C,OAAO,CAAC,QAAQ,CAAC,YAAY,CAAsB;IAEnD,OAAO,CAAC,SAAS,CAAC,CAAY;IAC9B,OAAO,CAAC,SAAS,CAAM;IACvB,OAAO,CAAC,UAAU,CAAuB;IAEzC,OAAO,CAAC,iBAAiB,CAAC,CAAa;IACvC,OAAO,CAAC,kBAAkB,CAAC,CAAS;IACpC,OAAO,CAAC,YAAY,CAAQ;IAC5B,OAAO,CAAC,WAAW,CAAuB;IAE1C,OAAO,CAAC,SAAS,CAEV;IAEP,OAAO,CAAC,QAAQ,CAAC,MAAM,CAA8B;gBAEzC,MAAM,EAAE,iBAAiB;IAgBrC,EAAE,CAAC,CAAC,SAAS,MAAM,mBAAmB,EACpC,KAAK,EAAE,CAAC,EACR,EAAE,EAAE,QAAQ,CAAC,mBAAmB,CAAC,CAAC,CAAC,CAAC;IAOhC,KAAK;IA2CX,IAAI;IAIJ,WAAW;IA6HX,OAAO;IAQP,YAAY;IAQZ,kBAAkB;IAOlB,OAAO,CAAC,kBAAkB;YAeZ,kBAAkB;IAuBhC,OAAO,CAAC,sBAAsB;IA4B9B,OAAO,CAAC,iBAAiB;YAqCX,iBAAiB;IAaxB,YAAY;IA4BnB,OAAO,CAAC,gBAAgB;YAOV,YAAY;YA8DZ,UAAU;YAkBV,YAAY;IAcnB,wBAAwB;IAkB/B,OAAO,CAAC,wBAAwB;YASlB,aAAa;IAkB3B,OAAO,CAAC,SAAS;IA6BjB,OAAO,CAAC,mBAAmB;IAc3B,OAAO,CAAC,YAAY;IAKpB,OAAO,CAAC,IAAI;IAOZ,OAAO,CAAC,IAAI;CAIb"}
@@ -3,7 +3,7 @@ import QRCode from "qrcode";
3
3
  import { storeAuthSession, getAuthSession, clearAuthSession, } from "../utilities/storage";
4
4
  import { StateMachine } from "../utilities/stateMachine";
5
5
  import { Transport } from "../utilities/transport";
6
- import { BASEURL } from "../constants";
6
+ import { APPLE_APP_STORE_URL, BASEURL, FALLBACK_URL, PLAY_STORE_URL, } from "../constants";
7
7
  export class PelicanAuthentication {
8
8
  constructor(config) {
9
9
  this.crypto = new CryptoService();
@@ -11,6 +11,7 @@ export class PelicanAuthentication {
11
11
  this.sessionId = "";
12
12
  this.sessionKey = null;
13
13
  this.useWebSocket = true;
14
+ this.deeplinkUrl = null;
14
15
  this.listeners = {};
15
16
  if (!config.publicKey)
16
17
  throw new Error("Missing publicKey");
@@ -90,8 +91,6 @@ export class PelicanAuthentication {
90
91
  return;
91
92
  }
92
93
  this.detachVisibilityRecovery();
93
- clearAuthSession();
94
- this.clearBackupCheck();
95
94
  this.transport?.close();
96
95
  this.transport = undefined;
97
96
  authWindow.focus();
@@ -259,10 +258,31 @@ export class PelicanAuthentication {
259
258
  if (this.sessionKey) {
260
259
  storeAuthSession(this.sessionId, this.sessionKey, 10 * 60000);
261
260
  }
262
- this.attachVisibilityRecovery();
263
261
  await this.emitDeepLink(deeplinkUrl);
262
+ this.deeplinkUrl = deeplinkUrl;
264
263
  this.stateMachine.transition("awaiting-pair");
265
264
  }
265
+ openDeepLink() {
266
+ if (!this.deeplinkUrl) {
267
+ this.fail(new Error("Deep link not found"));
268
+ return;
269
+ }
270
+ const userAgent = navigator.userAgent;
271
+ let fallbackUrl = FALLBACK_URL;
272
+ if (/iPad|iPhone|iPod/.test(userAgent)) {
273
+ fallbackUrl = APPLE_APP_STORE_URL;
274
+ }
275
+ else if (/android/i.test(userAgent)) {
276
+ fallbackUrl = PLAY_STORE_URL;
277
+ }
278
+ const start = Date.now();
279
+ window.location.href = this.deeplinkUrl;
280
+ setTimeout(() => {
281
+ if (Date.now() - start < 3500) {
282
+ window.location.href = fallbackUrl;
283
+ }
284
+ }, 3000);
285
+ }
266
286
  clearBackupCheck() {
267
287
  if (this.backupCheckTimeout) {
268
288
  clearTimeout(this.backupCheckTimeout);
@@ -273,9 +293,7 @@ export class PelicanAuthentication {
273
293
  const cached = getAuthSession();
274
294
  if (!cached) {
275
295
  this.fail(new Error("Authentication session not found"));
276
- setTimeout(() => {
277
- this.stateMachine.transition("idle");
278
- }, 2000);
296
+ this.restartIfContinuous();
279
297
  return;
280
298
  }
281
299
  this.stateMachine.transition("awaiting-auth");
@@ -283,9 +301,7 @@ export class PelicanAuthentication {
283
301
  const res = await fetch(`${BASEURL}/session?session_id=${cached.sessionId}`);
284
302
  if (!res.ok) {
285
303
  this.fail(new Error("Session not found"));
286
- setTimeout(() => {
287
- this.stateMachine.transition("idle");
288
- }, 2000);
304
+ this.restartIfContinuous();
289
305
  return;
290
306
  }
291
307
  const data = await res.json();
@@ -296,9 +312,7 @@ export class PelicanAuthentication {
296
312
  if (!decrypted) {
297
313
  console.warn("Failed to decrypt session");
298
314
  this.fail(new Error("Failed to decrypt session"));
299
- setTimeout(() => {
300
- this.stateMachine.transition("idle");
301
- }, 2000);
315
+ this.restartIfContinuous();
302
316
  return;
303
317
  }
304
318
  const result = JSON.parse(decrypted);
@@ -319,9 +333,7 @@ export class PelicanAuthentication {
319
333
  catch (err) {
320
334
  console.debug("Session check failed:", err);
321
335
  this.fail(new Error("Session check failed"));
322
- setTimeout(() => {
323
- this.stateMachine.transition("idle");
324
- }, 2000);
336
+ this.restartIfContinuous();
325
337
  return;
326
338
  }
327
339
  }
@@ -339,11 +351,15 @@ export class PelicanAuthentication {
339
351
  this.emit("deeplink", deeplink);
340
352
  }
341
353
  attachVisibilityRecovery() {
354
+ let fired = false;
342
355
  this.visibilityHandler = async () => {
343
356
  if (document.visibilityState !== "visible")
344
357
  return;
345
358
  if (this.useWebSocket)
346
359
  return;
360
+ if (fired)
361
+ return;
362
+ fired = true;
347
363
  await this.checkSession();
348
364
  };
349
365
  document.addEventListener("visibilitychange", this.visibilityHandler);
@@ -1 +1 @@
1
- {"version":3,"file":"engine.js","sourceRoot":"","sources":["../../src/engine/engine.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"engine.js","sourceRoot":"","sources":["../../src/engine/engine.ts"],"names":[],"mappings":"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"}
package/dist/index.d.mts CHANGED
@@ -119,6 +119,7 @@ declare class PelicanAuthentication {
119
119
  private visibilityHandler?;
120
120
  private backupCheckTimeout?;
121
121
  private useWebSocket;
122
+ private deeplinkUrl;
122
123
  private listeners;
123
124
  private readonly config;
124
125
  constructor(config: PelicanAuthConfig);
@@ -134,11 +135,12 @@ declare class PelicanAuthentication {
134
135
  private handleWebSocketMessage;
135
136
  private handleAuthSuccess;
136
137
  private startDeepLinkFlow;
138
+ openDeepLink(): void;
137
139
  private clearBackupCheck;
138
140
  private checkSession;
139
141
  private emitQRCode;
140
142
  private emitDeepLink;
141
- private attachVisibilityRecovery;
143
+ attachVisibilityRecovery(): void;
142
144
  private detachVisibilityRecovery;
143
145
  private fetchRelayUrl;
144
146
  private terminate;
package/dist/index.d.ts CHANGED
@@ -119,6 +119,7 @@ declare class PelicanAuthentication {
119
119
  private visibilityHandler?;
120
120
  private backupCheckTimeout?;
121
121
  private useWebSocket;
122
+ private deeplinkUrl;
122
123
  private listeners;
123
124
  private readonly config;
124
125
  constructor(config: PelicanAuthConfig);
@@ -134,11 +135,12 @@ declare class PelicanAuthentication {
134
135
  private handleWebSocketMessage;
135
136
  private handleAuthSuccess;
136
137
  private startDeepLinkFlow;
138
+ openDeepLink(): void;
137
139
  private clearBackupCheck;
138
140
  private checkSession;
139
141
  private emitQRCode;
140
142
  private emitDeepLink;
141
- private attachVisibilityRecovery;
143
+ attachVisibilityRecovery(): void;
142
144
  private detachVisibilityRecovery;
143
145
  private fetchRelayUrl;
144
146
  private terminate;
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AACA,cAAc,eAAe,CAAC;AAE9B,OAAO,EAAE,qBAAqB,EAAE,MAAM,iBAAiB,CAAC;AAGxD,OAAO,EAAE,aAAa,EAAE,MAAM,oBAAoB,CAAC;AACnD,OAAO,EAAE,YAAY,EAAE,MAAM,0BAA0B,CAAC;AACxD,OAAO,EAAE,SAAS,EAAE,MAAM,uBAAuB,CAAC;AAClD,cAAc,qBAAqB,CAAC;AACpC,OAAO,EAAE,OAAO,EAAE,MAAM,aAAa,CAAC"}
package/dist/index.js CHANGED
@@ -318,6 +318,9 @@ var Transport = class {
318
318
 
319
319
  // src/constants.ts
320
320
  var BASEURL = "https://identityapi.pelicanidentity.com";
321
+ var APPLE_APP_STORE_URL = "https://apps.apple.com/us/app/pelican-vault/id6755097751";
322
+ var PLAY_STORE_URL = "https://play.google.com/store/apps/details?id=com.HeraculesDesignTechLtd.pelican";
323
+ var FALLBACK_URL = "https://pelicanidentity.com/pelican-vault";
321
324
 
322
325
  // src/engine/engine.ts
323
326
  var PelicanAuthentication = class {
@@ -327,6 +330,7 @@ var PelicanAuthentication = class {
327
330
  this.sessionId = "";
328
331
  this.sessionKey = null;
329
332
  this.useWebSocket = true;
333
+ this.deeplinkUrl = null;
330
334
  this.listeners = {};
331
335
  if (!config.publicKey) throw new Error("Missing publicKey");
332
336
  if (!config.projectId) throw new Error("Missing projectId");
@@ -409,8 +413,6 @@ var PelicanAuthentication = class {
409
413
  return;
410
414
  }
411
415
  this.detachVisibilityRecovery();
412
- clearAuthSession();
413
- this.clearBackupCheck();
414
416
  this.transport?.close();
415
417
  this.transport = void 0;
416
418
  authWindow.focus();
@@ -580,10 +582,30 @@ var PelicanAuthentication = class {
580
582
  if (this.sessionKey) {
581
583
  storeAuthSession(this.sessionId, this.sessionKey, 10 * 6e4);
582
584
  }
583
- this.attachVisibilityRecovery();
584
585
  await this.emitDeepLink(deeplinkUrl);
586
+ this.deeplinkUrl = deeplinkUrl;
585
587
  this.stateMachine.transition("awaiting-pair");
586
588
  }
589
+ openDeepLink() {
590
+ if (!this.deeplinkUrl) {
591
+ this.fail(new Error("Deep link not found"));
592
+ return;
593
+ }
594
+ const userAgent = navigator.userAgent;
595
+ let fallbackUrl = FALLBACK_URL;
596
+ if (/iPad|iPhone|iPod/.test(userAgent)) {
597
+ fallbackUrl = APPLE_APP_STORE_URL;
598
+ } else if (/android/i.test(userAgent)) {
599
+ fallbackUrl = PLAY_STORE_URL;
600
+ }
601
+ const start = Date.now();
602
+ window.location.href = this.deeplinkUrl;
603
+ setTimeout(() => {
604
+ if (Date.now() - start < 3500) {
605
+ window.location.href = fallbackUrl;
606
+ }
607
+ }, 3e3);
608
+ }
587
609
  clearBackupCheck() {
588
610
  if (this.backupCheckTimeout) {
589
611
  clearTimeout(this.backupCheckTimeout);
@@ -594,9 +616,7 @@ var PelicanAuthentication = class {
594
616
  const cached = getAuthSession();
595
617
  if (!cached) {
596
618
  this.fail(new Error("Authentication session not found"));
597
- setTimeout(() => {
598
- this.stateMachine.transition("idle");
599
- }, 2e3);
619
+ this.restartIfContinuous();
600
620
  return;
601
621
  }
602
622
  this.stateMachine.transition("awaiting-auth");
@@ -606,9 +626,7 @@ var PelicanAuthentication = class {
606
626
  );
607
627
  if (!res.ok) {
608
628
  this.fail(new Error("Session not found"));
609
- setTimeout(() => {
610
- this.stateMachine.transition("idle");
611
- }, 2e3);
629
+ this.restartIfContinuous();
612
630
  return;
613
631
  }
614
632
  const data = await res.json();
@@ -619,9 +637,7 @@ var PelicanAuthentication = class {
619
637
  if (!decrypted) {
620
638
  console.warn("Failed to decrypt session");
621
639
  this.fail(new Error("Failed to decrypt session"));
622
- setTimeout(() => {
623
- this.stateMachine.transition("idle");
624
- }, 2e3);
640
+ this.restartIfContinuous();
625
641
  return;
626
642
  }
627
643
  const result = JSON.parse(decrypted);
@@ -640,9 +656,7 @@ var PelicanAuthentication = class {
640
656
  } catch (err) {
641
657
  console.debug("Session check failed:", err);
642
658
  this.fail(new Error("Session check failed"));
643
- setTimeout(() => {
644
- this.stateMachine.transition("idle");
645
- }, 2e3);
659
+ this.restartIfContinuous();
646
660
  return;
647
661
  }
648
662
  }
@@ -670,9 +684,12 @@ var PelicanAuthentication = class {
670
684
  }
671
685
  /* -------------------- Visibility Recovery -------------------- */
672
686
  attachVisibilityRecovery() {
687
+ let fired = false;
673
688
  this.visibilityHandler = async () => {
674
689
  if (document.visibilityState !== "visible") return;
675
690
  if (this.useWebSocket) return;
691
+ if (fired) return;
692
+ fired = true;
676
693
  await this.checkSession();
677
694
  };
678
695
  document.addEventListener("visibilitychange", this.visibilityHandler);
package/dist/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/utilities/crypto.ts","../src/utilities/storage.ts","../src/utilities/stateMachine.ts","../src/utilities/transport.ts","../src/constants.ts","../src/engine/engine.ts"],"names":["nacl","encodeBase64","decodeBase64","QRCode"],"mappings":"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","file":"index.js","sourcesContent":["import nacl from \"tweetnacl\";\nimport { decodeBase64, encodeBase64 } from \"tweetnacl-util\";\n\ninterface EncryptedMessage {\n cipher: string; // Base64 encoded\n nonce: string; // Base64 encoded\n}\n\nexport class CryptoService {\n generateSymmetricKey(): string {\n const key = nacl.randomBytes(32);\n return encodeBase64(key);\n }\n\n /**\n * Encrypt with symmetric key (secret-key encryption)\n * Use this when both parties share the same secret key\n * @param plaintext - Message to encrypt\n * @param keyString - Symmetric key (base64)\n * @returns Encrypted message with nonce\n */\n encryptSymmetric({\n plaintext,\n keyString,\n }: {\n plaintext: string;\n keyString: string;\n }): EncryptedMessage {\n const key = decodeBase64(keyString);\n const nonce = nacl.randomBytes(24);\n\n const messageBytes = new TextEncoder().encode(plaintext);\n\n const ciphertext = nacl.secretbox(messageBytes, nonce, key);\n\n return {\n cipher: encodeBase64(ciphertext),\n nonce: encodeBase64(nonce),\n };\n }\n\n /**\n * Decrypt with symmetric key\n * @param encrypted - Encrypted message with nonce\n * @param keyString - Symmetric key (base64)\n * @returns Decrypted plaintext\n */\n decryptSymmetric({\n encrypted,\n keyString,\n }: {\n encrypted: EncryptedMessage;\n keyString: string;\n }): string | null {\n try {\n const key = decodeBase64(keyString);\n const ciphertextBytes = decodeBase64(encrypted.cipher);\n const nonceBytes = decodeBase64(encrypted.nonce);\n\n const decrypted = nacl.secretbox.open(ciphertextBytes, nonceBytes, key);\n\n if (!decrypted) {\n throw new Error(\"Decryption failed - invalid key or corrupted data\");\n }\n\n const decoded = new TextDecoder().decode(decrypted);\n return decoded;\n } catch (error) {\n console.error(\"Decryption failed\", error);\n return null;\n }\n }\n}\n\nexport default CryptoService;\nexport type { EncryptedMessage };\n","// hybridStorage.ts\n/**\n * Hybrid storage: Try sessionStorage first, fallback to memory\n * Best of both worlds - survives page refresh but auto-cleans\n */\n\ninterface StorageOptions {\n ttlMs?: number;\n useSessionStorage?: boolean;\n}\n\nclass AuthStorage {\n private readonly prefix = \"pelican_auth_\";\n private readonly defaultTTL = 5 * 60 * 1000; // 5 minutes\n private memoryCache: Map<string, { value: any; expiresAt: number }> =\n new Map();\n\n /**\n * Store auth session with automatic cleanup\n */\n set(key: string, value: any, options: StorageOptions = {}): void {\n const { ttlMs = this.defaultTTL, useSessionStorage = true } = options;\n\n const expiresAt = Date.now() + ttlMs;\n const data = { value, expiresAt };\n\n // Try sessionStorage first\n if (useSessionStorage) {\n try {\n sessionStorage.setItem(`${this.prefix}${key}`, JSON.stringify(data));\n } catch (error) {\n console.warn(\"SessionStorage unavailable, using memory:\", error);\n this.setMemory(key, data);\n }\n } else {\n this.setMemory(key, data);\n }\n }\n\n /**\n * Get stored value if not expired\n */\n get(key: string): any | null {\n // Try sessionStorage first\n try {\n const stored = sessionStorage.getItem(`${this.prefix}${key}`);\n if (stored) {\n const data = JSON.parse(stored);\n\n // Check expiration\n if (Date.now() > data.expiresAt) {\n this.remove(key);\n return null;\n }\n\n return data.value;\n }\n } catch (error) {\n // Fallback to memory\n }\n\n // Try memory cache\n return this.getMemory(key);\n }\n\n /**\n * Remove specific key\n */\n remove(key: string): void {\n try {\n sessionStorage.removeItem(`${this.prefix}${key}`);\n } catch (error) {\n // Ignore\n }\n this.memoryCache.delete(key);\n }\n\n /**\n * Clear all auth data\n */\n clear(): void {\n // Clear sessionStorage\n try {\n Object.keys(sessionStorage).forEach((key) => {\n if (key.startsWith(this.prefix)) {\n sessionStorage.removeItem(key);\n }\n });\n } catch (error) {\n // Ignore\n }\n\n // Clear memory\n this.memoryCache.clear();\n }\n\n // ========================================\n // Memory cache helpers\n // ========================================\n\n private setMemory(\n key: string,\n data: { value: any; expiresAt: number }\n ): void {\n this.memoryCache.set(key, data);\n\n // Schedule cleanup\n const ttl = data.expiresAt - Date.now();\n setTimeout(() => {\n this.memoryCache.delete(key);\n }, ttl);\n }\n\n private getMemory(key: string): any | null {\n const data = this.memoryCache.get(key);\n if (!data) return null;\n\n if (Date.now() > data.expiresAt) {\n this.memoryCache.delete(key);\n return null;\n }\n\n return data.value;\n }\n}\n\n// Singleton instance\nconst storage = new AuthStorage();\n\n// ========================================\n// Convenience functions for auth flow\n// ========================================\n\nexport interface AuthSession {\n sessionId: string;\n sessionKey: string;\n}\n\nexport const storeAuthSession = (\n sessionId: string,\n sessionKey: string,\n ttlMs?: number\n): void => {\n storage.set(\"session\", { sessionId, sessionKey }, { ttlMs });\n};\n\nexport const getAuthSession = (): AuthSession | null => {\n return storage.get(\"session\");\n};\n\nexport const clearAuthSession = (): void => {\n storage.remove(\"session\");\n};\n\nexport const clearAllAuthData = (): void => {\n storage.clear();\n};\n\nexport default storage;\n","import type { PelicanAuthState } from \"../types/types\";\n\nexport class StateMachine {\n private state: PelicanAuthState = \"idle\";\n private listeners = new Set<(s: PelicanAuthState) => void>();\n\n get current() {\n return this.state;\n }\n\n transition(next: PelicanAuthState) {\n this.state = next;\n this.listeners.forEach((l) => l(next));\n }\n\n subscribe(fn: (s: PelicanAuthState) => void) {\n this.listeners.add(fn);\n return () => this.listeners.delete(fn);\n }\n}\n","import { ISocketMessage } from \"../types/types\";\n\ntype TransportHandlers = {\n onOpen?: () => void;\n onMessage?: (msg: ISocketMessage) => void;\n onError?: (err: Event) => void;\n onClose?: (ev: CloseEvent) => void;\n};\n\n/**\n * WebSocket Transport with automatic reconnection\n * Handles connection lifecycle and message passing\n */\nexport class Transport {\n private socket?: WebSocket;\n private handlers: TransportHandlers;\n private reconnectAttempts = 0;\n private maxReconnectAttempts = 3; // Reduced from 5 for mobile\n private isExplicitlyClosed = false;\n private url?: string;\n private reconnectTimeout?: number;\n private isReconnecting = false;\n\n constructor(handlers: TransportHandlers) {\n this.handlers = handlers;\n }\n\n /**\n * Establish WebSocket connection\n * @param url - WebSocket URL\n */\n connect(url: string) {\n this.url = url;\n this.isExplicitlyClosed = false;\n\n // Clean up any existing socket\n if (this.socket) {\n this.socket.onclose = null;\n this.socket.onerror = null;\n this.socket.onmessage = null;\n this.socket.onopen = null;\n\n if (\n this.socket.readyState === WebSocket.OPEN ||\n this.socket.readyState === WebSocket.CONNECTING\n ) {\n this.socket.close();\n }\n }\n\n this.socket = new WebSocket(url);\n\n this.socket.onopen = () => {\n this.reconnectAttempts = 0;\n this.isReconnecting = false;\n this.handlers.onOpen?.();\n };\n\n this.socket.onmessage = (e: MessageEvent) => {\n try {\n const data = JSON.parse(e.data);\n this.handlers.onMessage?.(data);\n } catch (err) {\n console.error(\"Failed to parse WebSocket message\", err);\n }\n };\n\n this.socket.onerror = (e: Event) => {\n // Only emit error if not reconnecting and not explicitly closed\n if (!this.isReconnecting && !this.isExplicitlyClosed) {\n this.handlers.onError?.(e);\n }\n };\n\n this.socket.onclose = (e: CloseEvent) => {\n // Clear any pending reconnect timeout\n if (this.reconnectTimeout) {\n clearTimeout(this.reconnectTimeout);\n this.reconnectTimeout = undefined;\n }\n\n // Emit close event\n if (!this.isReconnecting) {\n this.handlers.onClose?.(e);\n }\n\n // Only reconnect if:\n // 1. Not explicitly closed by user\n // 2. Not already reconnecting\n // 3. Haven't exceeded max attempts\n if (\n !this.isExplicitlyClosed &&\n !this.isReconnecting &&\n this.reconnectAttempts < this.maxReconnectAttempts\n ) {\n this.attemptReconnect();\n }\n };\n }\n\n /**\n * Attempt to reconnect with exponential backoff\n */\n private attemptReconnect() {\n if (this.reconnectAttempts >= this.maxReconnectAttempts) {\n console.warn(\"Max WebSocket reconnect attempts reached\");\n return;\n }\n\n this.isReconnecting = true;\n this.reconnectAttempts++;\n\n // Exponential backoff: 500ms, 1s, 2s\n const delay = Math.min(Math.pow(2, this.reconnectAttempts - 1) * 500, 2000);\n\n console.log(\n `Reconnecting WebSocket (attempt ${this.reconnectAttempts}/${this.maxReconnectAttempts}) in ${delay}ms...`\n );\n\n this.reconnectTimeout = window.setTimeout(() => {\n if (this.url && !this.isExplicitlyClosed) {\n this.connect(this.url);\n }\n }, delay);\n }\n\n /**\n * Send a message through the WebSocket\n * Queues message if connection is not open\n */\n send(payload: ISocketMessage) {\n if (this.socket?.readyState === WebSocket.OPEN) {\n try {\n this.socket.send(JSON.stringify(payload));\n } catch (err) {\n console.error(\"Failed to send WebSocket message:\", err);\n }\n } else {\n console.warn(\n \"WebSocket not open, message not sent:\",\n this.socket?.readyState\n );\n }\n }\n\n /**\n * Close the WebSocket connection\n * Prevents automatic reconnection\n */\n close() {\n this.isExplicitlyClosed = true;\n this.isReconnecting = false;\n\n // Clear reconnect timeout\n if (this.reconnectTimeout) {\n clearTimeout(this.reconnectTimeout);\n this.reconnectTimeout = undefined;\n }\n\n // Close socket\n if (this.socket) {\n // Remove event listeners to prevent callbacks\n this.socket.onclose = null;\n this.socket.onerror = null;\n this.socket.onmessage = null;\n this.socket.onopen = null;\n\n if (\n this.socket.readyState === WebSocket.OPEN ||\n this.socket.readyState === WebSocket.CONNECTING\n ) {\n this.socket.close();\n }\n\n this.socket = undefined;\n }\n }\n\n /**\n * Get current connection state\n */\n get readyState(): number | undefined {\n return this.socket?.readyState;\n }\n\n /**\n * Check if connection is open\n */\n get isOpen(): boolean {\n return this.socket?.readyState === WebSocket.OPEN;\n }\n}\n","export const BASEURL = \"https://identityapi.pelicanidentity.com\";\n","import CryptoService from \"../utilities/crypto\";\nimport QRCode from \"qrcode\";\nimport {\n PelicanAuthConfig,\n PelicanAuthEventMap,\n ISocketMessage,\n IdentityResult,\n} from \"../types/types\";\nimport {\n storeAuthSession,\n getAuthSession,\n clearAuthSession,\n} from \"../utilities/storage\";\nimport { StateMachine } from \"../utilities/stateMachine\";\nimport { Transport } from \"../utilities/transport\";\n\nimport { BASEURL } from \"../constants\";\n\ntype Listener<T> = (payload: T) => void;\n\n/**\n * PelicanAuth SDK\n *\n * Uses WebSocket for QR code flow (desktop)\n * Uses visibility recovery for deep link flow (mobile)\n */\nexport class PelicanAuthentication {\n private readonly crypto = new CryptoService();\n private readonly stateMachine = new StateMachine();\n\n private transport?: Transport;\n private sessionId = \"\";\n private sessionKey: string | null = null;\n\n private visibilityHandler?: () => void;\n private backupCheckTimeout?: number;\n private useWebSocket = true;\n\n private listeners: {\n [K in keyof PelicanAuthEventMap]?: Set<Listener<any>>;\n } = {};\n\n private readonly config: Required<PelicanAuthConfig>;\n\n constructor(config: PelicanAuthConfig) {\n if (!config.publicKey) throw new Error(\"Missing publicKey\");\n if (!config.projectId) throw new Error(\"Missing projectId\");\n if (!config.authType) throw new Error(\"Missing authType\");\n\n this.config = {\n continuousMode: false,\n forceQRCode: false,\n ...config,\n };\n\n this.stateMachine.subscribe((s) => this.emit(\"state\", s));\n }\n\n /* -------------------- Public API -------------------- */\n\n on<K extends keyof PelicanAuthEventMap>(\n event: K,\n cb: Listener<PelicanAuthEventMap[K]>,\n ) {\n this.listeners[event] ??= new Set();\n this.listeners[event]!.add(cb);\n return () => this.listeners[event]!.delete(cb);\n }\n\n async start() {\n if (\n this.config.authType !== \"id-verification\" &&\n this.config.authType !== \"signup\" &&\n this.config.authType !== \"login\"\n ) {\n this.fail(new Error(\"Invalid authType\"));\n return;\n }\n\n if (!this.config.projectId) {\n this.fail(new Error(\"Missing projectId\"));\n return;\n }\n\n if (!this.config.publicKey) {\n this.fail(new Error(\"Missing publicKey\"));\n return;\n }\n if (this.stateMachine.current !== \"idle\") return;\n\n this.resetSession();\n clearAuthSession();\n this.stateMachine.transition(\"initializing\");\n\n try {\n // Generate session credentials\n this.sessionKey = this.crypto.generateSymmetricKey();\n this.sessionId = crypto.randomUUID() + crypto.randomUUID();\n\n // Decide: WebSocket (QR) or Deep Link\n this.useWebSocket = this.shouldUseWebSocket();\n\n if (this.useWebSocket) {\n await this.startWebSocketFlow();\n } else {\n await this.startDeepLinkFlow();\n }\n } catch (err) {\n this.fail(err instanceof Error ? err : new Error(\"Start failed\"));\n }\n }\n\n stop() {\n this.terminate(false);\n }\n\n openWebAuth() {\n if (!this.sessionKey || !this.sessionId) {\n this.fail(\n new Error(\"No active session. Call start() before openWebAuth().\"),\n );\n return;\n }\n\n const openerOrigin = window.location.origin;\n\n const urlParams = new URLSearchParams({\n projectId: this.config.projectId,\n publicKey: this.config.publicKey,\n authType: this.config.authType,\n sessionId: this.sessionId,\n sessionKey: this.sessionKey,\n origin: openerOrigin,\n });\n\n const authUrl = `https://vault.pelicanidentity.com/auth?${urlParams.toString()}`;\n\n // Try popup first, fall back to new tab if blocked\n const authWindow =\n window.open(\n authUrl,\n \"pelican-auth\",\n \"width=480,height=640,left=400,top=100,resizable=no,scrollbars=no\",\n ) ?? window.open(authUrl, \"_blank\");\n\n if (!authWindow) {\n // Both popup and new tab blocked — nothing we can do\n this.fail(\n new Error(\n \"Unable to open authentication window. Please allow popups for this site and try again.\",\n ),\n );\n return;\n }\n\n this.detachVisibilityRecovery();\n clearAuthSession();\n this.clearBackupCheck();\n this.transport?.close();\n this.transport = undefined;\n\n authWindow.focus();\n this.stateMachine.transition(\"awaiting-pair\");\n\n const cleanup = () => {\n window.removeEventListener(\"message\", handleMessage);\n clearInterval(closedPoller);\n };\n\n const handleMessage = (event: MessageEvent) => {\n // Only accept messages from the vault — prevents origin spoofing\n if (event.origin !== \"https://vault.pelicanidentity.com\") return;\n\n // Ensure message came from the specific window we opened\n // Works for both popup and new tab since window.opener is preserved either way\n if (event.source !== authWindow) return;\n\n const { type, payload } = event.data ?? {};\n\n if (type === \"pelican-auth-success\") {\n console.log(\"Web auth success\");\n cleanup();\n\n if (!payload?.cipher || !payload?.nonce) {\n this.fail(new Error(\"Invalid web auth payload\"));\n this.restartIfContinuous();\n return;\n }\n\n try {\n const decrypted = this.crypto.decryptSymmetric({\n encrypted: { cipher: payload.cipher, nonce: payload.nonce },\n keyString: this.sessionKey!,\n });\n\n if (!decrypted) {\n this.fail(new Error(\"Failed to decrypt web auth response\"));\n this.restartIfContinuous();\n return;\n }\n\n const result: IdentityResult = JSON.parse(decrypted);\n this.emit(\"success\", result);\n this.stateMachine.transition(\"authenticated\");\n this.restartIfContinuous();\n } catch {\n this.fail(new Error(\"Failed to decrypt web auth response\"));\n this.restartIfContinuous();\n }\n }\n\n if (type === \"pelican-auth-cancelled\") {\n cleanup();\n this.fail(new Error(\"Authentication cancelled\"));\n this.restartIfContinuous();\n }\n\n if (type === \"pelican-auth-error\") {\n cleanup();\n this.fail(new Error(payload?.message ?? \"Web auth failed\"));\n this.restartIfContinuous();\n }\n };\n\n window.addEventListener(\"message\", handleMessage);\n\n // Poll for manual close — works for both popup and new tab\n // New tab edge case: if user navigates away without closing, closed stays false\n // until they actually close the tab — acceptable tradeoff vs hard failing\n const closedPoller = setInterval(() => {\n if (!authWindow.closed) return;\n cleanup();\n if (\n ![\"authenticated\", \"confirmed\", \"error\"].includes(\n this.stateMachine.current,\n )\n ) {\n this.fail(new Error(\"Authentication window closed\"));\n this.restartIfContinuous();\n }\n }, 500);\n }\n\n destroy() {\n this.detachVisibilityRecovery();\n this.clearBackupCheck();\n this.transport?.close();\n this.transport = undefined;\n this.listeners = {};\n }\n\n useQrInstead() {\n this.useWebSocket = true;\n\n this.emit(\"deeplink\", \"\");\n this.stateMachine.transition(\"initializing\");\n this.startWebSocketFlow();\n }\n\n useDeepLinkInstead() {\n this.useWebSocket = false;\n this.stateMachine.transition(\"initializing\");\n this.startDeepLinkFlow();\n }\n /* -------------------- Flow Selection -------------------- */\n\n private shouldUseWebSocket(): boolean {\n const userAgent = navigator.userAgent;\n\n const isTablet = /(iPad|Android(?!.*Mobile))/i.test(userAgent);\n const isMobile =\n /Android|webOS|iPhone|iPod|BlackBerry|IEMobile|Opera Mini/i.test(\n userAgent,\n );\n\n const useWebSocket = isMobile && !isTablet;\n return this.config.forceQRCode || !useWebSocket;\n }\n\n /* -------------------- WebSocket Flow (QR Code) -------------------- */\n\n private async startWebSocketFlow() {\n const { relayUrl, deeplinkUrl } = await this.fetchRelayUrl();\n\n this.transport = new Transport({\n onOpen: () => {\n this.transport!.send({\n type: \"register\",\n sessionID: this.sessionId,\n ...this.config,\n });\n this.stateMachine.transition(\"awaiting-pair\");\n },\n onMessage: (msg: ISocketMessage) => this.handleWebSocketMessage(msg),\n onError: (err) => {\n console.error(\"WebSocket error:\", err);\n this.fail(new Error(\"WebSocket connection failed\"));\n },\n });\n\n this.transport.connect(relayUrl);\n await this.emitQRCode(deeplinkUrl);\n }\n\n private handleWebSocketMessage(msg: ISocketMessage) {\n switch (msg.type) {\n case \"paired\":\n this.stateMachine.transition(\"paired\");\n this.transport!.send({\n type: \"authenticate\",\n sessionID: this.sessionId,\n ...this.config,\n url: window.location.href,\n });\n return;\n\n case \"phone-auth-success\":\n this.handleAuthSuccess(msg);\n return;\n\n case \"phone-terminated\":\n this.fail(new Error(\"Authentication cancelled on device\"));\n this.restartIfContinuous();\n return;\n\n case \"confirmed\":\n this.terminate(true);\n this.restartIfContinuous();\n return;\n }\n }\n\n private handleAuthSuccess(msg: ISocketMessage) {\n if (!this.sessionKey || !msg.cipher || !msg.nonce) {\n this.fail(new Error(\"Invalid authentication payload\"));\n this.restartIfContinuous();\n return;\n }\n\n try {\n const decrypted = this.crypto.decryptSymmetric({\n encrypted: { cipher: msg.cipher, nonce: msg.nonce },\n keyString: this.sessionKey,\n });\n\n if (!decrypted) {\n this.fail(new Error(\"Invalid authentication data\"));\n this.restartIfContinuous();\n return;\n }\n\n const result: IdentityResult = JSON.parse(decrypted);\n\n this.emit(\"success\", result);\n this.stateMachine.transition(\"authenticated\");\n\n // Confirm receipt\n this.transport?.send({\n type: \"confirm\",\n sessionID: this.sessionId,\n });\n } catch {\n this.fail(new Error(\"Failed to decrypt authentication data\"));\n this.restartIfContinuous();\n }\n }\n\n /* -------------------- Deep Link Flow (Mobile) -------------------- */\n\n private async startDeepLinkFlow() {\n const { deeplinkUrl } = await this.fetchRelayUrl();\n\n // Store session for later recovery\n if (this.sessionKey) {\n storeAuthSession(this.sessionId, this.sessionKey, 10 * 60_000); // 10 min TTL\n }\n\n this.attachVisibilityRecovery();\n // Emit deep link\n await this.emitDeepLink(deeplinkUrl);\n\n // Move to awaiting state\n this.stateMachine.transition(\"awaiting-pair\");\n }\n\n private clearBackupCheck() {\n if (this.backupCheckTimeout) {\n clearTimeout(this.backupCheckTimeout);\n this.backupCheckTimeout = undefined;\n }\n }\n\n private async checkSession() {\n const cached = getAuthSession();\n if (!cached) {\n this.fail(new Error(\"Authentication session not found\"));\n setTimeout(() => {\n this.stateMachine.transition(\"idle\");\n }, 2000);\n return;\n }\n\n this.stateMachine.transition(\"awaiting-auth\");\n try {\n const res = await fetch(\n `${BASEURL}/session?session_id=${cached.sessionId}`,\n );\n\n // Session not ready yet\n if (!res.ok) {\n this.fail(new Error(\"Session not found\"));\n setTimeout(() => {\n this.stateMachine.transition(\"idle\");\n }, 2000);\n return;\n }\n\n const data = await res.json();\n const decrypted = this.crypto.decryptSymmetric({\n encrypted: { cipher: data.cipher, nonce: data.nonce },\n keyString: cached.sessionKey,\n });\n\n if (!decrypted) {\n console.warn(\"Failed to decrypt session\");\n this.fail(new Error(\"Failed to decrypt session\"));\n setTimeout(() => {\n this.stateMachine.transition(\"idle\");\n }, 2000);\n return;\n }\n\n const result: IdentityResult = JSON.parse(decrypted);\n\n // Success!\n this.clearBackupCheck();\n clearAuthSession();\n\n this.emit(\"success\", result);\n this.stateMachine.transition(\"authenticated\");\n\n // In continuous mode, restart after delay\n if (this.config.continuousMode) {\n setTimeout(() => {\n this.stateMachine.transition(\"idle\");\n this.start();\n }, 1500);\n } else {\n this.stateMachine.transition(\"idle\");\n }\n } catch (err) {\n console.debug(\"Session check failed:\", err);\n this.fail(new Error(\"Session check failed\"));\n setTimeout(() => {\n this.stateMachine.transition(\"idle\");\n }, 2000);\n return;\n }\n }\n\n /* -------------------- Entry Point Generation -------------------- */\n\n private async emitQRCode(deeplinkUrl: string) {\n const embeddedUrl = `${deeplinkUrl}?sessionID=${encodeURIComponent(\n this.sessionId,\n )}&sessionKey=${encodeURIComponent(\n this.sessionKey!,\n )}&publicKey=${encodeURIComponent(this.config.publicKey)}&authType=${\n this.config.authType\n }&projectId=${encodeURIComponent(this.config.projectId)}`;\n\n const qr = await QRCode.toDataURL(embeddedUrl, {\n type: \"image/png\",\n scale: 3,\n color: { light: \"#ffffff\", dark: \"#424242ff\" },\n });\n\n this.emit(\"qr\", qr);\n }\n\n private async emitDeepLink(deeplinkUrl: string) {\n const deeplink = `${deeplinkUrl}?sessionID=${encodeURIComponent(\n this.sessionId,\n )}&sessionKey=${encodeURIComponent(\n this.sessionKey!,\n )}&publicKey=${encodeURIComponent(this.config.publicKey)}&authType=${\n this.config.authType\n }&projectId=${encodeURIComponent(this.config.projectId)}`;\n\n this.emit(\"deeplink\", deeplink);\n }\n\n /* -------------------- Visibility Recovery -------------------- */\n\n private attachVisibilityRecovery() {\n this.visibilityHandler = async () => {\n if (document.visibilityState !== \"visible\") return;\n\n // Only check for deep link flow\n if (this.useWebSocket) return;\n\n // Check session when page becomes visible\n await this.checkSession();\n };\n\n document.addEventListener(\"visibilitychange\", this.visibilityHandler);\n }\n\n private detachVisibilityRecovery() {\n if (this.visibilityHandler) {\n document.removeEventListener(\"visibilitychange\", this.visibilityHandler);\n this.visibilityHandler = undefined;\n }\n }\n\n /* -------------------- Helpers -------------------- */\n\n private async fetchRelayUrl(): Promise<{\n deeplinkUrl: string;\n relayUrl: string;\n }> {\n const { publicKey, projectId, authType } = this.config;\n const res = await fetch(\n `${BASEURL}/relay?public_key=${publicKey}&auth_type=${authType}&project_id=${projectId}`,\n );\n\n if (!res.ok) {\n const error = await res.text();\n throw new Error(error);\n }\n\n const json = await res.json();\n return { deeplinkUrl: json.deeplink_url, relayUrl: json.relay_url };\n }\n\n private terminate(success: boolean) {\n // Clear backup check\n this.clearBackupCheck();\n\n // Close WebSocket if active\n if (this.transport) {\n if (!success) {\n this.transport.send({\n type: \"client-terminated\",\n sessionID: this.sessionId,\n projectId: this.config.projectId,\n publicKey: this.config.publicKey,\n authType: this.config.authType,\n });\n }\n this.transport.close();\n this.transport = undefined;\n }\n\n clearAuthSession();\n this.resetSession();\n\n if (!this.config.continuousMode) {\n this.detachVisibilityRecovery();\n }\n\n this.stateMachine.transition(success ? \"confirmed\" : \"idle\");\n }\n\n private restartIfContinuous() {\n if (this.config.continuousMode) {\n this.stateMachine.transition(\"idle\");\n this.clearBackupCheck();\n this.transport?.close();\n this.transport = undefined;\n setTimeout(() => {\n this.start();\n }, 150);\n } else {\n this.stateMachine.transition(\"idle\");\n }\n }\n\n private resetSession() {\n this.sessionId = \"\";\n this.sessionKey = null;\n }\n\n private emit<K extends keyof PelicanAuthEventMap>(\n event: K,\n payload: PelicanAuthEventMap[K],\n ) {\n this.listeners[event]?.forEach((cb) => cb(payload));\n }\n\n private fail(err: Error) {\n this.emit(\"error\", err);\n this.stateMachine.transition(\"error\");\n }\n}\n"]}
1
+ {"version":3,"sources":["../src/utilities/crypto.ts","../src/utilities/storage.ts","../src/utilities/stateMachine.ts","../src/utilities/transport.ts","../src/constants.ts","../src/engine/engine.ts"],"names":["nacl","encodeBase64","decodeBase64","QRCode"],"mappings":"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","file":"index.js","sourcesContent":["import nacl from \"tweetnacl\";\nimport { decodeBase64, encodeBase64 } from \"tweetnacl-util\";\n\ninterface EncryptedMessage {\n cipher: string; // Base64 encoded\n nonce: string; // Base64 encoded\n}\n\nexport class CryptoService {\n generateSymmetricKey(): string {\n const key = nacl.randomBytes(32);\n return encodeBase64(key);\n }\n\n /**\n * Encrypt with symmetric key (secret-key encryption)\n * Use this when both parties share the same secret key\n * @param plaintext - Message to encrypt\n * @param keyString - Symmetric key (base64)\n * @returns Encrypted message with nonce\n */\n encryptSymmetric({\n plaintext,\n keyString,\n }: {\n plaintext: string;\n keyString: string;\n }): EncryptedMessage {\n const key = decodeBase64(keyString);\n const nonce = nacl.randomBytes(24);\n\n const messageBytes = new TextEncoder().encode(plaintext);\n\n const ciphertext = nacl.secretbox(messageBytes, nonce, key);\n\n return {\n cipher: encodeBase64(ciphertext),\n nonce: encodeBase64(nonce),\n };\n }\n\n /**\n * Decrypt with symmetric key\n * @param encrypted - Encrypted message with nonce\n * @param keyString - Symmetric key (base64)\n * @returns Decrypted plaintext\n */\n decryptSymmetric({\n encrypted,\n keyString,\n }: {\n encrypted: EncryptedMessage;\n keyString: string;\n }): string | null {\n try {\n const key = decodeBase64(keyString);\n const ciphertextBytes = decodeBase64(encrypted.cipher);\n const nonceBytes = decodeBase64(encrypted.nonce);\n\n const decrypted = nacl.secretbox.open(ciphertextBytes, nonceBytes, key);\n\n if (!decrypted) {\n throw new Error(\"Decryption failed - invalid key or corrupted data\");\n }\n\n const decoded = new TextDecoder().decode(decrypted);\n return decoded;\n } catch (error) {\n console.error(\"Decryption failed\", error);\n return null;\n }\n }\n}\n\nexport default CryptoService;\nexport type { EncryptedMessage };\n","// hybridStorage.ts\n/**\n * Hybrid storage: Try sessionStorage first, fallback to memory\n * Best of both worlds - survives page refresh but auto-cleans\n */\n\ninterface StorageOptions {\n ttlMs?: number;\n useSessionStorage?: boolean;\n}\n\nclass AuthStorage {\n private readonly prefix = \"pelican_auth_\";\n private readonly defaultTTL = 5 * 60 * 1000; // 5 minutes\n private memoryCache: Map<string, { value: any; expiresAt: number }> =\n new Map();\n\n /**\n * Store auth session with automatic cleanup\n */\n set(key: string, value: any, options: StorageOptions = {}): void {\n const { ttlMs = this.defaultTTL, useSessionStorage = true } = options;\n\n const expiresAt = Date.now() + ttlMs;\n const data = { value, expiresAt };\n\n // Try sessionStorage first\n if (useSessionStorage) {\n try {\n sessionStorage.setItem(`${this.prefix}${key}`, JSON.stringify(data));\n } catch (error) {\n console.warn(\"SessionStorage unavailable, using memory:\", error);\n this.setMemory(key, data);\n }\n } else {\n this.setMemory(key, data);\n }\n }\n\n /**\n * Get stored value if not expired\n */\n get(key: string): any | null {\n // Try sessionStorage first\n try {\n const stored = sessionStorage.getItem(`${this.prefix}${key}`);\n if (stored) {\n const data = JSON.parse(stored);\n\n // Check expiration\n if (Date.now() > data.expiresAt) {\n this.remove(key);\n return null;\n }\n\n return data.value;\n }\n } catch (error) {\n // Fallback to memory\n }\n\n // Try memory cache\n return this.getMemory(key);\n }\n\n /**\n * Remove specific key\n */\n remove(key: string): void {\n try {\n sessionStorage.removeItem(`${this.prefix}${key}`);\n } catch (error) {\n // Ignore\n }\n this.memoryCache.delete(key);\n }\n\n /**\n * Clear all auth data\n */\n clear(): void {\n // Clear sessionStorage\n try {\n Object.keys(sessionStorage).forEach((key) => {\n if (key.startsWith(this.prefix)) {\n sessionStorage.removeItem(key);\n }\n });\n } catch (error) {\n // Ignore\n }\n\n // Clear memory\n this.memoryCache.clear();\n }\n\n // ========================================\n // Memory cache helpers\n // ========================================\n\n private setMemory(\n key: string,\n data: { value: any; expiresAt: number }\n ): void {\n this.memoryCache.set(key, data);\n\n // Schedule cleanup\n const ttl = data.expiresAt - Date.now();\n setTimeout(() => {\n this.memoryCache.delete(key);\n }, ttl);\n }\n\n private getMemory(key: string): any | null {\n const data = this.memoryCache.get(key);\n if (!data) return null;\n\n if (Date.now() > data.expiresAt) {\n this.memoryCache.delete(key);\n return null;\n }\n\n return data.value;\n }\n}\n\n// Singleton instance\nconst storage = new AuthStorage();\n\n// ========================================\n// Convenience functions for auth flow\n// ========================================\n\nexport interface AuthSession {\n sessionId: string;\n sessionKey: string;\n}\n\nexport const storeAuthSession = (\n sessionId: string,\n sessionKey: string,\n ttlMs?: number\n): void => {\n storage.set(\"session\", { sessionId, sessionKey }, { ttlMs });\n};\n\nexport const getAuthSession = (): AuthSession | null => {\n return storage.get(\"session\");\n};\n\nexport const clearAuthSession = (): void => {\n storage.remove(\"session\");\n};\n\nexport const clearAllAuthData = (): void => {\n storage.clear();\n};\n\nexport default storage;\n","import type { PelicanAuthState } from \"../types/types\";\n\nexport class StateMachine {\n private state: PelicanAuthState = \"idle\";\n private listeners = new Set<(s: PelicanAuthState) => void>();\n\n get current() {\n return this.state;\n }\n\n transition(next: PelicanAuthState) {\n this.state = next;\n this.listeners.forEach((l) => l(next));\n }\n\n subscribe(fn: (s: PelicanAuthState) => void) {\n this.listeners.add(fn);\n return () => this.listeners.delete(fn);\n }\n}\n","import { ISocketMessage } from \"../types/types\";\n\ntype TransportHandlers = {\n onOpen?: () => void;\n onMessage?: (msg: ISocketMessage) => void;\n onError?: (err: Event) => void;\n onClose?: (ev: CloseEvent) => void;\n};\n\n/**\n * WebSocket Transport with automatic reconnection\n * Handles connection lifecycle and message passing\n */\nexport class Transport {\n private socket?: WebSocket;\n private handlers: TransportHandlers;\n private reconnectAttempts = 0;\n private maxReconnectAttempts = 3; // Reduced from 5 for mobile\n private isExplicitlyClosed = false;\n private url?: string;\n private reconnectTimeout?: number;\n private isReconnecting = false;\n\n constructor(handlers: TransportHandlers) {\n this.handlers = handlers;\n }\n\n /**\n * Establish WebSocket connection\n * @param url - WebSocket URL\n */\n connect(url: string) {\n this.url = url;\n this.isExplicitlyClosed = false;\n\n // Clean up any existing socket\n if (this.socket) {\n this.socket.onclose = null;\n this.socket.onerror = null;\n this.socket.onmessage = null;\n this.socket.onopen = null;\n\n if (\n this.socket.readyState === WebSocket.OPEN ||\n this.socket.readyState === WebSocket.CONNECTING\n ) {\n this.socket.close();\n }\n }\n\n this.socket = new WebSocket(url);\n\n this.socket.onopen = () => {\n this.reconnectAttempts = 0;\n this.isReconnecting = false;\n this.handlers.onOpen?.();\n };\n\n this.socket.onmessage = (e: MessageEvent) => {\n try {\n const data = JSON.parse(e.data);\n this.handlers.onMessage?.(data);\n } catch (err) {\n console.error(\"Failed to parse WebSocket message\", err);\n }\n };\n\n this.socket.onerror = (e: Event) => {\n // Only emit error if not reconnecting and not explicitly closed\n if (!this.isReconnecting && !this.isExplicitlyClosed) {\n this.handlers.onError?.(e);\n }\n };\n\n this.socket.onclose = (e: CloseEvent) => {\n // Clear any pending reconnect timeout\n if (this.reconnectTimeout) {\n clearTimeout(this.reconnectTimeout);\n this.reconnectTimeout = undefined;\n }\n\n // Emit close event\n if (!this.isReconnecting) {\n this.handlers.onClose?.(e);\n }\n\n // Only reconnect if:\n // 1. Not explicitly closed by user\n // 2. Not already reconnecting\n // 3. Haven't exceeded max attempts\n if (\n !this.isExplicitlyClosed &&\n !this.isReconnecting &&\n this.reconnectAttempts < this.maxReconnectAttempts\n ) {\n this.attemptReconnect();\n }\n };\n }\n\n /**\n * Attempt to reconnect with exponential backoff\n */\n private attemptReconnect() {\n if (this.reconnectAttempts >= this.maxReconnectAttempts) {\n console.warn(\"Max WebSocket reconnect attempts reached\");\n return;\n }\n\n this.isReconnecting = true;\n this.reconnectAttempts++;\n\n // Exponential backoff: 500ms, 1s, 2s\n const delay = Math.min(Math.pow(2, this.reconnectAttempts - 1) * 500, 2000);\n\n console.log(\n `Reconnecting WebSocket (attempt ${this.reconnectAttempts}/${this.maxReconnectAttempts}) in ${delay}ms...`\n );\n\n this.reconnectTimeout = window.setTimeout(() => {\n if (this.url && !this.isExplicitlyClosed) {\n this.connect(this.url);\n }\n }, delay);\n }\n\n /**\n * Send a message through the WebSocket\n * Queues message if connection is not open\n */\n send(payload: ISocketMessage) {\n if (this.socket?.readyState === WebSocket.OPEN) {\n try {\n this.socket.send(JSON.stringify(payload));\n } catch (err) {\n console.error(\"Failed to send WebSocket message:\", err);\n }\n } else {\n console.warn(\n \"WebSocket not open, message not sent:\",\n this.socket?.readyState\n );\n }\n }\n\n /**\n * Close the WebSocket connection\n * Prevents automatic reconnection\n */\n close() {\n this.isExplicitlyClosed = true;\n this.isReconnecting = false;\n\n // Clear reconnect timeout\n if (this.reconnectTimeout) {\n clearTimeout(this.reconnectTimeout);\n this.reconnectTimeout = undefined;\n }\n\n // Close socket\n if (this.socket) {\n // Remove event listeners to prevent callbacks\n this.socket.onclose = null;\n this.socket.onerror = null;\n this.socket.onmessage = null;\n this.socket.onopen = null;\n\n if (\n this.socket.readyState === WebSocket.OPEN ||\n this.socket.readyState === WebSocket.CONNECTING\n ) {\n this.socket.close();\n }\n\n this.socket = undefined;\n }\n }\n\n /**\n * Get current connection state\n */\n get readyState(): number | undefined {\n return this.socket?.readyState;\n }\n\n /**\n * Check if connection is open\n */\n get isOpen(): boolean {\n return this.socket?.readyState === WebSocket.OPEN;\n }\n}\n","export const BASEURL = \"https://identityapi.pelicanidentity.com\";\nexport const APPLE_APP_STORE_URL =\n \"https://apps.apple.com/us/app/pelican-vault/id6755097751\";\nexport const PLAY_STORE_URL =\n \"https://play.google.com/store/apps/details?id=com.HeraculesDesignTechLtd.pelican\";\nexport const FALLBACK_URL = \"https://pelicanidentity.com/pelican-vault\";\n","import CryptoService from \"../utilities/crypto\";\nimport QRCode from \"qrcode\";\nimport {\n PelicanAuthConfig,\n PelicanAuthEventMap,\n ISocketMessage,\n IdentityResult,\n} from \"../types/types\";\nimport {\n storeAuthSession,\n getAuthSession,\n clearAuthSession,\n} from \"../utilities/storage\";\nimport { StateMachine } from \"../utilities/stateMachine\";\nimport { Transport } from \"../utilities/transport\";\n\nimport {\n APPLE_APP_STORE_URL,\n BASEURL,\n FALLBACK_URL,\n PLAY_STORE_URL,\n} from \"../constants\";\n\ntype Listener<T> = (payload: T) => void;\n\n/**\n * PelicanAuth SDK\n *\n * Uses WebSocket for QR code flow (desktop)\n * Uses visibility recovery for deep link flow (mobile)\n */\nexport class PelicanAuthentication {\n private readonly crypto = new CryptoService();\n private readonly stateMachine = new StateMachine();\n\n private transport?: Transport;\n private sessionId = \"\";\n private sessionKey: string | null = null;\n\n private visibilityHandler?: () => void;\n private backupCheckTimeout?: number;\n private useWebSocket = true;\n private deeplinkUrl: string | null = null;\n\n private listeners: {\n [K in keyof PelicanAuthEventMap]?: Set<Listener<any>>;\n } = {};\n\n private readonly config: Required<PelicanAuthConfig>;\n\n constructor(config: PelicanAuthConfig) {\n if (!config.publicKey) throw new Error(\"Missing publicKey\");\n if (!config.projectId) throw new Error(\"Missing projectId\");\n if (!config.authType) throw new Error(\"Missing authType\");\n\n this.config = {\n continuousMode: false,\n forceQRCode: false,\n ...config,\n };\n\n this.stateMachine.subscribe((s) => this.emit(\"state\", s));\n }\n\n /* -------------------- Public API -------------------- */\n\n on<K extends keyof PelicanAuthEventMap>(\n event: K,\n cb: Listener<PelicanAuthEventMap[K]>,\n ) {\n this.listeners[event] ??= new Set();\n this.listeners[event]!.add(cb);\n return () => this.listeners[event]!.delete(cb);\n }\n\n async start() {\n if (\n this.config.authType !== \"id-verification\" &&\n this.config.authType !== \"signup\" &&\n this.config.authType !== \"login\"\n ) {\n this.fail(new Error(\"Invalid authType\"));\n return;\n }\n\n if (!this.config.projectId) {\n this.fail(new Error(\"Missing projectId\"));\n return;\n }\n\n if (!this.config.publicKey) {\n this.fail(new Error(\"Missing publicKey\"));\n return;\n }\n if (this.stateMachine.current !== \"idle\") return;\n\n this.resetSession();\n clearAuthSession();\n this.stateMachine.transition(\"initializing\");\n\n try {\n // Generate session credentials\n this.sessionKey = this.crypto.generateSymmetricKey();\n this.sessionId = crypto.randomUUID() + crypto.randomUUID();\n\n // Decide: WebSocket (QR) or Deep Link\n this.useWebSocket = this.shouldUseWebSocket();\n\n if (this.useWebSocket) {\n await this.startWebSocketFlow();\n } else {\n await this.startDeepLinkFlow();\n }\n } catch (err) {\n this.fail(err instanceof Error ? err : new Error(\"Start failed\"));\n }\n }\n\n stop() {\n this.terminate(false);\n }\n\n openWebAuth() {\n if (!this.sessionKey || !this.sessionId) {\n this.fail(\n new Error(\"No active session. Call start() before openWebAuth().\"),\n );\n return;\n }\n\n const openerOrigin = window.location.origin;\n\n const urlParams = new URLSearchParams({\n projectId: this.config.projectId,\n publicKey: this.config.publicKey,\n authType: this.config.authType,\n sessionId: this.sessionId,\n sessionKey: this.sessionKey,\n origin: openerOrigin,\n });\n\n const authUrl = `https://vault.pelicanidentity.com/auth?${urlParams.toString()}`;\n\n // Try popup first, fall back to new tab if blocked\n const authWindow =\n window.open(\n authUrl,\n \"pelican-auth\",\n \"width=480,height=640,left=400,top=100,resizable=no,scrollbars=no\",\n ) ?? window.open(authUrl, \"_blank\");\n\n if (!authWindow) {\n // Both popup and new tab blocked — nothing we can do\n this.fail(\n new Error(\n \"Unable to open authentication window. Please allow popups for this site and try again.\",\n ),\n );\n return;\n }\n\n this.detachVisibilityRecovery();\n this.transport?.close();\n this.transport = undefined;\n\n authWindow.focus();\n this.stateMachine.transition(\"awaiting-pair\");\n\n const cleanup = () => {\n window.removeEventListener(\"message\", handleMessage);\n clearInterval(closedPoller);\n };\n\n const handleMessage = (event: MessageEvent) => {\n // Only accept messages from the vault — prevents origin spoofing\n if (event.origin !== \"https://vault.pelicanidentity.com\") return;\n\n // Ensure message came from the specific window we opened\n // Works for both popup and new tab since window.opener is preserved either way\n if (event.source !== authWindow) return;\n\n const { type, payload } = event.data ?? {};\n\n if (type === \"pelican-auth-success\") {\n console.log(\"Web auth success\");\n cleanup();\n\n if (!payload?.cipher || !payload?.nonce) {\n this.fail(new Error(\"Invalid web auth payload\"));\n this.restartIfContinuous();\n return;\n }\n\n try {\n const decrypted = this.crypto.decryptSymmetric({\n encrypted: { cipher: payload.cipher, nonce: payload.nonce },\n keyString: this.sessionKey!,\n });\n\n if (!decrypted) {\n this.fail(new Error(\"Failed to decrypt web auth response\"));\n this.restartIfContinuous();\n return;\n }\n\n const result: IdentityResult = JSON.parse(decrypted);\n this.emit(\"success\", result);\n this.stateMachine.transition(\"authenticated\");\n this.restartIfContinuous();\n } catch {\n this.fail(new Error(\"Failed to decrypt web auth response\"));\n this.restartIfContinuous();\n }\n }\n\n if (type === \"pelican-auth-cancelled\") {\n cleanup();\n this.fail(new Error(\"Authentication cancelled\"));\n this.restartIfContinuous();\n }\n\n if (type === \"pelican-auth-error\") {\n cleanup();\n this.fail(new Error(payload?.message ?? \"Web auth failed\"));\n this.restartIfContinuous();\n }\n };\n\n window.addEventListener(\"message\", handleMessage);\n\n // Poll for manual close — works for both popup and new tab\n // New tab edge case: if user navigates away without closing, closed stays false\n // until they actually close the tab — acceptable tradeoff vs hard failing\n const closedPoller = setInterval(() => {\n if (!authWindow.closed) return;\n cleanup();\n if (\n ![\"authenticated\", \"confirmed\", \"error\"].includes(\n this.stateMachine.current,\n )\n ) {\n this.fail(new Error(\"Authentication window closed\"));\n this.restartIfContinuous();\n }\n }, 500);\n }\n\n destroy() {\n this.detachVisibilityRecovery();\n this.clearBackupCheck();\n this.transport?.close();\n this.transport = undefined;\n this.listeners = {};\n }\n\n useQrInstead() {\n this.useWebSocket = true;\n\n this.emit(\"deeplink\", \"\");\n this.stateMachine.transition(\"initializing\");\n this.startWebSocketFlow();\n }\n\n useDeepLinkInstead() {\n this.useWebSocket = false;\n this.stateMachine.transition(\"initializing\");\n this.startDeepLinkFlow();\n }\n /* -------------------- Flow Selection -------------------- */\n\n private shouldUseWebSocket(): boolean {\n const userAgent = navigator.userAgent;\n\n const isTablet = /(iPad|Android(?!.*Mobile))/i.test(userAgent);\n const isMobile =\n /Android|webOS|iPhone|iPod|BlackBerry|IEMobile|Opera Mini/i.test(\n userAgent,\n );\n\n const useWebSocket = isMobile && !isTablet;\n return this.config.forceQRCode || !useWebSocket;\n }\n\n /* -------------------- WebSocket Flow (QR Code) -------------------- */\n\n private async startWebSocketFlow() {\n const { relayUrl, deeplinkUrl } = await this.fetchRelayUrl();\n\n this.transport = new Transport({\n onOpen: () => {\n this.transport!.send({\n type: \"register\",\n sessionID: this.sessionId,\n ...this.config,\n });\n this.stateMachine.transition(\"awaiting-pair\");\n },\n onMessage: (msg: ISocketMessage) => this.handleWebSocketMessage(msg),\n onError: (err) => {\n console.error(\"WebSocket error:\", err);\n this.fail(new Error(\"WebSocket connection failed\"));\n },\n });\n\n this.transport.connect(relayUrl);\n await this.emitQRCode(deeplinkUrl);\n }\n\n private handleWebSocketMessage(msg: ISocketMessage) {\n switch (msg.type) {\n case \"paired\":\n this.stateMachine.transition(\"paired\");\n this.transport!.send({\n type: \"authenticate\",\n sessionID: this.sessionId,\n ...this.config,\n url: window.location.href,\n });\n return;\n\n case \"phone-auth-success\":\n this.handleAuthSuccess(msg);\n return;\n\n case \"phone-terminated\":\n this.fail(new Error(\"Authentication cancelled on device\"));\n this.restartIfContinuous();\n return;\n\n case \"confirmed\":\n this.terminate(true);\n this.restartIfContinuous();\n return;\n }\n }\n\n private handleAuthSuccess(msg: ISocketMessage) {\n if (!this.sessionKey || !msg.cipher || !msg.nonce) {\n this.fail(new Error(\"Invalid authentication payload\"));\n this.restartIfContinuous();\n return;\n }\n\n try {\n const decrypted = this.crypto.decryptSymmetric({\n encrypted: { cipher: msg.cipher, nonce: msg.nonce },\n keyString: this.sessionKey,\n });\n\n if (!decrypted) {\n this.fail(new Error(\"Invalid authentication data\"));\n this.restartIfContinuous();\n return;\n }\n\n const result: IdentityResult = JSON.parse(decrypted);\n\n this.emit(\"success\", result);\n this.stateMachine.transition(\"authenticated\");\n\n // Confirm receipt\n this.transport?.send({\n type: \"confirm\",\n sessionID: this.sessionId,\n });\n } catch {\n this.fail(new Error(\"Failed to decrypt authentication data\"));\n this.restartIfContinuous();\n }\n }\n\n /* -------------------- Deep Link Flow (Mobile) -------------------- */\n\n private async startDeepLinkFlow() {\n const { deeplinkUrl } = await this.fetchRelayUrl();\n\n if (this.sessionKey) {\n storeAuthSession(this.sessionId, this.sessionKey, 10 * 60_000); // 10 min TTL\n }\n\n await this.emitDeepLink(deeplinkUrl);\n this.deeplinkUrl = deeplinkUrl;\n\n this.stateMachine.transition(\"awaiting-pair\");\n }\n\n public openDeepLink() {\n if (!this.deeplinkUrl) {\n this.fail(new Error(\"Deep link not found\"));\n return;\n }\n\n const userAgent = navigator.userAgent;\n let fallbackUrl = FALLBACK_URL;\n\n if (/iPad|iPhone|iPod/.test(userAgent)) {\n fallbackUrl = APPLE_APP_STORE_URL;\n } else if (/android/i.test(userAgent)) {\n fallbackUrl = PLAY_STORE_URL;\n }\n\n const start = Date.now();\n window.location.href = this.deeplinkUrl;\n\n setTimeout(() => {\n // Increased to 3 seconds for better UX/Reliability\n // We check if the elapsed time is less than 3500ms\n // to ensure the tab hasn't been suspended/backgrounded.\n if (Date.now() - start < 3500) {\n window.location.href = fallbackUrl;\n }\n }, 3000);\n }\n \n private clearBackupCheck() {\n if (this.backupCheckTimeout) {\n clearTimeout(this.backupCheckTimeout);\n this.backupCheckTimeout = undefined;\n }\n }\n\n private async checkSession() {\n const cached = getAuthSession();\n if (!cached) {\n this.fail(new Error(\"Authentication session not found\"));\n this.restartIfContinuous();\n return;\n }\n\n this.stateMachine.transition(\"awaiting-auth\");\n try {\n const res = await fetch(\n `${BASEURL}/session?session_id=${cached.sessionId}`,\n );\n\n // Session not ready yet\n if (!res.ok) {\n this.fail(new Error(\"Session not found\"));\n this.restartIfContinuous();\n return;\n }\n\n const data = await res.json();\n const decrypted = this.crypto.decryptSymmetric({\n encrypted: { cipher: data.cipher, nonce: data.nonce },\n keyString: cached.sessionKey,\n });\n\n if (!decrypted) {\n console.warn(\"Failed to decrypt session\");\n this.fail(new Error(\"Failed to decrypt session\"));\n this.restartIfContinuous();\n return;\n }\n\n const result: IdentityResult = JSON.parse(decrypted);\n\n // Success!\n this.clearBackupCheck();\n clearAuthSession();\n\n this.emit(\"success\", result);\n this.stateMachine.transition(\"authenticated\");\n\n // In continuous mode, restart after delay\n if (this.config.continuousMode) {\n setTimeout(() => {\n this.stateMachine.transition(\"idle\");\n this.start();\n }, 1500);\n } else {\n this.stateMachine.transition(\"idle\");\n }\n } catch (err) {\n console.debug(\"Session check failed:\", err);\n this.fail(new Error(\"Session check failed\"));\n this.restartIfContinuous();\n return;\n }\n }\n\n /* -------------------- Entry Point Generation -------------------- */\n\n private async emitQRCode(deeplinkUrl: string) {\n const embeddedUrl = `${deeplinkUrl}?sessionID=${encodeURIComponent(\n this.sessionId,\n )}&sessionKey=${encodeURIComponent(\n this.sessionKey!,\n )}&publicKey=${encodeURIComponent(this.config.publicKey)}&authType=${\n this.config.authType\n }&projectId=${encodeURIComponent(this.config.projectId)}`;\n\n const qr = await QRCode.toDataURL(embeddedUrl, {\n type: \"image/png\",\n scale: 3,\n color: { light: \"#ffffff\", dark: \"#424242ff\" },\n });\n\n this.emit(\"qr\", qr);\n }\n\n private async emitDeepLink(deeplinkUrl: string) {\n const deeplink = `${deeplinkUrl}?sessionID=${encodeURIComponent(\n this.sessionId,\n )}&sessionKey=${encodeURIComponent(\n this.sessionKey!,\n )}&publicKey=${encodeURIComponent(this.config.publicKey)}&authType=${\n this.config.authType\n }&projectId=${encodeURIComponent(this.config.projectId)}`;\n\n this.emit(\"deeplink\", deeplink);\n }\n\n /* -------------------- Visibility Recovery -------------------- */\n\n public attachVisibilityRecovery() {\n let fired = false;\n this.visibilityHandler = async () => {\n if (document.visibilityState !== \"visible\") return;\n\n // Only check for deep link flow\n if (this.useWebSocket) return;\n\n if (fired) return;\n fired = true;\n\n // Check session when page becomes visible\n await this.checkSession();\n };\n\n document.addEventListener(\"visibilitychange\", this.visibilityHandler);\n }\n\n private detachVisibilityRecovery() {\n if (this.visibilityHandler) {\n document.removeEventListener(\"visibilitychange\", this.visibilityHandler);\n this.visibilityHandler = undefined;\n }\n }\n\n /* -------------------- Helpers -------------------- */\n\n private async fetchRelayUrl(): Promise<{\n deeplinkUrl: string;\n relayUrl: string;\n }> {\n const { publicKey, projectId, authType } = this.config;\n const res = await fetch(\n `${BASEURL}/relay?public_key=${publicKey}&auth_type=${authType}&project_id=${projectId}`,\n );\n\n if (!res.ok) {\n const error = await res.text();\n throw new Error(error);\n }\n\n const json = await res.json();\n return { deeplinkUrl: json.deeplink_url, relayUrl: json.relay_url };\n }\n\n private terminate(success: boolean) {\n // Clear backup check\n this.clearBackupCheck();\n\n // Close WebSocket if active\n if (this.transport) {\n if (!success) {\n this.transport.send({\n type: \"client-terminated\",\n sessionID: this.sessionId,\n projectId: this.config.projectId,\n publicKey: this.config.publicKey,\n authType: this.config.authType,\n });\n }\n this.transport.close();\n this.transport = undefined;\n }\n\n clearAuthSession();\n this.resetSession();\n\n if (!this.config.continuousMode) {\n this.detachVisibilityRecovery();\n }\n\n this.stateMachine.transition(success ? \"confirmed\" : \"idle\");\n }\n\n private restartIfContinuous() {\n if (this.config.continuousMode) {\n this.stateMachine.transition(\"idle\");\n this.clearBackupCheck();\n this.transport?.close();\n this.transport = undefined;\n setTimeout(() => {\n this.start();\n }, 150);\n } else {\n this.stateMachine.transition(\"idle\");\n }\n }\n\n private resetSession() {\n this.sessionId = \"\";\n this.sessionKey = null;\n }\n\n private emit<K extends keyof PelicanAuthEventMap>(\n event: K,\n payload: PelicanAuthEventMap[K],\n ) {\n this.listeners[event]?.forEach((cb) => cb(payload));\n }\n\n private fail(err: Error) {\n this.emit(\"error\", err);\n this.stateMachine.transition(\"error\");\n }\n}\n"]}
package/dist/index.mjs CHANGED
@@ -311,6 +311,9 @@ var Transport = class {
311
311
 
312
312
  // src/constants.ts
313
313
  var BASEURL = "https://identityapi.pelicanidentity.com";
314
+ var APPLE_APP_STORE_URL = "https://apps.apple.com/us/app/pelican-vault/id6755097751";
315
+ var PLAY_STORE_URL = "https://play.google.com/store/apps/details?id=com.HeraculesDesignTechLtd.pelican";
316
+ var FALLBACK_URL = "https://pelicanidentity.com/pelican-vault";
314
317
 
315
318
  // src/engine/engine.ts
316
319
  var PelicanAuthentication = class {
@@ -320,6 +323,7 @@ var PelicanAuthentication = class {
320
323
  this.sessionId = "";
321
324
  this.sessionKey = null;
322
325
  this.useWebSocket = true;
326
+ this.deeplinkUrl = null;
323
327
  this.listeners = {};
324
328
  if (!config.publicKey) throw new Error("Missing publicKey");
325
329
  if (!config.projectId) throw new Error("Missing projectId");
@@ -402,8 +406,6 @@ var PelicanAuthentication = class {
402
406
  return;
403
407
  }
404
408
  this.detachVisibilityRecovery();
405
- clearAuthSession();
406
- this.clearBackupCheck();
407
409
  this.transport?.close();
408
410
  this.transport = void 0;
409
411
  authWindow.focus();
@@ -573,10 +575,30 @@ var PelicanAuthentication = class {
573
575
  if (this.sessionKey) {
574
576
  storeAuthSession(this.sessionId, this.sessionKey, 10 * 6e4);
575
577
  }
576
- this.attachVisibilityRecovery();
577
578
  await this.emitDeepLink(deeplinkUrl);
579
+ this.deeplinkUrl = deeplinkUrl;
578
580
  this.stateMachine.transition("awaiting-pair");
579
581
  }
582
+ openDeepLink() {
583
+ if (!this.deeplinkUrl) {
584
+ this.fail(new Error("Deep link not found"));
585
+ return;
586
+ }
587
+ const userAgent = navigator.userAgent;
588
+ let fallbackUrl = FALLBACK_URL;
589
+ if (/iPad|iPhone|iPod/.test(userAgent)) {
590
+ fallbackUrl = APPLE_APP_STORE_URL;
591
+ } else if (/android/i.test(userAgent)) {
592
+ fallbackUrl = PLAY_STORE_URL;
593
+ }
594
+ const start = Date.now();
595
+ window.location.href = this.deeplinkUrl;
596
+ setTimeout(() => {
597
+ if (Date.now() - start < 3500) {
598
+ window.location.href = fallbackUrl;
599
+ }
600
+ }, 3e3);
601
+ }
580
602
  clearBackupCheck() {
581
603
  if (this.backupCheckTimeout) {
582
604
  clearTimeout(this.backupCheckTimeout);
@@ -587,9 +609,7 @@ var PelicanAuthentication = class {
587
609
  const cached = getAuthSession();
588
610
  if (!cached) {
589
611
  this.fail(new Error("Authentication session not found"));
590
- setTimeout(() => {
591
- this.stateMachine.transition("idle");
592
- }, 2e3);
612
+ this.restartIfContinuous();
593
613
  return;
594
614
  }
595
615
  this.stateMachine.transition("awaiting-auth");
@@ -599,9 +619,7 @@ var PelicanAuthentication = class {
599
619
  );
600
620
  if (!res.ok) {
601
621
  this.fail(new Error("Session not found"));
602
- setTimeout(() => {
603
- this.stateMachine.transition("idle");
604
- }, 2e3);
622
+ this.restartIfContinuous();
605
623
  return;
606
624
  }
607
625
  const data = await res.json();
@@ -612,9 +630,7 @@ var PelicanAuthentication = class {
612
630
  if (!decrypted) {
613
631
  console.warn("Failed to decrypt session");
614
632
  this.fail(new Error("Failed to decrypt session"));
615
- setTimeout(() => {
616
- this.stateMachine.transition("idle");
617
- }, 2e3);
633
+ this.restartIfContinuous();
618
634
  return;
619
635
  }
620
636
  const result = JSON.parse(decrypted);
@@ -633,9 +649,7 @@ var PelicanAuthentication = class {
633
649
  } catch (err) {
634
650
  console.debug("Session check failed:", err);
635
651
  this.fail(new Error("Session check failed"));
636
- setTimeout(() => {
637
- this.stateMachine.transition("idle");
638
- }, 2e3);
652
+ this.restartIfContinuous();
639
653
  return;
640
654
  }
641
655
  }
@@ -663,9 +677,12 @@ var PelicanAuthentication = class {
663
677
  }
664
678
  /* -------------------- Visibility Recovery -------------------- */
665
679
  attachVisibilityRecovery() {
680
+ let fired = false;
666
681
  this.visibilityHandler = async () => {
667
682
  if (document.visibilityState !== "visible") return;
668
683
  if (this.useWebSocket) return;
684
+ if (fired) return;
685
+ fired = true;
669
686
  await this.checkSession();
670
687
  };
671
688
  document.addEventListener("visibilitychange", this.visibilityHandler);
@@ -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":";;;;;AAQO,IAAM,gBAAN,MAAoB;AAAA,EACzB,oBAAA,GAA+B;AAC7B,IAAA,MAAM,GAAA,GAAM,IAAA,CAAK,WAAA,CAAY,EAAE,CAAA;AAC/B,IAAA,OAAO,aAAa,GAAG,CAAA;AAAA,EACzB;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EASA,gBAAA,CAAiB;AAAA,IACf,SAAA;AAAA,IACA;AAAA,GACF,EAGqB;AACnB,IAAA,MAAM,GAAA,GAAM,aAAa,SAAS,CAAA;AAClC,IAAA,MAAM,KAAA,GAAQ,IAAA,CAAK,WAAA,CAAY,EAAE,CAAA;AAEjC,IAAA,MAAM,YAAA,GAAe,IAAI,WAAA,EAAY,CAAE,OAAO,SAAS,CAAA;AAEvD,IAAA,MAAM,UAAA,GAAa,IAAA,CAAK,SAAA,CAAU,YAAA,EAAc,OAAO,GAAG,CAAA;AAE1D,IAAA,OAAO;AAAA,MACL,MAAA,EAAQ,aAAa,UAAU,CAAA;AAAA,MAC/B,KAAA,EAAO,aAAa,KAAK;AAAA,KAC3B;AAAA,EACF;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAQA,gBAAA,CAAiB;AAAA,IACf,SAAA;AAAA,IACA;AAAA,GACF,EAGkB;AAChB,IAAA,IAAI;AACF,MAAA,MAAM,GAAA,GAAM,aAAa,SAAS,CAAA;AAClC,MAAA,MAAM,eAAA,GAAkB,YAAA,CAAa,SAAA,CAAU,MAAM,CAAA;AACrD,MAAA,MAAM,UAAA,GAAa,YAAA,CAAa,SAAA,CAAU,KAAK,CAAA;AAE/C,MAAA,MAAM,YAAY,IAAA,CAAK,SAAA,CAAU,IAAA,CAAK,eAAA,EAAiB,YAAY,GAAG,CAAA;AAEtE,MAAA,IAAI,CAAC,SAAA,EAAW;AACd,QAAA,MAAM,IAAI,MAAM,mDAAmD,CAAA;AAAA,MACrE;AAEA,MAAA,MAAM,OAAA,GAAU,IAAI,WAAA,EAAY,CAAE,OAAO,SAAS,CAAA;AAClD,MAAA,OAAO,OAAA;AAAA,IACT,SAAS,KAAA,EAAO;AACd,MAAA,OAAA,CAAQ,KAAA,CAAM,qBAAqB,KAAK,CAAA;AACxC,MAAA,OAAO,IAAA;AAAA,IACT;AAAA,EACF;AACF;AAEA,IAAO,cAAA,GAAQ,aAAA;;;AC/Df,IAAM,cAAN,MAAkB;AAAA,EAAlB,WAAA,GAAA;AACE,IAAA,IAAA,CAAiB,MAAA,GAAS,eAAA;AAC1B,IAAA,IAAA,CAAiB,UAAA,GAAa,IAAI,EAAA,GAAK,GAAA;AACvC;AAAA,IAAA,IAAA,CAAQ,WAAA,uBACF,GAAA,EAAI;AAAA,EAAA;AAAA;AAAA;AAAA;AAAA,EAKV,GAAA,CAAI,GAAA,EAAa,KAAA,EAAY,OAAA,GAA0B,EAAC,EAAS;AAC/D,IAAA,MAAM,EAAE,KAAA,GAAQ,IAAA,CAAK,UAAA,EAAY,iBAAA,GAAoB,MAAK,GAAI,OAAA;AAE9D,IAAA,MAAM,SAAA,GAAY,IAAA,CAAK,GAAA,EAAI,GAAI,KAAA;AAC/B,IAAA,MAAM,IAAA,GAAO,EAAE,KAAA,EAAO,SAAA,EAAU;AAGhC,IAAA,IAAI,iBAAA,EAAmB;AACrB,MAAA,IAAI;AACF,QAAA,cAAA,CAAe,OAAA,CAAQ,CAAA,EAAG,IAAA,CAAK,MAAM,CAAA,EAAG,GAAG,CAAA,CAAA,EAAI,IAAA,CAAK,SAAA,CAAU,IAAI,CAAC,CAAA;AAAA,MACrE,SAAS,KAAA,EAAO;AACd,QAAA,OAAA,CAAQ,IAAA,CAAK,6CAA6C,KAAK,CAAA;AAC/D,QAAA,IAAA,CAAK,SAAA,CAAU,KAAK,IAAI,CAAA;AAAA,MAC1B;AAAA,IACF,CAAA,MAAO;AACL,MAAA,IAAA,CAAK,SAAA,CAAU,KAAK,IAAI,CAAA;AAAA,IAC1B;AAAA,EACF;AAAA;AAAA;AAAA;AAAA,EAKA,IAAI,GAAA,EAAyB;AAE3B,IAAA,IAAI;AACF,MAAA,MAAM,MAAA,GAAS,eAAe,OAAA,CAAQ,CAAA,EAAG,KAAK,MAAM,CAAA,EAAG,GAAG,CAAA,CAAE,CAAA;AAC5D,MAAA,IAAI,MAAA,EAAQ;AACV,QAAA,MAAM,IAAA,GAAO,IAAA,CAAK,KAAA,CAAM,MAAM,CAAA;AAG9B,QAAA,IAAI,IAAA,CAAK,GAAA,EAAI,GAAI,IAAA,CAAK,SAAA,EAAW;AAC/B,UAAA,IAAA,CAAK,OAAO,GAAG,CAAA;AACf,UAAA,OAAO,IAAA;AAAA,QACT;AAEA,QAAA,OAAO,IAAA,CAAK,KAAA;AAAA,MACd;AAAA,IACF,SAAS,KAAA,EAAO;AAAA,IAEhB;AAGA,IAAA,OAAO,IAAA,CAAK,UAAU,GAAG,CAAA;AAAA,EAC3B;AAAA;AAAA;AAAA;AAAA,EAKA,OAAO,GAAA,EAAmB;AACxB,IAAA,IAAI;AACF,MAAA,cAAA,CAAe,WAAW,CAAA,EAAG,IAAA,CAAK,MAAM,CAAA,EAAG,GAAG,CAAA,CAAE,CAAA;AAAA,IAClD,SAAS,KAAA,EAAO;AAAA,IAEhB;AACA,IAAA,IAAA,CAAK,WAAA,CAAY,OAAO,GAAG,CAAA;AAAA,EAC7B;AAAA;AAAA;AAAA;AAAA,EAKA,KAAA,GAAc;AAEZ,IAAA,IAAI;AACF,MAAA,MAAA,CAAO,IAAA,CAAK,cAAc,CAAA,CAAE,OAAA,CAAQ,CAAC,GAAA,KAAQ;AAC3C,QAAA,IAAI,GAAA,CAAI,UAAA,CAAW,IAAA,CAAK,MAAM,CAAA,EAAG;AAC/B,UAAA,cAAA,CAAe,WAAW,GAAG,CAAA;AAAA,QAC/B;AAAA,MACF,CAAC,CAAA;AAAA,IACH,SAAS,KAAA,EAAO;AAAA,IAEhB;AAGA,IAAA,IAAA,CAAK,YAAY,KAAA,EAAM;AAAA,EACzB;AAAA;AAAA;AAAA;AAAA,EAMQ,SAAA,CACN,KACA,IAAA,EACM;AACN,IAAA,IAAA,CAAK,WAAA,CAAY,GAAA,CAAI,GAAA,EAAK,IAAI,CAAA;AAG9B,IAAA,MAAM,GAAA,GAAM,IAAA,CAAK,SAAA,GAAY,IAAA,CAAK,GAAA,EAAI;AACtC,IAAA,UAAA,CAAW,MAAM;AACf,MAAA,IAAA,CAAK,WAAA,CAAY,OAAO,GAAG,CAAA;AAAA,IAC7B,GAAG,GAAG,CAAA;AAAA,EACR;AAAA,EAEQ,UAAU,GAAA,EAAyB;AACzC,IAAA,MAAM,IAAA,GAAO,IAAA,CAAK,WAAA,CAAY,GAAA,CAAI,GAAG,CAAA;AACrC,IAAA,IAAI,CAAC,MAAM,OAAO,IAAA;AAElB,IAAA,IAAI,IAAA,CAAK,GAAA,EAAI,GAAI,IAAA,CAAK,SAAA,EAAW;AAC/B,MAAA,IAAA,CAAK,WAAA,CAAY,OAAO,GAAG,CAAA;AAC3B,MAAA,OAAO,IAAA;AAAA,IACT;AAEA,IAAA,OAAO,IAAA,CAAK,KAAA;AAAA,EACd;AACF,CAAA;AAGA,IAAM,OAAA,GAAU,IAAI,WAAA,EAAY;AAWzB,IAAM,gBAAA,GAAmB,CAC9B,SAAA,EACA,UAAA,EACA,KAAA,KACS;AACT,EAAA,OAAA,CAAQ,GAAA,CAAI,WAAW,EAAE,SAAA,EAAW,YAAW,EAAG,EAAE,OAAO,CAAA;AAC7D;AAEO,IAAM,iBAAiB,MAA0B;AACtD,EAAA,OAAO,OAAA,CAAQ,IAAI,SAAS,CAAA;AAC9B;AAEO,IAAM,mBAAmB,MAAY;AAC1C,EAAA,OAAA,CAAQ,OAAO,SAAS,CAAA;AAC1B;AAEO,IAAM,mBAAmB,MAAY;AAC1C,EAAA,OAAA,CAAQ,KAAA,EAAM;AAChB;;;AC1JO,IAAM,eAAN,MAAmB;AAAA,EAAnB,WAAA,GAAA;AACL,IAAA,IAAA,CAAQ,KAAA,GAA0B,MAAA;AAClC,IAAA,IAAA,CAAQ,SAAA,uBAAgB,GAAA,EAAmC;AAAA,EAAA;AAAA,EAE3D,IAAI,OAAA,GAAU;AACZ,IAAA,OAAO,IAAA,CAAK,KAAA;AAAA,EACd;AAAA,EAEA,WAAW,IAAA,EAAwB;AACjC,IAAA,IAAA,CAAK,KAAA,GAAQ,IAAA;AACb,IAAA,IAAA,CAAK,UAAU,OAAA,CAAQ,CAAC,CAAA,KAAM,CAAA,CAAE,IAAI,CAAC,CAAA;AAAA,EACvC;AAAA,EAEA,UAAU,EAAA,EAAmC;AAC3C,IAAA,IAAA,CAAK,SAAA,CAAU,IAAI,EAAE,CAAA;AACrB,IAAA,OAAO,MAAM,IAAA,CAAK,SAAA,CAAU,MAAA,CAAO,EAAE,CAAA;AAAA,EACvC;AACF;;;ACNO,IAAM,YAAN,MAAgB;AAAA,EAUrB,YAAY,QAAA,EAA6B;AAPzC,IAAA,IAAA,CAAQ,iBAAA,GAAoB,CAAA;AAC5B,IAAA,IAAA,CAAQ,oBAAA,GAAuB,CAAA;AAC/B;AAAA,IAAA,IAAA,CAAQ,kBAAA,GAAqB,KAAA;AAG7B,IAAA,IAAA,CAAQ,cAAA,GAAiB,KAAA;AAGvB,IAAA,IAAA,CAAK,QAAA,GAAW,QAAA;AAAA,EAClB;AAAA;AAAA;AAAA;AAAA;AAAA,EAMA,QAAQ,GAAA,EAAa;AACnB,IAAA,IAAA,CAAK,GAAA,GAAM,GAAA;AACX,IAAA,IAAA,CAAK,kBAAA,GAAqB,KAAA;AAG1B,IAAA,IAAI,KAAK,MAAA,EAAQ;AACf,MAAA,IAAA,CAAK,OAAO,OAAA,GAAU,IAAA;AACtB,MAAA,IAAA,CAAK,OAAO,OAAA,GAAU,IAAA;AACtB,MAAA,IAAA,CAAK,OAAO,SAAA,GAAY,IAAA;AACxB,MAAA,IAAA,CAAK,OAAO,MAAA,GAAS,IAAA;AAErB,MAAA,IACE,IAAA,CAAK,OAAO,UAAA,KAAe,SAAA,CAAU,QACrC,IAAA,CAAK,MAAA,CAAO,UAAA,KAAe,SAAA,CAAU,UAAA,EACrC;AACA,QAAA,IAAA,CAAK,OAAO,KAAA,EAAM;AAAA,MACpB;AAAA,IACF;AAEA,IAAA,IAAA,CAAK,MAAA,GAAS,IAAI,SAAA,CAAU,GAAG,CAAA;AAE/B,IAAA,IAAA,CAAK,MAAA,CAAO,SAAS,MAAM;AACzB,MAAA,IAAA,CAAK,iBAAA,GAAoB,CAAA;AACzB,MAAA,IAAA,CAAK,cAAA,GAAiB,KAAA;AACtB,MAAA,IAAA,CAAK,SAAS,MAAA,IAAS;AAAA,IACzB,CAAA;AAEA,IAAA,IAAA,CAAK,MAAA,CAAO,SAAA,GAAY,CAAC,CAAA,KAAoB;AAC3C,MAAA,IAAI;AACF,QAAA,MAAM,IAAA,GAAO,IAAA,CAAK,KAAA,CAAM,CAAA,CAAE,IAAI,CAAA;AAC9B,QAAA,IAAA,CAAK,QAAA,CAAS,YAAY,IAAI,CAAA;AAAA,MAChC,SAAS,GAAA,EAAK;AACZ,QAAA,OAAA,CAAQ,KAAA,CAAM,qCAAqC,GAAG,CAAA;AAAA,MACxD;AAAA,IACF,CAAA;AAEA,IAAA,IAAA,CAAK,MAAA,CAAO,OAAA,GAAU,CAAC,CAAA,KAAa;AAElC,MAAA,IAAI,CAAC,IAAA,CAAK,cAAA,IAAkB,CAAC,KAAK,kBAAA,EAAoB;AACpD,QAAA,IAAA,CAAK,QAAA,CAAS,UAAU,CAAC,CAAA;AAAA,MAC3B;AAAA,IACF,CAAA;AAEA,IAAA,IAAA,CAAK,MAAA,CAAO,OAAA,GAAU,CAAC,CAAA,KAAkB;AAEvC,MAAA,IAAI,KAAK,gBAAA,EAAkB;AACzB,QAAA,YAAA,CAAa,KAAK,gBAAgB,CAAA;AAClC,QAAA,IAAA,CAAK,gBAAA,GAAmB,MAAA;AAAA,MAC1B;AAGA,MAAA,IAAI,CAAC,KAAK,cAAA,EAAgB;AACxB,QAAA,IAAA,CAAK,QAAA,CAAS,UAAU,CAAC,CAAA;AAAA,MAC3B;AAMA,MAAA,IACE,CAAC,KAAK,kBAAA,IACN,CAAC,KAAK,cAAA,IACN,IAAA,CAAK,iBAAA,GAAoB,IAAA,CAAK,oBAAA,EAC9B;AACA,QAAA,IAAA,CAAK,gBAAA,EAAiB;AAAA,MACxB;AAAA,IACF,CAAA;AAAA,EACF;AAAA;AAAA;AAAA;AAAA,EAKQ,gBAAA,GAAmB;AACzB,IAAA,IAAI,IAAA,CAAK,iBAAA,IAAqB,IAAA,CAAK,oBAAA,EAAsB;AACvD,MAAA,OAAA,CAAQ,KAAK,0CAA0C,CAAA;AACvD,MAAA;AAAA,IACF;AAEA,IAAA,IAAA,CAAK,cAAA,GAAiB,IAAA;AACtB,IAAA,IAAA,CAAK,iBAAA,EAAA;AAGL,IAAA,MAAM,KAAA,GAAQ,IAAA,CAAK,GAAA,CAAI,IAAA,CAAK,GAAA,CAAI,CAAA,EAAG,IAAA,CAAK,iBAAA,GAAoB,CAAC,CAAA,GAAI,GAAA,EAAK,GAAI,CAAA;AAE1E,IAAA,OAAA,CAAQ,GAAA;AAAA,MACN,mCAAmC,IAAA,CAAK,iBAAiB,IAAI,IAAA,CAAK,oBAAoB,QAAQ,KAAK,CAAA,KAAA;AAAA,KACrG;AAEA,IAAA,IAAA,CAAK,gBAAA,GAAmB,MAAA,CAAO,UAAA,CAAW,MAAM;AAC9C,MAAA,IAAI,IAAA,CAAK,GAAA,IAAO,CAAC,IAAA,CAAK,kBAAA,EAAoB;AACxC,QAAA,IAAA,CAAK,OAAA,CAAQ,KAAK,GAAG,CAAA;AAAA,MACvB;AAAA,IACF,GAAG,KAAK,CAAA;AAAA,EACV;AAAA;AAAA;AAAA;AAAA;AAAA,EAMA,KAAK,OAAA,EAAyB;AAC5B,IAAA,IAAI,IAAA,CAAK,MAAA,EAAQ,UAAA,KAAe,SAAA,CAAU,IAAA,EAAM;AAC9C,MAAA,IAAI;AACF,QAAA,IAAA,CAAK,MAAA,CAAO,IAAA,CAAK,IAAA,CAAK,SAAA,CAAU,OAAO,CAAC,CAAA;AAAA,MAC1C,SAAS,GAAA,EAAK;AACZ,QAAA,OAAA,CAAQ,KAAA,CAAM,qCAAqC,GAAG,CAAA;AAAA,MACxD;AAAA,IACF,CAAA,MAAO;AACL,MAAA,OAAA,CAAQ,IAAA;AAAA,QACN,uCAAA;AAAA,QACA,KAAK,MAAA,EAAQ;AAAA,OACf;AAAA,IACF;AAAA,EACF;AAAA;AAAA;AAAA;AAAA;AAAA,EAMA,KAAA,GAAQ;AACN,IAAA,IAAA,CAAK,kBAAA,GAAqB,IAAA;AAC1B,IAAA,IAAA,CAAK,cAAA,GAAiB,KAAA;AAGtB,IAAA,IAAI,KAAK,gBAAA,EAAkB;AACzB,MAAA,YAAA,CAAa,KAAK,gBAAgB,CAAA;AAClC,MAAA,IAAA,CAAK,gBAAA,GAAmB,MAAA;AAAA,IAC1B;AAGA,IAAA,IAAI,KAAK,MAAA,EAAQ;AAEf,MAAA,IAAA,CAAK,OAAO,OAAA,GAAU,IAAA;AACtB,MAAA,IAAA,CAAK,OAAO,OAAA,GAAU,IAAA;AACtB,MAAA,IAAA,CAAK,OAAO,SAAA,GAAY,IAAA;AACxB,MAAA,IAAA,CAAK,OAAO,MAAA,GAAS,IAAA;AAErB,MAAA,IACE,IAAA,CAAK,OAAO,UAAA,KAAe,SAAA,CAAU,QACrC,IAAA,CAAK,MAAA,CAAO,UAAA,KAAe,SAAA,CAAU,UAAA,EACrC;AACA,QAAA,IAAA,CAAK,OAAO,KAAA,EAAM;AAAA,MACpB;AAEA,MAAA,IAAA,CAAK,MAAA,GAAS,MAAA;AAAA,IAChB;AAAA,EACF;AAAA;AAAA;AAAA;AAAA,EAKA,IAAI,UAAA,GAAiC;AACnC,IAAA,OAAO,KAAK,MAAA,EAAQ,UAAA;AAAA,EACtB;AAAA;AAAA;AAAA;AAAA,EAKA,IAAI,MAAA,GAAkB;AACpB,IAAA,OAAO,IAAA,CAAK,MAAA,EAAQ,UAAA,KAAe,SAAA,CAAU,IAAA;AAAA,EAC/C;AACF;;;AC/LO,IAAM,OAAA,GAAU;;;AC0BhB,IAAM,wBAAN,MAA4B;AAAA,EAkBjC,YAAY,MAAA,EAA2B;AAjBvC,IAAA,IAAA,CAAiB,MAAA,GAAS,IAAI,cAAA,EAAc;AAC5C,IAAA,IAAA,CAAiB,YAAA,GAAe,IAAI,YAAA,EAAa;AAGjD,IAAA,IAAA,CAAQ,SAAA,GAAY,EAAA;AACpB,IAAA,IAAA,CAAQ,UAAA,GAA4B,IAAA;AAIpC,IAAA,IAAA,CAAQ,YAAA,GAAe,IAAA;AAEvB,IAAA,IAAA,CAAQ,YAEJ,EAAC;AAKH,IAAA,IAAI,CAAC,MAAA,CAAO,SAAA,EAAW,MAAM,IAAI,MAAM,mBAAmB,CAAA;AAC1D,IAAA,IAAI,CAAC,MAAA,CAAO,SAAA,EAAW,MAAM,IAAI,MAAM,mBAAmB,CAAA;AAC1D,IAAA,IAAI,CAAC,MAAA,CAAO,QAAA,EAAU,MAAM,IAAI,MAAM,kBAAkB,CAAA;AAExD,IAAA,IAAA,CAAK,MAAA,GAAS;AAAA,MACZ,cAAA,EAAgB,KAAA;AAAA,MAChB,WAAA,EAAa,KAAA;AAAA,MACb,GAAG;AAAA,KACL;AAEA,IAAA,IAAA,CAAK,YAAA,CAAa,UAAU,CAAC,CAAA,KAAM,KAAK,IAAA,CAAK,OAAA,EAAS,CAAC,CAAC,CAAA;AAAA,EAC1D;AAAA;AAAA,EAIA,EAAA,CACE,OACA,EAAA,EACA;AA/DJ,IAAA,IAAA,EAAA;AAgEI,IAAA,CAAA,EAAA,GAAA,IAAA,CAAK,SAAA,EAAL,KAAA,CAAA,KAAA,EAAA,CAAA,KAAA,CAAA,mBAA0B,IAAI,GAAA,EAAI,CAAA;AAClC,IAAA,IAAA,CAAK,SAAA,CAAU,KAAK,CAAA,CAAG,GAAA,CAAI,EAAE,CAAA;AAC7B,IAAA,OAAO,MAAM,IAAA,CAAK,SAAA,CAAU,KAAK,CAAA,CAAG,OAAO,EAAE,CAAA;AAAA,EAC/C;AAAA,EAEA,MAAM,KAAA,GAAQ;AACZ,IAAA,IACE,IAAA,CAAK,MAAA,CAAO,QAAA,KAAa,iBAAA,IACzB,IAAA,CAAK,MAAA,CAAO,QAAA,KAAa,QAAA,IACzB,IAAA,CAAK,MAAA,CAAO,QAAA,KAAa,OAAA,EACzB;AACA,MAAA,IAAA,CAAK,IAAA,CAAK,IAAI,KAAA,CAAM,kBAAkB,CAAC,CAAA;AACvC,MAAA;AAAA,IACF;AAEA,IAAA,IAAI,CAAC,IAAA,CAAK,MAAA,CAAO,SAAA,EAAW;AAC1B,MAAA,IAAA,CAAK,IAAA,CAAK,IAAI,KAAA,CAAM,mBAAmB,CAAC,CAAA;AACxC,MAAA;AAAA,IACF;AAEA,IAAA,IAAI,CAAC,IAAA,CAAK,MAAA,CAAO,SAAA,EAAW;AAC1B,MAAA,IAAA,CAAK,IAAA,CAAK,IAAI,KAAA,CAAM,mBAAmB,CAAC,CAAA;AACxC,MAAA;AAAA,IACF;AACA,IAAA,IAAI,IAAA,CAAK,YAAA,CAAa,OAAA,KAAY,MAAA,EAAQ;AAE1C,IAAA,IAAA,CAAK,YAAA,EAAa;AAClB,IAAA,gBAAA,EAAiB;AACjB,IAAA,IAAA,CAAK,YAAA,CAAa,WAAW,cAAc,CAAA;AAE3C,IAAA,IAAI;AAEF,MAAA,IAAA,CAAK,UAAA,GAAa,IAAA,CAAK,MAAA,CAAO,oBAAA,EAAqB;AACnD,MAAA,IAAA,CAAK,SAAA,GAAY,MAAA,CAAO,UAAA,EAAW,GAAI,OAAO,UAAA,EAAW;AAGzD,MAAA,IAAA,CAAK,YAAA,GAAe,KAAK,kBAAA,EAAmB;AAE5C,MAAA,IAAI,KAAK,YAAA,EAAc;AACrB,QAAA,MAAM,KAAK,kBAAA,EAAmB;AAAA,MAChC,CAAA,MAAO;AACL,QAAA,MAAM,KAAK,iBAAA,EAAkB;AAAA,MAC/B;AAAA,IACF,SAAS,GAAA,EAAK;AACZ,MAAA,IAAA,CAAK,KAAK,GAAA,YAAe,KAAA,GAAQ,MAAM,IAAI,KAAA,CAAM,cAAc,CAAC,CAAA;AAAA,IAClE;AAAA,EACF;AAAA,EAEA,IAAA,GAAO;AACL,IAAA,IAAA,CAAK,UAAU,KAAK,CAAA;AAAA,EACtB;AAAA,EAEA,WAAA,GAAc;AACZ,IAAA,IAAI,CAAC,IAAA,CAAK,UAAA,IAAc,CAAC,KAAK,SAAA,EAAW;AACvC,MAAA,IAAA,CAAK,IAAA;AAAA,QACH,IAAI,MAAM,uDAAuD;AAAA,OACnE;AACA,MAAA;AAAA,IACF;AAEA,IAAA,MAAM,YAAA,GAAe,OAAO,QAAA,CAAS,MAAA;AAErC,IAAA,MAAM,SAAA,GAAY,IAAI,eAAA,CAAgB;AAAA,MACpC,SAAA,EAAW,KAAK,MAAA,CAAO,SAAA;AAAA,MACvB,SAAA,EAAW,KAAK,MAAA,CAAO,SAAA;AAAA,MACvB,QAAA,EAAU,KAAK,MAAA,CAAO,QAAA;AAAA,MACtB,WAAW,IAAA,CAAK,SAAA;AAAA,MAChB,YAAY,IAAA,CAAK,UAAA;AAAA,MACjB,MAAA,EAAQ;AAAA,KACT,CAAA;AAED,IAAA,MAAM,OAAA,GAAU,CAAA,uCAAA,EAA0C,SAAA,CAAU,QAAA,EAAU,CAAA,CAAA;AAG9E,IAAA,MAAM,aACJ,MAAA,CAAO,IAAA;AAAA,MACL,OAAA;AAAA,MACA,cAAA;AAAA,MACA;AAAA,KACF,IAAK,MAAA,CAAO,IAAA,CAAK,OAAA,EAAS,QAAQ,CAAA;AAEpC,IAAA,IAAI,CAAC,UAAA,EAAY;AAEf,MAAA,IAAA,CAAK,IAAA;AAAA,QACH,IAAI,KAAA;AAAA,UACF;AAAA;AACF,OACF;AACA,MAAA;AAAA,IACF;AAEA,IAAA,IAAA,CAAK,wBAAA,EAAyB;AAC9B,IAAA,gBAAA,EAAiB;AACjB,IAAA,IAAA,CAAK,gBAAA,EAAiB;AACtB,IAAA,IAAA,CAAK,WAAW,KAAA,EAAM;AACtB,IAAA,IAAA,CAAK,SAAA,GAAY,MAAA;AAEjB,IAAA,UAAA,CAAW,KAAA,EAAM;AACjB,IAAA,IAAA,CAAK,YAAA,CAAa,WAAW,eAAe,CAAA;AAE5C,IAAA,MAAM,UAAU,MAAM;AACpB,MAAA,MAAA,CAAO,mBAAA,CAAoB,WAAW,aAAa,CAAA;AACnD,MAAA,aAAA,CAAc,YAAY,CAAA;AAAA,IAC5B,CAAA;AAEA,IAAA,MAAM,aAAA,GAAgB,CAAC,KAAA,KAAwB;AAE7C,MAAA,IAAI,KAAA,CAAM,WAAW,mCAAA,EAAqC;AAI1D,MAAA,IAAI,KAAA,CAAM,WAAW,UAAA,EAAY;AAEjC,MAAA,MAAM,EAAE,IAAA,EAAM,OAAA,EAAQ,GAAI,KAAA,CAAM,QAAQ,EAAC;AAEzC,MAAA,IAAI,SAAS,sBAAA,EAAwB;AACnC,QAAA,OAAA,CAAQ,IAAI,kBAAkB,CAAA;AAC9B,QAAA,OAAA,EAAQ;AAER,QAAA,IAAI,CAAC,OAAA,EAAS,MAAA,IAAU,CAAC,SAAS,KAAA,EAAO;AACvC,UAAA,IAAA,CAAK,IAAA,CAAK,IAAI,KAAA,CAAM,0BAA0B,CAAC,CAAA;AAC/C,UAAA,IAAA,CAAK,mBAAA,EAAoB;AACzB,UAAA;AAAA,QACF;AAEA,QAAA,IAAI;AACF,UAAA,MAAM,SAAA,GAAY,IAAA,CAAK,MAAA,CAAO,gBAAA,CAAiB;AAAA,YAC7C,WAAW,EAAE,MAAA,EAAQ,QAAQ,MAAA,EAAQ,KAAA,EAAO,QAAQ,KAAA,EAAM;AAAA,YAC1D,WAAW,IAAA,CAAK;AAAA,WACjB,CAAA;AAED,UAAA,IAAI,CAAC,SAAA,EAAW;AACd,YAAA,IAAA,CAAK,IAAA,CAAK,IAAI,KAAA,CAAM,qCAAqC,CAAC,CAAA;AAC1D,YAAA,IAAA,CAAK,mBAAA,EAAoB;AACzB,YAAA;AAAA,UACF;AAEA,UAAA,MAAM,MAAA,GAAyB,IAAA,CAAK,KAAA,CAAM,SAAS,CAAA;AACnD,UAAA,IAAA,CAAK,IAAA,CAAK,WAAW,MAAM,CAAA;AAC3B,UAAA,IAAA,CAAK,YAAA,CAAa,WAAW,eAAe,CAAA;AAC5C,UAAA,IAAA,CAAK,mBAAA,EAAoB;AAAA,QAC3B,CAAA,CAAA,MAAQ;AACN,UAAA,IAAA,CAAK,IAAA,CAAK,IAAI,KAAA,CAAM,qCAAqC,CAAC,CAAA;AAC1D,UAAA,IAAA,CAAK,mBAAA,EAAoB;AAAA,QAC3B;AAAA,MACF;AAEA,MAAA,IAAI,SAAS,wBAAA,EAA0B;AACrC,QAAA,OAAA,EAAQ;AACR,QAAA,IAAA,CAAK,IAAA,CAAK,IAAI,KAAA,CAAM,0BAA0B,CAAC,CAAA;AAC/C,QAAA,IAAA,CAAK,mBAAA,EAAoB;AAAA,MAC3B;AAEA,MAAA,IAAI,SAAS,oBAAA,EAAsB;AACjC,QAAA,OAAA,EAAQ;AACR,QAAA,IAAA,CAAK,KAAK,IAAI,KAAA,CAAM,OAAA,EAAS,OAAA,IAAW,iBAAiB,CAAC,CAAA;AAC1D,QAAA,IAAA,CAAK,mBAAA,EAAoB;AAAA,MAC3B;AAAA,IACF,CAAA;AAEA,IAAA,MAAA,CAAO,gBAAA,CAAiB,WAAW,aAAa,CAAA;AAKhD,IAAA,MAAM,YAAA,GAAe,YAAY,MAAM;AACrC,MAAA,IAAI,CAAC,WAAW,MAAA,EAAQ;AACxB,MAAA,OAAA,EAAQ;AACR,MAAA,IACE,CAAC,CAAC,eAAA,EAAiB,WAAA,EAAa,OAAO,CAAA,CAAE,QAAA;AAAA,QACvC,KAAK,YAAA,CAAa;AAAA,OACpB,EACA;AACA,QAAA,IAAA,CAAK,IAAA,CAAK,IAAI,KAAA,CAAM,8BAA8B,CAAC,CAAA;AACnD,QAAA,IAAA,CAAK,mBAAA,EAAoB;AAAA,MAC3B;AAAA,IACF,GAAG,GAAG,CAAA;AAAA,EACR;AAAA,EAEA,OAAA,GAAU;AACR,IAAA,IAAA,CAAK,wBAAA,EAAyB;AAC9B,IAAA,IAAA,CAAK,gBAAA,EAAiB;AACtB,IAAA,IAAA,CAAK,WAAW,KAAA,EAAM;AACtB,IAAA,IAAA,CAAK,SAAA,GAAY,MAAA;AACjB,IAAA,IAAA,CAAK,YAAY,EAAC;AAAA,EACpB;AAAA,EAEA,YAAA,GAAe;AACb,IAAA,IAAA,CAAK,YAAA,GAAe,IAAA;AAEpB,IAAA,IAAA,CAAK,IAAA,CAAK,YAAY,EAAE,CAAA;AACxB,IAAA,IAAA,CAAK,YAAA,CAAa,WAAW,cAAc,CAAA;AAC3C,IAAA,IAAA,CAAK,kBAAA,EAAmB;AAAA,EAC1B;AAAA,EAEA,kBAAA,GAAqB;AACnB,IAAA,IAAA,CAAK,YAAA,GAAe,KAAA;AACpB,IAAA,IAAA,CAAK,YAAA,CAAa,WAAW,cAAc,CAAA;AAC3C,IAAA,IAAA,CAAK,iBAAA,EAAkB;AAAA,EACzB;AAAA;AAAA,EAGQ,kBAAA,GAA8B;AACpC,IAAA,MAAM,YAAY,SAAA,CAAU,SAAA;AAE5B,IAAA,MAAM,QAAA,GAAW,6BAAA,CAA8B,IAAA,CAAK,SAAS,CAAA;AAC7D,IAAA,MAAM,WACJ,2DAAA,CAA4D,IAAA;AAAA,MAC1D;AAAA,KACF;AAEF,IAAA,MAAM,YAAA,GAAe,YAAY,CAAC,QAAA;AAClC,IAAA,OAAO,IAAA,CAAK,MAAA,CAAO,WAAA,IAAe,CAAC,YAAA;AAAA,EACrC;AAAA;AAAA,EAIA,MAAc,kBAAA,GAAqB;AACjC,IAAA,MAAM,EAAE,QAAA,EAAU,WAAA,EAAY,GAAI,MAAM,KAAK,aAAA,EAAc;AAE3D,IAAA,IAAA,CAAK,SAAA,GAAY,IAAI,SAAA,CAAU;AAAA,MAC7B,QAAQ,MAAM;AACZ,QAAA,IAAA,CAAK,UAAW,IAAA,CAAK;AAAA,UACnB,IAAA,EAAM,UAAA;AAAA,UACN,WAAW,IAAA,CAAK,SAAA;AAAA,UAChB,GAAG,IAAA,CAAK;AAAA,SACT,CAAA;AACD,QAAA,IAAA,CAAK,YAAA,CAAa,WAAW,eAAe,CAAA;AAAA,MAC9C,CAAA;AAAA,MACA,SAAA,EAAW,CAAC,GAAA,KAAwB,IAAA,CAAK,uBAAuB,GAAG,CAAA;AAAA,MACnE,OAAA,EAAS,CAAC,GAAA,KAAQ;AAChB,QAAA,OAAA,CAAQ,KAAA,CAAM,oBAAoB,GAAG,CAAA;AACrC,QAAA,IAAA,CAAK,IAAA,CAAK,IAAI,KAAA,CAAM,6BAA6B,CAAC,CAAA;AAAA,MACpD;AAAA,KACD,CAAA;AAED,IAAA,IAAA,CAAK,SAAA,CAAU,QAAQ,QAAQ,CAAA;AAC/B,IAAA,MAAM,IAAA,CAAK,WAAW,WAAW,CAAA;AAAA,EACnC;AAAA,EAEQ,uBAAuB,GAAA,EAAqB;AAClD,IAAA,QAAQ,IAAI,IAAA;AAAM,MAChB,KAAK,QAAA;AACH,QAAA,IAAA,CAAK,YAAA,CAAa,WAAW,QAAQ,CAAA;AACrC,QAAA,IAAA,CAAK,UAAW,IAAA,CAAK;AAAA,UACnB,IAAA,EAAM,cAAA;AAAA,UACN,WAAW,IAAA,CAAK,SAAA;AAAA,UAChB,GAAG,IAAA,CAAK,MAAA;AAAA,UACR,GAAA,EAAK,OAAO,QAAA,CAAS;AAAA,SACtB,CAAA;AACD,QAAA;AAAA,MAEF,KAAK,oBAAA;AACH,QAAA,IAAA,CAAK,kBAAkB,GAAG,CAAA;AAC1B,QAAA;AAAA,MAEF,KAAK,kBAAA;AACH,QAAA,IAAA,CAAK,IAAA,CAAK,IAAI,KAAA,CAAM,oCAAoC,CAAC,CAAA;AACzD,QAAA,IAAA,CAAK,mBAAA,EAAoB;AACzB,QAAA;AAAA,MAEF,KAAK,WAAA;AACH,QAAA,IAAA,CAAK,UAAU,IAAI,CAAA;AACnB,QAAA,IAAA,CAAK,mBAAA,EAAoB;AACzB,QAAA;AAAA;AACJ,EACF;AAAA,EAEQ,kBAAkB,GAAA,EAAqB;AAC7C,IAAA,IAAI,CAAC,KAAK,UAAA,IAAc,CAAC,IAAI,MAAA,IAAU,CAAC,IAAI,KAAA,EAAO;AACjD,MAAA,IAAA,CAAK,IAAA,CAAK,IAAI,KAAA,CAAM,gCAAgC,CAAC,CAAA;AACrD,MAAA,IAAA,CAAK,mBAAA,EAAoB;AACzB,MAAA;AAAA,IACF;AAEA,IAAA,IAAI;AACF,MAAA,MAAM,SAAA,GAAY,IAAA,CAAK,MAAA,CAAO,gBAAA,CAAiB;AAAA,QAC7C,WAAW,EAAE,MAAA,EAAQ,IAAI,MAAA,EAAQ,KAAA,EAAO,IAAI,KAAA,EAAM;AAAA,QAClD,WAAW,IAAA,CAAK;AAAA,OACjB,CAAA;AAED,MAAA,IAAI,CAAC,SAAA,EAAW;AACd,QAAA,IAAA,CAAK,IAAA,CAAK,IAAI,KAAA,CAAM,6BAA6B,CAAC,CAAA;AAClD,QAAA,IAAA,CAAK,mBAAA,EAAoB;AACzB,QAAA;AAAA,MACF;AAEA,MAAA,MAAM,MAAA,GAAyB,IAAA,CAAK,KAAA,CAAM,SAAS,CAAA;AAEnD,MAAA,IAAA,CAAK,IAAA,CAAK,WAAW,MAAM,CAAA;AAC3B,MAAA,IAAA,CAAK,YAAA,CAAa,WAAW,eAAe,CAAA;AAG5C,MAAA,IAAA,CAAK,WAAW,IAAA,CAAK;AAAA,QACnB,IAAA,EAAM,SAAA;AAAA,QACN,WAAW,IAAA,CAAK;AAAA,OACjB,CAAA;AAAA,IACH,CAAA,CAAA,MAAQ;AACN,MAAA,IAAA,CAAK,IAAA,CAAK,IAAI,KAAA,CAAM,uCAAuC,CAAC,CAAA;AAC5D,MAAA,IAAA,CAAK,mBAAA,EAAoB;AAAA,IAC3B;AAAA,EACF;AAAA;AAAA,EAIA,MAAc,iBAAA,GAAoB;AAChC,IAAA,MAAM,EAAE,WAAA,EAAY,GAAI,MAAM,KAAK,aAAA,EAAc;AAGjD,IAAA,IAAI,KAAK,UAAA,EAAY;AACnB,MAAA,gBAAA,CAAiB,IAAA,CAAK,SAAA,EAAW,IAAA,CAAK,UAAA,EAAY,KAAK,GAAM,CAAA;AAAA,IAC/D;AAEA,IAAA,IAAA,CAAK,wBAAA,EAAyB;AAE9B,IAAA,MAAM,IAAA,CAAK,aAAa,WAAW,CAAA;AAGnC,IAAA,IAAA,CAAK,YAAA,CAAa,WAAW,eAAe,CAAA;AAAA,EAC9C;AAAA,EAEQ,gBAAA,GAAmB;AACzB,IAAA,IAAI,KAAK,kBAAA,EAAoB;AAC3B,MAAA,YAAA,CAAa,KAAK,kBAAkB,CAAA;AACpC,MAAA,IAAA,CAAK,kBAAA,GAAqB,MAAA;AAAA,IAC5B;AAAA,EACF;AAAA,EAEA,MAAc,YAAA,GAAe;AAC3B,IAAA,MAAM,SAAS,cAAA,EAAe;AAC9B,IAAA,IAAI,CAAC,MAAA,EAAQ;AACX,MAAA,IAAA,CAAK,IAAA,CAAK,IAAI,KAAA,CAAM,kCAAkC,CAAC,CAAA;AACvD,MAAA,UAAA,CAAW,MAAM;AACf,QAAA,IAAA,CAAK,YAAA,CAAa,WAAW,MAAM,CAAA;AAAA,MACrC,GAAG,GAAI,CAAA;AACP,MAAA;AAAA,IACF;AAEA,IAAA,IAAA,CAAK,YAAA,CAAa,WAAW,eAAe,CAAA;AAC5C,IAAA,IAAI;AACF,MAAA,MAAM,MAAM,MAAM,KAAA;AAAA,QAChB,CAAA,EAAG,OAAO,CAAA,oBAAA,EAAuB,MAAA,CAAO,SAAS,CAAA;AAAA,OACnD;AAGA,MAAA,IAAI,CAAC,IAAI,EAAA,EAAI;AACX,QAAA,IAAA,CAAK,IAAA,CAAK,IAAI,KAAA,CAAM,mBAAmB,CAAC,CAAA;AACxC,QAAA,UAAA,CAAW,MAAM;AACf,UAAA,IAAA,CAAK,YAAA,CAAa,WAAW,MAAM,CAAA;AAAA,QACrC,GAAG,GAAI,CAAA;AACP,QAAA;AAAA,MACF;AAEA,MAAA,MAAM,IAAA,GAAO,MAAM,GAAA,CAAI,IAAA,EAAK;AAC5B,MAAA,MAAM,SAAA,GAAY,IAAA,CAAK,MAAA,CAAO,gBAAA,CAAiB;AAAA,QAC7C,WAAW,EAAE,MAAA,EAAQ,KAAK,MAAA,EAAQ,KAAA,EAAO,KAAK,KAAA,EAAM;AAAA,QACpD,WAAW,MAAA,CAAO;AAAA,OACnB,CAAA;AAED,MAAA,IAAI,CAAC,SAAA,EAAW;AACd,QAAA,OAAA,CAAQ,KAAK,2BAA2B,CAAA;AACxC,QAAA,IAAA,CAAK,IAAA,CAAK,IAAI,KAAA,CAAM,2BAA2B,CAAC,CAAA;AAChD,QAAA,UAAA,CAAW,MAAM;AACf,UAAA,IAAA,CAAK,YAAA,CAAa,WAAW,MAAM,CAAA;AAAA,QACrC,GAAG,GAAI,CAAA;AACP,QAAA;AAAA,MACF;AAEA,MAAA,MAAM,MAAA,GAAyB,IAAA,CAAK,KAAA,CAAM,SAAS,CAAA;AAGnD,MAAA,IAAA,CAAK,gBAAA,EAAiB;AACtB,MAAA,gBAAA,EAAiB;AAEjB,MAAA,IAAA,CAAK,IAAA,CAAK,WAAW,MAAM,CAAA;AAC3B,MAAA,IAAA,CAAK,YAAA,CAAa,WAAW,eAAe,CAAA;AAG5C,MAAA,IAAI,IAAA,CAAK,OAAO,cAAA,EAAgB;AAC9B,QAAA,UAAA,CAAW,MAAM;AACf,UAAA,IAAA,CAAK,YAAA,CAAa,WAAW,MAAM,CAAA;AACnC,UAAA,IAAA,CAAK,KAAA,EAAM;AAAA,QACb,GAAG,IAAI,CAAA;AAAA,MACT,CAAA,MAAO;AACL,QAAA,IAAA,CAAK,YAAA,CAAa,WAAW,MAAM,CAAA;AAAA,MACrC;AAAA,IACF,SAAS,GAAA,EAAK;AACZ,MAAA,OAAA,CAAQ,KAAA,CAAM,yBAAyB,GAAG,CAAA;AAC1C,MAAA,IAAA,CAAK,IAAA,CAAK,IAAI,KAAA,CAAM,sBAAsB,CAAC,CAAA;AAC3C,MAAA,UAAA,CAAW,MAAM;AACf,QAAA,IAAA,CAAK,YAAA,CAAa,WAAW,MAAM,CAAA;AAAA,MACrC,GAAG,GAAI,CAAA;AACP,MAAA;AAAA,IACF;AAAA,EACF;AAAA;AAAA,EAIA,MAAc,WAAW,WAAA,EAAqB;AAC5C,IAAA,MAAM,WAAA,GAAc,CAAA,EAAG,WAAW,CAAA,WAAA,EAAc,kBAAA;AAAA,MAC9C,IAAA,CAAK;AAAA,KACN,CAAA,YAAA,EAAe,kBAAA;AAAA,MACd,IAAA,CAAK;AAAA,KACN,CAAA,WAAA,EAAc,kBAAA,CAAmB,IAAA,CAAK,MAAA,CAAO,SAAS,CAAC,CAAA,UAAA,EACtD,IAAA,CAAK,MAAA,CAAO,QACd,CAAA,WAAA,EAAc,kBAAA,CAAmB,IAAA,CAAK,MAAA,CAAO,SAAS,CAAC,CAAA,CAAA;AAEvD,IAAA,MAAM,EAAA,GAAK,MAAM,MAAA,CAAO,SAAA,CAAU,WAAA,EAAa;AAAA,MAC7C,IAAA,EAAM,WAAA;AAAA,MACN,KAAA,EAAO,CAAA;AAAA,MACP,KAAA,EAAO,EAAE,KAAA,EAAO,SAAA,EAAW,MAAM,WAAA;AAAY,KAC9C,CAAA;AAED,IAAA,IAAA,CAAK,IAAA,CAAK,MAAM,EAAE,CAAA;AAAA,EACpB;AAAA,EAEA,MAAc,aAAa,WAAA,EAAqB;AAC9C,IAAA,MAAM,QAAA,GAAW,CAAA,EAAG,WAAW,CAAA,WAAA,EAAc,kBAAA;AAAA,MAC3C,IAAA,CAAK;AAAA,KACN,CAAA,YAAA,EAAe,kBAAA;AAAA,MACd,IAAA,CAAK;AAAA,KACN,CAAA,WAAA,EAAc,kBAAA,CAAmB,IAAA,CAAK,MAAA,CAAO,SAAS,CAAC,CAAA,UAAA,EACtD,IAAA,CAAK,MAAA,CAAO,QACd,CAAA,WAAA,EAAc,kBAAA,CAAmB,IAAA,CAAK,MAAA,CAAO,SAAS,CAAC,CAAA,CAAA;AAEvD,IAAA,IAAA,CAAK,IAAA,CAAK,YAAY,QAAQ,CAAA;AAAA,EAChC;AAAA;AAAA,EAIQ,wBAAA,GAA2B;AACjC,IAAA,IAAA,CAAK,oBAAoB,YAAY;AACnC,MAAA,IAAI,QAAA,CAAS,oBAAoB,SAAA,EAAW;AAG5C,MAAA,IAAI,KAAK,YAAA,EAAc;AAGvB,MAAA,MAAM,KAAK,YAAA,EAAa;AAAA,IAC1B,CAAA;AAEA,IAAA,QAAA,CAAS,gBAAA,CAAiB,kBAAA,EAAoB,IAAA,CAAK,iBAAiB,CAAA;AAAA,EACtE;AAAA,EAEQ,wBAAA,GAA2B;AACjC,IAAA,IAAI,KAAK,iBAAA,EAAmB;AAC1B,MAAA,QAAA,CAAS,mBAAA,CAAoB,kBAAA,EAAoB,IAAA,CAAK,iBAAiB,CAAA;AACvE,MAAA,IAAA,CAAK,iBAAA,GAAoB,MAAA;AAAA,IAC3B;AAAA,EACF;AAAA;AAAA,EAIA,MAAc,aAAA,GAGX;AACD,IAAA,MAAM,EAAE,SAAA,EAAW,SAAA,EAAW,QAAA,KAAa,IAAA,CAAK,MAAA;AAChD,IAAA,MAAM,MAAM,MAAM,KAAA;AAAA,MAChB,GAAG,OAAO,CAAA,kBAAA,EAAqB,SAAS,CAAA,WAAA,EAAc,QAAQ,eAAe,SAAS,CAAA;AAAA,KACxF;AAEA,IAAA,IAAI,CAAC,IAAI,EAAA,EAAI;AACX,MAAA,MAAM,KAAA,GAAQ,MAAM,GAAA,CAAI,IAAA,EAAK;AAC7B,MAAA,MAAM,IAAI,MAAM,KAAK,CAAA;AAAA,IACvB;AAEA,IAAA,MAAM,IAAA,GAAO,MAAM,GAAA,CAAI,IAAA,EAAK;AAC5B,IAAA,OAAO,EAAE,WAAA,EAAa,IAAA,CAAK,YAAA,EAAc,QAAA,EAAU,KAAK,SAAA,EAAU;AAAA,EACpE;AAAA,EAEQ,UAAU,OAAA,EAAkB;AAElC,IAAA,IAAA,CAAK,gBAAA,EAAiB;AAGtB,IAAA,IAAI,KAAK,SAAA,EAAW;AAClB,MAAA,IAAI,CAAC,OAAA,EAAS;AACZ,QAAA,IAAA,CAAK,UAAU,IAAA,CAAK;AAAA,UAClB,IAAA,EAAM,mBAAA;AAAA,UACN,WAAW,IAAA,CAAK,SAAA;AAAA,UAChB,SAAA,EAAW,KAAK,MAAA,CAAO,SAAA;AAAA,UACvB,SAAA,EAAW,KAAK,MAAA,CAAO,SAAA;AAAA,UACvB,QAAA,EAAU,KAAK,MAAA,CAAO;AAAA,SACvB,CAAA;AAAA,MACH;AACA,MAAA,IAAA,CAAK,UAAU,KAAA,EAAM;AACrB,MAAA,IAAA,CAAK,SAAA,GAAY,MAAA;AAAA,IACnB;AAEA,IAAA,gBAAA,EAAiB;AACjB,IAAA,IAAA,CAAK,YAAA,EAAa;AAElB,IAAA,IAAI,CAAC,IAAA,CAAK,MAAA,CAAO,cAAA,EAAgB;AAC/B,MAAA,IAAA,CAAK,wBAAA,EAAyB;AAAA,IAChC;AAEA,IAAA,IAAA,CAAK,YAAA,CAAa,UAAA,CAAW,OAAA,GAAU,WAAA,GAAc,MAAM,CAAA;AAAA,EAC7D;AAAA,EAEQ,mBAAA,GAAsB;AAC5B,IAAA,IAAI,IAAA,CAAK,OAAO,cAAA,EAAgB;AAC9B,MAAA,IAAA,CAAK,YAAA,CAAa,WAAW,MAAM,CAAA;AACnC,MAAA,IAAA,CAAK,gBAAA,EAAiB;AACtB,MAAA,IAAA,CAAK,WAAW,KAAA,EAAM;AACtB,MAAA,IAAA,CAAK,SAAA,GAAY,MAAA;AACjB,MAAA,UAAA,CAAW,MAAM;AACf,QAAA,IAAA,CAAK,KAAA,EAAM;AAAA,MACb,GAAG,GAAG,CAAA;AAAA,IACR,CAAA,MAAO;AACL,MAAA,IAAA,CAAK,YAAA,CAAa,WAAW,MAAM,CAAA;AAAA,IACrC;AAAA,EACF;AAAA,EAEQ,YAAA,GAAe;AACrB,IAAA,IAAA,CAAK,SAAA,GAAY,EAAA;AACjB,IAAA,IAAA,CAAK,UAAA,GAAa,IAAA;AAAA,EACpB;AAAA,EAEQ,IAAA,CACN,OACA,OAAA,EACA;AACA,IAAA,IAAA,CAAK,SAAA,CAAU,KAAK,CAAA,EAAG,OAAA,CAAQ,CAAC,EAAA,KAAO,EAAA,CAAG,OAAO,CAAC,CAAA;AAAA,EACpD;AAAA,EAEQ,KAAK,GAAA,EAAY;AACvB,IAAA,IAAA,CAAK,IAAA,CAAK,SAAS,GAAG,CAAA;AACtB,IAAA,IAAA,CAAK,YAAA,CAAa,WAAW,OAAO,CAAA;AAAA,EACtC;AACF","file":"index.mjs","sourcesContent":["import nacl from \"tweetnacl\";\nimport { decodeBase64, encodeBase64 } from \"tweetnacl-util\";\n\ninterface EncryptedMessage {\n cipher: string; // Base64 encoded\n nonce: string; // Base64 encoded\n}\n\nexport class CryptoService {\n generateSymmetricKey(): string {\n const key = nacl.randomBytes(32);\n return encodeBase64(key);\n }\n\n /**\n * Encrypt with symmetric key (secret-key encryption)\n * Use this when both parties share the same secret key\n * @param plaintext - Message to encrypt\n * @param keyString - Symmetric key (base64)\n * @returns Encrypted message with nonce\n */\n encryptSymmetric({\n plaintext,\n keyString,\n }: {\n plaintext: string;\n keyString: string;\n }): EncryptedMessage {\n const key = decodeBase64(keyString);\n const nonce = nacl.randomBytes(24);\n\n const messageBytes = new TextEncoder().encode(plaintext);\n\n const ciphertext = nacl.secretbox(messageBytes, nonce, key);\n\n return {\n cipher: encodeBase64(ciphertext),\n nonce: encodeBase64(nonce),\n };\n }\n\n /**\n * Decrypt with symmetric key\n * @param encrypted - Encrypted message with nonce\n * @param keyString - Symmetric key (base64)\n * @returns Decrypted plaintext\n */\n decryptSymmetric({\n encrypted,\n keyString,\n }: {\n encrypted: EncryptedMessage;\n keyString: string;\n }): string | null {\n try {\n const key = decodeBase64(keyString);\n const ciphertextBytes = decodeBase64(encrypted.cipher);\n const nonceBytes = decodeBase64(encrypted.nonce);\n\n const decrypted = nacl.secretbox.open(ciphertextBytes, nonceBytes, key);\n\n if (!decrypted) {\n throw new Error(\"Decryption failed - invalid key or corrupted data\");\n }\n\n const decoded = new TextDecoder().decode(decrypted);\n return decoded;\n } catch (error) {\n console.error(\"Decryption failed\", error);\n return null;\n }\n }\n}\n\nexport default CryptoService;\nexport type { EncryptedMessage };\n","// hybridStorage.ts\n/**\n * Hybrid storage: Try sessionStorage first, fallback to memory\n * Best of both worlds - survives page refresh but auto-cleans\n */\n\ninterface StorageOptions {\n ttlMs?: number;\n useSessionStorage?: boolean;\n}\n\nclass AuthStorage {\n private readonly prefix = \"pelican_auth_\";\n private readonly defaultTTL = 5 * 60 * 1000; // 5 minutes\n private memoryCache: Map<string, { value: any; expiresAt: number }> =\n new Map();\n\n /**\n * Store auth session with automatic cleanup\n */\n set(key: string, value: any, options: StorageOptions = {}): void {\n const { ttlMs = this.defaultTTL, useSessionStorage = true } = options;\n\n const expiresAt = Date.now() + ttlMs;\n const data = { value, expiresAt };\n\n // Try sessionStorage first\n if (useSessionStorage) {\n try {\n sessionStorage.setItem(`${this.prefix}${key}`, JSON.stringify(data));\n } catch (error) {\n console.warn(\"SessionStorage unavailable, using memory:\", error);\n this.setMemory(key, data);\n }\n } else {\n this.setMemory(key, data);\n }\n }\n\n /**\n * Get stored value if not expired\n */\n get(key: string): any | null {\n // Try sessionStorage first\n try {\n const stored = sessionStorage.getItem(`${this.prefix}${key}`);\n if (stored) {\n const data = JSON.parse(stored);\n\n // Check expiration\n if (Date.now() > data.expiresAt) {\n this.remove(key);\n return null;\n }\n\n return data.value;\n }\n } catch (error) {\n // Fallback to memory\n }\n\n // Try memory cache\n return this.getMemory(key);\n }\n\n /**\n * Remove specific key\n */\n remove(key: string): void {\n try {\n sessionStorage.removeItem(`${this.prefix}${key}`);\n } catch (error) {\n // Ignore\n }\n this.memoryCache.delete(key);\n }\n\n /**\n * Clear all auth data\n */\n clear(): void {\n // Clear sessionStorage\n try {\n Object.keys(sessionStorage).forEach((key) => {\n if (key.startsWith(this.prefix)) {\n sessionStorage.removeItem(key);\n }\n });\n } catch (error) {\n // Ignore\n }\n\n // Clear memory\n this.memoryCache.clear();\n }\n\n // ========================================\n // Memory cache helpers\n // ========================================\n\n private setMemory(\n key: string,\n data: { value: any; expiresAt: number }\n ): void {\n this.memoryCache.set(key, data);\n\n // Schedule cleanup\n const ttl = data.expiresAt - Date.now();\n setTimeout(() => {\n this.memoryCache.delete(key);\n }, ttl);\n }\n\n private getMemory(key: string): any | null {\n const data = this.memoryCache.get(key);\n if (!data) return null;\n\n if (Date.now() > data.expiresAt) {\n this.memoryCache.delete(key);\n return null;\n }\n\n return data.value;\n }\n}\n\n// Singleton instance\nconst storage = new AuthStorage();\n\n// ========================================\n// Convenience functions for auth flow\n// ========================================\n\nexport interface AuthSession {\n sessionId: string;\n sessionKey: string;\n}\n\nexport const storeAuthSession = (\n sessionId: string,\n sessionKey: string,\n ttlMs?: number\n): void => {\n storage.set(\"session\", { sessionId, sessionKey }, { ttlMs });\n};\n\nexport const getAuthSession = (): AuthSession | null => {\n return storage.get(\"session\");\n};\n\nexport const clearAuthSession = (): void => {\n storage.remove(\"session\");\n};\n\nexport const clearAllAuthData = (): void => {\n storage.clear();\n};\n\nexport default storage;\n","import type { PelicanAuthState } from \"../types/types\";\n\nexport class StateMachine {\n private state: PelicanAuthState = \"idle\";\n private listeners = new Set<(s: PelicanAuthState) => void>();\n\n get current() {\n return this.state;\n }\n\n transition(next: PelicanAuthState) {\n this.state = next;\n this.listeners.forEach((l) => l(next));\n }\n\n subscribe(fn: (s: PelicanAuthState) => void) {\n this.listeners.add(fn);\n return () => this.listeners.delete(fn);\n }\n}\n","import { ISocketMessage } from \"../types/types\";\n\ntype TransportHandlers = {\n onOpen?: () => void;\n onMessage?: (msg: ISocketMessage) => void;\n onError?: (err: Event) => void;\n onClose?: (ev: CloseEvent) => void;\n};\n\n/**\n * WebSocket Transport with automatic reconnection\n * Handles connection lifecycle and message passing\n */\nexport class Transport {\n private socket?: WebSocket;\n private handlers: TransportHandlers;\n private reconnectAttempts = 0;\n private maxReconnectAttempts = 3; // Reduced from 5 for mobile\n private isExplicitlyClosed = false;\n private url?: string;\n private reconnectTimeout?: number;\n private isReconnecting = false;\n\n constructor(handlers: TransportHandlers) {\n this.handlers = handlers;\n }\n\n /**\n * Establish WebSocket connection\n * @param url - WebSocket URL\n */\n connect(url: string) {\n this.url = url;\n this.isExplicitlyClosed = false;\n\n // Clean up any existing socket\n if (this.socket) {\n this.socket.onclose = null;\n this.socket.onerror = null;\n this.socket.onmessage = null;\n this.socket.onopen = null;\n\n if (\n this.socket.readyState === WebSocket.OPEN ||\n this.socket.readyState === WebSocket.CONNECTING\n ) {\n this.socket.close();\n }\n }\n\n this.socket = new WebSocket(url);\n\n this.socket.onopen = () => {\n this.reconnectAttempts = 0;\n this.isReconnecting = false;\n this.handlers.onOpen?.();\n };\n\n this.socket.onmessage = (e: MessageEvent) => {\n try {\n const data = JSON.parse(e.data);\n this.handlers.onMessage?.(data);\n } catch (err) {\n console.error(\"Failed to parse WebSocket message\", err);\n }\n };\n\n this.socket.onerror = (e: Event) => {\n // Only emit error if not reconnecting and not explicitly closed\n if (!this.isReconnecting && !this.isExplicitlyClosed) {\n this.handlers.onError?.(e);\n }\n };\n\n this.socket.onclose = (e: CloseEvent) => {\n // Clear any pending reconnect timeout\n if (this.reconnectTimeout) {\n clearTimeout(this.reconnectTimeout);\n this.reconnectTimeout = undefined;\n }\n\n // Emit close event\n if (!this.isReconnecting) {\n this.handlers.onClose?.(e);\n }\n\n // Only reconnect if:\n // 1. Not explicitly closed by user\n // 2. Not already reconnecting\n // 3. Haven't exceeded max attempts\n if (\n !this.isExplicitlyClosed &&\n !this.isReconnecting &&\n this.reconnectAttempts < this.maxReconnectAttempts\n ) {\n this.attemptReconnect();\n }\n };\n }\n\n /**\n * Attempt to reconnect with exponential backoff\n */\n private attemptReconnect() {\n if (this.reconnectAttempts >= this.maxReconnectAttempts) {\n console.warn(\"Max WebSocket reconnect attempts reached\");\n return;\n }\n\n this.isReconnecting = true;\n this.reconnectAttempts++;\n\n // Exponential backoff: 500ms, 1s, 2s\n const delay = Math.min(Math.pow(2, this.reconnectAttempts - 1) * 500, 2000);\n\n console.log(\n `Reconnecting WebSocket (attempt ${this.reconnectAttempts}/${this.maxReconnectAttempts}) in ${delay}ms...`\n );\n\n this.reconnectTimeout = window.setTimeout(() => {\n if (this.url && !this.isExplicitlyClosed) {\n this.connect(this.url);\n }\n }, delay);\n }\n\n /**\n * Send a message through the WebSocket\n * Queues message if connection is not open\n */\n send(payload: ISocketMessage) {\n if (this.socket?.readyState === WebSocket.OPEN) {\n try {\n this.socket.send(JSON.stringify(payload));\n } catch (err) {\n console.error(\"Failed to send WebSocket message:\", err);\n }\n } else {\n console.warn(\n \"WebSocket not open, message not sent:\",\n this.socket?.readyState\n );\n }\n }\n\n /**\n * Close the WebSocket connection\n * Prevents automatic reconnection\n */\n close() {\n this.isExplicitlyClosed = true;\n this.isReconnecting = false;\n\n // Clear reconnect timeout\n if (this.reconnectTimeout) {\n clearTimeout(this.reconnectTimeout);\n this.reconnectTimeout = undefined;\n }\n\n // Close socket\n if (this.socket) {\n // Remove event listeners to prevent callbacks\n this.socket.onclose = null;\n this.socket.onerror = null;\n this.socket.onmessage = null;\n this.socket.onopen = null;\n\n if (\n this.socket.readyState === WebSocket.OPEN ||\n this.socket.readyState === WebSocket.CONNECTING\n ) {\n this.socket.close();\n }\n\n this.socket = undefined;\n }\n }\n\n /**\n * Get current connection state\n */\n get readyState(): number | undefined {\n return this.socket?.readyState;\n }\n\n /**\n * Check if connection is open\n */\n get isOpen(): boolean {\n return this.socket?.readyState === WebSocket.OPEN;\n }\n}\n","export const BASEURL = \"https://identityapi.pelicanidentity.com\";\n","import CryptoService from \"../utilities/crypto\";\nimport QRCode from \"qrcode\";\nimport {\n PelicanAuthConfig,\n PelicanAuthEventMap,\n ISocketMessage,\n IdentityResult,\n} from \"../types/types\";\nimport {\n storeAuthSession,\n getAuthSession,\n clearAuthSession,\n} from \"../utilities/storage\";\nimport { StateMachine } from \"../utilities/stateMachine\";\nimport { Transport } from \"../utilities/transport\";\n\nimport { BASEURL } from \"../constants\";\n\ntype Listener<T> = (payload: T) => void;\n\n/**\n * PelicanAuth SDK\n *\n * Uses WebSocket for QR code flow (desktop)\n * Uses visibility recovery for deep link flow (mobile)\n */\nexport class PelicanAuthentication {\n private readonly crypto = new CryptoService();\n private readonly stateMachine = new StateMachine();\n\n private transport?: Transport;\n private sessionId = \"\";\n private sessionKey: string | null = null;\n\n private visibilityHandler?: () => void;\n private backupCheckTimeout?: number;\n private useWebSocket = true;\n\n private listeners: {\n [K in keyof PelicanAuthEventMap]?: Set<Listener<any>>;\n } = {};\n\n private readonly config: Required<PelicanAuthConfig>;\n\n constructor(config: PelicanAuthConfig) {\n if (!config.publicKey) throw new Error(\"Missing publicKey\");\n if (!config.projectId) throw new Error(\"Missing projectId\");\n if (!config.authType) throw new Error(\"Missing authType\");\n\n this.config = {\n continuousMode: false,\n forceQRCode: false,\n ...config,\n };\n\n this.stateMachine.subscribe((s) => this.emit(\"state\", s));\n }\n\n /* -------------------- Public API -------------------- */\n\n on<K extends keyof PelicanAuthEventMap>(\n event: K,\n cb: Listener<PelicanAuthEventMap[K]>,\n ) {\n this.listeners[event] ??= new Set();\n this.listeners[event]!.add(cb);\n return () => this.listeners[event]!.delete(cb);\n }\n\n async start() {\n if (\n this.config.authType !== \"id-verification\" &&\n this.config.authType !== \"signup\" &&\n this.config.authType !== \"login\"\n ) {\n this.fail(new Error(\"Invalid authType\"));\n return;\n }\n\n if (!this.config.projectId) {\n this.fail(new Error(\"Missing projectId\"));\n return;\n }\n\n if (!this.config.publicKey) {\n this.fail(new Error(\"Missing publicKey\"));\n return;\n }\n if (this.stateMachine.current !== \"idle\") return;\n\n this.resetSession();\n clearAuthSession();\n this.stateMachine.transition(\"initializing\");\n\n try {\n // Generate session credentials\n this.sessionKey = this.crypto.generateSymmetricKey();\n this.sessionId = crypto.randomUUID() + crypto.randomUUID();\n\n // Decide: WebSocket (QR) or Deep Link\n this.useWebSocket = this.shouldUseWebSocket();\n\n if (this.useWebSocket) {\n await this.startWebSocketFlow();\n } else {\n await this.startDeepLinkFlow();\n }\n } catch (err) {\n this.fail(err instanceof Error ? err : new Error(\"Start failed\"));\n }\n }\n\n stop() {\n this.terminate(false);\n }\n\n openWebAuth() {\n if (!this.sessionKey || !this.sessionId) {\n this.fail(\n new Error(\"No active session. Call start() before openWebAuth().\"),\n );\n return;\n }\n\n const openerOrigin = window.location.origin;\n\n const urlParams = new URLSearchParams({\n projectId: this.config.projectId,\n publicKey: this.config.publicKey,\n authType: this.config.authType,\n sessionId: this.sessionId,\n sessionKey: this.sessionKey,\n origin: openerOrigin,\n });\n\n const authUrl = `https://vault.pelicanidentity.com/auth?${urlParams.toString()}`;\n\n // Try popup first, fall back to new tab if blocked\n const authWindow =\n window.open(\n authUrl,\n \"pelican-auth\",\n \"width=480,height=640,left=400,top=100,resizable=no,scrollbars=no\",\n ) ?? window.open(authUrl, \"_blank\");\n\n if (!authWindow) {\n // Both popup and new tab blocked — nothing we can do\n this.fail(\n new Error(\n \"Unable to open authentication window. Please allow popups for this site and try again.\",\n ),\n );\n return;\n }\n\n this.detachVisibilityRecovery();\n clearAuthSession();\n this.clearBackupCheck();\n this.transport?.close();\n this.transport = undefined;\n\n authWindow.focus();\n this.stateMachine.transition(\"awaiting-pair\");\n\n const cleanup = () => {\n window.removeEventListener(\"message\", handleMessage);\n clearInterval(closedPoller);\n };\n\n const handleMessage = (event: MessageEvent) => {\n // Only accept messages from the vault — prevents origin spoofing\n if (event.origin !== \"https://vault.pelicanidentity.com\") return;\n\n // Ensure message came from the specific window we opened\n // Works for both popup and new tab since window.opener is preserved either way\n if (event.source !== authWindow) return;\n\n const { type, payload } = event.data ?? {};\n\n if (type === \"pelican-auth-success\") {\n console.log(\"Web auth success\");\n cleanup();\n\n if (!payload?.cipher || !payload?.nonce) {\n this.fail(new Error(\"Invalid web auth payload\"));\n this.restartIfContinuous();\n return;\n }\n\n try {\n const decrypted = this.crypto.decryptSymmetric({\n encrypted: { cipher: payload.cipher, nonce: payload.nonce },\n keyString: this.sessionKey!,\n });\n\n if (!decrypted) {\n this.fail(new Error(\"Failed to decrypt web auth response\"));\n this.restartIfContinuous();\n return;\n }\n\n const result: IdentityResult = JSON.parse(decrypted);\n this.emit(\"success\", result);\n this.stateMachine.transition(\"authenticated\");\n this.restartIfContinuous();\n } catch {\n this.fail(new Error(\"Failed to decrypt web auth response\"));\n this.restartIfContinuous();\n }\n }\n\n if (type === \"pelican-auth-cancelled\") {\n cleanup();\n this.fail(new Error(\"Authentication cancelled\"));\n this.restartIfContinuous();\n }\n\n if (type === \"pelican-auth-error\") {\n cleanup();\n this.fail(new Error(payload?.message ?? \"Web auth failed\"));\n this.restartIfContinuous();\n }\n };\n\n window.addEventListener(\"message\", handleMessage);\n\n // Poll for manual close — works for both popup and new tab\n // New tab edge case: if user navigates away without closing, closed stays false\n // until they actually close the tab — acceptable tradeoff vs hard failing\n const closedPoller = setInterval(() => {\n if (!authWindow.closed) return;\n cleanup();\n if (\n ![\"authenticated\", \"confirmed\", \"error\"].includes(\n this.stateMachine.current,\n )\n ) {\n this.fail(new Error(\"Authentication window closed\"));\n this.restartIfContinuous();\n }\n }, 500);\n }\n\n destroy() {\n this.detachVisibilityRecovery();\n this.clearBackupCheck();\n this.transport?.close();\n this.transport = undefined;\n this.listeners = {};\n }\n\n useQrInstead() {\n this.useWebSocket = true;\n\n this.emit(\"deeplink\", \"\");\n this.stateMachine.transition(\"initializing\");\n this.startWebSocketFlow();\n }\n\n useDeepLinkInstead() {\n this.useWebSocket = false;\n this.stateMachine.transition(\"initializing\");\n this.startDeepLinkFlow();\n }\n /* -------------------- Flow Selection -------------------- */\n\n private shouldUseWebSocket(): boolean {\n const userAgent = navigator.userAgent;\n\n const isTablet = /(iPad|Android(?!.*Mobile))/i.test(userAgent);\n const isMobile =\n /Android|webOS|iPhone|iPod|BlackBerry|IEMobile|Opera Mini/i.test(\n userAgent,\n );\n\n const useWebSocket = isMobile && !isTablet;\n return this.config.forceQRCode || !useWebSocket;\n }\n\n /* -------------------- WebSocket Flow (QR Code) -------------------- */\n\n private async startWebSocketFlow() {\n const { relayUrl, deeplinkUrl } = await this.fetchRelayUrl();\n\n this.transport = new Transport({\n onOpen: () => {\n this.transport!.send({\n type: \"register\",\n sessionID: this.sessionId,\n ...this.config,\n });\n this.stateMachine.transition(\"awaiting-pair\");\n },\n onMessage: (msg: ISocketMessage) => this.handleWebSocketMessage(msg),\n onError: (err) => {\n console.error(\"WebSocket error:\", err);\n this.fail(new Error(\"WebSocket connection failed\"));\n },\n });\n\n this.transport.connect(relayUrl);\n await this.emitQRCode(deeplinkUrl);\n }\n\n private handleWebSocketMessage(msg: ISocketMessage) {\n switch (msg.type) {\n case \"paired\":\n this.stateMachine.transition(\"paired\");\n this.transport!.send({\n type: \"authenticate\",\n sessionID: this.sessionId,\n ...this.config,\n url: window.location.href,\n });\n return;\n\n case \"phone-auth-success\":\n this.handleAuthSuccess(msg);\n return;\n\n case \"phone-terminated\":\n this.fail(new Error(\"Authentication cancelled on device\"));\n this.restartIfContinuous();\n return;\n\n case \"confirmed\":\n this.terminate(true);\n this.restartIfContinuous();\n return;\n }\n }\n\n private handleAuthSuccess(msg: ISocketMessage) {\n if (!this.sessionKey || !msg.cipher || !msg.nonce) {\n this.fail(new Error(\"Invalid authentication payload\"));\n this.restartIfContinuous();\n return;\n }\n\n try {\n const decrypted = this.crypto.decryptSymmetric({\n encrypted: { cipher: msg.cipher, nonce: msg.nonce },\n keyString: this.sessionKey,\n });\n\n if (!decrypted) {\n this.fail(new Error(\"Invalid authentication data\"));\n this.restartIfContinuous();\n return;\n }\n\n const result: IdentityResult = JSON.parse(decrypted);\n\n this.emit(\"success\", result);\n this.stateMachine.transition(\"authenticated\");\n\n // Confirm receipt\n this.transport?.send({\n type: \"confirm\",\n sessionID: this.sessionId,\n });\n } catch {\n this.fail(new Error(\"Failed to decrypt authentication data\"));\n this.restartIfContinuous();\n }\n }\n\n /* -------------------- Deep Link Flow (Mobile) -------------------- */\n\n private async startDeepLinkFlow() {\n const { deeplinkUrl } = await this.fetchRelayUrl();\n\n // Store session for later recovery\n if (this.sessionKey) {\n storeAuthSession(this.sessionId, this.sessionKey, 10 * 60_000); // 10 min TTL\n }\n\n this.attachVisibilityRecovery();\n // Emit deep link\n await this.emitDeepLink(deeplinkUrl);\n\n // Move to awaiting state\n this.stateMachine.transition(\"awaiting-pair\");\n }\n\n private clearBackupCheck() {\n if (this.backupCheckTimeout) {\n clearTimeout(this.backupCheckTimeout);\n this.backupCheckTimeout = undefined;\n }\n }\n\n private async checkSession() {\n const cached = getAuthSession();\n if (!cached) {\n this.fail(new Error(\"Authentication session not found\"));\n setTimeout(() => {\n this.stateMachine.transition(\"idle\");\n }, 2000);\n return;\n }\n\n this.stateMachine.transition(\"awaiting-auth\");\n try {\n const res = await fetch(\n `${BASEURL}/session?session_id=${cached.sessionId}`,\n );\n\n // Session not ready yet\n if (!res.ok) {\n this.fail(new Error(\"Session not found\"));\n setTimeout(() => {\n this.stateMachine.transition(\"idle\");\n }, 2000);\n return;\n }\n\n const data = await res.json();\n const decrypted = this.crypto.decryptSymmetric({\n encrypted: { cipher: data.cipher, nonce: data.nonce },\n keyString: cached.sessionKey,\n });\n\n if (!decrypted) {\n console.warn(\"Failed to decrypt session\");\n this.fail(new Error(\"Failed to decrypt session\"));\n setTimeout(() => {\n this.stateMachine.transition(\"idle\");\n }, 2000);\n return;\n }\n\n const result: IdentityResult = JSON.parse(decrypted);\n\n // Success!\n this.clearBackupCheck();\n clearAuthSession();\n\n this.emit(\"success\", result);\n this.stateMachine.transition(\"authenticated\");\n\n // In continuous mode, restart after delay\n if (this.config.continuousMode) {\n setTimeout(() => {\n this.stateMachine.transition(\"idle\");\n this.start();\n }, 1500);\n } else {\n this.stateMachine.transition(\"idle\");\n }\n } catch (err) {\n console.debug(\"Session check failed:\", err);\n this.fail(new Error(\"Session check failed\"));\n setTimeout(() => {\n this.stateMachine.transition(\"idle\");\n }, 2000);\n return;\n }\n }\n\n /* -------------------- Entry Point Generation -------------------- */\n\n private async emitQRCode(deeplinkUrl: string) {\n const embeddedUrl = `${deeplinkUrl}?sessionID=${encodeURIComponent(\n this.sessionId,\n )}&sessionKey=${encodeURIComponent(\n this.sessionKey!,\n )}&publicKey=${encodeURIComponent(this.config.publicKey)}&authType=${\n this.config.authType\n }&projectId=${encodeURIComponent(this.config.projectId)}`;\n\n const qr = await QRCode.toDataURL(embeddedUrl, {\n type: \"image/png\",\n scale: 3,\n color: { light: \"#ffffff\", dark: \"#424242ff\" },\n });\n\n this.emit(\"qr\", qr);\n }\n\n private async emitDeepLink(deeplinkUrl: string) {\n const deeplink = `${deeplinkUrl}?sessionID=${encodeURIComponent(\n this.sessionId,\n )}&sessionKey=${encodeURIComponent(\n this.sessionKey!,\n )}&publicKey=${encodeURIComponent(this.config.publicKey)}&authType=${\n this.config.authType\n }&projectId=${encodeURIComponent(this.config.projectId)}`;\n\n this.emit(\"deeplink\", deeplink);\n }\n\n /* -------------------- Visibility Recovery -------------------- */\n\n private attachVisibilityRecovery() {\n this.visibilityHandler = async () => {\n if (document.visibilityState !== \"visible\") return;\n\n // Only check for deep link flow\n if (this.useWebSocket) return;\n\n // Check session when page becomes visible\n await this.checkSession();\n };\n\n document.addEventListener(\"visibilitychange\", this.visibilityHandler);\n }\n\n private detachVisibilityRecovery() {\n if (this.visibilityHandler) {\n document.removeEventListener(\"visibilitychange\", this.visibilityHandler);\n this.visibilityHandler = undefined;\n }\n }\n\n /* -------------------- Helpers -------------------- */\n\n private async fetchRelayUrl(): Promise<{\n deeplinkUrl: string;\n relayUrl: string;\n }> {\n const { publicKey, projectId, authType } = this.config;\n const res = await fetch(\n `${BASEURL}/relay?public_key=${publicKey}&auth_type=${authType}&project_id=${projectId}`,\n );\n\n if (!res.ok) {\n const error = await res.text();\n throw new Error(error);\n }\n\n const json = await res.json();\n return { deeplinkUrl: json.deeplink_url, relayUrl: json.relay_url };\n }\n\n private terminate(success: boolean) {\n // Clear backup check\n this.clearBackupCheck();\n\n // Close WebSocket if active\n if (this.transport) {\n if (!success) {\n this.transport.send({\n type: \"client-terminated\",\n sessionID: this.sessionId,\n projectId: this.config.projectId,\n publicKey: this.config.publicKey,\n authType: this.config.authType,\n });\n }\n this.transport.close();\n this.transport = undefined;\n }\n\n clearAuthSession();\n this.resetSession();\n\n if (!this.config.continuousMode) {\n this.detachVisibilityRecovery();\n }\n\n this.stateMachine.transition(success ? \"confirmed\" : \"idle\");\n }\n\n private restartIfContinuous() {\n if (this.config.continuousMode) {\n this.stateMachine.transition(\"idle\");\n this.clearBackupCheck();\n this.transport?.close();\n this.transport = undefined;\n setTimeout(() => {\n this.start();\n }, 150);\n } else {\n this.stateMachine.transition(\"idle\");\n }\n }\n\n private resetSession() {\n this.sessionId = \"\";\n this.sessionKey = null;\n }\n\n private emit<K extends keyof PelicanAuthEventMap>(\n event: K,\n payload: PelicanAuthEventMap[K],\n ) {\n this.listeners[event]?.forEach((cb) => cb(payload));\n }\n\n private fail(err: Error) {\n this.emit(\"error\", err);\n this.stateMachine.transition(\"error\");\n }\n}\n"]}
1
+ {"version":3,"sources":["../src/utilities/crypto.ts","../src/utilities/storage.ts","../src/utilities/stateMachine.ts","../src/utilities/transport.ts","../src/constants.ts","../src/engine/engine.ts"],"names":[],"mappings":"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","file":"index.mjs","sourcesContent":["import nacl from \"tweetnacl\";\nimport { decodeBase64, encodeBase64 } from \"tweetnacl-util\";\n\ninterface EncryptedMessage {\n cipher: string; // Base64 encoded\n nonce: string; // Base64 encoded\n}\n\nexport class CryptoService {\n generateSymmetricKey(): string {\n const key = nacl.randomBytes(32);\n return encodeBase64(key);\n }\n\n /**\n * Encrypt with symmetric key (secret-key encryption)\n * Use this when both parties share the same secret key\n * @param plaintext - Message to encrypt\n * @param keyString - Symmetric key (base64)\n * @returns Encrypted message with nonce\n */\n encryptSymmetric({\n plaintext,\n keyString,\n }: {\n plaintext: string;\n keyString: string;\n }): EncryptedMessage {\n const key = decodeBase64(keyString);\n const nonce = nacl.randomBytes(24);\n\n const messageBytes = new TextEncoder().encode(plaintext);\n\n const ciphertext = nacl.secretbox(messageBytes, nonce, key);\n\n return {\n cipher: encodeBase64(ciphertext),\n nonce: encodeBase64(nonce),\n };\n }\n\n /**\n * Decrypt with symmetric key\n * @param encrypted - Encrypted message with nonce\n * @param keyString - Symmetric key (base64)\n * @returns Decrypted plaintext\n */\n decryptSymmetric({\n encrypted,\n keyString,\n }: {\n encrypted: EncryptedMessage;\n keyString: string;\n }): string | null {\n try {\n const key = decodeBase64(keyString);\n const ciphertextBytes = decodeBase64(encrypted.cipher);\n const nonceBytes = decodeBase64(encrypted.nonce);\n\n const decrypted = nacl.secretbox.open(ciphertextBytes, nonceBytes, key);\n\n if (!decrypted) {\n throw new Error(\"Decryption failed - invalid key or corrupted data\");\n }\n\n const decoded = new TextDecoder().decode(decrypted);\n return decoded;\n } catch (error) {\n console.error(\"Decryption failed\", error);\n return null;\n }\n }\n}\n\nexport default CryptoService;\nexport type { EncryptedMessage };\n","// hybridStorage.ts\n/**\n * Hybrid storage: Try sessionStorage first, fallback to memory\n * Best of both worlds - survives page refresh but auto-cleans\n */\n\ninterface StorageOptions {\n ttlMs?: number;\n useSessionStorage?: boolean;\n}\n\nclass AuthStorage {\n private readonly prefix = \"pelican_auth_\";\n private readonly defaultTTL = 5 * 60 * 1000; // 5 minutes\n private memoryCache: Map<string, { value: any; expiresAt: number }> =\n new Map();\n\n /**\n * Store auth session with automatic cleanup\n */\n set(key: string, value: any, options: StorageOptions = {}): void {\n const { ttlMs = this.defaultTTL, useSessionStorage = true } = options;\n\n const expiresAt = Date.now() + ttlMs;\n const data = { value, expiresAt };\n\n // Try sessionStorage first\n if (useSessionStorage) {\n try {\n sessionStorage.setItem(`${this.prefix}${key}`, JSON.stringify(data));\n } catch (error) {\n console.warn(\"SessionStorage unavailable, using memory:\", error);\n this.setMemory(key, data);\n }\n } else {\n this.setMemory(key, data);\n }\n }\n\n /**\n * Get stored value if not expired\n */\n get(key: string): any | null {\n // Try sessionStorage first\n try {\n const stored = sessionStorage.getItem(`${this.prefix}${key}`);\n if (stored) {\n const data = JSON.parse(stored);\n\n // Check expiration\n if (Date.now() > data.expiresAt) {\n this.remove(key);\n return null;\n }\n\n return data.value;\n }\n } catch (error) {\n // Fallback to memory\n }\n\n // Try memory cache\n return this.getMemory(key);\n }\n\n /**\n * Remove specific key\n */\n remove(key: string): void {\n try {\n sessionStorage.removeItem(`${this.prefix}${key}`);\n } catch (error) {\n // Ignore\n }\n this.memoryCache.delete(key);\n }\n\n /**\n * Clear all auth data\n */\n clear(): void {\n // Clear sessionStorage\n try {\n Object.keys(sessionStorage).forEach((key) => {\n if (key.startsWith(this.prefix)) {\n sessionStorage.removeItem(key);\n }\n });\n } catch (error) {\n // Ignore\n }\n\n // Clear memory\n this.memoryCache.clear();\n }\n\n // ========================================\n // Memory cache helpers\n // ========================================\n\n private setMemory(\n key: string,\n data: { value: any; expiresAt: number }\n ): void {\n this.memoryCache.set(key, data);\n\n // Schedule cleanup\n const ttl = data.expiresAt - Date.now();\n setTimeout(() => {\n this.memoryCache.delete(key);\n }, ttl);\n }\n\n private getMemory(key: string): any | null {\n const data = this.memoryCache.get(key);\n if (!data) return null;\n\n if (Date.now() > data.expiresAt) {\n this.memoryCache.delete(key);\n return null;\n }\n\n return data.value;\n }\n}\n\n// Singleton instance\nconst storage = new AuthStorage();\n\n// ========================================\n// Convenience functions for auth flow\n// ========================================\n\nexport interface AuthSession {\n sessionId: string;\n sessionKey: string;\n}\n\nexport const storeAuthSession = (\n sessionId: string,\n sessionKey: string,\n ttlMs?: number\n): void => {\n storage.set(\"session\", { sessionId, sessionKey }, { ttlMs });\n};\n\nexport const getAuthSession = (): AuthSession | null => {\n return storage.get(\"session\");\n};\n\nexport const clearAuthSession = (): void => {\n storage.remove(\"session\");\n};\n\nexport const clearAllAuthData = (): void => {\n storage.clear();\n};\n\nexport default storage;\n","import type { PelicanAuthState } from \"../types/types\";\n\nexport class StateMachine {\n private state: PelicanAuthState = \"idle\";\n private listeners = new Set<(s: PelicanAuthState) => void>();\n\n get current() {\n return this.state;\n }\n\n transition(next: PelicanAuthState) {\n this.state = next;\n this.listeners.forEach((l) => l(next));\n }\n\n subscribe(fn: (s: PelicanAuthState) => void) {\n this.listeners.add(fn);\n return () => this.listeners.delete(fn);\n }\n}\n","import { ISocketMessage } from \"../types/types\";\n\ntype TransportHandlers = {\n onOpen?: () => void;\n onMessage?: (msg: ISocketMessage) => void;\n onError?: (err: Event) => void;\n onClose?: (ev: CloseEvent) => void;\n};\n\n/**\n * WebSocket Transport with automatic reconnection\n * Handles connection lifecycle and message passing\n */\nexport class Transport {\n private socket?: WebSocket;\n private handlers: TransportHandlers;\n private reconnectAttempts = 0;\n private maxReconnectAttempts = 3; // Reduced from 5 for mobile\n private isExplicitlyClosed = false;\n private url?: string;\n private reconnectTimeout?: number;\n private isReconnecting = false;\n\n constructor(handlers: TransportHandlers) {\n this.handlers = handlers;\n }\n\n /**\n * Establish WebSocket connection\n * @param url - WebSocket URL\n */\n connect(url: string) {\n this.url = url;\n this.isExplicitlyClosed = false;\n\n // Clean up any existing socket\n if (this.socket) {\n this.socket.onclose = null;\n this.socket.onerror = null;\n this.socket.onmessage = null;\n this.socket.onopen = null;\n\n if (\n this.socket.readyState === WebSocket.OPEN ||\n this.socket.readyState === WebSocket.CONNECTING\n ) {\n this.socket.close();\n }\n }\n\n this.socket = new WebSocket(url);\n\n this.socket.onopen = () => {\n this.reconnectAttempts = 0;\n this.isReconnecting = false;\n this.handlers.onOpen?.();\n };\n\n this.socket.onmessage = (e: MessageEvent) => {\n try {\n const data = JSON.parse(e.data);\n this.handlers.onMessage?.(data);\n } catch (err) {\n console.error(\"Failed to parse WebSocket message\", err);\n }\n };\n\n this.socket.onerror = (e: Event) => {\n // Only emit error if not reconnecting and not explicitly closed\n if (!this.isReconnecting && !this.isExplicitlyClosed) {\n this.handlers.onError?.(e);\n }\n };\n\n this.socket.onclose = (e: CloseEvent) => {\n // Clear any pending reconnect timeout\n if (this.reconnectTimeout) {\n clearTimeout(this.reconnectTimeout);\n this.reconnectTimeout = undefined;\n }\n\n // Emit close event\n if (!this.isReconnecting) {\n this.handlers.onClose?.(e);\n }\n\n // Only reconnect if:\n // 1. Not explicitly closed by user\n // 2. Not already reconnecting\n // 3. Haven't exceeded max attempts\n if (\n !this.isExplicitlyClosed &&\n !this.isReconnecting &&\n this.reconnectAttempts < this.maxReconnectAttempts\n ) {\n this.attemptReconnect();\n }\n };\n }\n\n /**\n * Attempt to reconnect with exponential backoff\n */\n private attemptReconnect() {\n if (this.reconnectAttempts >= this.maxReconnectAttempts) {\n console.warn(\"Max WebSocket reconnect attempts reached\");\n return;\n }\n\n this.isReconnecting = true;\n this.reconnectAttempts++;\n\n // Exponential backoff: 500ms, 1s, 2s\n const delay = Math.min(Math.pow(2, this.reconnectAttempts - 1) * 500, 2000);\n\n console.log(\n `Reconnecting WebSocket (attempt ${this.reconnectAttempts}/${this.maxReconnectAttempts}) in ${delay}ms...`\n );\n\n this.reconnectTimeout = window.setTimeout(() => {\n if (this.url && !this.isExplicitlyClosed) {\n this.connect(this.url);\n }\n }, delay);\n }\n\n /**\n * Send a message through the WebSocket\n * Queues message if connection is not open\n */\n send(payload: ISocketMessage) {\n if (this.socket?.readyState === WebSocket.OPEN) {\n try {\n this.socket.send(JSON.stringify(payload));\n } catch (err) {\n console.error(\"Failed to send WebSocket message:\", err);\n }\n } else {\n console.warn(\n \"WebSocket not open, message not sent:\",\n this.socket?.readyState\n );\n }\n }\n\n /**\n * Close the WebSocket connection\n * Prevents automatic reconnection\n */\n close() {\n this.isExplicitlyClosed = true;\n this.isReconnecting = false;\n\n // Clear reconnect timeout\n if (this.reconnectTimeout) {\n clearTimeout(this.reconnectTimeout);\n this.reconnectTimeout = undefined;\n }\n\n // Close socket\n if (this.socket) {\n // Remove event listeners to prevent callbacks\n this.socket.onclose = null;\n this.socket.onerror = null;\n this.socket.onmessage = null;\n this.socket.onopen = null;\n\n if (\n this.socket.readyState === WebSocket.OPEN ||\n this.socket.readyState === WebSocket.CONNECTING\n ) {\n this.socket.close();\n }\n\n this.socket = undefined;\n }\n }\n\n /**\n * Get current connection state\n */\n get readyState(): number | undefined {\n return this.socket?.readyState;\n }\n\n /**\n * Check if connection is open\n */\n get isOpen(): boolean {\n return this.socket?.readyState === WebSocket.OPEN;\n }\n}\n","export const BASEURL = \"https://identityapi.pelicanidentity.com\";\nexport const APPLE_APP_STORE_URL =\n \"https://apps.apple.com/us/app/pelican-vault/id6755097751\";\nexport const PLAY_STORE_URL =\n \"https://play.google.com/store/apps/details?id=com.HeraculesDesignTechLtd.pelican\";\nexport const FALLBACK_URL = \"https://pelicanidentity.com/pelican-vault\";\n","import CryptoService from \"../utilities/crypto\";\nimport QRCode from \"qrcode\";\nimport {\n PelicanAuthConfig,\n PelicanAuthEventMap,\n ISocketMessage,\n IdentityResult,\n} from \"../types/types\";\nimport {\n storeAuthSession,\n getAuthSession,\n clearAuthSession,\n} from \"../utilities/storage\";\nimport { StateMachine } from \"../utilities/stateMachine\";\nimport { Transport } from \"../utilities/transport\";\n\nimport {\n APPLE_APP_STORE_URL,\n BASEURL,\n FALLBACK_URL,\n PLAY_STORE_URL,\n} from \"../constants\";\n\ntype Listener<T> = (payload: T) => void;\n\n/**\n * PelicanAuth SDK\n *\n * Uses WebSocket for QR code flow (desktop)\n * Uses visibility recovery for deep link flow (mobile)\n */\nexport class PelicanAuthentication {\n private readonly crypto = new CryptoService();\n private readonly stateMachine = new StateMachine();\n\n private transport?: Transport;\n private sessionId = \"\";\n private sessionKey: string | null = null;\n\n private visibilityHandler?: () => void;\n private backupCheckTimeout?: number;\n private useWebSocket = true;\n private deeplinkUrl: string | null = null;\n\n private listeners: {\n [K in keyof PelicanAuthEventMap]?: Set<Listener<any>>;\n } = {};\n\n private readonly config: Required<PelicanAuthConfig>;\n\n constructor(config: PelicanAuthConfig) {\n if (!config.publicKey) throw new Error(\"Missing publicKey\");\n if (!config.projectId) throw new Error(\"Missing projectId\");\n if (!config.authType) throw new Error(\"Missing authType\");\n\n this.config = {\n continuousMode: false,\n forceQRCode: false,\n ...config,\n };\n\n this.stateMachine.subscribe((s) => this.emit(\"state\", s));\n }\n\n /* -------------------- Public API -------------------- */\n\n on<K extends keyof PelicanAuthEventMap>(\n event: K,\n cb: Listener<PelicanAuthEventMap[K]>,\n ) {\n this.listeners[event] ??= new Set();\n this.listeners[event]!.add(cb);\n return () => this.listeners[event]!.delete(cb);\n }\n\n async start() {\n if (\n this.config.authType !== \"id-verification\" &&\n this.config.authType !== \"signup\" &&\n this.config.authType !== \"login\"\n ) {\n this.fail(new Error(\"Invalid authType\"));\n return;\n }\n\n if (!this.config.projectId) {\n this.fail(new Error(\"Missing projectId\"));\n return;\n }\n\n if (!this.config.publicKey) {\n this.fail(new Error(\"Missing publicKey\"));\n return;\n }\n if (this.stateMachine.current !== \"idle\") return;\n\n this.resetSession();\n clearAuthSession();\n this.stateMachine.transition(\"initializing\");\n\n try {\n // Generate session credentials\n this.sessionKey = this.crypto.generateSymmetricKey();\n this.sessionId = crypto.randomUUID() + crypto.randomUUID();\n\n // Decide: WebSocket (QR) or Deep Link\n this.useWebSocket = this.shouldUseWebSocket();\n\n if (this.useWebSocket) {\n await this.startWebSocketFlow();\n } else {\n await this.startDeepLinkFlow();\n }\n } catch (err) {\n this.fail(err instanceof Error ? err : new Error(\"Start failed\"));\n }\n }\n\n stop() {\n this.terminate(false);\n }\n\n openWebAuth() {\n if (!this.sessionKey || !this.sessionId) {\n this.fail(\n new Error(\"No active session. Call start() before openWebAuth().\"),\n );\n return;\n }\n\n const openerOrigin = window.location.origin;\n\n const urlParams = new URLSearchParams({\n projectId: this.config.projectId,\n publicKey: this.config.publicKey,\n authType: this.config.authType,\n sessionId: this.sessionId,\n sessionKey: this.sessionKey,\n origin: openerOrigin,\n });\n\n const authUrl = `https://vault.pelicanidentity.com/auth?${urlParams.toString()}`;\n\n // Try popup first, fall back to new tab if blocked\n const authWindow =\n window.open(\n authUrl,\n \"pelican-auth\",\n \"width=480,height=640,left=400,top=100,resizable=no,scrollbars=no\",\n ) ?? window.open(authUrl, \"_blank\");\n\n if (!authWindow) {\n // Both popup and new tab blocked — nothing we can do\n this.fail(\n new Error(\n \"Unable to open authentication window. Please allow popups for this site and try again.\",\n ),\n );\n return;\n }\n\n this.detachVisibilityRecovery();\n this.transport?.close();\n this.transport = undefined;\n\n authWindow.focus();\n this.stateMachine.transition(\"awaiting-pair\");\n\n const cleanup = () => {\n window.removeEventListener(\"message\", handleMessage);\n clearInterval(closedPoller);\n };\n\n const handleMessage = (event: MessageEvent) => {\n // Only accept messages from the vault — prevents origin spoofing\n if (event.origin !== \"https://vault.pelicanidentity.com\") return;\n\n // Ensure message came from the specific window we opened\n // Works for both popup and new tab since window.opener is preserved either way\n if (event.source !== authWindow) return;\n\n const { type, payload } = event.data ?? {};\n\n if (type === \"pelican-auth-success\") {\n console.log(\"Web auth success\");\n cleanup();\n\n if (!payload?.cipher || !payload?.nonce) {\n this.fail(new Error(\"Invalid web auth payload\"));\n this.restartIfContinuous();\n return;\n }\n\n try {\n const decrypted = this.crypto.decryptSymmetric({\n encrypted: { cipher: payload.cipher, nonce: payload.nonce },\n keyString: this.sessionKey!,\n });\n\n if (!decrypted) {\n this.fail(new Error(\"Failed to decrypt web auth response\"));\n this.restartIfContinuous();\n return;\n }\n\n const result: IdentityResult = JSON.parse(decrypted);\n this.emit(\"success\", result);\n this.stateMachine.transition(\"authenticated\");\n this.restartIfContinuous();\n } catch {\n this.fail(new Error(\"Failed to decrypt web auth response\"));\n this.restartIfContinuous();\n }\n }\n\n if (type === \"pelican-auth-cancelled\") {\n cleanup();\n this.fail(new Error(\"Authentication cancelled\"));\n this.restartIfContinuous();\n }\n\n if (type === \"pelican-auth-error\") {\n cleanup();\n this.fail(new Error(payload?.message ?? \"Web auth failed\"));\n this.restartIfContinuous();\n }\n };\n\n window.addEventListener(\"message\", handleMessage);\n\n // Poll for manual close — works for both popup and new tab\n // New tab edge case: if user navigates away without closing, closed stays false\n // until they actually close the tab — acceptable tradeoff vs hard failing\n const closedPoller = setInterval(() => {\n if (!authWindow.closed) return;\n cleanup();\n if (\n ![\"authenticated\", \"confirmed\", \"error\"].includes(\n this.stateMachine.current,\n )\n ) {\n this.fail(new Error(\"Authentication window closed\"));\n this.restartIfContinuous();\n }\n }, 500);\n }\n\n destroy() {\n this.detachVisibilityRecovery();\n this.clearBackupCheck();\n this.transport?.close();\n this.transport = undefined;\n this.listeners = {};\n }\n\n useQrInstead() {\n this.useWebSocket = true;\n\n this.emit(\"deeplink\", \"\");\n this.stateMachine.transition(\"initializing\");\n this.startWebSocketFlow();\n }\n\n useDeepLinkInstead() {\n this.useWebSocket = false;\n this.stateMachine.transition(\"initializing\");\n this.startDeepLinkFlow();\n }\n /* -------------------- Flow Selection -------------------- */\n\n private shouldUseWebSocket(): boolean {\n const userAgent = navigator.userAgent;\n\n const isTablet = /(iPad|Android(?!.*Mobile))/i.test(userAgent);\n const isMobile =\n /Android|webOS|iPhone|iPod|BlackBerry|IEMobile|Opera Mini/i.test(\n userAgent,\n );\n\n const useWebSocket = isMobile && !isTablet;\n return this.config.forceQRCode || !useWebSocket;\n }\n\n /* -------------------- WebSocket Flow (QR Code) -------------------- */\n\n private async startWebSocketFlow() {\n const { relayUrl, deeplinkUrl } = await this.fetchRelayUrl();\n\n this.transport = new Transport({\n onOpen: () => {\n this.transport!.send({\n type: \"register\",\n sessionID: this.sessionId,\n ...this.config,\n });\n this.stateMachine.transition(\"awaiting-pair\");\n },\n onMessage: (msg: ISocketMessage) => this.handleWebSocketMessage(msg),\n onError: (err) => {\n console.error(\"WebSocket error:\", err);\n this.fail(new Error(\"WebSocket connection failed\"));\n },\n });\n\n this.transport.connect(relayUrl);\n await this.emitQRCode(deeplinkUrl);\n }\n\n private handleWebSocketMessage(msg: ISocketMessage) {\n switch (msg.type) {\n case \"paired\":\n this.stateMachine.transition(\"paired\");\n this.transport!.send({\n type: \"authenticate\",\n sessionID: this.sessionId,\n ...this.config,\n url: window.location.href,\n });\n return;\n\n case \"phone-auth-success\":\n this.handleAuthSuccess(msg);\n return;\n\n case \"phone-terminated\":\n this.fail(new Error(\"Authentication cancelled on device\"));\n this.restartIfContinuous();\n return;\n\n case \"confirmed\":\n this.terminate(true);\n this.restartIfContinuous();\n return;\n }\n }\n\n private handleAuthSuccess(msg: ISocketMessage) {\n if (!this.sessionKey || !msg.cipher || !msg.nonce) {\n this.fail(new Error(\"Invalid authentication payload\"));\n this.restartIfContinuous();\n return;\n }\n\n try {\n const decrypted = this.crypto.decryptSymmetric({\n encrypted: { cipher: msg.cipher, nonce: msg.nonce },\n keyString: this.sessionKey,\n });\n\n if (!decrypted) {\n this.fail(new Error(\"Invalid authentication data\"));\n this.restartIfContinuous();\n return;\n }\n\n const result: IdentityResult = JSON.parse(decrypted);\n\n this.emit(\"success\", result);\n this.stateMachine.transition(\"authenticated\");\n\n // Confirm receipt\n this.transport?.send({\n type: \"confirm\",\n sessionID: this.sessionId,\n });\n } catch {\n this.fail(new Error(\"Failed to decrypt authentication data\"));\n this.restartIfContinuous();\n }\n }\n\n /* -------------------- Deep Link Flow (Mobile) -------------------- */\n\n private async startDeepLinkFlow() {\n const { deeplinkUrl } = await this.fetchRelayUrl();\n\n if (this.sessionKey) {\n storeAuthSession(this.sessionId, this.sessionKey, 10 * 60_000); // 10 min TTL\n }\n\n await this.emitDeepLink(deeplinkUrl);\n this.deeplinkUrl = deeplinkUrl;\n\n this.stateMachine.transition(\"awaiting-pair\");\n }\n\n public openDeepLink() {\n if (!this.deeplinkUrl) {\n this.fail(new Error(\"Deep link not found\"));\n return;\n }\n\n const userAgent = navigator.userAgent;\n let fallbackUrl = FALLBACK_URL;\n\n if (/iPad|iPhone|iPod/.test(userAgent)) {\n fallbackUrl = APPLE_APP_STORE_URL;\n } else if (/android/i.test(userAgent)) {\n fallbackUrl = PLAY_STORE_URL;\n }\n\n const start = Date.now();\n window.location.href = this.deeplinkUrl;\n\n setTimeout(() => {\n // Increased to 3 seconds for better UX/Reliability\n // We check if the elapsed time is less than 3500ms\n // to ensure the tab hasn't been suspended/backgrounded.\n if (Date.now() - start < 3500) {\n window.location.href = fallbackUrl;\n }\n }, 3000);\n }\n \n private clearBackupCheck() {\n if (this.backupCheckTimeout) {\n clearTimeout(this.backupCheckTimeout);\n this.backupCheckTimeout = undefined;\n }\n }\n\n private async checkSession() {\n const cached = getAuthSession();\n if (!cached) {\n this.fail(new Error(\"Authentication session not found\"));\n this.restartIfContinuous();\n return;\n }\n\n this.stateMachine.transition(\"awaiting-auth\");\n try {\n const res = await fetch(\n `${BASEURL}/session?session_id=${cached.sessionId}`,\n );\n\n // Session not ready yet\n if (!res.ok) {\n this.fail(new Error(\"Session not found\"));\n this.restartIfContinuous();\n return;\n }\n\n const data = await res.json();\n const decrypted = this.crypto.decryptSymmetric({\n encrypted: { cipher: data.cipher, nonce: data.nonce },\n keyString: cached.sessionKey,\n });\n\n if (!decrypted) {\n console.warn(\"Failed to decrypt session\");\n this.fail(new Error(\"Failed to decrypt session\"));\n this.restartIfContinuous();\n return;\n }\n\n const result: IdentityResult = JSON.parse(decrypted);\n\n // Success!\n this.clearBackupCheck();\n clearAuthSession();\n\n this.emit(\"success\", result);\n this.stateMachine.transition(\"authenticated\");\n\n // In continuous mode, restart after delay\n if (this.config.continuousMode) {\n setTimeout(() => {\n this.stateMachine.transition(\"idle\");\n this.start();\n }, 1500);\n } else {\n this.stateMachine.transition(\"idle\");\n }\n } catch (err) {\n console.debug(\"Session check failed:\", err);\n this.fail(new Error(\"Session check failed\"));\n this.restartIfContinuous();\n return;\n }\n }\n\n /* -------------------- Entry Point Generation -------------------- */\n\n private async emitQRCode(deeplinkUrl: string) {\n const embeddedUrl = `${deeplinkUrl}?sessionID=${encodeURIComponent(\n this.sessionId,\n )}&sessionKey=${encodeURIComponent(\n this.sessionKey!,\n )}&publicKey=${encodeURIComponent(this.config.publicKey)}&authType=${\n this.config.authType\n }&projectId=${encodeURIComponent(this.config.projectId)}`;\n\n const qr = await QRCode.toDataURL(embeddedUrl, {\n type: \"image/png\",\n scale: 3,\n color: { light: \"#ffffff\", dark: \"#424242ff\" },\n });\n\n this.emit(\"qr\", qr);\n }\n\n private async emitDeepLink(deeplinkUrl: string) {\n const deeplink = `${deeplinkUrl}?sessionID=${encodeURIComponent(\n this.sessionId,\n )}&sessionKey=${encodeURIComponent(\n this.sessionKey!,\n )}&publicKey=${encodeURIComponent(this.config.publicKey)}&authType=${\n this.config.authType\n }&projectId=${encodeURIComponent(this.config.projectId)}`;\n\n this.emit(\"deeplink\", deeplink);\n }\n\n /* -------------------- Visibility Recovery -------------------- */\n\n public attachVisibilityRecovery() {\n let fired = false;\n this.visibilityHandler = async () => {\n if (document.visibilityState !== \"visible\") return;\n\n // Only check for deep link flow\n if (this.useWebSocket) return;\n\n if (fired) return;\n fired = true;\n\n // Check session when page becomes visible\n await this.checkSession();\n };\n\n document.addEventListener(\"visibilitychange\", this.visibilityHandler);\n }\n\n private detachVisibilityRecovery() {\n if (this.visibilityHandler) {\n document.removeEventListener(\"visibilitychange\", this.visibilityHandler);\n this.visibilityHandler = undefined;\n }\n }\n\n /* -------------------- Helpers -------------------- */\n\n private async fetchRelayUrl(): Promise<{\n deeplinkUrl: string;\n relayUrl: string;\n }> {\n const { publicKey, projectId, authType } = this.config;\n const res = await fetch(\n `${BASEURL}/relay?public_key=${publicKey}&auth_type=${authType}&project_id=${projectId}`,\n );\n\n if (!res.ok) {\n const error = await res.text();\n throw new Error(error);\n }\n\n const json = await res.json();\n return { deeplinkUrl: json.deeplink_url, relayUrl: json.relay_url };\n }\n\n private terminate(success: boolean) {\n // Clear backup check\n this.clearBackupCheck();\n\n // Close WebSocket if active\n if (this.transport) {\n if (!success) {\n this.transport.send({\n type: \"client-terminated\",\n sessionID: this.sessionId,\n projectId: this.config.projectId,\n publicKey: this.config.publicKey,\n authType: this.config.authType,\n });\n }\n this.transport.close();\n this.transport = undefined;\n }\n\n clearAuthSession();\n this.resetSession();\n\n if (!this.config.continuousMode) {\n this.detachVisibilityRecovery();\n }\n\n this.stateMachine.transition(success ? \"confirmed\" : \"idle\");\n }\n\n private restartIfContinuous() {\n if (this.config.continuousMode) {\n this.stateMachine.transition(\"idle\");\n this.clearBackupCheck();\n this.transport?.close();\n this.transport = undefined;\n setTimeout(() => {\n this.start();\n }, 150);\n } else {\n this.stateMachine.transition(\"idle\");\n }\n }\n\n private resetSession() {\n this.sessionId = \"\";\n this.sessionKey = null;\n }\n\n private emit<K extends keyof PelicanAuthEventMap>(\n event: K,\n payload: PelicanAuthEventMap[K],\n ) {\n this.listeners[event]?.forEach((cb) => cb(payload));\n }\n\n private fail(err: Error) {\n this.emit(\"error\", err);\n this.stateMachine.transition(\"error\");\n }\n}\n"]}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@pelican-identity/auth-core",
3
- "version": "1.2.40",
3
+ "version": "1.2.42",
4
4
  "description": "Framework-agnostic authentication SDK for Pelican Identity",
5
5
  "main": "./dist/index.js",
6
6
  "module": "./dist/index.mjs",