@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,266 @@
|
|
|
1
|
+
/** Primary interface for zero-knowledge encrypted file sharing. */
|
|
2
|
+
import axios from 'axios';
|
|
3
|
+
import { AuthService } from '../internal/services/auth-service.js';
|
|
4
|
+
import { KeyManager } from '../internal/services/key-service.js';
|
|
5
|
+
import { LimitsManager } from '../internal/services/limits-service.js';
|
|
6
|
+
import { AccountClient } from '../internal/services/account-service.js';
|
|
7
|
+
import { CapsaService } from '../internal/services/capsa-service.js';
|
|
8
|
+
import { DownloadService } from '../internal/services/download-service.js';
|
|
9
|
+
import { UploadService } from '../internal/services/upload-service.js';
|
|
10
|
+
import { AuditService } from '../internal/services/audit-service.js';
|
|
11
|
+
import { DecryptedCapsaCache } from '../internal/capsa-cache.js';
|
|
12
|
+
import { generateKeyPair } from '../internal/crypto/key-generator.js';
|
|
13
|
+
import { CapsaBuilder } from '../builder/capsa-builder.js';
|
|
14
|
+
import { createAxiosConfig, configureRetryInterceptor, createHttpAgent, createHttpsAgent, DEFAULT_TIMEOUT_CONFIG, } from '../internal/config/http-client.js';
|
|
15
|
+
export class CapsaraClient {
|
|
16
|
+
creatorId = null;
|
|
17
|
+
creatorPrivateKey = null;
|
|
18
|
+
authService;
|
|
19
|
+
keyManager;
|
|
20
|
+
limitsManager;
|
|
21
|
+
accountClient;
|
|
22
|
+
capsaService;
|
|
23
|
+
downloadService;
|
|
24
|
+
uploadService;
|
|
25
|
+
auditService;
|
|
26
|
+
capsaCache;
|
|
27
|
+
axiosInstance;
|
|
28
|
+
blobClient;
|
|
29
|
+
timeoutConfig;
|
|
30
|
+
retryConfig;
|
|
31
|
+
maxBatchSize;
|
|
32
|
+
logger;
|
|
33
|
+
refreshPromise = null;
|
|
34
|
+
inFlightCapsaFetches = new Map();
|
|
35
|
+
constructor(baseUrl, options) {
|
|
36
|
+
this.timeoutConfig = { ...DEFAULT_TIMEOUT_CONFIG, ...options?.timeout };
|
|
37
|
+
// eslint-disable-next-line no-console
|
|
38
|
+
this.logger = options?.retry?.logger ?? { log: (msg) => console.log(msg) };
|
|
39
|
+
this.retryConfig = {
|
|
40
|
+
maxRetries: options?.retry?.maxRetries ?? 3,
|
|
41
|
+
baseDelay: options?.retry?.baseDelay ?? 1000,
|
|
42
|
+
maxDelay: options?.retry?.maxDelay ?? 30000,
|
|
43
|
+
enableLogging: options?.retry?.enableLogging ?? false,
|
|
44
|
+
logger: this.logger,
|
|
45
|
+
};
|
|
46
|
+
this.maxBatchSize = options?.maxBatchSize ?? 150;
|
|
47
|
+
const axiosConfig = createAxiosConfig(baseUrl, this.timeoutConfig.apiTimeout, this.timeoutConfig, options?.userAgent);
|
|
48
|
+
this.axiosInstance = axios.create(axiosConfig);
|
|
49
|
+
configureRetryInterceptor(this.axiosInstance, options?.retry);
|
|
50
|
+
// No auth headers — SAS URL contains credentials
|
|
51
|
+
this.blobClient = axios.create({
|
|
52
|
+
timeout: this.timeoutConfig.downloadTimeout,
|
|
53
|
+
maxContentLength: 1024 * 1024 * 1024, // 1GB
|
|
54
|
+
maxBodyLength: 1024 * 1024 * 1024,
|
|
55
|
+
httpAgent: createHttpAgent(this.timeoutConfig),
|
|
56
|
+
httpsAgent: createHttpsAgent(this.timeoutConfig),
|
|
57
|
+
});
|
|
58
|
+
this.authService = new AuthService(baseUrl, {
|
|
59
|
+
expectedIssuer: options?.expectedIssuer,
|
|
60
|
+
expectedAudience: options?.expectedAudience,
|
|
61
|
+
timeout: options?.timeout,
|
|
62
|
+
retry: options?.retry,
|
|
63
|
+
userAgent: options?.userAgent,
|
|
64
|
+
});
|
|
65
|
+
this.axiosInstance.interceptors.request.use((config) => {
|
|
66
|
+
const token = this.authService.getToken();
|
|
67
|
+
if (token) {
|
|
68
|
+
config.headers.Authorization = `Bearer ${token}`;
|
|
69
|
+
}
|
|
70
|
+
return config;
|
|
71
|
+
});
|
|
72
|
+
// Automatic token refresh on 401
|
|
73
|
+
this.axiosInstance.interceptors.response.use((response) => response, async (error) => {
|
|
74
|
+
const axiosError = error;
|
|
75
|
+
const originalRequest = axiosError.config;
|
|
76
|
+
if (axiosError.response?.status === 401 &&
|
|
77
|
+
originalRequest &&
|
|
78
|
+
!originalRequest._retry &&
|
|
79
|
+
this.authService.canRefresh()) {
|
|
80
|
+
originalRequest._retry = true;
|
|
81
|
+
// Single-flight: coalesce concurrent refresh attempts into one request
|
|
82
|
+
if (!this.refreshPromise) {
|
|
83
|
+
this.refreshPromise = this.authService.refresh().finally(() => {
|
|
84
|
+
this.refreshPromise = null;
|
|
85
|
+
});
|
|
86
|
+
}
|
|
87
|
+
const refreshed = await this.refreshPromise;
|
|
88
|
+
if (refreshed) {
|
|
89
|
+
const newToken = this.authService.getToken();
|
|
90
|
+
if (newToken) {
|
|
91
|
+
originalRequest.headers.Authorization = `Bearer ${newToken}`;
|
|
92
|
+
}
|
|
93
|
+
return this.axiosInstance(originalRequest);
|
|
94
|
+
}
|
|
95
|
+
const refreshError = this.authService.getLastRefreshError();
|
|
96
|
+
if (refreshError) {
|
|
97
|
+
return Promise.reject(refreshError);
|
|
98
|
+
}
|
|
99
|
+
}
|
|
100
|
+
if (error instanceof Error) {
|
|
101
|
+
return Promise.reject(error);
|
|
102
|
+
}
|
|
103
|
+
return Promise.reject(new Error(String(error)));
|
|
104
|
+
});
|
|
105
|
+
this.keyManager = new KeyManager(baseUrl, () => this.authService.getToken(), {
|
|
106
|
+
timeout: options?.timeout,
|
|
107
|
+
retry: options?.retry,
|
|
108
|
+
});
|
|
109
|
+
this.limitsManager = new LimitsManager(baseUrl, options?.timeout, options?.retry);
|
|
110
|
+
this.accountClient = new AccountClient(baseUrl, () => this.authService.getToken(), options?.timeout, options?.retry);
|
|
111
|
+
this.capsaService = new CapsaService({
|
|
112
|
+
axiosInstance: this.axiosInstance,
|
|
113
|
+
keyManager: this.keyManager,
|
|
114
|
+
});
|
|
115
|
+
this.downloadService = new DownloadService({
|
|
116
|
+
axiosInstance: this.axiosInstance,
|
|
117
|
+
blobClient: this.blobClient,
|
|
118
|
+
retryConfig: this.retryConfig,
|
|
119
|
+
logger: this.logger,
|
|
120
|
+
});
|
|
121
|
+
this.uploadService = new UploadService({
|
|
122
|
+
baseUrl,
|
|
123
|
+
keyManager: this.keyManager,
|
|
124
|
+
getToken: () => this.authService.getToken(),
|
|
125
|
+
timeoutConfig: this.timeoutConfig,
|
|
126
|
+
retryConfig: this.retryConfig,
|
|
127
|
+
logger: this.logger,
|
|
128
|
+
maxBatchSize: this.maxBatchSize,
|
|
129
|
+
userAgent: options?.userAgent,
|
|
130
|
+
});
|
|
131
|
+
this.auditService = new AuditService({ axiosInstance: this.axiosInstance });
|
|
132
|
+
this.capsaCache = new DecryptedCapsaCache({ ttl: options?.cacheTTL ?? 5 * 60 * 1000 });
|
|
133
|
+
if (options?.credentials) {
|
|
134
|
+
this.login(options.credentials).catch(() => { });
|
|
135
|
+
}
|
|
136
|
+
if (options?.accessToken) {
|
|
137
|
+
this.authService.setToken(options.accessToken);
|
|
138
|
+
}
|
|
139
|
+
}
|
|
140
|
+
async login(credentials) {
|
|
141
|
+
const response = await this.authService.login(credentials);
|
|
142
|
+
this.creatorId = response.party.id;
|
|
143
|
+
return response;
|
|
144
|
+
}
|
|
145
|
+
async logout() {
|
|
146
|
+
this.capsaCache.clearAll();
|
|
147
|
+
return this.authService.logout();
|
|
148
|
+
}
|
|
149
|
+
isAuthenticated() {
|
|
150
|
+
return this.authService.isAuthenticated();
|
|
151
|
+
}
|
|
152
|
+
setPrivateKey(privateKey) {
|
|
153
|
+
this.creatorPrivateKey = privateKey;
|
|
154
|
+
}
|
|
155
|
+
async createCapsaBuilder() {
|
|
156
|
+
if (!this.creatorId || !this.creatorPrivateKey) {
|
|
157
|
+
throw new Error('Creator identity not set. Call login() and setPrivateKey() first.');
|
|
158
|
+
}
|
|
159
|
+
const limits = await this.limitsManager.getLimits();
|
|
160
|
+
return new CapsaBuilder(this.creatorId, this.creatorPrivateKey, limits);
|
|
161
|
+
}
|
|
162
|
+
async sendCapsas(builders) {
|
|
163
|
+
if (!this.creatorId) {
|
|
164
|
+
throw new Error('Creator identity not set. Call login() and setPrivateKey() first.');
|
|
165
|
+
}
|
|
166
|
+
return this.uploadService.sendCapsas(builders, this.creatorId);
|
|
167
|
+
}
|
|
168
|
+
async getCapsa(capsaId, options) {
|
|
169
|
+
if (options?.decrypt === false) {
|
|
170
|
+
return this.capsaService.getCapsa(capsaId);
|
|
171
|
+
}
|
|
172
|
+
// Deduplicates concurrent requests for the same capsaId
|
|
173
|
+
return this.getOrCreateCapsaFetch(capsaId, options);
|
|
174
|
+
}
|
|
175
|
+
getOrCreateCapsaFetch(capsaId, options) {
|
|
176
|
+
const existing = this.inFlightCapsaFetches.get(capsaId);
|
|
177
|
+
if (existing) {
|
|
178
|
+
return existing;
|
|
179
|
+
}
|
|
180
|
+
// Must set in map synchronously before any await to prevent races
|
|
181
|
+
const fetchPromise = this.fetchAndDecryptCapsa(capsaId, options).finally(() => {
|
|
182
|
+
this.inFlightCapsaFetches.delete(capsaId);
|
|
183
|
+
});
|
|
184
|
+
this.inFlightCapsaFetches.set(capsaId, fetchPromise);
|
|
185
|
+
return fetchPromise;
|
|
186
|
+
}
|
|
187
|
+
async fetchAndDecryptCapsa(capsaId, options) {
|
|
188
|
+
if (!this.creatorPrivateKey) {
|
|
189
|
+
throw new Error('Private key required. Call setPrivateKey() first.');
|
|
190
|
+
}
|
|
191
|
+
const verifySignature = options?.verifySignature !== false; // default true
|
|
192
|
+
const decrypted = await this.capsaService.getDecryptedCapsa(capsaId, this.creatorPrivateKey, verifySignature);
|
|
193
|
+
// Zeroed on cache eviction
|
|
194
|
+
const masterKeyBuffer = decrypted._masterKey;
|
|
195
|
+
if (masterKeyBuffer) {
|
|
196
|
+
this.capsaCache.set(capsaId, masterKeyBuffer, decrypted.files.map(f => ({
|
|
197
|
+
fileId: f.fileId,
|
|
198
|
+
iv: f.iv,
|
|
199
|
+
authTag: f.authTag,
|
|
200
|
+
compressed: f.compressed,
|
|
201
|
+
encryptedFilename: f.encryptedFilename,
|
|
202
|
+
filenameIV: f.filenameIV,
|
|
203
|
+
filenameAuthTag: f.filenameAuthTag,
|
|
204
|
+
})));
|
|
205
|
+
}
|
|
206
|
+
return decrypted;
|
|
207
|
+
}
|
|
208
|
+
async listCapsas(filters) {
|
|
209
|
+
return this.capsaService.listCapsas(filters);
|
|
210
|
+
}
|
|
211
|
+
async deleteCapsa(capsaId) {
|
|
212
|
+
this.capsaCache.clear(capsaId);
|
|
213
|
+
return this.capsaService.deleteCapsa(capsaId);
|
|
214
|
+
}
|
|
215
|
+
async downloadFile(capsaId, fileId) {
|
|
216
|
+
let masterKey = this.capsaCache.getMasterKey(capsaId);
|
|
217
|
+
let fileMetadata = this.capsaCache.getFileMetadata(capsaId, fileId);
|
|
218
|
+
if (!masterKey || !fileMetadata) {
|
|
219
|
+
await this.getCapsa(capsaId);
|
|
220
|
+
masterKey = this.capsaCache.getMasterKey(capsaId);
|
|
221
|
+
fileMetadata = this.capsaCache.getFileMetadata(capsaId, fileId);
|
|
222
|
+
}
|
|
223
|
+
if (!masterKey || !fileMetadata) {
|
|
224
|
+
throw new Error(`File ${fileId} not found in capsa ${capsaId}`);
|
|
225
|
+
}
|
|
226
|
+
return this.downloadService.downloadAndDecryptFile(capsaId, fileId, masterKey, fileMetadata);
|
|
227
|
+
}
|
|
228
|
+
async getAuditEntries(capsaId, filters) {
|
|
229
|
+
return this.auditService.getAuditEntries(capsaId, filters);
|
|
230
|
+
}
|
|
231
|
+
async createAuditEntry(capsaId, entry) {
|
|
232
|
+
return this.auditService.createAuditEntry(capsaId, entry);
|
|
233
|
+
}
|
|
234
|
+
async getCurrentPublicKey() {
|
|
235
|
+
return this.accountClient.getCurrentPublicKey();
|
|
236
|
+
}
|
|
237
|
+
async addPublicKey(publicKey, fingerprint, reason) {
|
|
238
|
+
return this.accountClient.addPublicKey(publicKey, fingerprint, reason);
|
|
239
|
+
}
|
|
240
|
+
async getKeyHistory() {
|
|
241
|
+
return this.accountClient.getKeyHistory();
|
|
242
|
+
}
|
|
243
|
+
async rotateKey() {
|
|
244
|
+
return this.accountClient.rotateKey();
|
|
245
|
+
}
|
|
246
|
+
async getLimits() {
|
|
247
|
+
return this.limitsManager.getLimits();
|
|
248
|
+
}
|
|
249
|
+
static async generateKeyPair() {
|
|
250
|
+
return generateKeyPair();
|
|
251
|
+
}
|
|
252
|
+
clearCache() {
|
|
253
|
+
this.capsaCache.clearAll();
|
|
254
|
+
}
|
|
255
|
+
/** Release all resources and securely clear cached keys. */
|
|
256
|
+
async destroy() {
|
|
257
|
+
this.capsaCache.clearAll();
|
|
258
|
+
this.inFlightCapsaFetches.clear();
|
|
259
|
+
this.refreshPromise = null;
|
|
260
|
+
this.creatorId = null;
|
|
261
|
+
this.creatorPrivateKey = null;
|
|
262
|
+
// Fire-and-forget server-side logout
|
|
263
|
+
await this.authService.logout().catch(() => { });
|
|
264
|
+
}
|
|
265
|
+
}
|
|
266
|
+
//# sourceMappingURL=capsara-client.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"capsara-client.js","sourceRoot":"","sources":["../../src/client/capsara-client.ts"],"names":[],"mappings":"AAAA,mEAAmE;AAEnE,OAAO,KAA8D,MAAM,OAAO,CAAC;AACnF,OAAO,EAAE,WAAW,EAAE,MAAM,sCAAsC,CAAC;AACnE,OAAO,EAAE,UAAU,EAAE,MAAM,qCAAqC,CAAC;AACjE,OAAO,EAAE,aAAa,EAAE,MAAM,wCAAwC,CAAC;AACvE,OAAO,EAAE,aAAa,EAA4C,MAAM,yCAAyC,CAAC;AAClH,OAAO,EAAE,YAAY,EAAE,MAAM,uCAAuC,CAAC;AACrE,OAAO,EAAE,eAAe,EAAE,MAAM,0CAA0C,CAAC;AAC3E,OAAO,EAAE,aAAa,EAAE,MAAM,wCAAwC,CAAC;AACvE,OAAO,EAAE,YAAY,EAAE,MAAM,uCAAuC,CAAC;AACrE,OAAO,EAAE,mBAAmB,EAAE,MAAM,4BAA4B,CAAC;AACjE,OAAO,EAAE,eAAe,EAAyB,MAAM,qCAAqC,CAAC;AAC7F,OAAO,EAAE,YAAY,EAAE,MAAM,6BAA6B,CAAC;AAE3D,OAAO,EACL,iBAAiB,EACjB,yBAAyB,EACzB,eAAe,EACf,gBAAgB,EAChB,sBAAsB,GAEvB,MAAM,mCAAmC,CAAC;AAgC3C,MAAM,OAAO,aAAa;IAChB,SAAS,GAAkB,IAAI,CAAC;IAChC,iBAAiB,GAAkB,IAAI,CAAC;IACxC,WAAW,CAAc;IACzB,UAAU,CAAa;IACvB,aAAa,CAAgB;IAC7B,aAAa,CAAgB;IAC7B,YAAY,CAAe;IAC3B,eAAe,CAAkB;IACjC,aAAa,CAAgB;IAC7B,YAAY,CAAe;IAC3B,UAAU,CAAsB;IAChC,aAAa,CAAgB;IAC7B,UAAU,CAAgB;IAC1B,aAAa,CAAoB;IACjC,WAAW,CAAwB;IACnC,YAAY,CAAS;IACrB,MAAM,CAAc;IACpB,cAAc,GAA4B,IAAI,CAAC;IAC/C,oBAAoB,GAAyC,IAAI,GAAG,EAAE,CAAC;IAE/E,YAAY,OAAe,EAAE,OAA8B;QACzD,IAAI,CAAC,aAAa,GAAG,EAAE,GAAG,sBAAsB,EAAE,GAAG,OAAO,EAAE,OAAO,EAAE,CAAC;QACxE,sCAAsC;QACtC,IAAI,CAAC,MAAM,GAAG,OAAO,EAAE,KAAK,EAAE,MAAM,IAAI,EAAE,GAAG,EAAE,CAAC,GAAW,EAAE,EAAE,CAAC,OAAO,CAAC,GAAG,CAAC,GAAG,CAAC,EAAE,CAAC;QACnF,IAAI,CAAC,WAAW,GAAG;YACjB,UAAU,EAAE,OAAO,EAAE,KAAK,EAAE,UAAU,IAAI,CAAC;YAC3C,SAAS,EAAE,OAAO,EAAE,KAAK,EAAE,SAAS,IAAI,IAAI;YAC5C,QAAQ,EAAE,OAAO,EAAE,KAAK,EAAE,QAAQ,IAAI,KAAK;YAC3C,aAAa,EAAE,OAAO,EAAE,KAAK,EAAE,aAAa,IAAI,KAAK;YACrD,MAAM,EAAE,IAAI,CAAC,MAAM;SACpB,CAAC;QACF,IAAI,CAAC,YAAY,GAAG,OAAO,EAAE,YAAY,IAAI,GAAG,CAAC;QAEjD,MAAM,WAAW,GAAG,iBAAiB,CAAC,OAAO,EAAE,IAAI,CAAC,aAAa,CAAC,UAAU,EAAE,IAAI,CAAC,aAAa,EAAE,OAAO,EAAE,SAAS,CAAC,CAAC;QACtH,IAAI,CAAC,aAAa,GAAG,KAAK,CAAC,MAAM,CAAC,WAAW,CAAC,CAAC;QAC/C,yBAAyB,CAAC,IAAI,CAAC,aAAa,EAAE,OAAO,EAAE,KAAK,CAAC,CAAC;QAE9D,iDAAiD;QACjD,IAAI,CAAC,UAAU,GAAG,KAAK,CAAC,MAAM,CAAC;YAC7B,OAAO,EAAE,IAAI,CAAC,aAAa,CAAC,eAAe;YAC3C,gBAAgB,EAAE,IAAI,GAAG,IAAI,GAAG,IAAI,EAAE,MAAM;YAC5C,aAAa,EAAE,IAAI,GAAG,IAAI,GAAG,IAAI;YACjC,SAAS,EAAE,eAAe,CAAC,IAAI,CAAC,aAAa,CAAC;YAC9C,UAAU,EAAE,gBAAgB,CAAC,IAAI,CAAC,aAAa,CAAC;SACjD,CAAC,CAAC;QAEH,IAAI,CAAC,WAAW,GAAG,IAAI,WAAW,CAAC,OAAO,EAAE;YAC1C,cAAc,EAAE,OAAO,EAAE,cAAc;YACvC,gBAAgB,EAAE,OAAO,EAAE,gBAAgB;YAC3C,OAAO,EAAE,OAAO,EAAE,OAAO;YACzB,KAAK,EAAE,OAAO,EAAE,KAAK;YACrB,SAAS,EAAE,OAAO,EAAE,SAAS;SAC9B,CAAC,CAAC;QAEH,IAAI,CAAC,aAAa,CAAC,YAAY,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC,MAAM,EAAE,EAAE;YACrD,MAAM,KAAK,GAAG,IAAI,CAAC,WAAW,CAAC,QAAQ,EAAE,CAAC;YAC1C,IAAI,KAAK,EAAE,CAAC;gBACV,MAAM,CAAC,OAAO,CAAC,aAAa,GAAG,UAAU,KAAK,EAAE,CAAC;YACnD,CAAC;YACD,OAAO,MAAM,CAAC;QAChB,CAAC,CAAC,CAAC;QAEH,iCAAiC;QACjC,IAAI,CAAC,aAAa,CAAC,YAAY,CAAC,QAAQ,CAAC,GAAG,CAC1C,CAAC,QAAQ,EAAE,EAAE,CAAC,QAAQ,EACtB,KAAK,EAAE,KAAc,EAAE,EAAE;YACvB,MAAM,UAAU,GAAG,KAAuG,CAAC;YAC3H,MAAM,eAAe,GAAG,UAAU,CAAC,MAAM,CAAC;YAE1C,IACE,UAAU,CAAC,QAAQ,EAAE,MAAM,KAAK,GAAG;gBACnC,eAAe;gBACf,CAAC,eAAe,CAAC,MAAM;gBACvB,IAAI,CAAC,WAAW,CAAC,UAAU,EAAE,EAC7B,CAAC;gBACD,eAAe,CAAC,MAAM,GAAG,IAAI,CAAC;gBAE9B,uEAAuE;gBACvE,IAAI,CAAC,IAAI,CAAC,cAAc,EAAE,CAAC;oBACzB,IAAI,CAAC,cAAc,GAAG,IAAI,CAAC,WAAW,CAAC,OAAO,EAAE,CAAC,OAAO,CAAC,GAAG,EAAE;wBAC5D,IAAI,CAAC,cAAc,GAAG,IAAI,CAAC;oBAC7B,CAAC,CAAC,CAAC;gBACL,CAAC;gBAED,MAAM,SAAS,GAAG,MAAM,IAAI,CAAC,cAAc,CAAC;gBAC5C,IAAI,SAAS,EAAE,CAAC;oBACd,MAAM,QAAQ,GAAG,IAAI,CAAC,WAAW,CAAC,QAAQ,EAAE,CAAC;oBAC7C,IAAI,QAAQ,EAAE,CAAC;wBACb,eAAe,CAAC,OAAO,CAAC,aAAa,GAAG,UAAU,QAAQ,EAAE,CAAC;oBAC/D,CAAC;oBACD,OAAO,IAAI,CAAC,aAAa,CAAC,eAAe,CAAC,CAAC;gBAC7C,CAAC;gBAED,MAAM,YAAY,GAAG,IAAI,CAAC,WAAW,CAAC,mBAAmB,EAAE,CAAC;gBAC5D,IAAI,YAAY,EAAE,CAAC;oBACjB,OAAO,OAAO,CAAC,MAAM,CAAC,YAAY,CAAC,CAAC;gBACtC,CAAC;YACH,CAAC;YAED,IAAI,KAAK,YAAY,KAAK,EAAE,CAAC;gBAC3B,OAAO,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;YAC/B,CAAC;YACD,OAAO,OAAO,CAAC,MAAM,CAAC,IAAI,KAAK,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC;QAClD,CAAC,CACF,CAAC;QAEF,IAAI,CAAC,UAAU,GAAG,IAAI,UAAU,CAAC,OAAO,EAAE,GAAG,EAAE,CAAC,IAAI,CAAC,WAAW,CAAC,QAAQ,EAAE,EAAE;YAC3E,OAAO,EAAE,OAAO,EAAE,OAAO;YACzB,KAAK,EAAE,OAAO,EAAE,KAAK;SACtB,CAAC,CAAC;QAEH,IAAI,CAAC,aAAa,GAAG,IAAI,aAAa,CAAC,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,KAAK,CAAC,CAAC;QAClF,IAAI,CAAC,aAAa,GAAG,IAAI,aAAa,CAAC,OAAO,EAAE,GAAG,EAAE,CAAC,IAAI,CAAC,WAAW,CAAC,QAAQ,EAAE,EAAE,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,KAAK,CAAC,CAAC;QAErH,IAAI,CAAC,YAAY,GAAG,IAAI,YAAY,CAAC;YACnC,aAAa,EAAE,IAAI,CAAC,aAAa;YACjC,UAAU,EAAE,IAAI,CAAC,UAAU;SAC5B,CAAC,CAAC;QAEH,IAAI,CAAC,eAAe,GAAG,IAAI,eAAe,CAAC;YACzC,aAAa,EAAE,IAAI,CAAC,aAAa;YACjC,UAAU,EAAE,IAAI,CAAC,UAAU;YAC3B,WAAW,EAAE,IAAI,CAAC,WAAW;YAC7B,MAAM,EAAE,IAAI,CAAC,MAAM;SACpB,CAAC,CAAC;QAEH,IAAI,CAAC,aAAa,GAAG,IAAI,aAAa,CAAC;YACrC,OAAO;YACP,UAAU,EAAE,IAAI,CAAC,UAAU;YAC3B,QAAQ,EAAE,GAAG,EAAE,CAAC,IAAI,CAAC,WAAW,CAAC,QAAQ,EAAE;YAC3C,aAAa,EAAE,IAAI,CAAC,aAAa;YACjC,WAAW,EAAE,IAAI,CAAC,WAAW;YAC7B,MAAM,EAAE,IAAI,CAAC,MAAM;YACnB,YAAY,EAAE,IAAI,CAAC,YAAY;YAC/B,SAAS,EAAE,OAAO,EAAE,SAAS;SAC9B,CAAC,CAAC;QAEH,IAAI,CAAC,YAAY,GAAG,IAAI,YAAY,CAAC,EAAE,aAAa,EAAE,IAAI,CAAC,aAAa,EAAE,CAAC,CAAC;QAE5E,IAAI,CAAC,UAAU,GAAG,IAAI,mBAAmB,CAAC,EAAE,GAAG,EAAE,OAAO,EAAE,QAAQ,IAAI,CAAC,GAAG,EAAE,GAAG,IAAI,EAAE,CAAC,CAAC;QAEvF,IAAI,OAAO,EAAE,WAAW,EAAE,CAAC;YACzB,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,WAAW,CAAC,CAAC,KAAK,CAAC,GAAG,EAAE,GAAE,CAAC,CAAC,CAAC;QAClD,CAAC;QACD,IAAI,OAAO,EAAE,WAAW,EAAE,CAAC;YACzB,IAAI,CAAC,WAAW,CAAC,QAAQ,CAAC,OAAO,CAAC,WAAW,CAAC,CAAC;QACjD,CAAC;IACH,CAAC;IAED,KAAK,CAAC,KAAK,CAAC,WAA4B;QACtC,MAAM,QAAQ,GAAG,MAAM,IAAI,CAAC,WAAW,CAAC,KAAK,CAAC,WAAW,CAAC,CAAC;QAC3D,IAAI,CAAC,SAAS,GAAG,QAAQ,CAAC,KAAK,CAAC,EAAE,CAAC;QACnC,OAAO,QAAQ,CAAC;IAClB,CAAC;IAED,KAAK,CAAC,MAAM;QACV,IAAI,CAAC,UAAU,CAAC,QAAQ,EAAE,CAAC;QAC3B,OAAO,IAAI,CAAC,WAAW,CAAC,MAAM,EAAE,CAAC;IACnC,CAAC;IAED,eAAe;QACb,OAAO,IAAI,CAAC,WAAW,CAAC,eAAe,EAAE,CAAC;IAC5C,CAAC;IAED,aAAa,CAAC,UAAkB;QAC9B,IAAI,CAAC,iBAAiB,GAAG,UAAU,CAAC;IACtC,CAAC;IAED,KAAK,CAAC,kBAAkB;QACtB,IAAI,CAAC,IAAI,CAAC,SAAS,IAAI,CAAC,IAAI,CAAC,iBAAiB,EAAE,CAAC;YAC/C,MAAM,IAAI,KAAK,CAAC,mEAAmE,CAAC,CAAC;QACvF,CAAC;QACD,MAAM,MAAM,GAAG,MAAM,IAAI,CAAC,aAAa,CAAC,SAAS,EAAE,CAAC;QACpD,OAAO,IAAI,YAAY,CAAC,IAAI,CAAC,SAAS,EAAE,IAAI,CAAC,iBAAiB,EAAE,MAAM,CAAC,CAAC;IAC1E,CAAC;IAED,KAAK,CAAC,UAAU,CAAC,QAAwB;QAQvC,IAAI,CAAC,IAAI,CAAC,SAAS,EAAE,CAAC;YACpB,MAAM,IAAI,KAAK,CAAC,mEAAmE,CAAC,CAAC;QACvF,CAAC;QACD,OAAO,IAAI,CAAC,aAAa,CAAC,UAAU,CAAC,QAAQ,EAAE,IAAI,CAAC,SAAS,CAAC,CAAC;IACjE,CAAC;IAKD,KAAK,CAAC,QAAQ,CAAC,OAAe,EAAE,OAA0D;QACxF,IAAI,OAAO,EAAE,OAAO,KAAK,KAAK,EAAE,CAAC;YAC/B,OAAO,IAAI,CAAC,YAAY,CAAC,QAAQ,CAAC,OAAO,CAAC,CAAC;QAC7C,CAAC;QAED,wDAAwD;QACxD,OAAO,IAAI,CAAC,qBAAqB,CAAC,OAAO,EAAE,OAAO,CAAC,CAAC;IACtD,CAAC;IAEO,qBAAqB,CAC3B,OAAe,EACf,OAAuC;QAEvC,MAAM,QAAQ,GAAG,IAAI,CAAC,oBAAoB,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC;QACxD,IAAI,QAAQ,EAAE,CAAC;YACb,OAAO,QAAQ,CAAC;QAClB,CAAC;QAED,kEAAkE;QAClE,MAAM,YAAY,GAAG,IAAI,CAAC,oBAAoB,CAAC,OAAO,EAAE,OAAO,CAAC,CAAC,OAAO,CAAC,GAAG,EAAE;YAC5E,IAAI,CAAC,oBAAoB,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC;QAC5C,CAAC,CAAC,CAAC;QACH,IAAI,CAAC,oBAAoB,CAAC,GAAG,CAAC,OAAO,EAAE,YAAY,CAAC,CAAC;QAErD,OAAO,YAAY,CAAC;IACtB,CAAC;IAEO,KAAK,CAAC,oBAAoB,CAChC,OAAe,EACf,OAAuC;QAEvC,IAAI,CAAC,IAAI,CAAC,iBAAiB,EAAE,CAAC;YAC5B,MAAM,IAAI,KAAK,CAAC,mDAAmD,CAAC,CAAC;QACvE,CAAC;QAED,MAAM,eAAe,GAAG,OAAO,EAAE,eAAe,KAAK,KAAK,CAAC,CAAC,eAAe;QAC3E,MAAM,SAAS,GAAG,MAAM,IAAI,CAAC,YAAY,CAAC,iBAAiB,CAAC,OAAO,EAAE,IAAI,CAAC,iBAAiB,EAAE,eAAe,CAAC,CAAC;QAE9G,2BAA2B;QAC3B,MAAM,eAAe,GAAG,SAAS,CAAC,UAAU,CAAC;QAC7C,IAAI,eAAe,EAAE,CAAC;YACpB,IAAI,CAAC,UAAU,CAAC,GAAG,CAAC,OAAO,EAAE,eAAe,EAAE,SAAS,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC;gBACtE,MAAM,EAAE,CAAC,CAAC,MAAM;gBAChB,EAAE,EAAE,CAAC,CAAC,EAAE;gBACR,OAAO,EAAE,CAAC,CAAC,OAAO;gBAClB,UAAU,EAAE,CAAC,CAAC,UAAU;gBACxB,iBAAiB,EAAE,CAAC,CAAC,iBAAiB;gBACtC,UAAU,EAAE,CAAC,CAAC,UAAU;gBACxB,eAAe,EAAE,CAAC,CAAC,eAAe;aACnC,CAAC,CAAC,CAAC,CAAC;QACP,CAAC;QAED,OAAO,SAAS,CAAC;IACnB,CAAC;IAED,KAAK,CAAC,UAAU,CAAC,OAA0B;QACzC,OAAO,IAAI,CAAC,YAAY,CAAC,UAAU,CAAC,OAAO,CAAC,CAAC;IAC/C,CAAC;IAED,KAAK,CAAC,WAAW,CAAC,OAAe;QAC/B,IAAI,CAAC,UAAU,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC;QAC/B,OAAO,IAAI,CAAC,YAAY,CAAC,WAAW,CAAC,OAAO,CAAC,CAAC;IAChD,CAAC;IAED,KAAK,CAAC,YAAY,CAAC,OAAe,EAAE,MAAc;QAChD,IAAI,SAAS,GAAG,IAAI,CAAC,UAAU,CAAC,YAAY,CAAC,OAAO,CAAC,CAAC;QACtD,IAAI,YAAY,GAAG,IAAI,CAAC,UAAU,CAAC,eAAe,CAAC,OAAO,EAAE,MAAM,CAAC,CAAC;QAEpE,IAAI,CAAC,SAAS,IAAI,CAAC,YAAY,EAAE,CAAC;YAChC,MAAM,IAAI,CAAC,QAAQ,CAAC,OAAO,CAAC,CAAC;YAC7B,SAAS,GAAG,IAAI,CAAC,UAAU,CAAC,YAAY,CAAC,OAAO,CAAC,CAAC;YAClD,YAAY,GAAG,IAAI,CAAC,UAAU,CAAC,eAAe,CAAC,OAAO,EAAE,MAAM,CAAC,CAAC;QAClE,CAAC;QAED,IAAI,CAAC,SAAS,IAAI,CAAC,YAAY,EAAE,CAAC;YAChC,MAAM,IAAI,KAAK,CAAC,QAAQ,MAAM,uBAAuB,OAAO,EAAE,CAAC,CAAC;QAClE,CAAC;QAED,OAAO,IAAI,CAAC,eAAe,CAAC,sBAAsB,CAAC,OAAO,EAAE,MAAM,EAAE,SAAS,EAAE,YAAY,CAAC,CAAC;IAC/F,CAAC;IAED,KAAK,CAAC,eAAe,CAAC,OAAe,EAAE,OAAgC;QACrE,OAAO,IAAI,CAAC,YAAY,CAAC,eAAe,CAAC,OAAO,EAAE,OAAO,CAAC,CAAC;IAC7D,CAAC;IAED,KAAK,CAAC,gBAAgB,CAAC,OAAe,EAAE,KAA8B;QACpE,OAAO,IAAI,CAAC,YAAY,CAAC,gBAAgB,CAAC,OAAO,EAAE,KAAK,CAAC,CAAC;IAC5D,CAAC;IAED,KAAK,CAAC,mBAAmB;QACvB,OAAO,IAAI,CAAC,aAAa,CAAC,mBAAmB,EAAE,CAAC;IAClD,CAAC;IAED,KAAK,CAAC,YAAY,CAAC,SAAiB,EAAE,WAAmB,EAAE,MAAe;QACxE,OAAO,IAAI,CAAC,aAAa,CAAC,YAAY,CAAC,SAAS,EAAE,WAAW,EAAE,MAAM,CAAC,CAAC;IACzE,CAAC;IAED,KAAK,CAAC,aAAa;QACjB,OAAO,IAAI,CAAC,aAAa,CAAC,aAAa,EAAE,CAAC;IAC5C,CAAC;IAED,KAAK,CAAC,SAAS;QACb,OAAO,IAAI,CAAC,aAAa,CAAC,SAAS,EAAE,CAAC;IACxC,CAAC;IAED,KAAK,CAAC,SAAS;QACb,OAAO,IAAI,CAAC,aAAa,CAAC,SAAS,EAAE,CAAC;IACxC,CAAC;IAED,MAAM,CAAC,KAAK,CAAC,eAAe;QAC1B,OAAO,eAAe,EAAE,CAAC;IAC3B,CAAC;IAED,UAAU;QACR,IAAI,CAAC,UAAU,CAAC,QAAQ,EAAE,CAAC;IAC7B,CAAC;IAED,4DAA4D;IAC5D,KAAK,CAAC,OAAO;QACX,IAAI,CAAC,UAAU,CAAC,QAAQ,EAAE,CAAC;QAC3B,IAAI,CAAC,oBAAoB,CAAC,KAAK,EAAE,CAAC;QAClC,IAAI,CAAC,cAAc,GAAG,IAAI,CAAC;QAC3B,IAAI,CAAC,SAAS,GAAG,IAAI,CAAC;QACtB,IAAI,CAAC,iBAAiB,GAAG,IAAI,CAAC;QAE9B,qCAAqC;QACrC,MAAM,IAAI,CAAC,WAAW,CAAC,MAAM,EAAE,CAAC,KAAK,CAAC,GAAG,EAAE,GAAE,CAAC,CAAC,CAAC;IAClD,CAAC;CACF"}
|
|
@@ -0,0 +1,73 @@
|
|
|
1
|
+
/** Errors from account operations (webhooks, keys, licenses, appointments, delegates). */
|
|
2
|
+
import { CapsaraError, type ApiErrorResponse, type AxiosLikeError } from './capsara-error.js';
|
|
3
|
+
export declare class CapsaraAccountError extends CapsaraError {
|
|
4
|
+
constructor(message: string, code: string, statusCode: number, details?: Record<string, unknown>, response?: ApiErrorResponse);
|
|
5
|
+
/**
|
|
6
|
+
* Unauthorized - missing or invalid authentication
|
|
7
|
+
* HTTP 401 - UNAUTHORIZED
|
|
8
|
+
*/
|
|
9
|
+
static unauthorized(): CapsaraAccountError;
|
|
10
|
+
/**
|
|
11
|
+
* Resource not found (webhook, license, appointment, etc.)
|
|
12
|
+
* HTTP 404 - NOT_FOUND
|
|
13
|
+
*/
|
|
14
|
+
static notFound(resourceType: string, identifier?: string): CapsaraAccountError;
|
|
15
|
+
/**
|
|
16
|
+
* Webhook not found
|
|
17
|
+
* HTTP 404 - WEBHOOK_NOT_FOUND
|
|
18
|
+
*/
|
|
19
|
+
static webhookNotFound(webhookId?: string): CapsaraAccountError;
|
|
20
|
+
/**
|
|
21
|
+
* License not found
|
|
22
|
+
* HTTP 404 - LICENSE_NOT_FOUND
|
|
23
|
+
*/
|
|
24
|
+
static licenseNotFound(state?: string, licenseNumber?: string): CapsaraAccountError;
|
|
25
|
+
/**
|
|
26
|
+
* Appointment not found
|
|
27
|
+
* HTTP 404 - APPOINTMENT_NOT_FOUND
|
|
28
|
+
*/
|
|
29
|
+
static appointmentNotFound(carrierPartyId?: string): CapsaraAccountError;
|
|
30
|
+
/**
|
|
31
|
+
* Delegate not found
|
|
32
|
+
* HTTP 404 - DELEGATE_NOT_FOUND
|
|
33
|
+
*/
|
|
34
|
+
static delegateNotFound(delegateId?: string): CapsaraAccountError;
|
|
35
|
+
/**
|
|
36
|
+
* Key not found
|
|
37
|
+
* HTTP 404 - KEY_NOT_FOUND
|
|
38
|
+
*/
|
|
39
|
+
static keyNotFound(keyFingerprint?: string): CapsaraAccountError;
|
|
40
|
+
/**
|
|
41
|
+
* Invalid request body (validation error)
|
|
42
|
+
* HTTP 400 - VALIDATION_ERROR
|
|
43
|
+
*/
|
|
44
|
+
static validationError(message: string, details?: Record<string, unknown>): CapsaraAccountError;
|
|
45
|
+
/**
|
|
46
|
+
* Missing required parameter
|
|
47
|
+
* HTTP 400 - MISSING_PARAM
|
|
48
|
+
*/
|
|
49
|
+
static missingParam(paramName: string): CapsaraAccountError;
|
|
50
|
+
/**
|
|
51
|
+
* Resource already exists (duplicate)
|
|
52
|
+
* HTTP 409 - ALREADY_EXISTS
|
|
53
|
+
*/
|
|
54
|
+
static alreadyExists(resourceType: string, identifier?: string): CapsaraAccountError;
|
|
55
|
+
/**
|
|
56
|
+
* Cannot delete active key
|
|
57
|
+
* HTTP 400 - CANNOT_DELETE_ACTIVE_KEY
|
|
58
|
+
*/
|
|
59
|
+
static cannotDeleteActiveKey(): CapsaraAccountError;
|
|
60
|
+
/**
|
|
61
|
+
* Webhook limit exceeded
|
|
62
|
+
* HTTP 400 - WEBHOOK_LIMIT_EXCEEDED
|
|
63
|
+
*/
|
|
64
|
+
static webhookLimitExceeded(limit: number): CapsaraAccountError;
|
|
65
|
+
/**
|
|
66
|
+
* Invalid webhook URL
|
|
67
|
+
* HTTP 400 - INVALID_WEBHOOK_URL
|
|
68
|
+
*/
|
|
69
|
+
static invalidWebhookUrl(url?: string): CapsaraAccountError;
|
|
70
|
+
/** Maps an API error response to the appropriate factory method. */
|
|
71
|
+
static fromApiError(error: AxiosLikeError): CapsaraAccountError;
|
|
72
|
+
}
|
|
73
|
+
//# sourceMappingURL=account-error.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"account-error.d.ts","sourceRoot":"","sources":["../../src/errors/account-error.ts"],"names":[],"mappings":"AAAA,0FAA0F;AAE1F,OAAO,EAAE,YAAY,EAAE,KAAK,gBAAgB,EAAE,KAAK,cAAc,EAAE,MAAM,oBAAoB,CAAC;AAE9F,qBAAa,mBAAoB,SAAQ,YAAY;gBAEjD,OAAO,EAAE,MAAM,EACf,IAAI,EAAE,MAAM,EACZ,UAAU,EAAE,MAAM,EAClB,OAAO,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EACjC,QAAQ,CAAC,EAAE,gBAAgB;IAM7B;;;OAGG;IACH,MAAM,CAAC,YAAY,IAAI,mBAAmB;IAQ1C;;;OAGG;IACH,MAAM,CAAC,QAAQ,CAAC,YAAY,EAAE,MAAM,EAAE,UAAU,CAAC,EAAE,MAAM,GAAG,mBAAmB;IAW/E;;;OAGG;IACH,MAAM,CAAC,eAAe,CAAC,SAAS,CAAC,EAAE,MAAM,GAAG,mBAAmB;IAI/D;;;OAGG;IACH,MAAM,CAAC,eAAe,CAAC,KAAK,CAAC,EAAE,MAAM,EAAE,aAAa,CAAC,EAAE,MAAM,GAAG,mBAAmB;IAKnF;;;OAGG;IACH,MAAM,CAAC,mBAAmB,CAAC,cAAc,CAAC,EAAE,MAAM,GAAG,mBAAmB;IAIxE;;;OAGG;IACH,MAAM,CAAC,gBAAgB,CAAC,UAAU,CAAC,EAAE,MAAM,GAAG,mBAAmB;IAIjE;;;OAGG;IACH,MAAM,CAAC,WAAW,CAAC,cAAc,CAAC,EAAE,MAAM,GAAG,mBAAmB;IAIhE;;;OAGG;IACH,MAAM,CAAC,eAAe,CAAC,OAAO,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,mBAAmB;IAS/F;;;OAGG;IACH,MAAM,CAAC,YAAY,CAAC,SAAS,EAAE,MAAM,GAAG,mBAAmB;IAS3D;;;OAGG;IACH,MAAM,CAAC,aAAa,CAAC,YAAY,EAAE,MAAM,EAAE,UAAU,CAAC,EAAE,MAAM,GAAG,mBAAmB;IAWpF;;;OAGG;IACH,MAAM,CAAC,qBAAqB,IAAI,mBAAmB;IAQnD;;;OAGG;IACH,MAAM,CAAC,oBAAoB,CAAC,KAAK,EAAE,MAAM,GAAG,mBAAmB;IAS/D;;;OAGG;IACH,MAAM,CAAC,iBAAiB,CAAC,GAAG,CAAC,EAAE,MAAM,GAAG,mBAAmB;IAS3D,oEAAoE;IACpE,MAAM,CAAC,YAAY,CAAC,KAAK,EAAE,cAAc,GAAG,mBAAmB;CA4FhE"}
|
|
@@ -0,0 +1,155 @@
|
|
|
1
|
+
/** Errors from account operations (webhooks, keys, licenses, appointments, delegates). */
|
|
2
|
+
import { CapsaraError } from './capsara-error.js';
|
|
3
|
+
export class CapsaraAccountError extends CapsaraError {
|
|
4
|
+
constructor(message, code, statusCode, details, response) {
|
|
5
|
+
super(message, code, statusCode, details, response);
|
|
6
|
+
this.name = 'CapsaraAccountError';
|
|
7
|
+
}
|
|
8
|
+
/**
|
|
9
|
+
* Unauthorized - missing or invalid authentication
|
|
10
|
+
* HTTP 401 - UNAUTHORIZED
|
|
11
|
+
*/
|
|
12
|
+
static unauthorized() {
|
|
13
|
+
return new CapsaraAccountError('Unauthorized', 'UNAUTHORIZED', 401);
|
|
14
|
+
}
|
|
15
|
+
/**
|
|
16
|
+
* Resource not found (webhook, license, appointment, etc.)
|
|
17
|
+
* HTTP 404 - NOT_FOUND
|
|
18
|
+
*/
|
|
19
|
+
static notFound(resourceType, identifier) {
|
|
20
|
+
return new CapsaraAccountError(identifier
|
|
21
|
+
? `${resourceType} with identifier ${identifier} not found`
|
|
22
|
+
: `${resourceType} not found`, 'NOT_FOUND', 404, { resourceType, identifier });
|
|
23
|
+
}
|
|
24
|
+
/**
|
|
25
|
+
* Webhook not found
|
|
26
|
+
* HTTP 404 - WEBHOOK_NOT_FOUND
|
|
27
|
+
*/
|
|
28
|
+
static webhookNotFound(webhookId) {
|
|
29
|
+
return CapsaraAccountError.notFound('Webhook', webhookId);
|
|
30
|
+
}
|
|
31
|
+
/**
|
|
32
|
+
* License not found
|
|
33
|
+
* HTTP 404 - LICENSE_NOT_FOUND
|
|
34
|
+
*/
|
|
35
|
+
static licenseNotFound(state, licenseNumber) {
|
|
36
|
+
const identifier = state && licenseNumber ? `${state}/${licenseNumber}` : undefined;
|
|
37
|
+
return CapsaraAccountError.notFound('License', identifier);
|
|
38
|
+
}
|
|
39
|
+
/**
|
|
40
|
+
* Appointment not found
|
|
41
|
+
* HTTP 404 - APPOINTMENT_NOT_FOUND
|
|
42
|
+
*/
|
|
43
|
+
static appointmentNotFound(carrierPartyId) {
|
|
44
|
+
return CapsaraAccountError.notFound('Appointment', carrierPartyId);
|
|
45
|
+
}
|
|
46
|
+
/**
|
|
47
|
+
* Delegate not found
|
|
48
|
+
* HTTP 404 - DELEGATE_NOT_FOUND
|
|
49
|
+
*/
|
|
50
|
+
static delegateNotFound(delegateId) {
|
|
51
|
+
return CapsaraAccountError.notFound('Delegate', delegateId);
|
|
52
|
+
}
|
|
53
|
+
/**
|
|
54
|
+
* Key not found
|
|
55
|
+
* HTTP 404 - KEY_NOT_FOUND
|
|
56
|
+
*/
|
|
57
|
+
static keyNotFound(keyFingerprint) {
|
|
58
|
+
return CapsaraAccountError.notFound('Key', keyFingerprint);
|
|
59
|
+
}
|
|
60
|
+
/**
|
|
61
|
+
* Invalid request body (validation error)
|
|
62
|
+
* HTTP 400 - VALIDATION_ERROR
|
|
63
|
+
*/
|
|
64
|
+
static validationError(message, details) {
|
|
65
|
+
return new CapsaraAccountError(message || 'Invalid request body', 'VALIDATION_ERROR', 400, details);
|
|
66
|
+
}
|
|
67
|
+
/**
|
|
68
|
+
* Missing required parameter
|
|
69
|
+
* HTTP 400 - MISSING_PARAM
|
|
70
|
+
*/
|
|
71
|
+
static missingParam(paramName) {
|
|
72
|
+
return new CapsaraAccountError(`${paramName} is required`, 'MISSING_PARAM', 400, { paramName });
|
|
73
|
+
}
|
|
74
|
+
/**
|
|
75
|
+
* Resource already exists (duplicate)
|
|
76
|
+
* HTTP 409 - ALREADY_EXISTS
|
|
77
|
+
*/
|
|
78
|
+
static alreadyExists(resourceType, identifier) {
|
|
79
|
+
return new CapsaraAccountError(identifier
|
|
80
|
+
? `${resourceType} with identifier ${identifier} already exists`
|
|
81
|
+
: `${resourceType} already exists`, 'ALREADY_EXISTS', 409, { resourceType, identifier });
|
|
82
|
+
}
|
|
83
|
+
/**
|
|
84
|
+
* Cannot delete active key
|
|
85
|
+
* HTTP 400 - CANNOT_DELETE_ACTIVE_KEY
|
|
86
|
+
*/
|
|
87
|
+
static cannotDeleteActiveKey() {
|
|
88
|
+
return new CapsaraAccountError('Cannot delete the currently active key', 'CANNOT_DELETE_ACTIVE_KEY', 400);
|
|
89
|
+
}
|
|
90
|
+
/**
|
|
91
|
+
* Webhook limit exceeded
|
|
92
|
+
* HTTP 400 - WEBHOOK_LIMIT_EXCEEDED
|
|
93
|
+
*/
|
|
94
|
+
static webhookLimitExceeded(limit) {
|
|
95
|
+
return new CapsaraAccountError(`Webhook limit of ${limit} exceeded`, 'WEBHOOK_LIMIT_EXCEEDED', 400, { limit });
|
|
96
|
+
}
|
|
97
|
+
/**
|
|
98
|
+
* Invalid webhook URL
|
|
99
|
+
* HTTP 400 - INVALID_WEBHOOK_URL
|
|
100
|
+
*/
|
|
101
|
+
static invalidWebhookUrl(url) {
|
|
102
|
+
return new CapsaraAccountError('Invalid webhook URL', 'INVALID_WEBHOOK_URL', 400, url ? { url } : undefined);
|
|
103
|
+
}
|
|
104
|
+
/** Maps an API error response to the appropriate factory method. */
|
|
105
|
+
static fromApiError(error) {
|
|
106
|
+
// Handle axios errors
|
|
107
|
+
if (error.response) {
|
|
108
|
+
const status = error.response.status;
|
|
109
|
+
const data = error.response.data;
|
|
110
|
+
const errorCode = data?.error?.code;
|
|
111
|
+
const errorMessage = data?.error?.message ?? data?.message ?? error.message ?? 'Unknown error';
|
|
112
|
+
const errorDetails = data?.error?.details ?? data?.details;
|
|
113
|
+
// Map known error codes to factory methods
|
|
114
|
+
switch (errorCode) {
|
|
115
|
+
case 'UNAUTHORIZED':
|
|
116
|
+
return CapsaraAccountError.unauthorized();
|
|
117
|
+
case 'WEBHOOK_NOT_FOUND':
|
|
118
|
+
return CapsaraAccountError.webhookNotFound((errorDetails?.webhookId ?? errorDetails?.identifier));
|
|
119
|
+
case 'LICENSE_NOT_FOUND':
|
|
120
|
+
return CapsaraAccountError.licenseNotFound(errorDetails?.state, errorDetails?.licenseNumber);
|
|
121
|
+
case 'APPOINTMENT_NOT_FOUND':
|
|
122
|
+
return CapsaraAccountError.appointmentNotFound((errorDetails?.carrierPartyId ?? errorDetails?.identifier));
|
|
123
|
+
case 'DELEGATE_NOT_FOUND':
|
|
124
|
+
return CapsaraAccountError.delegateNotFound((errorDetails?.delegateId ?? errorDetails?.identifier));
|
|
125
|
+
case 'KEY_NOT_FOUND':
|
|
126
|
+
return CapsaraAccountError.keyNotFound((errorDetails?.keyFingerprint ?? errorDetails?.identifier));
|
|
127
|
+
case 'NOT_FOUND':
|
|
128
|
+
return CapsaraAccountError.notFound(errorDetails?.resourceType ?? 'Resource', errorDetails?.identifier);
|
|
129
|
+
case 'VALIDATION_ERROR':
|
|
130
|
+
return CapsaraAccountError.validationError(errorMessage, errorDetails);
|
|
131
|
+
case 'MISSING_PARAM':
|
|
132
|
+
return CapsaraAccountError.missingParam(errorDetails?.paramName ?? 'Parameter');
|
|
133
|
+
case 'ALREADY_EXISTS':
|
|
134
|
+
return CapsaraAccountError.alreadyExists(errorDetails?.resourceType ?? 'Resource', errorDetails?.identifier);
|
|
135
|
+
case 'CANNOT_DELETE_ACTIVE_KEY':
|
|
136
|
+
return CapsaraAccountError.cannotDeleteActiveKey();
|
|
137
|
+
case 'WEBHOOK_LIMIT_EXCEEDED':
|
|
138
|
+
return CapsaraAccountError.webhookLimitExceeded(errorDetails?.limit ?? 10);
|
|
139
|
+
case 'INVALID_WEBHOOK_URL':
|
|
140
|
+
return CapsaraAccountError.invalidWebhookUrl(errorDetails?.url);
|
|
141
|
+
default:
|
|
142
|
+
// Generic account error with status code
|
|
143
|
+
return new CapsaraAccountError(errorMessage, errorCode ?? 'ACCOUNT_ERROR', status, errorDetails);
|
|
144
|
+
}
|
|
145
|
+
}
|
|
146
|
+
// Handle non-axios errors
|
|
147
|
+
if (error instanceof CapsaraAccountError) {
|
|
148
|
+
return error;
|
|
149
|
+
}
|
|
150
|
+
// Generic error fallback
|
|
151
|
+
const errorMessage = error.message ?? 'Unknown account error';
|
|
152
|
+
return new CapsaraAccountError(errorMessage, 'ACCOUNT_ERROR', 500, { originalError: errorMessage });
|
|
153
|
+
}
|
|
154
|
+
}
|
|
155
|
+
//# sourceMappingURL=account-error.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"account-error.js","sourceRoot":"","sources":["../../src/errors/account-error.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,34 @@
|
|
|
1
|
+
import { CapsaraError, type ApiErrorResponse, type AxiosLikeError, type StoredErrorResponse } from './capsara-error.js';
|
|
2
|
+
/** Errors from audit trail operations. */
|
|
3
|
+
export declare class CapsaraAuditError extends CapsaraError {
|
|
4
|
+
readonly response?: StoredErrorResponse;
|
|
5
|
+
constructor(message: string, code: string, statusCode: number, details?: Record<string, unknown>, response?: ApiErrorResponse);
|
|
6
|
+
/**
|
|
7
|
+
* Create error for insufficient permissions
|
|
8
|
+
* Thrown when recipient tries to add 'log' action (creator-only)
|
|
9
|
+
*/
|
|
10
|
+
static insufficientPermissions(details?: Record<string, unknown>): CapsaraAuditError;
|
|
11
|
+
/**
|
|
12
|
+
* Create error for invalid audit action
|
|
13
|
+
* Thrown when action is not 'log' or 'processed'
|
|
14
|
+
*/
|
|
15
|
+
static invalidAction(action?: string): CapsaraAuditError;
|
|
16
|
+
/**
|
|
17
|
+
* Create error for access denied
|
|
18
|
+
* Thrown when party is not in capsa keychain
|
|
19
|
+
*/
|
|
20
|
+
static accessDenied(details?: Record<string, unknown>): CapsaraAuditError;
|
|
21
|
+
/**
|
|
22
|
+
* Create error for missing details field
|
|
23
|
+
* Thrown when 'log' action is used without details
|
|
24
|
+
*/
|
|
25
|
+
static missingDetails(): CapsaraAuditError;
|
|
26
|
+
/**
|
|
27
|
+
* Create error for capsa not found
|
|
28
|
+
* Thrown when capsa doesn't exist
|
|
29
|
+
*/
|
|
30
|
+
static capsaNotFound(capsaId: string): CapsaraAuditError;
|
|
31
|
+
/** Maps an API error response to the appropriate factory method. */
|
|
32
|
+
static fromApiError(error: AxiosLikeError): CapsaraAuditError;
|
|
33
|
+
}
|
|
34
|
+
//# sourceMappingURL=audit-error.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"audit-error.d.ts","sourceRoot":"","sources":["../../src/errors/audit-error.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAAE,KAAK,gBAAgB,EAAE,KAAK,cAAc,EAAE,KAAK,mBAAmB,EAAE,MAAM,oBAAoB,CAAC;AAExH,0CAA0C;AAC1C,qBAAa,iBAAkB,SAAQ,YAAY;IACjD,SAAwB,QAAQ,CAAC,EAAE,mBAAmB,CAAC;gBAGrD,OAAO,EAAE,MAAM,EACf,IAAI,EAAE,MAAM,EACZ,UAAU,EAAE,MAAM,EAClB,OAAO,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EACjC,QAAQ,CAAC,EAAE,gBAAgB;IAO7B;;;OAGG;IACH,MAAM,CAAC,uBAAuB,CAAC,OAAO,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,iBAAiB;IASpF;;;OAGG;IACH,MAAM,CAAC,aAAa,CAAC,MAAM,CAAC,EAAE,MAAM,GAAG,iBAAiB;IASxD;;;OAGG;IACH,MAAM,CAAC,YAAY,CAAC,OAAO,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,iBAAiB;IASzE;;;OAGG;IACH,MAAM,CAAC,cAAc,IAAI,iBAAiB;IAQ1C;;;OAGG;IACH,MAAM,CAAC,aAAa,CAAC,OAAO,EAAE,MAAM,GAAG,iBAAiB;IASxD,oEAAoE;IACpE,MAAM,CAAC,YAAY,CAAC,KAAK,EAAE,cAAc,GAAG,iBAAiB;CA2D9D"}
|
|
@@ -0,0 +1,93 @@
|
|
|
1
|
+
import { CapsaraError } from './capsara-error.js';
|
|
2
|
+
/** Errors from audit trail operations. */
|
|
3
|
+
export class CapsaraAuditError extends CapsaraError {
|
|
4
|
+
constructor(message, code, statusCode, details, response) {
|
|
5
|
+
super(message, code, statusCode, details, response);
|
|
6
|
+
this.name = 'CapsaraAuditError';
|
|
7
|
+
Object.setPrototypeOf(this, CapsaraAuditError.prototype);
|
|
8
|
+
}
|
|
9
|
+
/**
|
|
10
|
+
* Create error for insufficient permissions
|
|
11
|
+
* Thrown when recipient tries to add 'log' action (creator-only)
|
|
12
|
+
*/
|
|
13
|
+
static insufficientPermissions(details) {
|
|
14
|
+
return new CapsaraAuditError('You do not have permission to perform this action', 'INSUFFICIENT_PERMISSIONS', 403, details);
|
|
15
|
+
}
|
|
16
|
+
/**
|
|
17
|
+
* Create error for invalid audit action
|
|
18
|
+
* Thrown when action is not 'log' or 'processed'
|
|
19
|
+
*/
|
|
20
|
+
static invalidAction(action) {
|
|
21
|
+
return new CapsaraAuditError('Invalid audit action', 'INVALID_AUDIT_ACTION', 400, { action });
|
|
22
|
+
}
|
|
23
|
+
/**
|
|
24
|
+
* Create error for access denied
|
|
25
|
+
* Thrown when party is not in capsa keychain
|
|
26
|
+
*/
|
|
27
|
+
static accessDenied(details) {
|
|
28
|
+
return new CapsaraAuditError('You do not have access to this capsa', 'ACCESS_DENIED', 403, details);
|
|
29
|
+
}
|
|
30
|
+
/**
|
|
31
|
+
* Create error for missing details field
|
|
32
|
+
* Thrown when 'log' action is used without details
|
|
33
|
+
*/
|
|
34
|
+
static missingDetails() {
|
|
35
|
+
return new CapsaraAuditError('Details field is required for log action', 'MISSING_DETAILS', 400);
|
|
36
|
+
}
|
|
37
|
+
/**
|
|
38
|
+
* Create error for capsa not found
|
|
39
|
+
* Thrown when capsa doesn't exist
|
|
40
|
+
*/
|
|
41
|
+
static capsaNotFound(capsaId) {
|
|
42
|
+
return new CapsaraAuditError('Capsa not found or access denied', 'CAPSA_NOT_FOUND', 404, { capsaId });
|
|
43
|
+
}
|
|
44
|
+
/** Maps an API error response to the appropriate factory method. */
|
|
45
|
+
static fromApiError(error) {
|
|
46
|
+
// Extract error information
|
|
47
|
+
const errorCode = error.response?.data?.error?.code;
|
|
48
|
+
const errorMessage = error.response?.data?.error?.message;
|
|
49
|
+
const statusCode = error.response?.status ?? 500;
|
|
50
|
+
const details = error.response?.data?.error?.details;
|
|
51
|
+
const response = error.response;
|
|
52
|
+
// Map known error codes to factory methods
|
|
53
|
+
// Note: Factory methods don't include response, so add it after creation
|
|
54
|
+
let auditError;
|
|
55
|
+
switch (errorCode) {
|
|
56
|
+
case 'INSUFFICIENT_PERMISSIONS':
|
|
57
|
+
auditError = CapsaraAuditError.insufficientPermissions(details);
|
|
58
|
+
break;
|
|
59
|
+
case 'INVALID_AUDIT_ACTION':
|
|
60
|
+
auditError = CapsaraAuditError.invalidAction(details?.action);
|
|
61
|
+
break;
|
|
62
|
+
case 'ACCESS_DENIED':
|
|
63
|
+
auditError = CapsaraAuditError.accessDenied(details);
|
|
64
|
+
break;
|
|
65
|
+
case 'MISSING_DETAILS':
|
|
66
|
+
auditError = CapsaraAuditError.missingDetails();
|
|
67
|
+
break;
|
|
68
|
+
case 'ENVELOPE_NOT_FOUND':
|
|
69
|
+
case 'CAPSA_NOT_FOUND':
|
|
70
|
+
auditError = CapsaraAuditError.capsaNotFound((details?.capsaId ?? details?.envelopeId) ?? '');
|
|
71
|
+
break;
|
|
72
|
+
default:
|
|
73
|
+
// Generic audit error for unknown codes
|
|
74
|
+
return new CapsaraAuditError(errorMessage ?? 'An audit error occurred', errorCode ?? 'UNKNOWN_AUDIT_ERROR', statusCode, details, response);
|
|
75
|
+
}
|
|
76
|
+
// Add response to error created by factory method
|
|
77
|
+
if (response) {
|
|
78
|
+
Object.defineProperty(auditError, 'response', {
|
|
79
|
+
value: {
|
|
80
|
+
status: response.status,
|
|
81
|
+
statusText: response.statusText,
|
|
82
|
+
headers: response.headers,
|
|
83
|
+
data: response.data,
|
|
84
|
+
},
|
|
85
|
+
writable: false,
|
|
86
|
+
enumerable: true,
|
|
87
|
+
configurable: true,
|
|
88
|
+
});
|
|
89
|
+
}
|
|
90
|
+
return auditError;
|
|
91
|
+
}
|
|
92
|
+
}
|
|
93
|
+
//# sourceMappingURL=audit-error.js.map
|