@shohaghinfo/aerojs 0.1.2 → 0.3.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/README.md +291 -7
- package/dist/auth/index.d.ts +1 -0
- package/dist/auth/index.d.ts.map +1 -1
- package/dist/auth/index.js +1 -0
- package/dist/auth/index.js.map +1 -1
- package/dist/auth/oauth/github-driver.d.ts +16 -0
- package/dist/auth/oauth/github-driver.d.ts.map +1 -0
- package/dist/auth/oauth/github-driver.js +79 -0
- package/dist/auth/oauth/github-driver.js.map +1 -0
- package/dist/auth/oauth/google-driver.d.ts +16 -0
- package/dist/auth/oauth/google-driver.d.ts.map +1 -0
- package/dist/auth/oauth/google-driver.js +63 -0
- package/dist/auth/oauth/google-driver.js.map +1 -0
- package/dist/auth/oauth/index.d.ts +9 -0
- package/dist/auth/oauth/index.d.ts.map +1 -0
- package/dist/auth/oauth/index.js +9 -0
- package/dist/auth/oauth/index.js.map +1 -0
- package/dist/auth/oauth/oauth-driver.d.ts +35 -0
- package/dist/auth/oauth/oauth-driver.d.ts.map +1 -0
- package/dist/auth/oauth/oauth-driver.js +6 -0
- package/dist/auth/oauth/oauth-driver.js.map +1 -0
- package/dist/auth/oauth/oauth-manager.d.ts +26 -0
- package/dist/auth/oauth/oauth-manager.d.ts.map +1 -0
- package/dist/auth/oauth/oauth-manager.js +86 -0
- package/dist/auth/oauth/oauth-manager.js.map +1 -0
- package/dist/cli/commands/make.d.ts +5 -0
- package/dist/cli/commands/make.d.ts.map +1 -1
- package/dist/cli/commands/make.js +119 -0
- package/dist/cli/commands/make.js.map +1 -1
- package/dist/cli/runner.d.ts.map +1 -1
- package/dist/cli/runner.js +72 -3
- package/dist/cli/runner.js.map +1 -1
- package/dist/core/application.d.ts +5 -0
- package/dist/core/application.d.ts.map +1 -1
- package/dist/core/application.js +12 -0
- package/dist/core/application.js.map +1 -1
- package/dist/core/context.d.ts +4 -0
- package/dist/core/context.d.ts.map +1 -1
- package/dist/core/context.js +8 -0
- package/dist/core/context.js.map +1 -1
- package/dist/http/http.d.ts +44 -0
- package/dist/http/http.d.ts.map +1 -0
- package/dist/http/http.js +132 -0
- package/dist/http/http.js.map +1 -0
- package/dist/http/index.d.ts +8 -0
- package/dist/http/index.d.ts.map +1 -0
- package/dist/http/index.js +8 -0
- package/dist/http/index.js.map +1 -0
- package/dist/http/request-builder.d.ts +48 -0
- package/dist/http/request-builder.d.ts.map +1 -0
- package/dist/http/request-builder.js +186 -0
- package/dist/http/request-builder.js.map +1 -0
- package/dist/http/response.d.ts +34 -0
- package/dist/http/response.d.ts.map +1 -0
- package/dist/http/response.js +77 -0
- package/dist/http/response.js.map +1 -0
- package/dist/index.d.ts +4 -2
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +4 -2
- package/dist/index.js.map +1 -1
- package/dist/mail/drivers/smtp-mail-driver.d.ts +39 -0
- package/dist/mail/drivers/smtp-mail-driver.d.ts.map +1 -0
- package/dist/mail/drivers/smtp-mail-driver.js +318 -0
- package/dist/mail/drivers/smtp-mail-driver.js.map +1 -0
- package/dist/mail/index.d.ts +1 -0
- package/dist/mail/index.d.ts.map +1 -1
- package/dist/mail/index.js +1 -0
- package/dist/mail/index.js.map +1 -1
- package/dist/mail/mailer.d.ts +20 -3
- package/dist/mail/mailer.d.ts.map +1 -1
- package/dist/mail/mailer.js +28 -1
- package/dist/mail/mailer.js.map +1 -1
- package/dist/notifications/index.d.ts +7 -0
- package/dist/notifications/index.d.ts.map +1 -0
- package/dist/notifications/index.js +7 -0
- package/dist/notifications/index.js.map +1 -0
- package/dist/notifications/notification-manager.d.ts +39 -0
- package/dist/notifications/notification-manager.d.ts.map +1 -0
- package/dist/notifications/notification-manager.js +130 -0
- package/dist/notifications/notification-manager.js.map +1 -0
- package/dist/notifications/notification.d.ts +48 -0
- package/dist/notifications/notification.d.ts.map +1 -0
- package/dist/notifications/notification.js +9 -0
- package/dist/notifications/notification.js.map +1 -0
- package/dist/queue/drivers/redis-queue-driver.d.ts +20 -0
- package/dist/queue/drivers/redis-queue-driver.d.ts.map +1 -1
- package/dist/queue/drivers/redis-queue-driver.js +92 -33
- package/dist/queue/drivers/redis-queue-driver.js.map +1 -1
- package/dist/queue/queue-manager.d.ts +4 -1
- package/dist/queue/queue-manager.d.ts.map +1 -1
- package/dist/queue/queue-manager.js +8 -1
- package/dist/queue/queue-manager.js.map +1 -1
- package/dist/security/index.d.ts +2 -1
- package/dist/security/index.d.ts.map +1 -1
- package/dist/security/index.js +2 -1
- package/dist/security/index.js.map +1 -1
- package/dist/security/rate-limiter.d.ts +20 -0
- package/dist/security/rate-limiter.d.ts.map +1 -1
- package/dist/security/rate-limiter.js +85 -0
- package/dist/security/rate-limiter.js.map +1 -1
- package/dist/security/signed-url.d.ts +29 -0
- package/dist/security/signed-url.d.ts.map +1 -0
- package/dist/security/signed-url.js +86 -0
- package/dist/security/signed-url.js.map +1 -0
- package/dist/storage/drivers/local-driver.d.ts +1 -0
- package/dist/storage/drivers/local-driver.d.ts.map +1 -1
- package/dist/storage/drivers/local-driver.js +5 -0
- package/dist/storage/drivers/local-driver.js.map +1 -1
- package/dist/storage/drivers/memory-driver.d.ts +1 -0
- package/dist/storage/drivers/memory-driver.d.ts.map +1 -1
- package/dist/storage/drivers/memory-driver.js +5 -0
- package/dist/storage/drivers/memory-driver.js.map +1 -1
- package/package.json +14 -2
|
@@ -0,0 +1,39 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @file notification-manager.ts
|
|
3
|
+
* @description Central Notification Dispatcher and Facade for AeroJS.
|
|
4
|
+
* Dispatches notifications across multiple channels (mail, database, broadcast, sms, custom).
|
|
5
|
+
*/
|
|
6
|
+
import type { Notification } from './notification.js';
|
|
7
|
+
export type ChannelHandler = (notifiable: any, notification: Notification) => Promise<any> | any;
|
|
8
|
+
export interface SentNotificationRecord {
|
|
9
|
+
notifiable: any;
|
|
10
|
+
notification: Notification;
|
|
11
|
+
channels: string[];
|
|
12
|
+
}
|
|
13
|
+
export declare class NotificationManager {
|
|
14
|
+
private channels;
|
|
15
|
+
private isFaked;
|
|
16
|
+
private sentRecords;
|
|
17
|
+
constructor();
|
|
18
|
+
private registerDefaultChannels;
|
|
19
|
+
extend(channelName: string, handler: ChannelHandler): this;
|
|
20
|
+
/**
|
|
21
|
+
* Dispatches a notification to one or multiple notifiable recipients.
|
|
22
|
+
*/
|
|
23
|
+
send(notifiables: any | any[], notification: Notification): Promise<void>;
|
|
24
|
+
/**
|
|
25
|
+
* Enables mock recording for testing assertions.
|
|
26
|
+
*/
|
|
27
|
+
fake(): void;
|
|
28
|
+
restore(): void;
|
|
29
|
+
getSent(): SentNotificationRecord[];
|
|
30
|
+
assertSentTo(notifiable: any, notificationClass: any, callback?: (notification: any) => boolean): void;
|
|
31
|
+
assertNotSentTo(notifiable: any, notificationClass: any): void;
|
|
32
|
+
}
|
|
33
|
+
export declare const Notifications: NotificationManager;
|
|
34
|
+
/**
|
|
35
|
+
* Mixin / Helper function to send notification from a user/patient model.
|
|
36
|
+
* Example: notify(user, new InvoiceNotification(inv));
|
|
37
|
+
*/
|
|
38
|
+
export declare function notify(notifiable: any, notification: Notification): Promise<void>;
|
|
39
|
+
//# sourceMappingURL=notification-manager.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"notification-manager.d.ts","sourceRoot":"","sources":["../../src/notifications/notification-manager.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAGH,OAAO,KAAK,EAAE,YAAY,EAA8B,MAAM,mBAAmB,CAAC;AAIlF,MAAM,MAAM,cAAc,GAAG,CAAC,UAAU,EAAE,GAAG,EAAE,YAAY,EAAE,YAAY,KAAK,OAAO,CAAC,GAAG,CAAC,GAAG,GAAG,CAAC;AAEjG,MAAM,WAAW,sBAAsB;IACrC,UAAU,EAAE,GAAG,CAAC;IAChB,YAAY,EAAE,YAAY,CAAC;IAC3B,QAAQ,EAAE,MAAM,EAAE,CAAC;CACpB;AAED,qBAAa,mBAAmB;IAC9B,OAAO,CAAC,QAAQ,CAAqC;IACrD,OAAO,CAAC,OAAO,CAAS;IACxB,OAAO,CAAC,WAAW,CAAgC;;IAMnD,OAAO,CAAC,uBAAuB;IAiDxB,MAAM,CAAC,WAAW,EAAE,MAAM,EAAE,OAAO,EAAE,cAAc,GAAG,IAAI;IAKjE;;OAEG;IACU,IAAI,CACf,WAAW,EAAE,GAAG,GAAG,GAAG,EAAE,EACxB,YAAY,EAAE,YAAY,GACzB,OAAO,CAAC,IAAI,CAAC;IAoBhB;;OAEG;IACI,IAAI,IAAI,IAAI;IAKZ,OAAO,IAAI,IAAI;IAKf,OAAO,IAAI,sBAAsB,EAAE;IAInC,YAAY,CACjB,UAAU,EAAE,GAAG,EACf,iBAAiB,EAAE,GAAG,EACtB,QAAQ,CAAC,EAAE,CAAC,YAAY,EAAE,GAAG,KAAK,OAAO,GACxC,IAAI;IAaA,eAAe,CAAC,UAAU,EAAE,GAAG,EAAE,iBAAiB,EAAE,GAAG,GAAG,IAAI;CAWtE;AAED,eAAO,MAAM,aAAa,qBAA4B,CAAC;AAEvD;;;GAGG;AACH,wBAAsB,MAAM,CAAC,UAAU,EAAE,GAAG,EAAE,YAAY,EAAE,YAAY,GAAG,OAAO,CAAC,IAAI,CAAC,CAEvF"}
|
|
@@ -0,0 +1,130 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @file notification-manager.ts
|
|
3
|
+
* @description Central Notification Dispatcher and Facade for AeroJS.
|
|
4
|
+
* Dispatches notifications across multiple channels (mail, database, broadcast, sms, custom).
|
|
5
|
+
*/
|
|
6
|
+
import * as crypto from 'node:crypto';
|
|
7
|
+
import { Mail } from '../mail/mailer.js';
|
|
8
|
+
import { DB } from '../database/connection.js';
|
|
9
|
+
export class NotificationManager {
|
|
10
|
+
channels = new Map();
|
|
11
|
+
isFaked = false;
|
|
12
|
+
sentRecords = [];
|
|
13
|
+
constructor() {
|
|
14
|
+
this.registerDefaultChannels();
|
|
15
|
+
}
|
|
16
|
+
registerDefaultChannels() {
|
|
17
|
+
// 1. Mail Channel
|
|
18
|
+
this.channels.set('mail', async (notifiable, notification) => {
|
|
19
|
+
if (typeof notification.toMail !== 'function')
|
|
20
|
+
return;
|
|
21
|
+
const mailMessage = await notification.toMail(notifiable);
|
|
22
|
+
// If no explicit recipient on message, infer from notifiable
|
|
23
|
+
if (mailMessage.toAddresses.length === 0) {
|
|
24
|
+
const email = notifiable.email || notifiable.emailAddress;
|
|
25
|
+
if (email) {
|
|
26
|
+
mailMessage.to(email);
|
|
27
|
+
}
|
|
28
|
+
}
|
|
29
|
+
return await Mail.send(mailMessage);
|
|
30
|
+
});
|
|
31
|
+
// 2. Database Channel
|
|
32
|
+
this.channels.set('database', async (notifiable, notification) => {
|
|
33
|
+
if (typeof notification.toDatabase !== 'function')
|
|
34
|
+
return;
|
|
35
|
+
const data = await notification.toDatabase(notifiable);
|
|
36
|
+
const id = notification.id || crypto.randomUUID();
|
|
37
|
+
const record = {
|
|
38
|
+
id,
|
|
39
|
+
type: notification.constructor.name,
|
|
40
|
+
notifiableType: notifiable.constructor?.name || 'User',
|
|
41
|
+
notifiableId: notifiable.id,
|
|
42
|
+
data,
|
|
43
|
+
readAt: null,
|
|
44
|
+
createdAt: new Date(),
|
|
45
|
+
};
|
|
46
|
+
try {
|
|
47
|
+
await DB.table('notifications').insert(record);
|
|
48
|
+
}
|
|
49
|
+
catch {
|
|
50
|
+
// Fallback if table doesn't exist yet in tests
|
|
51
|
+
}
|
|
52
|
+
return record;
|
|
53
|
+
});
|
|
54
|
+
// 3. Broadcast Channel
|
|
55
|
+
this.channels.set('broadcast', async (notifiable, notification) => {
|
|
56
|
+
if (typeof notification.toBroadcast !== 'function')
|
|
57
|
+
return;
|
|
58
|
+
const broadcastData = await notification.toBroadcast(notifiable);
|
|
59
|
+
return broadcastData;
|
|
60
|
+
});
|
|
61
|
+
}
|
|
62
|
+
extend(channelName, handler) {
|
|
63
|
+
this.channels.set(channelName.toLowerCase(), handler);
|
|
64
|
+
return this;
|
|
65
|
+
}
|
|
66
|
+
/**
|
|
67
|
+
* Dispatches a notification to one or multiple notifiable recipients.
|
|
68
|
+
*/
|
|
69
|
+
async send(notifiables, notification) {
|
|
70
|
+
const list = Array.isArray(notifiables) ? notifiables : [notifiables];
|
|
71
|
+
for (const notifiable of list) {
|
|
72
|
+
const channels = await notification.via(notifiable);
|
|
73
|
+
if (this.isFaked) {
|
|
74
|
+
this.sentRecords.push({ notifiable, notification, channels });
|
|
75
|
+
continue;
|
|
76
|
+
}
|
|
77
|
+
for (const channel of channels) {
|
|
78
|
+
const handler = this.channels.get(channel.toLowerCase());
|
|
79
|
+
if (handler) {
|
|
80
|
+
await handler(notifiable, notification);
|
|
81
|
+
}
|
|
82
|
+
}
|
|
83
|
+
}
|
|
84
|
+
}
|
|
85
|
+
/**
|
|
86
|
+
* Enables mock recording for testing assertions.
|
|
87
|
+
*/
|
|
88
|
+
fake() {
|
|
89
|
+
this.isFaked = true;
|
|
90
|
+
this.sentRecords = [];
|
|
91
|
+
}
|
|
92
|
+
restore() {
|
|
93
|
+
this.isFaked = false;
|
|
94
|
+
this.sentRecords = [];
|
|
95
|
+
}
|
|
96
|
+
getSent() {
|
|
97
|
+
return this.sentRecords;
|
|
98
|
+
}
|
|
99
|
+
assertSentTo(notifiable, notificationClass, callback) {
|
|
100
|
+
const found = this.sentRecords.some((record) => {
|
|
101
|
+
const matchesNotifiable = record.notifiable === notifiable || record.notifiable.id === notifiable.id;
|
|
102
|
+
const matchesClass = record.notification instanceof notificationClass || record.notification.constructor.name === notificationClass.name;
|
|
103
|
+
if (!matchesNotifiable || !matchesClass)
|
|
104
|
+
return false;
|
|
105
|
+
return callback ? callback(record.notification) : true;
|
|
106
|
+
});
|
|
107
|
+
if (!found) {
|
|
108
|
+
throw new Error(`Expected notification ${notificationClass.name} was not sent to notifiable.`);
|
|
109
|
+
}
|
|
110
|
+
}
|
|
111
|
+
assertNotSentTo(notifiable, notificationClass) {
|
|
112
|
+
const found = this.sentRecords.some((record) => {
|
|
113
|
+
const matchesNotifiable = record.notifiable === notifiable || record.notifiable.id === notifiable.id;
|
|
114
|
+
const matchesClass = record.notification instanceof notificationClass || record.notification.constructor.name === notificationClass.name;
|
|
115
|
+
return matchesNotifiable && matchesClass;
|
|
116
|
+
});
|
|
117
|
+
if (found) {
|
|
118
|
+
throw new Error(`Unexpected notification ${notificationClass.name} was sent to notifiable.`);
|
|
119
|
+
}
|
|
120
|
+
}
|
|
121
|
+
}
|
|
122
|
+
export const Notifications = new NotificationManager();
|
|
123
|
+
/**
|
|
124
|
+
* Mixin / Helper function to send notification from a user/patient model.
|
|
125
|
+
* Example: notify(user, new InvoiceNotification(inv));
|
|
126
|
+
*/
|
|
127
|
+
export async function notify(notifiable, notification) {
|
|
128
|
+
return await Notifications.send(notifiable, notification);
|
|
129
|
+
}
|
|
130
|
+
//# sourceMappingURL=notification-manager.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"notification-manager.js","sourceRoot":"","sources":["../../src/notifications/notification-manager.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,48 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @file notification.ts
|
|
3
|
+
* @description Base Notification class for AeroJS multi-channel dispatch.
|
|
4
|
+
*/
|
|
5
|
+
import { MailMessage } from '../mail/message.js';
|
|
6
|
+
export interface DatabaseNotificationRecord {
|
|
7
|
+
id: string;
|
|
8
|
+
type: string;
|
|
9
|
+
notifiableType?: string;
|
|
10
|
+
notifiableId?: string | number;
|
|
11
|
+
data: Record<string, any>;
|
|
12
|
+
readAt?: Date | null;
|
|
13
|
+
createdAt: Date;
|
|
14
|
+
}
|
|
15
|
+
export interface BroadcastNotificationData {
|
|
16
|
+
channel: string;
|
|
17
|
+
event: string;
|
|
18
|
+
data: Record<string, any>;
|
|
19
|
+
}
|
|
20
|
+
export interface SmsNotificationData {
|
|
21
|
+
to: string;
|
|
22
|
+
message: string;
|
|
23
|
+
}
|
|
24
|
+
export declare abstract class Notification {
|
|
25
|
+
id?: string;
|
|
26
|
+
/**
|
|
27
|
+
* Defines which channels this notification should be sent through.
|
|
28
|
+
* E.g. ['mail', 'database', 'broadcast', 'sms']
|
|
29
|
+
*/
|
|
30
|
+
abstract via(notifiable: any): string[] | Promise<string[]>;
|
|
31
|
+
/**
|
|
32
|
+
* Builds the email representation of the notification.
|
|
33
|
+
*/
|
|
34
|
+
toMail?(notifiable: any): MailMessage | Promise<MailMessage>;
|
|
35
|
+
/**
|
|
36
|
+
* Builds the database representation of the notification.
|
|
37
|
+
*/
|
|
38
|
+
toDatabase?(notifiable: any): Record<string, any> | Promise<Record<string, any>>;
|
|
39
|
+
/**
|
|
40
|
+
* Builds the realtime broadcast payload.
|
|
41
|
+
*/
|
|
42
|
+
toBroadcast?(notifiable: any): BroadcastNotificationData | Promise<BroadcastNotificationData>;
|
|
43
|
+
/**
|
|
44
|
+
* Builds the SMS payload.
|
|
45
|
+
*/
|
|
46
|
+
toSms?(notifiable: any): SmsNotificationData | Promise<SmsNotificationData>;
|
|
47
|
+
}
|
|
48
|
+
//# sourceMappingURL=notification.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"notification.d.ts","sourceRoot":"","sources":["../../src/notifications/notification.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,EAAE,WAAW,EAAE,MAAM,oBAAoB,CAAC;AAEjD,MAAM,WAAW,0BAA0B;IACzC,EAAE,EAAE,MAAM,CAAC;IACX,IAAI,EAAE,MAAM,CAAC;IACb,cAAc,CAAC,EAAE,MAAM,CAAC;IACxB,YAAY,CAAC,EAAE,MAAM,GAAG,MAAM,CAAC;IAC/B,IAAI,EAAE,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,CAAC;IAC1B,MAAM,CAAC,EAAE,IAAI,GAAG,IAAI,CAAC;IACrB,SAAS,EAAE,IAAI,CAAC;CACjB;AAED,MAAM,WAAW,yBAAyB;IACxC,OAAO,EAAE,MAAM,CAAC;IAChB,KAAK,EAAE,MAAM,CAAC;IACd,IAAI,EAAE,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,CAAC;CAC3B;AAED,MAAM,WAAW,mBAAmB;IAClC,EAAE,EAAE,MAAM,CAAC;IACX,OAAO,EAAE,MAAM,CAAC;CACjB;AAED,8BAAsB,YAAY;IACzB,EAAE,CAAC,EAAE,MAAM,CAAC;IAEnB;;;OAGG;aACa,GAAG,CAAC,UAAU,EAAE,GAAG,GAAG,MAAM,EAAE,GAAG,OAAO,CAAC,MAAM,EAAE,CAAC;IAElE;;OAEG;IACI,MAAM,CAAC,CAAC,UAAU,EAAE,GAAG,GAAG,WAAW,GAAG,OAAO,CAAC,WAAW,CAAC;IAEnE;;OAEG;IACI,UAAU,CAAC,CAAC,UAAU,EAAE,GAAG,GAAG,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,GAAG,OAAO,CAAC,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,CAAC;IAEvF;;OAEG;IACI,WAAW,CAAC,CAAC,UAAU,EAAE,GAAG,GAAG,yBAAyB,GAAG,OAAO,CAAC,yBAAyB,CAAC;IAEpG;;OAEG;IACI,KAAK,CAAC,CAAC,UAAU,EAAE,GAAG,GAAG,mBAAmB,GAAG,OAAO,CAAC,mBAAmB,CAAC;CACnF"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"notification.js","sourceRoot":"","sources":["../../src/notifications/notification.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,EAAE,WAAW,EAAE,MAAM,oBAAoB,CAAC;AAuBjD,MAAM,OAAgB,YAAY;IACzB,EAAE,CAAU;CA2BpB"}
|
|
@@ -1,14 +1,34 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @file redis-queue-driver.ts
|
|
3
|
+
* @description Production-grade Redis Queue Driver for AeroJS.
|
|
4
|
+
* Supports FIFO queueing (LPUSH/RPOP), delayed dispatch (ZADD/ZRANGEBYSCORE),
|
|
5
|
+
* job reservation tracking (HSET), release with backoff retry, and DLQ (Dead Letter Queue).
|
|
6
|
+
*/
|
|
1
7
|
import type { QueueDriver, QueuedJobRecord, PushOptions } from './queue-driver.js';
|
|
2
8
|
import { RedisClient } from '../../redis/redis-client.js';
|
|
9
|
+
export interface FailedJobDetails extends QueuedJobRecord {
|
|
10
|
+
failedAt: Date;
|
|
11
|
+
error?: string;
|
|
12
|
+
}
|
|
3
13
|
export declare class RedisQueueDriver implements QueueDriver {
|
|
4
14
|
private client;
|
|
5
15
|
constructor(client: RedisClient);
|
|
6
16
|
private queueKey;
|
|
7
17
|
private delayedKey;
|
|
18
|
+
private reservedKey;
|
|
19
|
+
private failedKey;
|
|
8
20
|
push(payload: string, options?: PushOptions): Promise<string | number>;
|
|
9
21
|
pop(queue?: string): Promise<QueuedJobRecord | null>;
|
|
10
22
|
delete(id: string | number, queue?: string): Promise<boolean>;
|
|
11
23
|
release(id: string | number, delaySeconds?: number, queue?: string): Promise<boolean>;
|
|
24
|
+
/**
|
|
25
|
+
* Moves a permanently failed job to Dead Letter Queue (DLQ).
|
|
26
|
+
*/
|
|
27
|
+
fail(id: string | number, error?: any, queue?: string): Promise<boolean>;
|
|
28
|
+
/**
|
|
29
|
+
* Retrieves all failed jobs from the Dead Letter Queue.
|
|
30
|
+
*/
|
|
31
|
+
getFailed(queue?: string): Promise<FailedJobDetails[]>;
|
|
12
32
|
size(queue?: string): Promise<number>;
|
|
13
33
|
clear(queue?: string): Promise<void>;
|
|
14
34
|
private migrateDelayedJobs;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"redis-queue-driver.d.ts","sourceRoot":"","sources":["../../../src/queue/drivers/redis-queue-driver.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,WAAW,EAAE,eAAe,EAAE,WAAW,EAAE,MAAM,mBAAmB,CAAC;AACnF,OAAO,EAAE,WAAW,EAAE,MAAM,6BAA6B,CAAC;AAG1D,qBAAa,gBAAiB,YAAW,WAAW;IAClD,OAAO,CAAC,MAAM,CAAc;gBAEhB,MAAM,EAAE,WAAW;IAI/B,OAAO,CAAC,QAAQ;IAIhB,OAAO,CAAC,UAAU;
|
|
1
|
+
{"version":3,"file":"redis-queue-driver.d.ts","sourceRoot":"","sources":["../../../src/queue/drivers/redis-queue-driver.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,OAAO,KAAK,EAAE,WAAW,EAAE,eAAe,EAAE,WAAW,EAAE,MAAM,mBAAmB,CAAC;AACnF,OAAO,EAAE,WAAW,EAAE,MAAM,6BAA6B,CAAC;AAG1D,MAAM,WAAW,gBAAiB,SAAQ,eAAe;IACvD,QAAQ,EAAE,IAAI,CAAC;IACf,KAAK,CAAC,EAAE,MAAM,CAAC;CAChB;AAED,qBAAa,gBAAiB,YAAW,WAAW;IAClD,OAAO,CAAC,MAAM,CAAc;gBAEhB,MAAM,EAAE,WAAW;IAI/B,OAAO,CAAC,QAAQ;IAIhB,OAAO,CAAC,UAAU;IAIlB,OAAO,CAAC,WAAW;IAInB,OAAO,CAAC,SAAS;IAIJ,IAAI,CAAC,OAAO,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE,WAAW,GAAG,OAAO,CAAC,MAAM,GAAG,MAAM,CAAC;IA+BtE,GAAG,CAAC,KAAK,GAAE,MAAkB,GAAG,OAAO,CAAC,eAAe,GAAG,IAAI,CAAC;IAkB/D,MAAM,CAAC,EAAE,EAAE,MAAM,GAAG,MAAM,EAAE,KAAK,GAAE,MAAkB,GAAG,OAAO,CAAC,OAAO,CAAC;IAKxE,OAAO,CAAC,EAAE,EAAE,MAAM,GAAG,MAAM,EAAE,YAAY,SAAI,EAAE,KAAK,GAAE,MAAkB,GAAG,OAAO,CAAC,OAAO,CAAC;IA2BxG;;OAEG;IACU,IAAI,CAAC,EAAE,EAAE,MAAM,GAAG,MAAM,EAAE,KAAK,CAAC,EAAE,GAAG,EAAE,KAAK,GAAE,MAAkB,GAAG,OAAO,CAAC,OAAO,CAAC;IAiBhG;;OAEG;IACU,SAAS,CAAC,KAAK,GAAE,MAAkB,GAAG,OAAO,CAAC,gBAAgB,EAAE,CAAC;IAKjE,IAAI,CAAC,KAAK,GAAE,MAAkB,GAAG,OAAO,CAAC,MAAM,CAAC;IAIhD,KAAK,CAAC,KAAK,GAAE,MAAkB,GAAG,OAAO,CAAC,IAAI,CAAC;YAS9C,kBAAkB;CA0BjC"}
|
|
@@ -1,3 +1,9 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @file redis-queue-driver.ts
|
|
3
|
+
* @description Production-grade Redis Queue Driver for AeroJS.
|
|
4
|
+
* Supports FIFO queueing (LPUSH/RPOP), delayed dispatch (ZADD/ZRANGEBYSCORE),
|
|
5
|
+
* job reservation tracking (HSET), release with backoff retry, and DLQ (Dead Letter Queue).
|
|
6
|
+
*/
|
|
1
7
|
import { RedisClient } from '../../redis/redis-client.js';
|
|
2
8
|
import * as crypto from 'node:crypto';
|
|
3
9
|
export class RedisQueueDriver {
|
|
@@ -11,6 +17,12 @@ export class RedisQueueDriver {
|
|
|
11
17
|
delayedKey(queue) {
|
|
12
18
|
return `queue:${queue}:delayed`;
|
|
13
19
|
}
|
|
20
|
+
reservedKey(queue) {
|
|
21
|
+
return `queue:${queue}:reserved`;
|
|
22
|
+
}
|
|
23
|
+
failedKey(queue) {
|
|
24
|
+
return `queue:${queue}:failed`;
|
|
25
|
+
}
|
|
14
26
|
async push(payload, options) {
|
|
15
27
|
const queue = options?.queue || 'default';
|
|
16
28
|
const delay = options?.delay || 0;
|
|
@@ -22,14 +34,16 @@ export class RedisQueueDriver {
|
|
|
22
34
|
attempts: 0,
|
|
23
35
|
reservedAt: null,
|
|
24
36
|
availableAt: new Date(Date.now() + delay * 1000),
|
|
25
|
-
createdAt: new Date()
|
|
37
|
+
createdAt: new Date(),
|
|
26
38
|
};
|
|
27
39
|
const serialized = JSON.stringify(jobRecord);
|
|
28
40
|
if (delay > 0) {
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
41
|
+
await this.client.getRawConnection().sendCommand([
|
|
42
|
+
'ZADD',
|
|
43
|
+
this.delayedKey(queue),
|
|
44
|
+
jobRecord.availableAt.getTime(),
|
|
45
|
+
serialized,
|
|
46
|
+
]);
|
|
33
47
|
}
|
|
34
48
|
else {
|
|
35
49
|
await this.client.lpush(this.queueKey(queue), serialized);
|
|
@@ -37,56 +51,101 @@ export class RedisQueueDriver {
|
|
|
37
51
|
return id;
|
|
38
52
|
}
|
|
39
53
|
async pop(queue = 'default') {
|
|
40
|
-
//
|
|
54
|
+
// 1. Migrate delayed jobs that are ready to run
|
|
41
55
|
await this.migrateDelayedJobs(queue);
|
|
56
|
+
// 2. Pop next available job
|
|
42
57
|
const data = await this.client.rpop(this.queueKey(queue));
|
|
43
58
|
if (!data)
|
|
44
59
|
return null;
|
|
45
60
|
const job = JSON.parse(data);
|
|
46
61
|
job.attempts += 1;
|
|
47
62
|
job.reservedAt = new Date();
|
|
63
|
+
// 3. Track in reserved hash while worker is processing
|
|
64
|
+
await this.client.hset(this.reservedKey(queue), String(job.id), JSON.stringify(job));
|
|
48
65
|
return job;
|
|
49
66
|
}
|
|
50
67
|
async delete(id, queue = 'default') {
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
return true;
|
|
68
|
+
const deleted = await this.client.hdel(this.reservedKey(queue), String(id));
|
|
69
|
+
return deleted > 0;
|
|
54
70
|
}
|
|
55
71
|
async release(id, delaySeconds = 0, queue = 'default') {
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
//
|
|
60
|
-
|
|
61
|
-
|
|
72
|
+
const raw = await this.client.hget(this.reservedKey(queue), String(id));
|
|
73
|
+
if (!raw)
|
|
74
|
+
return false;
|
|
75
|
+
// Remove from reserved
|
|
76
|
+
await this.client.hdel(this.reservedKey(queue), String(id));
|
|
77
|
+
const job = JSON.parse(raw);
|
|
78
|
+
job.reservedAt = null;
|
|
79
|
+
job.availableAt = new Date(Date.now() + delaySeconds * 1000);
|
|
80
|
+
const serialized = JSON.stringify(job);
|
|
81
|
+
if (delaySeconds > 0) {
|
|
82
|
+
await this.client.getRawConnection().sendCommand([
|
|
83
|
+
'ZADD',
|
|
84
|
+
this.delayedKey(queue),
|
|
85
|
+
job.availableAt.getTime(),
|
|
86
|
+
serialized,
|
|
87
|
+
]);
|
|
88
|
+
}
|
|
89
|
+
else {
|
|
90
|
+
await this.client.lpush(this.queueKey(queue), serialized);
|
|
91
|
+
}
|
|
92
|
+
return true;
|
|
93
|
+
}
|
|
94
|
+
/**
|
|
95
|
+
* Moves a permanently failed job to Dead Letter Queue (DLQ).
|
|
96
|
+
*/
|
|
97
|
+
async fail(id, error, queue = 'default') {
|
|
98
|
+
const raw = await this.client.hget(this.reservedKey(queue), String(id));
|
|
99
|
+
if (!raw)
|
|
100
|
+
return false;
|
|
101
|
+
await this.client.hdel(this.reservedKey(queue), String(id));
|
|
102
|
+
const job = JSON.parse(raw);
|
|
103
|
+
const failedRecord = {
|
|
104
|
+
...job,
|
|
105
|
+
failedAt: new Date(),
|
|
106
|
+
error: error instanceof Error ? error.stack || error.message : String(error || 'Unknown error'),
|
|
107
|
+
};
|
|
108
|
+
await this.client.hset(this.failedKey(queue), String(id), JSON.stringify(failedRecord));
|
|
109
|
+
return true;
|
|
110
|
+
}
|
|
111
|
+
/**
|
|
112
|
+
* Retrieves all failed jobs from the Dead Letter Queue.
|
|
113
|
+
*/
|
|
114
|
+
async getFailed(queue = 'default') {
|
|
115
|
+
const records = await this.client.hgetall(this.failedKey(queue));
|
|
116
|
+
return Object.values(records).map((r) => JSON.parse(r));
|
|
62
117
|
}
|
|
63
118
|
async size(queue = 'default') {
|
|
64
|
-
return this.client.llen(this.queueKey(queue));
|
|
119
|
+
return await this.client.llen(this.queueKey(queue));
|
|
65
120
|
}
|
|
66
121
|
async clear(queue = 'default') {
|
|
67
|
-
await this.client.del(this.queueKey(queue));
|
|
68
|
-
await this.client.del(this.delayedKey(queue));
|
|
122
|
+
await this.client.del(this.queueKey(queue), this.delayedKey(queue), this.reservedKey(queue), this.failedKey(queue));
|
|
69
123
|
}
|
|
70
124
|
async migrateDelayedJobs(queue) {
|
|
71
125
|
const now = Date.now();
|
|
72
|
-
|
|
73
|
-
|
|
74
|
-
|
|
75
|
-
|
|
76
|
-
|
|
77
|
-
|
|
78
|
-
|
|
79
|
-
|
|
80
|
-
|
|
81
|
-
|
|
82
|
-
|
|
83
|
-
|
|
84
|
-
|
|
85
|
-
|
|
86
|
-
|
|
126
|
+
try {
|
|
127
|
+
const readyJobs = await this.client.getRawConnection().sendCommand([
|
|
128
|
+
'ZRANGEBYSCORE',
|
|
129
|
+
this.delayedKey(queue),
|
|
130
|
+
'-inf',
|
|
131
|
+
now,
|
|
132
|
+
]);
|
|
133
|
+
if (readyJobs && readyJobs.length > 0) {
|
|
134
|
+
for (const job of readyJobs) {
|
|
135
|
+
const removed = await this.client.getRawConnection().sendCommand([
|
|
136
|
+
'ZREM',
|
|
137
|
+
this.delayedKey(queue),
|
|
138
|
+
job,
|
|
139
|
+
]);
|
|
140
|
+
if (removed === 1) {
|
|
141
|
+
await this.client.rpush(this.queueKey(queue), job);
|
|
142
|
+
}
|
|
87
143
|
}
|
|
88
144
|
}
|
|
89
145
|
}
|
|
146
|
+
catch {
|
|
147
|
+
// In case sorted set does not exist yet
|
|
148
|
+
}
|
|
90
149
|
}
|
|
91
150
|
}
|
|
92
151
|
//# sourceMappingURL=redis-queue-driver.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"redis-queue-driver.js","sourceRoot":"","sources":["../../../src/queue/drivers/redis-queue-driver.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"redis-queue-driver.js","sourceRoot":"","sources":["../../../src/queue/drivers/redis-queue-driver.ts"],"names":[],"mappings":"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"}
|
|
@@ -5,10 +5,13 @@
|
|
|
5
5
|
import type { QueueDriver, PushOptions } from './drivers/queue-driver.js';
|
|
6
6
|
import { QueueWorker, type WorkerOptions } from './worker.js';
|
|
7
7
|
import { Job } from './job.js';
|
|
8
|
+
import { RedisClient } from '../redis/redis-client.js';
|
|
8
9
|
export interface QueueConnectionConfig {
|
|
9
|
-
driver: 'memory' | 'database' | string;
|
|
10
|
+
driver: 'memory' | 'database' | 'redis' | string;
|
|
10
11
|
table?: string;
|
|
11
12
|
connection?: string;
|
|
13
|
+
redis?: RedisClient;
|
|
14
|
+
redisOptions?: any;
|
|
12
15
|
}
|
|
13
16
|
export interface QueueConfig {
|
|
14
17
|
default?: string;
|
|
@@ -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;AAC9D,OAAO,EAAE,GAAG,EAAE,MAAM,UAAU,CAAC;AAE/B,MAAM,WAAW,qBAAqB;IACpC,MAAM,EAAE,QAAQ,GAAG,UAAU,GAAG,MAAM,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,MAAM,aAAa,CAAC;AAC9D,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;IAY/E,KAAK,IAAI,IAAI;CAKrB;AAED,eAAO,MAAM,KAAK,cAAqB,CAAC"}
|
|
@@ -6,6 +6,8 @@ import { MemoryQueueDriver } from './drivers/memory-queue-driver.js';
|
|
|
6
6
|
import { DatabaseQueueDriver } from './drivers/database-queue-driver.js';
|
|
7
7
|
import { QueueWorker } from './worker.js';
|
|
8
8
|
import { Job } from './job.js';
|
|
9
|
+
import { RedisQueueDriver } from './drivers/redis-queue-driver.js';
|
|
10
|
+
import { RedisClient } from '../redis/redis-client.js';
|
|
9
11
|
export class QueueManager {
|
|
10
12
|
defaultConnection = 'memory';
|
|
11
13
|
connectionConfigs = new Map();
|
|
@@ -34,9 +36,14 @@ export class QueueManager {
|
|
|
34
36
|
if (this.instantiatedDrivers.has(connName)) {
|
|
35
37
|
return this.instantiatedDrivers.get(connName);
|
|
36
38
|
}
|
|
37
|
-
const cfg = this.connectionConfigs.get(connName) || { driver: connName === 'database' ? 'database' : 'memory' };
|
|
39
|
+
const cfg = this.connectionConfigs.get(connName) || { driver: connName === 'database' ? 'database' : (connName === 'redis' ? 'redis' : 'memory') };
|
|
38
40
|
let driverInstance;
|
|
39
41
|
switch (cfg.driver) {
|
|
42
|
+
case 'redis': {
|
|
43
|
+
const client = cfg.redis || new RedisClient(cfg.redisOptions);
|
|
44
|
+
driverInstance = new RedisQueueDriver(client);
|
|
45
|
+
break;
|
|
46
|
+
}
|
|
40
47
|
case 'database':
|
|
41
48
|
driverInstance = new DatabaseQueueDriver({
|
|
42
49
|
table: cfg.table,
|
|
@@ -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,EAAsB,MAAM,aAAa,CAAC;AAC9D,OAAO,EAAE,GAAG,EAAE,MAAM,UAAU,CAAC;
|
|
1
|
+
{"version":3,"file":"queue-manager.js","sourceRoot":"","sources":["../../src/queue/queue-manager.ts"],"names":[],"mappings":"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"}
|
package/dist/security/index.d.ts
CHANGED
|
@@ -3,11 +3,12 @@
|
|
|
3
3
|
* @description Security modules for Aero Web Framework: JWT, Rate Limiter, Security Headers, and CSRF.
|
|
4
4
|
*/
|
|
5
5
|
export { jwt, sign, verify, decode, jwtAuth, parseTimespan, JsonWebTokenError, TokenExpiredError, NotBeforeError, type JwtAlgorithm, type JwtHeader, type JwtPayload, type JwtSignOptions, type JwtVerifyOptions, type JwtAuthOptions, } from './jwt.js';
|
|
6
|
-
export { rateLimit, MemoryRateLimitStore, TooManyRequestsError, type RateLimitOptions, type RateLimitStore, type RateLimitInfo, } from './rate-limiter.js';
|
|
6
|
+
export { rateLimit, MemoryRateLimitStore, RedisRateLimitStore, TooManyRequestsError, type RateLimitOptions, type RateLimitStore, type RateLimitInfo, type RedisRateLimitStoreOptions, } from './rate-limiter.js';
|
|
7
7
|
export { securityHeaders, type SecurityHeadersOptions, type HstsOptions, type ContentSecurityPolicyDirectives, } from './headers.js';
|
|
8
8
|
export { csrf, type CsrfOptions, } from './csrf.js';
|
|
9
9
|
export { Hash, hash, hashVerify, type ScryptOptions, } from './hash.js';
|
|
10
10
|
export { cors, type CorsOptions, } from '../middleware/cors.js';
|
|
11
11
|
export * from './totp.js';
|
|
12
12
|
export * from './vault.js';
|
|
13
|
+
export * from './signed-url.js';
|
|
13
14
|
//# 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,oBAAoB,EACpB,KAAK,gBAAgB,EACrB,KAAK,cAAc,EACnB,KAAK,aAAa,
|
|
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"}
|
package/dist/security/index.js
CHANGED
|
@@ -3,11 +3,12 @@
|
|
|
3
3
|
* @description Security modules for Aero Web Framework: JWT, Rate Limiter, Security Headers, and CSRF.
|
|
4
4
|
*/
|
|
5
5
|
export { jwt, sign, verify, decode, jwtAuth, parseTimespan, JsonWebTokenError, TokenExpiredError, NotBeforeError, } from './jwt.js';
|
|
6
|
-
export { rateLimit, MemoryRateLimitStore, TooManyRequestsError, } from './rate-limiter.js';
|
|
6
|
+
export { rateLimit, MemoryRateLimitStore, RedisRateLimitStore, TooManyRequestsError, } from './rate-limiter.js';
|
|
7
7
|
export { securityHeaders, } from './headers.js';
|
|
8
8
|
export { csrf, } from './csrf.js';
|
|
9
9
|
export { Hash, hash, hashVerify, } from './hash.js';
|
|
10
10
|
export { cors, } from '../middleware/cors.js';
|
|
11
11
|
export * from './totp.js';
|
|
12
12
|
export * from './vault.js';
|
|
13
|
+
export * from './signed-url.js';
|
|
13
14
|
//# sourceMappingURL=index.js.map
|
|
@@ -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,oBAAoB,
|
|
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"}
|
|
@@ -73,6 +73,26 @@ export declare class MemoryRateLimitStore implements RateLimitStore {
|
|
|
73
73
|
cleanup(): void;
|
|
74
74
|
destroy(): void;
|
|
75
75
|
}
|
|
76
|
+
export interface RedisRateLimitStoreOptions {
|
|
77
|
+
client: any;
|
|
78
|
+
prefix?: string;
|
|
79
|
+
fallbackToMemory?: boolean;
|
|
80
|
+
}
|
|
81
|
+
/**
|
|
82
|
+
* Distributed, multi-instance Rate Limiter Store backed by Redis.
|
|
83
|
+
* Uses atomic INCR and TTL expiration to synchronize rate limits across server clusters.
|
|
84
|
+
*/
|
|
85
|
+
export declare class RedisRateLimitStore implements RateLimitStore {
|
|
86
|
+
private client;
|
|
87
|
+
private prefix;
|
|
88
|
+
private fallbackStore?;
|
|
89
|
+
constructor(options: RedisRateLimitStoreOptions);
|
|
90
|
+
increment(key: string, windowMs: number): Promise<RateLimitInfo>;
|
|
91
|
+
decrement(key: string): Promise<void>;
|
|
92
|
+
resetKey(key: string): Promise<void>;
|
|
93
|
+
resetAll(): Promise<void>;
|
|
94
|
+
destroy(): void;
|
|
95
|
+
}
|
|
76
96
|
/**
|
|
77
97
|
* Creates a Rate Limiter middleware for Aero applications.
|
|
78
98
|
*/
|