@capsara/sdk 1.0.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/LICENSE +74 -0
- package/README.md +230 -0
- package/dist/builder/capsa-builder.d.ts +167 -0
- package/dist/builder/capsa-builder.d.ts.map +1 -0
- package/dist/builder/capsa-builder.js +489 -0
- package/dist/builder/capsa-builder.js.map +1 -0
- package/dist/client/capsara-client.d.ts +96 -0
- package/dist/client/capsara-client.d.ts.map +1 -0
- package/dist/client/capsara-client.js +266 -0
- package/dist/client/capsara-client.js.map +1 -0
- package/dist/errors/account-error.d.ts +73 -0
- package/dist/errors/account-error.d.ts.map +1 -0
- package/dist/errors/account-error.js +155 -0
- package/dist/errors/account-error.js.map +1 -0
- package/dist/errors/audit-error.d.ts +34 -0
- package/dist/errors/audit-error.d.ts.map +1 -0
- package/dist/errors/audit-error.js +93 -0
- package/dist/errors/audit-error.js.map +1 -0
- package/dist/errors/auth-error.d.ts +38 -0
- package/dist/errors/auth-error.d.ts.map +1 -0
- package/dist/errors/auth-error.js +87 -0
- package/dist/errors/auth-error.js.map +1 -0
- package/dist/errors/capsa-error.d.ts +64 -0
- package/dist/errors/capsa-error.d.ts.map +1 -0
- package/dist/errors/capsa-error.js +172 -0
- package/dist/errors/capsa-error.js.map +1 -0
- package/dist/errors/capsara-error.d.ts +52 -0
- package/dist/errors/capsara-error.d.ts.map +1 -0
- package/dist/errors/capsara-error.js +83 -0
- package/dist/errors/capsara-error.js.map +1 -0
- package/dist/errors/index.d.ts +8 -0
- package/dist/errors/index.d.ts.map +1 -0
- package/dist/errors/index.js +7 -0
- package/dist/errors/index.js.map +1 -0
- package/dist/index.d.ts +7 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +5 -0
- package/dist/index.js.map +1 -0
- package/dist/internal/capsa-cache.d.ts +49 -0
- package/dist/internal/capsa-cache.d.ts.map +1 -0
- package/dist/internal/capsa-cache.js +118 -0
- package/dist/internal/capsa-cache.js.map +1 -0
- package/dist/internal/config/http-client.d.ts +37 -0
- package/dist/internal/config/http-client.d.ts.map +1 -0
- package/dist/internal/config/http-client.js +63 -0
- package/dist/internal/config/http-client.js.map +1 -0
- package/dist/internal/config/retry-interceptor.d.ts +18 -0
- package/dist/internal/config/retry-interceptor.d.ts.map +1 -0
- package/dist/internal/config/retry-interceptor.js +103 -0
- package/dist/internal/config/retry-interceptor.js.map +1 -0
- package/dist/internal/crypto/compression.d.ts +15 -0
- package/dist/internal/crypto/compression.d.ts.map +1 -0
- package/dist/internal/crypto/compression.js +34 -0
- package/dist/internal/crypto/compression.js.map +1 -0
- package/dist/internal/crypto/key-generator.d.ts +23 -0
- package/dist/internal/crypto/key-generator.d.ts.map +1 -0
- package/dist/internal/crypto/key-generator.js +65 -0
- package/dist/internal/crypto/key-generator.js.map +1 -0
- package/dist/internal/crypto/primitives.d.ts +67 -0
- package/dist/internal/crypto/primitives.d.ts.map +1 -0
- package/dist/internal/crypto/primitives.js +230 -0
- package/dist/internal/crypto/primitives.js.map +1 -0
- package/dist/internal/crypto/signatures.d.ts +30 -0
- package/dist/internal/crypto/signatures.d.ts.map +1 -0
- package/dist/internal/crypto/signatures.js +153 -0
- package/dist/internal/crypto/signatures.js.map +1 -0
- package/dist/internal/decryptor/capsa-decryptor.d.ts +89 -0
- package/dist/internal/decryptor/capsa-decryptor.d.ts.map +1 -0
- package/dist/internal/decryptor/capsa-decryptor.js +263 -0
- package/dist/internal/decryptor/capsa-decryptor.js.map +1 -0
- package/dist/internal/http-factory.d.ts +78 -0
- package/dist/internal/http-factory.d.ts.map +1 -0
- package/dist/internal/http-factory.js +201 -0
- package/dist/internal/http-factory.js.map +1 -0
- package/dist/internal/index.d.ts +5 -0
- package/dist/internal/index.d.ts.map +1 -0
- package/dist/internal/index.js +5 -0
- package/dist/internal/index.js.map +1 -0
- package/dist/internal/retry-executor.d.ts +74 -0
- package/dist/internal/retry-executor.d.ts.map +1 -0
- package/dist/internal/retry-executor.js +204 -0
- package/dist/internal/retry-executor.js.map +1 -0
- package/dist/internal/services/account-service.d.ts +56 -0
- package/dist/internal/services/account-service.d.ts.map +1 -0
- package/dist/internal/services/account-service.js +114 -0
- package/dist/internal/services/account-service.js.map +1 -0
- package/dist/internal/services/audit-service.d.ts +25 -0
- package/dist/internal/services/audit-service.d.ts.map +1 -0
- package/dist/internal/services/audit-service.js +43 -0
- package/dist/internal/services/audit-service.js.map +1 -0
- package/dist/internal/services/auth-service.d.ts +44 -0
- package/dist/internal/services/auth-service.d.ts.map +1 -0
- package/dist/internal/services/auth-service.js +170 -0
- package/dist/internal/services/auth-service.js.map +1 -0
- package/dist/internal/services/capsa-service.d.ts +40 -0
- package/dist/internal/services/capsa-service.d.ts.map +1 -0
- package/dist/internal/services/capsa-service.js +82 -0
- package/dist/internal/services/capsa-service.js.map +1 -0
- package/dist/internal/services/download-service.d.ts +62 -0
- package/dist/internal/services/download-service.d.ts.map +1 -0
- package/dist/internal/services/download-service.js +114 -0
- package/dist/internal/services/download-service.js.map +1 -0
- package/dist/internal/services/key-service.d.ts +28 -0
- package/dist/internal/services/key-service.d.ts.map +1 -0
- package/dist/internal/services/key-service.js +45 -0
- package/dist/internal/services/key-service.js.map +1 -0
- package/dist/internal/services/limits-service.d.ts +30 -0
- package/dist/internal/services/limits-service.d.ts.map +1 -0
- package/dist/internal/services/limits-service.js +73 -0
- package/dist/internal/services/limits-service.js.map +1 -0
- package/dist/internal/services/upload-service.d.ts +61 -0
- package/dist/internal/services/upload-service.d.ts.map +1 -0
- package/dist/internal/services/upload-service.js +258 -0
- package/dist/internal/services/upload-service.js.map +1 -0
- package/dist/internal/types.d.ts +74 -0
- package/dist/internal/types.d.ts.map +1 -0
- package/dist/internal/types.js +3 -0
- package/dist/internal/types.js.map +1 -0
- package/dist/internal/upload/multipart-builder.d.ts +57 -0
- package/dist/internal/upload/multipart-builder.d.ts.map +1 -0
- package/dist/internal/upload/multipart-builder.js +139 -0
- package/dist/internal/upload/multipart-builder.js.map +1 -0
- package/dist/internal/utils/id-generator.d.ts +8 -0
- package/dist/internal/utils/id-generator.d.ts.map +1 -0
- package/dist/internal/utils/id-generator.js +20 -0
- package/dist/internal/utils/id-generator.js.map +1 -0
- package/dist/internal/utils/mimetype-lookup.d.ts +8 -0
- package/dist/internal/utils/mimetype-lookup.d.ts.map +1 -0
- package/dist/internal/utils/mimetype-lookup.js +118 -0
- package/dist/internal/utils/mimetype-lookup.js.map +1 -0
- package/dist/internal/version.d.ts +20 -0
- package/dist/internal/version.d.ts.map +1 -0
- package/dist/internal/version.js +25 -0
- package/dist/internal/version.js.map +1 -0
- package/dist/types/index.d.ts +143 -0
- package/dist/types/index.d.ts.map +1 -0
- package/dist/types/index.js +20 -0
- package/dist/types/index.js.map +1 -0
- package/package.json +61 -0
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"capsa-cache.d.ts","sourceRoot":"","sources":["../../src/internal/capsa-cache.ts"],"names":[],"mappings":"AAGA,uDAAuD;AACvD,MAAM,WAAW,kBAAkB;IACjC,EAAE,EAAE,MAAM,CAAC;IACX,OAAO,EAAE,MAAM,CAAC;IAChB,UAAU,CAAC,EAAE,OAAO,CAAC;IACrB,iBAAiB,EAAE,MAAM,CAAC;IAC1B,UAAU,EAAE,MAAM,CAAC;IACnB,eAAe,EAAE,MAAM,CAAC;CACzB;AAED,4DAA4D;AAC5D,MAAM,WAAW,WAAW;IAC1B,iDAAiD;IACjD,SAAS,EAAE,MAAM,CAAC;IAClB,KAAK,EAAE,GAAG,CAAC,MAAM,EAAE,kBAAkB,CAAC,CAAC;IACvC,QAAQ,EAAE,MAAM,CAAC;IACjB,SAAS,EAAE,MAAM,CAAC;CACnB;AAED,MAAM,WAAW,gBAAgB;IAC/B,sDAAsD;IACtD,GAAG,CAAC,EAAE,MAAM,CAAC;IACb,sDAAsD;IACtD,OAAO,CAAC,EAAE,MAAM,CAAC;CAClB;AAOD;;;GAGG;AACH,qBAAa,mBAAmB;IAC9B,OAAO,CAAC,KAAK,CAAuC;IACpD,OAAO,CAAC,MAAM,CAA6B;gBAE/B,MAAM,CAAC,EAAE,gBAAgB;IAIrC,GAAG,CAAC,OAAO,EAAE,MAAM,EAAE,SAAS,EAAE,MAAM,EAAE,KAAK,EAAE,KAAK,CAAC;QAAE,MAAM,EAAE,MAAM,CAAA;KAAE,GAAG,kBAAkB,CAAC,GAAG,IAAI;IA0BpG,GAAG,CAAC,OAAO,EAAE,MAAM,GAAG,WAAW,GAAG,IAAI;IAexC,YAAY,CAAC,OAAO,EAAE,MAAM,GAAG,MAAM,GAAG,IAAI;IAK5C,eAAe,CAAC,OAAO,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,GAAG,kBAAkB,GAAG,IAAI;IAK3E,GAAG,CAAC,OAAO,EAAE,MAAM,GAAG,OAAO;IAI7B,+CAA+C;IAC/C,KAAK,CAAC,OAAO,EAAE,MAAM,GAAG,IAAI;IAQ5B,mDAAmD;IACnD,QAAQ,IAAI,IAAI;IAKhB,cAAc,CAAC,OAAO,EAAE,MAAM,GAAG,IAAI;IAQrC,IAAI,IAAI,IAAI,MAAM,CAEjB;IAED,KAAK,IAAI,IAAI;IAYb,OAAO,CAAC,WAAW;CAmBpB;AAED,wBAAgB,gBAAgB,CAAC,MAAM,CAAC,EAAE,gBAAgB,GAAG,mBAAmB,CAE/E"}
|
|
@@ -0,0 +1,118 @@
|
|
|
1
|
+
// In-memory cache for decrypted capsa master keys and file metadata.
|
|
2
|
+
// Security: master keys stored in memory only, cleared on logout, TTL-based expiry.
|
|
3
|
+
const DEFAULT_CONFIG = {
|
|
4
|
+
ttl: 5 * 60 * 1000, // 5 minutes
|
|
5
|
+
maxSize: 100,
|
|
6
|
+
};
|
|
7
|
+
/**
|
|
8
|
+
* Caches master keys after getCapsa() to avoid redundant RSA-4096 decryption
|
|
9
|
+
* on each file download.
|
|
10
|
+
*/
|
|
11
|
+
export class DecryptedCapsaCache {
|
|
12
|
+
cache = new Map();
|
|
13
|
+
config;
|
|
14
|
+
constructor(config) {
|
|
15
|
+
this.config = { ...DEFAULT_CONFIG, ...config };
|
|
16
|
+
}
|
|
17
|
+
set(capsaId, masterKey, files) {
|
|
18
|
+
if (this.cache.size >= this.config.maxSize) {
|
|
19
|
+
this.evictOldest();
|
|
20
|
+
}
|
|
21
|
+
const now = Date.now();
|
|
22
|
+
const fileMap = new Map();
|
|
23
|
+
for (const file of files) {
|
|
24
|
+
fileMap.set(file.fileId, {
|
|
25
|
+
iv: file.iv,
|
|
26
|
+
authTag: file.authTag,
|
|
27
|
+
compressed: file.compressed,
|
|
28
|
+
encryptedFilename: file.encryptedFilename,
|
|
29
|
+
filenameIV: file.filenameIV,
|
|
30
|
+
filenameAuthTag: file.filenameAuthTag,
|
|
31
|
+
});
|
|
32
|
+
}
|
|
33
|
+
this.cache.set(capsaId, {
|
|
34
|
+
masterKey,
|
|
35
|
+
files: fileMap,
|
|
36
|
+
cachedAt: now,
|
|
37
|
+
expiresAt: now + this.config.ttl,
|
|
38
|
+
});
|
|
39
|
+
}
|
|
40
|
+
get(capsaId) {
|
|
41
|
+
const entry = this.cache.get(capsaId);
|
|
42
|
+
if (!entry) {
|
|
43
|
+
return null;
|
|
44
|
+
}
|
|
45
|
+
if (Date.now() > entry.expiresAt) {
|
|
46
|
+
entry.masterKey.fill(0);
|
|
47
|
+
this.cache.delete(capsaId);
|
|
48
|
+
return null;
|
|
49
|
+
}
|
|
50
|
+
return entry;
|
|
51
|
+
}
|
|
52
|
+
getMasterKey(capsaId) {
|
|
53
|
+
const entry = this.get(capsaId);
|
|
54
|
+
return entry?.masterKey ?? null;
|
|
55
|
+
}
|
|
56
|
+
getFileMetadata(capsaId, fileId) {
|
|
57
|
+
const entry = this.get(capsaId);
|
|
58
|
+
return entry?.files.get(fileId) ?? null;
|
|
59
|
+
}
|
|
60
|
+
has(capsaId) {
|
|
61
|
+
return this.get(capsaId) !== null;
|
|
62
|
+
}
|
|
63
|
+
/** Zeroes master key and removes the entry. */
|
|
64
|
+
clear(capsaId) {
|
|
65
|
+
const entry = this.cache.get(capsaId);
|
|
66
|
+
if (entry) {
|
|
67
|
+
entry.masterKey.fill(0);
|
|
68
|
+
this.cache.delete(capsaId);
|
|
69
|
+
}
|
|
70
|
+
}
|
|
71
|
+
/** Zeroes all master keys and clears the cache. */
|
|
72
|
+
clearAll() {
|
|
73
|
+
this.cache.forEach(entry => entry.masterKey.fill(0));
|
|
74
|
+
this.cache.clear();
|
|
75
|
+
}
|
|
76
|
+
clearMasterKey(capsaId) {
|
|
77
|
+
const entry = this.cache.get(capsaId);
|
|
78
|
+
if (entry) {
|
|
79
|
+
entry.masterKey.fill(0);
|
|
80
|
+
this.cache.delete(capsaId);
|
|
81
|
+
}
|
|
82
|
+
}
|
|
83
|
+
get size() {
|
|
84
|
+
return this.cache.size;
|
|
85
|
+
}
|
|
86
|
+
prune() {
|
|
87
|
+
const now = Date.now();
|
|
88
|
+
const toDelete = [];
|
|
89
|
+
this.cache.forEach((entry, capsaId) => {
|
|
90
|
+
if (now > entry.expiresAt) {
|
|
91
|
+
entry.masterKey.fill(0);
|
|
92
|
+
toDelete.push(capsaId);
|
|
93
|
+
}
|
|
94
|
+
});
|
|
95
|
+
toDelete.forEach(id => this.cache.delete(id));
|
|
96
|
+
}
|
|
97
|
+
evictOldest() {
|
|
98
|
+
let oldestKey = null;
|
|
99
|
+
let oldestTime = Infinity;
|
|
100
|
+
this.cache.forEach((entry, key) => {
|
|
101
|
+
if (entry.cachedAt < oldestTime) {
|
|
102
|
+
oldestTime = entry.cachedAt;
|
|
103
|
+
oldestKey = key;
|
|
104
|
+
}
|
|
105
|
+
});
|
|
106
|
+
if (oldestKey) {
|
|
107
|
+
const entry = this.cache.get(oldestKey);
|
|
108
|
+
if (entry) {
|
|
109
|
+
entry.masterKey.fill(0);
|
|
110
|
+
}
|
|
111
|
+
this.cache.delete(oldestKey);
|
|
112
|
+
}
|
|
113
|
+
}
|
|
114
|
+
}
|
|
115
|
+
export function createCapsaCache(config) {
|
|
116
|
+
return new DecryptedCapsaCache(config);
|
|
117
|
+
}
|
|
118
|
+
//# sourceMappingURL=capsa-cache.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"capsa-cache.js","sourceRoot":"","sources":["../../src/internal/capsa-cache.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,37 @@
|
|
|
1
|
+
import * as http from 'http';
|
|
2
|
+
import * as https from 'https';
|
|
3
|
+
import type { AxiosRequestConfig, AxiosInstance } from 'axios';
|
|
4
|
+
import { type RetryConfig } from './retry-interceptor.js';
|
|
5
|
+
export interface HttpTimeoutConfig {
|
|
6
|
+
/** Timeout for standard API requests (ms) */
|
|
7
|
+
apiTimeout: number;
|
|
8
|
+
/** Timeout for multipart envelope uploads (ms) */
|
|
9
|
+
uploadTimeout: number;
|
|
10
|
+
/** Timeout for file downloads (ms) */
|
|
11
|
+
downloadTimeout: number;
|
|
12
|
+
/** Socket connection timeout (ms) */
|
|
13
|
+
connectTimeout: number;
|
|
14
|
+
/** Keep-alive probe interval (ms) */
|
|
15
|
+
keepAliveInterval: number;
|
|
16
|
+
/** Maximum concurrent sockets per host */
|
|
17
|
+
maxSockets: number;
|
|
18
|
+
/** Maximum idle sockets to keep alive */
|
|
19
|
+
maxFreeSockets: number;
|
|
20
|
+
}
|
|
21
|
+
export declare const DEFAULT_TIMEOUT_CONFIG: HttpTimeoutConfig;
|
|
22
|
+
export declare function createHttpAgent(config?: HttpTimeoutConfig): http.Agent;
|
|
23
|
+
export declare function createHttpsAgent(config?: HttpTimeoutConfig): https.Agent;
|
|
24
|
+
export interface AxiosConfigOptions {
|
|
25
|
+
/** API base URL */
|
|
26
|
+
baseURL: string;
|
|
27
|
+
/** Request timeout in milliseconds */
|
|
28
|
+
timeout?: number;
|
|
29
|
+
/** Timeout configuration for agents */
|
|
30
|
+
timeoutConfig?: HttpTimeoutConfig;
|
|
31
|
+
/** Custom user agent string to append to default SDK user agent */
|
|
32
|
+
userAgent?: string;
|
|
33
|
+
}
|
|
34
|
+
export declare function createAxiosConfig(baseURL: string, timeout?: number, config?: HttpTimeoutConfig, userAgent?: string): AxiosRequestConfig;
|
|
35
|
+
export declare function configureRetryInterceptor(axiosInstance: AxiosInstance, retryConfig?: RetryConfig): void;
|
|
36
|
+
export declare function createAgentForProtocol(protocol: string, timeout: number, config?: HttpTimeoutConfig): http.Agent | https.Agent;
|
|
37
|
+
//# sourceMappingURL=http-client.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"http-client.d.ts","sourceRoot":"","sources":["../../../src/internal/config/http-client.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,IAAI,MAAM,MAAM,CAAC;AAC7B,OAAO,KAAK,KAAK,MAAM,OAAO,CAAC;AAC/B,OAAO,KAAK,EAAE,kBAAkB,EAAE,aAAa,EAAE,MAAM,OAAO,CAAC;AAC/D,OAAO,EAAuB,KAAK,WAAW,EAAE,MAAM,wBAAwB,CAAC;AAG/E,MAAM,WAAW,iBAAiB;IAChC,6CAA6C;IAC7C,UAAU,EAAE,MAAM,CAAC;IACnB,kDAAkD;IAClD,aAAa,EAAE,MAAM,CAAC;IACtB,sCAAsC;IACtC,eAAe,EAAE,MAAM,CAAC;IACxB,qCAAqC;IACrC,cAAc,EAAE,MAAM,CAAC;IACvB,qCAAqC;IACrC,iBAAiB,EAAE,MAAM,CAAC;IAC1B,0CAA0C;IAC1C,UAAU,EAAE,MAAM,CAAC;IACnB,yCAAyC;IACzC,cAAc,EAAE,MAAM,CAAC;CACxB;AAKD,eAAO,MAAM,sBAAsB,EAAE,iBAQpC,CAAC;AAEF,wBAAgB,eAAe,CAAC,MAAM,GAAE,iBAA0C,GAAG,IAAI,CAAC,KAAK,CAQ9F;AAED,wBAAgB,gBAAgB,CAAC,MAAM,GAAE,iBAA0C,GAAG,KAAK,CAAC,KAAK,CAQhG;AAED,MAAM,WAAW,kBAAkB;IACjC,mBAAmB;IACnB,OAAO,EAAE,MAAM,CAAC;IAChB,sCAAsC;IACtC,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,uCAAuC;IACvC,aAAa,CAAC,EAAE,iBAAiB,CAAC;IAClC,mEAAmE;IACnE,SAAS,CAAC,EAAE,MAAM,CAAC;CACpB;AAED,wBAAgB,iBAAiB,CAC/B,OAAO,EAAE,MAAM,EACf,OAAO,GAAE,MAA0C,EACnD,MAAM,GAAE,iBAA0C,EAClD,SAAS,CAAC,EAAE,MAAM,GACjB,kBAAkB,CAWpB;AAED,wBAAgB,yBAAyB,CACvC,aAAa,EAAE,aAAa,EAC5B,WAAW,CAAC,EAAE,WAAW,GACxB,IAAI,CAEN;AAED,wBAAgB,sBAAsB,CACpC,QAAQ,EAAE,MAAM,EAChB,OAAO,EAAE,MAAM,EACf,MAAM,GAAE,iBAA0C,GACjD,IAAI,CAAC,KAAK,GAAG,KAAK,CAAC,KAAK,CAY1B"}
|
|
@@ -0,0 +1,63 @@
|
|
|
1
|
+
// HTTP client configuration with timeout and keep-alive settings.
|
|
2
|
+
import * as http from 'http';
|
|
3
|
+
import * as https from 'https';
|
|
4
|
+
import { addRetryInterceptor } from './retry-interceptor.js';
|
|
5
|
+
import { SDK_VERSION, buildUserAgent } from '../version.js';
|
|
6
|
+
// SDK timeouts must exceed server timeouts to avoid ECONNRESET errors.
|
|
7
|
+
// If SDK timeout < server timeout, client kills the connection before the server responds.
|
|
8
|
+
// vault.api server timeout: 10 min request, 11 min keepAlive, 30s MongoDB/circuit breaker.
|
|
9
|
+
export const DEFAULT_TIMEOUT_CONFIG = {
|
|
10
|
+
apiTimeout: 12 * 60 * 1000, // 12 minutes (exceeds server 10 min timeout)
|
|
11
|
+
uploadTimeout: 15 * 60 * 1000, // 15 minutes for multipart uploads (extra margin for large payloads)
|
|
12
|
+
downloadTimeout: 60 * 1000, // 1 minute for file downloads (Azure Blob Storage should be fast)
|
|
13
|
+
connectTimeout: 30 * 1000, // 30 seconds for socket connection
|
|
14
|
+
keepAliveInterval: 30 * 1000, // 30 seconds keep-alive probe interval
|
|
15
|
+
maxSockets: 50, // Max 50 concurrent sockets per host
|
|
16
|
+
maxFreeSockets: 10, // Keep 10 idle sockets alive
|
|
17
|
+
};
|
|
18
|
+
export function createHttpAgent(config = DEFAULT_TIMEOUT_CONFIG) {
|
|
19
|
+
return new http.Agent({
|
|
20
|
+
keepAlive: true,
|
|
21
|
+
keepAliveMsecs: config.keepAliveInterval,
|
|
22
|
+
timeout: config.apiTimeout,
|
|
23
|
+
maxSockets: config.maxSockets,
|
|
24
|
+
maxFreeSockets: config.maxFreeSockets,
|
|
25
|
+
});
|
|
26
|
+
}
|
|
27
|
+
export function createHttpsAgent(config = DEFAULT_TIMEOUT_CONFIG) {
|
|
28
|
+
return new https.Agent({
|
|
29
|
+
keepAlive: true,
|
|
30
|
+
keepAliveMsecs: config.keepAliveInterval,
|
|
31
|
+
timeout: config.apiTimeout,
|
|
32
|
+
maxSockets: config.maxSockets,
|
|
33
|
+
maxFreeSockets: config.maxFreeSockets,
|
|
34
|
+
});
|
|
35
|
+
}
|
|
36
|
+
export function createAxiosConfig(baseURL, timeout = DEFAULT_TIMEOUT_CONFIG.apiTimeout, config = DEFAULT_TIMEOUT_CONFIG, userAgent) {
|
|
37
|
+
return {
|
|
38
|
+
baseURL,
|
|
39
|
+
timeout,
|
|
40
|
+
httpAgent: createHttpAgent(config),
|
|
41
|
+
httpsAgent: createHttpsAgent(config),
|
|
42
|
+
headers: {
|
|
43
|
+
'User-Agent': buildUserAgent(userAgent),
|
|
44
|
+
'X-SDK-Version': SDK_VERSION,
|
|
45
|
+
},
|
|
46
|
+
};
|
|
47
|
+
}
|
|
48
|
+
export function configureRetryInterceptor(axiosInstance, retryConfig) {
|
|
49
|
+
addRetryInterceptor(axiosInstance, retryConfig);
|
|
50
|
+
}
|
|
51
|
+
export function createAgentForProtocol(protocol, timeout, config = DEFAULT_TIMEOUT_CONFIG) {
|
|
52
|
+
const agentConfig = {
|
|
53
|
+
keepAlive: true,
|
|
54
|
+
keepAliveMsecs: config.keepAliveInterval,
|
|
55
|
+
timeout,
|
|
56
|
+
maxSockets: config.maxSockets,
|
|
57
|
+
maxFreeSockets: config.maxFreeSockets,
|
|
58
|
+
};
|
|
59
|
+
return protocol === 'https:'
|
|
60
|
+
? new https.Agent(agentConfig)
|
|
61
|
+
: new http.Agent(agentConfig);
|
|
62
|
+
}
|
|
63
|
+
//# sourceMappingURL=http-client.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"http-client.js","sourceRoot":"","sources":["../../../src/internal/config/http-client.ts"],"names":[],"mappings":"AAAA,kEAAkE;AAElE,OAAO,KAAK,IAAI,MAAM,MAAM,CAAC;AAC7B,OAAO,KAAK,KAAK,MAAM,OAAO,CAAC;AAE/B,OAAO,EAAE,mBAAmB,EAAoB,MAAM,wBAAwB,CAAC;AAC/E,OAAO,EAAE,WAAW,EAAE,cAAc,EAAE,MAAM,eAAe,CAAC;AAmB5D,uEAAuE;AACvE,2FAA2F;AAC3F,2FAA2F;AAC3F,MAAM,CAAC,MAAM,sBAAsB,GAAsB;IACvD,UAAU,EAAE,EAAE,GAAG,EAAE,GAAG,IAAI,EAAS,6CAA6C;IAChF,aAAa,EAAE,EAAE,GAAG,EAAE,GAAG,IAAI,EAAM,qEAAqE;IACxG,eAAe,EAAE,EAAE,GAAG,IAAI,EAAS,kEAAkE;IACrG,cAAc,EAAE,EAAE,GAAG,IAAI,EAAU,mCAAmC;IACtE,iBAAiB,EAAE,EAAE,GAAG,IAAI,EAAO,uCAAuC;IAC1E,UAAU,EAAE,EAAE,EAAqB,qCAAqC;IACxE,cAAc,EAAE,EAAE,EAAiB,6BAA6B;CACjE,CAAC;AAEF,MAAM,UAAU,eAAe,CAAC,SAA4B,sBAAsB;IAChF,OAAO,IAAI,IAAI,CAAC,KAAK,CAAC;QACpB,SAAS,EAAE,IAAI;QACf,cAAc,EAAE,MAAM,CAAC,iBAAiB;QACxC,OAAO,EAAE,MAAM,CAAC,UAAU;QAC1B,UAAU,EAAE,MAAM,CAAC,UAAU;QAC7B,cAAc,EAAE,MAAM,CAAC,cAAc;KACtC,CAAC,CAAC;AACL,CAAC;AAED,MAAM,UAAU,gBAAgB,CAAC,SAA4B,sBAAsB;IACjF,OAAO,IAAI,KAAK,CAAC,KAAK,CAAC;QACrB,SAAS,EAAE,IAAI;QACf,cAAc,EAAE,MAAM,CAAC,iBAAiB;QACxC,OAAO,EAAE,MAAM,CAAC,UAAU;QAC1B,UAAU,EAAE,MAAM,CAAC,UAAU;QAC7B,cAAc,EAAE,MAAM,CAAC,cAAc;KACtC,CAAC,CAAC;AACL,CAAC;AAaD,MAAM,UAAU,iBAAiB,CAC/B,OAAe,EACf,UAAkB,sBAAsB,CAAC,UAAU,EACnD,SAA4B,sBAAsB,EAClD,SAAkB;IAElB,OAAO;QACL,OAAO;QACP,OAAO;QACP,SAAS,EAAE,eAAe,CAAC,MAAM,CAAC;QAClC,UAAU,EAAE,gBAAgB,CAAC,MAAM,CAAC;QACpC,OAAO,EAAE;YACP,YAAY,EAAE,cAAc,CAAC,SAAS,CAAC;YACvC,eAAe,EAAE,WAAW;SAC7B;KACF,CAAC;AACJ,CAAC;AAED,MAAM,UAAU,yBAAyB,CACvC,aAA4B,EAC5B,WAAyB;IAEzB,mBAAmB,CAAC,aAAa,EAAE,WAAW,CAAC,CAAC;AAClD,CAAC;AAED,MAAM,UAAU,sBAAsB,CACpC,QAAgB,EAChB,OAAe,EACf,SAA4B,sBAAsB;IAElD,MAAM,WAAW,GAAG;QAClB,SAAS,EAAE,IAAI;QACf,cAAc,EAAE,MAAM,CAAC,iBAAiB;QACxC,OAAO;QACP,UAAU,EAAE,MAAM,CAAC,UAAU;QAC7B,cAAc,EAAE,MAAM,CAAC,cAAc;KACtC,CAAC;IAEF,OAAO,QAAQ,KAAK,QAAQ;QAC1B,CAAC,CAAC,IAAI,KAAK,CAAC,KAAK,CAAC,WAAW,CAAC;QAC9B,CAAC,CAAC,IAAI,IAAI,CAAC,KAAK,CAAC,WAAW,CAAC,CAAC;AAClC,CAAC"}
|
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
import type { AxiosInstance } from 'axios';
|
|
2
|
+
export interface RetryLogger {
|
|
3
|
+
log: (message: string) => void;
|
|
4
|
+
}
|
|
5
|
+
export interface RetryConfig {
|
|
6
|
+
/** Maximum number of retry attempts (default: 3) */
|
|
7
|
+
maxRetries?: number;
|
|
8
|
+
/** Base delay for exponential backoff in ms (default: 1000) */
|
|
9
|
+
baseDelay?: number;
|
|
10
|
+
/** Maximum delay between retries in ms (default: 30000 = 30 seconds) */
|
|
11
|
+
maxDelay?: number;
|
|
12
|
+
/** Enable debug logging for retries (default: false) */
|
|
13
|
+
enableLogging?: boolean;
|
|
14
|
+
/** Custom logger (defaults to console) */
|
|
15
|
+
logger?: RetryLogger;
|
|
16
|
+
}
|
|
17
|
+
export declare function addRetryInterceptor(axiosInstance: AxiosInstance, config?: RetryConfig): void;
|
|
18
|
+
//# sourceMappingURL=retry-interceptor.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"retry-interceptor.d.ts","sourceRoot":"","sources":["../../../src/internal/config/retry-interceptor.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAc,aAAa,EAA8B,MAAM,OAAO,CAAC;AAEnF,MAAM,WAAW,WAAW;IAC1B,GAAG,EAAE,CAAC,OAAO,EAAE,MAAM,KAAK,IAAI,CAAC;CAChC;AAED,MAAM,WAAW,WAAW;IAC1B,oDAAoD;IACpD,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,+DAA+D;IAC/D,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,wEAAwE;IACxE,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,wDAAwD;IACxD,aAAa,CAAC,EAAE,OAAO,CAAC;IACxB,0CAA0C;IAC1C,MAAM,CAAC,EAAE,WAAW,CAAC;CACtB;AA4FD,wBAAgB,mBAAmB,CACjC,aAAa,EAAE,aAAa,EAC5B,MAAM,GAAE,WAAgB,GACvB,IAAI,CAsDN"}
|
|
@@ -0,0 +1,103 @@
|
|
|
1
|
+
// Axios retry interceptor for 503 and 429 errors with exponential backoff.
|
|
2
|
+
const defaultLogger = {
|
|
3
|
+
// eslint-disable-next-line no-console
|
|
4
|
+
log: (message) => console.log(message),
|
|
5
|
+
};
|
|
6
|
+
const DEFAULT_RETRY_CONFIG = {
|
|
7
|
+
maxRetries: 3,
|
|
8
|
+
baseDelay: 1000, // 1 second base delay
|
|
9
|
+
maxDelay: 30000, // 30 seconds max delay
|
|
10
|
+
enableLogging: false,
|
|
11
|
+
logger: defaultLogger,
|
|
12
|
+
};
|
|
13
|
+
/** Parses Retry-After header as seconds or HTTP date, returns delay in ms. */
|
|
14
|
+
function parseRetryAfterHeader(retryAfter) {
|
|
15
|
+
if (!retryAfter)
|
|
16
|
+
return null;
|
|
17
|
+
const seconds = parseInt(retryAfter, 10);
|
|
18
|
+
if (!isNaN(seconds)) {
|
|
19
|
+
return seconds * 1000;
|
|
20
|
+
}
|
|
21
|
+
// Try parsing as HTTP date
|
|
22
|
+
const date = new Date(retryAfter);
|
|
23
|
+
if (!isNaN(date.getTime())) {
|
|
24
|
+
const delay = date.getTime() - Date.now();
|
|
25
|
+
return delay > 0 ? delay : 0;
|
|
26
|
+
}
|
|
27
|
+
return null;
|
|
28
|
+
}
|
|
29
|
+
function calculateExponentialBackoff(retryCount, baseDelay, maxDelay) {
|
|
30
|
+
// baseDelay * 2^retryCount with +30% jitter
|
|
31
|
+
const exponentialDelay = baseDelay * Math.pow(2, retryCount);
|
|
32
|
+
const jitter = Math.random() * 0.3 * exponentialDelay;
|
|
33
|
+
const delay = Math.min(exponentialDelay + jitter, maxDelay);
|
|
34
|
+
return Math.floor(delay);
|
|
35
|
+
}
|
|
36
|
+
function hasRetryAfter(data) {
|
|
37
|
+
return (typeof data === 'object' &&
|
|
38
|
+
data !== null &&
|
|
39
|
+
'error' in data &&
|
|
40
|
+
typeof data.error === 'object' &&
|
|
41
|
+
data.error !== null &&
|
|
42
|
+
'retryAfter' in data.error);
|
|
43
|
+
}
|
|
44
|
+
/** Extracts retry delay from response body (error.retryAfter) or Retry-After header. */
|
|
45
|
+
function getServerSuggestedDelay(error) {
|
|
46
|
+
const responseData = error.response?.data;
|
|
47
|
+
if (hasRetryAfter(responseData)) {
|
|
48
|
+
const retryAfter = responseData.error?.retryAfter;
|
|
49
|
+
if (typeof retryAfter === 'number') {
|
|
50
|
+
return retryAfter * 1000;
|
|
51
|
+
}
|
|
52
|
+
}
|
|
53
|
+
const headers = error.response?.headers;
|
|
54
|
+
const retryAfterHeader = headers?.['retry-after'];
|
|
55
|
+
if (retryAfterHeader && typeof retryAfterHeader === 'string') {
|
|
56
|
+
return parseRetryAfterHeader(retryAfterHeader);
|
|
57
|
+
}
|
|
58
|
+
return null;
|
|
59
|
+
}
|
|
60
|
+
function isRetryableError(error) {
|
|
61
|
+
if (!error.response)
|
|
62
|
+
return false;
|
|
63
|
+
const status = error.response.status;
|
|
64
|
+
return status === 503 || status === 429;
|
|
65
|
+
}
|
|
66
|
+
function sleep(ms) {
|
|
67
|
+
return new Promise(resolve => globalThis.setTimeout(resolve, ms));
|
|
68
|
+
}
|
|
69
|
+
export function addRetryInterceptor(axiosInstance, config = {}) {
|
|
70
|
+
const retryConfig = { ...DEFAULT_RETRY_CONFIG, ...config };
|
|
71
|
+
axiosInstance.interceptors.response.use((response) => response, async (error) => {
|
|
72
|
+
const requestConfig = error.config;
|
|
73
|
+
if (!requestConfig) {
|
|
74
|
+
return Promise.reject(error);
|
|
75
|
+
}
|
|
76
|
+
if (requestConfig.__retryCount === undefined) {
|
|
77
|
+
requestConfig.__retryCount = 0;
|
|
78
|
+
}
|
|
79
|
+
if (!isRetryableError(error) || requestConfig.__retryCount >= retryConfig.maxRetries) {
|
|
80
|
+
return Promise.reject(error);
|
|
81
|
+
}
|
|
82
|
+
requestConfig.__retryCount++;
|
|
83
|
+
let retryDelay;
|
|
84
|
+
const serverDelay = getServerSuggestedDelay(error);
|
|
85
|
+
if (serverDelay !== null) {
|
|
86
|
+
retryDelay = Math.min(serverDelay, retryConfig.maxDelay);
|
|
87
|
+
if (retryConfig.enableLogging) {
|
|
88
|
+
retryConfig.logger.log(`[Capsara SDK] Retry attempt ${requestConfig.__retryCount}/${retryConfig.maxRetries} ` +
|
|
89
|
+
`for ${error.response?.status} error - waiting ${retryDelay}ms (server suggested)`);
|
|
90
|
+
}
|
|
91
|
+
}
|
|
92
|
+
else {
|
|
93
|
+
retryDelay = calculateExponentialBackoff(requestConfig.__retryCount - 1, retryConfig.baseDelay, retryConfig.maxDelay);
|
|
94
|
+
if (retryConfig.enableLogging) {
|
|
95
|
+
retryConfig.logger.log(`[Capsara SDK] Retry attempt ${requestConfig.__retryCount}/${retryConfig.maxRetries} ` +
|
|
96
|
+
`for ${error.response?.status} error - waiting ${retryDelay}ms (exponential backoff)`);
|
|
97
|
+
}
|
|
98
|
+
}
|
|
99
|
+
await sleep(retryDelay);
|
|
100
|
+
return axiosInstance.request(requestConfig);
|
|
101
|
+
});
|
|
102
|
+
}
|
|
103
|
+
//# sourceMappingURL=retry-interceptor.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"retry-interceptor.js","sourceRoot":"","sources":["../../../src/internal/config/retry-interceptor.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
/** Gzip compression/decompression applied before encryption. */
|
|
2
|
+
export interface CompressionResult {
|
|
3
|
+
compressedData: Buffer;
|
|
4
|
+
originalSize: number;
|
|
5
|
+
compressedSize: number;
|
|
6
|
+
}
|
|
7
|
+
/** Compress data using gzip. */
|
|
8
|
+
export declare function compressData(data: Buffer): Promise<CompressionResult>;
|
|
9
|
+
/** @throws Error if decompression fails */
|
|
10
|
+
export declare function decompressData(data: Buffer): Promise<Buffer>;
|
|
11
|
+
/**
|
|
12
|
+
* Files smaller than 150 bytes don't benefit from compression (gzip header overhead breakeven).
|
|
13
|
+
*/
|
|
14
|
+
export declare function shouldCompress(size: number): boolean;
|
|
15
|
+
//# sourceMappingURL=compression.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"compression.d.ts","sourceRoot":"","sources":["../../../src/internal/crypto/compression.ts"],"names":[],"mappings":"AAAA,gEAAgE;AAQhE,MAAM,WAAW,iBAAiB;IAChC,cAAc,EAAE,MAAM,CAAC;IACvB,YAAY,EAAE,MAAM,CAAC;IACrB,cAAc,EAAE,MAAM,CAAC;CACxB;AAED,gCAAgC;AAChC,wBAAsB,YAAY,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,iBAAiB,CAAC,CAW3E;AAED,2CAA2C;AAC3C,wBAAsB,cAAc,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC,CAMlE;AAED;;GAEG;AACH,wBAAgB,cAAc,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAGpD"}
|
|
@@ -0,0 +1,34 @@
|
|
|
1
|
+
/** Gzip compression/decompression applied before encryption. */
|
|
2
|
+
import * as zlib from 'zlib';
|
|
3
|
+
import { promisify } from 'util';
|
|
4
|
+
const gzipAsync = promisify(zlib.gzip);
|
|
5
|
+
const gunzipAsync = promisify(zlib.gunzip);
|
|
6
|
+
/** Compress data using gzip. */
|
|
7
|
+
export async function compressData(data) {
|
|
8
|
+
const originalSize = data.length;
|
|
9
|
+
const compressedData = await gzipAsync(data, {
|
|
10
|
+
level: zlib.constants.Z_DEFAULT_COMPRESSION, // Balance between speed and compression
|
|
11
|
+
});
|
|
12
|
+
return {
|
|
13
|
+
compressedData,
|
|
14
|
+
originalSize,
|
|
15
|
+
compressedSize: compressedData.length,
|
|
16
|
+
};
|
|
17
|
+
}
|
|
18
|
+
/** @throws Error if decompression fails */
|
|
19
|
+
export async function decompressData(data) {
|
|
20
|
+
try {
|
|
21
|
+
return await gunzipAsync(data);
|
|
22
|
+
}
|
|
23
|
+
catch (error) {
|
|
24
|
+
throw new Error(`Failed to decompress data: ${error instanceof Error ? error.message : 'Unknown error'}`);
|
|
25
|
+
}
|
|
26
|
+
}
|
|
27
|
+
/**
|
|
28
|
+
* Files smaller than 150 bytes don't benefit from compression (gzip header overhead breakeven).
|
|
29
|
+
*/
|
|
30
|
+
export function shouldCompress(size) {
|
|
31
|
+
const MIN_COMPRESSION_SIZE = 150; // 150 bytes (gzip header overhead breakeven point)
|
|
32
|
+
return size >= MIN_COMPRESSION_SIZE;
|
|
33
|
+
}
|
|
34
|
+
//# sourceMappingURL=compression.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"compression.js","sourceRoot":"","sources":["../../../src/internal/crypto/compression.ts"],"names":[],"mappings":"AAAA,gEAAgE;AAEhE,OAAO,KAAK,IAAI,MAAM,MAAM,CAAC;AAC7B,OAAO,EAAE,SAAS,EAAE,MAAM,MAAM,CAAC;AAEjC,MAAM,SAAS,GAAG,SAAS,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;AACvC,MAAM,WAAW,GAAG,SAAS,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;AAQ3C,gCAAgC;AAChC,MAAM,CAAC,KAAK,UAAU,YAAY,CAAC,IAAY;IAC7C,MAAM,YAAY,GAAG,IAAI,CAAC,MAAM,CAAC;IACjC,MAAM,cAAc,GAAG,MAAM,SAAS,CAAC,IAAI,EAAE;QAC3C,KAAK,EAAE,IAAI,CAAC,SAAS,CAAC,qBAAqB,EAAE,wCAAwC;KACtF,CAAC,CAAC;IAEH,OAAO;QACL,cAAc;QACd,YAAY;QACZ,cAAc,EAAE,cAAc,CAAC,MAAM;KACtC,CAAC;AACJ,CAAC;AAED,2CAA2C;AAC3C,MAAM,CAAC,KAAK,UAAU,cAAc,CAAC,IAAY;IAC/C,IAAI,CAAC;QACH,OAAO,MAAM,WAAW,CAAC,IAAI,CAAC,CAAC;IACjC,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,MAAM,IAAI,KAAK,CAAC,8BAA8B,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,eAAe,EAAE,CAAC,CAAC;IAC5G,CAAC;AACH,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,cAAc,CAAC,IAAY;IACzC,MAAM,oBAAoB,GAAG,GAAG,CAAC,CAAC,mDAAmD;IACrF,OAAO,IAAI,IAAI,oBAAoB,CAAC;AACtC,CAAC"}
|
|
@@ -0,0 +1,23 @@
|
|
|
1
|
+
/** RSA-4096 key pair generation and validation. */
|
|
2
|
+
export interface GeneratedKeyPair {
|
|
3
|
+
publicKey: string;
|
|
4
|
+
privateKey: string;
|
|
5
|
+
publicKeyFingerprint: string;
|
|
6
|
+
algorithm: 'RSA-4096';
|
|
7
|
+
keySize: 4096;
|
|
8
|
+
publicExponent: 65537;
|
|
9
|
+
}
|
|
10
|
+
/**
|
|
11
|
+
* Generate RSA-4096 key pair for use with Capsara API.
|
|
12
|
+
* Private key must be stored securely by the application (password-protected storage).
|
|
13
|
+
* Public key should be uploaded to the API via AccountClient.addPublicKey().
|
|
14
|
+
*/
|
|
15
|
+
export declare function generateKeyPair(): Promise<GeneratedKeyPair>;
|
|
16
|
+
/**
|
|
17
|
+
* Calculate SHA-256 fingerprint of public key.
|
|
18
|
+
* Matches API's computeKeyFingerprint: hashes the entire PEM string including headers/footers.
|
|
19
|
+
*/
|
|
20
|
+
export declare function calculateKeyFingerprint(publicKeyPEM: string): string;
|
|
21
|
+
/** Validate that public and private keys are PEM-formatted and form a working pair. */
|
|
22
|
+
export declare function validateKeyPair(publicKey: string, privateKey: string): boolean;
|
|
23
|
+
//# sourceMappingURL=key-generator.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"key-generator.d.ts","sourceRoot":"","sources":["../../../src/internal/crypto/key-generator.ts"],"names":[],"mappings":"AAAA,mDAAmD;AAOnD,MAAM,WAAW,gBAAgB;IAC/B,SAAS,EAAE,MAAM,CAAC;IAClB,UAAU,EAAE,MAAM,CAAC;IACnB,oBAAoB,EAAE,MAAM,CAAC;IAC7B,SAAS,EAAE,UAAU,CAAC;IACtB,OAAO,EAAE,IAAI,CAAC;IACd,cAAc,EAAE,KAAK,CAAC;CACvB;AAED;;;;GAIG;AACH,wBAAsB,eAAe,IAAI,OAAO,CAAC,gBAAgB,CAAC,CAwBjE;AAED;;;GAGG;AACH,wBAAgB,uBAAuB,CAAC,YAAY,EAAE,MAAM,GAAG,MAAM,CAIpE;AAED,uFAAuF;AACvF,wBAAgB,eAAe,CAAC,SAAS,EAAE,MAAM,EAAE,UAAU,EAAE,MAAM,GAAG,OAAO,CA8B9E"}
|
|
@@ -0,0 +1,65 @@
|
|
|
1
|
+
/** RSA-4096 key pair generation and validation. */
|
|
2
|
+
import * as crypto from 'crypto';
|
|
3
|
+
import { promisify } from 'util';
|
|
4
|
+
const generateKeyPairAsync = promisify(crypto.generateKeyPair);
|
|
5
|
+
/**
|
|
6
|
+
* Generate RSA-4096 key pair for use with Capsara API.
|
|
7
|
+
* Private key must be stored securely by the application (password-protected storage).
|
|
8
|
+
* Public key should be uploaded to the API via AccountClient.addPublicKey().
|
|
9
|
+
*/
|
|
10
|
+
export async function generateKeyPair() {
|
|
11
|
+
const { publicKey, privateKey } = await generateKeyPairAsync('rsa', {
|
|
12
|
+
modulusLength: 4096,
|
|
13
|
+
publicExponent: 65537,
|
|
14
|
+
publicKeyEncoding: {
|
|
15
|
+
type: 'spki', // X.509 SubjectPublicKeyInfo
|
|
16
|
+
format: 'pem',
|
|
17
|
+
},
|
|
18
|
+
privateKeyEncoding: {
|
|
19
|
+
type: 'pkcs8', // PKCS#8
|
|
20
|
+
format: 'pem',
|
|
21
|
+
},
|
|
22
|
+
});
|
|
23
|
+
const fingerprint = calculateKeyFingerprint(publicKey);
|
|
24
|
+
return {
|
|
25
|
+
publicKey,
|
|
26
|
+
privateKey,
|
|
27
|
+
publicKeyFingerprint: fingerprint,
|
|
28
|
+
algorithm: 'RSA-4096',
|
|
29
|
+
keySize: 4096,
|
|
30
|
+
publicExponent: 65537,
|
|
31
|
+
};
|
|
32
|
+
}
|
|
33
|
+
/**
|
|
34
|
+
* Calculate SHA-256 fingerprint of public key.
|
|
35
|
+
* Matches API's computeKeyFingerprint: hashes the entire PEM string including headers/footers.
|
|
36
|
+
*/
|
|
37
|
+
export function calculateKeyFingerprint(publicKeyPEM) {
|
|
38
|
+
const hash = crypto.createHash('sha256');
|
|
39
|
+
hash.update(publicKeyPEM);
|
|
40
|
+
return hash.digest('hex');
|
|
41
|
+
}
|
|
42
|
+
/** Validate that public and private keys are PEM-formatted and form a working pair. */
|
|
43
|
+
export function validateKeyPair(publicKey, privateKey) {
|
|
44
|
+
try {
|
|
45
|
+
if (!publicKey.includes('BEGIN PUBLIC KEY') || !privateKey.includes('BEGIN PRIVATE KEY')) {
|
|
46
|
+
return false;
|
|
47
|
+
}
|
|
48
|
+
const testData = Buffer.from('test-validation-data');
|
|
49
|
+
const encrypted = crypto.publicEncrypt({
|
|
50
|
+
key: publicKey,
|
|
51
|
+
padding: crypto.constants.RSA_PKCS1_OAEP_PADDING,
|
|
52
|
+
oaepHash: 'sha256',
|
|
53
|
+
}, testData);
|
|
54
|
+
const decrypted = crypto.privateDecrypt({
|
|
55
|
+
key: privateKey,
|
|
56
|
+
padding: crypto.constants.RSA_PKCS1_OAEP_PADDING,
|
|
57
|
+
oaepHash: 'sha256',
|
|
58
|
+
}, encrypted);
|
|
59
|
+
return decrypted.equals(testData);
|
|
60
|
+
}
|
|
61
|
+
catch {
|
|
62
|
+
return false;
|
|
63
|
+
}
|
|
64
|
+
}
|
|
65
|
+
//# sourceMappingURL=key-generator.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"key-generator.js","sourceRoot":"","sources":["../../../src/internal/crypto/key-generator.ts"],"names":[],"mappings":"AAAA,mDAAmD;AAEnD,OAAO,KAAK,MAAM,MAAM,QAAQ,CAAC;AACjC,OAAO,EAAE,SAAS,EAAE,MAAM,MAAM,CAAC;AAEjC,MAAM,oBAAoB,GAAG,SAAS,CAAC,MAAM,CAAC,eAAe,CAAC,CAAC;AAW/D;;;;GAIG;AACH,MAAM,CAAC,KAAK,UAAU,eAAe;IACnC,MAAM,EAAE,SAAS,EAAE,UAAU,EAAE,GAAG,MAAM,oBAAoB,CAAC,KAAK,EAAE;QAClE,aAAa,EAAE,IAAI;QACnB,cAAc,EAAE,KAAK;QACrB,iBAAiB,EAAE;YACjB,IAAI,EAAE,MAAM,EAAG,6BAA6B;YAC5C,MAAM,EAAE,KAAK;SACd;QACD,kBAAkB,EAAE;YAClB,IAAI,EAAE,OAAO,EAAE,SAAS;YACxB,MAAM,EAAE,KAAK;SACd;KACF,CAAC,CAAC;IAEH,MAAM,WAAW,GAAG,uBAAuB,CAAC,SAAS,CAAC,CAAC;IAEvD,OAAO;QACL,SAAS;QACT,UAAU;QACV,oBAAoB,EAAE,WAAW;QACjC,SAAS,EAAE,UAAU;QACrB,OAAO,EAAE,IAAI;QACb,cAAc,EAAE,KAAK;KACtB,CAAC;AACJ,CAAC;AAED;;;GAGG;AACH,MAAM,UAAU,uBAAuB,CAAC,YAAoB;IAC1D,MAAM,IAAI,GAAG,MAAM,CAAC,UAAU,CAAC,QAAQ,CAAC,CAAC;IACzC,IAAI,CAAC,MAAM,CAAC,YAAY,CAAC,CAAC;IAC1B,OAAO,IAAI,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;AAC5B,CAAC;AAED,uFAAuF;AACvF,MAAM,UAAU,eAAe,CAAC,SAAiB,EAAE,UAAkB;IACnE,IAAI,CAAC;QACH,IAAI,CAAC,SAAS,CAAC,QAAQ,CAAC,kBAAkB,CAAC,IAAI,CAAC,UAAU,CAAC,QAAQ,CAAC,mBAAmB,CAAC,EAAE,CAAC;YACzF,OAAO,KAAK,CAAC;QACf,CAAC;QAED,MAAM,QAAQ,GAAG,MAAM,CAAC,IAAI,CAAC,sBAAsB,CAAC,CAAC;QAErD,MAAM,SAAS,GAAG,MAAM,CAAC,aAAa,CACpC;YACE,GAAG,EAAE,SAAS;YACd,OAAO,EAAE,MAAM,CAAC,SAAS,CAAC,sBAAsB;YAChD,QAAQ,EAAE,QAAQ;SACnB,EACD,QAAQ,CACT,CAAC;QAEF,MAAM,SAAS,GAAG,MAAM,CAAC,cAAc,CACrC;YACE,GAAG,EAAE,UAAU;YACf,OAAO,EAAE,MAAM,CAAC,SAAS,CAAC,sBAAsB;YAChD,QAAQ,EAAE,QAAQ;SACnB,EACD,SAAS,CACV,CAAC;QAEF,OAAO,SAAS,CAAC,MAAM,CAAC,QAAQ,CAAC,CAAC;IACpC,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,KAAK,CAAC;IACf,CAAC;AACH,CAAC"}
|
|
@@ -0,0 +1,67 @@
|
|
|
1
|
+
/** AES-256-GCM, RSA-4096-OAEP-SHA256, and SHA-256 cryptographic primitives. */
|
|
2
|
+
import type { AESEncryptionResult } from '../types.js';
|
|
3
|
+
/** Generate a 256-bit AES master key. */
|
|
4
|
+
export declare function generateMasterKey(): Buffer;
|
|
5
|
+
/**
|
|
6
|
+
* Generate a 96-bit initialization vector for AES-GCM.
|
|
7
|
+
* Used for optional fields (subject, body, metadata) that need separate IVs.
|
|
8
|
+
* encryptAES() generates its own IV automatically for file content.
|
|
9
|
+
*/
|
|
10
|
+
export declare function generateIV(): string;
|
|
11
|
+
/**
|
|
12
|
+
* Encrypt data using AES-256-GCM.
|
|
13
|
+
* @param key - 256-bit AES key (32 bytes)
|
|
14
|
+
* @returns Encrypted data with IV and authentication tag, all base64url-encoded
|
|
15
|
+
* @throws Error if key is not 32 bytes
|
|
16
|
+
*/
|
|
17
|
+
export declare function encryptAES(data: Buffer, key: Buffer): AESEncryptionResult;
|
|
18
|
+
/**
|
|
19
|
+
* Decrypt data using AES-256-GCM.
|
|
20
|
+
* @param encryptedData - Base64url-encoded ciphertext
|
|
21
|
+
* @param key - 256-bit AES key (32 bytes)
|
|
22
|
+
* @param iv - Base64url-encoded 12-byte IV
|
|
23
|
+
* @param authTag - Base64url-encoded 16-byte authentication tag
|
|
24
|
+
* @throws Error if key length is invalid, authentication fails, or decryption fails
|
|
25
|
+
*/
|
|
26
|
+
export declare function decryptAES(encryptedData: string, key: Buffer, iv: string, authTag: string): Buffer;
|
|
27
|
+
/**
|
|
28
|
+
* Encrypt master key for a party using their RSA-4096 public key.
|
|
29
|
+
* @param masterKey - 32-byte AES master key
|
|
30
|
+
* @param publicKeyPEM - Party's RSA public key in PEM format
|
|
31
|
+
* @returns Base64url-encoded encrypted master key
|
|
32
|
+
* @throws Error if masterKey is not 32 bytes or publicKeyPEM is invalid
|
|
33
|
+
*/
|
|
34
|
+
export declare function encryptMasterKeyForParty(masterKey: Buffer, publicKeyPEM: string): string;
|
|
35
|
+
/**
|
|
36
|
+
* Decrypt master key using party's RSA-4096 private key.
|
|
37
|
+
* @param encryptedKey - Base64url-encoded encrypted master key
|
|
38
|
+
* @param privateKeyPEM - Party's RSA private key in PEM format
|
|
39
|
+
* @returns Decrypted master key (32 bytes)
|
|
40
|
+
* @throws Error if privateKeyPEM is invalid or decryption fails
|
|
41
|
+
*/
|
|
42
|
+
export declare function decryptMasterKey(encryptedKey: string, privateKeyPEM: string): Buffer;
|
|
43
|
+
/**
|
|
44
|
+
* Encrypt data using AES-256-GCM, returning raw Buffers instead of base64url.
|
|
45
|
+
* Avoids base64 round-trip overhead for large file content.
|
|
46
|
+
* @param key - 256-bit AES key (32 bytes)
|
|
47
|
+
* @throws Error if key is not 32 bytes
|
|
48
|
+
*/
|
|
49
|
+
export declare function encryptAESRaw(data: Buffer, key: Buffer): {
|
|
50
|
+
encryptedData: Buffer;
|
|
51
|
+
iv: Buffer;
|
|
52
|
+
authTag: Buffer;
|
|
53
|
+
};
|
|
54
|
+
/**
|
|
55
|
+
* Decrypt data using AES-256-GCM with raw Buffer inputs.
|
|
56
|
+
* Avoids base64 round-trip overhead for large file content.
|
|
57
|
+
* @param key - 256-bit AES key (32 bytes)
|
|
58
|
+
* @param iv - 12-byte initialization vector
|
|
59
|
+
* @param authTag - 16-byte authentication tag
|
|
60
|
+
* @throws Error if authentication fails or decryption fails
|
|
61
|
+
*/
|
|
62
|
+
export declare function decryptAESRaw(encryptedData: Buffer, key: Buffer, iv: Buffer, authTag: Buffer): Buffer;
|
|
63
|
+
/** Compute SHA-256 hash, returned as lowercase hex. */
|
|
64
|
+
export declare function computeHash(data: Buffer): string;
|
|
65
|
+
/** Generate a cryptographically secure random ID, returned as base64url. */
|
|
66
|
+
export declare function generateSecureId(length?: number): string;
|
|
67
|
+
//# sourceMappingURL=primitives.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"primitives.d.ts","sourceRoot":"","sources":["../../../src/internal/crypto/primitives.ts"],"names":[],"mappings":"AAAA,+EAA+E;AAG/E,OAAO,KAAK,EAAE,mBAAmB,EAAE,MAAM,aAAa,CAAC;AAmBvD,yCAAyC;AACzC,wBAAgB,iBAAiB,IAAI,MAAM,CAE1C;AAED;;;;GAIG;AACH,wBAAgB,UAAU,IAAI,MAAM,CAGnC;AAED;;;;;GAKG;AACH,wBAAgB,UAAU,CAAC,IAAI,EAAE,MAAM,EAAE,GAAG,EAAE,MAAM,GAAG,mBAAmB,CAgBzE;AAED;;;;;;;GAOG;AACH,wBAAgB,UAAU,CACxB,aAAa,EAAE,MAAM,EACrB,GAAG,EAAE,MAAM,EACX,EAAE,EAAE,MAAM,EACV,OAAO,EAAE,MAAM,GACd,MAAM,CA4CR;AAED;;;;;;GAMG;AACH,wBAAgB,wBAAwB,CACtC,SAAS,EAAE,MAAM,EACjB,YAAY,EAAE,MAAM,GACnB,MAAM,CAmCR;AAED;;;;;;GAMG;AACH,wBAAgB,gBAAgB,CAC9B,YAAY,EAAE,MAAM,EACpB,aAAa,EAAE,MAAM,GACpB,MAAM,CAoCR;AAED;;;;;GAKG;AACH,wBAAgB,aAAa,CAAC,IAAI,EAAE,MAAM,EAAE,GAAG,EAAE,MAAM,GAAG;IAAE,aAAa,EAAE,MAAM,CAAC;IAAC,EAAE,EAAE,MAAM,CAAC;IAAC,OAAO,EAAE,MAAM,CAAA;CAAE,CAY/G;AAED;;;;;;;GAOG;AACH,wBAAgB,aAAa,CAC3B,aAAa,EAAE,MAAM,EACrB,GAAG,EAAE,MAAM,EACX,EAAE,EAAE,MAAM,EACV,OAAO,EAAE,MAAM,GACd,MAAM,CAsBR;AAED,uDAAuD;AACvD,wBAAgB,WAAW,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,CAEhD;AAED,4EAA4E;AAC5E,wBAAgB,gBAAgB,CAAC,MAAM,GAAE,MAAW,GAAG,MAAM,CAE5D"}
|