@shohaghinfo/aerojs 0.3.0 → 0.4.0
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/AGENTS.md +226 -0
- package/README.md +140 -0
- package/dist/core/application.d.ts +10 -0
- package/dist/core/application.d.ts.map +1 -1
- package/dist/core/application.js +13 -0
- package/dist/core/application.js.map +1 -1
- package/dist/core/context.d.ts +1 -0
- package/dist/core/context.d.ts.map +1 -1
- package/dist/core/context.js +3 -0
- package/dist/core/context.js.map +1 -1
- package/dist/database/connection.d.ts +32 -0
- package/dist/database/connection.d.ts.map +1 -1
- package/dist/database/connection.js +51 -0
- package/dist/database/connection.js.map +1 -1
- package/dist/database/index.d.ts +1 -1
- package/dist/database/index.d.ts.map +1 -1
- package/dist/database/index.js +1 -1
- package/dist/database/index.js.map +1 -1
- package/dist/database/model.d.ts +16 -0
- package/dist/database/model.d.ts.map +1 -1
- package/dist/database/model.js +91 -13
- package/dist/database/model.js.map +1 -1
- package/dist/database/query-builder.d.ts +18 -0
- package/dist/database/query-builder.d.ts.map +1 -1
- package/dist/database/query-builder.js +82 -30
- package/dist/database/query-builder.js.map +1 -1
- package/dist/index.d.ts +2 -2
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +2 -2
- package/dist/index.js.map +1 -1
- package/dist/queue/dashboard.d.ts +30 -0
- package/dist/queue/dashboard.d.ts.map +1 -0
- package/dist/queue/dashboard.js +371 -0
- package/dist/queue/dashboard.js.map +1 -0
- package/dist/queue/index.d.ts +1 -0
- package/dist/queue/index.d.ts.map +1 -1
- package/dist/queue/index.js +1 -0
- package/dist/queue/index.js.map +1 -1
- package/dist/queue/queue-manager.d.ts +31 -1
- package/dist/queue/queue-manager.d.ts.map +1 -1
- package/dist/queue/queue-manager.js +60 -0
- package/dist/queue/queue-manager.js.map +1 -1
- package/dist/queue/worker.d.ts +3 -0
- package/dist/queue/worker.d.ts.map +1 -1
- package/dist/queue/worker.js +9 -0
- package/dist/queue/worker.js.map +1 -1
- package/dist/security/encryption.d.ts +60 -0
- package/dist/security/encryption.d.ts.map +1 -0
- package/dist/security/encryption.js +120 -0
- package/dist/security/encryption.js.map +1 -0
- package/dist/security/fingerprint.d.ts +47 -0
- package/dist/security/fingerprint.d.ts.map +1 -0
- package/dist/security/fingerprint.js +83 -0
- package/dist/security/fingerprint.js.map +1 -0
- package/dist/security/index.d.ts +2 -0
- package/dist/security/index.d.ts.map +1 -1
- package/dist/security/index.js +2 -0
- package/dist/security/index.js.map +1 -1
- package/dist/session/cookie-session-driver.d.ts +34 -0
- package/dist/session/cookie-session-driver.d.ts.map +1 -0
- package/dist/session/cookie-session-driver.js +57 -0
- package/dist/session/cookie-session-driver.js.map +1 -0
- package/dist/session/index.d.ts +8 -0
- package/dist/session/index.d.ts.map +1 -0
- package/dist/session/index.js +8 -0
- package/dist/session/index.js.map +1 -0
- package/dist/session/session-manager.d.ts.map +1 -1
- package/dist/session/session-manager.js +7 -2
- package/dist/session/session-manager.js.map +1 -1
- package/package.json +1 -1
|
@@ -0,0 +1,60 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @file encryption.ts
|
|
3
|
+
* @description Enterprise-grade authenticated encryption (AES-256-GCM) for AeroJS.
|
|
4
|
+
* Supports transparent model field encryption, arbitrary object encryption, and secure key derivation.
|
|
5
|
+
*/
|
|
6
|
+
export interface EncrypterOptions {
|
|
7
|
+
key?: string;
|
|
8
|
+
cipher?: string;
|
|
9
|
+
}
|
|
10
|
+
export declare class Encrypter {
|
|
11
|
+
private keyBuffer;
|
|
12
|
+
readonly cipher: string;
|
|
13
|
+
private static defaultInstance?;
|
|
14
|
+
constructor(key?: string);
|
|
15
|
+
/**
|
|
16
|
+
* Generates a cryptographically random 32-byte key encoded as a hex string.
|
|
17
|
+
*/
|
|
18
|
+
static generateKey(): string;
|
|
19
|
+
/**
|
|
20
|
+
* Normalizes any key string into a 32-byte Buffer.
|
|
21
|
+
*/
|
|
22
|
+
static normalizeKey(key: string): Buffer;
|
|
23
|
+
/**
|
|
24
|
+
* Encrypts any serializable value (string, object, number, boolean) using AES-256-GCM.
|
|
25
|
+
* Returns a compact token formatted as `aero:enc:<iv>:<authTag>:<ciphertext>`.
|
|
26
|
+
*/
|
|
27
|
+
encrypt(value: unknown): string;
|
|
28
|
+
/**
|
|
29
|
+
* Decrypts an AES-256-GCM encrypted payload produced by `encrypt`.
|
|
30
|
+
*/
|
|
31
|
+
decrypt<T = any>(payload: string): T;
|
|
32
|
+
/**
|
|
33
|
+
* Encrypts a string directly.
|
|
34
|
+
*/
|
|
35
|
+
encryptString(text: string): string;
|
|
36
|
+
/**
|
|
37
|
+
* Decrypts an encrypted string directly.
|
|
38
|
+
*/
|
|
39
|
+
decryptString(payload: string): string;
|
|
40
|
+
/**
|
|
41
|
+
* Checks whether a value is an encrypted payload string.
|
|
42
|
+
*/
|
|
43
|
+
static isEncrypted(value: unknown): boolean;
|
|
44
|
+
/**
|
|
45
|
+
* Returns the shared singleton instance.
|
|
46
|
+
*/
|
|
47
|
+
static getInstance(): Encrypter;
|
|
48
|
+
}
|
|
49
|
+
/**
|
|
50
|
+
* Global Crypt facade for easy application-wide encryption and decryption.
|
|
51
|
+
*/
|
|
52
|
+
export declare const Crypt: {
|
|
53
|
+
encrypt: (value: unknown, key?: string) => string;
|
|
54
|
+
decrypt: <T = any>(payload: string, key?: string) => T;
|
|
55
|
+
encryptString: (text: string, key?: string) => string;
|
|
56
|
+
decryptString: (payload: string, key?: string) => string;
|
|
57
|
+
generateKey: () => string;
|
|
58
|
+
isEncrypted: (value: unknown) => boolean;
|
|
59
|
+
};
|
|
60
|
+
//# sourceMappingURL=encryption.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"encryption.d.ts","sourceRoot":"","sources":["../../src/security/encryption.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAIH,MAAM,WAAW,gBAAgB;IAC/B,GAAG,CAAC,EAAE,MAAM,CAAC;IACb,MAAM,CAAC,EAAE,MAAM,CAAC;CACjB;AAED,qBAAa,SAAS;IACpB,OAAO,CAAC,SAAS,CAAS;IAC1B,SAAgB,MAAM,EAAE,MAAM,CAAiB;IAC/C,OAAO,CAAC,MAAM,CAAC,eAAe,CAAC,CAAY;gBAE/B,GAAG,CAAC,EAAE,MAAM;IAKxB;;OAEG;WACW,WAAW,IAAI,MAAM;IAInC;;OAEG;WACW,YAAY,CAAC,GAAG,EAAE,MAAM,GAAG,MAAM;IAe/C;;;OAGG;IACI,OAAO,CAAC,KAAK,EAAE,OAAO,GAAG,MAAM;IAYtC;;OAEG;IACI,OAAO,CAAC,CAAC,GAAG,GAAG,EAAE,OAAO,EAAE,MAAM,GAAG,CAAC;IAuB3C;;OAEG;IACI,aAAa,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM;IAI1C;;OAEG;IACI,aAAa,CAAC,OAAO,EAAE,MAAM,GAAG,MAAM;IAI7C;;OAEG;WACW,WAAW,CAAC,KAAK,EAAE,OAAO,GAAG,OAAO;IAIlD;;OAEG;WACW,WAAW,IAAI,SAAS;CAMvC;AAED;;GAEG;AACH,eAAO,MAAM,KAAK;qBACC,OAAO,QAAQ,MAAM,KAAG,MAAM;cAGrC,CAAC,iBAAiB,MAAM,QAAQ,MAAM,KAAG,CAAC;0BAG9B,MAAM,QAAQ,MAAM,KAAG,MAAM;6BAG1B,MAAM,QAAQ,MAAM,KAAG,MAAM;uBAGrC,MAAM;yBACF,OAAO,KAAG,OAAO;CACvC,CAAC"}
|
|
@@ -0,0 +1,120 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @file encryption.ts
|
|
3
|
+
* @description Enterprise-grade authenticated encryption (AES-256-GCM) for AeroJS.
|
|
4
|
+
* Supports transparent model field encryption, arbitrary object encryption, and secure key derivation.
|
|
5
|
+
*/
|
|
6
|
+
import * as crypto from 'node:crypto';
|
|
7
|
+
export class Encrypter {
|
|
8
|
+
keyBuffer;
|
|
9
|
+
cipher = 'aes-256-gcm';
|
|
10
|
+
static defaultInstance;
|
|
11
|
+
constructor(key) {
|
|
12
|
+
const rawKey = key || process.env['APP_KEY'] || process.env['AERO_KEY'] || 'aerojs-default-encryption-secret-key-32bytes!';
|
|
13
|
+
this.keyBuffer = Encrypter.normalizeKey(rawKey);
|
|
14
|
+
}
|
|
15
|
+
/**
|
|
16
|
+
* Generates a cryptographically random 32-byte key encoded as a hex string.
|
|
17
|
+
*/
|
|
18
|
+
static generateKey() {
|
|
19
|
+
return crypto.randomBytes(32).toString('hex');
|
|
20
|
+
}
|
|
21
|
+
/**
|
|
22
|
+
* Normalizes any key string into a 32-byte Buffer.
|
|
23
|
+
*/
|
|
24
|
+
static normalizeKey(key) {
|
|
25
|
+
if (key.startsWith('base64:')) {
|
|
26
|
+
const buf = Buffer.from(key.slice(7), 'base64');
|
|
27
|
+
if (buf.length === 32)
|
|
28
|
+
return buf;
|
|
29
|
+
}
|
|
30
|
+
// If it's a 64-char hex string
|
|
31
|
+
if (/^[0-9a-fA-F]{64}$/.test(key)) {
|
|
32
|
+
return Buffer.from(key, 'hex');
|
|
33
|
+
}
|
|
34
|
+
const buf = Buffer.from(key, 'utf8');
|
|
35
|
+
if (buf.length === 32)
|
|
36
|
+
return buf;
|
|
37
|
+
// Otherwise hash to 32 bytes with SHA-256
|
|
38
|
+
return crypto.createHash('sha256').update(key).digest();
|
|
39
|
+
}
|
|
40
|
+
/**
|
|
41
|
+
* Encrypts any serializable value (string, object, number, boolean) using AES-256-GCM.
|
|
42
|
+
* Returns a compact token formatted as `aero:enc:<iv>:<authTag>:<ciphertext>`.
|
|
43
|
+
*/
|
|
44
|
+
encrypt(value) {
|
|
45
|
+
const serialized = JSON.stringify(value);
|
|
46
|
+
const iv = crypto.randomBytes(12); // standard 96-bit IV
|
|
47
|
+
const cipher = crypto.createCipheriv(this.cipher, this.keyBuffer, iv);
|
|
48
|
+
let encrypted = cipher.update(serialized, 'utf8', 'hex');
|
|
49
|
+
encrypted += cipher.final('hex');
|
|
50
|
+
const authTag = cipher.getAuthTag().toString('hex');
|
|
51
|
+
return `aero:enc:${iv.toString('hex')}:${authTag}:${encrypted}`;
|
|
52
|
+
}
|
|
53
|
+
/**
|
|
54
|
+
* Decrypts an AES-256-GCM encrypted payload produced by `encrypt`.
|
|
55
|
+
*/
|
|
56
|
+
decrypt(payload) {
|
|
57
|
+
if (!Encrypter.isEncrypted(payload)) {
|
|
58
|
+
throw new Error('Invalid encryption payload: missing aero:enc prefix');
|
|
59
|
+
}
|
|
60
|
+
const parts = payload.slice(9).split(':');
|
|
61
|
+
if (parts.length !== 3) {
|
|
62
|
+
throw new Error('Invalid encryption payload format. Expected iv:authTag:ciphertext');
|
|
63
|
+
}
|
|
64
|
+
const [ivHex, authTagHex, encryptedHex] = parts;
|
|
65
|
+
const iv = Buffer.from(ivHex, 'hex');
|
|
66
|
+
const authTag = Buffer.from(authTagHex, 'hex');
|
|
67
|
+
const decipher = crypto.createDecipheriv(this.cipher, this.keyBuffer, iv, { authTagLength: 16 });
|
|
68
|
+
decipher.setAuthTag(authTag);
|
|
69
|
+
let decrypted = decipher.update(encryptedHex, 'hex', 'utf8');
|
|
70
|
+
decrypted += decipher.final('utf8');
|
|
71
|
+
return JSON.parse(decrypted);
|
|
72
|
+
}
|
|
73
|
+
/**
|
|
74
|
+
* Encrypts a string directly.
|
|
75
|
+
*/
|
|
76
|
+
encryptString(text) {
|
|
77
|
+
return this.encrypt(text);
|
|
78
|
+
}
|
|
79
|
+
/**
|
|
80
|
+
* Decrypts an encrypted string directly.
|
|
81
|
+
*/
|
|
82
|
+
decryptString(payload) {
|
|
83
|
+
return this.decrypt(payload);
|
|
84
|
+
}
|
|
85
|
+
/**
|
|
86
|
+
* Checks whether a value is an encrypted payload string.
|
|
87
|
+
*/
|
|
88
|
+
static isEncrypted(value) {
|
|
89
|
+
return typeof value === 'string' && value.startsWith('aero:enc:');
|
|
90
|
+
}
|
|
91
|
+
/**
|
|
92
|
+
* Returns the shared singleton instance.
|
|
93
|
+
*/
|
|
94
|
+
static getInstance() {
|
|
95
|
+
if (!this.defaultInstance) {
|
|
96
|
+
this.defaultInstance = new Encrypter();
|
|
97
|
+
}
|
|
98
|
+
return this.defaultInstance;
|
|
99
|
+
}
|
|
100
|
+
}
|
|
101
|
+
/**
|
|
102
|
+
* Global Crypt facade for easy application-wide encryption and decryption.
|
|
103
|
+
*/
|
|
104
|
+
export const Crypt = {
|
|
105
|
+
encrypt: (value, key) => {
|
|
106
|
+
return key ? new Encrypter(key).encrypt(value) : Encrypter.getInstance().encrypt(value);
|
|
107
|
+
},
|
|
108
|
+
decrypt: (payload, key) => {
|
|
109
|
+
return key ? new Encrypter(key).decrypt(payload) : Encrypter.getInstance().decrypt(payload);
|
|
110
|
+
},
|
|
111
|
+
encryptString: (text, key) => {
|
|
112
|
+
return key ? new Encrypter(key).encryptString(text) : Encrypter.getInstance().encryptString(text);
|
|
113
|
+
},
|
|
114
|
+
decryptString: (payload, key) => {
|
|
115
|
+
return key ? new Encrypter(key).decryptString(payload) : Encrypter.getInstance().decryptString(payload);
|
|
116
|
+
},
|
|
117
|
+
generateKey: () => Encrypter.generateKey(),
|
|
118
|
+
isEncrypted: (value) => Encrypter.isEncrypted(value),
|
|
119
|
+
};
|
|
120
|
+
//# sourceMappingURL=encryption.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"encryption.js","sourceRoot":"","sources":["../../src/security/encryption.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,47 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @file fingerprint.ts
|
|
3
|
+
* @description Client Request Fingerprinting and Anti-Session Hijacking protection for AeroJS.
|
|
4
|
+
* Computes deterministic cryptographic hashes of client browser, network, and header signatures.
|
|
5
|
+
*/
|
|
6
|
+
import type { AeroContext } from '../core/context.js';
|
|
7
|
+
import type { Middleware } from '../core/types.js';
|
|
8
|
+
export interface FingerprintOptions {
|
|
9
|
+
/**
|
|
10
|
+
* Include client IP address in fingerprint. Default: true.
|
|
11
|
+
*/
|
|
12
|
+
ip?: boolean;
|
|
13
|
+
/**
|
|
14
|
+
* Include User-Agent header. Default: true.
|
|
15
|
+
*/
|
|
16
|
+
userAgent?: boolean;
|
|
17
|
+
/**
|
|
18
|
+
* Include Accept-Language header. Default: true.
|
|
19
|
+
*/
|
|
20
|
+
acceptLanguage?: boolean;
|
|
21
|
+
/**
|
|
22
|
+
* Custom application salt for the hash.
|
|
23
|
+
*/
|
|
24
|
+
salt?: string;
|
|
25
|
+
/**
|
|
26
|
+
* Additional header names to include in the signature.
|
|
27
|
+
*/
|
|
28
|
+
additionalHeaders?: string[];
|
|
29
|
+
}
|
|
30
|
+
export declare class RequestFingerprint {
|
|
31
|
+
/**
|
|
32
|
+
* Generates a deterministic SHA-256 fingerprint hash of the request client traits.
|
|
33
|
+
*/
|
|
34
|
+
static generate(ctx: AeroContext, options?: FingerprintOptions): string;
|
|
35
|
+
/**
|
|
36
|
+
* Verifies whether an incoming request matches the expected fingerprint hash.
|
|
37
|
+
*/
|
|
38
|
+
static verify(ctx: AeroContext, expectedFingerprint: string, options?: FingerprintOptions): boolean;
|
|
39
|
+
}
|
|
40
|
+
/**
|
|
41
|
+
* Middleware that binds client fingerprinting to AeroContext and validates session integrity.
|
|
42
|
+
* If session hijacking is detected (mismatched device fingerprint), access is rejected with 401.
|
|
43
|
+
*/
|
|
44
|
+
export declare function fingerprintGuard(options?: FingerprintOptions & {
|
|
45
|
+
onMismatch?: (ctx: AeroContext) => void | Promise<void>;
|
|
46
|
+
}): Middleware;
|
|
47
|
+
//# sourceMappingURL=fingerprint.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"fingerprint.d.ts","sourceRoot":"","sources":["../../src/security/fingerprint.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAGH,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,oBAAoB,CAAC;AACtD,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,kBAAkB,CAAC;AAEnD,MAAM,WAAW,kBAAkB;IACjC;;OAEG;IACH,EAAE,CAAC,EAAE,OAAO,CAAC;IACb;;OAEG;IACH,SAAS,CAAC,EAAE,OAAO,CAAC;IACpB;;OAEG;IACH,cAAc,CAAC,EAAE,OAAO,CAAC;IACzB;;OAEG;IACH,IAAI,CAAC,EAAE,MAAM,CAAC;IACd;;OAEG;IACH,iBAAiB,CAAC,EAAE,MAAM,EAAE,CAAC;CAC9B;AAED,qBAAa,kBAAkB;IAC7B;;OAEG;WACW,QAAQ,CAAC,GAAG,EAAE,WAAW,EAAE,OAAO,GAAE,kBAAuB,GAAG,MAAM;IAsClF;;OAEG;WACW,MAAM,CAAC,GAAG,EAAE,WAAW,EAAE,mBAAmB,EAAE,MAAM,EAAE,OAAO,GAAE,kBAAuB,GAAG,OAAO;CAK/G;AAED;;;GAGG;AACH,wBAAgB,gBAAgB,CAAC,OAAO,GAAE,kBAAkB,GAAG;IAC7D,UAAU,CAAC,EAAE,CAAC,GAAG,EAAE,WAAW,KAAK,IAAI,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;CACpD,GAAG,UAAU,CA2BlB"}
|
|
@@ -0,0 +1,83 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @file fingerprint.ts
|
|
3
|
+
* @description Client Request Fingerprinting and Anti-Session Hijacking protection for AeroJS.
|
|
4
|
+
* Computes deterministic cryptographic hashes of client browser, network, and header signatures.
|
|
5
|
+
*/
|
|
6
|
+
import * as crypto from 'node:crypto';
|
|
7
|
+
export class RequestFingerprint {
|
|
8
|
+
/**
|
|
9
|
+
* Generates a deterministic SHA-256 fingerprint hash of the request client traits.
|
|
10
|
+
*/
|
|
11
|
+
static generate(ctx, options = {}) {
|
|
12
|
+
const includeIp = options.ip !== false;
|
|
13
|
+
const includeUa = options.userAgent !== false;
|
|
14
|
+
const includeLang = options.acceptLanguage !== false;
|
|
15
|
+
const salt = options.salt || 'aero-fingerprint-salt';
|
|
16
|
+
const components = [];
|
|
17
|
+
if (includeUa) {
|
|
18
|
+
const ua = ctx.req.headers['user-agent'];
|
|
19
|
+
components.push(Array.isArray(ua) ? ua.join(',') : ua || 'unknown-ua');
|
|
20
|
+
}
|
|
21
|
+
if (includeLang) {
|
|
22
|
+
const lang = ctx.req.headers['accept-language'];
|
|
23
|
+
components.push(Array.isArray(lang) ? lang.join(',') : lang || 'unknown-lang');
|
|
24
|
+
}
|
|
25
|
+
if (includeIp) {
|
|
26
|
+
// Resolve client IP from headers or request IP
|
|
27
|
+
const forwarded = ctx.req.headers['x-forwarded-for'];
|
|
28
|
+
const rawIp = typeof forwarded === 'string'
|
|
29
|
+
? forwarded.split(',')[0]?.trim()
|
|
30
|
+
: (ctx.ip || ctx.req.raw?.socket?.remoteAddress || '127.0.0.1');
|
|
31
|
+
components.push(rawIp || '127.0.0.1');
|
|
32
|
+
}
|
|
33
|
+
if (options.additionalHeaders) {
|
|
34
|
+
for (const h of options.additionalHeaders) {
|
|
35
|
+
const val = ctx.req.headers[h.toLowerCase()];
|
|
36
|
+
components.push(Array.isArray(val) ? val.join(',') : val || '');
|
|
37
|
+
}
|
|
38
|
+
}
|
|
39
|
+
const payload = `${salt}::${components.join('||')}`;
|
|
40
|
+
return crypto.createHash('sha256').update(payload).digest('hex');
|
|
41
|
+
}
|
|
42
|
+
/**
|
|
43
|
+
* Verifies whether an incoming request matches the expected fingerprint hash.
|
|
44
|
+
*/
|
|
45
|
+
static verify(ctx, expectedFingerprint, options = {}) {
|
|
46
|
+
const current = this.generate(ctx, options);
|
|
47
|
+
if (current.length !== expectedFingerprint.length)
|
|
48
|
+
return false;
|
|
49
|
+
return crypto.timingSafeEqual(Buffer.from(current), Buffer.from(expectedFingerprint));
|
|
50
|
+
}
|
|
51
|
+
}
|
|
52
|
+
/**
|
|
53
|
+
* Middleware that binds client fingerprinting to AeroContext and validates session integrity.
|
|
54
|
+
* If session hijacking is detected (mismatched device fingerprint), access is rejected with 401.
|
|
55
|
+
*/
|
|
56
|
+
export function fingerprintGuard(options = {}) {
|
|
57
|
+
return async (ctx, next) => {
|
|
58
|
+
const currentFingerprint = RequestFingerprint.generate(ctx, options);
|
|
59
|
+
ctx.fingerprint = currentFingerprint;
|
|
60
|
+
// If session is active, bind and verify fingerprint
|
|
61
|
+
const session = ctx.session;
|
|
62
|
+
if (session && typeof session.get === 'function') {
|
|
63
|
+
const stored = await session.get('_fingerprint');
|
|
64
|
+
if (!stored) {
|
|
65
|
+
// First visit in this session -> bind fingerprint
|
|
66
|
+
await session.put('_fingerprint', currentFingerprint);
|
|
67
|
+
}
|
|
68
|
+
else if (stored !== currentFingerprint) {
|
|
69
|
+
// Anomaly / Session Hijack detected!
|
|
70
|
+
if (options.onMismatch) {
|
|
71
|
+
await options.onMismatch(ctx);
|
|
72
|
+
return;
|
|
73
|
+
}
|
|
74
|
+
ctx.status(401).json({
|
|
75
|
+
error: 'Unauthorized: Session fingerprint mismatch (Potential Session Hijack)',
|
|
76
|
+
});
|
|
77
|
+
return;
|
|
78
|
+
}
|
|
79
|
+
}
|
|
80
|
+
await next();
|
|
81
|
+
};
|
|
82
|
+
}
|
|
83
|
+
//# sourceMappingURL=fingerprint.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"fingerprint.js","sourceRoot":"","sources":["../../src/security/fingerprint.ts"],"names":[],"mappings":"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"}
|
package/dist/security/index.d.ts
CHANGED
|
@@ -11,4 +11,6 @@ export { cors, type CorsOptions, } from '../middleware/cors.js';
|
|
|
11
11
|
export * from './totp.js';
|
|
12
12
|
export * from './vault.js';
|
|
13
13
|
export * from './signed-url.js';
|
|
14
|
+
export * from './encryption.js';
|
|
15
|
+
export * from './fingerprint.js';
|
|
14
16
|
//# sourceMappingURL=index.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/security/index.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,EACL,GAAG,EACH,IAAI,EACJ,MAAM,EACN,MAAM,EACN,OAAO,EACP,aAAa,EACb,iBAAiB,EACjB,iBAAiB,EACjB,cAAc,EACd,KAAK,YAAY,EACjB,KAAK,SAAS,EACd,KAAK,UAAU,EACf,KAAK,cAAc,EACnB,KAAK,gBAAgB,EACrB,KAAK,cAAc,GACpB,MAAM,UAAU,CAAC;AAElB,OAAO,EACL,SAAS,EACT,oBAAoB,EACpB,mBAAmB,EACnB,oBAAoB,EACpB,KAAK,gBAAgB,EACrB,KAAK,cAAc,EACnB,KAAK,aAAa,EAClB,KAAK,0BAA0B,GAChC,MAAM,mBAAmB,CAAC;AAE3B,OAAO,EACL,eAAe,EACf,KAAK,sBAAsB,EAC3B,KAAK,WAAW,EAChB,KAAK,+BAA+B,GACrC,MAAM,cAAc,CAAC;AAEtB,OAAO,EACL,IAAI,EACJ,KAAK,WAAW,GACjB,MAAM,WAAW,CAAC;AAEnB,OAAO,EACL,IAAI,EACJ,IAAI,EACJ,UAAU,EACV,KAAK,aAAa,GACnB,MAAM,WAAW,CAAC;AAEnB,OAAO,EACL,IAAI,EACJ,KAAK,WAAW,GACjB,MAAM,uBAAuB,CAAC;AAE/B,cAAc,WAAW,CAAC;AAC1B,cAAc,YAAY,CAAC;AAC3B,cAAc,iBAAiB,CAAC"}
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/security/index.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,EACL,GAAG,EACH,IAAI,EACJ,MAAM,EACN,MAAM,EACN,OAAO,EACP,aAAa,EACb,iBAAiB,EACjB,iBAAiB,EACjB,cAAc,EACd,KAAK,YAAY,EACjB,KAAK,SAAS,EACd,KAAK,UAAU,EACf,KAAK,cAAc,EACnB,KAAK,gBAAgB,EACrB,KAAK,cAAc,GACpB,MAAM,UAAU,CAAC;AAElB,OAAO,EACL,SAAS,EACT,oBAAoB,EACpB,mBAAmB,EACnB,oBAAoB,EACpB,KAAK,gBAAgB,EACrB,KAAK,cAAc,EACnB,KAAK,aAAa,EAClB,KAAK,0BAA0B,GAChC,MAAM,mBAAmB,CAAC;AAE3B,OAAO,EACL,eAAe,EACf,KAAK,sBAAsB,EAC3B,KAAK,WAAW,EAChB,KAAK,+BAA+B,GACrC,MAAM,cAAc,CAAC;AAEtB,OAAO,EACL,IAAI,EACJ,KAAK,WAAW,GACjB,MAAM,WAAW,CAAC;AAEnB,OAAO,EACL,IAAI,EACJ,IAAI,EACJ,UAAU,EACV,KAAK,aAAa,GACnB,MAAM,WAAW,CAAC;AAEnB,OAAO,EACL,IAAI,EACJ,KAAK,WAAW,GACjB,MAAM,uBAAuB,CAAC;AAE/B,cAAc,WAAW,CAAC;AAC1B,cAAc,YAAY,CAAC;AAC3B,cAAc,iBAAiB,CAAC;AAChC,cAAc,iBAAiB,CAAC;AAChC,cAAc,kBAAkB,CAAC"}
|
package/dist/security/index.js
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/security/index.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,EACL,GAAG,EACH,IAAI,EACJ,MAAM,EACN,MAAM,EACN,OAAO,EACP,aAAa,EACb,iBAAiB,EACjB,iBAAiB,EACjB,cAAc,GAOf,MAAM,UAAU,CAAC;AAElB,OAAO,EACL,SAAS,EACT,oBAAoB,EACpB,mBAAmB,EACnB,oBAAoB,GAKrB,MAAM,mBAAmB,CAAC;AAE3B,OAAO,EACL,eAAe,GAIhB,MAAM,cAAc,CAAC;AAEtB,OAAO,EACL,IAAI,GAEL,MAAM,WAAW,CAAC;AAEnB,OAAO,EACL,IAAI,EACJ,IAAI,EACJ,UAAU,GAEX,MAAM,WAAW,CAAC;AAEnB,OAAO,EACL,IAAI,GAEL,MAAM,uBAAuB,CAAC;AAE/B,cAAc,WAAW,CAAC;AAC1B,cAAc,YAAY,CAAC;AAC3B,cAAc,iBAAiB,CAAC"}
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/security/index.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,EACL,GAAG,EACH,IAAI,EACJ,MAAM,EACN,MAAM,EACN,OAAO,EACP,aAAa,EACb,iBAAiB,EACjB,iBAAiB,EACjB,cAAc,GAOf,MAAM,UAAU,CAAC;AAElB,OAAO,EACL,SAAS,EACT,oBAAoB,EACpB,mBAAmB,EACnB,oBAAoB,GAKrB,MAAM,mBAAmB,CAAC;AAE3B,OAAO,EACL,eAAe,GAIhB,MAAM,cAAc,CAAC;AAEtB,OAAO,EACL,IAAI,GAEL,MAAM,WAAW,CAAC;AAEnB,OAAO,EACL,IAAI,EACJ,IAAI,EACJ,UAAU,GAEX,MAAM,WAAW,CAAC;AAEnB,OAAO,EACL,IAAI,GAEL,MAAM,uBAAuB,CAAC;AAE/B,cAAc,WAAW,CAAC;AAC1B,cAAc,YAAY,CAAC;AAC3B,cAAc,iBAAiB,CAAC;AAChC,cAAc,iBAAiB,CAAC;AAChC,cAAc,kBAAkB,CAAC"}
|
|
@@ -0,0 +1,34 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @file cookie-session-driver.ts
|
|
3
|
+
* @description Encrypted client-side cookie session driver for AeroJS.
|
|
4
|
+
* Serializes and encrypts session state into an authenticated AES-256-GCM cookie.
|
|
5
|
+
* Zero-dependency, stateless, and ideal for serverless / edge deployments.
|
|
6
|
+
*/
|
|
7
|
+
import type { SessionDriver } from './session-driver.js';
|
|
8
|
+
export declare class CookieSessionDriver implements SessionDriver {
|
|
9
|
+
readonly isClientSide = true;
|
|
10
|
+
private encrypter;
|
|
11
|
+
private lastPayload;
|
|
12
|
+
constructor(key?: string);
|
|
13
|
+
/**
|
|
14
|
+
* Reads and decrypts session data from the encrypted cookie payload.
|
|
15
|
+
*/
|
|
16
|
+
read(sessionIdOrPayload: string): Promise<Record<string, unknown>>;
|
|
17
|
+
/**
|
|
18
|
+
* Encrypts the session state for writing to the client cookie.
|
|
19
|
+
*/
|
|
20
|
+
write(sessionId: string, data: Record<string, unknown>, _ttl: number): Promise<void>;
|
|
21
|
+
/**
|
|
22
|
+
* Returns the encrypted cookie ciphertext string for the given session state.
|
|
23
|
+
*/
|
|
24
|
+
getEncryptedCookieValue(data: Record<string, unknown>): string;
|
|
25
|
+
/**
|
|
26
|
+
* Destroys the session state.
|
|
27
|
+
*/
|
|
28
|
+
destroy(_sessionId: string): Promise<void>;
|
|
29
|
+
/**
|
|
30
|
+
* Garbage collection is a no-op for client-side cookies as browsers manage expiry.
|
|
31
|
+
*/
|
|
32
|
+
gc(): Promise<void>;
|
|
33
|
+
}
|
|
34
|
+
//# sourceMappingURL=cookie-session-driver.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"cookie-session-driver.d.ts","sourceRoot":"","sources":["../../src/session/cookie-session-driver.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,qBAAqB,CAAC;AAGzD,qBAAa,mBAAoB,YAAW,aAAa;IACvD,SAAgB,YAAY,QAAQ;IACpC,OAAO,CAAC,SAAS,CAAY;IAC7B,OAAO,CAAC,WAAW,CAAM;gBAEb,GAAG,CAAC,EAAE,MAAM;IAIxB;;OAEG;IACU,IAAI,CAAC,kBAAkB,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IAgB/E;;OAEG;IACU,KAAK,CAAC,SAAS,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EAAE,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAIjG;;OAEG;IACI,uBAAuB,CAAC,IAAI,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,MAAM;IAIrE;;OAEG;IACU,OAAO,CAAC,UAAU,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAIvD;;OAEG;IACU,EAAE,IAAI,OAAO,CAAC,IAAI,CAAC;CACjC"}
|
|
@@ -0,0 +1,57 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @file cookie-session-driver.ts
|
|
3
|
+
* @description Encrypted client-side cookie session driver for AeroJS.
|
|
4
|
+
* Serializes and encrypts session state into an authenticated AES-256-GCM cookie.
|
|
5
|
+
* Zero-dependency, stateless, and ideal for serverless / edge deployments.
|
|
6
|
+
*/
|
|
7
|
+
import { Encrypter } from '../security/encryption.js';
|
|
8
|
+
export class CookieSessionDriver {
|
|
9
|
+
isClientSide = true;
|
|
10
|
+
encrypter;
|
|
11
|
+
lastPayload = '';
|
|
12
|
+
constructor(key) {
|
|
13
|
+
this.encrypter = new Encrypter(key);
|
|
14
|
+
}
|
|
15
|
+
/**
|
|
16
|
+
* Reads and decrypts session data from the encrypted cookie payload.
|
|
17
|
+
*/
|
|
18
|
+
async read(sessionIdOrPayload) {
|
|
19
|
+
if (!sessionIdOrPayload || !Encrypter.isEncrypted(sessionIdOrPayload)) {
|
|
20
|
+
return {};
|
|
21
|
+
}
|
|
22
|
+
try {
|
|
23
|
+
const data = this.encrypter.decrypt(sessionIdOrPayload);
|
|
24
|
+
if (data && typeof data === 'object') {
|
|
25
|
+
return data;
|
|
26
|
+
}
|
|
27
|
+
return {};
|
|
28
|
+
}
|
|
29
|
+
catch {
|
|
30
|
+
// Tampered or invalid ciphertext -> reset session
|
|
31
|
+
return {};
|
|
32
|
+
}
|
|
33
|
+
}
|
|
34
|
+
/**
|
|
35
|
+
* Encrypts the session state for writing to the client cookie.
|
|
36
|
+
*/
|
|
37
|
+
async write(sessionId, data, _ttl) {
|
|
38
|
+
this.lastPayload = this.encrypter.encrypt(data);
|
|
39
|
+
}
|
|
40
|
+
/**
|
|
41
|
+
* Returns the encrypted cookie ciphertext string for the given session state.
|
|
42
|
+
*/
|
|
43
|
+
getEncryptedCookieValue(data) {
|
|
44
|
+
return this.encrypter.encrypt(data);
|
|
45
|
+
}
|
|
46
|
+
/**
|
|
47
|
+
* Destroys the session state.
|
|
48
|
+
*/
|
|
49
|
+
async destroy(_sessionId) {
|
|
50
|
+
this.lastPayload = '';
|
|
51
|
+
}
|
|
52
|
+
/**
|
|
53
|
+
* Garbage collection is a no-op for client-side cookies as browsers manage expiry.
|
|
54
|
+
*/
|
|
55
|
+
async gc() { }
|
|
56
|
+
}
|
|
57
|
+
//# sourceMappingURL=cookie-session-driver.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"cookie-session-driver.js","sourceRoot":"","sources":["../../src/session/cookie-session-driver.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAGH,OAAO,EAAE,SAAS,EAAE,MAAM,2BAA2B,CAAC;AAEtD,MAAM,OAAO,mBAAmB;IACd,YAAY,GAAG,IAAI,CAAC;IAC5B,SAAS,CAAY;IACrB,WAAW,GAAG,EAAE,CAAC;IAEzB,YAAY,GAAY;QACtB,IAAI,CAAC,SAAS,GAAG,IAAI,SAAS,CAAC,GAAG,CAAC,CAAC;IACtC,CAAC;IAED;;OAEG;IACI,KAAK,CAAC,IAAI,CAAC,kBAA0B;QAC1C,IAAI,CAAC,kBAAkB,IAAI,CAAC,SAAS,CAAC,WAAW,CAAC,kBAAkB,CAAC,EAAE,CAAC;YACtE,OAAO,EAAE,CAAC;QACZ,CAAC;QACD,IAAI,CAAC;YACH,MAAM,IAAI,GAAG,IAAI,CAAC,SAAS,CAAC,OAAO,CAA0B,kBAAkB,CAAC,CAAC;YACjF,IAAI,IAAI,IAAI,OAAO,IAAI,KAAK,QAAQ,EAAE,CAAC;gBACrC,OAAO,IAAI,CAAC;YACd,CAAC;YACD,OAAO,EAAE,CAAC;QACZ,CAAC;QAAC,MAAM,CAAC;YACP,kDAAkD;YAClD,OAAO,EAAE,CAAC;QACZ,CAAC;IACH,CAAC;IAED;;OAEG;IACI,KAAK,CAAC,KAAK,CAAC,SAAiB,EAAE,IAA6B,EAAE,IAAY;QAC/E,IAAI,CAAC,WAAW,GAAG,IAAI,CAAC,SAAS,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC;IAClD,CAAC;IAED;;OAEG;IACI,uBAAuB,CAAC,IAA6B;QAC1D,OAAO,IAAI,CAAC,SAAS,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC;IACtC,CAAC;IAED;;OAEG;IACI,KAAK,CAAC,OAAO,CAAC,UAAkB;QACrC,IAAI,CAAC,WAAW,GAAG,EAAE,CAAC;IACxB,CAAC;IAED;;OAEG;IACI,KAAK,CAAC,EAAE,KAAmB,CAAC;CACpC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/session/index.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,cAAc,qBAAqB,CAAC;AACpC,cAAc,4BAA4B,CAAC;AAC3C,cAAc,sBAAsB,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/session/index.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,cAAc,qBAAqB,CAAC;AACpC,cAAc,4BAA4B,CAAC;AAC3C,cAAc,sBAAsB,CAAC"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"session-manager.d.ts","sourceRoot":"","sources":["../../src/session/session-manager.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAGH,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,oBAAoB,CAAC;AACtD,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,qBAAqB,CAAC;AAEzD,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,kBAAkB,CAAC;AAEnD,MAAM,WAAW,aAAa;IAC5B;;OAEG;IACH,MAAM,CAAC,EAAE,aAAa,CAAC;IAEvB;;OAEG;IACH,UAAU,CAAC,EAAE,MAAM,CAAC;IAEpB;;OAEG;IACH,QAAQ,CAAC,EAAE,MAAM,CAAC;IAElB;;OAEG;IACH,MAAM,CAAC,EAAE;QACP,QAAQ,CAAC,EAAE,OAAO,CAAC;QACnB,MAAM,CAAC,EAAE,OAAO,CAAC;QACjB,QAAQ,CAAC,EAAE,QAAQ,GAAG,KAAK,GAAG,MAAM,GAAG,OAAO,CAAC;QAC/C,IAAI,CAAC,EAAE,MAAM,CAAC;QACd,MAAM,CAAC,EAAE,MAAM,CAAC;KACjB,CAAC;CACH;AAED;;;GAGG;AACH,qBAAa,cAAc;IACzB,OAAO,CAAC,SAAS,CAAS;IAC1B,OAAO,CAAC,IAAI,CAA+B;IAC3C,OAAO,CAAC,OAAO,CAAS;IACxB,OAAO,CAAC,MAAM,CAAS;IACvB,OAAO,CAAC,QAAQ,CAAC,MAAM,CAAgB;IACvC,OAAO,CAAC,QAAQ,CAAC,MAAM,CAA0B;IACjD,OAAO,CAAC,QAAQ,CAAC,GAAG,CAAc;gBAEtB,GAAG,EAAE,WAAW,EAAE,SAAS,EAAE,MAAM,EAAE,MAAM,EAAE,QAAQ,CAAC,aAAa,CAAC;IAOhF;;OAEG;YACW,YAAY;IAM1B,2BAA2B;IACd,GAAG,CAAC,CAAC,GAAG,OAAO,EAAE,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC,CAAC,GAAG,SAAS,CAAC;IAKlE,4BAA4B;IACf,GAAG,IAAI,OAAO,CAAC,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IAKpD,2BAA2B;IACd,GAAG,CAAC,GAAG,EAAE,MAAM,EAAE,KAAK,EAAE,OAAO,GAAG,OAAO,CAAC,IAAI,CAAC;IAM5D,qCAAqC;IACxB,GAAG,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC;IAK/C,4BAA4B;IACf,MAAM,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAM/C,8BAA8B;IACjB,KAAK,IAAI,OAAO,CAAC,IAAI,CAAC;IAMnC;;;OAGG;IACU,KAAK,CAAC,GAAG,EAAE,MAAM,EAAE,KAAK,CAAC,EAAE,OAAO,GAAG,OAAO,CAAC,OAAO,CAAC;IAclE;;OAEG;IACU,SAAS,CAAC,QAAQ,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAKvD;;;OAGG;IACU,UAAU,IAAI,OAAO,CAAC,IAAI,CAAC;IAaxC;;OAEG;IACU,OAAO,IAAI,OAAO,CAAC,IAAI,CAAC;IASrC;;OAEG;IACU,MAAM,IAAI,OAAO,CAAC,IAAI,CAAC;
|
|
1
|
+
{"version":3,"file":"session-manager.d.ts","sourceRoot":"","sources":["../../src/session/session-manager.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAGH,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,oBAAoB,CAAC;AACtD,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,qBAAqB,CAAC;AAEzD,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,kBAAkB,CAAC;AAEnD,MAAM,WAAW,aAAa;IAC5B;;OAEG;IACH,MAAM,CAAC,EAAE,aAAa,CAAC;IAEvB;;OAEG;IACH,UAAU,CAAC,EAAE,MAAM,CAAC;IAEpB;;OAEG;IACH,QAAQ,CAAC,EAAE,MAAM,CAAC;IAElB;;OAEG;IACH,MAAM,CAAC,EAAE;QACP,QAAQ,CAAC,EAAE,OAAO,CAAC;QACnB,MAAM,CAAC,EAAE,OAAO,CAAC;QACjB,QAAQ,CAAC,EAAE,QAAQ,GAAG,KAAK,GAAG,MAAM,GAAG,OAAO,CAAC;QAC/C,IAAI,CAAC,EAAE,MAAM,CAAC;QACd,MAAM,CAAC,EAAE,MAAM,CAAC;KACjB,CAAC;CACH;AAED;;;GAGG;AACH,qBAAa,cAAc;IACzB,OAAO,CAAC,SAAS,CAAS;IAC1B,OAAO,CAAC,IAAI,CAA+B;IAC3C,OAAO,CAAC,OAAO,CAAS;IACxB,OAAO,CAAC,MAAM,CAAS;IACvB,OAAO,CAAC,QAAQ,CAAC,MAAM,CAAgB;IACvC,OAAO,CAAC,QAAQ,CAAC,MAAM,CAA0B;IACjD,OAAO,CAAC,QAAQ,CAAC,GAAG,CAAc;gBAEtB,GAAG,EAAE,WAAW,EAAE,SAAS,EAAE,MAAM,EAAE,MAAM,EAAE,QAAQ,CAAC,aAAa,CAAC;IAOhF;;OAEG;YACW,YAAY;IAM1B,2BAA2B;IACd,GAAG,CAAC,CAAC,GAAG,OAAO,EAAE,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC,CAAC,GAAG,SAAS,CAAC;IAKlE,4BAA4B;IACf,GAAG,IAAI,OAAO,CAAC,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IAKpD,2BAA2B;IACd,GAAG,CAAC,GAAG,EAAE,MAAM,EAAE,KAAK,EAAE,OAAO,GAAG,OAAO,CAAC,IAAI,CAAC;IAM5D,qCAAqC;IACxB,GAAG,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC;IAK/C,4BAA4B;IACf,MAAM,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAM/C,8BAA8B;IACjB,KAAK,IAAI,OAAO,CAAC,IAAI,CAAC;IAMnC;;;OAGG;IACU,KAAK,CAAC,GAAG,EAAE,MAAM,EAAE,KAAK,CAAC,EAAE,OAAO,GAAG,OAAO,CAAC,OAAO,CAAC;IAclE;;OAEG;IACU,SAAS,CAAC,QAAQ,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAKvD;;;OAGG;IACU,UAAU,IAAI,OAAO,CAAC,IAAI,CAAC;IAaxC;;OAEG;IACU,OAAO,IAAI,OAAO,CAAC,IAAI,CAAC;IASrC;;OAEG;IACU,MAAM,IAAI,OAAO,CAAC,IAAI,CAAC;IAWpC,OAAO,CAAC,kBAAkB;IAUnB,KAAK,IAAI,MAAM;CAGvB;AAED;;;;;;;;;;GAUG;AACH,wBAAgB,aAAa,CAAC,MAAM,GAAE,aAAkB,GAAG,UAAU,CAmCpE"}
|
|
@@ -126,6 +126,9 @@ export class SessionManager {
|
|
|
126
126
|
return;
|
|
127
127
|
await this.ensureLoaded();
|
|
128
128
|
await this.driver.write(this.sessionId, this.data, this.config.lifetime);
|
|
129
|
+
if (this.driver.isClientSide && typeof this.driver.getEncryptedCookieValue === 'function') {
|
|
130
|
+
this.sessionId = this.driver.getEncryptedCookieValue(this.data);
|
|
131
|
+
}
|
|
129
132
|
this.writeSessionCookie();
|
|
130
133
|
this._dirty = false;
|
|
131
134
|
}
|
|
@@ -169,9 +172,11 @@ export function sessionPlugin(config = {}) {
|
|
|
169
172
|
return async (ctx, next) => {
|
|
170
173
|
// Extract existing session ID from cookie, or create a new one
|
|
171
174
|
const existingId = ctx.cookies[resolvedConfig.cookieName];
|
|
172
|
-
const
|
|
175
|
+
const isClientSide = !!resolvedConfig.driver.isClientSide;
|
|
176
|
+
const isValidId = existingId && (isClientSide ? existingId.startsWith('aero:enc:') : existingId.length === 64);
|
|
177
|
+
const sessionId = isValidId
|
|
173
178
|
? existingId
|
|
174
|
-
: crypto.randomBytes(32).toString('hex');
|
|
179
|
+
: (isClientSide ? '' : crypto.randomBytes(32).toString('hex'));
|
|
175
180
|
const session = new SessionManager(ctx, sessionId, resolvedConfig);
|
|
176
181
|
ctx.session = session;
|
|
177
182
|
try {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"session-manager.js","sourceRoot":"","sources":["../../src/session/session-manager.ts"],"names":[],"mappings":"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
|
|
1
|
+
{"version":3,"file":"session-manager.js","sourceRoot":"","sources":["../../src/session/session-manager.ts"],"names":[],"mappings":"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"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@shohaghinfo/aerojs",
|
|
3
|
-
"version": "0.
|
|
3
|
+
"version": "0.4.0",
|
|
4
4
|
"description": "A minimal, blazing-fast, zero-dependency full-stack web framework for Node.js — supporting React, Vue 3, Inertia.js, and SSR monoliths.",
|
|
5
5
|
"repository": {
|
|
6
6
|
"type": "git",
|