@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.
Files changed (139) hide show
  1. package/LICENSE +74 -0
  2. package/README.md +230 -0
  3. package/dist/builder/capsa-builder.d.ts +167 -0
  4. package/dist/builder/capsa-builder.d.ts.map +1 -0
  5. package/dist/builder/capsa-builder.js +489 -0
  6. package/dist/builder/capsa-builder.js.map +1 -0
  7. package/dist/client/capsara-client.d.ts +96 -0
  8. package/dist/client/capsara-client.d.ts.map +1 -0
  9. package/dist/client/capsara-client.js +266 -0
  10. package/dist/client/capsara-client.js.map +1 -0
  11. package/dist/errors/account-error.d.ts +73 -0
  12. package/dist/errors/account-error.d.ts.map +1 -0
  13. package/dist/errors/account-error.js +155 -0
  14. package/dist/errors/account-error.js.map +1 -0
  15. package/dist/errors/audit-error.d.ts +34 -0
  16. package/dist/errors/audit-error.d.ts.map +1 -0
  17. package/dist/errors/audit-error.js +93 -0
  18. package/dist/errors/audit-error.js.map +1 -0
  19. package/dist/errors/auth-error.d.ts +38 -0
  20. package/dist/errors/auth-error.d.ts.map +1 -0
  21. package/dist/errors/auth-error.js +87 -0
  22. package/dist/errors/auth-error.js.map +1 -0
  23. package/dist/errors/capsa-error.d.ts +64 -0
  24. package/dist/errors/capsa-error.d.ts.map +1 -0
  25. package/dist/errors/capsa-error.js +172 -0
  26. package/dist/errors/capsa-error.js.map +1 -0
  27. package/dist/errors/capsara-error.d.ts +52 -0
  28. package/dist/errors/capsara-error.d.ts.map +1 -0
  29. package/dist/errors/capsara-error.js +83 -0
  30. package/dist/errors/capsara-error.js.map +1 -0
  31. package/dist/errors/index.d.ts +8 -0
  32. package/dist/errors/index.d.ts.map +1 -0
  33. package/dist/errors/index.js +7 -0
  34. package/dist/errors/index.js.map +1 -0
  35. package/dist/index.d.ts +7 -0
  36. package/dist/index.d.ts.map +1 -0
  37. package/dist/index.js +5 -0
  38. package/dist/index.js.map +1 -0
  39. package/dist/internal/capsa-cache.d.ts +49 -0
  40. package/dist/internal/capsa-cache.d.ts.map +1 -0
  41. package/dist/internal/capsa-cache.js +118 -0
  42. package/dist/internal/capsa-cache.js.map +1 -0
  43. package/dist/internal/config/http-client.d.ts +37 -0
  44. package/dist/internal/config/http-client.d.ts.map +1 -0
  45. package/dist/internal/config/http-client.js +63 -0
  46. package/dist/internal/config/http-client.js.map +1 -0
  47. package/dist/internal/config/retry-interceptor.d.ts +18 -0
  48. package/dist/internal/config/retry-interceptor.d.ts.map +1 -0
  49. package/dist/internal/config/retry-interceptor.js +103 -0
  50. package/dist/internal/config/retry-interceptor.js.map +1 -0
  51. package/dist/internal/crypto/compression.d.ts +15 -0
  52. package/dist/internal/crypto/compression.d.ts.map +1 -0
  53. package/dist/internal/crypto/compression.js +34 -0
  54. package/dist/internal/crypto/compression.js.map +1 -0
  55. package/dist/internal/crypto/key-generator.d.ts +23 -0
  56. package/dist/internal/crypto/key-generator.d.ts.map +1 -0
  57. package/dist/internal/crypto/key-generator.js +65 -0
  58. package/dist/internal/crypto/key-generator.js.map +1 -0
  59. package/dist/internal/crypto/primitives.d.ts +67 -0
  60. package/dist/internal/crypto/primitives.d.ts.map +1 -0
  61. package/dist/internal/crypto/primitives.js +230 -0
  62. package/dist/internal/crypto/primitives.js.map +1 -0
  63. package/dist/internal/crypto/signatures.d.ts +30 -0
  64. package/dist/internal/crypto/signatures.d.ts.map +1 -0
  65. package/dist/internal/crypto/signatures.js +153 -0
  66. package/dist/internal/crypto/signatures.js.map +1 -0
  67. package/dist/internal/decryptor/capsa-decryptor.d.ts +89 -0
  68. package/dist/internal/decryptor/capsa-decryptor.d.ts.map +1 -0
  69. package/dist/internal/decryptor/capsa-decryptor.js +263 -0
  70. package/dist/internal/decryptor/capsa-decryptor.js.map +1 -0
  71. package/dist/internal/http-factory.d.ts +78 -0
  72. package/dist/internal/http-factory.d.ts.map +1 -0
  73. package/dist/internal/http-factory.js +201 -0
  74. package/dist/internal/http-factory.js.map +1 -0
  75. package/dist/internal/index.d.ts +5 -0
  76. package/dist/internal/index.d.ts.map +1 -0
  77. package/dist/internal/index.js +5 -0
  78. package/dist/internal/index.js.map +1 -0
  79. package/dist/internal/retry-executor.d.ts +74 -0
  80. package/dist/internal/retry-executor.d.ts.map +1 -0
  81. package/dist/internal/retry-executor.js +204 -0
  82. package/dist/internal/retry-executor.js.map +1 -0
  83. package/dist/internal/services/account-service.d.ts +56 -0
  84. package/dist/internal/services/account-service.d.ts.map +1 -0
  85. package/dist/internal/services/account-service.js +114 -0
  86. package/dist/internal/services/account-service.js.map +1 -0
  87. package/dist/internal/services/audit-service.d.ts +25 -0
  88. package/dist/internal/services/audit-service.d.ts.map +1 -0
  89. package/dist/internal/services/audit-service.js +43 -0
  90. package/dist/internal/services/audit-service.js.map +1 -0
  91. package/dist/internal/services/auth-service.d.ts +44 -0
  92. package/dist/internal/services/auth-service.d.ts.map +1 -0
  93. package/dist/internal/services/auth-service.js +170 -0
  94. package/dist/internal/services/auth-service.js.map +1 -0
  95. package/dist/internal/services/capsa-service.d.ts +40 -0
  96. package/dist/internal/services/capsa-service.d.ts.map +1 -0
  97. package/dist/internal/services/capsa-service.js +82 -0
  98. package/dist/internal/services/capsa-service.js.map +1 -0
  99. package/dist/internal/services/download-service.d.ts +62 -0
  100. package/dist/internal/services/download-service.d.ts.map +1 -0
  101. package/dist/internal/services/download-service.js +114 -0
  102. package/dist/internal/services/download-service.js.map +1 -0
  103. package/dist/internal/services/key-service.d.ts +28 -0
  104. package/dist/internal/services/key-service.d.ts.map +1 -0
  105. package/dist/internal/services/key-service.js +45 -0
  106. package/dist/internal/services/key-service.js.map +1 -0
  107. package/dist/internal/services/limits-service.d.ts +30 -0
  108. package/dist/internal/services/limits-service.d.ts.map +1 -0
  109. package/dist/internal/services/limits-service.js +73 -0
  110. package/dist/internal/services/limits-service.js.map +1 -0
  111. package/dist/internal/services/upload-service.d.ts +61 -0
  112. package/dist/internal/services/upload-service.d.ts.map +1 -0
  113. package/dist/internal/services/upload-service.js +258 -0
  114. package/dist/internal/services/upload-service.js.map +1 -0
  115. package/dist/internal/types.d.ts +74 -0
  116. package/dist/internal/types.d.ts.map +1 -0
  117. package/dist/internal/types.js +3 -0
  118. package/dist/internal/types.js.map +1 -0
  119. package/dist/internal/upload/multipart-builder.d.ts +57 -0
  120. package/dist/internal/upload/multipart-builder.d.ts.map +1 -0
  121. package/dist/internal/upload/multipart-builder.js +139 -0
  122. package/dist/internal/upload/multipart-builder.js.map +1 -0
  123. package/dist/internal/utils/id-generator.d.ts +8 -0
  124. package/dist/internal/utils/id-generator.d.ts.map +1 -0
  125. package/dist/internal/utils/id-generator.js +20 -0
  126. package/dist/internal/utils/id-generator.js.map +1 -0
  127. package/dist/internal/utils/mimetype-lookup.d.ts +8 -0
  128. package/dist/internal/utils/mimetype-lookup.d.ts.map +1 -0
  129. package/dist/internal/utils/mimetype-lookup.js +118 -0
  130. package/dist/internal/utils/mimetype-lookup.js.map +1 -0
  131. package/dist/internal/version.d.ts +20 -0
  132. package/dist/internal/version.d.ts.map +1 -0
  133. package/dist/internal/version.js +25 -0
  134. package/dist/internal/version.js.map +1 -0
  135. package/dist/types/index.d.ts +143 -0
  136. package/dist/types/index.d.ts.map +1 -0
  137. package/dist/types/index.js +20 -0
  138. package/dist/types/index.js.map +1 -0
  139. package/package.json +61 -0
