@shohaghinfo/aerojs 0.3.0 → 0.4.1
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 +149 -9
- package/dist/audit/audit-trail.d.ts +5 -6
- package/dist/audit/audit-trail.d.ts.map +1 -1
- package/dist/audit/audit-trail.js +5 -6
- package/dist/audit/audit-trail.js.map +1 -1
- package/dist/auth/auth-manager.d.ts +5 -5
- package/dist/auth/auth-manager.js +5 -5
- package/dist/auth/bouncer.d.ts +8 -15
- package/dist/auth/bouncer.d.ts.map +1 -1
- package/dist/auth/bouncer.js +10 -17
- package/dist/auth/bouncer.js.map +1 -1
- package/dist/auth/guards/api-token-guard.d.ts +2 -4
- package/dist/auth/guards/api-token-guard.d.ts.map +1 -1
- package/dist/auth/guards/api-token-guard.js +2 -4
- package/dist/auth/guards/api-token-guard.js.map +1 -1
- package/dist/auth/guards/jwt-guard.d.ts +3 -4
- package/dist/auth/guards/jwt-guard.d.ts.map +1 -1
- package/dist/auth/guards/jwt-guard.js +2 -3
- package/dist/auth/guards/jwt-guard.js.map +1 -1
- package/dist/auth/guards/session-guard.d.ts +2 -4
- package/dist/auth/guards/session-guard.d.ts.map +1 -1
- package/dist/auth/guards/session-guard.js +2 -4
- package/dist/auth/guards/session-guard.js.map +1 -1
- package/dist/auth/policy.js +1 -1
- package/dist/auth/policy.js.map +1 -1
- package/dist/cli/commands/make.js +1 -1
- package/dist/cli/runner.js +1 -1
- 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-hooks.d.ts +5 -5
- package/dist/database/model-hooks.js +11 -11
- package/dist/database/model.d.ts +58 -58
- package/dist/database/model.d.ts.map +1 -1
- package/dist/database/model.js +133 -71
- package/dist/database/model.js.map +1 -1
- package/dist/database/query-builder.d.ts +24 -7
- package/dist/database/query-builder.d.ts.map +1 -1
- package/dist/database/query-builder.js +88 -37
- package/dist/database/query-builder.js.map +1 -1
- package/dist/events/event-bus.d.ts +47 -75
- package/dist/events/event-bus.d.ts.map +1 -1
- package/dist/events/event-bus.js +14 -23
- package/dist/events/event-bus.js.map +1 -1
- package/dist/index.d.ts +3 -3
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +6 -6
- package/dist/index.js.map +1 -1
- package/dist/notifications/notification-manager.d.ts +1 -1
- package/dist/notifications/notification-manager.js +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/scheduler/scheduler.d.ts +5 -5
- package/dist/scheduler/scheduler.js +5 -5
- 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-driver.d.ts +2 -2
- package/dist/session/session-driver.js +2 -2
- package/dist/session/session-manager.d.ts +4 -4
- package/dist/session/session-manager.d.ts.map +1 -1
- package/dist/session/session-manager.js +10 -5
- package/dist/session/session-manager.js.map +1 -1
- package/dist/tcp/mllp.d.ts +1 -1
- package/dist/tcp/mllp.js +2 -2
- package/dist/tcp/mllp.js.map +1 -1
- package/package.json +1 -1
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"dashboard.js","sourceRoot":"","sources":["../../src/queue/dashboard.ts"],"names":[],"mappings":"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"}
|
package/dist/queue/index.d.ts
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/queue/index.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,cAAc,UAAU,CAAC;AACzB,cAAc,2BAA2B,CAAC;AAC1C,cAAc,kCAAkC,CAAC;AACjD,cAAc,oCAAoC,CAAC;AACnD,cAAc,aAAa,CAAC;AAC5B,cAAc,oBAAoB,CAAC;AAEnC,cAAc,iCAAiC,CAAC"}
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/queue/index.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,cAAc,UAAU,CAAC;AACzB,cAAc,2BAA2B,CAAC;AAC1C,cAAc,kCAAkC,CAAC;AACjD,cAAc,oCAAoC,CAAC;AACnD,cAAc,aAAa,CAAC;AAC5B,cAAc,oBAAoB,CAAC;AAEnC,cAAc,iCAAiC,CAAC;AAChD,cAAc,gBAAgB,CAAC"}
|
package/dist/queue/index.js
CHANGED
package/dist/queue/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/queue/index.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,cAAc,UAAU,CAAC;AACzB,cAAc,2BAA2B,CAAC;AAC1C,cAAc,kCAAkC,CAAC;AACjD,cAAc,oCAAoC,CAAC;AACnD,cAAc,aAAa,CAAC;AAC5B,cAAc,oBAAoB,CAAC;AAEnC,cAAc,iCAAiC,CAAC"}
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/queue/index.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,cAAc,UAAU,CAAC;AACzB,cAAc,2BAA2B,CAAC;AAC1C,cAAc,kCAAkC,CAAC;AACjD,cAAc,oCAAoC,CAAC;AACnD,cAAc,aAAa,CAAC;AAC5B,cAAc,oBAAoB,CAAC;AAEnC,cAAc,iCAAiC,CAAC;AAChD,cAAc,gBAAgB,CAAC"}
|
|
@@ -3,7 +3,7 @@
|
|
|
3
3
|
* @description Central Queue broker manager and facade for AeroJS.
|
|
4
4
|
*/
|
|
5
5
|
import type { QueueDriver, PushOptions } from './drivers/queue-driver.js';
|
|
6
|
-
import { QueueWorker, type WorkerOptions } from './worker.js';
|
|
6
|
+
import { QueueWorker, type WorkerOptions, type FailedJobRecord } from './worker.js';
|
|
7
7
|
import { Job } from './job.js';
|
|
8
8
|
import { RedisClient } from '../redis/redis-client.js';
|
|
9
9
|
export interface QueueConnectionConfig {
|
|
@@ -38,6 +38,36 @@ export declare class QueueManager {
|
|
|
38
38
|
* Spawns a QueueWorker instance for the given queue and connection.
|
|
39
39
|
*/
|
|
40
40
|
createWorker(options?: WorkerOptions, connectionName?: string): QueueWorker;
|
|
41
|
+
/**
|
|
42
|
+
* Retrieves live metrics across queues and worker executions.
|
|
43
|
+
*/
|
|
44
|
+
getMetrics(queue?: string): Promise<{
|
|
45
|
+
pending: number;
|
|
46
|
+
completed: number;
|
|
47
|
+
failed: number;
|
|
48
|
+
failedJobsCount: number;
|
|
49
|
+
connection: string;
|
|
50
|
+
}>;
|
|
51
|
+
/**
|
|
52
|
+
* Returns all recorded failed jobs.
|
|
53
|
+
*/
|
|
54
|
+
getFailedJobs(): FailedJobRecord[];
|
|
55
|
+
/**
|
|
56
|
+
* Retries a failed job by ID.
|
|
57
|
+
*/
|
|
58
|
+
retryFailedJob(id: string | number): Promise<boolean>;
|
|
59
|
+
/**
|
|
60
|
+
* Deletes a failed job record.
|
|
61
|
+
*/
|
|
62
|
+
deleteFailedJob(id: string | number): boolean;
|
|
63
|
+
/**
|
|
64
|
+
* Retries all failed jobs.
|
|
65
|
+
*/
|
|
66
|
+
retryAllFailedJobs(): Promise<number>;
|
|
67
|
+
/**
|
|
68
|
+
* Purges all failed jobs.
|
|
69
|
+
*/
|
|
70
|
+
purgeAllFailedJobs(): void;
|
|
41
71
|
reset(): void;
|
|
42
72
|
}
|
|
43
73
|
export declare const Queue: QueueManager;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"queue-manager.d.ts","sourceRoot":"","sources":["../../src/queue/queue-manager.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,KAAK,EAAE,WAAW,EAAE,WAAW,EAAE,MAAM,2BAA2B,CAAC;AAG1E,OAAO,EAAE,WAAW,EAAE,KAAK,aAAa,EAAE,MAAM,aAAa,CAAC;
|
|
1
|
+
{"version":3,"file":"queue-manager.d.ts","sourceRoot":"","sources":["../../src/queue/queue-manager.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,KAAK,EAAE,WAAW,EAAE,WAAW,EAAE,MAAM,2BAA2B,CAAC;AAG1E,OAAO,EAAE,WAAW,EAAE,KAAK,aAAa,EAAE,KAAK,eAAe,EAAE,MAAM,aAAa,CAAC;AACpF,OAAO,EAAE,GAAG,EAAE,MAAM,UAAU,CAAC;AAE/B,OAAO,EAAE,WAAW,EAAE,MAAM,0BAA0B,CAAC;AAEvD,MAAM,WAAW,qBAAqB;IACpC,MAAM,EAAE,QAAQ,GAAG,UAAU,GAAG,OAAO,GAAG,MAAM,CAAC;IACjD,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,KAAK,CAAC,EAAE,WAAW,CAAC;IACpB,YAAY,CAAC,EAAE,GAAG,CAAC;CACpB;AAED,MAAM,WAAW,WAAW;IAC1B,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,WAAW,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,qBAAqB,CAAC,CAAC;CACrD;AAED,qBAAa,YAAY;IACvB,OAAO,CAAC,iBAAiB,CAAY;IACrC,OAAO,CAAC,iBAAiB,CAA4C;IACrE,OAAO,CAAC,mBAAmB,CAAkC;IAC7D,OAAO,CAAC,WAAW,CAAkD;gBAEzD,MAAM,GAAE,WAAgB;IAI7B,SAAS,CAAC,MAAM,EAAE,WAAW,GAAG,IAAI;IAYpC,WAAW,CAAC,IAAI,EAAE,MAAM,EAAE,QAAQ,EAAE,KAAK,GAAG,IAAI,EAAE,GAAG,EAAE,KAAK,GAAG,GAAG,IAAI;IAKtE,MAAM,CAAC,IAAI,CAAC,EAAE,MAAM,GAAG,WAAW;IAgCzC;;OAEG;IACU,QAAQ,CAAC,GAAG,EAAE,GAAG,GAAG,GAAG,EAAE,OAAO,GAAE,WAAgB,GAAG,OAAO,CAAC,MAAM,GAAG,MAAM,CAAC;IAgB1F;;OAEG;IACU,YAAY,CAAC,GAAG,EAAE,GAAG,GAAG,OAAO,CAAC,GAAG,CAAC;IAIjD;;OAEG;IACI,YAAY,CAAC,OAAO,GAAE,aAAkB,EAAE,cAAc,CAAC,EAAE,MAAM,GAAG,WAAW;IAYtF;;OAEG;IACU,UAAU,CAAC,KAAK,SAAY,GAAG,OAAO,CAAC;QAClD,OAAO,EAAE,MAAM,CAAC;QAChB,SAAS,EAAE,MAAM,CAAC;QAClB,MAAM,EAAE,MAAM,CAAC;QACf,eAAe,EAAE,MAAM,CAAC;QACxB,UAAU,EAAE,MAAM,CAAC;KACpB,CAAC;IAYF;;OAEG;IACI,aAAa,IAAI,eAAe,EAAE;IAIzC;;OAEG;IACU,cAAc,CAAC,EAAE,EAAE,MAAM,GAAG,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC;IAUlE;;OAEG;IACI,eAAe,CAAC,EAAE,EAAE,MAAM,GAAG,MAAM,GAAG,OAAO;IAOpD;;OAEG;IACU,kBAAkB,IAAI,OAAO,CAAC,MAAM,CAAC;IASlD;;OAEG;IACI,kBAAkB,IAAI,IAAI;IAI1B,KAAK,IAAI,IAAI;CAMrB;AAED,eAAO,MAAM,KAAK,cAAqB,CAAC"}
|
|
@@ -95,10 +95,70 @@ export class QueueManager {
|
|
|
95
95
|
});
|
|
96
96
|
return worker;
|
|
97
97
|
}
|
|
98
|
+
/**
|
|
99
|
+
* Retrieves live metrics across queues and worker executions.
|
|
100
|
+
*/
|
|
101
|
+
async getMetrics(queue = 'default') {
|
|
102
|
+
const driver = this.driver();
|
|
103
|
+
const pending = await driver.size(queue);
|
|
104
|
+
return {
|
|
105
|
+
pending,
|
|
106
|
+
completed: QueueWorker.processedCount,
|
|
107
|
+
failed: QueueWorker.failedCount,
|
|
108
|
+
failedJobsCount: QueueWorker.globalFailedJobs.length,
|
|
109
|
+
connection: this.defaultConnection,
|
|
110
|
+
};
|
|
111
|
+
}
|
|
112
|
+
/**
|
|
113
|
+
* Returns all recorded failed jobs.
|
|
114
|
+
*/
|
|
115
|
+
getFailedJobs() {
|
|
116
|
+
return [...QueueWorker.globalFailedJobs];
|
|
117
|
+
}
|
|
118
|
+
/**
|
|
119
|
+
* Retries a failed job by ID.
|
|
120
|
+
*/
|
|
121
|
+
async retryFailedJob(id) {
|
|
122
|
+
const index = QueueWorker.globalFailedJobs.findIndex((j) => String(j.id) === String(id));
|
|
123
|
+
if (index === -1)
|
|
124
|
+
return false;
|
|
125
|
+
const failed = QueueWorker.globalFailedJobs[index];
|
|
126
|
+
await this.driver().push(failed.payload, { queue: failed.queue });
|
|
127
|
+
QueueWorker.globalFailedJobs.splice(index, 1);
|
|
128
|
+
return true;
|
|
129
|
+
}
|
|
130
|
+
/**
|
|
131
|
+
* Deletes a failed job record.
|
|
132
|
+
*/
|
|
133
|
+
deleteFailedJob(id) {
|
|
134
|
+
const index = QueueWorker.globalFailedJobs.findIndex((j) => String(j.id) === String(id));
|
|
135
|
+
if (index === -1)
|
|
136
|
+
return false;
|
|
137
|
+
QueueWorker.globalFailedJobs.splice(index, 1);
|
|
138
|
+
return true;
|
|
139
|
+
}
|
|
140
|
+
/**
|
|
141
|
+
* Retries all failed jobs.
|
|
142
|
+
*/
|
|
143
|
+
async retryAllFailedJobs() {
|
|
144
|
+
const jobs = [...QueueWorker.globalFailedJobs];
|
|
145
|
+
QueueWorker.globalFailedJobs.length = 0;
|
|
146
|
+
for (const job of jobs) {
|
|
147
|
+
await this.driver().push(job.payload, { queue: job.queue });
|
|
148
|
+
}
|
|
149
|
+
return jobs.length;
|
|
150
|
+
}
|
|
151
|
+
/**
|
|
152
|
+
* Purges all failed jobs.
|
|
153
|
+
*/
|
|
154
|
+
purgeAllFailedJobs() {
|
|
155
|
+
QueueWorker.globalFailedJobs.length = 0;
|
|
156
|
+
}
|
|
98
157
|
reset() {
|
|
99
158
|
this.instantiatedDrivers.clear();
|
|
100
159
|
this.connectionConfigs.clear();
|
|
101
160
|
this.defaultConnection = 'memory';
|
|
161
|
+
QueueWorker.resetMetrics();
|
|
102
162
|
}
|
|
103
163
|
}
|
|
104
164
|
export const Queue = new QueueManager();
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"queue-manager.js","sourceRoot":"","sources":["../../src/queue/queue-manager.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAGH,OAAO,EAAE,iBAAiB,EAAE,MAAM,kCAAkC,CAAC;AACrE,OAAO,EAAE,mBAAmB,EAAE,MAAM,oCAAoC,CAAC;AACzE,OAAO,EAAE,WAAW,
|
|
1
|
+
{"version":3,"file":"queue-manager.js","sourceRoot":"","sources":["../../src/queue/queue-manager.ts"],"names":[],"mappings":"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"}
|
package/dist/queue/worker.d.ts
CHANGED
|
@@ -23,6 +23,9 @@ export interface FailedJobRecord {
|
|
|
23
23
|
}
|
|
24
24
|
export declare class QueueWorker {
|
|
25
25
|
static readonly globalFailedJobs: FailedJobRecord[];
|
|
26
|
+
static processedCount: number;
|
|
27
|
+
static failedCount: number;
|
|
28
|
+
static resetMetrics(): void;
|
|
26
29
|
readonly failedJobs: FailedJobRecord[];
|
|
27
30
|
private driver;
|
|
28
31
|
private queue;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"worker.d.ts","sourceRoot":"","sources":["../../src/queue/worker.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,KAAK,EAAE,WAAW,EAAmB,MAAM,2BAA2B,CAAC;AAC9E,OAAO,EAAE,GAAG,EAAE,MAAM,UAAU,CAAC;AAG/B,MAAM,WAAW,aAAa;IAC5B,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,cAAc,CAAC,EAAE,MAAM,CAAC;IACxB,WAAW,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,KAAK,GAAG,IAAI,EAAE,GAAG,EAAE,KAAK,GAAG,CAAC,CAAC;CAC3D;AAED,MAAM,WAAW,eAAe;IAC9B,EAAE,EAAE,MAAM,GAAG,MAAM,CAAC;IACpB,KAAK,EAAE,MAAM,CAAC;IACd,OAAO,EAAE,MAAM,CAAC;IAChB,OAAO,EAAE,MAAM,CAAC;IAChB,QAAQ,EAAE,MAAM,CAAC;IACjB,QAAQ,EAAE,IAAI,CAAC;IACf,SAAS,EAAE,MAAM,CAAC;CACnB;AAED,qBAAa,WAAW;IACtB,gBAAuB,gBAAgB,EAAE,eAAe,EAAE,CAAM;IAChE,SAAgB,UAAU,EAAE,eAAe,EAAE,CAAM;IACnD,OAAO,CAAC,MAAM,CAAc;IAC5B,OAAO,CAAC,KAAK,CAAS;IACtB,OAAO,CAAC,OAAO,CAAS;IACxB,OAAO,CAAC,QAAQ,CAAS;IACzB,OAAO,CAAC,cAAc,CAAS;IAC/B,OAAO,CAAC,WAAW,CAA2C;IAC9D,OAAO,CAAC,SAAS,CAAS;IAC1B,OAAO,CAAC,KAAK,CAA+B;gBAEhC,MAAM,EAAE,WAAW,EAAE,OAAO,GAAE,aAAkB;IAe5D;;OAEG;IACI,WAAW,CAAC,IAAI,EAAE,MAAM,EAAE,QAAQ,EAAE,KAAK,GAAG,IAAI,EAAE,GAAG,EAAE,KAAK,GAAG,GAAG,IAAI;IAK7E;;;OAGG;IACU,OAAO,IAAI,OAAO,CAAC,OAAO,CAAC;IAQxC;;OAEG;IACI,KAAK,IAAI,IAAI;IAmBpB;;OAEG;IACI,IAAI,IAAI,IAAI;YAQL,UAAU;
|
|
1
|
+
{"version":3,"file":"worker.d.ts","sourceRoot":"","sources":["../../src/queue/worker.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,KAAK,EAAE,WAAW,EAAmB,MAAM,2BAA2B,CAAC;AAC9E,OAAO,EAAE,GAAG,EAAE,MAAM,UAAU,CAAC;AAG/B,MAAM,WAAW,aAAa;IAC5B,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,cAAc,CAAC,EAAE,MAAM,CAAC;IACxB,WAAW,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,KAAK,GAAG,IAAI,EAAE,GAAG,EAAE,KAAK,GAAG,CAAC,CAAC;CAC3D;AAED,MAAM,WAAW,eAAe;IAC9B,EAAE,EAAE,MAAM,GAAG,MAAM,CAAC;IACpB,KAAK,EAAE,MAAM,CAAC;IACd,OAAO,EAAE,MAAM,CAAC;IAChB,OAAO,EAAE,MAAM,CAAC;IAChB,QAAQ,EAAE,MAAM,CAAC;IACjB,QAAQ,EAAE,IAAI,CAAC;IACf,SAAS,EAAE,MAAM,CAAC;CACnB;AAED,qBAAa,WAAW;IACtB,gBAAuB,gBAAgB,EAAE,eAAe,EAAE,CAAM;IAChE,OAAc,cAAc,SAAK;IACjC,OAAc,WAAW,SAAK;WAEhB,YAAY,IAAI,IAAI;IAMlC,SAAgB,UAAU,EAAE,eAAe,EAAE,CAAM;IACnD,OAAO,CAAC,MAAM,CAAc;IAC5B,OAAO,CAAC,KAAK,CAAS;IACtB,OAAO,CAAC,OAAO,CAAS;IACxB,OAAO,CAAC,QAAQ,CAAS;IACzB,OAAO,CAAC,cAAc,CAAS;IAC/B,OAAO,CAAC,WAAW,CAA2C;IAC9D,OAAO,CAAC,SAAS,CAAS;IAC1B,OAAO,CAAC,KAAK,CAA+B;gBAEhC,MAAM,EAAE,WAAW,EAAE,OAAO,GAAE,aAAkB;IAe5D;;OAEG;IACI,WAAW,CAAC,IAAI,EAAE,MAAM,EAAE,QAAQ,EAAE,KAAK,GAAG,IAAI,EAAE,GAAG,EAAE,KAAK,GAAG,GAAG,IAAI;IAK7E;;;OAGG;IACU,OAAO,IAAI,OAAO,CAAC,OAAO,CAAC;IAQxC;;OAEG;IACI,KAAK,IAAI,IAAI;IAmBpB;;OAEG;IACI,IAAI,IAAI,IAAI;YAQL,UAAU;IAqEjB,aAAa,IAAI,eAAe,EAAE;IAIlC,eAAe,IAAI,IAAI;CAG/B"}
|
package/dist/queue/worker.js
CHANGED
|
@@ -7,6 +7,13 @@ import { Job } from './job.js';
|
|
|
7
7
|
import { Logger } from '../logging/logger.js';
|
|
8
8
|
export class QueueWorker {
|
|
9
9
|
static globalFailedJobs = [];
|
|
10
|
+
static processedCount = 0;
|
|
11
|
+
static failedCount = 0;
|
|
12
|
+
static resetMetrics() {
|
|
13
|
+
this.processedCount = 0;
|
|
14
|
+
this.failedCount = 0;
|
|
15
|
+
this.globalFailedJobs.length = 0;
|
|
16
|
+
}
|
|
10
17
|
failedJobs = [];
|
|
11
18
|
driver;
|
|
12
19
|
queue;
|
|
@@ -108,6 +115,7 @@ export class QueueWorker {
|
|
|
108
115
|
}
|
|
109
116
|
try {
|
|
110
117
|
await jobInstance.handle();
|
|
118
|
+
QueueWorker.processedCount++;
|
|
111
119
|
// Job succeeded -> remove from queue
|
|
112
120
|
await this.driver.delete(record.id, this.queue);
|
|
113
121
|
}
|
|
@@ -123,6 +131,7 @@ export class QueueWorker {
|
|
|
123
131
|
}
|
|
124
132
|
else {
|
|
125
133
|
// Max retries reached -> record into Dead Letter Queue, call failed hook, and delete from active queue
|
|
134
|
+
QueueWorker.failedCount++;
|
|
126
135
|
const failedRecord = {
|
|
127
136
|
id: record.id,
|
|
128
137
|
queue: this.queue,
|
package/dist/queue/worker.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"worker.js","sourceRoot":"","sources":["../../src/queue/worker.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAGH,OAAO,EAAE,GAAG,EAAE,MAAM,UAAU,CAAC;AAC/B,OAAO,EAAE,MAAM,EAAE,MAAM,sBAAsB,CAAC;AAoB9C,MAAM,OAAO,WAAW;IACf,MAAM,CAAU,gBAAgB,GAAsB,EAAE,CAAC;
|
|
1
|
+
{"version":3,"file":"worker.js","sourceRoot":"","sources":["../../src/queue/worker.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,8 +1,8 @@
|
|
|
1
1
|
/**
|
|
2
2
|
* @file scheduler.ts
|
|
3
3
|
* @description Cron-based Task Scheduler for AeroJS.
|
|
4
|
-
*
|
|
5
|
-
*
|
|
4
|
+
* Use-cases: Scheduled maintenance, database backups, automated report generation,
|
|
5
|
+
* cache warming, email digest dispatches, and periodic cleanup.
|
|
6
6
|
*
|
|
7
7
|
* Zero external dependency — uses Node.js setInterval with cron expression parsing.
|
|
8
8
|
*/
|
|
@@ -53,11 +53,11 @@ export declare class Scheduler {
|
|
|
53
53
|
* Define a new scheduled task using builder pattern.
|
|
54
54
|
*
|
|
55
55
|
* @example
|
|
56
|
-
* Scheduler.define('
|
|
56
|
+
* Scheduler.define('DailyReport')
|
|
57
57
|
* .cron('0 23 * * *')
|
|
58
|
-
* .description('Daily
|
|
58
|
+
* .description('Daily report generation and metrics summary')
|
|
59
59
|
* .run(async () => {
|
|
60
|
-
* await
|
|
60
|
+
* await ReportService.generateDailySummary();
|
|
61
61
|
* });
|
|
62
62
|
*/
|
|
63
63
|
define(name: string): TaskBuilder;
|
|
@@ -1,8 +1,8 @@
|
|
|
1
1
|
/**
|
|
2
2
|
* @file scheduler.ts
|
|
3
3
|
* @description Cron-based Task Scheduler for AeroJS.
|
|
4
|
-
*
|
|
5
|
-
*
|
|
4
|
+
* Use-cases: Scheduled maintenance, database backups, automated report generation,
|
|
5
|
+
* cache warming, email digest dispatches, and periodic cleanup.
|
|
6
6
|
*
|
|
7
7
|
* Zero external dependency — uses Node.js setInterval with cron expression parsing.
|
|
8
8
|
*/
|
|
@@ -101,11 +101,11 @@ export class Scheduler {
|
|
|
101
101
|
* Define a new scheduled task using builder pattern.
|
|
102
102
|
*
|
|
103
103
|
* @example
|
|
104
|
-
* Scheduler.define('
|
|
104
|
+
* Scheduler.define('DailyReport')
|
|
105
105
|
* .cron('0 23 * * *')
|
|
106
|
-
* .description('Daily
|
|
106
|
+
* .description('Daily report generation and metrics summary')
|
|
107
107
|
* .run(async () => {
|
|
108
|
-
* await
|
|
108
|
+
* await ReportService.generateDailySummary();
|
|
109
109
|
* });
|
|
110
110
|
*/
|
|
111
111
|
define(name) {
|
|
@@ -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":"AAAA;;;;GAIG;AAEH,OAAO,KAAK,MAAM,MAAM,aAAa,CAAC;AAOtC,MAAM,OAAO,SAAS;IACZ,SAAS,CAAS;IACV,MAAM,GAAW,aAAa,CAAC;IACvC,MAAM,CAAC,eAAe,CAAa;IAE3C,YAAY,GAAY;QACtB,MAAM,MAAM,GAAG,GAAG,IAAI,OAAO,CAAC,GAAG,CAAC,SAAS,CAAC,IAAI,OAAO,CAAC,GAAG,CAAC,UAAU,CAAC,IAAI,+CAA+C,CAAC;QAC3H,IAAI,CAAC,SAAS,GAAG,SAAS,CAAC,YAAY,CAAC,MAAM,CAAC,CAAC;IAClD,CAAC;IAED;;OAEG;IACI,MAAM,CAAC,WAAW;QACvB,OAAO,MAAM,CAAC,WAAW,CAAC,EAAE,CAAC,CAAC,QAAQ,CAAC,KAAK,CAAC,CAAC;IAChD,CAAC;IAED;;OAEG;IACI,MAAM,CAAC,YAAY,CAAC,GAAW;QACpC,IAAI,GAAG,CAAC,UAAU,CAAC,SAAS,CAAC,EAAE,CAAC;YAC9B,MAAM,GAAG,GAAG,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC,CAAC,EAAE,QAAQ,CAAC,CAAC;YAChD,IAAI,GAAG,CAAC,MAAM,KAAK,EAAE;gBAAE,OAAO,GAAG,CAAC;QACpC,CAAC;QACD,+BAA+B;QAC/B,IAAI,mBAAmB,CAAC,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC;YAClC,OAAO,MAAM,CAAC,IAAI,CAAC,GAAG,EAAE,KAAK,CAAC,CAAC;QACjC,CAAC;QACD,MAAM,GAAG,GAAG,MAAM,CAAC,IAAI,CAAC,GAAG,EAAE,MAAM,CAAC,CAAC;QACrC,IAAI,GAAG,CAAC,MAAM,KAAK,EAAE;YAAE,OAAO,GAAG,CAAC;QAClC,0CAA0C;QAC1C,OAAO,MAAM,CAAC,UAAU,CAAC,QAAQ,CAAC,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,MAAM,EAAE,CAAC;IAC1D,CAAC;IAED;;;OAGG;IACI,OAAO,CAAC,KAAc;QAC3B,MAAM,UAAU,GAAG,IAAI,CAAC,SAAS,CAAC,KAAK,CAAC,CAAC;QACzC,MAAM,EAAE,GAAG,MAAM,CAAC,WAAW,CAAC,EAAE,CAAC,CAAC,CAAC,qBAAqB;QACxD,MAAM,MAAM,GAAG,MAAM,CAAC,cAAc,CAAC,IAAI,CAAC,MAAM,EAAE,IAAI,CAAC,SAAS,EAAE,EAAE,CAAQ,CAAC;QAE7E,IAAI,SAAS,GAAG,MAAM,CAAC,MAAM,CAAC,UAAU,EAAE,MAAM,EAAE,KAAK,CAAC,CAAC;QACzD,SAAS,IAAI,MAAM,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC;QACjC,MAAM,OAAO,GAAG,MAAM,CAAC,UAAU,EAAE,CAAC,QAAQ,CAAC,KAAK,CAAC,CAAC;QAEpD,OAAO,YAAY,EAAE,CAAC,QAAQ,CAAC,KAAK,CAAC,IAAI,OAAO,IAAI,SAAS,EAAE,CAAC;IAClE,CAAC;IAED;;OAEG;IACI,OAAO,CAAU,OAAe;QACrC,IAAI,CAAC,SAAS,CAAC,WAAW,CAAC,OAAO,CAAC,EAAE,CAAC;YACpC,MAAM,IAAI,KAAK,CAAC,qDAAqD,CAAC,CAAC;QACzE,CAAC;QAED,MAAM,KAAK,GAAG,OAAO,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC;QAC1C,IAAI,KAAK,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;YACvB,MAAM,IAAI,KAAK,CAAC,mEAAmE,CAAC,CAAC;QACvF,CAAC;QAED,MAAM,CAAC,KAAK,EAAE,UAAU,EAAE,YAAY,CAAC,GAAG,KAAK,CAAC;QAChD,MAAM,EAAE,GAAG,MAAM,CAAC,IAAI,CAAC,KAAM,EAAE,KAAK,CAAC,CAAC;QACtC,MAAM,OAAO,GAAG,MAAM,CAAC,IAAI,CAAC,UAAW,EAAE,KAAK,CAAC,CAAC;QAEhD,MAAM,QAAQ,GAAI,MAAM,CAAC,gBAAwB,CAAC,IAAI,CAAC,MAAM,EAAE,IAAI,CAAC,SAAS,EAAE,EAAE,EAAE,EAAE,aAAa,EAAE,EAAE,EAAE,CAAC,CAAC;QAC1G,QAAQ,CAAC,UAAU,CAAC,OAAO,CAAC,CAAC;QAE7B,IAAI,SAAS,GAAG,QAAQ,CAAC,MAAM,CAAC,YAAa,EAAE,KAAK,EAAE,MAAM,CAAC,CAAC;QAC9D,SAAS,IAAI,QAAQ,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC;QAEpC,OAAO,IAAI,CAAC,KAAK,CAAC,SAAS,CAAM,CAAC;IACpC,CAAC;IAED;;OAEG;IACI,aAAa,CAAC,IAAY;QAC/B,OAAO,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC;IAC5B,CAAC;IAED;;OAEG;IACI,aAAa,CAAC,OAAe;QAClC,OAAO,IAAI,CAAC,OAAO,CAAS,OAAO,CAAC,CAAC;IACvC,CAAC;IAED;;OAEG;IACI,MAAM,CAAC,WAAW,CAAC,KAAc;QACtC,OAAO,OAAO,KAAK,KAAK,QAAQ,IAAI,KAAK,CAAC,UAAU,CAAC,WAAW,CAAC,CAAC;IACpE,CAAC;IAED;;OAEG;IACI,MAAM,CAAC,WAAW;QACvB,IAAI,CAAC,IAAI,CAAC,eAAe,EAAE,CAAC;YAC1B,IAAI,CAAC,eAAe,GAAG,IAAI,SAAS,EAAE,CAAC;QACzC,CAAC;QACD,OAAO,IAAI,CAAC,eAAe,CAAC;IAC9B,CAAC;CACF;AAED;;GAEG;AACH,MAAM,CAAC,MAAM,KAAK,GAAG;IACnB,OAAO,EAAE,CAAC,KAAc,EAAE,GAAY,EAAU,EAAE;QAChD,OAAO,GAAG,CAAC,CAAC,CAAC,IAAI,SAAS,CAAC,GAAG,CAAC,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC,WAAW,EAAE,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC;IAC1F,CAAC;IACD,OAAO,EAAE,CAAU,OAAe,EAAE,GAAY,EAAK,EAAE;QACrD,OAAO,GAAG,CAAC,CAAC,CAAC,IAAI,SAAS,CAAC,GAAG,CAAC,CAAC,OAAO,CAAI,OAAO,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC,WAAW,EAAE,CAAC,OAAO,CAAI,OAAO,CAAC,CAAC;IACpG,CAAC;IACD,aAAa,EAAE,CAAC,IAAY,EAAE,GAAY,EAAU,EAAE;QACpD,OAAO,GAAG,CAAC,CAAC,CAAC,IAAI,SAAS,CAAC,GAAG,CAAC,CAAC,aAAa,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC,WAAW,EAAE,CAAC,aAAa,CAAC,IAAI,CAAC,CAAC;IACpG,CAAC;IACD,aAAa,EAAE,CAAC,OAAe,EAAE,GAAY,EAAU,EAAE;QACvD,OAAO,GAAG,CAAC,CAAC,CAAC,IAAI,SAAS,CAAC,GAAG,CAAC,CAAC,aAAa,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC,WAAW,EAAE,CAAC,aAAa,CAAC,OAAO,CAAC,CAAC;IAC1G,CAAC;IACD,WAAW,EAAE,GAAW,EAAE,CAAC,SAAS,CAAC,WAAW,EAAE;IAClD,WAAW,EAAE,CAAC,KAAc,EAAW,EAAE,CAAC,SAAS,CAAC,WAAW,CAAC,KAAK,CAAC;CACvE,CAAC"}
|
|
@@ -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
|