@forgedevstack/harbor 1.0.0 → 1.5.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/CHANGELOG.md +82 -101
- package/README.md +210 -794
- package/dist/auth/apiKey.d.ts +6 -0
- package/dist/auth/apiKey.d.ts.map +1 -0
- package/dist/auth/index.d.ts +7 -0
- package/dist/auth/index.d.ts.map +1 -0
- package/dist/auth/index.js +2 -0
- package/dist/auth/index.js.map +1 -0
- package/dist/auth/jwt.d.ts +21 -0
- package/dist/auth/jwt.d.ts.map +1 -0
- package/dist/auth/password.d.ts +6 -0
- package/dist/auth/password.d.ts.map +1 -0
- package/dist/auth/rbac.d.ts +6 -0
- package/dist/auth/rbac.d.ts.map +1 -0
- package/dist/auth/signing.d.ts +5 -0
- package/dist/auth/signing.d.ts.map +1 -0
- package/dist/auth/types/apiKey.types.d.ts +9 -0
- package/dist/auth/types/apiKey.types.d.ts.map +1 -0
- package/dist/auth/types/index.d.ts +5 -0
- package/dist/auth/types/index.d.ts.map +1 -0
- package/dist/auth/types/jwt.types.d.ts +17 -0
- package/dist/auth/types/jwt.types.d.ts.map +1 -0
- package/dist/auth/types/rbac.types.d.ts +8 -0
- package/dist/auth/types/rbac.types.d.ts.map +1 -0
- package/dist/auth/types/signing.types.d.ts +8 -0
- package/dist/auth/types/signing.types.d.ts.map +1 -0
- package/dist/cache/index.d.ts +4 -0
- package/dist/cache/index.d.ts.map +1 -0
- package/dist/cache/index.js +2 -0
- package/dist/cache/index.js.map +1 -0
- package/dist/cache/manager.d.ts +24 -0
- package/dist/cache/manager.d.ts.map +1 -0
- package/dist/cache/stores.d.ts +28 -0
- package/dist/cache/stores.d.ts.map +1 -0
- package/dist/cache/types.d.ts +23 -0
- package/dist/cache/types.d.ts.map +1 -0
- package/dist/cli/index.js +21 -22
- package/dist/cli/index.js.map +1 -1
- package/dist/core/config.d.ts.map +1 -1
- package/dist/core/router.d.ts +40 -2
- package/dist/core/router.d.ts.map +1 -1
- package/dist/core/server.d.ts.map +1 -1
- package/dist/database/connection.d.ts +1 -2
- package/dist/database/connection.d.ts.map +1 -1
- package/dist/database/index.js +2 -0
- package/dist/database/index.js.map +1 -0
- package/dist/database/model.d.ts +1 -4
- package/dist/database/model.d.ts.map +1 -1
- package/dist/docker/index.js +1 -1
- package/dist/http.const-BKHG1Lsj.mjs +62 -0
- package/dist/http.const-BKHG1Lsj.mjs.map +1 -0
- package/dist/http.const-Ckcy7OFp.js +2 -0
- package/dist/http.const-Ckcy7OFp.js.map +1 -0
- package/dist/index-Ca4WpLvw.js +2 -0
- package/dist/index-Ca4WpLvw.js.map +1 -0
- package/dist/index-DIVHd6rO.mjs +1054 -0
- package/dist/index-DIVHd6rO.mjs.map +1 -0
- package/dist/index.cjs.js +16 -16
- package/dist/index.cjs.js.map +1 -1
- package/dist/index.d.ts +11 -2
- package/dist/index.d.ts.map +1 -1
- package/dist/index.es.js +676 -1691
- package/dist/index.es.js.map +1 -1
- package/dist/logger-CZn7QxCl.mjs +102 -0
- package/dist/{logger-D7aJSi62.mjs.map → logger-CZn7QxCl.mjs.map} +1 -1
- package/dist/logger-D-lfaRWQ.js +3 -0
- package/dist/{logger-DEnWXtpk.js.map → logger-D-lfaRWQ.js.map} +1 -1
- package/dist/manager-CjcKb4P9.mjs +149 -0
- package/dist/{manager-B6vqJgEn.mjs.map → manager-CjcKb4P9.mjs.map} +1 -1
- package/dist/manager-DrF1vbJg.js +4 -0
- package/dist/{manager-B1UKMjXW.js.map → manager-DrF1vbJg.js.map} +1 -1
- package/dist/middleware/health.d.ts +65 -0
- package/dist/middleware/health.d.ts.map +1 -0
- package/dist/middleware/index.d.ts +5 -0
- package/dist/middleware/index.d.ts.map +1 -0
- package/dist/middleware/index.js +2 -0
- package/dist/middleware/index.js.map +1 -0
- package/dist/middleware/metrics.d.ts +68 -0
- package/dist/middleware/metrics.d.ts.map +1 -0
- package/dist/middleware/rateLimit.d.ts +52 -0
- package/dist/middleware/rateLimit.d.ts.map +1 -0
- package/dist/middleware/upload.d.ts +59 -0
- package/dist/middleware/upload.d.ts.map +1 -0
- package/dist/password-BXBkKbv3.js +2 -0
- package/dist/password-BXBkKbv3.js.map +1 -0
- package/dist/password-y4m307oa.mjs +223 -0
- package/dist/password-y4m307oa.mjs.map +1 -0
- package/dist/scheduler/index.d.ts +3 -0
- package/dist/scheduler/index.d.ts.map +1 -0
- package/dist/scheduler/index.js +2 -0
- package/dist/scheduler/index.js.map +1 -0
- package/dist/scheduler/scheduler.d.ts +30 -0
- package/dist/scheduler/scheduler.d.ts.map +1 -0
- package/dist/scheduler/types.d.ts +25 -0
- package/dist/scheduler/types.d.ts.map +1 -0
- package/dist/types/server.types.d.ts +7 -0
- package/dist/types/server.types.d.ts.map +1 -1
- package/dist/upload-9lCNnKK_.js +5 -0
- package/dist/upload-9lCNnKK_.js.map +1 -0
- package/dist/upload-DUjQiuq7.mjs +619 -0
- package/dist/upload-DUjQiuq7.mjs.map +1 -0
- package/dist/validation/index.js +1 -1
- package/dist/validation/index.js.map +1 -1
- package/dist/websocket/index.d.ts +3 -0
- package/dist/websocket/index.d.ts.map +1 -0
- package/dist/websocket/index.js +2 -0
- package/dist/websocket/index.js.map +1 -0
- package/dist/websocket/manager.d.ts +30 -0
- package/dist/websocket/manager.d.ts.map +1 -0
- package/dist/websocket/types.d.ts +27 -0
- package/dist/websocket/types.d.ts.map +1 -0
- package/package.json +58 -18
- package/templates/default/controllers/user.controller.ts +44 -64
- package/templates/default/package.json +9 -33
- package/templates/default/routes/index.ts +2 -12
- package/templates/default/routes/user.routes.ts +26 -19
- package/templates/default/server.ts +16 -35
- package/dist/logger-D7aJSi62.mjs +0 -102
- package/dist/logger-DEnWXtpk.js +0 -3
- package/dist/manager-B1UKMjXW.js +0 -4
- package/dist/manager-B6vqJgEn.mjs +0 -152
- package/dist/portal.d.ts +0 -13
- package/dist/portal.d.ts.map +0 -1
|
@@ -0,0 +1,68 @@
|
|
|
1
|
+
import { RequestHandler } from 'express';
|
|
2
|
+
|
|
3
|
+
export interface MetricsOptions {
|
|
4
|
+
path?: string;
|
|
5
|
+
prefix?: string;
|
|
6
|
+
defaultLabels?: Record<string, string>;
|
|
7
|
+
collectDefaultMetrics?: boolean;
|
|
8
|
+
requestDurationBuckets?: number[];
|
|
9
|
+
requestSizeBuckets?: number[];
|
|
10
|
+
responseSizeBuckets?: number[];
|
|
11
|
+
}
|
|
12
|
+
interface Metric {
|
|
13
|
+
name: string;
|
|
14
|
+
help: string;
|
|
15
|
+
type: 'counter' | 'gauge' | 'histogram' | 'summary';
|
|
16
|
+
values: Map<string, number | number[]>;
|
|
17
|
+
buckets?: number[];
|
|
18
|
+
}
|
|
19
|
+
export declare class MetricsRegistry {
|
|
20
|
+
private metrics;
|
|
21
|
+
private prefix;
|
|
22
|
+
private defaultLabels;
|
|
23
|
+
constructor(prefix?: string, defaultLabels?: Record<string, string>);
|
|
24
|
+
counter(name: string, help: string): Counter;
|
|
25
|
+
gauge(name: string, help: string): Gauge;
|
|
26
|
+
histogram(name: string, help: string, buckets?: number[]): Histogram;
|
|
27
|
+
getMetrics(): string;
|
|
28
|
+
reset(): void;
|
|
29
|
+
}
|
|
30
|
+
declare class Counter {
|
|
31
|
+
private metric;
|
|
32
|
+
private defaultLabels;
|
|
33
|
+
constructor(metric: Metric, defaultLabels: Record<string, string>);
|
|
34
|
+
inc(labels?: Record<string, string>, value?: number): void;
|
|
35
|
+
private labelsToString;
|
|
36
|
+
}
|
|
37
|
+
declare class Gauge {
|
|
38
|
+
private metric;
|
|
39
|
+
private defaultLabels;
|
|
40
|
+
constructor(metric: Metric, defaultLabels: Record<string, string>);
|
|
41
|
+
set(value: number, labels?: Record<string, string>): void;
|
|
42
|
+
inc(labels?: Record<string, string>, value?: number): void;
|
|
43
|
+
dec(labels?: Record<string, string>, value?: number): void;
|
|
44
|
+
private labelsToString;
|
|
45
|
+
}
|
|
46
|
+
declare class Histogram {
|
|
47
|
+
private metric;
|
|
48
|
+
private defaultLabels;
|
|
49
|
+
constructor(metric: Metric, defaultLabels: Record<string, string>);
|
|
50
|
+
observe(value: number, labels?: Record<string, string>): void;
|
|
51
|
+
startTimer(labels?: Record<string, string>): () => void;
|
|
52
|
+
private labelsToString;
|
|
53
|
+
}
|
|
54
|
+
export declare const defaultRegistry: MetricsRegistry;
|
|
55
|
+
export declare const httpRequestsTotal: Counter;
|
|
56
|
+
export declare const httpRequestDuration: Histogram;
|
|
57
|
+
export declare const httpRequestSize: Histogram;
|
|
58
|
+
export declare const httpResponseSize: Histogram;
|
|
59
|
+
/**
|
|
60
|
+
* Metrics collection middleware
|
|
61
|
+
*/
|
|
62
|
+
export declare function metricsMiddleware(): RequestHandler;
|
|
63
|
+
/**
|
|
64
|
+
* Metrics endpoint handler
|
|
65
|
+
*/
|
|
66
|
+
export declare function metricsEndpoint(registry?: MetricsRegistry): RequestHandler;
|
|
67
|
+
export { Counter, Gauge, Histogram };
|
|
68
|
+
//# sourceMappingURL=metrics.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"metrics.d.ts","sourceRoot":"","sources":["../../src/middleware/metrics.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,52 @@
|
|
|
1
|
+
import { RequestHandler } from 'express';
|
|
2
|
+
|
|
3
|
+
export interface RateLimitOptions {
|
|
4
|
+
windowMs?: number;
|
|
5
|
+
max?: number;
|
|
6
|
+
message?: string;
|
|
7
|
+
statusCode?: number;
|
|
8
|
+
keyGenerator?: (req: any) => string;
|
|
9
|
+
skip?: (req: any) => boolean;
|
|
10
|
+
onLimitReached?: (req: any, res: any) => void;
|
|
11
|
+
headers?: boolean;
|
|
12
|
+
store?: RateLimitStore;
|
|
13
|
+
}
|
|
14
|
+
export interface RateLimitStore {
|
|
15
|
+
increment(key: string): Promise<RateLimitInfo>;
|
|
16
|
+
decrement(key: string): Promise<void>;
|
|
17
|
+
resetKey(key: string): Promise<void>;
|
|
18
|
+
get(key: string): Promise<RateLimitInfo | null>;
|
|
19
|
+
}
|
|
20
|
+
export interface RateLimitInfo {
|
|
21
|
+
count: number;
|
|
22
|
+
resetTime: number;
|
|
23
|
+
}
|
|
24
|
+
export declare class RedisStore implements RateLimitStore {
|
|
25
|
+
private client;
|
|
26
|
+
private windowMs;
|
|
27
|
+
private prefix;
|
|
28
|
+
constructor(client: any, windowMs: number, prefix?: string);
|
|
29
|
+
increment(key: string): Promise<RateLimitInfo>;
|
|
30
|
+
decrement(key: string): Promise<void>;
|
|
31
|
+
resetKey(key: string): Promise<void>;
|
|
32
|
+
get(key: string): Promise<RateLimitInfo | null>;
|
|
33
|
+
}
|
|
34
|
+
/**
|
|
35
|
+
* Create a rate limiting middleware
|
|
36
|
+
*
|
|
37
|
+
* @example
|
|
38
|
+
* // Basic usage - 100 requests per 15 minutes
|
|
39
|
+
* app.use(rateLimit({ max: 100 }));
|
|
40
|
+
*
|
|
41
|
+
* // Per-route rate limiting
|
|
42
|
+
* app.post('/api/login', rateLimit({ max: 5, windowMs: 60000 }), loginHandler);
|
|
43
|
+
*
|
|
44
|
+
* // With Redis for distributed systems
|
|
45
|
+
* app.use(rateLimit({ store: new RedisStore(redisClient, 900000) }));
|
|
46
|
+
*/
|
|
47
|
+
export declare function rateLimit(options?: RateLimitOptions): RequestHandler;
|
|
48
|
+
/**
|
|
49
|
+
* Sliding window rate limiter for more accurate limiting
|
|
50
|
+
*/
|
|
51
|
+
export declare function slidingWindowRateLimit(options?: RateLimitOptions): RequestHandler;
|
|
52
|
+
//# sourceMappingURL=rateLimit.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"rateLimit.d.ts","sourceRoot":"","sources":["../../src/middleware/rateLimit.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,cAAc,EAAE,MAAM,SAAS,CAAC;AAMzC,MAAM,WAAW,gBAAgB;IAC/B,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,GAAG,CAAC,EAAE,MAAM,CAAC;IACb,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,YAAY,CAAC,EAAE,CAAC,GAAG,EAAE,GAAG,KAAK,MAAM,CAAC;IACpC,IAAI,CAAC,EAAE,CAAC,GAAG,EAAE,GAAG,KAAK,OAAO,CAAC;IAC7B,cAAc,CAAC,EAAE,CAAC,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,KAAK,IAAI,CAAC;IAC9C,OAAO,CAAC,EAAE,OAAO,CAAC;IAClB,KAAK,CAAC,EAAE,cAAc,CAAC;CACxB;AAED,MAAM,WAAW,cAAc;IAC7B,SAAS,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC,aAAa,CAAC,CAAC;IAC/C,SAAS,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;IACtC,QAAQ,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;IACrC,GAAG,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC,aAAa,GAAG,IAAI,CAAC,CAAC;CACjD;AAED,MAAM,WAAW,aAAa;IAC5B,KAAK,EAAE,MAAM,CAAC;IACd,SAAS,EAAE,MAAM,CAAC;CACnB;AAyDD,qBAAa,UAAW,YAAW,cAAc;IAC/C,OAAO,CAAC,MAAM,CAAM;IACpB,OAAO,CAAC,QAAQ,CAAS;IACzB,OAAO,CAAC,MAAM,CAAS;gBAEX,MAAM,EAAE,GAAG,EAAE,QAAQ,EAAE,MAAM,EAAE,MAAM,SAAQ;IAMnD,SAAS,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC,aAAa,CAAC;IAsB9C,SAAS,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAIrC,QAAQ,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAIpC,GAAG,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC,aAAa,GAAG,IAAI,CAAC;CActD;AAED;;;;;;;;;;;;GAYG;AACH,wBAAgB,SAAS,CAAC,OAAO,GAAE,gBAAqB,GAAG,cAAc,CAsDxE;AAED;;GAEG;AACH,wBAAgB,sBAAsB,CAAC,OAAO,GAAE,gBAAqB,GAAG,cAAc,CAsDrF"}
|
|
@@ -0,0 +1,59 @@
|
|
|
1
|
+
import { RequestHandler } from 'express';
|
|
2
|
+
|
|
3
|
+
export interface UploadOptions {
|
|
4
|
+
dest?: string;
|
|
5
|
+
limits?: {
|
|
6
|
+
fileSize?: number;
|
|
7
|
+
files?: number;
|
|
8
|
+
fields?: number;
|
|
9
|
+
fieldSize?: number;
|
|
10
|
+
};
|
|
11
|
+
allowedMimeTypes?: string[];
|
|
12
|
+
allowedExtensions?: string[];
|
|
13
|
+
filename?: (originalName: string, mimeType: string) => string;
|
|
14
|
+
storage?: 'disk' | 'memory';
|
|
15
|
+
onFileBegin?: (fieldName: string, file: UploadedFile) => void;
|
|
16
|
+
onFileEnd?: (fieldName: string, file: UploadedFile) => void;
|
|
17
|
+
onError?: (error: Error) => void;
|
|
18
|
+
}
|
|
19
|
+
export interface UploadedFile {
|
|
20
|
+
fieldName: string;
|
|
21
|
+
originalName: string;
|
|
22
|
+
mimeType: string;
|
|
23
|
+
size: number;
|
|
24
|
+
path?: string;
|
|
25
|
+
buffer?: Buffer;
|
|
26
|
+
encoding: string;
|
|
27
|
+
}
|
|
28
|
+
/**
|
|
29
|
+
* File upload middleware
|
|
30
|
+
*
|
|
31
|
+
* @example
|
|
32
|
+
* // Single file upload
|
|
33
|
+
* app.post('/upload', upload({ dest: './uploads' }), (req, res) => {
|
|
34
|
+
* console.log(req.file);
|
|
35
|
+
* res.json({ uploaded: true });
|
|
36
|
+
* });
|
|
37
|
+
*
|
|
38
|
+
* // Multiple files
|
|
39
|
+
* app.post('/uploads', upload({ dest: './uploads', limits: { files: 10 } }), (req, res) => {
|
|
40
|
+
* console.log(req.files);
|
|
41
|
+
* res.json({ count: req.files.length });
|
|
42
|
+
* });
|
|
43
|
+
*
|
|
44
|
+
* // Memory storage
|
|
45
|
+
* app.post('/buffer', upload({ storage: 'memory' }), (req, res) => {
|
|
46
|
+
* const buffer = req.file.buffer;
|
|
47
|
+
* // Process buffer...
|
|
48
|
+
* });
|
|
49
|
+
*/
|
|
50
|
+
export declare function upload(options?: UploadOptions): RequestHandler;
|
|
51
|
+
/**
|
|
52
|
+
* Validate file type helper
|
|
53
|
+
*/
|
|
54
|
+
export declare function validateFileType(file: UploadedFile, allowedTypes: string[]): boolean;
|
|
55
|
+
/**
|
|
56
|
+
* Get file extension from mime type
|
|
57
|
+
*/
|
|
58
|
+
export declare function mimeToExtension(mimeType: string): string;
|
|
59
|
+
//# sourceMappingURL=upload.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"upload.d.ts","sourceRoot":"","sources":["../../src/middleware/upload.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,cAAc,EAAE,MAAM,SAAS,CAAC;AAQzC,MAAM,WAAW,aAAa;IAC5B,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,MAAM,CAAC,EAAE;QACP,QAAQ,CAAC,EAAE,MAAM,CAAC;QAClB,KAAK,CAAC,EAAE,MAAM,CAAC;QACf,MAAM,CAAC,EAAE,MAAM,CAAC;QAChB,SAAS,CAAC,EAAE,MAAM,CAAC;KACpB,CAAC;IACF,gBAAgB,CAAC,EAAE,MAAM,EAAE,CAAC;IAC5B,iBAAiB,CAAC,EAAE,MAAM,EAAE,CAAC;IAC7B,QAAQ,CAAC,EAAE,CAAC,YAAY,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,KAAK,MAAM,CAAC;IAC9D,OAAO,CAAC,EAAE,MAAM,GAAG,QAAQ,CAAC;IAC5B,WAAW,CAAC,EAAE,CAAC,SAAS,EAAE,MAAM,EAAE,IAAI,EAAE,YAAY,KAAK,IAAI,CAAC;IAC9D,SAAS,CAAC,EAAE,CAAC,SAAS,EAAE,MAAM,EAAE,IAAI,EAAE,YAAY,KAAK,IAAI,CAAC;IAC5D,OAAO,CAAC,EAAE,CAAC,KAAK,EAAE,KAAK,KAAK,IAAI,CAAC;CAClC;AAED,MAAM,WAAW,YAAY;IAC3B,SAAS,EAAE,MAAM,CAAC;IAClB,YAAY,EAAE,MAAM,CAAC;IACrB,QAAQ,EAAE,MAAM,CAAC;IACjB,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,QAAQ,EAAE,MAAM,CAAC;CAClB;AA2ED;;;;;;;;;;;;;;;;;;;;;GAqBG;AACH,wBAAgB,MAAM,CAAC,OAAO,GAAE,aAAkB,GAAG,cAAc,CA8JlE;AAED;;GAEG;AACH,wBAAgB,gBAAgB,CAC9B,IAAI,EAAE,YAAY,EAClB,YAAY,EAAE,MAAM,EAAE,GACrB,OAAO,CAET;AAED;;GAEG;AACH,wBAAgB,eAAe,CAAC,QAAQ,EAAE,MAAM,GAAG,MAAM,CAgBxD"}
|
|
@@ -0,0 +1,2 @@
|
|
|
1
|
+
"use strict";const g=require("crypto"),y=require("./logger-D-lfaRWQ.js"),f=require("./http.const-Ckcy7OFp.js"),I=y.createLogger("auth");function d(r){return(Buffer.isBuffer(r)?r.toString("base64"):Buffer.from(r).toString("base64")).replace(/\+/g,"-").replace(/\//g,"_").replace(/=/g,"")}function p(r){r=r.replace(/-/g,"+").replace(/_/g,"/");const e=r.length%4;return e&&(r+="=".repeat(4-e)),Buffer.from(r,"base64").toString("utf8")}function P(r){return{HS256:"sha256",HS384:"sha384",HS512:"sha512"}[r]||"sha256"}class A{secret;algorithm;defaultExpiry;issuer;audience;constructor(e){this.secret=e.secret,this.algorithm=e.algorithm||"HS256",this.defaultExpiry=e.expiresIn||3600,this.issuer=e.issuer,this.audience=e.audience}sign(e,s){const n={alg:this.algorithm,typ:"JWT"},i=Math.floor(Date.now()/1e3),o={...e,iat:i,exp:i+(s||this.defaultExpiry)};this.issuer&&(o.iss=this.issuer),this.audience&&(o.aud=this.audience);const u=d(JSON.stringify(n)),t=d(JSON.stringify(o)),a=this.createSignature(`${u}.${t}`);return`${u}.${t}.${a}`}verify(e){const s=e.split(".");if(s.length!==3)throw new Error("Invalid token format");const[n,i,o]=s,u=this.createSignature(`${n}.${i}`);if(!this.safeCompare(o,u))throw new Error("Invalid signature");const t=JSON.parse(p(i)),a=Math.floor(Date.now()/1e3);if(t.exp&&t.exp<a)throw new Error("Token expired");if(t.nbf&&t.nbf>a)throw new Error("Token not yet valid");if(this.issuer&&t.iss!==this.issuer)throw new Error("Invalid issuer");if(this.audience&&t.aud!==this.audience)throw new Error("Invalid audience");return t}decode(e){try{const s=e.split(".");return s.length!==3?null:JSON.parse(p(s[1]))}catch{return null}}createSignature(e){const s=g.createHmac(P(this.algorithm),this.secret);return s.update(e),d(s.digest())}safeCompare(e,s){return e.length!==s.length?!1:g.timingSafeEqual(Buffer.from(e),Buffer.from(s))}}function w(r,e={}){return(s,n,i)=>{const o=s.get("Authorization");if(!o)return e.optional?i():n.status(f.HTTP_STATUS.UNAUTHORIZED).json({success:!1,error:{message:"No authorization header"}});const[u,t]=o.split(" ");if(u.toLowerCase()!=="bearer"||!t)return n.status(f.HTTP_STATUS.UNAUTHORIZED).json({success:!1,error:{message:"Invalid authorization format"}});try{const a=r.verify(t);s.user=a,s.token=t,i()}catch(a){const c=a;return I.debug(`JWT verification failed: ${c.message}`),n.status(f.HTTP_STATUS.UNAUTHORIZED).json({success:!1,error:{message:c.message}})}}}function E(r){return new A(r)}const v=y.createLogger("auth");function B(r){const{header:e="X-API-Key",query:s="api_key",validator:n}=r;return async(i,o,u)=>{const t=i.get(e)||i.query[s];if(!t)return o.status(f.HTTP_STATUS.UNAUTHORIZED).json({success:!1,error:{message:"API key required"}});try{const a=await n(t);if(a===!1)return o.status(f.HTTP_STATUS.UNAUTHORIZED).json({success:!1,error:{message:"Invalid API key"}});if(typeof a=="object"){if(!a.valid)return o.status(f.HTTP_STATUS.UNAUTHORIZED).json({success:!1,error:{message:"Invalid API key"}});i.apiKey=a.data}u()}catch(a){const c=a;v.error(`API key validation error: ${c.message}`),u(c)}}}function N(r=32){return g.randomBytes(r).toString("hex")}function D(r,e={}){const{roleField:s="role"}=e,n=Array.isArray(r)?r:[r];return(i,o,u)=>{const t=i.user;if(!t)return o.status(f.HTTP_STATUS.UNAUTHORIZED).json({success:!1,error:{message:"Authentication required"}});const a=t[s];if(!a||!n.includes(a))return o.status(f.HTTP_STATUS.FORBIDDEN).json({success:!1,error:{message:"Insufficient permissions"}});u()}}function O(r,e={}){const{permissionsField:s="permissions",roleField:n="role",rolePermissions:i={}}=e,o=Array.isArray(r)?r:[r];return(u,t,a)=>{const c=u.user;if(!c)return t.status(f.HTTP_STATUS.UNAUTHORIZED).json({success:!1,error:{message:"Authentication required"}});let l=c[s]||[];if(c[n]&&i[c[n]]&&(l=[...l,...i[c[n]]]),!o.every(h=>l.includes(h)))return t.status(f.HTTP_STATUS.FORBIDDEN).json({success:!1,error:{message:"Insufficient permissions"}});a()}}function R(r){const{secret:e,algorithm:s="sha256",header:n="X-Signature",timestampHeader:i="X-Timestamp",maxAge:o=3e5}=r;return(u,t,a)=>{const c=u.get(n),l=u.get(i);if(!c)return t.status(f.HTTP_STATUS.UNAUTHORIZED).json({success:!1,error:{message:"Missing signature"}});if(l&&Date.now()-parseInt(l,10)>o)return t.status(f.HTTP_STATUS.UNAUTHORIZED).json({success:!1,error:{message:"Request too old"}});const T=l?`${l}.${JSON.stringify(u.body)}`:JSON.stringify(u.body),h=g.createHmac(s,e);h.update(T);const H=h.digest("hex"),m=Buffer.from(c),S=Buffer.from(H);if(m.length!==S.length||!g.timingSafeEqual(m,S))return t.status(f.HTTP_STATUS.UNAUTHORIZED).json({success:!1,error:{message:"Invalid signature"}});a()}}function U(r,e=g.randomBytes(16).toString("hex")){return{hash:g.createHmac("sha512",e).update(r).digest("hex"),salt:e}}function _(r,e,s){const{hash:n}=U(r,s);return g.timingSafeEqual(Buffer.from(n),Buffer.from(e))}exports.JWT=A;exports.apiKeyAuth=B;exports.createJwt=E;exports.generateApiKey=N;exports.hashPassword=U;exports.jwtAuth=w;exports.requirePermission=O;exports.requireRole=D;exports.verifyPassword=_;exports.verifySignature=R;
|
|
2
|
+
//# sourceMappingURL=password-BXBkKbv3.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"password-BXBkKbv3.js","sources":["../src/auth/jwt.ts","../src/auth/apiKey.ts","../src/auth/rbac.ts","../src/auth/signing.ts","../src/auth/password.ts"],"sourcesContent":["import { createHmac, timingSafeEqual } from 'crypto';\nimport { RequestHandler } from 'express';\nimport { createLogger } from '../utils/logger';\nimport { HTTP_STATUS } from '../constants';\nimport type { JwtOptions, JwtPayload } from './types';\n\nconst logger = createLogger('auth');\n\nfunction base64UrlEncode(data: string | Buffer): string {\n const base64 = Buffer.isBuffer(data) \n ? data.toString('base64')\n : Buffer.from(data).toString('base64');\n return base64.replace(/\\+/g, '-').replace(/\\//g, '_').replace(/=/g, '');\n}\n\nfunction base64UrlDecode(str: string): string {\n str = str.replace(/-/g, '+').replace(/_/g, '/');\n const padding = str.length % 4;\n if (padding) {\n str += '='.repeat(4 - padding);\n }\n return Buffer.from(str, 'base64').toString('utf8');\n}\n\nfunction getAlgorithm(alg: string): 'sha256' | 'sha384' | 'sha512' {\n const map: Record<string, 'sha256' | 'sha384' | 'sha512'> = {\n HS256: 'sha256',\n HS384: 'sha384',\n HS512: 'sha512',\n };\n return map[alg] || 'sha256';\n}\n\nexport class JWT {\n private secret: string;\n private algorithm: string;\n private defaultExpiry: number;\n private issuer?: string;\n private audience?: string;\n\n constructor(options: JwtOptions) {\n this.secret = options.secret;\n this.algorithm = options.algorithm || 'HS256';\n this.defaultExpiry = options.expiresIn || 3600;\n this.issuer = options.issuer;\n this.audience = options.audience;\n }\n\n sign(payload: JwtPayload, expiresIn?: number): string {\n const header = { alg: this.algorithm, typ: 'JWT' };\n const now = Math.floor(Date.now() / 1000);\n\n const fullPayload: JwtPayload = {\n ...payload,\n iat: now,\n exp: now + (expiresIn || this.defaultExpiry),\n };\n\n if (this.issuer) fullPayload.iss = this.issuer;\n if (this.audience) fullPayload.aud = this.audience;\n\n const headerB64 = base64UrlEncode(JSON.stringify(header));\n const payloadB64 = base64UrlEncode(JSON.stringify(fullPayload));\n const signature = this.createSignature(`${headerB64}.${payloadB64}`);\n\n return `${headerB64}.${payloadB64}.${signature}`;\n }\n\n verify(token: string): JwtPayload {\n const parts = token.split('.');\n if (parts.length !== 3) {\n throw new Error('Invalid token format');\n }\n\n const [headerB64, payloadB64, signature] = parts;\n\n const expectedSignature = this.createSignature(`${headerB64}.${payloadB64}`);\n if (!this.safeCompare(signature, expectedSignature)) {\n throw new Error('Invalid signature');\n }\n\n const payload: JwtPayload = JSON.parse(base64UrlDecode(payloadB64));\n const now = Math.floor(Date.now() / 1000);\n\n if (payload.exp && payload.exp < now) {\n throw new Error('Token expired');\n }\n\n if (payload.nbf && payload.nbf > now) {\n throw new Error('Token not yet valid');\n }\n\n if (this.issuer && payload.iss !== this.issuer) {\n throw new Error('Invalid issuer');\n }\n\n if (this.audience && payload.aud !== this.audience) {\n throw new Error('Invalid audience');\n }\n\n return payload;\n }\n\n decode(token: string): JwtPayload | null {\n try {\n const parts = token.split('.');\n if (parts.length !== 3) return null;\n return JSON.parse(base64UrlDecode(parts[1]));\n } catch {\n return null;\n }\n }\n\n private createSignature(data: string): string {\n const hmac = createHmac(getAlgorithm(this.algorithm), this.secret);\n hmac.update(data);\n return base64UrlEncode(hmac.digest());\n }\n\n private safeCompare(a: string, b: string): boolean {\n if (a.length !== b.length) return false;\n return timingSafeEqual(Buffer.from(a), Buffer.from(b));\n }\n}\n\nexport function jwtAuth(jwt: JWT, options: { optional?: boolean } = {}): RequestHandler {\n return (req, res, next) => {\n const authHeader = req.get('Authorization');\n \n if (!authHeader) {\n if (options.optional) {\n return next();\n }\n return res.status(HTTP_STATUS.UNAUTHORIZED).json({\n success: false,\n error: { message: 'No authorization header' },\n });\n }\n\n const [scheme, token] = authHeader.split(' ');\n \n if (scheme.toLowerCase() !== 'bearer' || !token) {\n return res.status(HTTP_STATUS.UNAUTHORIZED).json({\n success: false,\n error: { message: 'Invalid authorization format' },\n });\n }\n\n try {\n const payload = jwt.verify(token);\n (req as any).user = payload;\n (req as any).token = token;\n next();\n } catch (err) {\n const error = err as Error;\n logger.debug(`JWT verification failed: ${error.message}`);\n return res.status(HTTP_STATUS.UNAUTHORIZED).json({\n success: false,\n error: { message: error.message },\n });\n }\n };\n}\n\nexport function createJwt(options: JwtOptions): JWT {\n return new JWT(options);\n}\n\n","import { RequestHandler } from 'express';\nimport { randomBytes } from 'crypto';\nimport { createLogger } from '../utils/logger';\nimport { HTTP_STATUS } from '../constants';\nimport type { ApiKeyOptions } from './types';\n\nconst logger = createLogger('auth');\n\nexport function apiKeyAuth(options: ApiKeyOptions): RequestHandler {\n const { header = 'X-API-Key', query = 'api_key', validator } = options;\n\n return async (req, res, next) => {\n const key = req.get(header) || req.query[query] as string;\n\n if (!key) {\n return res.status(HTTP_STATUS.UNAUTHORIZED).json({\n success: false,\n error: { message: 'API key required' },\n });\n }\n\n try {\n const result = await validator(key);\n \n if (result === false) {\n return res.status(HTTP_STATUS.UNAUTHORIZED).json({\n success: false,\n error: { message: 'Invalid API key' },\n });\n }\n\n if (typeof result === 'object') {\n if (!result.valid) {\n return res.status(HTTP_STATUS.UNAUTHORIZED).json({\n success: false,\n error: { message: 'Invalid API key' },\n });\n }\n (req as any).apiKey = result.data;\n }\n\n next();\n } catch (err) {\n const error = err as Error;\n logger.error(`API key validation error: ${error.message}`);\n next(error);\n }\n };\n}\n\nexport function generateApiKey(length = 32): string {\n return randomBytes(length).toString('hex');\n}\n\n","import { RequestHandler } from 'express';\nimport { HTTP_STATUS } from '../constants';\nimport type { Role, Permission, RbacOptions } from './types';\n\nexport function requireRole(roles: Role | Role[], options: RbacOptions = {}): RequestHandler {\n const { roleField = 'role' } = options;\n const allowedRoles = Array.isArray(roles) ? roles : [roles];\n\n return (req, res, next) => {\n const user = (req as any).user;\n \n if (!user) {\n return res.status(HTTP_STATUS.UNAUTHORIZED).json({\n success: false,\n error: { message: 'Authentication required' },\n });\n }\n\n const userRole = user[roleField];\n \n if (!userRole || !allowedRoles.includes(userRole)) {\n return res.status(HTTP_STATUS.FORBIDDEN).json({\n success: false,\n error: { message: 'Insufficient permissions' },\n });\n }\n\n next();\n };\n}\n\nexport function requirePermission(permissions: Permission | Permission[], options: RbacOptions = {}): RequestHandler {\n const { permissionsField = 'permissions', roleField = 'role', rolePermissions = {} } = options;\n const requiredPermissions = Array.isArray(permissions) ? permissions : [permissions];\n\n return (req, res, next) => {\n const user = (req as any).user;\n \n if (!user) {\n return res.status(HTTP_STATUS.UNAUTHORIZED).json({\n success: false,\n error: { message: 'Authentication required' },\n });\n }\n\n let userPermissions: Permission[] = user[permissionsField] || [];\n \n if (user[roleField] && rolePermissions[user[roleField]]) {\n userPermissions = [...userPermissions, ...rolePermissions[user[roleField]]];\n }\n\n const hasPermission = requiredPermissions.every((p) => userPermissions.includes(p));\n \n if (!hasPermission) {\n return res.status(HTTP_STATUS.FORBIDDEN).json({\n success: false,\n error: { message: 'Insufficient permissions' },\n });\n }\n\n next();\n };\n}\n\n","import { RequestHandler } from 'express';\nimport { createHmac, timingSafeEqual } from 'crypto';\nimport { HTTP_STATUS } from '../constants';\nimport type { SigningOptions } from './types';\n\nexport function verifySignature(options: SigningOptions): RequestHandler {\n const {\n secret,\n algorithm = 'sha256',\n header = 'X-Signature',\n timestampHeader = 'X-Timestamp',\n maxAge = 300000,\n } = options;\n\n return (req, res, next) => {\n const signature = req.get(header);\n const timestamp = req.get(timestampHeader);\n\n if (!signature) {\n return res.status(HTTP_STATUS.UNAUTHORIZED).json({\n success: false,\n error: { message: 'Missing signature' },\n });\n }\n\n if (timestamp) {\n const age = Date.now() - parseInt(timestamp, 10);\n if (age > maxAge) {\n return res.status(HTTP_STATUS.UNAUTHORIZED).json({\n success: false,\n error: { message: 'Request too old' },\n });\n }\n }\n\n const payload = timestamp\n ? `${timestamp}.${JSON.stringify(req.body)}`\n : JSON.stringify(req.body);\n \n const hmac = createHmac(algorithm, secret);\n hmac.update(payload);\n const expectedSignature = hmac.digest('hex');\n\n const sigBuffer = Buffer.from(signature);\n const expectedBuffer = Buffer.from(expectedSignature);\n\n if (sigBuffer.length !== expectedBuffer.length || !timingSafeEqual(sigBuffer, expectedBuffer)) {\n return res.status(HTTP_STATUS.UNAUTHORIZED).json({\n success: false,\n error: { message: 'Invalid signature' },\n });\n }\n\n next();\n };\n}\n\n","import { createHmac, randomBytes, timingSafeEqual } from 'crypto';\n\nexport function hashPassword(password: string, salt = randomBytes(16).toString('hex')): { hash: string; salt: string } {\n const hash = createHmac('sha512', salt).update(password).digest('hex');\n return { hash, salt };\n}\n\nexport function verifyPassword(password: string, hash: string, salt: string): boolean {\n const { hash: computed } = hashPassword(password, salt);\n return timingSafeEqual(Buffer.from(computed), Buffer.from(hash));\n}\n\n"],"names":["logger","createLogger","base64UrlEncode","data","base64UrlDecode","str","padding","getAlgorithm","alg","JWT","options","payload","expiresIn","header","now","fullPayload","headerB64","payloadB64","signature","token","parts","expectedSignature","hmac","createHmac","a","b","timingSafeEqual","jwtAuth","jwt","req","res","next","authHeader","HTTP_STATUS","scheme","err","error","createJwt","apiKeyAuth","query","validator","key","result","generateApiKey","length","randomBytes","requireRole","roles","roleField","allowedRoles","user","userRole","requirePermission","permissions","permissionsField","rolePermissions","requiredPermissions","userPermissions","p","verifySignature","secret","algorithm","timestampHeader","maxAge","timestamp","sigBuffer","expectedBuffer","hashPassword","password","salt","verifyPassword","hash","computed"],"mappings":"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"}
|
|
@@ -0,0 +1,223 @@
|
|
|
1
|
+
import { createHmac as d, timingSafeEqual as m, randomBytes as w } from "crypto";
|
|
2
|
+
import { c as S } from "./logger-CZn7QxCl.mjs";
|
|
3
|
+
import { H as f } from "./http.const-BKHG1Lsj.mjs";
|
|
4
|
+
const E = S("auth");
|
|
5
|
+
function g(s) {
|
|
6
|
+
return (Buffer.isBuffer(s) ? s.toString("base64") : Buffer.from(s).toString("base64")).replace(/\+/g, "-").replace(/\//g, "_").replace(/=/g, "");
|
|
7
|
+
}
|
|
8
|
+
function A(s) {
|
|
9
|
+
s = s.replace(/-/g, "+").replace(/_/g, "/");
|
|
10
|
+
const e = s.length % 4;
|
|
11
|
+
return e && (s += "=".repeat(4 - e)), Buffer.from(s, "base64").toString("utf8");
|
|
12
|
+
}
|
|
13
|
+
function T(s) {
|
|
14
|
+
return {
|
|
15
|
+
HS256: "sha256",
|
|
16
|
+
HS384: "sha384",
|
|
17
|
+
HS512: "sha512"
|
|
18
|
+
}[s] || "sha256";
|
|
19
|
+
}
|
|
20
|
+
class H {
|
|
21
|
+
secret;
|
|
22
|
+
algorithm;
|
|
23
|
+
defaultExpiry;
|
|
24
|
+
issuer;
|
|
25
|
+
audience;
|
|
26
|
+
constructor(e) {
|
|
27
|
+
this.secret = e.secret, this.algorithm = e.algorithm || "HS256", this.defaultExpiry = e.expiresIn || 3600, this.issuer = e.issuer, this.audience = e.audience;
|
|
28
|
+
}
|
|
29
|
+
sign(e, r) {
|
|
30
|
+
const n = { alg: this.algorithm, typ: "JWT" }, i = Math.floor(Date.now() / 1e3), o = {
|
|
31
|
+
...e,
|
|
32
|
+
iat: i,
|
|
33
|
+
exp: i + (r || this.defaultExpiry)
|
|
34
|
+
};
|
|
35
|
+
this.issuer && (o.iss = this.issuer), this.audience && (o.aud = this.audience);
|
|
36
|
+
const u = g(JSON.stringify(n)), t = g(JSON.stringify(o)), a = this.createSignature(`${u}.${t}`);
|
|
37
|
+
return `${u}.${t}.${a}`;
|
|
38
|
+
}
|
|
39
|
+
verify(e) {
|
|
40
|
+
const r = e.split(".");
|
|
41
|
+
if (r.length !== 3)
|
|
42
|
+
throw new Error("Invalid token format");
|
|
43
|
+
const [n, i, o] = r, u = this.createSignature(`${n}.${i}`);
|
|
44
|
+
if (!this.safeCompare(o, u))
|
|
45
|
+
throw new Error("Invalid signature");
|
|
46
|
+
const t = JSON.parse(A(i)), a = Math.floor(Date.now() / 1e3);
|
|
47
|
+
if (t.exp && t.exp < a)
|
|
48
|
+
throw new Error("Token expired");
|
|
49
|
+
if (t.nbf && t.nbf > a)
|
|
50
|
+
throw new Error("Token not yet valid");
|
|
51
|
+
if (this.issuer && t.iss !== this.issuer)
|
|
52
|
+
throw new Error("Invalid issuer");
|
|
53
|
+
if (this.audience && t.aud !== this.audience)
|
|
54
|
+
throw new Error("Invalid audience");
|
|
55
|
+
return t;
|
|
56
|
+
}
|
|
57
|
+
decode(e) {
|
|
58
|
+
try {
|
|
59
|
+
const r = e.split(".");
|
|
60
|
+
return r.length !== 3 ? null : JSON.parse(A(r[1]));
|
|
61
|
+
} catch {
|
|
62
|
+
return null;
|
|
63
|
+
}
|
|
64
|
+
}
|
|
65
|
+
createSignature(e) {
|
|
66
|
+
const r = d(T(this.algorithm), this.secret);
|
|
67
|
+
return r.update(e), g(r.digest());
|
|
68
|
+
}
|
|
69
|
+
safeCompare(e, r) {
|
|
70
|
+
return e.length !== r.length ? !1 : m(Buffer.from(e), Buffer.from(r));
|
|
71
|
+
}
|
|
72
|
+
}
|
|
73
|
+
function j(s, e = {}) {
|
|
74
|
+
return (r, n, i) => {
|
|
75
|
+
const o = r.get("Authorization");
|
|
76
|
+
if (!o)
|
|
77
|
+
return e.optional ? i() : n.status(f.UNAUTHORIZED).json({
|
|
78
|
+
success: !1,
|
|
79
|
+
error: { message: "No authorization header" }
|
|
80
|
+
});
|
|
81
|
+
const [u, t] = o.split(" ");
|
|
82
|
+
if (u.toLowerCase() !== "bearer" || !t)
|
|
83
|
+
return n.status(f.UNAUTHORIZED).json({
|
|
84
|
+
success: !1,
|
|
85
|
+
error: { message: "Invalid authorization format" }
|
|
86
|
+
});
|
|
87
|
+
try {
|
|
88
|
+
const a = s.verify(t);
|
|
89
|
+
r.user = a, r.token = t, i();
|
|
90
|
+
} catch (a) {
|
|
91
|
+
const c = a;
|
|
92
|
+
return E.debug(`JWT verification failed: ${c.message}`), n.status(f.UNAUTHORIZED).json({
|
|
93
|
+
success: !1,
|
|
94
|
+
error: { message: c.message }
|
|
95
|
+
});
|
|
96
|
+
}
|
|
97
|
+
};
|
|
98
|
+
}
|
|
99
|
+
function x(s) {
|
|
100
|
+
return new H(s);
|
|
101
|
+
}
|
|
102
|
+
const N = S("auth");
|
|
103
|
+
function P(s) {
|
|
104
|
+
const { header: e = "X-API-Key", query: r = "api_key", validator: n } = s;
|
|
105
|
+
return async (i, o, u) => {
|
|
106
|
+
const t = i.get(e) || i.query[r];
|
|
107
|
+
if (!t)
|
|
108
|
+
return o.status(f.UNAUTHORIZED).json({
|
|
109
|
+
success: !1,
|
|
110
|
+
error: { message: "API key required" }
|
|
111
|
+
});
|
|
112
|
+
try {
|
|
113
|
+
const a = await n(t);
|
|
114
|
+
if (a === !1)
|
|
115
|
+
return o.status(f.UNAUTHORIZED).json({
|
|
116
|
+
success: !1,
|
|
117
|
+
error: { message: "Invalid API key" }
|
|
118
|
+
});
|
|
119
|
+
if (typeof a == "object") {
|
|
120
|
+
if (!a.valid)
|
|
121
|
+
return o.status(f.UNAUTHORIZED).json({
|
|
122
|
+
success: !1,
|
|
123
|
+
error: { message: "Invalid API key" }
|
|
124
|
+
});
|
|
125
|
+
i.apiKey = a.data;
|
|
126
|
+
}
|
|
127
|
+
u();
|
|
128
|
+
} catch (a) {
|
|
129
|
+
const c = a;
|
|
130
|
+
N.error(`API key validation error: ${c.message}`), u(c);
|
|
131
|
+
}
|
|
132
|
+
};
|
|
133
|
+
}
|
|
134
|
+
function b(s = 32) {
|
|
135
|
+
return w(s).toString("hex");
|
|
136
|
+
}
|
|
137
|
+
function $(s, e = {}) {
|
|
138
|
+
const { roleField: r = "role" } = e, n = Array.isArray(s) ? s : [s];
|
|
139
|
+
return (i, o, u) => {
|
|
140
|
+
const t = i.user;
|
|
141
|
+
if (!t)
|
|
142
|
+
return o.status(f.UNAUTHORIZED).json({
|
|
143
|
+
success: !1,
|
|
144
|
+
error: { message: "Authentication required" }
|
|
145
|
+
});
|
|
146
|
+
const a = t[r];
|
|
147
|
+
if (!a || !n.includes(a))
|
|
148
|
+
return o.status(f.FORBIDDEN).json({
|
|
149
|
+
success: !1,
|
|
150
|
+
error: { message: "Insufficient permissions" }
|
|
151
|
+
});
|
|
152
|
+
u();
|
|
153
|
+
};
|
|
154
|
+
}
|
|
155
|
+
function k(s, e = {}) {
|
|
156
|
+
const { permissionsField: r = "permissions", roleField: n = "role", rolePermissions: i = {} } = e, o = Array.isArray(s) ? s : [s];
|
|
157
|
+
return (u, t, a) => {
|
|
158
|
+
const c = u.user;
|
|
159
|
+
if (!c)
|
|
160
|
+
return t.status(f.UNAUTHORIZED).json({
|
|
161
|
+
success: !1,
|
|
162
|
+
error: { message: "Authentication required" }
|
|
163
|
+
});
|
|
164
|
+
let l = c[r] || [];
|
|
165
|
+
if (c[n] && i[c[n]] && (l = [...l, ...i[c[n]]]), !o.every((h) => l.includes(h)))
|
|
166
|
+
return t.status(f.FORBIDDEN).json({
|
|
167
|
+
success: !1,
|
|
168
|
+
error: { message: "Insufficient permissions" }
|
|
169
|
+
});
|
|
170
|
+
a();
|
|
171
|
+
};
|
|
172
|
+
}
|
|
173
|
+
function J(s) {
|
|
174
|
+
const {
|
|
175
|
+
secret: e,
|
|
176
|
+
algorithm: r = "sha256",
|
|
177
|
+
header: n = "X-Signature",
|
|
178
|
+
timestampHeader: i = "X-Timestamp",
|
|
179
|
+
maxAge: o = 3e5
|
|
180
|
+
} = s;
|
|
181
|
+
return (u, t, a) => {
|
|
182
|
+
const c = u.get(n), l = u.get(i);
|
|
183
|
+
if (!c)
|
|
184
|
+
return t.status(f.UNAUTHORIZED).json({
|
|
185
|
+
success: !1,
|
|
186
|
+
error: { message: "Missing signature" }
|
|
187
|
+
});
|
|
188
|
+
if (l && Date.now() - parseInt(l, 10) > o)
|
|
189
|
+
return t.status(f.UNAUTHORIZED).json({
|
|
190
|
+
success: !1,
|
|
191
|
+
error: { message: "Request too old" }
|
|
192
|
+
});
|
|
193
|
+
const p = l ? `${l}.${JSON.stringify(u.body)}` : JSON.stringify(u.body), h = d(r, e);
|
|
194
|
+
h.update(p);
|
|
195
|
+
const U = h.digest("hex"), y = Buffer.from(c), I = Buffer.from(U);
|
|
196
|
+
if (y.length !== I.length || !m(y, I))
|
|
197
|
+
return t.status(f.UNAUTHORIZED).json({
|
|
198
|
+
success: !1,
|
|
199
|
+
error: { message: "Invalid signature" }
|
|
200
|
+
});
|
|
201
|
+
a();
|
|
202
|
+
};
|
|
203
|
+
}
|
|
204
|
+
function v(s, e = w(16).toString("hex")) {
|
|
205
|
+
return { hash: d("sha512", e).update(s).digest("hex"), salt: e };
|
|
206
|
+
}
|
|
207
|
+
function Z(s, e, r) {
|
|
208
|
+
const { hash: n } = v(s, r);
|
|
209
|
+
return m(Buffer.from(n), Buffer.from(e));
|
|
210
|
+
}
|
|
211
|
+
export {
|
|
212
|
+
H as J,
|
|
213
|
+
P as a,
|
|
214
|
+
k as b,
|
|
215
|
+
x as c,
|
|
216
|
+
Z as d,
|
|
217
|
+
b as g,
|
|
218
|
+
v as h,
|
|
219
|
+
j,
|
|
220
|
+
$ as r,
|
|
221
|
+
J as v
|
|
222
|
+
};
|
|
223
|
+
//# sourceMappingURL=password-y4m307oa.mjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"password-y4m307oa.mjs","sources":["../src/auth/jwt.ts","../src/auth/apiKey.ts","../src/auth/rbac.ts","../src/auth/signing.ts","../src/auth/password.ts"],"sourcesContent":["import { createHmac, timingSafeEqual } from 'crypto';\nimport { RequestHandler } from 'express';\nimport { createLogger } from '../utils/logger';\nimport { HTTP_STATUS } from '../constants';\nimport type { JwtOptions, JwtPayload } from './types';\n\nconst logger = createLogger('auth');\n\nfunction base64UrlEncode(data: string | Buffer): string {\n const base64 = Buffer.isBuffer(data) \n ? data.toString('base64')\n : Buffer.from(data).toString('base64');\n return base64.replace(/\\+/g, '-').replace(/\\//g, '_').replace(/=/g, '');\n}\n\nfunction base64UrlDecode(str: string): string {\n str = str.replace(/-/g, '+').replace(/_/g, '/');\n const padding = str.length % 4;\n if (padding) {\n str += '='.repeat(4 - padding);\n }\n return Buffer.from(str, 'base64').toString('utf8');\n}\n\nfunction getAlgorithm(alg: string): 'sha256' | 'sha384' | 'sha512' {\n const map: Record<string, 'sha256' | 'sha384' | 'sha512'> = {\n HS256: 'sha256',\n HS384: 'sha384',\n HS512: 'sha512',\n };\n return map[alg] || 'sha256';\n}\n\nexport class JWT {\n private secret: string;\n private algorithm: string;\n private defaultExpiry: number;\n private issuer?: string;\n private audience?: string;\n\n constructor(options: JwtOptions) {\n this.secret = options.secret;\n this.algorithm = options.algorithm || 'HS256';\n this.defaultExpiry = options.expiresIn || 3600;\n this.issuer = options.issuer;\n this.audience = options.audience;\n }\n\n sign(payload: JwtPayload, expiresIn?: number): string {\n const header = { alg: this.algorithm, typ: 'JWT' };\n const now = Math.floor(Date.now() / 1000);\n\n const fullPayload: JwtPayload = {\n ...payload,\n iat: now,\n exp: now + (expiresIn || this.defaultExpiry),\n };\n\n if (this.issuer) fullPayload.iss = this.issuer;\n if (this.audience) fullPayload.aud = this.audience;\n\n const headerB64 = base64UrlEncode(JSON.stringify(header));\n const payloadB64 = base64UrlEncode(JSON.stringify(fullPayload));\n const signature = this.createSignature(`${headerB64}.${payloadB64}`);\n\n return `${headerB64}.${payloadB64}.${signature}`;\n }\n\n verify(token: string): JwtPayload {\n const parts = token.split('.');\n if (parts.length !== 3) {\n throw new Error('Invalid token format');\n }\n\n const [headerB64, payloadB64, signature] = parts;\n\n const expectedSignature = this.createSignature(`${headerB64}.${payloadB64}`);\n if (!this.safeCompare(signature, expectedSignature)) {\n throw new Error('Invalid signature');\n }\n\n const payload: JwtPayload = JSON.parse(base64UrlDecode(payloadB64));\n const now = Math.floor(Date.now() / 1000);\n\n if (payload.exp && payload.exp < now) {\n throw new Error('Token expired');\n }\n\n if (payload.nbf && payload.nbf > now) {\n throw new Error('Token not yet valid');\n }\n\n if (this.issuer && payload.iss !== this.issuer) {\n throw new Error('Invalid issuer');\n }\n\n if (this.audience && payload.aud !== this.audience) {\n throw new Error('Invalid audience');\n }\n\n return payload;\n }\n\n decode(token: string): JwtPayload | null {\n try {\n const parts = token.split('.');\n if (parts.length !== 3) return null;\n return JSON.parse(base64UrlDecode(parts[1]));\n } catch {\n return null;\n }\n }\n\n private createSignature(data: string): string {\n const hmac = createHmac(getAlgorithm(this.algorithm), this.secret);\n hmac.update(data);\n return base64UrlEncode(hmac.digest());\n }\n\n private safeCompare(a: string, b: string): boolean {\n if (a.length !== b.length) return false;\n return timingSafeEqual(Buffer.from(a), Buffer.from(b));\n }\n}\n\nexport function jwtAuth(jwt: JWT, options: { optional?: boolean } = {}): RequestHandler {\n return (req, res, next) => {\n const authHeader = req.get('Authorization');\n \n if (!authHeader) {\n if (options.optional) {\n return next();\n }\n return res.status(HTTP_STATUS.UNAUTHORIZED).json({\n success: false,\n error: { message: 'No authorization header' },\n });\n }\n\n const [scheme, token] = authHeader.split(' ');\n \n if (scheme.toLowerCase() !== 'bearer' || !token) {\n return res.status(HTTP_STATUS.UNAUTHORIZED).json({\n success: false,\n error: { message: 'Invalid authorization format' },\n });\n }\n\n try {\n const payload = jwt.verify(token);\n (req as any).user = payload;\n (req as any).token = token;\n next();\n } catch (err) {\n const error = err as Error;\n logger.debug(`JWT verification failed: ${error.message}`);\n return res.status(HTTP_STATUS.UNAUTHORIZED).json({\n success: false,\n error: { message: error.message },\n });\n }\n };\n}\n\nexport function createJwt(options: JwtOptions): JWT {\n return new JWT(options);\n}\n\n","import { RequestHandler } from 'express';\nimport { randomBytes } from 'crypto';\nimport { createLogger } from '../utils/logger';\nimport { HTTP_STATUS } from '../constants';\nimport type { ApiKeyOptions } from './types';\n\nconst logger = createLogger('auth');\n\nexport function apiKeyAuth(options: ApiKeyOptions): RequestHandler {\n const { header = 'X-API-Key', query = 'api_key', validator } = options;\n\n return async (req, res, next) => {\n const key = req.get(header) || req.query[query] as string;\n\n if (!key) {\n return res.status(HTTP_STATUS.UNAUTHORIZED).json({\n success: false,\n error: { message: 'API key required' },\n });\n }\n\n try {\n const result = await validator(key);\n \n if (result === false) {\n return res.status(HTTP_STATUS.UNAUTHORIZED).json({\n success: false,\n error: { message: 'Invalid API key' },\n });\n }\n\n if (typeof result === 'object') {\n if (!result.valid) {\n return res.status(HTTP_STATUS.UNAUTHORIZED).json({\n success: false,\n error: { message: 'Invalid API key' },\n });\n }\n (req as any).apiKey = result.data;\n }\n\n next();\n } catch (err) {\n const error = err as Error;\n logger.error(`API key validation error: ${error.message}`);\n next(error);\n }\n };\n}\n\nexport function generateApiKey(length = 32): string {\n return randomBytes(length).toString('hex');\n}\n\n","import { RequestHandler } from 'express';\nimport { HTTP_STATUS } from '../constants';\nimport type { Role, Permission, RbacOptions } from './types';\n\nexport function requireRole(roles: Role | Role[], options: RbacOptions = {}): RequestHandler {\n const { roleField = 'role' } = options;\n const allowedRoles = Array.isArray(roles) ? roles : [roles];\n\n return (req, res, next) => {\n const user = (req as any).user;\n \n if (!user) {\n return res.status(HTTP_STATUS.UNAUTHORIZED).json({\n success: false,\n error: { message: 'Authentication required' },\n });\n }\n\n const userRole = user[roleField];\n \n if (!userRole || !allowedRoles.includes(userRole)) {\n return res.status(HTTP_STATUS.FORBIDDEN).json({\n success: false,\n error: { message: 'Insufficient permissions' },\n });\n }\n\n next();\n };\n}\n\nexport function requirePermission(permissions: Permission | Permission[], options: RbacOptions = {}): RequestHandler {\n const { permissionsField = 'permissions', roleField = 'role', rolePermissions = {} } = options;\n const requiredPermissions = Array.isArray(permissions) ? permissions : [permissions];\n\n return (req, res, next) => {\n const user = (req as any).user;\n \n if (!user) {\n return res.status(HTTP_STATUS.UNAUTHORIZED).json({\n success: false,\n error: { message: 'Authentication required' },\n });\n }\n\n let userPermissions: Permission[] = user[permissionsField] || [];\n \n if (user[roleField] && rolePermissions[user[roleField]]) {\n userPermissions = [...userPermissions, ...rolePermissions[user[roleField]]];\n }\n\n const hasPermission = requiredPermissions.every((p) => userPermissions.includes(p));\n \n if (!hasPermission) {\n return res.status(HTTP_STATUS.FORBIDDEN).json({\n success: false,\n error: { message: 'Insufficient permissions' },\n });\n }\n\n next();\n };\n}\n\n","import { RequestHandler } from 'express';\nimport { createHmac, timingSafeEqual } from 'crypto';\nimport { HTTP_STATUS } from '../constants';\nimport type { SigningOptions } from './types';\n\nexport function verifySignature(options: SigningOptions): RequestHandler {\n const {\n secret,\n algorithm = 'sha256',\n header = 'X-Signature',\n timestampHeader = 'X-Timestamp',\n maxAge = 300000,\n } = options;\n\n return (req, res, next) => {\n const signature = req.get(header);\n const timestamp = req.get(timestampHeader);\n\n if (!signature) {\n return res.status(HTTP_STATUS.UNAUTHORIZED).json({\n success: false,\n error: { message: 'Missing signature' },\n });\n }\n\n if (timestamp) {\n const age = Date.now() - parseInt(timestamp, 10);\n if (age > maxAge) {\n return res.status(HTTP_STATUS.UNAUTHORIZED).json({\n success: false,\n error: { message: 'Request too old' },\n });\n }\n }\n\n const payload = timestamp\n ? `${timestamp}.${JSON.stringify(req.body)}`\n : JSON.stringify(req.body);\n \n const hmac = createHmac(algorithm, secret);\n hmac.update(payload);\n const expectedSignature = hmac.digest('hex');\n\n const sigBuffer = Buffer.from(signature);\n const expectedBuffer = Buffer.from(expectedSignature);\n\n if (sigBuffer.length !== expectedBuffer.length || !timingSafeEqual(sigBuffer, expectedBuffer)) {\n return res.status(HTTP_STATUS.UNAUTHORIZED).json({\n success: false,\n error: { message: 'Invalid signature' },\n });\n }\n\n next();\n };\n}\n\n","import { createHmac, randomBytes, timingSafeEqual } from 'crypto';\n\nexport function hashPassword(password: string, salt = randomBytes(16).toString('hex')): { hash: string; salt: string } {\n const hash = createHmac('sha512', salt).update(password).digest('hex');\n return { hash, salt };\n}\n\nexport function verifyPassword(password: string, hash: string, salt: string): boolean {\n const { hash: computed } = hashPassword(password, salt);\n return timingSafeEqual(Buffer.from(computed), Buffer.from(hash));\n}\n\n"],"names":["logger","createLogger","base64UrlEncode","data","base64UrlDecode","str","padding","getAlgorithm","alg","JWT","options","payload","expiresIn","header","now","fullPayload","headerB64","payloadB64","signature","token","parts","expectedSignature","hmac","createHmac","a","b","timingSafeEqual","jwtAuth","jwt","req","res","next","authHeader","HTTP_STATUS","scheme","err","error","createJwt","apiKeyAuth","query","validator","key","result","generateApiKey","length","randomBytes","requireRole","roles","roleField","allowedRoles","user","userRole","requirePermission","permissions","permissionsField","rolePermissions","requiredPermissions","userPermissions","p","verifySignature","secret","algorithm","timestampHeader","maxAge","timestamp","sigBuffer","expectedBuffer","hashPassword","password","salt","verifyPassword","hash","computed"],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/scheduler/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,eAAe,EAAE,MAAM,aAAa,CAAC;AACzD,YAAY,EAAE,GAAG,EAAE,gBAAgB,EAAE,MAAM,SAAS,CAAC"}
|
|
@@ -0,0 +1,2 @@
|
|
|
1
|
+
"use strict";Object.defineProperty(exports,Symbol.toStringTag,{value:"Module"});const f=require("../logger-D-lfaRWQ.js"),o=f.createLogger("scheduler");class d{jobs=new Map;timers=new Map;options;running=!1;constructor(e={}){this.options=e}cron(e,t,s){const n=this.generateId(),r={id:n,name:e,schedule:t,handler:s,enabled:!0,lastRun:null,nextRun:this.getNextCronRun(t),runCount:0,errors:0};return this.jobs.set(n,r),this.running&&this.scheduleJob(r),o.info(`Scheduled cron job: ${e} (${t})`),r}every(e,t,s){const n=this.parseInterval(e),r=this.generateId(),i={id:r,name:t,schedule:n,handler:s,enabled:!0,lastRun:null,nextRun:new Date(Date.now()+n),runCount:0,errors:0};return this.jobs.set(r,i),this.running&&this.scheduleIntervalJob(i),o.info(`Scheduled interval job: ${t} (every ${e})`),i}at(e,t,s){const n=this.generateId(),r=e.getTime()-Date.now();if(r<0)throw new Error(`Cannot schedule job in the past: ${e}`);const i={id:n,name:t,schedule:e.getTime(),handler:s,enabled:!0,lastRun:null,nextRun:e,runCount:0,errors:0};if(this.jobs.set(n,i),this.running){const u=setTimeout(()=>this.runJob(i),r);this.timers.set(n,u)}return o.info(`Scheduled one-time job: ${t} at ${e.toISOString()}`),i}start(){this.running||(this.running=!0,this.jobs.forEach(e=>{typeof e.schedule=="string"?this.scheduleJob(e):this.scheduleIntervalJob(e)}),o.info("Scheduler started"))}stop(){this.running=!1,this.timers.forEach(e=>clearTimeout(e)),this.timers.clear(),o.info("Scheduler stopped")}cancel(e){const t=this.timers.get(e);return t&&(clearTimeout(t),this.timers.delete(e)),this.jobs.delete(e)}pause(e){const t=this.jobs.get(e);if(t){t.enabled=!1;const s=this.timers.get(e);return s&&(clearTimeout(s),this.timers.delete(e)),!0}return!1}resume(e){const t=this.jobs.get(e);return t?(t.enabled=!0,this.running&&(typeof t.schedule=="string"?this.scheduleJob(t):this.scheduleIntervalJob(t)),!0):!1}getJob(e){return this.jobs.get(e)}getJobs(){return Array.from(this.jobs.values())}async runJob(e){if(!e.enabled)return;const t=Date.now();this.options.onJobStart?.(e);try{await e.handler(),e.lastRun=new Date,e.runCount++;const s=Date.now()-t;this.options.onJobComplete?.(e,s),o.debug(`Job ${e.name} completed in ${s}ms`)}catch(s){const n=s;e.errors++,o.error(`Job ${e.name} failed: ${n.message}`),this.options.onJobError?.(e,n)}typeof e.schedule=="string"?(e.nextRun=this.getNextCronRun(e.schedule),this.scheduleJob(e)):typeof e.schedule=="number"&&e.schedule>0&&(e.nextRun=new Date(Date.now()+e.schedule),this.scheduleIntervalJob(e))}scheduleJob(e){if(!e.nextRun)return;const t=e.nextRun.getTime()-Date.now();if(t<0){e.nextRun=this.getNextCronRun(e.schedule),this.scheduleJob(e);return}const s=setTimeout(()=>this.runJob(e),t);this.timers.set(e.id,s)}scheduleIntervalJob(e){const t=e.schedule,s=setTimeout(()=>this.runJob(e),t);this.timers.set(e.id,s)}parseInterval(e){const t=e.match(/^(\d+)(s|m|h|d|w)$/);if(!t)throw new Error(`Invalid interval format: ${e}`);const s=parseInt(t[1],10),n=t[2],r={s:1e3,m:60*1e3,h:60*60*1e3,d:24*60*60*1e3,w:7*24*60*60*1e3};return s*r[n]}getNextCronRun(e){const t=this.parseCron(e),s=new Date,n=new Date(s);for(let r=0;r<366*24*60;r++)if(n.setMinutes(n.getMinutes()+1),n.setSeconds(0),n.setMilliseconds(0),this.matchesCron(n,t))return n;throw new Error(`Could not find next run for: ${e}`)}parseCron(e){const t=e.split(" ");if(t.length!==5)throw new Error(`Invalid cron expression: ${e}`);return{minute:this.parseCronField(t[0],0,59),hour:this.parseCronField(t[1],0,23),dayOfMonth:this.parseCronField(t[2],1,31),month:this.parseCronField(t[3],1,12),dayOfWeek:this.parseCronField(t[4],0,6)}}parseCronField(e,t,s){if(e==="*")return Array.from({length:s-t+1},(r,i)=>t+i);const n=[];return e.split(",").forEach(r=>{if(r.includes("/")){const[i,u]=r.split("/"),l=parseInt(u,10);(i==="*"?Array.from({length:s-t+1},(a,h)=>t+h):this.parseCronField(i,t,s)).forEach((a,h)=>{h%l===0&&n.push(a)})}else if(r.includes("-")){const[i,u]=r.split("-").map(Number);for(let l=i;l<=u;l++)n.push(l)}else n.push(parseInt(r,10))}),[...new Set(n)].sort((r,i)=>r-i)}matchesCron(e,t){return t.minute.includes(e.getMinutes())&&t.hour.includes(e.getHours())&&t.dayOfMonth.includes(e.getDate())&&t.month.includes(e.getMonth()+1)&&t.dayOfWeek.includes(e.getDay())}generateId(){return`job_${Date.now()}_${Math.random().toString(36).substring(2,9)}`}}function g(c){return new d(c)}exports.Scheduler=d;exports.createScheduler=g;
|
|
2
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sources":["../../src/scheduler/scheduler.ts"],"sourcesContent":["import { createLogger } from '../utils/logger';\nimport type { Job, SchedulerOptions, ParsedCron } from './types';\n\nconst logger = createLogger('scheduler');\n\nexport class Scheduler {\n private jobs: Map<string, Job> = new Map();\n private timers: Map<string, NodeJS.Timeout> = new Map();\n private options: SchedulerOptions;\n private running = false;\n\n constructor(options: SchedulerOptions = {}) {\n this.options = options;\n }\n\n cron(name: string, expression: string, handler: () => void | Promise<void>): Job {\n const id = this.generateId();\n const job: Job = {\n id,\n name,\n schedule: expression,\n handler,\n enabled: true,\n lastRun: null,\n nextRun: this.getNextCronRun(expression),\n runCount: 0,\n errors: 0,\n };\n\n this.jobs.set(id, job);\n if (this.running) {\n this.scheduleJob(job);\n }\n\n logger.info(`Scheduled cron job: ${name} (${expression})`);\n return job;\n }\n\n every(interval: string, name: string, handler: () => void | Promise<void>): Job {\n const ms = this.parseInterval(interval);\n const id = this.generateId();\n const job: Job = {\n id,\n name,\n schedule: ms,\n handler,\n enabled: true,\n lastRun: null,\n nextRun: new Date(Date.now() + ms),\n runCount: 0,\n errors: 0,\n };\n\n this.jobs.set(id, job);\n if (this.running) {\n this.scheduleIntervalJob(job);\n }\n\n logger.info(`Scheduled interval job: ${name} (every ${interval})`);\n return job;\n }\n\n at(date: Date, name: string, handler: () => void | Promise<void>): Job {\n const id = this.generateId();\n const delay = date.getTime() - Date.now();\n\n if (delay < 0) {\n throw new Error(`Cannot schedule job in the past: ${date}`);\n }\n\n const job: Job = {\n id,\n name,\n schedule: date.getTime(),\n handler,\n enabled: true,\n lastRun: null,\n nextRun: date,\n runCount: 0,\n errors: 0,\n };\n\n this.jobs.set(id, job);\n if (this.running) {\n const timer = setTimeout(() => this.runJob(job), delay);\n this.timers.set(id, timer);\n }\n\n logger.info(`Scheduled one-time job: ${name} at ${date.toISOString()}`);\n return job;\n }\n\n start(): void {\n if (this.running) return;\n this.running = true;\n\n this.jobs.forEach((job) => {\n if (typeof job.schedule === 'string') {\n this.scheduleJob(job);\n } else {\n this.scheduleIntervalJob(job);\n }\n });\n\n logger.info('Scheduler started');\n }\n\n stop(): void {\n this.running = false;\n this.timers.forEach((timer) => clearTimeout(timer));\n this.timers.clear();\n logger.info('Scheduler stopped');\n }\n\n cancel(jobId: string): boolean {\n const timer = this.timers.get(jobId);\n if (timer) {\n clearTimeout(timer);\n this.timers.delete(jobId);\n }\n return this.jobs.delete(jobId);\n }\n\n pause(jobId: string): boolean {\n const job = this.jobs.get(jobId);\n if (job) {\n job.enabled = false;\n const timer = this.timers.get(jobId);\n if (timer) {\n clearTimeout(timer);\n this.timers.delete(jobId);\n }\n return true;\n }\n return false;\n }\n\n resume(jobId: string): boolean {\n const job = this.jobs.get(jobId);\n if (job) {\n job.enabled = true;\n if (this.running) {\n if (typeof job.schedule === 'string') {\n this.scheduleJob(job);\n } else {\n this.scheduleIntervalJob(job);\n }\n }\n return true;\n }\n return false;\n }\n\n getJob(jobId: string): Job | undefined {\n return this.jobs.get(jobId);\n }\n\n getJobs(): Job[] {\n return Array.from(this.jobs.values());\n }\n\n private async runJob(job: Job): Promise<void> {\n if (!job.enabled) return;\n\n const startTime = Date.now();\n this.options.onJobStart?.(job);\n\n try {\n await job.handler();\n job.lastRun = new Date();\n job.runCount++;\n const duration = Date.now() - startTime;\n this.options.onJobComplete?.(job, duration);\n logger.debug(`Job ${job.name} completed in ${duration}ms`);\n } catch (err) {\n const error = err as Error;\n job.errors++;\n logger.error(`Job ${job.name} failed: ${error.message}`);\n this.options.onJobError?.(job, error);\n }\n\n if (typeof job.schedule === 'string') {\n job.nextRun = this.getNextCronRun(job.schedule);\n this.scheduleJob(job);\n } else if (typeof job.schedule === 'number' && job.schedule > 0) {\n job.nextRun = new Date(Date.now() + job.schedule);\n this.scheduleIntervalJob(job);\n }\n }\n\n private scheduleJob(job: Job): void {\n if (!job.nextRun) return;\n\n const delay = job.nextRun.getTime() - Date.now();\n if (delay < 0) {\n job.nextRun = this.getNextCronRun(job.schedule as string);\n this.scheduleJob(job);\n return;\n }\n\n const timer = setTimeout(() => this.runJob(job), delay);\n this.timers.set(job.id, timer);\n }\n\n private scheduleIntervalJob(job: Job): void {\n const interval = job.schedule as number;\n const timer = setTimeout(() => this.runJob(job), interval);\n this.timers.set(job.id, timer);\n }\n\n private parseInterval(interval: string): number {\n const match = interval.match(/^(\\d+)(s|m|h|d|w)$/);\n if (!match) {\n throw new Error(`Invalid interval format: ${interval}`);\n }\n\n const value = parseInt(match[1], 10);\n const unit = match[2];\n\n const multipliers: Record<string, number> = {\n s: 1000,\n m: 60 * 1000,\n h: 60 * 60 * 1000,\n d: 24 * 60 * 60 * 1000,\n w: 7 * 24 * 60 * 60 * 1000,\n };\n\n return value * multipliers[unit];\n }\n\n private getNextCronRun(expression: string): Date {\n const parsed = this.parseCron(expression);\n const now = new Date();\n const next = new Date(now);\n\n for (let i = 0; i < 366 * 24 * 60; i++) {\n next.setMinutes(next.getMinutes() + 1);\n next.setSeconds(0);\n next.setMilliseconds(0);\n\n if (this.matchesCron(next, parsed)) {\n return next;\n }\n }\n\n throw new Error(`Could not find next run for: ${expression}`);\n }\n\n private parseCron(expression: string): ParsedCron {\n const parts = expression.split(' ');\n if (parts.length !== 5) {\n throw new Error(`Invalid cron expression: ${expression}`);\n }\n\n return {\n minute: this.parseCronField(parts[0], 0, 59),\n hour: this.parseCronField(parts[1], 0, 23),\n dayOfMonth: this.parseCronField(parts[2], 1, 31),\n month: this.parseCronField(parts[3], 1, 12),\n dayOfWeek: this.parseCronField(parts[4], 0, 6),\n };\n }\n\n private parseCronField(field: string, min: number, max: number): number[] {\n if (field === '*') {\n return Array.from({ length: max - min + 1 }, (_, i) => min + i);\n }\n\n const values: number[] = [];\n\n field.split(',').forEach((part) => {\n if (part.includes('/')) {\n const [range, step] = part.split('/');\n const stepNum = parseInt(step, 10);\n const rangeValues = range === '*' \n ? Array.from({ length: max - min + 1 }, (_, i) => min + i)\n : this.parseCronField(range, min, max);\n rangeValues.forEach((v, i) => {\n if (i % stepNum === 0) values.push(v);\n });\n } else if (part.includes('-')) {\n const [start, end] = part.split('-').map(Number);\n for (let i = start; i <= end; i++) {\n values.push(i);\n }\n } else {\n values.push(parseInt(part, 10));\n }\n });\n\n return [...new Set(values)].sort((a, b) => a - b);\n }\n\n private matchesCron(date: Date, parsed: ParsedCron): boolean {\n return (\n parsed.minute.includes(date.getMinutes()) &&\n parsed.hour.includes(date.getHours()) &&\n parsed.dayOfMonth.includes(date.getDate()) &&\n parsed.month.includes(date.getMonth() + 1) &&\n parsed.dayOfWeek.includes(date.getDay())\n );\n }\n\n private generateId(): string {\n return `job_${Date.now()}_${Math.random().toString(36).substring(2, 9)}`;\n }\n}\n\nexport function createScheduler(options?: SchedulerOptions): Scheduler {\n return new Scheduler(options);\n}\n\n"],"names":["logger","createLogger","Scheduler","options","name","expression","handler","id","job","interval","ms","date","delay","timer","jobId","startTime","duration","err","error","match","value","unit","multipliers","parsed","now","next","i","parts","field","min","max","_","values","part","range","step","stepNum","v","start","end","a","b","createScheduler"],"mappings":"yHAGMA,EAASC,EAAAA,aAAa,WAAW,EAEhC,MAAMC,CAAU,CACb,SAA6B,IAC7B,WAA0C,IAC1C,QACA,QAAU,GAElB,YAAYC,EAA4B,GAAI,CAC1C,KAAK,QAAUA,CACjB,CAEA,KAAKC,EAAcC,EAAoBC,EAA0C,CAC/E,MAAMC,EAAK,KAAK,WAAA,EACVC,EAAW,CACf,GAAAD,EACA,KAAAH,EACA,SAAUC,EACV,QAAAC,EACA,QAAS,GACT,QAAS,KACT,QAAS,KAAK,eAAeD,CAAU,EACvC,SAAU,EACV,OAAQ,CAAA,EAGV,YAAK,KAAK,IAAIE,EAAIC,CAAG,EACjB,KAAK,SACP,KAAK,YAAYA,CAAG,EAGtBR,EAAO,KAAK,uBAAuBI,CAAI,KAAKC,CAAU,GAAG,EAClDG,CACT,CAEA,MAAMC,EAAkBL,EAAcE,EAA0C,CAC9E,MAAMI,EAAK,KAAK,cAAcD,CAAQ,EAChCF,EAAK,KAAK,WAAA,EACVC,EAAW,CACf,GAAAD,EACA,KAAAH,EACA,SAAUM,EACV,QAAAJ,EACA,QAAS,GACT,QAAS,KACT,QAAS,IAAI,KAAK,KAAK,IAAA,EAAQI,CAAE,EACjC,SAAU,EACV,OAAQ,CAAA,EAGV,YAAK,KAAK,IAAIH,EAAIC,CAAG,EACjB,KAAK,SACP,KAAK,oBAAoBA,CAAG,EAG9BR,EAAO,KAAK,2BAA2BI,CAAI,WAAWK,CAAQ,GAAG,EAC1DD,CACT,CAEA,GAAGG,EAAYP,EAAcE,EAA0C,CACrE,MAAMC,EAAK,KAAK,WAAA,EACVK,EAAQD,EAAK,QAAA,EAAY,KAAK,IAAA,EAEpC,GAAIC,EAAQ,EACV,MAAM,IAAI,MAAM,oCAAoCD,CAAI,EAAE,EAG5D,MAAMH,EAAW,CACf,GAAAD,EACA,KAAAH,EACA,SAAUO,EAAK,QAAA,EACf,QAAAL,EACA,QAAS,GACT,QAAS,KACT,QAASK,EACT,SAAU,EACV,OAAQ,CAAA,EAIV,GADA,KAAK,KAAK,IAAIJ,EAAIC,CAAG,EACjB,KAAK,QAAS,CAChB,MAAMK,EAAQ,WAAW,IAAM,KAAK,OAAOL,CAAG,EAAGI,CAAK,EACtD,KAAK,OAAO,IAAIL,EAAIM,CAAK,CAC3B,CAEA,OAAAb,EAAO,KAAK,2BAA2BI,CAAI,OAAOO,EAAK,YAAA,CAAa,EAAE,EAC/DH,CACT,CAEA,OAAc,CACR,KAAK,UACT,KAAK,QAAU,GAEf,KAAK,KAAK,QAASA,GAAQ,CACrB,OAAOA,EAAI,UAAa,SAC1B,KAAK,YAAYA,CAAG,EAEpB,KAAK,oBAAoBA,CAAG,CAEhC,CAAC,EAEDR,EAAO,KAAK,mBAAmB,EACjC,CAEA,MAAa,CACX,KAAK,QAAU,GACf,KAAK,OAAO,QAASa,GAAU,aAAaA,CAAK,CAAC,EAClD,KAAK,OAAO,MAAA,EACZb,EAAO,KAAK,mBAAmB,CACjC,CAEA,OAAOc,EAAwB,CAC7B,MAAMD,EAAQ,KAAK,OAAO,IAAIC,CAAK,EACnC,OAAID,IACF,aAAaA,CAAK,EAClB,KAAK,OAAO,OAAOC,CAAK,GAEnB,KAAK,KAAK,OAAOA,CAAK,CAC/B,CAEA,MAAMA,EAAwB,CAC5B,MAAMN,EAAM,KAAK,KAAK,IAAIM,CAAK,EAC/B,GAAIN,EAAK,CACPA,EAAI,QAAU,GACd,MAAMK,EAAQ,KAAK,OAAO,IAAIC,CAAK,EACnC,OAAID,IACF,aAAaA,CAAK,EAClB,KAAK,OAAO,OAAOC,CAAK,GAEnB,EACT,CACA,MAAO,EACT,CAEA,OAAOA,EAAwB,CAC7B,MAAMN,EAAM,KAAK,KAAK,IAAIM,CAAK,EAC/B,OAAIN,GACFA,EAAI,QAAU,GACV,KAAK,UACH,OAAOA,EAAI,UAAa,SAC1B,KAAK,YAAYA,CAAG,EAEpB,KAAK,oBAAoBA,CAAG,GAGzB,IAEF,EACT,CAEA,OAAOM,EAAgC,CACrC,OAAO,KAAK,KAAK,IAAIA,CAAK,CAC5B,CAEA,SAAiB,CACf,OAAO,MAAM,KAAK,KAAK,KAAK,QAAQ,CACtC,CAEA,MAAc,OAAON,EAAyB,CAC5C,GAAI,CAACA,EAAI,QAAS,OAElB,MAAMO,EAAY,KAAK,IAAA,EACvB,KAAK,QAAQ,aAAaP,CAAG,EAE7B,GAAI,CACF,MAAMA,EAAI,QAAA,EACVA,EAAI,YAAc,KAClBA,EAAI,WACJ,MAAMQ,EAAW,KAAK,IAAA,EAAQD,EAC9B,KAAK,QAAQ,gBAAgBP,EAAKQ,CAAQ,EAC1ChB,EAAO,MAAM,OAAOQ,EAAI,IAAI,iBAAiBQ,CAAQ,IAAI,CAC3D,OAASC,EAAK,CACZ,MAAMC,EAAQD,EACdT,EAAI,SACJR,EAAO,MAAM,OAAOQ,EAAI,IAAI,YAAYU,EAAM,OAAO,EAAE,EACvD,KAAK,QAAQ,aAAaV,EAAKU,CAAK,CACtC,CAEI,OAAOV,EAAI,UAAa,UAC1BA,EAAI,QAAU,KAAK,eAAeA,EAAI,QAAQ,EAC9C,KAAK,YAAYA,CAAG,GACX,OAAOA,EAAI,UAAa,UAAYA,EAAI,SAAW,IAC5DA,EAAI,QAAU,IAAI,KAAK,KAAK,IAAA,EAAQA,EAAI,QAAQ,EAChD,KAAK,oBAAoBA,CAAG,EAEhC,CAEQ,YAAYA,EAAgB,CAClC,GAAI,CAACA,EAAI,QAAS,OAElB,MAAMI,EAAQJ,EAAI,QAAQ,QAAA,EAAY,KAAK,IAAA,EAC3C,GAAII,EAAQ,EAAG,CACbJ,EAAI,QAAU,KAAK,eAAeA,EAAI,QAAkB,EACxD,KAAK,YAAYA,CAAG,EACpB,MACF,CAEA,MAAMK,EAAQ,WAAW,IAAM,KAAK,OAAOL,CAAG,EAAGI,CAAK,EACtD,KAAK,OAAO,IAAIJ,EAAI,GAAIK,CAAK,CAC/B,CAEQ,oBAAoBL,EAAgB,CAC1C,MAAMC,EAAWD,EAAI,SACfK,EAAQ,WAAW,IAAM,KAAK,OAAOL,CAAG,EAAGC,CAAQ,EACzD,KAAK,OAAO,IAAID,EAAI,GAAIK,CAAK,CAC/B,CAEQ,cAAcJ,EAA0B,CAC9C,MAAMU,EAAQV,EAAS,MAAM,oBAAoB,EACjD,GAAI,CAACU,EACH,MAAM,IAAI,MAAM,4BAA4BV,CAAQ,EAAE,EAGxD,MAAMW,EAAQ,SAASD,EAAM,CAAC,EAAG,EAAE,EAC7BE,EAAOF,EAAM,CAAC,EAEdG,EAAsC,CAC1C,EAAG,IACH,EAAG,GAAK,IACR,EAAG,GAAK,GAAK,IACb,EAAG,GAAK,GAAK,GAAK,IAClB,EAAG,EAAI,GAAK,GAAK,GAAK,GAAA,EAGxB,OAAOF,EAAQE,EAAYD,CAAI,CACjC,CAEQ,eAAehB,EAA0B,CAC/C,MAAMkB,EAAS,KAAK,UAAUlB,CAAU,EAClCmB,MAAU,KACVC,EAAO,IAAI,KAAKD,CAAG,EAEzB,QAASE,EAAI,EAAGA,EAAI,IAAM,GAAK,GAAIA,IAKjC,GAJAD,EAAK,WAAWA,EAAK,WAAA,EAAe,CAAC,EACrCA,EAAK,WAAW,CAAC,EACjBA,EAAK,gBAAgB,CAAC,EAElB,KAAK,YAAYA,EAAMF,CAAM,EAC/B,OAAOE,EAIX,MAAM,IAAI,MAAM,gCAAgCpB,CAAU,EAAE,CAC9D,CAEQ,UAAUA,EAAgC,CAChD,MAAMsB,EAAQtB,EAAW,MAAM,GAAG,EAClC,GAAIsB,EAAM,SAAW,EACnB,MAAM,IAAI,MAAM,4BAA4BtB,CAAU,EAAE,EAG1D,MAAO,CACL,OAAQ,KAAK,eAAesB,EAAM,CAAC,EAAG,EAAG,EAAE,EAC3C,KAAM,KAAK,eAAeA,EAAM,CAAC,EAAG,EAAG,EAAE,EACzC,WAAY,KAAK,eAAeA,EAAM,CAAC,EAAG,EAAG,EAAE,EAC/C,MAAO,KAAK,eAAeA,EAAM,CAAC,EAAG,EAAG,EAAE,EAC1C,UAAW,KAAK,eAAeA,EAAM,CAAC,EAAG,EAAG,CAAC,CAAA,CAEjD,CAEQ,eAAeC,EAAeC,EAAaC,EAAuB,CACxE,GAAIF,IAAU,IACZ,OAAO,MAAM,KAAK,CAAE,OAAQE,EAAMD,EAAM,CAAA,EAAK,CAACE,EAAG,IAAMF,EAAM,CAAC,EAGhE,MAAMG,EAAmB,CAAA,EAEzB,OAAAJ,EAAM,MAAM,GAAG,EAAE,QAASK,GAAS,CACjC,GAAIA,EAAK,SAAS,GAAG,EAAG,CACtB,KAAM,CAACC,EAAOC,CAAI,EAAIF,EAAK,MAAM,GAAG,EAC9BG,EAAU,SAASD,EAAM,EAAE,GACbD,IAAU,IAC1B,MAAM,KAAK,CAAE,OAAQJ,EAAMD,EAAM,CAAA,EAAK,CAACE,EAAGL,IAAMG,EAAMH,CAAC,EACvD,KAAK,eAAeQ,EAAOL,EAAKC,CAAG,GAC3B,QAAQ,CAACO,EAAGX,IAAM,CACxBA,EAAIU,IAAY,GAAGJ,EAAO,KAAKK,CAAC,CACtC,CAAC,CACH,SAAWJ,EAAK,SAAS,GAAG,EAAG,CAC7B,KAAM,CAACK,EAAOC,CAAG,EAAIN,EAAK,MAAM,GAAG,EAAE,IAAI,MAAM,EAC/C,QAASP,EAAIY,EAAOZ,GAAKa,EAAKb,IAC5BM,EAAO,KAAKN,CAAC,CAEjB,MACEM,EAAO,KAAK,SAASC,EAAM,EAAE,CAAC,CAElC,CAAC,EAEM,CAAC,GAAG,IAAI,IAAID,CAAM,CAAC,EAAE,KAAK,CAACQ,EAAGC,IAAMD,EAAIC,CAAC,CAClD,CAEQ,YAAY9B,EAAYY,EAA6B,CAC3D,OACEA,EAAO,OAAO,SAASZ,EAAK,YAAY,GACxCY,EAAO,KAAK,SAASZ,EAAK,SAAA,CAAU,GACpCY,EAAO,WAAW,SAASZ,EAAK,QAAA,CAAS,GACzCY,EAAO,MAAM,SAASZ,EAAK,SAAA,EAAa,CAAC,GACzCY,EAAO,UAAU,SAASZ,EAAK,QAAQ,CAE3C,CAEQ,YAAqB,CAC3B,MAAO,OAAO,KAAK,IAAA,CAAK,IAAI,KAAK,OAAA,EAAS,SAAS,EAAE,EAAE,UAAU,EAAG,CAAC,CAAC,EACxE,CACF,CAEO,SAAS+B,EAAgBvC,EAAuC,CACrE,OAAO,IAAID,EAAUC,CAAO,CAC9B"}
|
|
@@ -0,0 +1,30 @@
|
|
|
1
|
+
import { Job, SchedulerOptions } from './types';
|
|
2
|
+
|
|
3
|
+
export declare class Scheduler {
|
|
4
|
+
private jobs;
|
|
5
|
+
private timers;
|
|
6
|
+
private options;
|
|
7
|
+
private running;
|
|
8
|
+
constructor(options?: SchedulerOptions);
|
|
9
|
+
cron(name: string, expression: string, handler: () => void | Promise<void>): Job;
|
|
10
|
+
every(interval: string, name: string, handler: () => void | Promise<void>): Job;
|
|
11
|
+
at(date: Date, name: string, handler: () => void | Promise<void>): Job;
|
|
12
|
+
start(): void;
|
|
13
|
+
stop(): void;
|
|
14
|
+
cancel(jobId: string): boolean;
|
|
15
|
+
pause(jobId: string): boolean;
|
|
16
|
+
resume(jobId: string): boolean;
|
|
17
|
+
getJob(jobId: string): Job | undefined;
|
|
18
|
+
getJobs(): Job[];
|
|
19
|
+
private runJob;
|
|
20
|
+
private scheduleJob;
|
|
21
|
+
private scheduleIntervalJob;
|
|
22
|
+
private parseInterval;
|
|
23
|
+
private getNextCronRun;
|
|
24
|
+
private parseCron;
|
|
25
|
+
private parseCronField;
|
|
26
|
+
private matchesCron;
|
|
27
|
+
private generateId;
|
|
28
|
+
}
|
|
29
|
+
export declare function createScheduler(options?: SchedulerOptions): Scheduler;
|
|
30
|
+
//# sourceMappingURL=scheduler.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"scheduler.d.ts","sourceRoot":"","sources":["../../src/scheduler/scheduler.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,GAAG,EAAE,gBAAgB,EAAc,MAAM,SAAS,CAAC;AAIjE,qBAAa,SAAS;IACpB,OAAO,CAAC,IAAI,CAA+B;IAC3C,OAAO,CAAC,MAAM,CAA0C;IACxD,OAAO,CAAC,OAAO,CAAmB;IAClC,OAAO,CAAC,OAAO,CAAS;gBAEZ,OAAO,GAAE,gBAAqB;IAI1C,IAAI,CAAC,IAAI,EAAE,MAAM,EAAE,UAAU,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,IAAI,GAAG,OAAO,CAAC,IAAI,CAAC,GAAG,GAAG;IAuBhF,KAAK,CAAC,QAAQ,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,IAAI,GAAG,OAAO,CAAC,IAAI,CAAC,GAAG,GAAG;IAwB/E,EAAE,CAAC,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,IAAI,GAAG,OAAO,CAAC,IAAI,CAAC,GAAG,GAAG;IA8BtE,KAAK,IAAI,IAAI;IAeb,IAAI,IAAI,IAAI;IAOZ,MAAM,CAAC,KAAK,EAAE,MAAM,GAAG,OAAO;IAS9B,KAAK,CAAC,KAAK,EAAE,MAAM,GAAG,OAAO;IAc7B,MAAM,CAAC,KAAK,EAAE,MAAM,GAAG,OAAO;IAgB9B,MAAM,CAAC,KAAK,EAAE,MAAM,GAAG,GAAG,GAAG,SAAS;IAItC,OAAO,IAAI,GAAG,EAAE;YAIF,MAAM;IA6BpB,OAAO,CAAC,WAAW;IAcnB,OAAO,CAAC,mBAAmB;IAM3B,OAAO,CAAC,aAAa;IAoBrB,OAAO,CAAC,cAAc;IAkBtB,OAAO,CAAC,SAAS;IAejB,OAAO,CAAC,cAAc;IA8BtB,OAAO,CAAC,WAAW;IAUnB,OAAO,CAAC,UAAU;CAGnB;AAED,wBAAgB,eAAe,CAAC,OAAO,CAAC,EAAE,gBAAgB,GAAG,SAAS,CAErE"}
|