@pelican-identity/auth-core 1.2.8 → 1.2.9
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/constants.d.ts +2 -0
- package/dist/constants.d.ts.map +1 -0
- package/dist/constants.js +2 -0
- package/dist/constants.js.map +1 -0
- package/dist/engine/engine.d.ts +31 -0
- package/dist/engine/engine.d.ts.map +1 -0
- package/dist/engine/engine.js +238 -0
- package/dist/engine/engine.js.map +1 -0
- package/dist/index.d.ts +8 -187
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +7 -515
- package/dist/index.js.map +1 -1
- package/dist/types/types.d.ts +102 -0
- package/dist/types/types.d.ts.map +1 -0
- package/dist/types/types.js +2 -0
- package/dist/types/types.js.map +1 -0
- package/dist/utilities/crypto.d.ts +18 -0
- package/dist/utilities/crypto.d.ts.map +1 -0
- package/dist/utilities/crypto.js +37 -0
- package/dist/utilities/crypto.js.map +1 -0
- package/dist/utilities/stateMachine.d.ts +9 -0
- package/dist/utilities/stateMachine.d.ts.map +1 -0
- package/dist/utilities/stateMachine.js +18 -0
- package/dist/utilities/stateMachine.js.map +1 -0
- package/dist/utilities/storage.d.ts +26 -0
- package/dist/utilities/storage.d.ts.map +1 -0
- package/dist/utilities/storage.js +92 -0
- package/dist/utilities/storage.js.map +1 -0
- package/dist/utilities/transport.d.ts +22 -0
- package/dist/utilities/transport.d.ts.map +1 -0
- package/dist/utilities/transport.js +57 -0
- package/dist/utilities/transport.js.map +1 -0
- package/package.json +1 -1
|
@@ -0,0 +1,102 @@
|
|
|
1
|
+
export type AuthType = "login" | "signup" | "id-verification";
|
|
2
|
+
export type PelicanAuthState = "idle" | "initializing" | "awaiting-pair" | "paired" | "awaiting-auth" | "authenticated" | "confirmed" | "error" | "terminated";
|
|
3
|
+
export interface PelicanAuthConfig {
|
|
4
|
+
publicKey: string;
|
|
5
|
+
projectId: string;
|
|
6
|
+
authType: AuthType;
|
|
7
|
+
continuousMode?: boolean;
|
|
8
|
+
forceQRCode?: boolean;
|
|
9
|
+
}
|
|
10
|
+
export type PelicanAuthEventMap = {
|
|
11
|
+
state: PelicanAuthState;
|
|
12
|
+
qr: string;
|
|
13
|
+
deeplink: string;
|
|
14
|
+
success: IdentityResult;
|
|
15
|
+
error: Error;
|
|
16
|
+
};
|
|
17
|
+
export interface ISocketMessage {
|
|
18
|
+
type: "confirmed" | "request-passcode" | "client-terminated" | "phone-terminated" | "pair" | "paired" | "phone-auth-success" | "authenticate" | "confirm" | "register";
|
|
19
|
+
sessionID: string;
|
|
20
|
+
cipher?: string;
|
|
21
|
+
nonce?: string;
|
|
22
|
+
publicKey?: string;
|
|
23
|
+
url?: string;
|
|
24
|
+
authType?: AuthType;
|
|
25
|
+
projectId?: string;
|
|
26
|
+
grantedAttributes?: {
|
|
27
|
+
[key: string]: boolean;
|
|
28
|
+
};
|
|
29
|
+
}
|
|
30
|
+
export interface IPhone {
|
|
31
|
+
id: number;
|
|
32
|
+
country: string;
|
|
33
|
+
callingCode: string;
|
|
34
|
+
number: string;
|
|
35
|
+
verifiedAt: string;
|
|
36
|
+
verificationProvider: string;
|
|
37
|
+
}
|
|
38
|
+
export interface IEmail {
|
|
39
|
+
id: number;
|
|
40
|
+
value: string;
|
|
41
|
+
verifiedAt: string;
|
|
42
|
+
verificationProvider: string;
|
|
43
|
+
}
|
|
44
|
+
export type IdCardTypes = "national id card" | "passport" | "driver's license" | "residence permit";
|
|
45
|
+
export interface IKycData {
|
|
46
|
+
id: number;
|
|
47
|
+
status?: "Approved" | "Declined" | "In Review";
|
|
48
|
+
document_type?: IdCardTypes;
|
|
49
|
+
document_number?: string;
|
|
50
|
+
personal_number?: string;
|
|
51
|
+
date_of_birth?: string | Date;
|
|
52
|
+
age?: number;
|
|
53
|
+
expiration_date?: string | Date;
|
|
54
|
+
date_of_issue?: string | Date;
|
|
55
|
+
issuing_state?: string;
|
|
56
|
+
issuing_state_name?: string;
|
|
57
|
+
first_name?: string;
|
|
58
|
+
last_name?: string;
|
|
59
|
+
full_name?: string;
|
|
60
|
+
gender?: string;
|
|
61
|
+
address?: string;
|
|
62
|
+
formatted_address?: string;
|
|
63
|
+
place_of_birth?: string;
|
|
64
|
+
marital_status?: string;
|
|
65
|
+
nationality?: string;
|
|
66
|
+
liveness_percentage?: number;
|
|
67
|
+
face_match_percentage?: number;
|
|
68
|
+
verified_at?: string | Date;
|
|
69
|
+
}
|
|
70
|
+
export interface IUserData {
|
|
71
|
+
first_name?: string;
|
|
72
|
+
last_name?: string;
|
|
73
|
+
other_names?: string;
|
|
74
|
+
email?: IEmail;
|
|
75
|
+
phone?: IPhone;
|
|
76
|
+
dob?: string | Date;
|
|
77
|
+
gender?: "male" | "female" | "other";
|
|
78
|
+
country?: string;
|
|
79
|
+
state?: string;
|
|
80
|
+
city?: string;
|
|
81
|
+
address?: string;
|
|
82
|
+
occupation?: string;
|
|
83
|
+
company?: string;
|
|
84
|
+
website?: string;
|
|
85
|
+
}
|
|
86
|
+
export interface IdentityResult {
|
|
87
|
+
user_id: string;
|
|
88
|
+
user_data?: IUserData;
|
|
89
|
+
id_verification: IKycData;
|
|
90
|
+
id_downloadurls?: {
|
|
91
|
+
front_of_card?: string;
|
|
92
|
+
back_of_card?: string;
|
|
93
|
+
};
|
|
94
|
+
}
|
|
95
|
+
export interface PelicanWebAuthProps extends PelicanAuthConfig {
|
|
96
|
+
onClose?: () => void;
|
|
97
|
+
onSuccess: (result: IdentityResult) => void;
|
|
98
|
+
onError?: (error: Error) => void;
|
|
99
|
+
buttonComponent?: React.ReactElement;
|
|
100
|
+
buttonText?: string;
|
|
101
|
+
}
|
|
102
|
+
//# sourceMappingURL=types.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../src/types/types.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"types.js","sourceRoot":"","sources":["../../src/types/types.ts"],"names":[],"mappings":""}
|
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
interface EncryptedMessage {
|
|
2
|
+
cipher: string;
|
|
3
|
+
nonce: string;
|
|
4
|
+
}
|
|
5
|
+
export declare class CryptoService {
|
|
6
|
+
generateSymmetricKey(): string;
|
|
7
|
+
encryptSymmetric({ plaintext, keyString, }: {
|
|
8
|
+
plaintext: string;
|
|
9
|
+
keyString: string;
|
|
10
|
+
}): EncryptedMessage;
|
|
11
|
+
decryptSymmetric({ encrypted, keyString, }: {
|
|
12
|
+
encrypted: EncryptedMessage;
|
|
13
|
+
keyString: string;
|
|
14
|
+
}): string | null;
|
|
15
|
+
}
|
|
16
|
+
export default CryptoService;
|
|
17
|
+
export type { EncryptedMessage };
|
|
18
|
+
//# sourceMappingURL=crypto.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"crypto.d.ts","sourceRoot":"","sources":["../../src/utilities/crypto.ts"],"names":[],"mappings":"AAGA,UAAU,gBAAgB;IACxB,MAAM,EAAE,MAAM,CAAC;IACf,KAAK,EAAE,MAAM,CAAC;CACf;AAED,qBAAa,aAAa;IACxB,oBAAoB,IAAI,MAAM;IAY9B,gBAAgB,CAAC,EACf,SAAS,EACT,SAAS,GACV,EAAE;QACD,SAAS,EAAE,MAAM,CAAC;QAClB,SAAS,EAAE,MAAM,CAAC;KACnB,GAAG,gBAAgB;IAoBpB,gBAAgB,CAAC,EACf,SAAS,EACT,SAAS,GACV,EAAE;QACD,SAAS,EAAE,gBAAgB,CAAC;QAC5B,SAAS,EAAE,MAAM,CAAC;KACnB,GAAG,MAAM,GAAG,IAAI;CAmBlB;AAED,eAAe,aAAa,CAAC;AAC7B,YAAY,EAAE,gBAAgB,EAAE,CAAC"}
|
|
@@ -0,0 +1,37 @@
|
|
|
1
|
+
import nacl from "tweetnacl";
|
|
2
|
+
import { decodeBase64, encodeBase64 } from "tweetnacl-util";
|
|
3
|
+
export class CryptoService {
|
|
4
|
+
generateSymmetricKey() {
|
|
5
|
+
const key = nacl.randomBytes(32);
|
|
6
|
+
return encodeBase64(key);
|
|
7
|
+
}
|
|
8
|
+
encryptSymmetric({ plaintext, keyString, }) {
|
|
9
|
+
const key = decodeBase64(keyString);
|
|
10
|
+
const nonce = nacl.randomBytes(24);
|
|
11
|
+
const messageBytes = new TextEncoder().encode(plaintext);
|
|
12
|
+
const ciphertext = nacl.secretbox(messageBytes, nonce, key);
|
|
13
|
+
return {
|
|
14
|
+
cipher: encodeBase64(ciphertext),
|
|
15
|
+
nonce: encodeBase64(nonce),
|
|
16
|
+
};
|
|
17
|
+
}
|
|
18
|
+
decryptSymmetric({ encrypted, keyString, }) {
|
|
19
|
+
try {
|
|
20
|
+
const key = decodeBase64(keyString);
|
|
21
|
+
const ciphertextBytes = decodeBase64(encrypted.cipher);
|
|
22
|
+
const nonceBytes = decodeBase64(encrypted.nonce);
|
|
23
|
+
const decrypted = nacl.secretbox.open(ciphertextBytes, nonceBytes, key);
|
|
24
|
+
if (!decrypted) {
|
|
25
|
+
throw new Error("Decryption failed - invalid key or corrupted data");
|
|
26
|
+
}
|
|
27
|
+
const decoded = new TextDecoder().decode(decrypted);
|
|
28
|
+
return decoded;
|
|
29
|
+
}
|
|
30
|
+
catch (error) {
|
|
31
|
+
console.error("Decryption failed", error);
|
|
32
|
+
return null;
|
|
33
|
+
}
|
|
34
|
+
}
|
|
35
|
+
}
|
|
36
|
+
export default CryptoService;
|
|
37
|
+
//# sourceMappingURL=crypto.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"crypto.js","sourceRoot":"","sources":["../../src/utilities/crypto.ts"],"names":[],"mappings":"AAAA,OAAO,IAAI,MAAM,WAAW,CAAC;AAC7B,OAAO,EAAE,YAAY,EAAE,YAAY,EAAE,MAAM,gBAAgB,CAAC;AAO5D,MAAM,OAAO,aAAa;IACxB,oBAAoB;QAClB,MAAM,GAAG,GAAG,IAAI,CAAC,WAAW,CAAC,EAAE,CAAC,CAAC;QACjC,OAAO,YAAY,CAAC,GAAG,CAAC,CAAC;IAC3B,CAAC;IASD,gBAAgB,CAAC,EACf,SAAS,EACT,SAAS,GAIV;QACC,MAAM,GAAG,GAAG,YAAY,CAAC,SAAS,CAAC,CAAC;QACpC,MAAM,KAAK,GAAG,IAAI,CAAC,WAAW,CAAC,EAAE,CAAC,CAAC;QAEnC,MAAM,YAAY,GAAG,IAAI,WAAW,EAAE,CAAC,MAAM,CAAC,SAAS,CAAC,CAAC;QAEzD,MAAM,UAAU,GAAG,IAAI,CAAC,SAAS,CAAC,YAAY,EAAE,KAAK,EAAE,GAAG,CAAC,CAAC;QAE5D,OAAO;YACL,MAAM,EAAE,YAAY,CAAC,UAAU,CAAC;YAChC,KAAK,EAAE,YAAY,CAAC,KAAK,CAAC;SAC3B,CAAC;IACJ,CAAC;IAQD,gBAAgB,CAAC,EACf,SAAS,EACT,SAAS,GAIV;QACC,IAAI,CAAC;YACH,MAAM,GAAG,GAAG,YAAY,CAAC,SAAS,CAAC,CAAC;YACpC,MAAM,eAAe,GAAG,YAAY,CAAC,SAAS,CAAC,MAAM,CAAC,CAAC;YACvD,MAAM,UAAU,GAAG,YAAY,CAAC,SAAS,CAAC,KAAK,CAAC,CAAC;YAEjD,MAAM,SAAS,GAAG,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,eAAe,EAAE,UAAU,EAAE,GAAG,CAAC,CAAC;YAExE,IAAI,CAAC,SAAS,EAAE,CAAC;gBACf,MAAM,IAAI,KAAK,CAAC,mDAAmD,CAAC,CAAC;YACvE,CAAC;YAED,MAAM,OAAO,GAAG,IAAI,WAAW,EAAE,CAAC,MAAM,CAAC,SAAS,CAAC,CAAC;YACpD,OAAO,OAAO,CAAC;QACjB,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,OAAO,CAAC,KAAK,CAAC,mBAAmB,EAAE,KAAK,CAAC,CAAC;YAC1C,OAAO,IAAI,CAAC;QACd,CAAC;IACH,CAAC;CACF;AAED,eAAe,aAAa,CAAC"}
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
import type { PelicanAuthState } from "../types/types";
|
|
2
|
+
export declare class StateMachine {
|
|
3
|
+
private state;
|
|
4
|
+
private listeners;
|
|
5
|
+
get current(): PelicanAuthState;
|
|
6
|
+
transition(next: PelicanAuthState): void;
|
|
7
|
+
subscribe(fn: (s: PelicanAuthState) => void): () => boolean;
|
|
8
|
+
}
|
|
9
|
+
//# sourceMappingURL=stateMachine.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"stateMachine.d.ts","sourceRoot":"","sources":["../../src/utilities/stateMachine.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,gBAAgB,CAAC;AAEvD,qBAAa,YAAY;IACvB,OAAO,CAAC,KAAK,CAA4B;IACzC,OAAO,CAAC,SAAS,CAA4C;IAE7D,IAAI,OAAO,qBAEV;IAED,UAAU,CAAC,IAAI,EAAE,gBAAgB;IAKjC,SAAS,CAAC,EAAE,EAAE,CAAC,CAAC,EAAE,gBAAgB,KAAK,IAAI;CAI5C"}
|
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
export class StateMachine {
|
|
2
|
+
constructor() {
|
|
3
|
+
this.state = "idle";
|
|
4
|
+
this.listeners = new Set();
|
|
5
|
+
}
|
|
6
|
+
get current() {
|
|
7
|
+
return this.state;
|
|
8
|
+
}
|
|
9
|
+
transition(next) {
|
|
10
|
+
this.state = next;
|
|
11
|
+
this.listeners.forEach((l) => l(next));
|
|
12
|
+
}
|
|
13
|
+
subscribe(fn) {
|
|
14
|
+
this.listeners.add(fn);
|
|
15
|
+
return () => this.listeners.delete(fn);
|
|
16
|
+
}
|
|
17
|
+
}
|
|
18
|
+
//# sourceMappingURL=stateMachine.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"stateMachine.js","sourceRoot":"","sources":["../../src/utilities/stateMachine.ts"],"names":[],"mappings":"AAEA,MAAM,OAAO,YAAY;IAAzB;QACU,UAAK,GAAqB,MAAM,CAAC;QACjC,cAAS,GAAG,IAAI,GAAG,EAAiC,CAAC;IAe/D,CAAC;IAbC,IAAI,OAAO;QACT,OAAO,IAAI,CAAC,KAAK,CAAC;IACpB,CAAC;IAED,UAAU,CAAC,IAAsB;QAC/B,IAAI,CAAC,KAAK,GAAG,IAAI,CAAC;QAClB,IAAI,CAAC,SAAS,CAAC,OAAO,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC;IACzC,CAAC;IAED,SAAS,CAAC,EAAiC;QACzC,IAAI,CAAC,SAAS,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;QACvB,OAAO,GAAG,EAAE,CAAC,IAAI,CAAC,SAAS,CAAC,MAAM,CAAC,EAAE,CAAC,CAAC;IACzC,CAAC;CACF"}
|
|
@@ -0,0 +1,26 @@
|
|
|
1
|
+
interface StorageOptions {
|
|
2
|
+
ttlMs?: number;
|
|
3
|
+
useSessionStorage?: boolean;
|
|
4
|
+
}
|
|
5
|
+
declare class AuthStorage {
|
|
6
|
+
private readonly prefix;
|
|
7
|
+
private readonly defaultTTL;
|
|
8
|
+
private memoryCache;
|
|
9
|
+
set(key: string, value: any, options?: StorageOptions): void;
|
|
10
|
+
get(key: string): any | null;
|
|
11
|
+
remove(key: string): void;
|
|
12
|
+
clear(): void;
|
|
13
|
+
private setMemory;
|
|
14
|
+
private getMemory;
|
|
15
|
+
}
|
|
16
|
+
declare const storage: AuthStorage;
|
|
17
|
+
export interface AuthSession {
|
|
18
|
+
sessionId: string;
|
|
19
|
+
sessionKey: string;
|
|
20
|
+
}
|
|
21
|
+
export declare const storeAuthSession: (sessionId: string, sessionKey: string, ttlMs?: number) => void;
|
|
22
|
+
export declare const getAuthSession: () => AuthSession | null;
|
|
23
|
+
export declare const clearAuthSession: () => void;
|
|
24
|
+
export declare const clearAllAuthData: () => void;
|
|
25
|
+
export default storage;
|
|
26
|
+
//# sourceMappingURL=storage.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"storage.d.ts","sourceRoot":"","sources":["../../src/utilities/storage.ts"],"names":[],"mappings":"AAMA,UAAU,cAAc;IACtB,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,iBAAiB,CAAC,EAAE,OAAO,CAAC;CAC7B;AAED,cAAM,WAAW;IACf,OAAO,CAAC,QAAQ,CAAC,MAAM,CAAmB;IAC1C,OAAO,CAAC,QAAQ,CAAC,UAAU,CAAiB;IAC5C,OAAO,CAAC,WAAW,CACP;IAKZ,GAAG,CAAC,GAAG,EAAE,MAAM,EAAE,KAAK,EAAE,GAAG,EAAE,OAAO,GAAE,cAAmB,GAAG,IAAI;IAsBhE,GAAG,CAAC,GAAG,EAAE,MAAM,GAAG,GAAG,GAAG,IAAI;IA0B5B,MAAM,CAAC,GAAG,EAAE,MAAM,GAAG,IAAI;IAYzB,KAAK,IAAI,IAAI;IAoBb,OAAO,CAAC,SAAS;IAajB,OAAO,CAAC,SAAS;CAWlB;AAGD,QAAA,MAAM,OAAO,aAAoB,CAAC;AAMlC,MAAM,WAAW,WAAW;IAC1B,SAAS,EAAE,MAAM,CAAC;IAClB,UAAU,EAAE,MAAM,CAAC;CACpB;AAED,eAAO,MAAM,gBAAgB,GAC3B,WAAW,MAAM,EACjB,YAAY,MAAM,EAClB,QAAQ,MAAM,KACb,IAEF,CAAC;AAEF,eAAO,MAAM,cAAc,QAAO,WAAW,GAAG,IAE/C,CAAC;AAEF,eAAO,MAAM,gBAAgB,QAAO,IAEnC,CAAC;AAEF,eAAO,MAAM,gBAAgB,QAAO,IAEnC,CAAC;AAEF,eAAe,OAAO,CAAC"}
|
|
@@ -0,0 +1,92 @@
|
|
|
1
|
+
class AuthStorage {
|
|
2
|
+
constructor() {
|
|
3
|
+
this.prefix = "pelican_auth_";
|
|
4
|
+
this.defaultTTL = 5 * 60 * 1000;
|
|
5
|
+
this.memoryCache = new Map();
|
|
6
|
+
}
|
|
7
|
+
set(key, value, options = {}) {
|
|
8
|
+
const { ttlMs = this.defaultTTL, useSessionStorage = true } = options;
|
|
9
|
+
const expiresAt = Date.now() + ttlMs;
|
|
10
|
+
const data = { value, expiresAt };
|
|
11
|
+
if (useSessionStorage) {
|
|
12
|
+
try {
|
|
13
|
+
sessionStorage.setItem(`${this.prefix}${key}`, JSON.stringify(data));
|
|
14
|
+
}
|
|
15
|
+
catch (error) {
|
|
16
|
+
console.warn("SessionStorage unavailable, using memory:", error);
|
|
17
|
+
this.setMemory(key, data);
|
|
18
|
+
}
|
|
19
|
+
}
|
|
20
|
+
else {
|
|
21
|
+
this.setMemory(key, data);
|
|
22
|
+
}
|
|
23
|
+
}
|
|
24
|
+
get(key) {
|
|
25
|
+
try {
|
|
26
|
+
const stored = sessionStorage.getItem(`${this.prefix}${key}`);
|
|
27
|
+
if (stored) {
|
|
28
|
+
const data = JSON.parse(stored);
|
|
29
|
+
if (Date.now() > data.expiresAt) {
|
|
30
|
+
this.remove(key);
|
|
31
|
+
return null;
|
|
32
|
+
}
|
|
33
|
+
return data.value;
|
|
34
|
+
}
|
|
35
|
+
}
|
|
36
|
+
catch (error) {
|
|
37
|
+
}
|
|
38
|
+
return this.getMemory(key);
|
|
39
|
+
}
|
|
40
|
+
remove(key) {
|
|
41
|
+
try {
|
|
42
|
+
sessionStorage.removeItem(`${this.prefix}${key}`);
|
|
43
|
+
}
|
|
44
|
+
catch (error) {
|
|
45
|
+
}
|
|
46
|
+
this.memoryCache.delete(key);
|
|
47
|
+
}
|
|
48
|
+
clear() {
|
|
49
|
+
try {
|
|
50
|
+
Object.keys(sessionStorage).forEach((key) => {
|
|
51
|
+
if (key.startsWith(this.prefix)) {
|
|
52
|
+
sessionStorage.removeItem(key);
|
|
53
|
+
}
|
|
54
|
+
});
|
|
55
|
+
}
|
|
56
|
+
catch (error) {
|
|
57
|
+
}
|
|
58
|
+
this.memoryCache.clear();
|
|
59
|
+
}
|
|
60
|
+
setMemory(key, data) {
|
|
61
|
+
this.memoryCache.set(key, data);
|
|
62
|
+
const ttl = data.expiresAt - Date.now();
|
|
63
|
+
setTimeout(() => {
|
|
64
|
+
this.memoryCache.delete(key);
|
|
65
|
+
}, ttl);
|
|
66
|
+
}
|
|
67
|
+
getMemory(key) {
|
|
68
|
+
const data = this.memoryCache.get(key);
|
|
69
|
+
if (!data)
|
|
70
|
+
return null;
|
|
71
|
+
if (Date.now() > data.expiresAt) {
|
|
72
|
+
this.memoryCache.delete(key);
|
|
73
|
+
return null;
|
|
74
|
+
}
|
|
75
|
+
return data.value;
|
|
76
|
+
}
|
|
77
|
+
}
|
|
78
|
+
const storage = new AuthStorage();
|
|
79
|
+
export const storeAuthSession = (sessionId, sessionKey, ttlMs) => {
|
|
80
|
+
storage.set("session", { sessionId, sessionKey }, { ttlMs });
|
|
81
|
+
};
|
|
82
|
+
export const getAuthSession = () => {
|
|
83
|
+
return storage.get("session");
|
|
84
|
+
};
|
|
85
|
+
export const clearAuthSession = () => {
|
|
86
|
+
storage.remove("session");
|
|
87
|
+
};
|
|
88
|
+
export const clearAllAuthData = () => {
|
|
89
|
+
storage.clear();
|
|
90
|
+
};
|
|
91
|
+
export default storage;
|
|
92
|
+
//# sourceMappingURL=storage.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"storage.js","sourceRoot":"","sources":["../../src/utilities/storage.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,22 @@
|
|
|
1
|
+
import { ISocketMessage } from "../types/types";
|
|
2
|
+
type TransportHandlers = {
|
|
3
|
+
onOpen?: () => void;
|
|
4
|
+
onMessage?: (msg: ISocketMessage) => void;
|
|
5
|
+
onError?: (err: Event) => void;
|
|
6
|
+
onClose?: (ev: CloseEvent) => void;
|
|
7
|
+
};
|
|
8
|
+
export declare class Transport {
|
|
9
|
+
private socket?;
|
|
10
|
+
private handlers;
|
|
11
|
+
private reconnectAttempts;
|
|
12
|
+
private maxReconnectAttempts;
|
|
13
|
+
private isExplicitlyClosed;
|
|
14
|
+
private url?;
|
|
15
|
+
constructor(handlers: TransportHandlers);
|
|
16
|
+
connect(url: string): void;
|
|
17
|
+
private attemptReconnect;
|
|
18
|
+
send(payload: ISocketMessage): void;
|
|
19
|
+
close(): void;
|
|
20
|
+
}
|
|
21
|
+
export {};
|
|
22
|
+
//# sourceMappingURL=transport.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"transport.d.ts","sourceRoot":"","sources":["../../src/utilities/transport.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,cAAc,EAAE,MAAM,gBAAgB,CAAC;AAEhD,KAAK,iBAAiB,GAAG;IACvB,MAAM,CAAC,EAAE,MAAM,IAAI,CAAC;IACpB,SAAS,CAAC,EAAE,CAAC,GAAG,EAAE,cAAc,KAAK,IAAI,CAAC;IAC1C,OAAO,CAAC,EAAE,CAAC,GAAG,EAAE,KAAK,KAAK,IAAI,CAAC;IAC/B,OAAO,CAAC,EAAE,CAAC,EAAE,EAAE,UAAU,KAAK,IAAI,CAAC;CACpC,CAAC;AAEF,qBAAa,SAAS;IACpB,OAAO,CAAC,MAAM,CAAC,CAAY;IAC3B,OAAO,CAAC,QAAQ,CAAoB;IACpC,OAAO,CAAC,iBAAiB,CAAK;IAC9B,OAAO,CAAC,oBAAoB,CAAK;IACjC,OAAO,CAAC,kBAAkB,CAAS;IACnC,OAAO,CAAC,GAAG,CAAC,CAAS;gBAET,QAAQ,EAAE,iBAAiB;IAIvC,OAAO,CAAC,GAAG,EAAE,MAAM;IA8BnB,OAAO,CAAC,gBAAgB;IAaxB,IAAI,CAAC,OAAO,EAAE,cAAc;IAM5B,KAAK;CAIN"}
|
|
@@ -0,0 +1,57 @@
|
|
|
1
|
+
export class Transport {
|
|
2
|
+
constructor(handlers) {
|
|
3
|
+
this.reconnectAttempts = 0;
|
|
4
|
+
this.maxReconnectAttempts = 5;
|
|
5
|
+
this.isExplicitlyClosed = false;
|
|
6
|
+
this.handlers = handlers;
|
|
7
|
+
}
|
|
8
|
+
connect(url) {
|
|
9
|
+
this.url = url;
|
|
10
|
+
this.isExplicitlyClosed = false;
|
|
11
|
+
this.socket = new WebSocket(url);
|
|
12
|
+
this.socket.onopen = () => {
|
|
13
|
+
this.reconnectAttempts = 0;
|
|
14
|
+
this.handlers.onOpen?.();
|
|
15
|
+
};
|
|
16
|
+
this.socket.onmessage = (e) => {
|
|
17
|
+
try {
|
|
18
|
+
const data = JSON.parse(e.data);
|
|
19
|
+
this.handlers.onMessage?.(data);
|
|
20
|
+
}
|
|
21
|
+
catch (err) {
|
|
22
|
+
console.error("Failed to parse message", err);
|
|
23
|
+
}
|
|
24
|
+
};
|
|
25
|
+
this.socket.onerror = (e) => {
|
|
26
|
+
this.handlers.onError?.(e);
|
|
27
|
+
};
|
|
28
|
+
this.socket.onclose = (e) => {
|
|
29
|
+
this.handlers.onClose?.(e);
|
|
30
|
+
if (!this.isExplicitlyClosed) {
|
|
31
|
+
this.attemptReconnect();
|
|
32
|
+
}
|
|
33
|
+
};
|
|
34
|
+
}
|
|
35
|
+
attemptReconnect() {
|
|
36
|
+
if (this.reconnectAttempts >= this.maxReconnectAttempts) {
|
|
37
|
+
console.error("❌ Max reconnect attempts reached");
|
|
38
|
+
return;
|
|
39
|
+
}
|
|
40
|
+
this.reconnectAttempts++;
|
|
41
|
+
const delay = Math.pow(2, this.reconnectAttempts) * 500;
|
|
42
|
+
setTimeout(() => {
|
|
43
|
+
if (this.url)
|
|
44
|
+
this.connect(this.url);
|
|
45
|
+
}, delay);
|
|
46
|
+
}
|
|
47
|
+
send(payload) {
|
|
48
|
+
if (this.socket?.readyState === WebSocket.OPEN) {
|
|
49
|
+
this.socket.send(JSON.stringify(payload));
|
|
50
|
+
}
|
|
51
|
+
}
|
|
52
|
+
close() {
|
|
53
|
+
this.isExplicitlyClosed = true;
|
|
54
|
+
this.socket?.close();
|
|
55
|
+
}
|
|
56
|
+
}
|
|
57
|
+
//# sourceMappingURL=transport.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"transport.js","sourceRoot":"","sources":["../../src/utilities/transport.ts"],"names":[],"mappings":"AASA,MAAM,OAAO,SAAS;IAQpB,YAAY,QAA2B;QAL/B,sBAAiB,GAAG,CAAC,CAAC;QACtB,yBAAoB,GAAG,CAAC,CAAC;QACzB,uBAAkB,GAAG,KAAK,CAAC;QAIjC,IAAI,CAAC,QAAQ,GAAG,QAAQ,CAAC;IAC3B,CAAC;IAED,OAAO,CAAC,GAAW;QACjB,IAAI,CAAC,GAAG,GAAG,GAAG,CAAC;QACf,IAAI,CAAC,kBAAkB,GAAG,KAAK,CAAC;QAChC,IAAI,CAAC,MAAM,GAAG,IAAI,SAAS,CAAC,GAAG,CAAC,CAAC;QAEjC,IAAI,CAAC,MAAM,CAAC,MAAM,GAAG,GAAG,EAAE;YACxB,IAAI,CAAC,iBAAiB,GAAG,CAAC,CAAC;YAC3B,IAAI,CAAC,QAAQ,CAAC,MAAM,EAAE,EAAE,CAAC;QAC3B,CAAC,CAAC;QACF,IAAI,CAAC,MAAM,CAAC,SAAS,GAAG,CAAC,CAAe,EAAE,EAAE;YAC1C,IAAI,CAAC;gBACH,MAAM,IAAI,GAAG,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC;gBAChC,IAAI,CAAC,QAAQ,CAAC,SAAS,EAAE,CAAC,IAAI,CAAC,CAAC;YAClC,CAAC;YAAC,OAAO,GAAG,EAAE,CAAC;gBACb,OAAO,CAAC,KAAK,CAAC,yBAAyB,EAAE,GAAG,CAAC,CAAC;YAChD,CAAC;QACH,CAAC,CAAC;QACF,IAAI,CAAC,MAAM,CAAC,OAAO,GAAG,CAAC,CAAQ,EAAE,EAAE;YACjC,IAAI,CAAC,QAAQ,CAAC,OAAO,EAAE,CAAC,CAAC,CAAC,CAAC;QAC7B,CAAC,CAAC;QACF,IAAI,CAAC,MAAM,CAAC,OAAO,GAAG,CAAC,CAAa,EAAE,EAAE;YACtC,IAAI,CAAC,QAAQ,CAAC,OAAO,EAAE,CAAC,CAAC,CAAC,CAAC;YAG3B,IAAI,CAAC,IAAI,CAAC,kBAAkB,EAAE,CAAC;gBAC7B,IAAI,CAAC,gBAAgB,EAAE,CAAC;YAC1B,CAAC;QACH,CAAC,CAAC;IACJ,CAAC;IAEO,gBAAgB;QACtB,IAAI,IAAI,CAAC,iBAAiB,IAAI,IAAI,CAAC,oBAAoB,EAAE,CAAC;YACxD,OAAO,CAAC,KAAK,CAAC,kCAAkC,CAAC,CAAC;YAClD,OAAO;QACT,CAAC;QAED,IAAI,CAAC,iBAAiB,EAAE,CAAC;QAEzB,MAAM,KAAK,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,IAAI,CAAC,iBAAiB,CAAC,GAAG,GAAG,CAAC;QACxD,UAAU,CAAC,GAAG,EAAE;YACd,IAAI,IAAI,CAAC,GAAG;gBAAE,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;QACvC,CAAC,EAAE,KAAK,CAAC,CAAC;IACZ,CAAC;IACD,IAAI,CAAC,OAAuB;QAC1B,IAAI,IAAI,CAAC,MAAM,EAAE,UAAU,KAAK,SAAS,CAAC,IAAI,EAAE,CAAC;YAC/C,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC,SAAS,CAAC,OAAO,CAAC,CAAC,CAAC;QAC5C,CAAC;IACH,CAAC;IAED,KAAK;QACH,IAAI,CAAC,kBAAkB,GAAG,IAAI,CAAC;QAC/B,IAAI,CAAC,MAAM,EAAE,KAAK,EAAE,CAAC;IACvB,CAAC;CACF"}
|