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,568 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* JSON Encryptor Library
|
|
3
|
+
* Fully parameterized encryption library for JSON data
|
|
4
|
+
* Supports asymmetric encryption using Seal API with customizable configuration
|
|
5
|
+
*/
|
|
6
|
+
import https from 'https';
|
|
7
|
+
import fs from 'fs';
|
|
8
|
+
/**
|
|
9
|
+
* JSON Encryptor Class
|
|
10
|
+
* Provides parameterized JSON encryption/decryption functionality
|
|
11
|
+
*/
|
|
12
|
+
export class JsonEncryptor {
|
|
13
|
+
config;
|
|
14
|
+
httpsAgent;
|
|
15
|
+
constructor(config) {
|
|
16
|
+
// Set defaults
|
|
17
|
+
this.config = {
|
|
18
|
+
apiBaseUrl: config.apiBaseUrl.replace(/\/$/, ''),
|
|
19
|
+
apiTimeout: config.apiTimeout ?? 30000,
|
|
20
|
+
tlsConfig: config.tlsConfig ?? {},
|
|
21
|
+
publicKeys: config.publicKeys,
|
|
22
|
+
requestIdPrefix: config.requestIdPrefix ?? 'enc',
|
|
23
|
+
enableLogging: config.enableLogging ?? false,
|
|
24
|
+
};
|
|
25
|
+
// Validate configuration
|
|
26
|
+
this.validateConfig();
|
|
27
|
+
// Create HTTPS agent if TLS configuration is provided
|
|
28
|
+
if (this.config.tlsConfig?.clientCertPath || this.config.tlsConfig?.clientKeyPath) {
|
|
29
|
+
this.createHttpsAgent();
|
|
30
|
+
}
|
|
31
|
+
}
|
|
32
|
+
/**
|
|
33
|
+
* Validate configuration
|
|
34
|
+
*/
|
|
35
|
+
validateConfig() {
|
|
36
|
+
if (!this.config.apiBaseUrl) {
|
|
37
|
+
throw new Error('apiBaseUrl is required');
|
|
38
|
+
}
|
|
39
|
+
if (!this.config.publicKeys || this.config.publicKeys.length === 0) {
|
|
40
|
+
throw new Error('At least one public key is required');
|
|
41
|
+
}
|
|
42
|
+
// Validate public keys format
|
|
43
|
+
this.config.publicKeys.forEach((key, index) => {
|
|
44
|
+
if (!key.includes('BEGIN PUBLIC KEY') && !key.includes('BEGIN CERTIFICATE')) {
|
|
45
|
+
throw new Error(`Invalid public key format at index ${index}`);
|
|
46
|
+
}
|
|
47
|
+
});
|
|
48
|
+
}
|
|
49
|
+
/**
|
|
50
|
+
* Create HTTPS agent with TLS configuration
|
|
51
|
+
*/
|
|
52
|
+
createHttpsAgent() {
|
|
53
|
+
// Skip creating https agent if running in Bun (will use fetch instead)
|
|
54
|
+
const isBun = typeof globalThis.Bun !== 'undefined';
|
|
55
|
+
if (isBun) {
|
|
56
|
+
this.log('🔧 Running in Bun, will use fetch API instead of https module');
|
|
57
|
+
return;
|
|
58
|
+
}
|
|
59
|
+
const tlsOptions = {
|
|
60
|
+
rejectUnauthorized: this.config.tlsConfig?.rejectUnauthorized ?? false,
|
|
61
|
+
};
|
|
62
|
+
// Load client certificate if provided
|
|
63
|
+
if (this.config.tlsConfig?.clientCertPath) {
|
|
64
|
+
if (!fs.existsSync(this.config.tlsConfig.clientCertPath)) {
|
|
65
|
+
throw new Error(`Client certificate not found: ${this.config.tlsConfig.clientCertPath}`);
|
|
66
|
+
}
|
|
67
|
+
tlsOptions.cert = fs.readFileSync(this.config.tlsConfig.clientCertPath);
|
|
68
|
+
}
|
|
69
|
+
// Load client key if provided
|
|
70
|
+
if (this.config.tlsConfig?.clientKeyPath) {
|
|
71
|
+
if (!fs.existsSync(this.config.tlsConfig.clientKeyPath)) {
|
|
72
|
+
throw new Error(`Client key not found: ${this.config.tlsConfig.clientKeyPath}`);
|
|
73
|
+
}
|
|
74
|
+
tlsOptions.key = fs.readFileSync(this.config.tlsConfig.clientKeyPath);
|
|
75
|
+
}
|
|
76
|
+
// Load CA certificate if provided
|
|
77
|
+
if (this.config.tlsConfig?.caPath) {
|
|
78
|
+
if (fs.existsSync(this.config.tlsConfig.caPath)) {
|
|
79
|
+
tlsOptions.ca = fs.readFileSync(this.config.tlsConfig.caPath);
|
|
80
|
+
}
|
|
81
|
+
else {
|
|
82
|
+
this.log(`⚠️ CA certificate not found: ${this.config.tlsConfig.caPath}, skipping`);
|
|
83
|
+
}
|
|
84
|
+
}
|
|
85
|
+
this.httpsAgent = new https.Agent(tlsOptions);
|
|
86
|
+
}
|
|
87
|
+
/**
|
|
88
|
+
* Generate unique request ID
|
|
89
|
+
*/
|
|
90
|
+
generateRequestId() {
|
|
91
|
+
const timestamp = Date.now();
|
|
92
|
+
const random = Math.random().toString(36).substring(2, 9);
|
|
93
|
+
return `${this.config.requestIdPrefix}-${timestamp}-${random}`;
|
|
94
|
+
}
|
|
95
|
+
/**
|
|
96
|
+
* Log message if logging is enabled
|
|
97
|
+
*/
|
|
98
|
+
log(message, ...args) {
|
|
99
|
+
if (this.config.enableLogging) {
|
|
100
|
+
console.log(message, ...args);
|
|
101
|
+
}
|
|
102
|
+
}
|
|
103
|
+
/**
|
|
104
|
+
* Convert JSON object to base64 string
|
|
105
|
+
*/
|
|
106
|
+
jsonToBase64(data) {
|
|
107
|
+
const jsonString = JSON.stringify(data);
|
|
108
|
+
const result = Buffer.from(jsonString, 'utf-8').toString('base64');
|
|
109
|
+
this.log('base64String', result);
|
|
110
|
+
return result;
|
|
111
|
+
}
|
|
112
|
+
/**
|
|
113
|
+
* Convert base64 string to JSON object
|
|
114
|
+
*/
|
|
115
|
+
base64ToJson(base64String) {
|
|
116
|
+
const jsonString = Buffer.from(base64String, 'base64').toString('utf-8');
|
|
117
|
+
return JSON.parse(jsonString);
|
|
118
|
+
}
|
|
119
|
+
/**
|
|
120
|
+
* Make HTTPS request to Seal API
|
|
121
|
+
*/
|
|
122
|
+
async makeHttpsRequest(endpoint, payload) {
|
|
123
|
+
const url = `${this.config.apiBaseUrl}${endpoint}`;
|
|
124
|
+
this.log(`📡 Making request to: ${url}`);
|
|
125
|
+
// Check if running in Bun runtime
|
|
126
|
+
const isBun = typeof globalThis.Bun !== 'undefined';
|
|
127
|
+
if (isBun) {
|
|
128
|
+
// Use Bun's native fetch API with TLS support
|
|
129
|
+
return this.makeFetchRequest(url, payload);
|
|
130
|
+
}
|
|
131
|
+
// Fallback to Node.js https module
|
|
132
|
+
return new Promise((resolve, reject) => {
|
|
133
|
+
const urlObj = new URL(url);
|
|
134
|
+
const bodyString = JSON.stringify(payload);
|
|
135
|
+
const options = {
|
|
136
|
+
hostname: urlObj.hostname,
|
|
137
|
+
port: urlObj.port || (urlObj.protocol === 'https:' ? 443 : 80),
|
|
138
|
+
path: urlObj.pathname + urlObj.search,
|
|
139
|
+
method: 'POST',
|
|
140
|
+
headers: {
|
|
141
|
+
'Content-Type': 'application/json',
|
|
142
|
+
'Content-Length': Buffer.byteLength(bodyString),
|
|
143
|
+
},
|
|
144
|
+
agent: this.httpsAgent,
|
|
145
|
+
timeout: this.config.apiTimeout,
|
|
146
|
+
};
|
|
147
|
+
// If no HTTPS agent, set rejectUnauthorized directly
|
|
148
|
+
if (!this.httpsAgent) {
|
|
149
|
+
options.rejectUnauthorized = this.config.tlsConfig?.rejectUnauthorized ?? false;
|
|
150
|
+
}
|
|
151
|
+
const req = https.request(options, (res) => {
|
|
152
|
+
let data = '';
|
|
153
|
+
res.on('data', (chunk) => {
|
|
154
|
+
data += chunk;
|
|
155
|
+
});
|
|
156
|
+
res.on('end', () => {
|
|
157
|
+
try {
|
|
158
|
+
this.log(`✅ Received response with status: ${res.statusCode}`);
|
|
159
|
+
if (res.statusCode && res.statusCode >= 400) {
|
|
160
|
+
reject(new Error(`HTTP ${res.statusCode}: ${res.statusMessage} - ${data}`));
|
|
161
|
+
return;
|
|
162
|
+
}
|
|
163
|
+
const responseData = JSON.parse(data);
|
|
164
|
+
// Check for API error response
|
|
165
|
+
if ('fault' in responseData) {
|
|
166
|
+
reject(new Error(`API Error: ${responseData.fault.details} (${responseData.fault.code})`));
|
|
167
|
+
return;
|
|
168
|
+
}
|
|
169
|
+
resolve(responseData);
|
|
170
|
+
}
|
|
171
|
+
catch (error) {
|
|
172
|
+
reject(new Error(`Failed to parse response: ${error instanceof Error ? error.message : String(error)}`));
|
|
173
|
+
}
|
|
174
|
+
});
|
|
175
|
+
});
|
|
176
|
+
req.on('error', (error) => {
|
|
177
|
+
this.log(`❌ Request error: ${error.message}`);
|
|
178
|
+
reject(new Error(`Network error: ${error.message}`));
|
|
179
|
+
});
|
|
180
|
+
req.on('timeout', () => {
|
|
181
|
+
req.destroy();
|
|
182
|
+
reject(new Error(`Request timeout after ${this.config.apiTimeout}ms`));
|
|
183
|
+
});
|
|
184
|
+
req.write(bodyString);
|
|
185
|
+
req.end();
|
|
186
|
+
});
|
|
187
|
+
}
|
|
188
|
+
/**
|
|
189
|
+
* Make HTTPS request using Bun's fetch API with TLS support
|
|
190
|
+
*/
|
|
191
|
+
async makeFetchRequest(url, payload) {
|
|
192
|
+
try {
|
|
193
|
+
const Bun = globalThis.Bun;
|
|
194
|
+
// Prepare fetch options
|
|
195
|
+
const fetchOptions = {
|
|
196
|
+
method: 'POST',
|
|
197
|
+
headers: {
|
|
198
|
+
'Content-Type': 'application/json',
|
|
199
|
+
},
|
|
200
|
+
body: JSON.stringify(payload),
|
|
201
|
+
};
|
|
202
|
+
// Add TLS configuration if certificates are provided
|
|
203
|
+
if (this.config.tlsConfig?.clientCertPath && this.config.tlsConfig?.clientKeyPath) {
|
|
204
|
+
// Load certificate files using Bun.file
|
|
205
|
+
const certFile = Bun.file(this.config.tlsConfig.clientCertPath);
|
|
206
|
+
const keyFile = Bun.file(this.config.tlsConfig.clientKeyPath);
|
|
207
|
+
// Check if files exist
|
|
208
|
+
if (!(await certFile.exists())) {
|
|
209
|
+
throw new Error(`Client certificate not found: ${this.config.tlsConfig.clientCertPath}`);
|
|
210
|
+
}
|
|
211
|
+
if (!(await keyFile.exists())) {
|
|
212
|
+
throw new Error(`Client key not found: ${this.config.tlsConfig.clientKeyPath}`);
|
|
213
|
+
}
|
|
214
|
+
fetchOptions.tls = {
|
|
215
|
+
cert: certFile,
|
|
216
|
+
key: keyFile,
|
|
217
|
+
rejectUnauthorized: false, // Hardcoded false like working broadcast.ts
|
|
218
|
+
};
|
|
219
|
+
// Add CA if provided
|
|
220
|
+
if (this.config.tlsConfig?.caPath) {
|
|
221
|
+
const caFile = Bun.file(this.config.tlsConfig.caPath);
|
|
222
|
+
if (await caFile.exists()) {
|
|
223
|
+
fetchOptions.tls.ca = caFile;
|
|
224
|
+
}
|
|
225
|
+
}
|
|
226
|
+
}
|
|
227
|
+
// Make request with timeout
|
|
228
|
+
const controller = new AbortController();
|
|
229
|
+
const timeoutId = setTimeout(() => controller.abort(), this.config.apiTimeout);
|
|
230
|
+
try {
|
|
231
|
+
const response = await fetch(url, {
|
|
232
|
+
...fetchOptions,
|
|
233
|
+
signal: controller.signal,
|
|
234
|
+
});
|
|
235
|
+
clearTimeout(timeoutId);
|
|
236
|
+
this.log(`✅ Received response with status: ${response.status}`);
|
|
237
|
+
this.log(` Response headers: ${JSON.stringify(Object.fromEntries(response.headers.entries()))}`);
|
|
238
|
+
// Get raw response text first for logging
|
|
239
|
+
const rawResponseText = await response.text();
|
|
240
|
+
this.log(` Raw API response: ${rawResponseText}`);
|
|
241
|
+
if (!response.ok) {
|
|
242
|
+
throw new Error(`HTTP ${response.status}: ${response.statusText} - ${rawResponseText}`);
|
|
243
|
+
}
|
|
244
|
+
// Parse JSON from raw text
|
|
245
|
+
const responseData = JSON.parse(rawResponseText);
|
|
246
|
+
this.log(` Parsed response: ${JSON.stringify(responseData)}`);
|
|
247
|
+
// Check for API error response
|
|
248
|
+
if ('fault' in responseData) {
|
|
249
|
+
throw new Error(`API Error: ${responseData.fault.details} (${responseData.fault.code})`);
|
|
250
|
+
}
|
|
251
|
+
return responseData;
|
|
252
|
+
}
|
|
253
|
+
finally {
|
|
254
|
+
clearTimeout(timeoutId);
|
|
255
|
+
}
|
|
256
|
+
}
|
|
257
|
+
catch (error) {
|
|
258
|
+
if (error instanceof Error) {
|
|
259
|
+
if (error.name === 'AbortError') {
|
|
260
|
+
throw new Error(`Request timeout after ${this.config.apiTimeout}ms`);
|
|
261
|
+
}
|
|
262
|
+
this.log(`❌ Request error: ${error.message}`);
|
|
263
|
+
throw new Error(`Network error: ${error.message}`);
|
|
264
|
+
}
|
|
265
|
+
throw error;
|
|
266
|
+
}
|
|
267
|
+
}
|
|
268
|
+
/**
|
|
269
|
+
* Encrypt JSON data
|
|
270
|
+
*
|
|
271
|
+
* @param data - JSON data to encrypt (any serializable object)
|
|
272
|
+
* @param options - Optional encryption options
|
|
273
|
+
* @returns Promise<EncryptedJson> - Encrypted data with metadata
|
|
274
|
+
*
|
|
275
|
+
* @example
|
|
276
|
+
* const encrypted = await encryptor.encrypt({ message: 'Hello', value: 123 });
|
|
277
|
+
* console.log(encrypted.ciphertext);
|
|
278
|
+
*/
|
|
279
|
+
async encrypt(data, options) {
|
|
280
|
+
const requestId = options?.requestId ?? this.generateRequestId();
|
|
281
|
+
const publicKeys = options?.publicKeys ?? this.config.publicKeys;
|
|
282
|
+
this.log(`🔐 Encrypting data with request ID: ${requestId}`);
|
|
283
|
+
this.log(` Using ${publicKeys.length} public key(s)`);
|
|
284
|
+
this.log(` Public keys: ${publicKeys.join(', ')}`);
|
|
285
|
+
this.log(`data: ${JSON.stringify(data)}`);
|
|
286
|
+
try {
|
|
287
|
+
// Convert data to base64
|
|
288
|
+
const dataBase64 = this.jsonToBase64(data);
|
|
289
|
+
this.log(` Data converted to base64 (${dataBase64.length} chars)`);
|
|
290
|
+
const request = {
|
|
291
|
+
Plaintext: [{ Text: dataBase64 }],
|
|
292
|
+
PublicKeyBroadcast: publicKeys,
|
|
293
|
+
};
|
|
294
|
+
// Log full request payload
|
|
295
|
+
this.log(` Seal API Request (full):`);
|
|
296
|
+
this.log(JSON.stringify(request, null, 2));
|
|
297
|
+
// Call Seal API
|
|
298
|
+
const response = await this.makeHttpsRequest('/broadcast/asymmetric/seal/base64', request);
|
|
299
|
+
if (!response.Ciphertext || response.Ciphertext.length === 0) {
|
|
300
|
+
throw new Error('API returned empty ciphertext');
|
|
301
|
+
}
|
|
302
|
+
this.log(`response: ${JSON.stringify(response)}`);
|
|
303
|
+
const dataResponse = response.Ciphertext[0].text;
|
|
304
|
+
this.log(`✅ Encryption successful (${dataResponse.length} chars)`);
|
|
305
|
+
return {
|
|
306
|
+
requestId,
|
|
307
|
+
data: dataResponse,
|
|
308
|
+
encryptionMethod: 'seal-api',
|
|
309
|
+
};
|
|
310
|
+
}
|
|
311
|
+
catch (error) {
|
|
312
|
+
this.log(`❌ Encryption failed: ${error instanceof Error ? error.message : String(error)}`);
|
|
313
|
+
throw new Error(`Encryption failed: ${error instanceof Error ? error.message : String(error)}`);
|
|
314
|
+
}
|
|
315
|
+
}
|
|
316
|
+
/**
|
|
317
|
+
* Decrypt encrypted JSON data
|
|
318
|
+
*
|
|
319
|
+
* @param encryptedData - Encrypted data from encrypt() method or ciphertext string
|
|
320
|
+
* @returns Promise<DecryptedJson<T>> - Decrypted data with metadata
|
|
321
|
+
*
|
|
322
|
+
* @example
|
|
323
|
+
* const decrypted = await encryptor.decrypt(encrypted);
|
|
324
|
+
* console.log(decrypted.data);
|
|
325
|
+
*/
|
|
326
|
+
async decrypt(encryptedData) {
|
|
327
|
+
// Handle both EncryptedJson object and raw ciphertext string
|
|
328
|
+
const ciphertext = typeof encryptedData === 'string'
|
|
329
|
+
? encryptedData
|
|
330
|
+
: encryptedData.data;
|
|
331
|
+
const requestId = typeof encryptedData === 'object'
|
|
332
|
+
? encryptedData.requestId
|
|
333
|
+
: undefined;
|
|
334
|
+
const timestamp = typeof encryptedData === 'object'
|
|
335
|
+
? encryptedData.timestamp
|
|
336
|
+
: Date.now();
|
|
337
|
+
this.log(`🔓 Decrypting data${requestId ? ` with request ID: ${requestId}` : ''}`);
|
|
338
|
+
this.log(` Ciphertext length: ${ciphertext.length} characters`);
|
|
339
|
+
this.log(` Ciphertext preview (first 100): ${ciphertext.substring(0, 100)}...`);
|
|
340
|
+
this.log(` Ciphertext preview (last 100): ...${ciphertext.substring(ciphertext.length - 100)}`);
|
|
341
|
+
// Validate ciphertext format
|
|
342
|
+
const base64Chars = 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/=:';
|
|
343
|
+
let validChars = 0;
|
|
344
|
+
let invalidChars = [];
|
|
345
|
+
const hasBroadcastSeparator = ciphertext.includes(':');
|
|
346
|
+
for (let i = 0; i < Math.min(1000, ciphertext.length); i++) {
|
|
347
|
+
const char = ciphertext[i];
|
|
348
|
+
if (base64Chars.includes(char) || (hasBroadcastSeparator && char === ':')) {
|
|
349
|
+
validChars++;
|
|
350
|
+
}
|
|
351
|
+
else {
|
|
352
|
+
invalidChars.push(`'${char}' (0x${char.charCodeAt(0).toString(16)})`);
|
|
353
|
+
}
|
|
354
|
+
}
|
|
355
|
+
if (invalidChars.length > 0) {
|
|
356
|
+
this.log(` ⚠️ WARNING: Found ${invalidChars.length} non-base64 characters in first 1000 chars`);
|
|
357
|
+
this.log(` Invalid chars: ${invalidChars.slice(0, 5).join(', ')}`);
|
|
358
|
+
}
|
|
359
|
+
else {
|
|
360
|
+
this.log(` ✓ Ciphertext contains only valid base64 characters (checked first 1000 chars)`);
|
|
361
|
+
}
|
|
362
|
+
// Test base64 decode
|
|
363
|
+
if (hasBroadcastSeparator) {
|
|
364
|
+
const parts = ciphertext.split(':');
|
|
365
|
+
let allPartsValid = true;
|
|
366
|
+
for (const part of parts) {
|
|
367
|
+
try {
|
|
368
|
+
const decoded = Buffer.from(part, 'base64');
|
|
369
|
+
if (decoded.length === 0) {
|
|
370
|
+
allPartsValid = false;
|
|
371
|
+
break;
|
|
372
|
+
}
|
|
373
|
+
}
|
|
374
|
+
catch {
|
|
375
|
+
allPartsValid = false;
|
|
376
|
+
break;
|
|
377
|
+
}
|
|
378
|
+
}
|
|
379
|
+
if (allPartsValid) {
|
|
380
|
+
this.log(` ✓ Broadcast base64 decode test: SUCCESS (all ${parts.length} parts valid)`);
|
|
381
|
+
}
|
|
382
|
+
else {
|
|
383
|
+
this.log(` ⚠️ WARNING: Broadcast base64 decode test: FAILED (some parts invalid)`);
|
|
384
|
+
}
|
|
385
|
+
}
|
|
386
|
+
else {
|
|
387
|
+
try {
|
|
388
|
+
const decoded = Buffer.from(ciphertext, 'base64');
|
|
389
|
+
if (decoded.length > 0) {
|
|
390
|
+
this.log(` ✓ Single base64 decode test: SUCCESS (${decoded.length} bytes decoded)`);
|
|
391
|
+
}
|
|
392
|
+
else {
|
|
393
|
+
this.log(` ⚠️ WARNING: Single base64 decode test: FAILED (empty result)`);
|
|
394
|
+
}
|
|
395
|
+
}
|
|
396
|
+
catch (e) {
|
|
397
|
+
this.log(` ⚠️ WARNING: Single base64 decode test: FAILED (${e instanceof Error ? e.message : String(e)})`);
|
|
398
|
+
}
|
|
399
|
+
}
|
|
400
|
+
try {
|
|
401
|
+
// PENDEKATAN BERBEDA: Auto-detect format ciphertext
|
|
402
|
+
// Jika ciphertext tidak mengandung ':' separator, kemungkinan single key encryption
|
|
403
|
+
// Coba unseal dulu, jika gagal baru coba broadcast_unseal
|
|
404
|
+
const isBroadcastFormat = ciphertext.includes(':');
|
|
405
|
+
this.log(` Ciphertext format: ${isBroadcastFormat ? 'Broadcast (contains :)' : 'Single (no :)'}`);
|
|
406
|
+
let plaintextBase64;
|
|
407
|
+
if (!isBroadcastFormat) {
|
|
408
|
+
// Single key encryption - coba unseal endpoint dulu
|
|
409
|
+
this.log(` Trying /asymmetric/unseal/base64 endpoint for single key...`);
|
|
410
|
+
try {
|
|
411
|
+
const unsealRequest = {
|
|
412
|
+
Ciphertext: [{ text: ciphertext }],
|
|
413
|
+
};
|
|
414
|
+
// Debug: Log full request payload
|
|
415
|
+
this.log(` Request payload: Ciphertext array with 1 item, length: ${ciphertext.length} chars`);
|
|
416
|
+
this.log(` Single Unseal API Request (full):`);
|
|
417
|
+
this.log(JSON.stringify(unsealRequest, null, 2));
|
|
418
|
+
const unsealResponse = await this.makeHttpsRequest('/asymmetric/unseal/base64', unsealRequest);
|
|
419
|
+
if (unsealResponse.Plaintext && unsealResponse.Plaintext.length > 0) {
|
|
420
|
+
plaintextBase64 = unsealResponse.Plaintext[0].text;
|
|
421
|
+
this.log(` ✓ Single unseal successful`);
|
|
422
|
+
}
|
|
423
|
+
else {
|
|
424
|
+
throw new Error('API returned empty plaintext');
|
|
425
|
+
}
|
|
426
|
+
}
|
|
427
|
+
catch (unsealError) {
|
|
428
|
+
// Jika unseal gagal, fallback ke broadcast_unseal
|
|
429
|
+
this.log(` ⚠️ Single unseal failed, trying broadcast_unseal...`);
|
|
430
|
+
const errorMsg = unsealError instanceof Error ? unsealError.message : String(unsealError);
|
|
431
|
+
this.log(` Error: ${errorMsg}`);
|
|
432
|
+
// Fallback ke broadcast_unseal
|
|
433
|
+
const request = {
|
|
434
|
+
Ciphertext: [{ text: ciphertext }],
|
|
435
|
+
};
|
|
436
|
+
// Debug: Log full request payload
|
|
437
|
+
this.log(` Fallback request payload: Ciphertext array with 1 item, length: ${ciphertext.length} chars`);
|
|
438
|
+
this.log(` Fallback Unseal API Request (full):`);
|
|
439
|
+
this.log(JSON.stringify(request, null, 2));
|
|
440
|
+
const response = await this.makeHttpsRequest('/broadcast/asymmetric/unseal/base64', request);
|
|
441
|
+
if (!response.Plaintext || response.Plaintext.length === 0) {
|
|
442
|
+
throw new Error('API returned empty plaintext');
|
|
443
|
+
}
|
|
444
|
+
plaintextBase64 = response.Plaintext[0].text;
|
|
445
|
+
this.log(` ✓ Broadcast unseal successful (fallback)`);
|
|
446
|
+
}
|
|
447
|
+
}
|
|
448
|
+
else {
|
|
449
|
+
// Broadcast format - gunakan broadcast_unseal
|
|
450
|
+
this.log(` Using /broadcast/asymmetric/unseal/base64 endpoint for broadcast format...`);
|
|
451
|
+
const request = {
|
|
452
|
+
Ciphertext: [{ text: ciphertext }],
|
|
453
|
+
};
|
|
454
|
+
// Debug: Log full request payload
|
|
455
|
+
this.log(` Request payload: Ciphertext array with 1 item, length: ${ciphertext.length} chars`);
|
|
456
|
+
const parts = ciphertext.split(':');
|
|
457
|
+
this.log(` Broadcast format: ${parts.length} parts`);
|
|
458
|
+
this.log(` Unseal API Request (full):`);
|
|
459
|
+
this.log(JSON.stringify(request, null, 2));
|
|
460
|
+
const response = await this.makeHttpsRequest('/broadcast/asymmetric/unseal/base64', request);
|
|
461
|
+
if (!response.Plaintext || response.Plaintext.length === 0) {
|
|
462
|
+
throw new Error('API returned empty plaintext');
|
|
463
|
+
}
|
|
464
|
+
plaintextBase64 = response.Plaintext[0].text;
|
|
465
|
+
this.log(` ✓ Broadcast unseal successful`);
|
|
466
|
+
}
|
|
467
|
+
this.log(` Plaintext received (${plaintextBase64.length} chars)`);
|
|
468
|
+
// Convert from base64 to JSON
|
|
469
|
+
const data = this.base64ToJson(plaintextBase64);
|
|
470
|
+
this.log(`✅ Decryption successful`);
|
|
471
|
+
return {
|
|
472
|
+
data,
|
|
473
|
+
requestId,
|
|
474
|
+
timestamp: timestamp ?? Date.now(),
|
|
475
|
+
};
|
|
476
|
+
}
|
|
477
|
+
catch (error) {
|
|
478
|
+
this.log(`❌ Decryption failed: ${error instanceof Error ? error.message : String(error)}`);
|
|
479
|
+
throw new Error(`Decryption failed: ${error instanceof Error ? error.message : String(error)}`);
|
|
480
|
+
}
|
|
481
|
+
}
|
|
482
|
+
/**
|
|
483
|
+
* Encrypt multiple JSON objects in batch
|
|
484
|
+
*
|
|
485
|
+
* @param dataArray - Array of JSON objects to encrypt
|
|
486
|
+
* @param options - Optional encryption options
|
|
487
|
+
* @returns Promise<EncryptedJson[]> - Array of encrypted data
|
|
488
|
+
*/
|
|
489
|
+
async encryptBatch(dataArray, options) {
|
|
490
|
+
this.log(`🔐 Batch encrypting ${dataArray.length} items`);
|
|
491
|
+
const publicKeys = options?.publicKeys ?? this.config.publicKeys;
|
|
492
|
+
const requestIdPrefix = options?.requestIdPrefix ?? this.config.requestIdPrefix;
|
|
493
|
+
// Convert all data to base64
|
|
494
|
+
const dataBase64Array = dataArray.map((data) => this.jsonToBase64(data));
|
|
495
|
+
const request = {
|
|
496
|
+
Plaintext: dataBase64Array.map((text) => ({ Text: text })),
|
|
497
|
+
PublicKeyBroadcast: publicKeys,
|
|
498
|
+
};
|
|
499
|
+
// Call Seal API
|
|
500
|
+
const response = await this.makeHttpsRequest('/broadcast/asymmetric/seal/base64', request);
|
|
501
|
+
if (!response.Ciphertext || response.Ciphertext.length !== dataArray.length) {
|
|
502
|
+
throw new Error('API returned invalid number of ciphertexts');
|
|
503
|
+
}
|
|
504
|
+
// Map ciphertexts to EncryptedJson objects
|
|
505
|
+
return response.Ciphertext.map((item, index) => ({
|
|
506
|
+
requestId: `${requestIdPrefix}-batch-${Date.now()}-${index}`,
|
|
507
|
+
data: item.text,
|
|
508
|
+
timestamp: Date.now(),
|
|
509
|
+
encryptionMethod: 'seal-api',
|
|
510
|
+
}));
|
|
511
|
+
}
|
|
512
|
+
/**
|
|
513
|
+
* Update configuration
|
|
514
|
+
*/
|
|
515
|
+
updateConfig(config) {
|
|
516
|
+
if (config.apiBaseUrl) {
|
|
517
|
+
this.config.apiBaseUrl = config.apiBaseUrl.replace(/\/$/, '');
|
|
518
|
+
}
|
|
519
|
+
if (config.apiTimeout !== undefined) {
|
|
520
|
+
this.config.apiTimeout = config.apiTimeout;
|
|
521
|
+
}
|
|
522
|
+
if (config.tlsConfig !== undefined) {
|
|
523
|
+
this.config.tlsConfig = { ...this.config.tlsConfig, ...config.tlsConfig };
|
|
524
|
+
this.createHttpsAgent();
|
|
525
|
+
}
|
|
526
|
+
if (config.publicKeys) {
|
|
527
|
+
this.config.publicKeys = config.publicKeys;
|
|
528
|
+
this.validateConfig();
|
|
529
|
+
}
|
|
530
|
+
if (config.requestIdPrefix !== undefined) {
|
|
531
|
+
this.config.requestIdPrefix = config.requestIdPrefix;
|
|
532
|
+
}
|
|
533
|
+
if (config.enableLogging !== undefined) {
|
|
534
|
+
this.config.enableLogging = config.enableLogging;
|
|
535
|
+
}
|
|
536
|
+
}
|
|
537
|
+
/**
|
|
538
|
+
* Get current configuration (read-only)
|
|
539
|
+
*/
|
|
540
|
+
getConfig() {
|
|
541
|
+
return { ...this.config };
|
|
542
|
+
}
|
|
543
|
+
}
|
|
544
|
+
/**
|
|
545
|
+
* Create a JsonEncryptor instance with configuration
|
|
546
|
+
*
|
|
547
|
+
* @param config - Configuration object
|
|
548
|
+
* @returns JsonEncryptor instance
|
|
549
|
+
*
|
|
550
|
+
* @example
|
|
551
|
+
* const encryptor = createJsonEncryptor({
|
|
552
|
+
* apiBaseUrl: 'https://192.168.112.153:2798',
|
|
553
|
+
* publicKeys: [publicKey1, publicKey2],
|
|
554
|
+
* tlsConfig: {
|
|
555
|
+
* clientCertPath: './client.crt',
|
|
556
|
+
* clientKeyPath: './client.key',
|
|
557
|
+
* rejectUnauthorized: false,
|
|
558
|
+
* },
|
|
559
|
+
* enableLogging: true,
|
|
560
|
+
* });
|
|
561
|
+
*
|
|
562
|
+
* const encrypted = await encryptor.encrypt({ message: 'Hello World' });
|
|
563
|
+
* const decrypted = await encryptor.decrypt(encrypted);
|
|
564
|
+
*/
|
|
565
|
+
export function createJsonEncryptor(config) {
|
|
566
|
+
return new JsonEncryptor(config);
|
|
567
|
+
}
|
|
568
|
+
//# sourceMappingURL=json-encryptor.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"json-encryptor.js","sourceRoot":"","sources":["../../../lib/crypto/json-encryptor.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* SPLP Library Exports
|
|
3
|
+
* All utilities and classes available for use in your application
|
|
4
|
+
*/
|
|
5
|
+
export { KafkaWrapper } from './kafka/kafka-wrapper.js';
|
|
6
|
+
export { JsonEncryptor, createJsonEncryptor, } from './crypto/json-encryptor.js';
|
|
7
|
+
export type { JsonEncryptorConfig, EncryptedJson, DecryptedJson, } from './crypto/json-encryptor.js';
|
|
8
|
+
export { sanitizeXSS, sanitizeInjection, validateRequestId, validateIdentifier, sanitizeObject, parseJSONSafely, validateEncryptedMessage, RateLimiter, SecurityError, } from './utils/sanitizer.js';
|
|
9
|
+
export type { SanitizerOptions } from './utils/sanitizer.js';
|
|
10
|
+
export { generateRequestId, isValidRequestId } from './utils/request-id.js';
|
|
11
|
+
export { CircuitBreaker, CircuitState } from './utils/circuit-breaker.js';
|
|
12
|
+
export type { CircuitBreakerConfig } from './utils/circuit-breaker.js';
|
|
13
|
+
export { RetryManager, RetryConfigs } from './utils/retry-manager.js';
|
|
14
|
+
export type { RetryConfig } from './utils/retry-manager.js';
|
|
15
|
+
export { initTracing, shutdownTracing, getTracer, withSpan, addSpanAttributes, addSpanEvent, injectTraceContext, extractTraceContext, createChildSpan, requestIdToTraceId, setCustomTraceId, } from './tracing/tracer.js';
|
|
16
|
+
export type { TracingConfig } from './tracing/tracer.js';
|
|
17
|
+
export type { KafkaConfig, EncryptionConfig, RequestMessage, ResponseMessage, EncryptedMessage, LogEntry, RequestHandler, HandlerRegistry, BaseVerificationResult, DukcapilResult, BPJSTKResult, BPJSKesehatanResult, BankIndonesiaResult, VerificationResult, } from '../types/index.js';
|
|
18
|
+
//# sourceMappingURL=index.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../lib/index.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAGH,OAAO,EAAE,YAAY,EAAE,MAAM,0BAA0B,CAAC;AAGxD,OAAO,EACL,aAAa,EACb,mBAAmB,GACpB,MAAM,4BAA4B,CAAC;AACpC,YAAY,EACV,mBAAmB,EACnB,aAAa,EACb,aAAa,GACd,MAAM,4BAA4B,CAAC;AAGpC,OAAO,EACL,WAAW,EACX,iBAAiB,EACjB,iBAAiB,EACjB,kBAAkB,EAClB,cAAc,EACd,eAAe,EACf,wBAAwB,EACxB,WAAW,EACX,aAAa,GACd,MAAM,sBAAsB,CAAC;AAC9B,YAAY,EAAE,gBAAgB,EAAE,MAAM,sBAAsB,CAAC;AAG7D,OAAO,EAAE,iBAAiB,EAAE,gBAAgB,EAAE,MAAM,uBAAuB,CAAC;AAG5E,OAAO,EAAE,cAAc,EAAE,YAAY,EAAE,MAAM,4BAA4B,CAAC;AAC1E,YAAY,EAAE,oBAAoB,EAAE,MAAM,4BAA4B,CAAC;AACvE,OAAO,EAAE,YAAY,EAAE,YAAY,EAAE,MAAM,0BAA0B,CAAC;AACtE,YAAY,EAAE,WAAW,EAAE,MAAM,0BAA0B,CAAC;AAG5D,OAAO,EACL,WAAW,EACX,eAAe,EACf,SAAS,EACT,QAAQ,EACR,iBAAiB,EACjB,YAAY,EACZ,kBAAkB,EAClB,mBAAmB,EACnB,eAAe,EACf,kBAAkB,EAClB,gBAAgB,GACjB,MAAM,qBAAqB,CAAC;AAC7B,YAAY,EAAE,aAAa,EAAE,MAAM,qBAAqB,CAAC;AAGzD,YAAY,EACV,WAAW,EACX,gBAAgB,EAChB,cAAc,EACd,eAAe,EACf,gBAAgB,EAChB,QAAQ,EACR,cAAc,EACd,eAAe,EACf,sBAAsB,EACtB,cAAc,EACd,YAAY,EACZ,mBAAmB,EACnB,mBAAmB,EACnB,kBAAkB,GACnB,MAAM,mBAAmB,CAAC"}
|
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* SPLP Library Exports
|
|
3
|
+
* All utilities and classes available for use in your application
|
|
4
|
+
*/
|
|
5
|
+
// Kafka
|
|
6
|
+
export { KafkaWrapper } from './kafka/kafka-wrapper.js';
|
|
7
|
+
// Crypto / Encryption
|
|
8
|
+
export { JsonEncryptor, createJsonEncryptor, } from './crypto/json-encryptor.js';
|
|
9
|
+
// Security & Sanitization
|
|
10
|
+
export { sanitizeXSS, sanitizeInjection, validateRequestId, validateIdentifier, sanitizeObject, parseJSONSafely, validateEncryptedMessage, RateLimiter, SecurityError, } from './utils/sanitizer.js';
|
|
11
|
+
// Request ID
|
|
12
|
+
export { generateRequestId, isValidRequestId } from './utils/request-id.js';
|
|
13
|
+
// Resilience & Error Handling
|
|
14
|
+
export { CircuitBreaker, CircuitState } from './utils/circuit-breaker.js';
|
|
15
|
+
export { RetryManager, RetryConfigs } from './utils/retry-manager.js';
|
|
16
|
+
// Tracing
|
|
17
|
+
export { initTracing, shutdownTracing, getTracer, withSpan, addSpanAttributes, addSpanEvent, injectTraceContext, extractTraceContext, createChildSpan, requestIdToTraceId, setCustomTraceId, } from './tracing/tracer.js';
|
|
18
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../lib/index.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,QAAQ;AACR,OAAO,EAAE,YAAY,EAAE,MAAM,0BAA0B,CAAC;AAExD,sBAAsB;AACtB,OAAO,EACL,aAAa,EACb,mBAAmB,GACpB,MAAM,4BAA4B,CAAC;AAOpC,0BAA0B;AAC1B,OAAO,EACL,WAAW,EACX,iBAAiB,EACjB,iBAAiB,EACjB,kBAAkB,EAClB,cAAc,EACd,eAAe,EACf,wBAAwB,EACxB,WAAW,EACX,aAAa,GACd,MAAM,sBAAsB,CAAC;AAG9B,aAAa;AACb,OAAO,EAAE,iBAAiB,EAAE,gBAAgB,EAAE,MAAM,uBAAuB,CAAC;AAE5E,8BAA8B;AAC9B,OAAO,EAAE,cAAc,EAAE,YAAY,EAAE,MAAM,4BAA4B,CAAC;AAE1E,OAAO,EAAE,YAAY,EAAE,YAAY,EAAE,MAAM,0BAA0B,CAAC;AAGtE,UAAU;AACV,OAAO,EACL,WAAW,EACX,eAAe,EACf,SAAS,EACT,QAAQ,EACR,iBAAiB,EACjB,YAAY,EACZ,kBAAkB,EAClB,mBAAmB,EACnB,eAAe,EACf,kBAAkB,EAClB,gBAAgB,GACjB,MAAM,qBAAqB,CAAC"}
|