splp-nodejs 1.0.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/LICENSE +21 -0
- package/README.md +35 -0
- package/dist/config/index.d.ts +139 -0
- package/dist/config/index.d.ts.map +1 -0
- package/dist/config/index.js +258 -0
- package/dist/config/index.js.map +1 -0
- package/dist/lib/crypto/json-encryptor.d.ts +149 -0
- package/dist/lib/crypto/json-encryptor.d.ts.map +1 -0
- package/dist/lib/crypto/json-encryptor.js +568 -0
- package/dist/lib/crypto/json-encryptor.js.map +1 -0
- package/dist/lib/index.d.ts +18 -0
- package/dist/lib/index.d.ts.map +1 -0
- package/dist/lib/index.js +18 -0
- package/dist/lib/index.js.map +1 -0
- package/dist/lib/kafka/kafka-wrapper.d.ts +27 -0
- package/dist/lib/kafka/kafka-wrapper.d.ts.map +1 -0
- package/dist/lib/kafka/kafka-wrapper.js +206 -0
- package/dist/lib/kafka/kafka-wrapper.js.map +1 -0
- package/dist/lib/tracing/tracer.d.ts +19 -0
- package/dist/lib/tracing/tracer.d.ts.map +1 -0
- package/dist/lib/tracing/tracer.js +147 -0
- package/dist/lib/tracing/tracer.js.map +1 -0
- package/dist/lib/utils/circuit-breaker.d.ts +27 -0
- package/dist/lib/utils/circuit-breaker.d.ts.map +1 -0
- package/dist/lib/utils/circuit-breaker.js +56 -0
- package/dist/lib/utils/circuit-breaker.js.map +1 -0
- package/dist/lib/utils/request-id.d.ts +3 -0
- package/dist/lib/utils/request-id.d.ts.map +1 -0
- package/dist/lib/utils/request-id.js +9 -0
- package/dist/lib/utils/request-id.js.map +1 -0
- package/dist/lib/utils/retry-manager.d.ts +42 -0
- package/dist/lib/utils/retry-manager.d.ts.map +1 -0
- package/dist/lib/utils/retry-manager.js +69 -0
- package/dist/lib/utils/retry-manager.js.map +1 -0
- package/dist/lib/utils/sanitizer.d.ts +32 -0
- package/dist/lib/utils/sanitizer.d.ts.map +1 -0
- package/dist/lib/utils/sanitizer.js +235 -0
- package/dist/lib/utils/sanitizer.js.map +1 -0
- package/dist/types/index.d.ts +115 -0
- package/dist/types/index.d.ts.map +1 -0
- package/dist/types/index.js +2 -0
- package/dist/types/index.js.map +1 -0
- package/package.json +61 -0
|
@@ -0,0 +1,69 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Retry Mechanism with Exponential Backoff
|
|
3
|
+
* Provides automatic retry for transient failures
|
|
4
|
+
*/
|
|
5
|
+
export class RetryManager {
|
|
6
|
+
config;
|
|
7
|
+
constructor(config) {
|
|
8
|
+
this.config = config;
|
|
9
|
+
}
|
|
10
|
+
async execute(fn, isRetryableError) {
|
|
11
|
+
let lastError;
|
|
12
|
+
for (let attempt = 1; attempt <= this.config.maxAttempts; attempt++) {
|
|
13
|
+
try {
|
|
14
|
+
return await fn();
|
|
15
|
+
}
|
|
16
|
+
catch (error) {
|
|
17
|
+
lastError = error;
|
|
18
|
+
if (isRetryableError && !isRetryableError(lastError)) {
|
|
19
|
+
throw lastError;
|
|
20
|
+
}
|
|
21
|
+
if (attempt === this.config.maxAttempts) {
|
|
22
|
+
throw lastError;
|
|
23
|
+
}
|
|
24
|
+
const delay = this.calculateDelay(attempt);
|
|
25
|
+
console.log(`Attempt ${attempt} failed, retrying in ${delay}ms...`);
|
|
26
|
+
await this.sleep(delay);
|
|
27
|
+
}
|
|
28
|
+
}
|
|
29
|
+
throw lastError;
|
|
30
|
+
}
|
|
31
|
+
calculateDelay(attempt) {
|
|
32
|
+
const exponentialDelay = this.config.baseDelay *
|
|
33
|
+
Math.pow(this.config.backoffMultiplier, attempt - 1);
|
|
34
|
+
const cappedDelay = Math.min(exponentialDelay, this.config.maxDelay);
|
|
35
|
+
if (this.config.jitter) {
|
|
36
|
+
const jitterRange = cappedDelay * 0.25;
|
|
37
|
+
const jitter = (Math.random() - 0.5) * 2 * jitterRange;
|
|
38
|
+
return Math.max(0, cappedDelay + jitter);
|
|
39
|
+
}
|
|
40
|
+
return cappedDelay;
|
|
41
|
+
}
|
|
42
|
+
sleep(ms) {
|
|
43
|
+
return new Promise(resolve => setTimeout(resolve, ms));
|
|
44
|
+
}
|
|
45
|
+
}
|
|
46
|
+
export const RetryConfigs = {
|
|
47
|
+
FAST: {
|
|
48
|
+
maxAttempts: 3,
|
|
49
|
+
baseDelay: 100,
|
|
50
|
+
maxDelay: 1000,
|
|
51
|
+
backoffMultiplier: 2,
|
|
52
|
+
jitter: true
|
|
53
|
+
},
|
|
54
|
+
STANDARD: {
|
|
55
|
+
maxAttempts: 5,
|
|
56
|
+
baseDelay: 500,
|
|
57
|
+
maxDelay: 5000,
|
|
58
|
+
backoffMultiplier: 2,
|
|
59
|
+
jitter: true
|
|
60
|
+
},
|
|
61
|
+
SLOW: {
|
|
62
|
+
maxAttempts: 3,
|
|
63
|
+
baseDelay: 2000,
|
|
64
|
+
maxDelay: 10000,
|
|
65
|
+
backoffMultiplier: 2,
|
|
66
|
+
jitter: true
|
|
67
|
+
}
|
|
68
|
+
};
|
|
69
|
+
//# sourceMappingURL=retry-manager.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"retry-manager.js","sourceRoot":"","sources":["../../../lib/utils/retry-manager.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAUH,MAAM,OAAO,YAAY;IACf,MAAM,CAAc;IAE5B,YAAY,MAAmB;QAC7B,IAAI,CAAC,MAAM,GAAG,MAAM,CAAC;IACvB,CAAC;IAED,KAAK,CAAC,OAAO,CACX,EAAoB,EACpB,gBAA4C;QAE5C,IAAI,SAAgB,CAAC;QAErB,KAAK,IAAI,OAAO,GAAG,CAAC,EAAE,OAAO,IAAI,IAAI,CAAC,MAAM,CAAC,WAAW,EAAE,OAAO,EAAE,EAAE,CAAC;YACpE,IAAI,CAAC;gBACH,OAAO,MAAM,EAAE,EAAE,CAAC;YACpB,CAAC;YAAC,OAAO,KAAK,EAAE,CAAC;gBACf,SAAS,GAAG,KAAc,CAAC;gBAE3B,IAAI,gBAAgB,IAAI,CAAC,gBAAgB,CAAC,SAAS,CAAC,EAAE,CAAC;oBACrD,MAAM,SAAS,CAAC;gBAClB,CAAC;gBAED,IAAI,OAAO,KAAK,IAAI,CAAC,MAAM,CAAC,WAAW,EAAE,CAAC;oBACxC,MAAM,SAAS,CAAC;gBAClB,CAAC;gBAED,MAAM,KAAK,GAAG,IAAI,CAAC,cAAc,CAAC,OAAO,CAAC,CAAC;gBAC3C,OAAO,CAAC,GAAG,CAAC,WAAW,OAAO,wBAAwB,KAAK,OAAO,CAAC,CAAC;gBAEpE,MAAM,IAAI,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC;YAC1B,CAAC;QACH,CAAC;QAED,MAAM,SAAU,CAAC;IACnB,CAAC;IAEO,cAAc,CAAC,OAAe;QACpC,MAAM,gBAAgB,GAAG,IAAI,CAAC,MAAM,CAAC,SAAS;YAC5C,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC,MAAM,CAAC,iBAAiB,EAAE,OAAO,GAAG,CAAC,CAAC,CAAC;QAEvD,MAAM,WAAW,GAAG,IAAI,CAAC,GAAG,CAAC,gBAAgB,EAAE,IAAI,CAAC,MAAM,CAAC,QAAQ,CAAC,CAAC;QAErE,IAAI,IAAI,CAAC,MAAM,CAAC,MAAM,EAAE,CAAC;YACvB,MAAM,WAAW,GAAG,WAAW,GAAG,IAAI,CAAC;YACvC,MAAM,MAAM,GAAG,CAAC,IAAI,CAAC,MAAM,EAAE,GAAG,GAAG,CAAC,GAAG,CAAC,GAAG,WAAW,CAAC;YACvD,OAAO,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,WAAW,GAAG,MAAM,CAAC,CAAC;QAC3C,CAAC;QAED,OAAO,WAAW,CAAC;IACrB,CAAC;IAEO,KAAK,CAAC,EAAU;QACtB,OAAO,IAAI,OAAO,CAAC,OAAO,CAAC,EAAE,CAAC,UAAU,CAAC,OAAO,EAAE,EAAE,CAAC,CAAC,CAAC;IACzD,CAAC;CACF;AAED,MAAM,CAAC,MAAM,YAAY,GAAG;IAC1B,IAAI,EAAE;QACJ,WAAW,EAAE,CAAC;QACd,SAAS,EAAE,GAAG;QACd,QAAQ,EAAE,IAAI;QACd,iBAAiB,EAAE,CAAC;QACpB,MAAM,EAAE,IAAI;KACb;IAED,QAAQ,EAAE;QACR,WAAW,EAAE,CAAC;QACd,SAAS,EAAE,GAAG;QACd,QAAQ,EAAE,IAAI;QACd,iBAAiB,EAAE,CAAC;QACpB,MAAM,EAAE,IAAI;KACb;IAED,IAAI,EAAE;QACJ,WAAW,EAAE,CAAC;QACd,SAAS,EAAE,IAAI;QACf,QAAQ,EAAE,KAAK;QACf,iBAAiB,EAAE,CAAC;QACpB,MAAM,EAAE,IAAI;KACb;CACO,CAAC"}
|
|
@@ -0,0 +1,32 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Security Sanitization and Validation Utilities
|
|
3
|
+
* Protects against XSS, injection attacks, and malformed payloads
|
|
4
|
+
*/
|
|
5
|
+
export interface SanitizerOptions {
|
|
6
|
+
maxStringLength?: number;
|
|
7
|
+
maxObjectDepth?: number;
|
|
8
|
+
maxArrayLength?: number;
|
|
9
|
+
allowedKeys?: string[];
|
|
10
|
+
strictMode?: boolean;
|
|
11
|
+
skipXSSFields?: string[];
|
|
12
|
+
}
|
|
13
|
+
export declare class SecurityError extends Error {
|
|
14
|
+
code: string;
|
|
15
|
+
constructor(message: string, code: string);
|
|
16
|
+
}
|
|
17
|
+
export declare function sanitizeXSS(input: string): string;
|
|
18
|
+
export declare function sanitizeInjection(input: string, maxLength?: number): string;
|
|
19
|
+
export declare function validateRequestId(requestId: unknown): string;
|
|
20
|
+
export declare function validateIdentifier(identifier: unknown, fieldName?: string): string;
|
|
21
|
+
export declare function sanitizeObject(obj: any, options?: SanitizerOptions, depth?: number, currentFieldName?: string): any;
|
|
22
|
+
export declare function parseJSONSafely<T = any>(jsonString: string, options?: SanitizerOptions): T;
|
|
23
|
+
export declare function validateEncryptedMessage(msg: any): void;
|
|
24
|
+
export declare class RateLimiter {
|
|
25
|
+
private maxRequests;
|
|
26
|
+
private windowMs;
|
|
27
|
+
private requests;
|
|
28
|
+
constructor(maxRequests?: number, windowMs?: number);
|
|
29
|
+
isAllowed(identifier: string): boolean;
|
|
30
|
+
cleanup(): void;
|
|
31
|
+
}
|
|
32
|
+
//# sourceMappingURL=sanitizer.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"sanitizer.d.ts","sourceRoot":"","sources":["../../../lib/utils/sanitizer.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,MAAM,WAAW,gBAAgB;IAC/B,eAAe,CAAC,EAAE,MAAM,CAAC;IACzB,cAAc,CAAC,EAAE,MAAM,CAAC;IACxB,cAAc,CAAC,EAAE,MAAM,CAAC;IACxB,WAAW,CAAC,EAAE,MAAM,EAAE,CAAC;IACvB,UAAU,CAAC,EAAE,OAAO,CAAC;IACrB,aAAa,CAAC,EAAE,MAAM,EAAE,CAAC;CAC1B;AAED,qBAAa,aAAc,SAAQ,KAAK;IACF,IAAI,EAAE,MAAM;gBAApC,OAAO,EAAE,MAAM,EAAS,IAAI,EAAE,MAAM;CAIjD;AAED,wBAAgB,WAAW,CAAC,KAAK,EAAE,MAAM,GAAG,MAAM,CAqBjD;AAED,wBAAgB,iBAAiB,CAAC,KAAK,EAAE,MAAM,EAAE,SAAS,GAAE,MAAa,GAAG,MAAM,CAiEjF;AAED,wBAAgB,iBAAiB,CAAC,SAAS,EAAE,OAAO,GAAG,MAAM,CAe5D;AAED,wBAAgB,kBAAkB,CAChC,UAAU,EAAE,OAAO,EACnB,SAAS,GAAE,MAAqB,GAC/B,MAAM,CAkBR;AAED,wBAAgB,cAAc,CAC5B,GAAG,EAAE,GAAG,EACR,OAAO,GAAE,gBAAqB,EAC9B,KAAK,GAAE,MAAU,EACjB,gBAAgB,CAAC,EAAE,MAAM,GACxB,GAAG,CAuFL;AAED,wBAAgB,eAAe,CAAC,CAAC,GAAG,GAAG,EACrC,UAAU,EAAE,MAAM,EAClB,OAAO,GAAE,gBAAqB,GAC7B,CAAC,CAgDH;AAED,wBAAgB,wBAAwB,CAAC,GAAG,EAAE,GAAG,GAAG,IAAI,CAgCvD;AAED,qBAAa,WAAW;IAIpB,OAAO,CAAC,WAAW;IACnB,OAAO,CAAC,QAAQ;IAJlB,OAAO,CAAC,QAAQ,CAAoC;gBAG1C,WAAW,GAAE,MAAY,EACzB,QAAQ,GAAE,MAAc;IAGlC,SAAS,CAAC,UAAU,EAAE,MAAM,GAAG,OAAO;IAetC,OAAO,IAAI,IAAI;CAWhB"}
|
|
@@ -0,0 +1,235 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Security Sanitization and Validation Utilities
|
|
3
|
+
* Protects against XSS, injection attacks, and malformed payloads
|
|
4
|
+
*/
|
|
5
|
+
export class SecurityError extends Error {
|
|
6
|
+
code;
|
|
7
|
+
constructor(message, code) {
|
|
8
|
+
super(message);
|
|
9
|
+
this.code = code;
|
|
10
|
+
this.name = 'SecurityError';
|
|
11
|
+
}
|
|
12
|
+
}
|
|
13
|
+
export function sanitizeXSS(input) {
|
|
14
|
+
if (typeof input !== 'string') {
|
|
15
|
+
return '';
|
|
16
|
+
}
|
|
17
|
+
let sanitized = input.replace(/<script\b[^<]*(?:(?!<\/script>)<[^<]*)*<\/script>/gi, '');
|
|
18
|
+
sanitized = sanitized.replace(/<iframe\b[^<]*(?:(?!<\/iframe>)<[^<]*)*<\/iframe>/gi, '');
|
|
19
|
+
sanitized = sanitized.replace(/\son\w+\s*=\s*["'][^"']*["']/gi, '');
|
|
20
|
+
sanitized = sanitized.replace(/\son\w+\s*=\s*[^\s>]*/gi, '');
|
|
21
|
+
sanitized = sanitized.replace(/javascript:/gi, '');
|
|
22
|
+
sanitized = sanitized.replace(/data:text\/html/gi, '');
|
|
23
|
+
sanitized = sanitized
|
|
24
|
+
.replace(/&/g, '&')
|
|
25
|
+
.replace(/</g, '<')
|
|
26
|
+
.replace(/>/g, '>')
|
|
27
|
+
.replace(/"/g, '"')
|
|
28
|
+
.replace(/'/g, ''')
|
|
29
|
+
.replace(/\//g, '/');
|
|
30
|
+
return sanitized;
|
|
31
|
+
}
|
|
32
|
+
export function sanitizeInjection(input, maxLength = 1000) {
|
|
33
|
+
if (typeof input !== 'string') {
|
|
34
|
+
throw new SecurityError('Input must be a string', 'INVALID_TYPE');
|
|
35
|
+
}
|
|
36
|
+
if (input.length > maxLength) {
|
|
37
|
+
throw new SecurityError(`String exceeds maximum length of ${maxLength}`, 'MAX_LENGTH_EXCEEDED');
|
|
38
|
+
}
|
|
39
|
+
let sanitized = input.replace(/\0/g, '');
|
|
40
|
+
const sqlPatterns = [
|
|
41
|
+
/(\b(SELECT|INSERT|UPDATE|DELETE|DROP|CREATE|ALTER|EXEC|EXECUTE|UNION|DECLARE)\b)/gi,
|
|
42
|
+
/(--|\#|\/\*|\*\/)/g,
|
|
43
|
+
/(\bOR\b.*=.*|1=1|'=')/gi,
|
|
44
|
+
/;.*(\bSELECT\b|\bDROP\b)/gi,
|
|
45
|
+
];
|
|
46
|
+
for (const pattern of sqlPatterns) {
|
|
47
|
+
if (pattern.test(sanitized)) {
|
|
48
|
+
throw new SecurityError('Potential SQL injection pattern detected', 'SQL_INJECTION_DETECTED');
|
|
49
|
+
}
|
|
50
|
+
}
|
|
51
|
+
const noSqlPatterns = [
|
|
52
|
+
/\$where/gi,
|
|
53
|
+
/\$ne/gi,
|
|
54
|
+
/\$gt/gi,
|
|
55
|
+
/\$lt/gi,
|
|
56
|
+
/\$regex/gi,
|
|
57
|
+
/\$or/gi,
|
|
58
|
+
/\$and/gi,
|
|
59
|
+
];
|
|
60
|
+
for (const pattern of noSqlPatterns) {
|
|
61
|
+
if (pattern.test(sanitized)) {
|
|
62
|
+
throw new SecurityError('Potential NoSQL injection pattern detected', 'NOSQL_INJECTION_DETECTED');
|
|
63
|
+
}
|
|
64
|
+
}
|
|
65
|
+
const commandPatterns = [
|
|
66
|
+
/[;&|`$(){}[\]]/g,
|
|
67
|
+
/\.\.\//g,
|
|
68
|
+
/~\//g,
|
|
69
|
+
];
|
|
70
|
+
for (const pattern of commandPatterns) {
|
|
71
|
+
if (pattern.test(sanitized)) {
|
|
72
|
+
throw new SecurityError('Potential command injection pattern detected', 'COMMAND_INJECTION_DETECTED');
|
|
73
|
+
}
|
|
74
|
+
}
|
|
75
|
+
return sanitized;
|
|
76
|
+
}
|
|
77
|
+
export function validateRequestId(requestId) {
|
|
78
|
+
if (typeof requestId !== 'string') {
|
|
79
|
+
throw new SecurityError('request_id must be a string', 'INVALID_REQUEST_ID');
|
|
80
|
+
}
|
|
81
|
+
const validPattern = /^[a-zA-Z0-9_-]{1,100}$/;
|
|
82
|
+
if (!validPattern.test(requestId)) {
|
|
83
|
+
throw new SecurityError('request_id contains invalid characters', 'INVALID_REQUEST_ID_FORMAT');
|
|
84
|
+
}
|
|
85
|
+
return requestId;
|
|
86
|
+
}
|
|
87
|
+
export function validateIdentifier(identifier, fieldName = 'identifier') {
|
|
88
|
+
if (typeof identifier !== 'string') {
|
|
89
|
+
throw new SecurityError(`${fieldName} must be a string`, 'INVALID_IDENTIFIER');
|
|
90
|
+
}
|
|
91
|
+
const validPattern = /^[a-zA-Z0-9._-]{1,200}$/;
|
|
92
|
+
if (!validPattern.test(identifier)) {
|
|
93
|
+
throw new SecurityError(`${fieldName} contains invalid characters or exceeds length limit`, 'INVALID_IDENTIFIER_FORMAT');
|
|
94
|
+
}
|
|
95
|
+
return identifier;
|
|
96
|
+
}
|
|
97
|
+
export function sanitizeObject(obj, options = {}, depth = 0, currentFieldName) {
|
|
98
|
+
const { maxStringLength = 10000, maxObjectDepth = 10, maxArrayLength = 1000, allowedKeys, strictMode = false, skipXSSFields = [], } = options;
|
|
99
|
+
if (depth > maxObjectDepth) {
|
|
100
|
+
throw new SecurityError(`Object depth exceeds maximum of ${maxObjectDepth}`, 'MAX_DEPTH_EXCEEDED');
|
|
101
|
+
}
|
|
102
|
+
if (obj === null || obj === undefined) {
|
|
103
|
+
return obj;
|
|
104
|
+
}
|
|
105
|
+
if (typeof obj === 'string') {
|
|
106
|
+
if (obj.length > maxStringLength) {
|
|
107
|
+
throw new SecurityError(`String exceeds maximum length of ${maxStringLength}`, 'MAX_STRING_LENGTH');
|
|
108
|
+
}
|
|
109
|
+
if (currentFieldName && skipXSSFields.includes(currentFieldName)) {
|
|
110
|
+
return obj;
|
|
111
|
+
}
|
|
112
|
+
const cleaned = sanitizeInjection(obj, maxStringLength);
|
|
113
|
+
return sanitizeXSS(cleaned);
|
|
114
|
+
}
|
|
115
|
+
if (typeof obj === 'number' || typeof obj === 'boolean') {
|
|
116
|
+
return obj;
|
|
117
|
+
}
|
|
118
|
+
if (Array.isArray(obj)) {
|
|
119
|
+
if (obj.length > maxArrayLength) {
|
|
120
|
+
throw new SecurityError(`Array exceeds maximum length of ${maxArrayLength}`, 'MAX_ARRAY_LENGTH');
|
|
121
|
+
}
|
|
122
|
+
return obj.map(item => sanitizeObject(item, options, depth + 1, currentFieldName));
|
|
123
|
+
}
|
|
124
|
+
if (typeof obj === 'object') {
|
|
125
|
+
const sanitized = {};
|
|
126
|
+
for (const [key, value] of Object.entries(obj)) {
|
|
127
|
+
if (!/^[a-zA-Z0-9_]{1,100}$/.test(key)) {
|
|
128
|
+
if (strictMode) {
|
|
129
|
+
throw new SecurityError(`Object key "${key}" contains invalid characters`, 'INVALID_OBJECT_KEY');
|
|
130
|
+
}
|
|
131
|
+
continue;
|
|
132
|
+
}
|
|
133
|
+
if (allowedKeys && !allowedKeys.includes(key)) {
|
|
134
|
+
if (strictMode) {
|
|
135
|
+
throw new SecurityError(`Object key "${key}" is not in allowed keys list`, 'KEY_NOT_ALLOWED');
|
|
136
|
+
}
|
|
137
|
+
continue;
|
|
138
|
+
}
|
|
139
|
+
sanitized[key] = sanitizeObject(value, options, depth + 1, key);
|
|
140
|
+
}
|
|
141
|
+
return sanitized;
|
|
142
|
+
}
|
|
143
|
+
if (strictMode) {
|
|
144
|
+
throw new SecurityError(`Unsupported data type: ${typeof obj}`, 'UNSUPPORTED_TYPE');
|
|
145
|
+
}
|
|
146
|
+
return null;
|
|
147
|
+
}
|
|
148
|
+
export function parseJSONSafely(jsonString, options = {}) {
|
|
149
|
+
if (typeof jsonString !== 'string') {
|
|
150
|
+
throw new SecurityError('Input must be a string', 'INVALID_JSON_INPUT');
|
|
151
|
+
}
|
|
152
|
+
const maxSize = options.maxStringLength || 100000;
|
|
153
|
+
if (jsonString.length > maxSize) {
|
|
154
|
+
throw new SecurityError(`JSON string exceeds maximum size of ${maxSize} bytes`, 'JSON_TOO_LARGE');
|
|
155
|
+
}
|
|
156
|
+
let parsed;
|
|
157
|
+
try {
|
|
158
|
+
parsed = JSON.parse(jsonString);
|
|
159
|
+
}
|
|
160
|
+
catch (error) {
|
|
161
|
+
throw new SecurityError(`Invalid JSON: ${error instanceof Error ? error.message : 'Parse error'}`, 'JSON_PARSE_ERROR');
|
|
162
|
+
}
|
|
163
|
+
if (parsed && typeof parsed === 'object') {
|
|
164
|
+
if (Object.prototype.hasOwnProperty.call(parsed, '__proto__') ||
|
|
165
|
+
Object.prototype.hasOwnProperty.call(parsed, 'constructor') ||
|
|
166
|
+
Object.prototype.hasOwnProperty.call(parsed, 'prototype')) {
|
|
167
|
+
throw new SecurityError('Potential prototype pollution detected', 'PROTOTYPE_POLLUTION');
|
|
168
|
+
}
|
|
169
|
+
}
|
|
170
|
+
const skipXSSFields = options.skipXSSFields || [
|
|
171
|
+
'data',
|
|
172
|
+
'ciphertext',
|
|
173
|
+
'encrypted_data',
|
|
174
|
+
'encrypted',
|
|
175
|
+
'payload',
|
|
176
|
+
'signature',
|
|
177
|
+
'hash',
|
|
178
|
+
'token',
|
|
179
|
+
];
|
|
180
|
+
return sanitizeObject(parsed, { ...options, skipXSSFields });
|
|
181
|
+
}
|
|
182
|
+
export function validateEncryptedMessage(msg) {
|
|
183
|
+
if (!msg || typeof msg !== 'object') {
|
|
184
|
+
throw new SecurityError('Message must be an object', 'INVALID_MESSAGE');
|
|
185
|
+
}
|
|
186
|
+
const requiredFields = ['request_id', 'data'];
|
|
187
|
+
for (const field of requiredFields) {
|
|
188
|
+
if (!(field in msg)) {
|
|
189
|
+
throw new SecurityError(`Missing required field: ${field}`, 'MISSING_FIELD');
|
|
190
|
+
}
|
|
191
|
+
}
|
|
192
|
+
validateRequestId(msg.request_id);
|
|
193
|
+
const stringFields = ['data'];
|
|
194
|
+
for (const field of stringFields) {
|
|
195
|
+
if (typeof msg[field] !== 'string') {
|
|
196
|
+
throw new SecurityError(`Field ${field} must be a string`, 'INVALID_FIELD_TYPE');
|
|
197
|
+
}
|
|
198
|
+
if (msg[field].length < 1 || msg[field].length > 1000000) {
|
|
199
|
+
throw new SecurityError(`Field ${field} has invalid length`, 'INVALID_FIELD_LENGTH');
|
|
200
|
+
}
|
|
201
|
+
}
|
|
202
|
+
}
|
|
203
|
+
export class RateLimiter {
|
|
204
|
+
maxRequests;
|
|
205
|
+
windowMs;
|
|
206
|
+
requests = new Map();
|
|
207
|
+
constructor(maxRequests = 100, windowMs = 60000) {
|
|
208
|
+
this.maxRequests = maxRequests;
|
|
209
|
+
this.windowMs = windowMs;
|
|
210
|
+
}
|
|
211
|
+
isAllowed(identifier) {
|
|
212
|
+
const now = Date.now();
|
|
213
|
+
const timestamps = this.requests.get(identifier) || [];
|
|
214
|
+
const validTimestamps = timestamps.filter(ts => now - ts < this.windowMs);
|
|
215
|
+
if (validTimestamps.length >= this.maxRequests) {
|
|
216
|
+
return false;
|
|
217
|
+
}
|
|
218
|
+
validTimestamps.push(now);
|
|
219
|
+
this.requests.set(identifier, validTimestamps);
|
|
220
|
+
return true;
|
|
221
|
+
}
|
|
222
|
+
cleanup() {
|
|
223
|
+
const now = Date.now();
|
|
224
|
+
for (const [key, timestamps] of this.requests.entries()) {
|
|
225
|
+
const valid = timestamps.filter(ts => now - ts < this.windowMs);
|
|
226
|
+
if (valid.length === 0) {
|
|
227
|
+
this.requests.delete(key);
|
|
228
|
+
}
|
|
229
|
+
else {
|
|
230
|
+
this.requests.set(key, valid);
|
|
231
|
+
}
|
|
232
|
+
}
|
|
233
|
+
}
|
|
234
|
+
}
|
|
235
|
+
//# sourceMappingURL=sanitizer.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"sanitizer.js","sourceRoot":"","sources":["../../../lib/utils/sanitizer.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,115 @@
|
|
|
1
|
+
export interface KafkaConfig {
|
|
2
|
+
brokers: string[];
|
|
3
|
+
clientId: string;
|
|
4
|
+
groupId?: string;
|
|
5
|
+
ssl?: {
|
|
6
|
+
rejectUnauthorized?: boolean;
|
|
7
|
+
ca?: Buffer[];
|
|
8
|
+
cert?: Buffer;
|
|
9
|
+
key?: Buffer;
|
|
10
|
+
servername?: string;
|
|
11
|
+
};
|
|
12
|
+
logLevel?: number;
|
|
13
|
+
logCreator?: any;
|
|
14
|
+
retry?: {
|
|
15
|
+
retries?: number;
|
|
16
|
+
initialRetryTime?: number;
|
|
17
|
+
maxRetryTime?: number;
|
|
18
|
+
multiplier?: number;
|
|
19
|
+
restartOnFailure?: (error: Error) => Promise<boolean>;
|
|
20
|
+
};
|
|
21
|
+
sessionTimeout?: number;
|
|
22
|
+
heartbeatInterval?: number;
|
|
23
|
+
rebalanceTimeout?: number;
|
|
24
|
+
connectionTimeout?: number;
|
|
25
|
+
requestTimeout?: number;
|
|
26
|
+
socketTimeout?: number;
|
|
27
|
+
maxRequestSize?: number;
|
|
28
|
+
maxBytes?: number;
|
|
29
|
+
maxBytesPerPartition?: number;
|
|
30
|
+
fetchMaxBytes?: number;
|
|
31
|
+
maxMessageBytes?: number;
|
|
32
|
+
}
|
|
33
|
+
export interface EncryptionConfig {
|
|
34
|
+
encryptionKey: string;
|
|
35
|
+
}
|
|
36
|
+
export interface RequestMessage<T = any> {
|
|
37
|
+
request_id: string;
|
|
38
|
+
payload: T;
|
|
39
|
+
timestamp: number;
|
|
40
|
+
}
|
|
41
|
+
export interface ResponseMessage<T = any> {
|
|
42
|
+
request_id: string;
|
|
43
|
+
payload: T;
|
|
44
|
+
timestamp: number;
|
|
45
|
+
success: boolean;
|
|
46
|
+
error?: string;
|
|
47
|
+
}
|
|
48
|
+
export interface EncryptedMessage {
|
|
49
|
+
request_id?: string;
|
|
50
|
+
data: string;
|
|
51
|
+
iv?: string;
|
|
52
|
+
tag?: string;
|
|
53
|
+
}
|
|
54
|
+
export interface LogEntry {
|
|
55
|
+
request_id: string;
|
|
56
|
+
timestamp: Date;
|
|
57
|
+
type: 'request' | 'response';
|
|
58
|
+
topic: string;
|
|
59
|
+
payload: any;
|
|
60
|
+
success?: boolean;
|
|
61
|
+
error?: string;
|
|
62
|
+
duration_ms?: number;
|
|
63
|
+
}
|
|
64
|
+
export type RequestHandler<TRequest = any, TResponse = any> = (requestId: string, payload: TRequest) => Promise<TResponse>;
|
|
65
|
+
export interface HandlerRegistry {
|
|
66
|
+
[topic: string]: RequestHandler;
|
|
67
|
+
}
|
|
68
|
+
export interface BaseVerificationResult {
|
|
69
|
+
registrationId: string;
|
|
70
|
+
nik: string;
|
|
71
|
+
fullName: string;
|
|
72
|
+
dateOfBirth: string;
|
|
73
|
+
address: string;
|
|
74
|
+
assistanceType: string;
|
|
75
|
+
requestedAmount: number;
|
|
76
|
+
processedBy: string;
|
|
77
|
+
verifiedAt: string;
|
|
78
|
+
[key: string]: any;
|
|
79
|
+
}
|
|
80
|
+
export interface DukcapilResult extends BaseVerificationResult {
|
|
81
|
+
nikStatus: 'valid' | 'invalid' | 'blocked';
|
|
82
|
+
dataMatch: boolean;
|
|
83
|
+
familyMembers: number;
|
|
84
|
+
addressVerified: boolean;
|
|
85
|
+
notes?: string;
|
|
86
|
+
}
|
|
87
|
+
export interface BPJSTKResult extends BaseVerificationResult {
|
|
88
|
+
employmentStatus: 'active' | 'inactive' | 'not_registered';
|
|
89
|
+
employerName?: string;
|
|
90
|
+
monthlySalary?: number;
|
|
91
|
+
contributionMonths: number;
|
|
92
|
+
lastContribution?: string;
|
|
93
|
+
notes?: string;
|
|
94
|
+
}
|
|
95
|
+
export interface BPJSKesehatanResult extends BaseVerificationResult {
|
|
96
|
+
membershipStatus: 'active' | 'inactive' | 'not_registered';
|
|
97
|
+
membershipClass: '1' | '2' | '3' | 'PBI' | null;
|
|
98
|
+
hasChronicIllness: boolean;
|
|
99
|
+
chronicIllnessList?: string[];
|
|
100
|
+
lastCheckup?: string;
|
|
101
|
+
healthRiskLevel: 'low' | 'medium' | 'high';
|
|
102
|
+
notes?: string;
|
|
103
|
+
}
|
|
104
|
+
export interface BankIndonesiaResult extends BaseVerificationResult {
|
|
105
|
+
hasBankAccount: boolean;
|
|
106
|
+
numberOfAccounts: number;
|
|
107
|
+
totalSavings: number;
|
|
108
|
+
hasActiveLoans: boolean;
|
|
109
|
+
loanAmount?: number;
|
|
110
|
+
creditScore: number;
|
|
111
|
+
financialStatus: 'eligible' | 'review_needed' | 'not_eligible';
|
|
112
|
+
notes?: string;
|
|
113
|
+
}
|
|
114
|
+
export type VerificationResult = DukcapilResult | BPJSTKResult | BPJSKesehatanResult | BankIndonesiaResult;
|
|
115
|
+
//# sourceMappingURL=index.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../types/index.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../types/index.ts"],"names":[],"mappings":""}
|
package/package.json
ADDED
|
@@ -0,0 +1,61 @@
|
|
|
1
|
+
{
|
|
2
|
+
"name": "splp-nodejs",
|
|
3
|
+
"version": "1.0.0",
|
|
4
|
+
"description": "SPLP Node.js - Government Service Integration with Kafka, Encryption & Tracing",
|
|
5
|
+
"author": "Muhammad Zuhri <your-email@example.com>",
|
|
6
|
+
"license": "MIT",
|
|
7
|
+
"repository": {
|
|
8
|
+
"type": "git",
|
|
9
|
+
"url": "git+https://github.com/splp-broker/splp-nodejs.git"
|
|
10
|
+
},
|
|
11
|
+
"keywords": [
|
|
12
|
+
"splp",
|
|
13
|
+
"kafka",
|
|
14
|
+
"tracing",
|
|
15
|
+
"opentelemetry",
|
|
16
|
+
"encryption"
|
|
17
|
+
],
|
|
18
|
+
"bugs": {
|
|
19
|
+
"url": "https://github.com/splp-broker/splp-nodejs/issues"
|
|
20
|
+
},
|
|
21
|
+
"homepage": "https://github.com/splp-broker/splp-nodejs#readme",
|
|
22
|
+
"type": "module",
|
|
23
|
+
"main": "./dist/lib/index.js",
|
|
24
|
+
"types": "./dist/lib/index.d.ts",
|
|
25
|
+
"exports": {
|
|
26
|
+
".": {
|
|
27
|
+
"import": "./dist/lib/index.js",
|
|
28
|
+
"types": "./dist/lib/index.d.ts"
|
|
29
|
+
},
|
|
30
|
+
"./config": {
|
|
31
|
+
"import": "./dist/config/index.js",
|
|
32
|
+
"types": "./dist/config/index.d.ts"
|
|
33
|
+
}
|
|
34
|
+
},
|
|
35
|
+
"files": [
|
|
36
|
+
"dist",
|
|
37
|
+
"README.md"
|
|
38
|
+
],
|
|
39
|
+
"scripts": {
|
|
40
|
+
"build": "tsc",
|
|
41
|
+
"prepublishOnly": "npm run build"
|
|
42
|
+
},
|
|
43
|
+
"engines": {
|
|
44
|
+
"node": ">=18"
|
|
45
|
+
},
|
|
46
|
+
"dependencies": {
|
|
47
|
+
"@opentelemetry/api": "^1.8.0",
|
|
48
|
+
"@opentelemetry/auto-instrumentations-node": "^0.42.0",
|
|
49
|
+
"@opentelemetry/core": "^1.22.0",
|
|
50
|
+
"@opentelemetry/exporter-trace-otlp-http": "^0.50.0",
|
|
51
|
+
"@opentelemetry/resources": "^1.22.0",
|
|
52
|
+
"@opentelemetry/sdk-node": "^0.50.0",
|
|
53
|
+
"@opentelemetry/semantic-conventions": "^1.22.0",
|
|
54
|
+
"kafkajs": "^2.2.4",
|
|
55
|
+
"kafkajs-snappy": "^1.1.0"
|
|
56
|
+
},
|
|
57
|
+
"devDependencies": {
|
|
58
|
+
"@types/node": "^20.11.5",
|
|
59
|
+
"typescript": "^5.3.3"
|
|
60
|
+
}
|
|
61
|
+
}
|