@@ -0,0 +1,73 @@
1
+ /** System limits management with caching. */
2
+ import axios from 'axios';
3
+ import { createAxiosConfig, configureRetryInterceptor, DEFAULT_TIMEOUT_CONFIG, } from '../config/http-client.js';
4
+ /**
5
+ * Hardcoded fallback limits (used if API fetch fails)
6
+ * These MUST match the server's FileConstraints in vault.api/src/types/upload.types.ts
7
+ */
8
+ const FALLBACK_LIMITS = {
9
+ maxFileSize: 50 * 1024 * 1024, // 50MB
10
+ maxFilesPerCapsa: 500, // Matches server's MAX_FILES_PER_CAPSA
11
+ maxTotalSize: 500 * 1024 * 1024, // 500MB
12
+ };
13
+ export class LimitsManager {
14
+ axiosInstance;
15
+ cachedLimits = null;
16
+ cacheTTL = 7 * 24 * 60 * 60 * 1000; // 7 days in milliseconds
17
+ constructor(baseUrl, timeout, retry) {
18
+ const timeoutConfig = {
19
+ ...DEFAULT_TIMEOUT_CONFIG,
20
+ ...timeout,
21
+ };
22
+ const axiosConfig = createAxiosConfig(baseUrl, timeoutConfig.apiTimeout, timeoutConfig);
23
+ this.axiosInstance = axios.create(axiosConfig);
24
+ configureRetryInterceptor(this.axiosInstance, retry);
25
+ }
26
+ /**
27
+ * Fetch system limits from API
28
+ * @returns System limits
29
+ */
30
+ async fetchLimits() {
31
+ try {
32
+ const response = await this.axiosInstance.get('/api/limits');
33
+ return response.data;
34
+ }
35
+ catch {
36
+ // API is down or /limits endpoint doesn't exist - use fallback
37
+ return FALLBACK_LIMITS;
38
+ }
39
+ }
40
+ /**
41
+ * Get system limits (from cache or fetch from API)
42
+ * @returns System limits
43
+ */
44
+ async getLimits() {
45
+ if (this.cachedLimits) {
46
+ const age = Date.now() - this.cachedLimits.cachedAt;
47
+ if (age < this.cacheTTL) {
48
+ return this.cachedLimits.limits;
49
+ }
50
+ this.cachedLimits = null;
51
+ }
52
+ const limits = await this.fetchLimits();
53
+ this.cachedLimits = {
54
+ limits,
55
+ cachedAt: Date.now(),
56
+ };
57
+ return limits;
58
+ }
59
+ /**
60
+ * Clear the limits cache (useful for testing or forcing refresh)
61
+ */
62
+ clearCache() {
63
+ this.cachedLimits = null;
64
+ }
65
+ /**
66
+ * Get fallback limits (for reference)
67
+ * @returns Hardcoded fallback limits
68
+ */
69
+ static getFallbackLimits() {
70
+ return { ...FALLBACK_LIMITS };
71
+ }
72
+ }
73
+ //# sourceMappingURL=limits-service.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"limits-service.js","sourceRoot":"","sources":["../../../src/internal/services/limits-service.ts"],"names":[],"mappings":"AAAA,6CAA6C;AAE7C,OAAO,KAAwB,MAAM,OAAO,CAAC;AAE7C,OAAO,EACL,iBAAiB,EACjB,yBAAyB,EACzB,sBAAsB,GAEvB,MAAM,0BAA0B,CAAC;AAQlC;;;GAGG;AACH,MAAM,eAAe,GAAiB;IACpC,WAAW,EAAE,EAAE,GAAG,IAAI,GAAG,IAAI,EAAE,OAAO;IACtC,gBAAgB,EAAE,GAAG,EAAE,uCAAuC;IAC9D,YAAY,EAAE,GAAG,GAAG,IAAI,GAAG,IAAI,EAAE,QAAQ;CAC1C,CAAC;AAEF,MAAM,OAAO,aAAa;IAChB,aAAa,CAAgB;IAC7B,YAAY,GAAwB,IAAI,CAAC;IAChC,QAAQ,GAAW,CAAC,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,IAAI,CAAC,CAAC,yBAAyB;IAEtF,YAAY,OAAe,EAAE,OAAoC,EAAE,KAAmB;QACpF,MAAM,aAAa,GAAG;YACpB,GAAG,sBAAsB;YACzB,GAAG,OAAO;SACX,CAAC;QAEF,MAAM,WAAW,GAAG,iBAAiB,CACnC,OAAO,EACP,aAAa,CAAC,UAAU,EACxB,aAAa,CACd,CAAC;QACF,IAAI,CAAC,aAAa,GAAG,KAAK,CAAC,MAAM,CAAC,WAAW,CAAC,CAAC;QAE/C,yBAAyB,CAAC,IAAI,CAAC,aAAa,EAAE,KAAK,CAAC,CAAC;IACvD,CAAC;IAED;;;OAGG;IACK,KAAK,CAAC,WAAW;QACvB,IAAI,CAAC;YACH,MAAM,QAAQ,GAAG,MAAM,IAAI,CAAC,aAAa,CAAC,GAAG,CAAe,aAAa,CAAC,CAAC;YAC3E,OAAO,QAAQ,CAAC,IAAI,CAAC;QACvB,CAAC;QAAC,MAAM,CAAC;YACP,+DAA+D;YAC/D,OAAO,eAAe,CAAC;QACzB,CAAC;IACH,CAAC;IAED;;;OAGG;IACH,KAAK,CAAC,SAAS;QACb,IAAI,IAAI,CAAC,YAAY,EAAE,CAAC;YACtB,MAAM,GAAG,GAAG,IAAI,CAAC,GAAG,EAAE,GAAG,IAAI,CAAC,YAAY,CAAC,QAAQ,CAAC;YAEpD,IAAI,GAAG,GAAG,IAAI,CAAC,QAAQ,EAAE,CAAC;gBACxB,OAAO,IAAI,CAAC,YAAY,CAAC,MAAM,CAAC;YAClC,CAAC;YAED,IAAI,CAAC,YAAY,GAAG,IAAI,CAAC;QAC3B,CAAC;QAED,MAAM,MAAM,GAAG,MAAM,IAAI,CAAC,WAAW,EAAE,CAAC;QAExC,IAAI,CAAC,YAAY,GAAG;YAClB,MAAM;YACN,QAAQ,EAAE,IAAI,CAAC,GAAG,EAAE;SACrB,CAAC;QAEF,OAAO,MAAM,CAAC;IAChB,CAAC;IAED;;OAEG;IACH,UAAU;QACR,IAAI,CAAC,YAAY,GAAG,IAAI,CAAC;IAC3B,CAAC;IAED;;;OAGG;IACH,MAAM,CAAC,iBAAiB;QACtB,OAAO,EAAE,GAAG,eAAe,EAAE,CAAC;IAChC,CAAC;CACF"}
@@ -0,0 +1,61 @@
1
+ /** Capsa upload service with batching and retry logic. */
2
+ import { type HttpTimeoutConfig } from '../config/http-client.js';
3
+ import type { RetryConfig, RetryLogger } from '../config/retry-interceptor.js';
4
+ import type { CapsaBuilder } from '../../builder/capsa-builder.js';
5
+ import type { KeyManager } from './key-service.js';
6
+ export interface UploadServiceOptions {
7
+ baseUrl: string;
8
+ keyManager: KeyManager;
9
+ getToken: () => string | null;
10
+ timeoutConfig: HttpTimeoutConfig;
11
+ retryConfig: Required<RetryConfig>;
12
+ logger: RetryLogger;
13
+ maxBatchSize: number;
14
+ userAgent?: string;
15
+ }
16
+ export interface SendResult {
17
+ batchId: string;
18
+ successful: number;
19
+ failed: number;
20
+ partialSuccess?: boolean;
21
+ created: Array<{
22
+ packageId: string;
23
+ index: number;
24
+ }>;
25
+ errors?: Array<{
26
+ index: number;
27
+ packageId: string;
28
+ error: string;
29
+ }>;
30
+ }
31
+ export declare class UploadService {
32
+ private baseUrl;
33
+ private keyManager;
34
+ private getToken;
35
+ private timeoutConfig;
36
+ private retryConfig;
37
+ private logger;
38
+ private maxBatchSize;
39
+ private userAgent;
40
+ constructor(options: UploadServiceOptions);
41
+ /**
42
+ * Send capsas with automatic batch splitting
43
+ * @param builders - Array of CapsaBuilder instances
44
+ * @param creatorId - Creator party ID
45
+ * @returns Send result
46
+ */
47
+ sendCapsas(builders: CapsaBuilder[], creatorId: string): Promise<SendResult>;
48
+ /**
49
+ * Send capsas in balanced batches
50
+ */
51
+ private sendInBalancedBatches;
52
+ /**
53
+ * Send multipart request with retry logic
54
+ */
55
+ private sendWithRetry;
56
+ /**
57
+ * Calculate retry delay
58
+ */
59
+ private calculateRetryDelay;
60
+ }
61
+ //# sourceMappingURL=upload-service.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"upload-service.d.ts","sourceRoot":"","sources":["../../../src/internal/services/upload-service.ts"],"names":[],"mappings":"AAAA,0DAA0D;AAK1D,OAAO,EAA0B,KAAK,iBAAiB,EAAE,MAAM,0BAA0B,CAAC;AAC1F,OAAO,KAAK,EAAE,WAAW,EAAE,WAAW,EAAE,MAAM,gCAAgC,CAAC;AAC/E,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,gCAAgC,CAAC;AACnE,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,kBAAkB,CAAC;AAGnD,MAAM,WAAW,oBAAoB;IACnC,OAAO,EAAE,MAAM,CAAC;IAChB,UAAU,EAAE,UAAU,CAAC;IACvB,QAAQ,EAAE,MAAM,MAAM,GAAG,IAAI,CAAC;IAC9B,aAAa,EAAE,iBAAiB,CAAC;IACjC,WAAW,EAAE,QAAQ,CAAC,WAAW,CAAC,CAAC;IACnC,MAAM,EAAE,WAAW,CAAC;IACpB,YAAY,EAAE,MAAM,CAAC;IACrB,SAAS,CAAC,EAAE,MAAM,CAAC;CACpB;AAED,MAAM,WAAW,UAAU;IACzB,OAAO,EAAE,MAAM,CAAC;IAChB,UAAU,EAAE,MAAM,CAAC;IACnB,MAAM,EAAE,MAAM,CAAC;IACf,cAAc,CAAC,EAAE,OAAO,CAAC;IACzB,OAAO,EAAE,KAAK,CAAC;QAAE,SAAS,EAAE,MAAM,CAAC;QAAC,KAAK,EAAE,MAAM,CAAA;KAAE,CAAC,CAAC;IACrD,MAAM,CAAC,EAAE,KAAK,CAAC;QAAE,KAAK,EAAE,MAAM,CAAC;QAAC,SAAS,EAAE,MAAM,CAAC;QAAC,KAAK,EAAE,MAAM,CAAA;KAAE,CAAC,CAAC;CACrE;AAED,qBAAa,aAAa;IACxB,OAAO,CAAC,OAAO,CAAS;IACxB,OAAO,CAAC,UAAU,CAAa;IAC/B,OAAO,CAAC,QAAQ,CAAsB;IACtC,OAAO,CAAC,aAAa,CAAoB;IACzC,OAAO,CAAC,WAAW,CAAwB;IAC3C,OAAO,CAAC,MAAM,CAAc;IAC5B,OAAO,CAAC,YAAY,CAAS;IAC7B,OAAO,CAAC,SAAS,CAAS;gBAEd,OAAO,EAAE,oBAAoB;IAWzC;;;;;OAKG;IACG,UAAU,CAAC,QAAQ,EAAE,YAAY,EAAE,EAAE,SAAS,EAAE,MAAM,GAAG,OAAO,CAAC,UAAU,CAAC;IAuBlF;;OAEG;YACW,qBAAqB;IAwJnC;;OAEG;YACW,aAAa;IAsF3B;;OAEG;IACH,OAAO,CAAC,mBAAmB;CAe5B"}
@@ -0,0 +1,258 @@
1
+ /** Capsa upload service with batching and retry logic. */
2
+ import * as http from 'http';
3
+ import * as https from 'https';
4
+ import { CapsasMultipartBuilder } from '../upload/multipart-builder.js';
5
+ import { createAgentForProtocol } from '../config/http-client.js';
6
+ import { SDK_VERSION, buildUserAgent } from '../version.js';
7
+ export class UploadService {
8
+ baseUrl;
9
+ keyManager;
10
+ getToken;
11
+ timeoutConfig;
12
+ retryConfig;
13
+ logger;
14
+ maxBatchSize;
15
+ userAgent;
16
+ constructor(options) {
17
+ this.baseUrl = options.baseUrl;
18
+ this.keyManager = options.keyManager;
19
+ this.getToken = options.getToken;
20
+ this.timeoutConfig = options.timeoutConfig;
21
+ this.retryConfig = options.retryConfig;
22
+ this.logger = options.logger;
23
+ this.maxBatchSize = options.maxBatchSize;
24
+ this.userAgent = buildUserAgent(options.userAgent);
25
+ }
26
+ /**
27
+ * Send capsas with automatic batch splitting
28
+ * @param builders - Array of CapsaBuilder instances
29
+ * @param creatorId - Creator party ID
30
+ * @returns Send result
31
+ */
32
+ async sendCapsas(builders, creatorId) {
33
+ if (builders.length === 0) {
34
+ throw new Error('No capsas provided to send');
35
+ }
36
+ if (builders.length > 500) {
37
+ throw new Error('Send limited to 500 capsas per request');
38
+ }
39
+ // Validate no single capsa exceeds file limit
40
+ const MAX_FILES_PER_BATCH = 500;
41
+ for (let i = 0; i < builders.length; i++) {
42
+ const fileCount = builders[i].getFileCount();
43
+ if (fileCount > MAX_FILES_PER_BATCH) {
44
+ throw new Error(`Capsa at index ${i} has ${fileCount} files, exceeding the batch limit of ${MAX_FILES_PER_BATCH} files.`);
45
+ }
46
+ }
47
+ return this.sendInBalancedBatches(builders, creatorId);
48
+ }
49
+ /**
50
+ * Send capsas in balanced batches
51
+ */
52
+ async sendInBalancedBatches(builders, creatorId) {
53
+ const MAX_FILES_PER_BATCH = 500;
54
+ const totalFiles = builders.reduce((sum, builder) => sum + builder.getFileCount(), 0);
55
+ const chunks = [];
56
+ let currentChunk = [];
57
+ let currentChunkFileCount = 0;
58
+ for (const builder of builders) {
59
+ const builderFileCount = builder.getFileCount();
60
+ const wouldExceedCapsaLimit = currentChunk.length >= this.maxBatchSize;
61
+ const wouldExceedFileLimit = currentChunkFileCount + builderFileCount > MAX_FILES_PER_BATCH;
62
+ if (currentChunk.length > 0 && (wouldExceedCapsaLimit || wouldExceedFileLimit)) {
63
+ chunks.push(currentChunk);
64
+ currentChunk = [builder];
65
+ currentChunkFileCount = builderFileCount;
66
+ }
67
+ else {
68
+ currentChunk.push(builder);
69
+ currentChunkFileCount += builderFileCount;
70
+ }
71
+ }
72
+ if (currentChunk.length > 0) {
73
+ chunks.push(currentChunk);
74
+ }
75
+ if (this.retryConfig.enableLogging) {
76
+ const chunkSummary = chunks.map(chunk => {
77
+ const capsaCount = chunk.length;
78
+ const fileCount = chunk.reduce((sum, b) => sum + b.getFileCount(), 0);
79
+ return `${capsaCount}capsa/${fileCount}files`;
80
+ }).join(', ');
81
+ this.logger.log(`[Capsara SDK] Smart auto-split: ${builders.length} capsas (${totalFiles} files) → ` +
82
+ `${chunks.length} batches (${chunkSummary})`);
83
+ }
84
+ const results = [];
85
+ let currentOffset = 0;
86
+ for (let chunkIndex = 0; chunkIndex < chunks.length; chunkIndex++) {
87
+ const chunk = chunks[chunkIndex];
88
+ if (this.retryConfig.enableLogging) {
89
+ this.logger.log(`[Capsara SDK] Sending batch ${chunkIndex + 1}/${chunks.length} ` +
90
+ `(${chunk.length} capsas, offset: ${currentOffset})`);
91
+ }
92
+ try {
93
+ const allPartyIds = new Set([creatorId]);
94
+ chunk.forEach(builder => {
95
+ builder.getRecipientIds().forEach(id => allPartyIds.add(id));
96
+ });
97
+ const partyKeys = await this.keyManager.fetchPartyKeys(Array.from(allPartyIds));
98
+ const builtCapsas = await Promise.all(chunk.map(builder => builder.build(partyKeys)));
99
+ const multipartBuilder = new CapsasMultipartBuilder();
100
+ multipartBuilder.addMetadata(chunk.length, creatorId);
101
+ builtCapsas.forEach((builtCapsa, capsaIndex) => {
102
+ multipartBuilder.addCapsaMetadata(builtCapsa.capsa, capsaIndex);
103
+ builtCapsa.files.forEach((file) => {
104
+ multipartBuilder.addFileBinary(file.data, file.metadata.fileId);
105
+ });
106
+ });
107
+ const body = multipartBuilder.build();
108
+ const result = await this.sendWithRetry(body, multipartBuilder.getContentType());
109
+ const adjustedResult = {
110
+ ...result,
111
+ created: result.created.map(item => ({
112
+ ...item,
113
+ index: item.index + currentOffset,
114
+ })),
115
+ errors: result.errors?.map(item => ({
116
+ ...item,
117
+ index: item.index + currentOffset,
118
+ })),
119
+ };
120
+ results.push(adjustedResult);
121
+ currentOffset += chunk.length;
122
+ if (this.retryConfig.enableLogging) {
123
+ this.logger.log(`[Capsara SDK] Batch ${chunkIndex + 1}/${chunks.length} completed: ` +
124
+ `${result.successful} succeeded, ${result.failed} failed`);
125
+ }
126
+ }
127
+ catch (error) {
128
+ const failedErrors = chunk.map((_, index) => ({
129
+ index: currentOffset + index,
130
+ packageId: '',
131
+ error: error instanceof Error ? error.message : 'Unknown error',
132
+ }));
133
+ results.push({
134
+ batchId: '',
135
+ successful: 0,
136
+ failed: chunk.length,
137
+ partialSuccess: false,
138
+ created: [],
139
+ errors: failedErrors,
140
+ });
141
+ currentOffset += chunk.length;
142
+ if (this.retryConfig.enableLogging) {
143
+ this.logger.log(`[Capsara SDK] Batch ${chunkIndex + 1}/${chunks.length} failed: ` +
144
+ `${error instanceof Error ? error.message : 'Unknown error'}`);
145
+ }
146
+ }
147
+ }
148
+ const allErrors = results.flatMap(r => r.errors || []);
149
+ const aggregated = {
150
+ batchId: results[0]?.batchId || `batch_${Date.now()}`,
151
+ successful: results.reduce((sum, r) => sum + r.successful, 0),
152
+ failed: results.reduce((sum, r) => sum + r.failed, 0),
153
+ partialSuccess: results.some(r => r.partialSuccess) ||
154
+ (results.some(r => r.successful > 0) && results.some(r => r.failed > 0)),
155
+ created: results.flatMap(r => r.created),
156
+ };
157
+ if (allErrors.length > 0) {
158
+ aggregated.errors = allErrors;
159
+ }
160
+ if (this.retryConfig.enableLogging) {
161
+ this.logger.log(`[Capsara SDK] All batches completed: ` +
162
+ `${aggregated.successful}/${builders.length} succeeded, ` +
163
+ `${aggregated.failed}/${builders.length} failed`);
164
+ }
165
+ return aggregated;
166
+ }
167
+ /**
168
+ * Send multipart request with retry logic
169
+ */
170
+ async sendWithRetry(body, contentType, retryCount = 0) {
171
+ return new Promise((resolve, reject) => {
172
+ const url = new URL(`${this.baseUrl}/api/capsas`);
173
+ const token = this.getToken();
174
+ const agent = createAgentForProtocol(url.protocol, this.timeoutConfig.uploadTimeout, this.timeoutConfig);
175
+ const options = {
176
+ hostname: url.hostname,
177
+ port: url.port || (url.protocol === 'https:' ? 443 : 80),
178
+ path: url.pathname,
179
+ method: 'POST',
180
+ headers: {
181
+ 'Content-Type': contentType,
182
+ 'Content-Length': body.length.toString(),
183
+ Authorization: token ? `Bearer ${token}` : '',
184
+ 'User-Agent': this.userAgent,
185
+ 'X-SDK-Version': SDK_VERSION,
186
+ },
187
+ timeout: this.timeoutConfig.uploadTimeout,
188
+ agent,
189
+ };
190
+ const requester = url.protocol === 'https:' ? https : http;
191
+ const req = requester.request(options, (res) => {
192
+ let responseData = '';
193
+ res.on('data', (chunk) => {
194
+ responseData += chunk.toString('utf-8');
195
+ });
196
+ res.on('end', () => {
197
+ if (res.statusCode && ((res.statusCode >= 200 && res.statusCode < 300) || res.statusCode === 207)) {
198
+ try {
199
+ const response = JSON.parse(responseData);
200
+ resolve(response);
201
+ }
202
+ catch (error) {
203
+ reject(new Error(`Failed to parse response: ${error instanceof Error ? error.message : 'Unknown'}`));
204
+ }
205
+ }
206
+ else {
207
+ const isRetryable = res.statusCode === 503 || res.statusCode === 429;
208
+ if (isRetryable && retryCount < this.retryConfig.maxRetries) {
209
+ const retryDelay = this.calculateRetryDelay(responseData, retryCount, res.statusCode);
210
+ if (this.retryConfig.enableLogging) {
211
+ this.logger.log(`[Capsara SDK] Retry attempt ${retryCount + 1}/${this.retryConfig.maxRetries} ` +
212
+ `for ${res.statusCode} error - waiting ${Math.floor(retryDelay)}ms`);
213
+ }
214
+ globalThis.setTimeout(() => {
215
+ this.sendWithRetry(body, contentType, retryCount + 1)
216
+ .then(resolve)
217
+ .catch(reject);
218
+ }, retryDelay);
219
+ }
220
+ else {
221
+ reject(new Error(`Send failed with status ${res.statusCode}: ${responseData}`));
222
+ }
223
+ }
224
+ });
225
+ });
226
+ req.on('error', reject);
227
+ req.on('timeout', () => {
228
+ req.destroy();
229
+ reject(new Error(`Upload timeout after ${this.timeoutConfig.uploadTimeout / 1000} seconds`));
230
+ });
231
+ // Write body in chunks
232
+ const chunkSize = 64 * 1024;
233
+ for (let i = 0; i < body.length; i += chunkSize) {
234
+ req.write(body.subarray(i, Math.min(i + chunkSize, body.length)));
235
+ }
236
+ req.end();
237
+ });
238
+ }
239
+ /**
240
+ * Calculate retry delay
241
+ */
242
+ calculateRetryDelay(responseData, retryCount, _statusCode) {
243
+ try {
244
+ const errorResponse = JSON.parse(responseData);
245
+ const serverDelay = errorResponse?.error?.retryAfter;
246
+ if (typeof serverDelay === 'number') {
247
+ return Math.min(serverDelay * 1000, this.retryConfig.maxDelay);
248
+ }
249
+ }
250
+ catch {
251
+ // Parse failed, use exponential backoff
252
+ }
253
+ const exponentialDelay = this.retryConfig.baseDelay * Math.pow(2, retryCount);
254
+ const jitter = Math.random() * 0.3 * exponentialDelay;
255
+ return Math.min(exponentialDelay + jitter, this.retryConfig.maxDelay);
256
+ }
257
+ }
258
+ //# sourceMappingURL=upload-service.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"upload-service.js","sourceRoot":"","sources":["../../../src/internal/services/upload-service.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,74 @@
1
+ /** Internal types used by services, builders, and crypto modules. */
2
+ export interface KeychainEntry {
3
+ party: string;
4
+ encryptedKey: string;
5
+ iv: string;
6
+ fingerprint: string;
7
+ permissions: string[];
8
+ actingFor?: string[];
9
+ revoked?: boolean;
10
+ }
11
+ /** Matches API response. */
12
+ export interface EncryptedFile {
13
+ fileId: string;
14
+ encryptedFilename: string;
15
+ filenameIV: string;
16
+ filenameAuthTag: string;
17
+ iv: string;
18
+ authTag: string;
19
+ mimetype: string;
20
+ size: number;
21
+ hash: string;
22
+ hashAlgorithm: string;
23
+ expiresAt?: string;
24
+ compressed?: boolean;
25
+ compressionAlgorithm?: 'gzip';
26
+ originalSize?: number;
27
+ /** One-way transform reference (URL or @partyId/id) */
28
+ transform?: string;
29
+ }
30
+ export interface FileEncryptionResult {
31
+ encryptedData: Buffer;
32
+ iv: string;
33
+ authTag: string;
34
+ hash: string;
35
+ size: number;
36
+ mimetype: string;
37
+ compressed?: boolean;
38
+ compressionAlgorithm?: 'gzip';
39
+ originalSize?: number;
40
+ }
41
+ export interface CapsaSignature {
42
+ algorithm: string;
43
+ protected: string;
44
+ payload: string;
45
+ signature: string;
46
+ }
47
+ /**
48
+ * Unencrypted metadata visible to server.
49
+ * Only non-sensitive operational data for routing, display, and search.
50
+ */
51
+ export interface CapsaMetadata {
52
+ label?: string;
53
+ relatedPackages?: string[];
54
+ tags?: string[];
55
+ notes?: string;
56
+ }
57
+ export interface CapsaCreateOptions {
58
+ subject?: string;
59
+ body?: string;
60
+ structured?: Record<string, unknown>;
61
+ expiresAt?: string;
62
+ }
63
+ export interface AESEncryptionResult {
64
+ encryptedData: string;
65
+ iv: string;
66
+ authTag: string;
67
+ }
68
+ export interface MultipartPart {
69
+ name: string;
70
+ content: string | Buffer;
71
+ contentType?: string;
72
+ filename?: string;
73
+ }
74
+ //# sourceMappingURL=types.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../src/internal/types.ts"],"names":[],"mappings":"AAAA,qEAAqE;AAErE,MAAM,WAAW,aAAa;IAC5B,KAAK,EAAE,MAAM,CAAC;IACd,YAAY,EAAE,MAAM,CAAC;IACrB,EAAE,EAAE,MAAM,CAAC;IACX,WAAW,EAAE,MAAM,CAAC;IACpB,WAAW,EAAE,MAAM,EAAE,CAAC;IACtB,SAAS,CAAC,EAAE,MAAM,EAAE,CAAC;IACrB,OAAO,CAAC,EAAE,OAAO,CAAC;CACnB;AAED,4BAA4B;AAC5B,MAAM,WAAW,aAAa;IAC5B,MAAM,EAAE,MAAM,CAAC;IACf,iBAAiB,EAAE,MAAM,CAAC;IAC1B,UAAU,EAAE,MAAM,CAAC;IACnB,eAAe,EAAE,MAAM,CAAC;IACxB,EAAE,EAAE,MAAM,CAAC;IACX,OAAO,EAAE,MAAM,CAAC;IAChB,QAAQ,EAAE,MAAM,CAAC;IACjB,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,EAAE,MAAM,CAAC;IACb,aAAa,EAAE,MAAM,CAAC;IACtB,SAAS,CAAC,EAAE,MAAM,CAAC;IAEnB,UAAU,CAAC,EAAE,OAAO,CAAC;IACrB,oBAAoB,CAAC,EAAE,MAAM,CAAC;IAC9B,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,uDAAuD;IACvD,SAAS,CAAC,EAAE,MAAM,CAAC;CACpB;AAED,MAAM,WAAW,oBAAoB;IACnC,aAAa,EAAE,MAAM,CAAC;IACtB,EAAE,EAAE,MAAM,CAAC;IACX,OAAO,EAAE,MAAM,CAAC;IAChB,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,EAAE,MAAM,CAAC;IACb,QAAQ,EAAE,MAAM,CAAC;IACjB,UAAU,CAAC,EAAE,OAAO,CAAC;IACrB,oBAAoB,CAAC,EAAE,MAAM,CAAC;IAC9B,YAAY,CAAC,EAAE,MAAM,CAAC;CACvB;AAED,MAAM,WAAW,cAAc;IAC7B,SAAS,EAAE,MAAM,CAAC;IAClB,SAAS,EAAE,MAAM,CAAC;IAClB,OAAO,EAAE,MAAM,CAAC;IAChB,SAAS,EAAE,MAAM,CAAC;CACnB;AAED;;;GAGG;AACH,MAAM,WAAW,aAAa;IAC5B,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,eAAe,CAAC,EAAE,MAAM,EAAE,CAAC;IAC3B,IAAI,CAAC,EAAE,MAAM,EAAE,CAAC;IAChB,KAAK,CAAC,EAAE,MAAM,CAAC;CAChB;AAED,MAAM,WAAW,kBAAkB;IACjC,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,UAAU,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IACrC,SAAS,CAAC,EAAE,MAAM,CAAC;CACpB;AAED,MAAM,WAAW,mBAAmB;IAClC,aAAa,EAAE,MAAM,CAAC;IACtB,EAAE,EAAE,MAAM,CAAC;IACX,OAAO,EAAE,MAAM,CAAC;CACjB;AAED,MAAM,WAAW,aAAa;IAC5B,IAAI,EAAE,MAAM,CAAC;IACb,OAAO,EAAE,MAAM,GAAG,MAAM,CAAC;IACzB,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,QAAQ,CAAC,EAAE,MAAM,CAAC;CACnB"}
@@ -0,0 +1,3 @@
1
+ /** Internal types used by services, builders, and crypto modules. */
2
+ export {};
3
+ //# sourceMappingURL=types.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"types.js","sourceRoot":"","sources":["../../src/internal/types.ts"],"names":[],"mappings":"AAAA,qEAAqE"}
@@ -0,0 +1,57 @@
1
+ /**
2
+ * Multipart form-data builder for capsa upload
3
+ * @file capsara.sdk/typescript/src/internal/upload/multipart-builder.ts
4
+ */
5
+ import type { EncryptedFile } from '../types.js';
6
+ /**
7
+ * Multipart form-data builder for capsa uploads (supports 1-500 capsas)
8
+ */
9
+ export declare class CapsasMultipartBuilder {
10
+ private boundary;
11
+ private parts;
12
+ private metadataSet;
13
+ constructor();
14
+ /**
15
+ * Add capsa metadata (must be first)
16
+ * @param capsaCount - Number of capsas in request
17
+ * @param creator - Creator party ID
18
+ */
19
+ addMetadata(capsaCount: number, creator: string): this;
20
+ /**
21
+ * Add capsa metadata part with index
22
+ * @param capsa - Capsa object
23
+ * @param capsaIndex - Capsa index in request
24
+ */
25
+ addCapsaMetadata(capsa: unknown, capsaIndex: number): this;
26
+ /**
27
+ * Add file metadata part with capsa and file indexes
28
+ * @param fileMetadata - File metadata object with fileId
29
+ * @param capsaIndex - Capsa index
30
+ * @param fileIndex - File index within capsa
31
+ */
32
+ addFileMetadata(fileMetadata: EncryptedFile | (Record<string, unknown> & {
33
+ fileId?: string;
34
+ }), capsaIndex: number, fileIndex: number): this;
35
+ /**
36
+ * Add file binary part with file ID
37
+ * @param fileData - File data buffer
38
+ * @param fileId - File ID from metadata (should include .enc extension)
39
+ */
40
+ addFileBinary(fileData: Buffer, fileId: string): this;
41
+ /**
42
+ * Build the complete multipart body
43
+ * @returns Multipart body as Buffer
44
+ */
45
+ build(): Buffer;
46
+ /**
47
+ * Get the Content-Type header value
48
+ * @returns Content-Type with boundary
49
+ */
50
+ getContentType(): string;
51
+ /**
52
+ * Get the boundary string
53
+ * @returns Boundary string
54
+ */
55
+ getBoundary(): string;
56
+ }
57
+ //# sourceMappingURL=multipart-builder.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"multipart-builder.d.ts","sourceRoot":"","sources":["../../../src/internal/upload/multipart-builder.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAGH,OAAO,KAAK,EAAiB,aAAa,EAAE,MAAM,aAAa,CAAC;AAEhE;;GAEG;AACH,qBAAa,sBAAsB;IACjC,OAAO,CAAC,QAAQ,CAAS;IACzB,OAAO,CAAC,KAAK,CAAuB;IACpC,OAAO,CAAC,WAAW,CAAkB;;IAOrC;;;;OAIG;IACH,WAAW,CAAC,UAAU,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,GAAG,IAAI;IAetD;;;;OAIG;IACH,gBAAgB,CAAC,KAAK,EAAE,OAAO,EAAE,UAAU,EAAE,MAAM,GAAG,IAAI;IAa1D;;;;;OAKG;IACH,eAAe,CACb,YAAY,EAAE,aAAa,GAAG,CAAC,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG;QAAE,MAAM,CAAC,EAAE,MAAM,CAAA;KAAE,CAAC,EAC7E,UAAU,EAAE,MAAM,EAClB,SAAS,EAAE,MAAM,GAChB,IAAI;IAgBP;;;;OAIG;IACH,aAAa,CAAC,QAAQ,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,GAAG,IAAI;IAcrD;;;OAGG;IACH,KAAK,IAAI,MAAM;IA6Cf;;;OAGG;IACH,cAAc,IAAI,MAAM;IAIxB;;;OAGG;IACH,WAAW,IAAI,MAAM;CAGtB"}