@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.
Files changed (113) hide show
  1. package/README.md +291 -7
  2. package/dist/auth/index.d.ts +1 -0
  3. package/dist/auth/index.d.ts.map +1 -1
  4. package/dist/auth/index.js +1 -0
  5. package/dist/auth/index.js.map +1 -1
  6. package/dist/auth/oauth/github-driver.d.ts +16 -0
  7. package/dist/auth/oauth/github-driver.d.ts.map +1 -0
  8. package/dist/auth/oauth/github-driver.js +79 -0
  9. package/dist/auth/oauth/github-driver.js.map +1 -0
  10. package/dist/auth/oauth/google-driver.d.ts +16 -0
  11. package/dist/auth/oauth/google-driver.d.ts.map +1 -0
  12. package/dist/auth/oauth/google-driver.js +63 -0
  13. package/dist/auth/oauth/google-driver.js.map +1 -0
  14. package/dist/auth/oauth/index.d.ts +9 -0
  15. package/dist/auth/oauth/index.d.ts.map +1 -0
  16. package/dist/auth/oauth/index.js +9 -0
  17. package/dist/auth/oauth/index.js.map +1 -0
  18. package/dist/auth/oauth/oauth-driver.d.ts +35 -0
  19. package/dist/auth/oauth/oauth-driver.d.ts.map +1 -0
  20. package/dist/auth/oauth/oauth-driver.js +6 -0
  21. package/dist/auth/oauth/oauth-driver.js.map +1 -0
  22. package/dist/auth/oauth/oauth-manager.d.ts +26 -0
  23. package/dist/auth/oauth/oauth-manager.d.ts.map +1 -0
  24. package/dist/auth/oauth/oauth-manager.js +86 -0
  25. package/dist/auth/oauth/oauth-manager.js.map +1 -0
  26. package/dist/cli/commands/make.d.ts +5 -0
  27. package/dist/cli/commands/make.d.ts.map +1 -1
  28. package/dist/cli/commands/make.js +119 -0
  29. package/dist/cli/commands/make.js.map +1 -1
  30. package/dist/cli/runner.d.ts.map +1 -1
  31. package/dist/cli/runner.js +72 -3
  32. package/dist/cli/runner.js.map +1 -1
  33. package/dist/core/application.d.ts +5 -0
  34. package/dist/core/application.d.ts.map +1 -1
  35. package/dist/core/application.js +12 -0
  36. package/dist/core/application.js.map +1 -1
  37. package/dist/core/context.d.ts +4 -0
  38. package/dist/core/context.d.ts.map +1 -1
  39. package/dist/core/context.js +8 -0
  40. package/dist/core/context.js.map +1 -1
  41. package/dist/http/http.d.ts +44 -0
  42. package/dist/http/http.d.ts.map +1 -0
  43. package/dist/http/http.js +132 -0
  44. package/dist/http/http.js.map +1 -0
  45. package/dist/http/index.d.ts +8 -0
  46. package/dist/http/index.d.ts.map +1 -0
  47. package/dist/http/index.js +8 -0
  48. package/dist/http/index.js.map +1 -0
  49. package/dist/http/request-builder.d.ts +48 -0
  50. package/dist/http/request-builder.d.ts.map +1 -0
  51. package/dist/http/request-builder.js +186 -0
  52. package/dist/http/request-builder.js.map +1 -0
  53. package/dist/http/response.d.ts +34 -0
  54. package/dist/http/response.d.ts.map +1 -0
  55. package/dist/http/response.js +77 -0
  56. package/dist/http/response.js.map +1 -0
  57. package/dist/index.d.ts +4 -2
  58. package/dist/index.d.ts.map +1 -1
  59. package/dist/index.js +4 -2
  60. package/dist/index.js.map +1 -1
  61. package/dist/mail/drivers/smtp-mail-driver.d.ts +39 -0
  62. package/dist/mail/drivers/smtp-mail-driver.d.ts.map +1 -0
  63. package/dist/mail/drivers/smtp-mail-driver.js +318 -0
  64. package/dist/mail/drivers/smtp-mail-driver.js.map +1 -0
  65. package/dist/mail/index.d.ts +1 -0
  66. package/dist/mail/index.d.ts.map +1 -1
  67. package/dist/mail/index.js +1 -0
  68. package/dist/mail/index.js.map +1 -1
  69. package/dist/mail/mailer.d.ts +20 -3
  70. package/dist/mail/mailer.d.ts.map +1 -1
  71. package/dist/mail/mailer.js +28 -1
  72. package/dist/mail/mailer.js.map +1 -1
  73. package/dist/notifications/index.d.ts +7 -0
  74. package/dist/notifications/index.d.ts.map +1 -0
  75. package/dist/notifications/index.js +7 -0
  76. package/dist/notifications/index.js.map +1 -0
  77. package/dist/notifications/notification-manager.d.ts +39 -0
  78. package/dist/notifications/notification-manager.d.ts.map +1 -0
  79. package/dist/notifications/notification-manager.js +130 -0
  80. package/dist/notifications/notification-manager.js.map +1 -0
  81. package/dist/notifications/notification.d.ts +48 -0
  82. package/dist/notifications/notification.d.ts.map +1 -0
  83. package/dist/notifications/notification.js +9 -0
  84. package/dist/notifications/notification.js.map +1 -0
  85. package/dist/queue/drivers/redis-queue-driver.d.ts +20 -0
  86. package/dist/queue/drivers/redis-queue-driver.d.ts.map +1 -1
  87. package/dist/queue/drivers/redis-queue-driver.js +92 -33
  88. package/dist/queue/drivers/redis-queue-driver.js.map +1 -1
  89. package/dist/queue/queue-manager.d.ts +4 -1
  90. package/dist/queue/queue-manager.d.ts.map +1 -1
  91. package/dist/queue/queue-manager.js +8 -1
  92. package/dist/queue/queue-manager.js.map +1 -1
  93. package/dist/security/index.d.ts +2 -1
  94. package/dist/security/index.d.ts.map +1 -1
  95. package/dist/security/index.js +2 -1
  96. package/dist/security/index.js.map +1 -1
  97. package/dist/security/rate-limiter.d.ts +20 -0
  98. package/dist/security/rate-limiter.d.ts.map +1 -1
  99. package/dist/security/rate-limiter.js +85 -0
  100. package/dist/security/rate-limiter.js.map +1 -1
  101. package/dist/security/signed-url.d.ts +29 -0
  102. package/dist/security/signed-url.d.ts.map +1 -0
  103. package/dist/security/signed-url.js +86 -0
  104. package/dist/security/signed-url.js.map +1 -0
  105. package/dist/storage/drivers/local-driver.d.ts +1 -0
  106. package/dist/storage/drivers/local-driver.d.ts.map +1 -1
  107. package/dist/storage/drivers/local-driver.js +5 -0
  108. package/dist/storage/drivers/local-driver.js.map +1 -1
  109. package/dist/storage/drivers/memory-driver.d.ts +1 -0
  110. package/dist/storage/drivers/memory-driver.d.ts.map +1 -1
  111. package/dist/storage/drivers/memory-driver.js +5 -0
  112. package/dist/storage/drivers/memory-driver.js.map +1 -1
  113. 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,9 @@
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 class Notification {
7
+ id;
8
+ }
9
+ //# sourceMappingURL=notification.js.map
@@ -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;IAIL,IAAI,CAAC,OAAO,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE,WAAW,GAAG,OAAO,CAAC,MAAM,GAAG,MAAM,CAAC;IA6BtE,GAAG,CAAC,KAAK,GAAE,MAAkB,GAAG,OAAO,CAAC,eAAe,GAAG,IAAI,CAAC;IAc/D,MAAM,CAAC,EAAE,EAAE,MAAM,GAAG,MAAM,EAAE,KAAK,GAAE,MAAkB,GAAG,OAAO,CAAC,OAAO,CAAC;IAMxE,OAAO,CAAC,EAAE,EAAE,MAAM,GAAG,MAAM,EAAE,YAAY,SAAI,EAAE,KAAK,GAAE,MAAkB,GAAG,OAAO,CAAC,OAAO,CAAC;IAS3F,IAAI,CAAC,KAAK,GAAE,MAAkB,GAAG,OAAO,CAAC,MAAM,CAAC;IAIhD,KAAK,CAAC,KAAK,GAAE,MAAkB,GAAG,OAAO,CAAC,IAAI,CAAC;YAK9C,kBAAkB;CAsBjC"}
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
- // In a full implementation we'd use ZADD for delayed jobs.
30
- // Since our simple client might not have ZADD exposed yet, we'll expose a raw command wrapper or add zadd
31
- // Let's use the raw command wrapper directly:
32
- await this.client.getRawConnection().sendCommand(['ZADD', this.delayedKey(queue), jobRecord.availableAt.getTime(), serialized]);
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
- // First, migrate delayed jobs that are ready
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
- // Since jobs are removed from the list when popped, delete is effectively a no-op
52
- // unless we were keeping them in a processing set.
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
- // We don't have the job payload here directly in this API signature if we just use id.
57
- // In a full implementation, the QueueManager passes the whole job or payload, but QueueDriver release only takes ID.
58
- // This implies we need to store job state, or perhaps we just return false if we can't implement it perfectly without a payload.
59
- // Assuming we can't easily release without the payload unless we fetch it, but it was already popped.
60
- // This is a common flaw in simple interfaces. We will return false for now or throw.
61
- return false;
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
- // Using raw commands for ZRANGEBYSCORE and ZREM
73
- // ZRANGEBYSCORE key -inf <now>
74
- const readyJobs = await this.client.getRawConnection().sendCommand([
75
- 'ZRANGEBYSCORE',
76
- this.delayedKey(queue),
77
- '-inf',
78
- now
79
- ]);
80
- if (readyJobs && readyJobs.length > 0) {
81
- for (const job of readyJobs) {
82
- // ZREM returns 1 if the element was removed, 0 if it was already removed by another worker
83
- const removed = await this.client.getRawConnection().sendCommand(['ZREM', this.delayedKey(queue), job]);
84
- if (removed === 1) {
85
- // Push only the jobs this worker successfully claimed
86
- await this.client.rpush(this.queueKey(queue), job);
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":"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"}
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;IACvC,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,UAAU,CAAC,EAAE,MAAM,CAAC;CACrB;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;IA2BzC;;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"}
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":"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"}
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;AAC/B,OAAO,EAAE,gBAAgB,EAAE,MAAM,iCAAiC,CAAC;AACnE,OAAO,EAAE,WAAW,EAAE,MAAM,0BAA0B,CAAC;AAevD,MAAM,OAAO,YAAY;IACf,iBAAiB,GAAG,QAAQ,CAAC;IAC7B,iBAAiB,GAAG,IAAI,GAAG,EAAiC,CAAC;IAC7D,mBAAmB,GAAG,IAAI,GAAG,EAAuB,CAAC;IACrD,WAAW,GAAG,IAAI,GAAG,EAAuC,CAAC;IAErE,YAAY,SAAsB,EAAE;QAClC,IAAI,CAAC,SAAS,CAAC,MAAM,CAAC,CAAC;IACzB,CAAC;IAEM,SAAS,CAAC,MAAmB;QAClC,IAAI,MAAM,CAAC,OAAO,EAAE,CAAC;YACnB,IAAI,CAAC,iBAAiB,GAAG,MAAM,CAAC,OAAO,CAAC;QAC1C,CAAC;QACD,IAAI,MAAM,CAAC,WAAW,EAAE,CAAC;YACvB,KAAK,MAAM,CAAC,IAAI,EAAE,GAAG,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC,MAAM,CAAC,WAAW,CAAC,EAAE,CAAC;gBAC7D,IAAI,CAAC,iBAAiB,CAAC,GAAG,CAAC,IAAI,EAAE,GAAG,CAAC,CAAC;YACxC,CAAC;QACH,CAAC;QACD,OAAO,IAAI,CAAC;IACd,CAAC;IAEM,WAAW,CAAC,IAAY,EAAE,QAAqC;QACpE,IAAI,CAAC,WAAW,CAAC,GAAG,CAAC,IAAI,EAAE,QAAQ,CAAC,CAAC;QACrC,OAAO,IAAI,CAAC;IACd,CAAC;IAEM,MAAM,CAAC,IAAa;QACzB,MAAM,QAAQ,GAAG,IAAI,IAAI,IAAI,CAAC,iBAAiB,CAAC;QAEhD,IAAI,IAAI,CAAC,mBAAmB,CAAC,GAAG,CAAC,QAAQ,CAAC,EAAE,CAAC;YAC3C,OAAO,IAAI,CAAC,mBAAmB,CAAC,GAAG,CAAC,QAAQ,CAAE,CAAC;QACjD,CAAC;QAED,MAAM,GAAG,GAAG,IAAI,CAAC,iBAAiB,CAAC,GAAG,CAAC,QAAQ,CAAC,IAAI,EAAE,MAAM,EAAE,QAAQ,KAAK,UAAU,CAAC,CAAC,CAAC,UAAU,CAAC,CAAC,CAAC,CAAC,QAAQ,KAAK,OAAO,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,QAAQ,CAAC,EAAE,CAAC;QACnJ,IAAI,cAA2B,CAAC;QAEhC,QAAQ,GAAG,CAAC,MAAM,EAAE,CAAC;YACnB,KAAK,OAAO,CAAC,CAAC,CAAC;gBACb,MAAM,MAAM,GAAG,GAAG,CAAC,KAAK,IAAI,IAAI,WAAW,CAAC,GAAG,CAAC,YAAY,CAAC,CAAC;gBAC9D,cAAc,GAAG,IAAI,gBAAgB,CAAC,MAAM,CAAC,CAAC;gBAC9C,MAAM;YACR,CAAC;YACD,KAAK,UAAU;gBACb,cAAc,GAAG,IAAI,mBAAmB,CAAC;oBACvC,KAAK,EAAE,GAAG,CAAC,KAAK;oBAChB,UAAU,EAAE,GAAG,CAAC,UAAU;iBAC3B,CAAC,CAAC;gBACH,MAAM;YACR,KAAK,QAAQ,CAAC;YACd;gBACE,cAAc,GAAG,IAAI,iBAAiB,EAAE,CAAC;gBACzC,MAAM;QACV,CAAC;QAED,IAAI,CAAC,mBAAmB,CAAC,GAAG,CAAC,QAAQ,EAAE,cAAc,CAAC,CAAC;QACvD,OAAO,cAAc,CAAC;IACxB,CAAC;IAED;;OAEG;IACI,KAAK,CAAC,QAAQ,CAAC,GAAc,EAAE,UAAuB,EAAE;QAC7D,MAAM,OAAO,GAAG,GAAG,CAAC,WAAW,EAAE,IAAI,IAAI,cAAc,CAAC;QACxD,MAAM,OAAO,GAAG,IAAI,CAAC,SAAS,CAAC;YAC7B,OAAO;YACP,IAAI,EAAE,EAAE,GAAG,GAAG,EAAE;YAChB,KAAK,EAAE,GAAG,CAAC,KAAK,IAAI,CAAC;YACrB,KAAK,EAAE,OAAO,CAAC,KAAK,IAAI,GAAG,CAAC,KAAK,IAAI,CAAC;SACvC,CAAC,CAAC;QAEH,MAAM,MAAM,GAAG,IAAI,CAAC,MAAM,EAAE,CAAC;QAC7B,OAAO,MAAM,MAAM,CAAC,IAAI,CAAC,OAAO,EAAE;YAChC,KAAK,EAAE,OAAO,CAAC,KAAK;YACpB,KAAK,EAAE,OAAO,CAAC,KAAK,IAAI,GAAG,CAAC,KAAK;SAClC,CAAC,CAAC;IACL,CAAC;IAED;;OAEG;IACI,KAAK,CAAC,YAAY,CAAC,GAAQ;QAChC,OAAO,MAAM,GAAG,CAAC,MAAM,EAAE,CAAC;IAC5B,CAAC;IAED;;OAEG;IACI,YAAY,CAAC,UAAyB,EAAE,EAAE,cAAuB;QACtE,MAAM,MAAM,GAAG,IAAI,CAAC,MAAM,CAAC,cAAc,CAAC,CAAC;QAC3C,MAAM,MAAM,GAAG,IAAI,WAAW,CAAC,MAAM,EAAE;YACrC,GAAG,OAAO;YACV,WAAW,EAAE;gBACX,GAAG,MAAM,CAAC,WAAW,CAAC,IAAI,CAAC,WAAW,CAAC;gBACvC,GAAG,CAAC,OAAO,CAAC,WAAW,IAAI,EAAE,CAAC;aAC/B;SACF,CAAC,CAAC;QACH,OAAO,MAAM,CAAC;IAChB,CAAC;IAEM,KAAK;QACV,IAAI,CAAC,mBAAmB,CAAC,KAAK,EAAE,CAAC;QACjC,IAAI,CAAC,iBAAiB,CAAC,KAAK,EAAE,CAAC;QAC/B,IAAI,CAAC,iBAAiB,GAAG,QAAQ,CAAC;IACpC,CAAC;CACF;AAED,MAAM,CAAC,MAAM,KAAK,GAAG,IAAI,YAAY,EAAE,CAAC"}
@@ -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,GACnB,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"}
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"}
@@ -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,GAIrB,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"}
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
  */