@shohaghinfo/aerojs 0.4.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 +10 -10
- package/README.md +17 -17
- 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/database/model-hooks.d.ts +5 -5
- package/dist/database/model-hooks.js +11 -11
- package/dist/database/model.d.ts +43 -59
- package/dist/database/model.d.ts.map +1 -1
- package/dist/database/model.js +43 -59
- package/dist/database/model.js.map +1 -1
- package/dist/database/query-builder.d.ts +6 -7
- package/dist/database/query-builder.d.ts.map +1 -1
- package/dist/database/query-builder.js +6 -7
- 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 +1 -1
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +4 -4
- 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/scheduler/scheduler.d.ts +5 -5
- package/dist/scheduler/scheduler.js +5 -5
- 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.js +3 -3
- 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
package/AGENTS.md
CHANGED
|
@@ -813,9 +813,9 @@ router.get('/secure/download', validateSignedUrl(), async (ctx) => {
|
|
|
813
813
|
```bash
|
|
814
814
|
aero make:job ProcessPayment
|
|
815
815
|
aero make:mail OrderReceipt
|
|
816
|
-
aero make:policy
|
|
817
|
-
aero make:event
|
|
818
|
-
aero make:listener
|
|
816
|
+
aero make:policy PostPolicy
|
|
817
|
+
aero make:event UserRegistered
|
|
818
|
+
aero make:listener SendWelcomeNotification
|
|
819
819
|
```
|
|
820
820
|
|
|
821
821
|
---
|
|
@@ -823,7 +823,7 @@ aero make:listener NotifyDoctor
|
|
|
823
823
|
## 12. Advanced Enterprise Architecture (v0.4.0)
|
|
824
824
|
|
|
825
825
|
### 12.1 Field-Level AES-256-GCM Encryption (`Crypt`, `@encrypted`)
|
|
826
|
-
Protect sensitive compliance data (SSN,
|
|
826
|
+
Protect sensitive compliance data (SSN, tax records, credentials, confidential notes) transparently at rest:
|
|
827
827
|
|
|
828
828
|
```typescript
|
|
829
829
|
import { Model, encrypted, Crypt } from 'aerojs';
|
|
@@ -833,13 +833,13 @@ const ciphertext = Crypt.encrypt('secret-data');
|
|
|
833
833
|
const plaintext = Crypt.decrypt(ciphertext);
|
|
834
834
|
|
|
835
835
|
// Model field-level transparent encryption
|
|
836
|
-
export class
|
|
837
|
-
public static override table = '
|
|
836
|
+
export class AccountRecord extends Model {
|
|
837
|
+
public static override table = 'accounts';
|
|
838
838
|
public static override primaryKey = 'id';
|
|
839
|
-
public static override fillable = ['name', 'ssn', '
|
|
839
|
+
public static override fillable = ['name', 'ssn', 'private_notes'];
|
|
840
840
|
|
|
841
841
|
// Mark fields for automatic AES-256-GCM encryption
|
|
842
|
-
public static override encrypted = ['ssn', '
|
|
842
|
+
public static override encrypted = ['ssn', 'private_notes'];
|
|
843
843
|
|
|
844
844
|
// Or use TypeScript property decorator:
|
|
845
845
|
// @encrypted()
|
|
@@ -847,10 +847,10 @@ export class Patient extends Model {
|
|
|
847
847
|
}
|
|
848
848
|
|
|
849
849
|
// Automatically encrypted on .save() and decrypted on .find() / .all() / .toJSON()
|
|
850
|
-
const
|
|
850
|
+
const account = await AccountRecord.create({
|
|
851
851
|
name: 'John Doe',
|
|
852
852
|
ssn: '123-45-6789',
|
|
853
|
-
|
|
853
|
+
private_notes: 'Confidential client notes',
|
|
854
854
|
});
|
|
855
855
|
```
|
|
856
856
|
|
package/README.md
CHANGED
|
@@ -1225,10 +1225,10 @@ Mail.configure({
|
|
|
1225
1225
|
|
|
1226
1226
|
// 2. Dispatch with attachments & HTML
|
|
1227
1227
|
await Mail.send((msg) => {
|
|
1228
|
-
msg.to('
|
|
1229
|
-
.from('billing@
|
|
1228
|
+
msg.to('customer@example.com')
|
|
1229
|
+
.from('billing@example.org', 'Billing Department')
|
|
1230
1230
|
.subject('Monthly Statement & Invoice')
|
|
1231
|
-
.html('<h1>Hello!</h1><p>Please find your
|
|
1231
|
+
.html('<h1>Hello!</h1><p>Please find your monthly invoice attached.</p>')
|
|
1232
1232
|
.attach('invoice.pdf', pdfBuffer, 'application/pdf');
|
|
1233
1233
|
});
|
|
1234
1234
|
```
|
|
@@ -1306,25 +1306,25 @@ AeroJS ships with a powerful, zero-dependency fluent HTTP client built on native
|
|
|
1306
1306
|
import { Http } from '@shohaghinfo/aerojs';
|
|
1307
1307
|
|
|
1308
1308
|
// 1. Fluent API calls
|
|
1309
|
-
const response = await Http.baseUrl('https://api.
|
|
1309
|
+
const response = await Http.baseUrl('https://api.example.com/v1')
|
|
1310
1310
|
.withToken(process.env.API_KEY!)
|
|
1311
1311
|
.withQuery({ status: 'active', limit: 50 })
|
|
1312
1312
|
.timeout(5000)
|
|
1313
1313
|
.retry(3, 200)
|
|
1314
|
-
.get('/
|
|
1314
|
+
.get('/users');
|
|
1315
1315
|
|
|
1316
1316
|
if (response.successful) {
|
|
1317
|
-
const
|
|
1318
|
-
console.log('
|
|
1317
|
+
const users = response.json();
|
|
1318
|
+
console.log('Users fetched:', users);
|
|
1319
1319
|
}
|
|
1320
1320
|
|
|
1321
1321
|
// 2. Testing Fakes (Mocking external services)
|
|
1322
1322
|
Http.fake({
|
|
1323
|
-
'/
|
|
1323
|
+
'/users': [{ id: 1, name: 'Alice Smith' }],
|
|
1324
1324
|
'/billing': Http.response({ invoiceId: 'INV-101' }, 201),
|
|
1325
1325
|
});
|
|
1326
1326
|
|
|
1327
|
-
const res = await Http.post('https://api.
|
|
1327
|
+
const res = await Http.post('https://api.example.com/v1/billing', { amount: 500 });
|
|
1328
1328
|
expect(res.status).toBe(201);
|
|
1329
1329
|
|
|
1330
1330
|
Http.assertSent((req) => req.url.includes('/billing') && req.method === 'POST');
|
|
@@ -1446,24 +1446,24 @@ Ensure HIPAA, GDPR, and PCI-DSS compliance by transparently encrypting sensitive
|
|
|
1446
1446
|
```typescript
|
|
1447
1447
|
import { Model, encrypted, Crypt } from '@shohaghinfo/aerojs';
|
|
1448
1448
|
|
|
1449
|
-
class
|
|
1450
|
-
public static override table = '
|
|
1451
|
-
public static override fillable = ['name', 'ssn', '
|
|
1452
|
-
public static override encrypted = ['ssn', '
|
|
1449
|
+
class AccountRecord extends Model {
|
|
1450
|
+
public static override table = 'accounts';
|
|
1451
|
+
public static override fillable = ['name', 'ssn', 'private_notes'];
|
|
1452
|
+
public static override encrypted = ['ssn', 'private_notes'];
|
|
1453
1453
|
|
|
1454
1454
|
@encrypted()
|
|
1455
1455
|
public ssn!: string;
|
|
1456
1456
|
}
|
|
1457
1457
|
|
|
1458
1458
|
// 1. Create - Data is stored as aero:enc:<iv>:<tag>:<ciphertext> in the database
|
|
1459
|
-
const
|
|
1459
|
+
const account = await AccountRecord.create({
|
|
1460
1460
|
name: 'Rahim Khan',
|
|
1461
1461
|
ssn: '019-99-8888',
|
|
1462
|
-
|
|
1462
|
+
private_notes: 'Confidential client information',
|
|
1463
1463
|
});
|
|
1464
1464
|
|
|
1465
1465
|
// 2. Read - Transparently decrypted on fetch
|
|
1466
|
-
const loaded = await
|
|
1466
|
+
const loaded = await AccountRecord.find(account.id);
|
|
1467
1467
|
console.log(loaded.ssn); // '019-99-8888' (Plaintext in app code)
|
|
1468
1468
|
|
|
1469
1469
|
// 3. Arbitrary payload encryption via Crypt facade:
|
|
@@ -1509,7 +1509,7 @@ const app = new Aero();
|
|
|
1509
1509
|
|
|
1510
1510
|
// Mount the dashboard with optional role-based protection
|
|
1511
1511
|
app.useQueueDashboard('/__aero/queue', {
|
|
1512
|
-
title: '
|
|
1512
|
+
title: 'AeroJS Queue Horizon',
|
|
1513
1513
|
pollInterval: 3, // auto-refresh every 3s
|
|
1514
1514
|
auth: (ctx) => ctx.session?.get('user')?.role === 'superadmin',
|
|
1515
1515
|
});
|
|
@@ -2,12 +2,11 @@
|
|
|
2
2
|
* @file audit-trail.ts
|
|
3
3
|
* @description Immutable Audit Trail System for AeroJS.
|
|
4
4
|
*
|
|
5
|
-
*
|
|
6
|
-
*
|
|
7
|
-
* ভুল এন্ট্রি হলে তা STATUS = VOID বা CANCELLED হবে এবং রিভার্সাল এন্ট্রি পড়বে।"
|
|
5
|
+
* Provides tamper-evident compliance tracking for sensitive database entities.
|
|
6
|
+
* Ensures auditable state history without destructive data loss.
|
|
8
7
|
*
|
|
9
8
|
* Stores: User ID, Table/Module, Record ID, Action, Old Value, New Value,
|
|
10
|
-
* IP Address, Timestamp,
|
|
9
|
+
* IP Address, Timestamp, Reason.
|
|
11
10
|
*/
|
|
12
11
|
export type AuditAction = 'CREATE' | 'UPDATE' | 'VOID' | 'APPROVE' | 'REJECT' | 'PRINT' | 'LOGIN' | 'LOGOUT' | 'LOCK' | 'RESTORE' | 'EXPORT';
|
|
13
12
|
export interface AuditLogEntry {
|
|
@@ -80,12 +79,12 @@ export declare class AuditTrailManager {
|
|
|
80
79
|
log(entry: AuditLogEntry): Promise<void>;
|
|
81
80
|
/**
|
|
82
81
|
* Get full history of changes for a specific record.
|
|
83
|
-
*
|
|
82
|
+
* Example: "Who modified this transaction? Show all changes."
|
|
84
83
|
*/
|
|
85
84
|
getHistory(tableName: string, recordId: string | number): Promise<AuditLogRecord[]>;
|
|
86
85
|
/**
|
|
87
86
|
* Get all activity by a specific user in a time range.
|
|
88
|
-
*
|
|
87
|
+
* Example: "Show all actions performed by user #42 today."
|
|
89
88
|
*/
|
|
90
89
|
getUserActivity(userId: string | number, from?: Date, to?: Date): Promise<AuditLogRecord[]>;
|
|
91
90
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"audit-trail.d.ts","sourceRoot":"","sources":["../../src/audit/audit-trail.ts"],"names":[],"mappings":"AAAA
|
|
1
|
+
{"version":3,"file":"audit-trail.d.ts","sourceRoot":"","sources":["../../src/audit/audit-trail.ts"],"names":[],"mappings":"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"}
|
|
@@ -2,12 +2,11 @@
|
|
|
2
2
|
* @file audit-trail.ts
|
|
3
3
|
* @description Immutable Audit Trail System for AeroJS.
|
|
4
4
|
*
|
|
5
|
-
*
|
|
6
|
-
*
|
|
7
|
-
* ভুল এন্ট্রি হলে তা STATUS = VOID বা CANCELLED হবে এবং রিভার্সাল এন্ট্রি পড়বে।"
|
|
5
|
+
* Provides tamper-evident compliance tracking for sensitive database entities.
|
|
6
|
+
* Ensures auditable state history without destructive data loss.
|
|
8
7
|
*
|
|
9
8
|
* Stores: User ID, Table/Module, Record ID, Action, Old Value, New Value,
|
|
10
|
-
* IP Address, Timestamp,
|
|
9
|
+
* IP Address, Timestamp, Reason.
|
|
11
10
|
*/
|
|
12
11
|
import { DB } from '../database/connection.js';
|
|
13
12
|
/**
|
|
@@ -107,14 +106,14 @@ export class AuditTrailManager {
|
|
|
107
106
|
}
|
|
108
107
|
/**
|
|
109
108
|
* Get full history of changes for a specific record.
|
|
110
|
-
*
|
|
109
|
+
* Example: "Who modified this transaction? Show all changes."
|
|
111
110
|
*/
|
|
112
111
|
async getHistory(tableName, recordId) {
|
|
113
112
|
return await this.driver.getHistory(tableName, recordId);
|
|
114
113
|
}
|
|
115
114
|
/**
|
|
116
115
|
* Get all activity by a specific user in a time range.
|
|
117
|
-
*
|
|
116
|
+
* Example: "Show all actions performed by user #42 today."
|
|
118
117
|
*/
|
|
119
118
|
async getUserActivity(userId, from, to) {
|
|
120
119
|
return await this.driver.getUserActivity(userId, from, to);
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"audit-trail.js","sourceRoot":"","sources":["../../src/audit/audit-trail.ts"],"names":[],"mappings":"AAAA
|
|
1
|
+
{"version":3,"file":"audit-trail.js","sourceRoot":"","sources":["../../src/audit/audit-trail.ts"],"names":[],"mappings":"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"}
|
|
@@ -2,7 +2,7 @@
|
|
|
2
2
|
* @file auth-manager.ts
|
|
3
3
|
* @description Central Auth Manager for AeroJS.
|
|
4
4
|
* Manages multiple named guards (session, jwt, api) and exposes ctx.auth.use('guard').
|
|
5
|
-
*
|
|
5
|
+
* Example: ctx.auth.use('session') for web dashboard, ctx.auth.use('jwt') for mobile API.
|
|
6
6
|
*/
|
|
7
7
|
import type { AeroContext } from '../core/context.js';
|
|
8
8
|
import type { AuthUser } from './guards/guard.js';
|
|
@@ -47,10 +47,10 @@ export declare class Auth {
|
|
|
47
47
|
* Guards are lazily instantiated per request.
|
|
48
48
|
*
|
|
49
49
|
* @example
|
|
50
|
-
* //
|
|
50
|
+
* // Web session auth
|
|
51
51
|
* await ctx.auth.use('session').authenticate();
|
|
52
52
|
*
|
|
53
|
-
* //
|
|
53
|
+
* // Mobile / API JWT auth
|
|
54
54
|
* const user = await ctx.auth.use('jwt').authenticate();
|
|
55
55
|
*/
|
|
56
56
|
use(name?: string): any;
|
|
@@ -88,8 +88,8 @@ export declare function authPlugin(manager: AuthManager, sessionManager?: Sessio
|
|
|
88
88
|
* Throws UnauthorizedError if not authenticated.
|
|
89
89
|
*
|
|
90
90
|
* @example
|
|
91
|
-
* router.get('/
|
|
92
|
-
* router.get('/api/
|
|
91
|
+
* router.get('/dashboard', handler).middleware(auth('session'));
|
|
92
|
+
* router.get('/api/users', handler).middleware(auth('jwt'));
|
|
93
93
|
*/
|
|
94
94
|
export declare function auth(guardName?: string): Middleware;
|
|
95
95
|
//# sourceMappingURL=auth-manager.d.ts.map
|
|
@@ -2,7 +2,7 @@
|
|
|
2
2
|
* @file auth-manager.ts
|
|
3
3
|
* @description Central Auth Manager for AeroJS.
|
|
4
4
|
* Manages multiple named guards (session, jwt, api) and exposes ctx.auth.use('guard').
|
|
5
|
-
*
|
|
5
|
+
* Example: ctx.auth.use('session') for web dashboard, ctx.auth.use('jwt') for mobile API.
|
|
6
6
|
*/
|
|
7
7
|
import { SessionGuard } from './guards/session-guard.js';
|
|
8
8
|
import { JwtGuard } from './guards/jwt-guard.js';
|
|
@@ -28,10 +28,10 @@ export class Auth {
|
|
|
28
28
|
* Guards are lazily instantiated per request.
|
|
29
29
|
*
|
|
30
30
|
* @example
|
|
31
|
-
* //
|
|
31
|
+
* // Web session auth
|
|
32
32
|
* await ctx.auth.use('session').authenticate();
|
|
33
33
|
*
|
|
34
|
-
* //
|
|
34
|
+
* // Mobile / API JWT auth
|
|
35
35
|
* const user = await ctx.auth.use('jwt').authenticate();
|
|
36
36
|
*/
|
|
37
37
|
use(name) {
|
|
@@ -115,8 +115,8 @@ export function authPlugin(manager, sessionManager) {
|
|
|
115
115
|
* Throws UnauthorizedError if not authenticated.
|
|
116
116
|
*
|
|
117
117
|
* @example
|
|
118
|
-
* router.get('/
|
|
119
|
-
* router.get('/api/
|
|
118
|
+
* router.get('/dashboard', handler).middleware(auth('session'));
|
|
119
|
+
* router.get('/api/users', handler).middleware(auth('jwt'));
|
|
120
120
|
*/
|
|
121
121
|
export function auth(guardName) {
|
|
122
122
|
return async (ctx, next) => {
|
package/dist/auth/bouncer.d.ts
CHANGED
|
@@ -8,10 +8,10 @@
|
|
|
8
8
|
* - Policy-based authorization: ctx.bouncer.authorize(DiscountPolicy, 'approve', discount)
|
|
9
9
|
* - Data-scoped checks: enforcing branch-level data isolation
|
|
10
10
|
*
|
|
11
|
-
*
|
|
12
|
-
* -
|
|
13
|
-
* -
|
|
14
|
-
* -
|
|
11
|
+
* Enterprise use:
|
|
12
|
+
* - Role-based authorization matrix
|
|
13
|
+
* - Maker-Checker dual control for approvals and transactions
|
|
14
|
+
* - Branch-scoped or organization-scoped data access
|
|
15
15
|
*/
|
|
16
16
|
import type { AuthUser } from '../auth/guards/guard.js';
|
|
17
17
|
import type { Middleware } from '../core/types.js';
|
|
@@ -22,7 +22,7 @@ export type PolicyConstructor = new () => PolicyContract;
|
|
|
22
22
|
export interface PermissionStore {
|
|
23
23
|
/**
|
|
24
24
|
* Returns all roles for a given user ID.
|
|
25
|
-
* Example: ['
|
|
25
|
+
* Example: ['member', 'editor', 'admin']
|
|
26
26
|
*/
|
|
27
27
|
getRoles(userId: string | number): Promise<string[]>;
|
|
28
28
|
/**
|
|
@@ -72,13 +72,7 @@ export declare class Bouncer {
|
|
|
72
72
|
*/
|
|
73
73
|
cannot(permission: string): Promise<boolean>;
|
|
74
74
|
/**
|
|
75
|
-
*
|
|
76
|
-
*
|
|
77
|
-
* Rules (Section 22):
|
|
78
|
-
* cashier → 0%
|
|
79
|
-
* supervisor → up to 5%
|
|
80
|
-
* ms → up to 15%
|
|
81
|
-
* director/ceo → unlimited
|
|
75
|
+
* Enterprise approval check: Check approval authority threshold based on role.
|
|
82
76
|
*
|
|
83
77
|
* @example
|
|
84
78
|
* if (!await ctx.bouncer.canApproveDiscount(12.5)) {
|
|
@@ -87,11 +81,10 @@ export declare class Bouncer {
|
|
|
87
81
|
*/
|
|
88
82
|
canApproveDiscount(percent: number): Promise<boolean>;
|
|
89
83
|
/**
|
|
90
|
-
*
|
|
91
|
-
* Enforces Section 25 — branch data scoping.
|
|
84
|
+
* Enterprise data scoping: Check if user belongs to a specific organizational branch or tenant.
|
|
92
85
|
*
|
|
93
86
|
* @example
|
|
94
|
-
* await ctx.bouncer.assertBranch(
|
|
87
|
+
* await ctx.bouncer.assertBranch(resource.branchId);
|
|
95
88
|
*/
|
|
96
89
|
assertBranch(resourceBranchId: string | number): Promise<void>;
|
|
97
90
|
/**
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"bouncer.d.ts","sourceRoot":"","sources":["../../src/auth/bouncer.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;GAcG;AAGH,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,yBAAyB,CAAC;AAExD,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,kBAAkB,CAAC;AAInD,MAAM,WAAW,cAAc;IAC7B,CAAC,MAAM,EAAE,MAAM,GAAG,CAAC,IAAI,EAAE,QAAQ,EAAE,GAAG,IAAI,EAAE,GAAG,EAAE,KAAK,OAAO,CAAC,OAAO,CAAC,GAAG,OAAO,CAAC;CAClF;AAED,MAAM,MAAM,iBAAiB,GAAG,UAAU,cAAc,CAAC;AAIzD,MAAM,WAAW,eAAe;IAC9B;;;OAGG;IACH,QAAQ,CAAC,MAAM,EAAE,MAAM,GAAG,MAAM,GAAG,OAAO,CAAC,MAAM,EAAE,CAAC,CAAC;IAErD;;;OAGG;IACH,cAAc,CAAC,MAAM,EAAE,MAAM,GAAG,MAAM,GAAG,OAAO,CAAC,MAAM,EAAE,CAAC,CAAC;CAC5D;AAID,qBAAa,OAAO;IAClB,OAAO,CAAC,IAAI,CAAkB;IAC9B,OAAO,CAAC,MAAM,CAAyB;IACvC,OAAO,CAAC,YAAY,CAAyB;IAC7C,OAAO,CAAC,KAAK,CAAC,CAAkB;IAChC,OAAO,CAAC,QAAQ,CAAqC;gBAEzC,IAAI,EAAE,QAAQ,GAAG,IAAI,EAAE,KAAK,CAAC,EAAE,eAAe;IAK1D;;OAEG;YACW,SAAS;IAUvB;;OAEG;YACW,eAAe;IAU7B;;;;;OAKG;IACU,EAAE,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC;IAM/C;;;;;OAKG;IACU,KAAK,CAAC,KAAK,EAAE,MAAM,EAAE,GAAG,OAAO,CAAC,OAAO,CAAC;IAMrD;;;;;OAKG;IACU,GAAG,CAAC,UAAU,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC;IAMtD;;OAEG;IACU,MAAM,CAAC,UAAU,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC;IAIzD
|
|
1
|
+
{"version":3,"file":"bouncer.d.ts","sourceRoot":"","sources":["../../src/auth/bouncer.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;GAcG;AAGH,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,yBAAyB,CAAC;AAExD,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,kBAAkB,CAAC;AAInD,MAAM,WAAW,cAAc;IAC7B,CAAC,MAAM,EAAE,MAAM,GAAG,CAAC,IAAI,EAAE,QAAQ,EAAE,GAAG,IAAI,EAAE,GAAG,EAAE,KAAK,OAAO,CAAC,OAAO,CAAC,GAAG,OAAO,CAAC;CAClF;AAED,MAAM,MAAM,iBAAiB,GAAG,UAAU,cAAc,CAAC;AAIzD,MAAM,WAAW,eAAe;IAC9B;;;OAGG;IACH,QAAQ,CAAC,MAAM,EAAE,MAAM,GAAG,MAAM,GAAG,OAAO,CAAC,MAAM,EAAE,CAAC,CAAC;IAErD;;;OAGG;IACH,cAAc,CAAC,MAAM,EAAE,MAAM,GAAG,MAAM,GAAG,OAAO,CAAC,MAAM,EAAE,CAAC,CAAC;CAC5D;AAID,qBAAa,OAAO;IAClB,OAAO,CAAC,IAAI,CAAkB;IAC9B,OAAO,CAAC,MAAM,CAAyB;IACvC,OAAO,CAAC,YAAY,CAAyB;IAC7C,OAAO,CAAC,KAAK,CAAC,CAAkB;IAChC,OAAO,CAAC,QAAQ,CAAqC;gBAEzC,IAAI,EAAE,QAAQ,GAAG,IAAI,EAAE,KAAK,CAAC,EAAE,eAAe;IAK1D;;OAEG;YACW,SAAS;IAUvB;;OAEG;YACW,eAAe;IAU7B;;;;;OAKG;IACU,EAAE,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC;IAM/C;;;;;OAKG;IACU,KAAK,CAAC,KAAK,EAAE,MAAM,EAAE,GAAG,OAAO,CAAC,OAAO,CAAC;IAMrD;;;;;OAKG;IACU,GAAG,CAAC,UAAU,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC;IAMtD;;OAEG;IACU,MAAM,CAAC,UAAU,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC;IAIzD;;;;;;;OAOG;IACU,kBAAkB,CAAC,OAAO,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC;IAUlE;;;;;OAKG;IACU,YAAY,CAAC,gBAAgB,EAAE,MAAM,GAAG,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAY3E;;;;;;;OAOG;IACU,SAAS,CACpB,WAAW,EAAE,iBAAiB,EAC9B,MAAM,EAAE,MAAM,EACd,GAAG,IAAI,EAAE,GAAG,EAAE,GACb,OAAO,CAAC,IAAI,CAAC;IAqBhB;;OAEG;IACU,QAAQ,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAMlD;;OAEG;IACU,SAAS,CAAC,UAAU,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;CAK1D;AAID,qBAAa,cAAc;IACzB,OAAO,CAAC,KAAK,CAAC,CAAkB;IAEzB,SAAS,CAAC,KAAK,EAAE,eAAe,GAAG,IAAI;IAKvC,OAAO,CAAC,IAAI,EAAE,QAAQ,GAAG,IAAI,GAAG,OAAO;CAG/C;AAED,eAAO,MAAM,cAAc,gBAAuB,CAAC;AAEnD;;;;;;GAMG;AACH,wBAAgB,aAAa,CAAC,OAAO,EAAE,cAAc,GAAG,UAAU,CAOjE;AAED;;;;;GAKG;AACH,wBAAgB,WAAW,CAAC,GAAG,KAAK,EAAE,MAAM,EAAE,GAAG,UAAU,CAS1D;AAED;;;;;GAKG;AACH,wBAAgB,iBAAiB,CAAC,UAAU,EAAE,MAAM,GAAG,UAAU,CAOhE"}
|
package/dist/auth/bouncer.js
CHANGED
|
@@ -8,10 +8,10 @@
|
|
|
8
8
|
* - Policy-based authorization: ctx.bouncer.authorize(DiscountPolicy, 'approve', discount)
|
|
9
9
|
* - Data-scoped checks: enforcing branch-level data isolation
|
|
10
10
|
*
|
|
11
|
-
*
|
|
12
|
-
* -
|
|
13
|
-
* -
|
|
14
|
-
* -
|
|
11
|
+
* Enterprise use:
|
|
12
|
+
* - Role-based authorization matrix
|
|
13
|
+
* - Maker-Checker dual control for approvals and transactions
|
|
14
|
+
* - Branch-scoped or organization-scoped data access
|
|
15
15
|
*/
|
|
16
16
|
import { ForbiddenError, UnauthorizedError } from '../core/errors.js';
|
|
17
17
|
// ─── Bouncer Core ─────────────────────────────────────────────────────────────
|
|
@@ -96,13 +96,7 @@ export class Bouncer {
|
|
|
96
96
|
return !(await this.can(permission));
|
|
97
97
|
}
|
|
98
98
|
/**
|
|
99
|
-
*
|
|
100
|
-
*
|
|
101
|
-
* Rules (Section 22):
|
|
102
|
-
* cashier → 0%
|
|
103
|
-
* supervisor → up to 5%
|
|
104
|
-
* ms → up to 15%
|
|
105
|
-
* director/ceo → unlimited
|
|
99
|
+
* Enterprise approval check: Check approval authority threshold based on role.
|
|
106
100
|
*
|
|
107
101
|
* @example
|
|
108
102
|
* if (!await ctx.bouncer.canApproveDiscount(12.5)) {
|
|
@@ -115,18 +109,17 @@ export class Bouncer {
|
|
|
115
109
|
const roles = await this.loadRoles();
|
|
116
110
|
if (roles.includes('ceo') || roles.includes('director') || roles.includes('admin'))
|
|
117
111
|
return true;
|
|
118
|
-
if (roles.includes('
|
|
112
|
+
if (roles.includes('manager') || roles.includes('lead'))
|
|
119
113
|
return percent <= 15;
|
|
120
|
-
if (roles.includes('supervisor')
|
|
114
|
+
if (roles.includes('supervisor'))
|
|
121
115
|
return percent <= 5;
|
|
122
|
-
return percent <= 0;
|
|
116
|
+
return percent <= 0;
|
|
123
117
|
}
|
|
124
118
|
/**
|
|
125
|
-
*
|
|
126
|
-
* Enforces Section 25 — branch data scoping.
|
|
119
|
+
* Enterprise data scoping: Check if user belongs to a specific organizational branch or tenant.
|
|
127
120
|
*
|
|
128
121
|
* @example
|
|
129
|
-
* await ctx.bouncer.assertBranch(
|
|
122
|
+
* await ctx.bouncer.assertBranch(resource.branchId);
|
|
130
123
|
*/
|
|
131
124
|
async assertBranch(resourceBranchId) {
|
|
132
125
|
if (!this.user)
|
package/dist/auth/bouncer.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"bouncer.js","sourceRoot":"","sources":["../../src/auth/bouncer.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;GAcG;AAIH,OAAO,EAAE,cAAc,EAAE,iBAAiB,EAAE,MAAM,mBAAmB,CAAC;AA2BtE,iFAAiF;AAEjF,MAAM,OAAO,OAAO;IACV,IAAI,CAAkB;IACtB,MAAM,GAAoB,IAAI,CAAC;IAC/B,YAAY,GAAoB,IAAI,CAAC;IACrC,KAAK,CAAmB;IACxB,QAAQ,GAAG,IAAI,GAAG,EAA0B,CAAC;IAErD,YAAY,IAAqB,EAAE,KAAuB;QACxD,IAAI,CAAC,IAAI,GAAG,IAAI,CAAC;QACjB,IAAI,CAAC,KAAK,GAAG,KAAK,CAAC;IACrB,CAAC;IAED;;OAEG;IACK,KAAK,CAAC,SAAS;QACrB,IAAI,IAAI,CAAC,MAAM,KAAK,IAAI;YAAE,OAAO,IAAI,CAAC,MAAM,CAAC;QAC7C,IAAI,CAAC,IAAI,CAAC,IAAI,IAAI,CAAC,IAAI,CAAC,KAAK,EAAE,CAAC;YAC9B,IAAI,CAAC,MAAM,GAAG,IAAI,CAAC,IAAI,EAAE,IAAI,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,IAAc,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC;QAClE,CAAC;aAAM,CAAC;YACN,IAAI,CAAC,MAAM,GAAG,MAAM,IAAI,CAAC,KAAK,CAAC,QAAQ,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;QACxD,CAAC;QACD,OAAO,IAAI,CAAC,MAAM,CAAC;IACrB,CAAC;IAED;;OAEG;IACK,KAAK,CAAC,eAAe;QAC3B,IAAI,IAAI,CAAC,YAAY,KAAK,IAAI;YAAE,OAAO,IAAI,CAAC,YAAY,CAAC;QACzD,IAAI,CAAC,IAAI,CAAC,IAAI,IAAI,CAAC,IAAI,CAAC,KAAK,EAAE,CAAC;YAC9B,IAAI,CAAC,YAAY,GAAG,EAAE,CAAC;QACzB,CAAC;aAAM,CAAC;YACN,IAAI,CAAC,YAAY,GAAG,MAAM,IAAI,CAAC,KAAK,CAAC,cAAc,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;QACpE,CAAC;QACD,OAAO,IAAI,CAAC,YAAY,CAAC;IAC3B,CAAC;IAED;;;;;OAKG;IACI,KAAK,CAAC,EAAE,CAAC,IAAY;QAC1B,IAAI,CAAC,IAAI,CAAC,IAAI;YAAE,OAAO,KAAK,CAAC;QAC7B,MAAM,KAAK,GAAG,MAAM,IAAI,CAAC,SAAS,EAAE,CAAC;QACrC,OAAO,KAAK,CAAC,QAAQ,CAAC,IAAI,CAAC,CAAC;IAC9B,CAAC;IAED;;;;;OAKG;IACI,KAAK,CAAC,KAAK,CAAC,KAAe;QAChC,IAAI,CAAC,IAAI,CAAC,IAAI;YAAE,OAAO,KAAK,CAAC;QAC7B,MAAM,SAAS,GAAG,MAAM,IAAI,CAAC,SAAS,EAAE,CAAC;QACzC,OAAO,KAAK,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,SAAS,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC,CAAC;IAClD,CAAC;IAED;;;;;OAKG;IACI,KAAK,CAAC,GAAG,CAAC,UAAkB;QACjC,IAAI,CAAC,IAAI,CAAC,IAAI;YAAE,OAAO,KAAK,CAAC;QAC7B,MAAM,WAAW,GAAG,MAAM,IAAI,CAAC,eAAe,EAAE,CAAC;QACjD,OAAO,WAAW,CAAC,QAAQ,CAAC,GAAG,CAAC,IAAI,WAAW,CAAC,QAAQ,CAAC,UAAU,CAAC,CAAC;IACvE,CAAC;IAED;;OAEG;IACI,KAAK,CAAC,MAAM,CAAC,UAAkB;QACpC,OAAO,CAAC,CAAC,MAAM,IAAI,CAAC,GAAG,CAAC,UAAU,CAAC,CAAC,CAAC;IACvC,CAAC;IAED
|
|
1
|
+
{"version":3,"file":"bouncer.js","sourceRoot":"","sources":["../../src/auth/bouncer.ts"],"names":[],"mappings":"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"}
|
|
@@ -2,7 +2,7 @@
|
|
|
2
2
|
* @file api-token-guard.ts
|
|
3
3
|
* @description Database-backed API Token Authentication Guard for AeroJS.
|
|
4
4
|
* Tokens are stored in DB, can be revoked individually, and carry scopes.
|
|
5
|
-
*
|
|
5
|
+
* Suitable for machine-to-machine integrations, webhooks, and third-party API clients.
|
|
6
6
|
*/
|
|
7
7
|
import type { AeroContext } from '../../core/context.js';
|
|
8
8
|
import type { GuardContract, AuthUser } from './guard.js';
|
|
@@ -47,7 +47,7 @@ export declare class ApiTokenGuard implements GuardContract {
|
|
|
47
47
|
check(): boolean;
|
|
48
48
|
/**
|
|
49
49
|
* Checks if the token has a specific ability/scope.
|
|
50
|
-
*
|
|
50
|
+
* Example: ctx.auth.use('api').can('orders:write')
|
|
51
51
|
*/
|
|
52
52
|
can(ability: string): boolean;
|
|
53
53
|
private extractToken;
|
|
@@ -60,8 +60,6 @@ export declare class ApiTokenGuard implements GuardContract {
|
|
|
60
60
|
/**
|
|
61
61
|
* Generates a new plain token and its SHA-256 hash.
|
|
62
62
|
* Store hashedToken in DB, show plainToken once to the user.
|
|
63
|
-
*
|
|
64
|
-
* Hospital use: Generate integration token for LIS analyzer, TPA system.
|
|
65
63
|
*/
|
|
66
64
|
static generate(prefix?: string): GeneratedToken;
|
|
67
65
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"api-token-guard.d.ts","sourceRoot":"","sources":["../../../src/auth/guards/api-token-guard.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,uBAAuB,CAAC;AACzD,OAAO,KAAK,EAAE,aAAa,EAAE,QAAQ,EAAE,MAAM,YAAY,CAAC;AAI1D,MAAM,WAAW,QAAQ;IACvB,EAAE,EAAE,MAAM,GAAG,MAAM,CAAC;IACpB,MAAM,EAAE,MAAM,GAAG,MAAM,CAAC;IACxB,KAAK,EAAE,MAAM,CAAC;IACd,IAAI,EAAE,MAAM,CAAC;IACb,SAAS,EAAE,MAAM,EAAE,CAAC;IACpB,UAAU,CAAC,EAAE,IAAI,GAAG,IAAI,CAAC;IACzB,SAAS,CAAC,EAAE,IAAI,GAAG,IAAI,CAAC;IACxB,SAAS,CAAC,EAAE,IAAI,GAAG,IAAI,CAAC;CACzB;AAED,MAAM,WAAW,mBAAmB;IAClC;;OAEG;IACH,SAAS,EAAE,CAAC,WAAW,EAAE,MAAM,KAAK,OAAO,CAAC,QAAQ,GAAG,IAAI,CAAC,CAAC;IAE7D;;OAEG;IACH,QAAQ,EAAE,CAAC,MAAM,EAAE,MAAM,GAAG,MAAM,KAAK,OAAO,CAAC,QAAQ,GAAG,IAAI,CAAC,CAAC;IAEhE;;OAEG;IACH,UAAU,CAAC,EAAE,CAAC,OAAO,EAAE,MAAM,GAAG,MAAM,KAAK,OAAO,CAAC,IAAI,CAAC,CAAC;CAC1D;AAED,MAAM,WAAW,cAAc;IAC7B,UAAU,EAAE,MAAM,CAAC;IACnB,WAAW,EAAE,MAAM,CAAC;IACpB,MAAM,EAAE,MAAM,CAAC;CAChB;AAED,qBAAa,aAAc,YAAW,aAAa;IACjD,OAAO,CAAC,KAAK,CAAyB;IACtC,OAAO,CAAC,MAAM,CAAyB;IACvC,OAAO,CAAC,QAAQ,CAAS;IACzB,OAAO,CAAC,QAAQ,CAAC,MAAM,CAAsB;IAC7C,OAAO,CAAC,GAAG,CAAc;gBAEb,GAAG,EAAE,WAAW,EAAE,MAAM,EAAE,mBAAmB;IAKlD,IAAI,IAAI,QAAQ,GAAG,IAAI;IAIvB,KAAK,IAAI,QAAQ,GAAG,IAAI;IAIxB,KAAK,IAAI,OAAO;IAIvB;;;OAGG;IACI,GAAG,CAAC,OAAO,EAAE,MAAM,GAAG,OAAO;IAKpC,OAAO,CAAC,YAAY;IAapB;;OAEG;IACH,OAAO,CAAC,SAAS;IAIJ,YAAY,IAAI,OAAO,CAAC,QAAQ,CAAC;IAgCjC,WAAW,IAAI,OAAO,CAAC,OAAO,CAAC;IAS5C
|
|
1
|
+
{"version":3,"file":"api-token-guard.d.ts","sourceRoot":"","sources":["../../../src/auth/guards/api-token-guard.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,uBAAuB,CAAC;AACzD,OAAO,KAAK,EAAE,aAAa,EAAE,QAAQ,EAAE,MAAM,YAAY,CAAC;AAI1D,MAAM,WAAW,QAAQ;IACvB,EAAE,EAAE,MAAM,GAAG,MAAM,CAAC;IACpB,MAAM,EAAE,MAAM,GAAG,MAAM,CAAC;IACxB,KAAK,EAAE,MAAM,CAAC;IACd,IAAI,EAAE,MAAM,CAAC;IACb,SAAS,EAAE,MAAM,EAAE,CAAC;IACpB,UAAU,CAAC,EAAE,IAAI,GAAG,IAAI,CAAC;IACzB,SAAS,CAAC,EAAE,IAAI,GAAG,IAAI,CAAC;IACxB,SAAS,CAAC,EAAE,IAAI,GAAG,IAAI,CAAC;CACzB;AAED,MAAM,WAAW,mBAAmB;IAClC;;OAEG;IACH,SAAS,EAAE,CAAC,WAAW,EAAE,MAAM,KAAK,OAAO,CAAC,QAAQ,GAAG,IAAI,CAAC,CAAC;IAE7D;;OAEG;IACH,QAAQ,EAAE,CAAC,MAAM,EAAE,MAAM,GAAG,MAAM,KAAK,OAAO,CAAC,QAAQ,GAAG,IAAI,CAAC,CAAC;IAEhE;;OAEG;IACH,UAAU,CAAC,EAAE,CAAC,OAAO,EAAE,MAAM,GAAG,MAAM,KAAK,OAAO,CAAC,IAAI,CAAC,CAAC;CAC1D;AAED,MAAM,WAAW,cAAc;IAC7B,UAAU,EAAE,MAAM,CAAC;IACnB,WAAW,EAAE,MAAM,CAAC;IACpB,MAAM,EAAE,MAAM,CAAC;CAChB;AAED,qBAAa,aAAc,YAAW,aAAa;IACjD,OAAO,CAAC,KAAK,CAAyB;IACtC,OAAO,CAAC,MAAM,CAAyB;IACvC,OAAO,CAAC,QAAQ,CAAS;IACzB,OAAO,CAAC,QAAQ,CAAC,MAAM,CAAsB;IAC7C,OAAO,CAAC,GAAG,CAAc;gBAEb,GAAG,EAAE,WAAW,EAAE,MAAM,EAAE,mBAAmB;IAKlD,IAAI,IAAI,QAAQ,GAAG,IAAI;IAIvB,KAAK,IAAI,QAAQ,GAAG,IAAI;IAIxB,KAAK,IAAI,OAAO;IAIvB;;;OAGG;IACI,GAAG,CAAC,OAAO,EAAE,MAAM,GAAG,OAAO;IAKpC,OAAO,CAAC,YAAY;IAapB;;OAEG;IACH,OAAO,CAAC,SAAS;IAIJ,YAAY,IAAI,OAAO,CAAC,QAAQ,CAAC;IAgCjC,WAAW,IAAI,OAAO,CAAC,OAAO,CAAC;IAS5C;;;OAGG;WACW,QAAQ,CAAC,MAAM,SAAU,GAAG,cAAc;CAMzD"}
|
|
@@ -2,7 +2,7 @@
|
|
|
2
2
|
* @file api-token-guard.ts
|
|
3
3
|
* @description Database-backed API Token Authentication Guard for AeroJS.
|
|
4
4
|
* Tokens are stored in DB, can be revoked individually, and carry scopes.
|
|
5
|
-
*
|
|
5
|
+
* Suitable for machine-to-machine integrations, webhooks, and third-party API clients.
|
|
6
6
|
*/
|
|
7
7
|
import { UnauthorizedError } from '../../core/errors.js';
|
|
8
8
|
import crypto from 'node:crypto';
|
|
@@ -27,7 +27,7 @@ export class ApiTokenGuard {
|
|
|
27
27
|
}
|
|
28
28
|
/**
|
|
29
29
|
* Checks if the token has a specific ability/scope.
|
|
30
|
-
*
|
|
30
|
+
* Example: ctx.auth.use('api').can('orders:write')
|
|
31
31
|
*/
|
|
32
32
|
can(ability) {
|
|
33
33
|
if (!this._token)
|
|
@@ -94,8 +94,6 @@ export class ApiTokenGuard {
|
|
|
94
94
|
/**
|
|
95
95
|
* Generates a new plain token and its SHA-256 hash.
|
|
96
96
|
* Store hashedToken in DB, show plainToken once to the user.
|
|
97
|
-
*
|
|
98
|
-
* Hospital use: Generate integration token for LIS analyzer, TPA system.
|
|
99
97
|
*/
|
|
100
98
|
static generate(prefix = 'aero_') {
|
|
101
99
|
const random = crypto.randomBytes(40).toString('hex');
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"api-token-guard.js","sourceRoot":"","sources":["../../../src/auth/guards/api-token-guard.ts"],"names":[],"mappings":"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
|
|
1
|
+
{"version":3,"file":"api-token-guard.js","sourceRoot":"","sources":["../../../src/auth/guards/api-token-guard.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,8 +1,7 @@
|
|
|
1
1
|
/**
|
|
2
2
|
* @file jwt-guard.ts
|
|
3
3
|
* @description JWT Authentication Guard for AeroJS.
|
|
4
|
-
* Stateless authentication for
|
|
5
|
-
* Hospital use: Doctor's mobile ward-round app authenticates via Bearer JWT token.
|
|
4
|
+
* Stateless authentication for RESTful APIs, Single-Page Applications (SPA), and Mobile Apps.
|
|
6
5
|
*/
|
|
7
6
|
import type { AeroContext } from '../../core/context.js';
|
|
8
7
|
import type { GuardContract, AuthUser } from './guard.js';
|
|
@@ -13,7 +12,7 @@ export interface JwtGuardConfig {
|
|
|
13
12
|
*/
|
|
14
13
|
secret: string;
|
|
15
14
|
/**
|
|
16
|
-
* Token expiry. Default: '8h'
|
|
15
|
+
* Token expiry. Default: '8h'.
|
|
17
16
|
*/
|
|
18
17
|
expiresIn?: string | number;
|
|
19
18
|
/**
|
|
@@ -57,7 +56,7 @@ export declare class JwtGuard implements GuardContract {
|
|
|
57
56
|
silentCheck(): Promise<boolean>;
|
|
58
57
|
/**
|
|
59
58
|
* Generates a signed JWT token pair for a user.
|
|
60
|
-
*
|
|
59
|
+
* Example: User logs in → receives { accessToken, expiresIn }.
|
|
61
60
|
*/
|
|
62
61
|
generate(user: AuthUser, options?: JwtSignOptions): JwtTokenPair;
|
|
63
62
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"jwt-guard.d.ts","sourceRoot":"","sources":["../../../src/auth/guards/jwt-guard.ts"],"names":[],"mappings":"AAAA
|
|
1
|
+
{"version":3,"file":"jwt-guard.d.ts","sourceRoot":"","sources":["../../../src/auth/guards/jwt-guard.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,uBAAuB,CAAC;AACzD,OAAO,KAAK,EAAE,aAAa,EAAE,QAAQ,EAAE,MAAM,YAAY,CAAC;AAC1D,OAAO,EAAgB,KAAK,cAAc,EAAE,MAAM,uBAAuB,CAAC;AAG1E,MAAM,WAAW,cAAc;IAC7B;;OAEG;IACH,MAAM,EAAE,MAAM,CAAC;IAEf;;OAEG;IACH,SAAS,CAAC,EAAE,MAAM,GAAG,MAAM,CAAC;IAE5B;;OAEG;IACH,QAAQ,EAAE,CAAC,EAAE,EAAE,MAAM,GAAG,MAAM,KAAK,OAAO,CAAC,QAAQ,GAAG,IAAI,CAAC,CAAC;IAE5D;;OAEG;IACH,WAAW,CAAC,EAAE,QAAQ,GAAG,QAAQ,GAAG,OAAO,CAAC;IAE5C;;OAEG;IACH,UAAU,CAAC,EAAE,MAAM,CAAC;IAEpB;;OAEG;IACH,UAAU,CAAC,EAAE,MAAM,CAAC;CACrB;AAED,MAAM,WAAW,YAAY;IAC3B,WAAW,EAAE,MAAM,CAAC;IACpB,SAAS,EAAE,MAAM,GAAG,MAAM,CAAC;IAC3B,SAAS,EAAE,QAAQ,CAAC;CACrB;AAED,qBAAa,QAAS,YAAW,aAAa;IAC5C,OAAO,CAAC,KAAK,CAAyB;IACtC,OAAO,CAAC,QAAQ,CAAS;IACzB,OAAO,CAAC,QAAQ,CAAC,MAAM,CAAiB;IACxC,OAAO,CAAC,GAAG,CAAc;gBAEb,GAAG,EAAE,WAAW,EAAE,MAAM,EAAE,cAAc;IAK7C,IAAI,IAAI,QAAQ,GAAG,IAAI;IAIvB,KAAK,IAAI,OAAO;IAIvB;;OAEG;IACH,OAAO,CAAC,YAAY;IAmBpB;;OAEG;IACU,YAAY,IAAI,OAAO,CAAC,QAAQ,CAAC;IAkCjC,WAAW,IAAI,OAAO,CAAC,OAAO,CAAC;IAS5C;;;OAGG;IACI,QAAQ,CAAC,IAAI,EAAE,QAAQ,EAAE,OAAO,GAAE,cAAmB,GAAG,YAAY;CAmB5E"}
|
|
@@ -1,8 +1,7 @@
|
|
|
1
1
|
/**
|
|
2
2
|
* @file jwt-guard.ts
|
|
3
3
|
* @description JWT Authentication Guard for AeroJS.
|
|
4
|
-
* Stateless authentication for
|
|
5
|
-
* Hospital use: Doctor's mobile ward-round app authenticates via Bearer JWT token.
|
|
4
|
+
* Stateless authentication for RESTful APIs, Single-Page Applications (SPA), and Mobile Apps.
|
|
6
5
|
*/
|
|
7
6
|
import { verify, sign } from '../../security/jwt.js';
|
|
8
7
|
import { UnauthorizedError } from '../../core/errors.js';
|
|
@@ -84,7 +83,7 @@ export class JwtGuard {
|
|
|
84
83
|
}
|
|
85
84
|
/**
|
|
86
85
|
* Generates a signed JWT token pair for a user.
|
|
87
|
-
*
|
|
86
|
+
* Example: User logs in → receives { accessToken, expiresIn }.
|
|
88
87
|
*/
|
|
89
88
|
generate(user, options = {}) {
|
|
90
89
|
const expiresIn = options.expiresIn ?? this.config.expiresIn ?? '8h';
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"jwt-guard.js","sourceRoot":"","sources":["../../../src/auth/guards/jwt-guard.ts"],"names":[],"mappings":"AAAA
|
|
1
|
+
{"version":3,"file":"jwt-guard.js","sourceRoot":"","sources":["../../../src/auth/guards/jwt-guard.ts"],"names":[],"mappings":"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"}
|