moss-partner-sdk 0.1.0 → 0.3.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +6 -6
- package/dist/__tests__/setup.d.ts +2 -13
- package/dist/__tests__/setup.d.ts.map +1 -1
- package/dist/__tests__/setup.js +3 -16
- package/dist/__tests__/setup.js.map +1 -1
- package/dist/account.d.ts +27 -0
- package/dist/account.d.ts.map +1 -0
- package/dist/account.js +24 -0
- package/dist/account.js.map +1 -0
- package/dist/analytics.d.ts +4 -15
- package/dist/analytics.d.ts.map +1 -1
- package/dist/analytics.js +1 -38
- package/dist/analytics.js.map +1 -1
- package/dist/billing.d.ts +13 -0
- package/dist/billing.d.ts.map +1 -0
- package/dist/billing.js +18 -0
- package/dist/billing.js.map +1 -0
- package/dist/client.d.ts +13 -3
- package/dist/client.d.ts.map +1 -1
- package/dist/client.js +14 -14
- package/dist/client.js.map +1 -1
- package/dist/customers.d.ts +13 -11
- package/dist/customers.d.ts.map +1 -1
- package/dist/customers.js +123 -101
- package/dist/customers.js.map +1 -1
- package/dist/http.d.ts +3 -4
- package/dist/http.d.ts.map +1 -1
- package/dist/http.js +76 -91
- package/dist/http.js.map +1 -1
- package/dist/index.d.ts +16 -3
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +17 -3
- package/dist/index.js.map +1 -1
- package/dist/policies.d.ts +46 -0
- package/dist/policies.d.ts.map +1 -0
- package/dist/policies.js +40 -0
- package/dist/policies.js.map +1 -0
- package/dist/settings.d.ts +7 -0
- package/dist/settings.d.ts.map +1 -0
- package/dist/settings.js +18 -0
- package/dist/settings.js.map +1 -0
- package/dist/tiers.d.ts +8 -0
- package/dist/tiers.d.ts.map +1 -0
- package/dist/tiers.js +17 -0
- package/dist/tiers.js.map +1 -0
- package/dist/types.d.ts +358 -129
- package/dist/types.d.ts.map +1 -1
- package/dist/types.js +8 -1
- package/dist/types.js.map +1 -1
- package/dist/usage.d.ts +50 -0
- package/dist/usage.d.ts.map +1 -0
- package/dist/usage.js +34 -0
- package/dist/usage.js.map +1 -0
- package/dist/webhooks.d.ts +6 -6
- package/dist/webhooks.d.ts.map +1 -1
- package/dist/webhooks.js +28 -14
- package/dist/webhooks.js.map +1 -1
- package/package.json +2 -2
- package/dist/utils/case.d.ts +0 -5
- package/dist/utils/case.d.ts.map +0 -1
- package/dist/utils/case.js +0 -47
- package/dist/utils/case.js.map +0 -1
package/dist/customers.js
CHANGED
|
@@ -1,74 +1,23 @@
|
|
|
1
1
|
"use strict";
|
|
2
2
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
3
|
exports.CustomersResource = void 0;
|
|
4
|
+
const types_1 = require("./types");
|
|
4
5
|
class CustomersResource {
|
|
5
6
|
constructor(http) {
|
|
6
7
|
this.http = http;
|
|
7
8
|
}
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
name: apiResponse.name,
|
|
13
|
-
email: apiResponse.email || '',
|
|
14
|
-
status: apiResponse.status,
|
|
15
|
-
sandboxToken: apiResponse.credentials?.customerToken?.token,
|
|
16
|
-
productionToken: apiResponse.credentials?.productionToken?.token,
|
|
17
|
-
governance: apiResponse.governance || { jurisdictions: [], frameworks: [] },
|
|
18
|
-
limits: apiResponse.limits || { agents: 0 },
|
|
19
|
-
compliance: apiResponse.compliance || {
|
|
20
|
-
score: 0,
|
|
21
|
-
status: 'unknown',
|
|
22
|
-
issues: [],
|
|
23
|
-
lastAssessment: new Date().toISOString()
|
|
24
|
-
},
|
|
25
|
-
createdAt: apiResponse.createdAt,
|
|
26
|
-
updatedAt: apiResponse.updatedAt,
|
|
27
|
-
};
|
|
28
|
-
}
|
|
29
|
-
mapSessionResponse(apiResponse) {
|
|
30
|
-
return {
|
|
31
|
-
sessionToken: apiResponse.token || apiResponse.sessionToken,
|
|
32
|
-
expiresAt: apiResponse.expiresAt,
|
|
33
|
-
metadata: apiResponse.metadata,
|
|
34
|
-
};
|
|
35
|
-
}
|
|
36
|
-
parsePdfSignatureTrailer(pdfBuffer) {
|
|
37
|
-
const decoder = new TextDecoder('utf-8');
|
|
38
|
-
const pdfText = decoder.decode(pdfBuffer);
|
|
39
|
-
const endMarker = '%%MOSS-SIGNATURE-V1-END';
|
|
40
|
-
const endIndex = pdfText.lastIndexOf(endMarker);
|
|
41
|
-
if (endIndex === -1) {
|
|
42
|
-
throw new Error('PDF does not contain MOSS signature trailer');
|
|
43
|
-
}
|
|
44
|
-
const jsonEndIndex = pdfText.lastIndexOf('}', endIndex);
|
|
45
|
-
if (jsonEndIndex === -1) {
|
|
46
|
-
throw new Error('Invalid MOSS signature trailer format: no closing brace found');
|
|
9
|
+
async create(request, idempotencyKey) {
|
|
10
|
+
const headers = {};
|
|
11
|
+
if (idempotencyKey) {
|
|
12
|
+
headers['Idempotency-Key'] = idempotencyKey;
|
|
47
13
|
}
|
|
48
|
-
const jsonStartPattern = '{"algorithm":';
|
|
49
|
-
const jsonStartIndex = pdfText.lastIndexOf(jsonStartPattern, endIndex);
|
|
50
|
-
if (jsonStartIndex === -1) {
|
|
51
|
-
throw new Error('Invalid MOSS signature trailer format: algorithm marker not found');
|
|
52
|
-
}
|
|
53
|
-
const jsonText = pdfText.substring(jsonStartIndex, jsonEndIndex + 1).trim();
|
|
54
|
-
const trailerMetadata = JSON.parse(jsonText);
|
|
55
|
-
const signedPayload = JSON.parse(trailerMetadata.signed_payload);
|
|
56
|
-
return {
|
|
57
|
-
reportId: signedPayload.report_id,
|
|
58
|
-
signature: trailerMetadata.signature_hex,
|
|
59
|
-
keyId: signedPayload.key_id || trailerMetadata.key_id || 'moss_prod_2026_Q1',
|
|
60
|
-
generatedAt: signedPayload.generated_at,
|
|
61
|
-
downloadUrl: trailerMetadata.verify_url,
|
|
62
|
-
data: signedPayload,
|
|
63
|
-
};
|
|
64
|
-
}
|
|
65
|
-
async create(request) {
|
|
66
14
|
const response = await this.http.request({
|
|
67
15
|
method: 'POST',
|
|
68
16
|
path: '/v1/partner/customers',
|
|
69
17
|
body: request,
|
|
18
|
+
headers,
|
|
70
19
|
});
|
|
71
|
-
return
|
|
20
|
+
return response.data;
|
|
72
21
|
}
|
|
73
22
|
async list(params) {
|
|
74
23
|
const response = await this.http.request({
|
|
@@ -76,19 +25,18 @@ class CustomersResource {
|
|
|
76
25
|
path: '/v1/partner/customers',
|
|
77
26
|
query: params,
|
|
78
27
|
});
|
|
79
|
-
|
|
80
|
-
|
|
81
|
-
|
|
82
|
-
|
|
83
|
-
else if (response.data.customers && Array.isArray(response.data.customers)) {
|
|
84
|
-
customers = response.data.customers.map((customer) => this.mapCustomer(customer));
|
|
85
|
-
}
|
|
86
|
-
else if (Array.isArray(response.data)) {
|
|
87
|
-
customers = response.data.map((customer) => this.mapCustomer(customer));
|
|
88
|
-
}
|
|
28
|
+
const customers = response.data.customers || [];
|
|
29
|
+
const limit = params?.limit || 100;
|
|
30
|
+
const offset = params?.offset || 0;
|
|
31
|
+
const total = customers.length;
|
|
89
32
|
return {
|
|
90
|
-
|
|
91
|
-
pagination:
|
|
33
|
+
customers,
|
|
34
|
+
pagination: {
|
|
35
|
+
total,
|
|
36
|
+
limit,
|
|
37
|
+
offset,
|
|
38
|
+
has_more: total === limit,
|
|
39
|
+
},
|
|
92
40
|
};
|
|
93
41
|
}
|
|
94
42
|
async get(customerId) {
|
|
@@ -96,7 +44,7 @@ class CustomersResource {
|
|
|
96
44
|
method: 'GET',
|
|
97
45
|
path: `/v1/partner/customers/${customerId}`,
|
|
98
46
|
});
|
|
99
|
-
return
|
|
47
|
+
return response.data;
|
|
100
48
|
}
|
|
101
49
|
async update(customerId, request) {
|
|
102
50
|
const response = await this.http.request({
|
|
@@ -104,68 +52,142 @@ class CustomersResource {
|
|
|
104
52
|
path: `/v1/partner/customers/${customerId}`,
|
|
105
53
|
body: request,
|
|
106
54
|
});
|
|
107
|
-
return
|
|
55
|
+
return response.data;
|
|
108
56
|
}
|
|
109
|
-
async promote(customerId, request) {
|
|
57
|
+
async promote(customerId, request, idempotencyKey) {
|
|
58
|
+
const headers = {};
|
|
59
|
+
if (idempotencyKey) {
|
|
60
|
+
headers['Idempotency-Key'] = idempotencyKey;
|
|
61
|
+
}
|
|
110
62
|
const response = await this.http.request({
|
|
111
63
|
method: 'POST',
|
|
112
64
|
path: `/v1/partner/customers/${customerId}/promote`,
|
|
113
65
|
body: request,
|
|
66
|
+
headers,
|
|
114
67
|
});
|
|
115
|
-
return
|
|
68
|
+
return response.data;
|
|
116
69
|
}
|
|
117
|
-
async suspend(customerId, request) {
|
|
70
|
+
async suspend(customerId, request, idempotencyKey) {
|
|
71
|
+
const headers = {};
|
|
72
|
+
if (idempotencyKey) {
|
|
73
|
+
headers['Idempotency-Key'] = idempotencyKey;
|
|
74
|
+
}
|
|
118
75
|
const response = await this.http.request({
|
|
119
76
|
method: 'POST',
|
|
120
77
|
path: `/v1/partner/customers/${customerId}/suspend`,
|
|
121
78
|
body: request,
|
|
79
|
+
headers,
|
|
122
80
|
});
|
|
123
|
-
return
|
|
81
|
+
return response.data;
|
|
124
82
|
}
|
|
125
|
-
async reactivate(customerId, request) {
|
|
83
|
+
async reactivate(customerId, request, idempotencyKey) {
|
|
84
|
+
const headers = {};
|
|
85
|
+
if (idempotencyKey) {
|
|
86
|
+
headers['Idempotency-Key'] = idempotencyKey;
|
|
87
|
+
}
|
|
126
88
|
const response = await this.http.request({
|
|
127
89
|
method: 'POST',
|
|
128
90
|
path: `/v1/partner/customers/${customerId}/reactivate`,
|
|
129
91
|
body: request,
|
|
92
|
+
headers,
|
|
93
|
+
});
|
|
94
|
+
return response.data;
|
|
95
|
+
}
|
|
96
|
+
async delete(customerId) {
|
|
97
|
+
const response = await this.http.request({
|
|
98
|
+
method: 'DELETE',
|
|
99
|
+
path: `/v1/partner/customers/${customerId}`,
|
|
130
100
|
});
|
|
131
|
-
return
|
|
101
|
+
return response.data;
|
|
132
102
|
}
|
|
133
|
-
async createSession(customerId,
|
|
103
|
+
async createSession(customerId, idempotencyKey) {
|
|
104
|
+
const headers = {};
|
|
105
|
+
if (idempotencyKey) {
|
|
106
|
+
headers['Idempotency-Key'] = idempotencyKey;
|
|
107
|
+
}
|
|
134
108
|
const response = await this.http.request({
|
|
135
109
|
method: 'POST',
|
|
136
110
|
path: `/v1/partner/customers/${customerId}/session`,
|
|
137
|
-
|
|
111
|
+
headers,
|
|
138
112
|
});
|
|
139
|
-
return
|
|
113
|
+
return response.data;
|
|
140
114
|
}
|
|
141
|
-
async revokeSession(customerId,
|
|
115
|
+
async revokeSession(customerId, sessionId) {
|
|
116
|
+
const body = {};
|
|
117
|
+
if (sessionId) {
|
|
118
|
+
body.session_id = sessionId;
|
|
119
|
+
}
|
|
142
120
|
await this.http.request({
|
|
143
121
|
method: 'DELETE',
|
|
144
122
|
path: `/v1/partner/customers/${customerId}/session`,
|
|
145
|
-
body
|
|
123
|
+
body,
|
|
146
124
|
});
|
|
147
125
|
}
|
|
148
|
-
async
|
|
149
|
-
const
|
|
150
|
-
|
|
151
|
-
|
|
152
|
-
|
|
153
|
-
params.append('frameworks', request.frameworks.join(','));
|
|
154
|
-
const path = `/v1/partner/customers/${customerId}/compliance-report`;
|
|
155
|
-
const queryString = params.toString();
|
|
156
|
-
const url = `${this.http.baseUrl}${path}${queryString ? `?${queryString}` : ''}`;
|
|
157
|
-
const response = await fetch(url, {
|
|
158
|
-
headers: {
|
|
159
|
-
'Authorization': `Bearer ${this.http.apiKey}`,
|
|
160
|
-
'User-Agent': 'moss-partner-sdk-ts/0.1.0',
|
|
161
|
-
},
|
|
126
|
+
async invite(customerId, request) {
|
|
127
|
+
const response = await this.http.request({
|
|
128
|
+
method: 'POST',
|
|
129
|
+
path: `/v1/partner/customers/${customerId}/invite`,
|
|
130
|
+
body: request,
|
|
162
131
|
});
|
|
163
|
-
|
|
164
|
-
|
|
165
|
-
|
|
166
|
-
const
|
|
132
|
+
return response.data;
|
|
133
|
+
}
|
|
134
|
+
async promotionReadiness(customerId) {
|
|
135
|
+
const response = await this.http.request({
|
|
136
|
+
method: 'GET',
|
|
137
|
+
path: `/v1/partner/customers/${customerId}/promotion-readiness`,
|
|
138
|
+
});
|
|
139
|
+
return response.data;
|
|
140
|
+
}
|
|
141
|
+
async mgi(customerId) {
|
|
142
|
+
const response = await this.http.request({
|
|
143
|
+
method: 'GET',
|
|
144
|
+
path: `/v1/partner/customers/${customerId}/mgi`,
|
|
145
|
+
});
|
|
146
|
+
return response.data;
|
|
147
|
+
}
|
|
148
|
+
async complianceReport(customerId) {
|
|
149
|
+
const pdfBuffer = await this.http.requestBytes('GET', `/v1/partner/customers/${customerId}/compliance-report`);
|
|
167
150
|
return this.parsePdfSignatureTrailer(pdfBuffer);
|
|
168
151
|
}
|
|
152
|
+
parsePdfSignatureTrailer(pdfBuffer) {
|
|
153
|
+
const decoder = new TextDecoder('utf-8');
|
|
154
|
+
const pdfText = decoder.decode(pdfBuffer);
|
|
155
|
+
const endMarker = '%%MOSS-SIGNATURE-V1-END';
|
|
156
|
+
const endIndex = pdfText.lastIndexOf(endMarker);
|
|
157
|
+
if (endIndex === -1) {
|
|
158
|
+
throw new types_1.MossParseError('PDF does not contain MOSS signature trailer');
|
|
159
|
+
}
|
|
160
|
+
const beginMarker = '%%MOSS-SIGNATURE-V1-BEGIN';
|
|
161
|
+
const beginIndex = pdfText.lastIndexOf(beginMarker, endIndex);
|
|
162
|
+
if (beginIndex === -1) {
|
|
163
|
+
throw new types_1.MossParseError('Invalid MOSS signature trailer: begin marker not found');
|
|
164
|
+
}
|
|
165
|
+
const jsonStart = beginIndex + beginMarker.length;
|
|
166
|
+
const jsonEnd = endIndex;
|
|
167
|
+
const jsonText = pdfText.substring(jsonStart, jsonEnd).trim();
|
|
168
|
+
let trailer;
|
|
169
|
+
try {
|
|
170
|
+
trailer = JSON.parse(jsonText);
|
|
171
|
+
}
|
|
172
|
+
catch (e) {
|
|
173
|
+
throw new types_1.MossParseError(`Invalid MOSS signature trailer JSON: ${e}`);
|
|
174
|
+
}
|
|
175
|
+
let signedPayload;
|
|
176
|
+
try {
|
|
177
|
+
signedPayload = JSON.parse(trailer.signed_payload);
|
|
178
|
+
}
|
|
179
|
+
catch (e) {
|
|
180
|
+
throw new types_1.MossParseError(`Invalid signed_payload in trailer: ${e}`);
|
|
181
|
+
}
|
|
182
|
+
return {
|
|
183
|
+
report_id: signedPayload.report_id,
|
|
184
|
+
signature: trailer.signature_hex,
|
|
185
|
+
key_id: signedPayload.key_id || trailer.key_id || 'moss_prod_2026_Q1',
|
|
186
|
+
generated_at: signedPayload.generated_at,
|
|
187
|
+
download_url: trailer.verify_url,
|
|
188
|
+
data: signedPayload,
|
|
189
|
+
};
|
|
190
|
+
}
|
|
169
191
|
}
|
|
170
192
|
exports.CustomersResource = CustomersResource;
|
|
171
193
|
//# sourceMappingURL=customers.js.map
|
package/dist/customers.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"customers.js","sourceRoot":"","sources":["../src/customers.ts"],"names":[],"mappings":";;;
|
|
1
|
+
{"version":3,"file":"customers.js","sourceRoot":"","sources":["../src/customers.ts"],"names":[],"mappings":"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"}
|
package/dist/http.d.ts
CHANGED
|
@@ -3,7 +3,7 @@ export interface HTTPRequestOptions {
|
|
|
3
3
|
method: 'GET' | 'POST' | 'PUT' | 'DELETE' | 'PATCH';
|
|
4
4
|
path: string;
|
|
5
5
|
body?: any;
|
|
6
|
-
query?: Record<string,
|
|
6
|
+
query?: Record<string, any>;
|
|
7
7
|
headers?: Record<string, string>;
|
|
8
8
|
}
|
|
9
9
|
export interface HTTPResponse<T = any> {
|
|
@@ -11,21 +11,20 @@ export interface HTTPResponse<T = any> {
|
|
|
11
11
|
status: number;
|
|
12
12
|
headers: Record<string, string>;
|
|
13
13
|
}
|
|
14
|
+
export declare const SDK_VERSION = "0.2.0";
|
|
14
15
|
export declare class HTTPClient {
|
|
15
16
|
private baseUrl;
|
|
16
17
|
private apiKey;
|
|
17
18
|
private timeout;
|
|
18
19
|
private retries;
|
|
19
|
-
private logger?;
|
|
20
|
-
private testMode;
|
|
21
20
|
constructor(config: MossPartnerConfig);
|
|
22
21
|
request<T = any>(options: HTTPRequestOptions): Promise<HTTPResponse<T>>;
|
|
22
|
+
requestBytes(method: 'GET' | 'POST', path: string, query?: Record<string, string | number | boolean | undefined>): Promise<ArrayBuffer>;
|
|
23
23
|
private executeRequest;
|
|
24
24
|
private buildURL;
|
|
25
25
|
private buildHeaders;
|
|
26
26
|
private extractHeaders;
|
|
27
27
|
private getRetryDelay;
|
|
28
28
|
private sleep;
|
|
29
|
-
private mockRequest;
|
|
30
29
|
}
|
|
31
30
|
//# sourceMappingURL=http.d.ts.map
|
package/dist/http.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"http.d.ts","sourceRoot":"","sources":["../src/http.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"http.d.ts","sourceRoot":"","sources":["../src/http.ts"],"names":[],"mappings":"AAQA,OAAO,EAAE,iBAAiB,EAAkC,MAAM,SAAS,CAAC;AAE5E,MAAM,WAAW,kBAAkB;IACjC,MAAM,EAAE,KAAK,GAAG,MAAM,GAAG,KAAK,GAAG,QAAQ,GAAG,OAAO,CAAC;IACpD,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,CAAC,EAAE,GAAG,CAAC;IACX,KAAK,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,CAAC;IAC5B,OAAO,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;CAClC;AAED,MAAM,WAAW,YAAY,CAAC,CAAC,GAAG,GAAG;IACnC,IAAI,EAAE,CAAC,CAAC;IACR,MAAM,EAAE,MAAM,CAAC;IACf,OAAO,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;CACjC;AAED,eAAO,MAAM,WAAW,UAAU,CAAC;AAEnC,qBAAa,UAAU;IACrB,OAAO,CAAC,OAAO,CAAS;IACxB,OAAO,CAAC,MAAM,CAAS;IACvB,OAAO,CAAC,OAAO,CAAS;IACxB,OAAO,CAAC,OAAO,CAAS;gBAEZ,MAAM,EAAE,iBAAiB;IAa/B,OAAO,CAAC,CAAC,GAAG,GAAG,EAAE,OAAO,EAAE,kBAAkB,GAAG,OAAO,CAAC,YAAY,CAAC,CAAC,CAAC,CAAC;IAiCvE,YAAY,CAChB,MAAM,EAAE,KAAK,GAAG,MAAM,EACtB,IAAI,EAAE,MAAM,EACZ,KAAK,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,GAAG,MAAM,GAAG,OAAO,GAAG,SAAS,CAAC,GAC5D,OAAO,CAAC,WAAW,CAAC;YA2DT,cAAc;IAyF5B,OAAO,CAAC,QAAQ;IAoBhB,OAAO,CAAC,YAAY;IASpB,OAAO,CAAC,cAAc;IAQtB,OAAO,CAAC,aAAa;IAIrB,OAAO,CAAC,KAAK;CAGd"}
|
package/dist/http.js
CHANGED
|
@@ -1,42 +1,24 @@
|
|
|
1
1
|
"use strict";
|
|
2
2
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
-
exports.HTTPClient = void 0;
|
|
3
|
+
exports.HTTPClient = exports.SDK_VERSION = void 0;
|
|
4
4
|
const types_1 = require("./types");
|
|
5
|
-
|
|
5
|
+
exports.SDK_VERSION = '0.2.0';
|
|
6
6
|
class HTTPClient {
|
|
7
7
|
constructor(config) {
|
|
8
|
-
this.baseUrl = config.baseUrl || 'https://api.mosscomputing.com';
|
|
8
|
+
this.baseUrl = (config.baseUrl || 'https://api.mosscomputing.com').replace(/\/$/, '');
|
|
9
9
|
this.apiKey = config.apiKey;
|
|
10
10
|
this.timeout = config.timeout || 30000;
|
|
11
11
|
this.retries = config.retries || 3;
|
|
12
|
-
this.logger = config.logger;
|
|
13
|
-
this.testMode = config.testMode || false;
|
|
14
|
-
this.baseUrl = this.baseUrl.replace(/\/$/, '');
|
|
15
12
|
}
|
|
16
13
|
async request(options) {
|
|
17
|
-
if (this.testMode) {
|
|
18
|
-
return this.mockRequest(options);
|
|
19
|
-
}
|
|
20
14
|
let lastError = null;
|
|
21
|
-
const startTime = Date.now();
|
|
22
15
|
for (let attempt = 0; attempt <= this.retries; attempt++) {
|
|
23
16
|
try {
|
|
24
17
|
if (attempt > 0) {
|
|
25
18
|
const delay = this.getRetryDelay(attempt);
|
|
26
|
-
this.logger?.debug(`Retrying request (attempt ${attempt + 1}/${this.retries + 1}) after ${delay}ms`, {
|
|
27
|
-
path: options.path,
|
|
28
|
-
});
|
|
29
19
|
await this.sleep(delay);
|
|
30
20
|
}
|
|
31
21
|
const response = await this.executeRequest(options);
|
|
32
|
-
const duration = Date.now() - startTime;
|
|
33
|
-
this.logger?.debug(`Request successful`, {
|
|
34
|
-
path: options.path,
|
|
35
|
-
method: options.method,
|
|
36
|
-
status: response.status,
|
|
37
|
-
duration,
|
|
38
|
-
attempt: attempt + 1,
|
|
39
|
-
});
|
|
40
22
|
return response;
|
|
41
23
|
}
|
|
42
24
|
catch (error) {
|
|
@@ -47,49 +29,103 @@ class HTTPClient {
|
|
|
47
29
|
if (attempt === this.retries) {
|
|
48
30
|
break;
|
|
49
31
|
}
|
|
50
|
-
this.logger?.warn(`Request failed, will retry`, {
|
|
51
|
-
path: options.path,
|
|
52
|
-
attempt: attempt + 1,
|
|
53
|
-
error: error.message,
|
|
54
|
-
});
|
|
55
32
|
}
|
|
56
33
|
}
|
|
57
|
-
const duration = Date.now() - startTime;
|
|
58
|
-
this.logger?.error(`Request failed after ${this.retries + 1} attempts`, {
|
|
59
|
-
path: options.path,
|
|
60
|
-
duration,
|
|
61
|
-
error: lastError?.message,
|
|
62
|
-
});
|
|
63
34
|
throw lastError;
|
|
64
35
|
}
|
|
36
|
+
async requestBytes(method, path, query) {
|
|
37
|
+
const url = this.buildURL(path, query);
|
|
38
|
+
const headers = this.buildHeaders();
|
|
39
|
+
const controller = new AbortController();
|
|
40
|
+
const timeoutId = setTimeout(() => controller.abort(), this.timeout);
|
|
41
|
+
try {
|
|
42
|
+
const response = await fetch(url, {
|
|
43
|
+
method,
|
|
44
|
+
headers,
|
|
45
|
+
signal: controller.signal,
|
|
46
|
+
});
|
|
47
|
+
clearTimeout(timeoutId);
|
|
48
|
+
if (!response.ok) {
|
|
49
|
+
let errorMessage = `HTTP ${response.status}`;
|
|
50
|
+
let errorCode = 'api_error';
|
|
51
|
+
let errorDetails;
|
|
52
|
+
const contentType = response.headers.get('content-type');
|
|
53
|
+
if (contentType?.includes('application/json')) {
|
|
54
|
+
try {
|
|
55
|
+
const errorData = await response.json();
|
|
56
|
+
errorCode = errorData.error || errorCode;
|
|
57
|
+
errorMessage = errorData.message || errorData.error || errorMessage;
|
|
58
|
+
errorDetails = errorData;
|
|
59
|
+
}
|
|
60
|
+
catch {
|
|
61
|
+
}
|
|
62
|
+
}
|
|
63
|
+
throw new types_1.MossAPIError(errorMessage, response.status, errorCode, errorDetails);
|
|
64
|
+
}
|
|
65
|
+
return await response.arrayBuffer();
|
|
66
|
+
}
|
|
67
|
+
catch (error) {
|
|
68
|
+
clearTimeout(timeoutId);
|
|
69
|
+
if (error instanceof types_1.MossAPIError) {
|
|
70
|
+
throw error;
|
|
71
|
+
}
|
|
72
|
+
if (error.name === 'AbortError') {
|
|
73
|
+
throw new types_1.MossNetworkError(`Request timeout after ${this.timeout}ms`, error);
|
|
74
|
+
}
|
|
75
|
+
throw new types_1.MossNetworkError(`Network error: ${error.message}`, error);
|
|
76
|
+
}
|
|
77
|
+
}
|
|
65
78
|
async executeRequest(options) {
|
|
66
79
|
const url = this.buildURL(options.path, options.query);
|
|
67
80
|
const headers = this.buildHeaders(options.headers);
|
|
68
81
|
const controller = new AbortController();
|
|
69
82
|
const timeoutId = setTimeout(() => controller.abort(), this.timeout);
|
|
70
83
|
try {
|
|
71
|
-
const requestBody = options.body ? (0, case_1.keysToSnakeCase)(options.body) : undefined;
|
|
72
84
|
const response = await fetch(url, {
|
|
73
85
|
method: options.method,
|
|
74
86
|
headers,
|
|
75
|
-
body:
|
|
87
|
+
body: options.body ? JSON.stringify(options.body) : undefined,
|
|
76
88
|
signal: controller.signal,
|
|
77
89
|
});
|
|
78
90
|
clearTimeout(timeoutId);
|
|
79
91
|
const responseHeaders = this.extractHeaders(response.headers);
|
|
92
|
+
if (!response.ok) {
|
|
93
|
+
let errorMessage = `HTTP ${response.status}`;
|
|
94
|
+
let errorCode = 'api_error';
|
|
95
|
+
let errorDetails;
|
|
96
|
+
const contentType = response.headers.get('content-type');
|
|
97
|
+
if (contentType?.includes('application/json')) {
|
|
98
|
+
let data;
|
|
99
|
+
try {
|
|
100
|
+
data = await response.json();
|
|
101
|
+
}
|
|
102
|
+
catch {
|
|
103
|
+
data = null;
|
|
104
|
+
}
|
|
105
|
+
if (data) {
|
|
106
|
+
errorCode = data.error || errorCode;
|
|
107
|
+
errorMessage = data.message || data.error || errorMessage;
|
|
108
|
+
errorDetails = data;
|
|
109
|
+
}
|
|
110
|
+
}
|
|
111
|
+
throw new types_1.MossAPIError(errorMessage, response.status, errorCode, errorDetails);
|
|
112
|
+
}
|
|
113
|
+
if (response.status === 204) {
|
|
114
|
+
return {
|
|
115
|
+
data: {},
|
|
116
|
+
status: 204,
|
|
117
|
+
headers: responseHeaders,
|
|
118
|
+
};
|
|
119
|
+
}
|
|
80
120
|
const contentType = response.headers.get('content-type');
|
|
81
121
|
const isJson = contentType?.includes('application/json');
|
|
82
122
|
let data;
|
|
83
123
|
if (isJson) {
|
|
84
124
|
data = await response.json();
|
|
85
|
-
data = (0, case_1.keysToCamelCase)(data);
|
|
86
125
|
}
|
|
87
126
|
else {
|
|
88
127
|
data = await response.text();
|
|
89
128
|
}
|
|
90
|
-
if (!response.ok) {
|
|
91
|
-
throw new types_1.MossAPIError(data?.message || data?.error?.message || `HTTP ${response.status}`, response.status, data?.error || data?.error?.code || 'api_error', data?.details || data?.error?.details);
|
|
92
|
-
}
|
|
93
129
|
return {
|
|
94
130
|
data: data,
|
|
95
131
|
status: response.status,
|
|
@@ -112,7 +148,7 @@ class HTTPClient {
|
|
|
112
148
|
if (query) {
|
|
113
149
|
const params = new URLSearchParams();
|
|
114
150
|
for (const [key, value] of Object.entries(query)) {
|
|
115
|
-
if (value !== undefined) {
|
|
151
|
+
if (value !== undefined && value !== null) {
|
|
116
152
|
params.append(key, String(value));
|
|
117
153
|
}
|
|
118
154
|
}
|
|
@@ -127,7 +163,7 @@ class HTTPClient {
|
|
|
127
163
|
return {
|
|
128
164
|
'Content-Type': 'application/json',
|
|
129
165
|
'Authorization': `Bearer ${this.apiKey}`,
|
|
130
|
-
'User-Agent':
|
|
166
|
+
'User-Agent': `moss-partner-sdk-ts/${exports.SDK_VERSION}`,
|
|
131
167
|
...customHeaders,
|
|
132
168
|
};
|
|
133
169
|
}
|
|
@@ -144,57 +180,6 @@ class HTTPClient {
|
|
|
144
180
|
sleep(ms) {
|
|
145
181
|
return new Promise((resolve) => setTimeout(resolve, ms));
|
|
146
182
|
}
|
|
147
|
-
mockRequest(options) {
|
|
148
|
-
this.logger?.debug(`Mock request (test mode)`, {
|
|
149
|
-
path: options.path,
|
|
150
|
-
method: options.method,
|
|
151
|
-
});
|
|
152
|
-
let mockData = { success: true };
|
|
153
|
-
if (options.path.includes('/customers')) {
|
|
154
|
-
if (options.method === 'POST') {
|
|
155
|
-
mockData = {
|
|
156
|
-
id: 'cust_test_' + Date.now(),
|
|
157
|
-
externalId: options.body?.externalId || 'test_ext',
|
|
158
|
-
name: options.body?.name || 'Test Corp',
|
|
159
|
-
email: options.body?.email || 'test@example.com',
|
|
160
|
-
status: 'sandbox_active',
|
|
161
|
-
sandboxToken: 'cust_test_token_' + Date.now(),
|
|
162
|
-
governance: options.body?.governance || { jurisdictions: [], frameworks: [] },
|
|
163
|
-
limits: { agents: 10 },
|
|
164
|
-
compliance: { score: 85, status: 'compliant', issues: [], lastAssessment: new Date().toISOString() },
|
|
165
|
-
createdAt: new Date().toISOString(),
|
|
166
|
-
updatedAt: new Date().toISOString(),
|
|
167
|
-
};
|
|
168
|
-
}
|
|
169
|
-
else if (options.method === 'GET' && options.path.match(/\/customers\/[^/]+$/)) {
|
|
170
|
-
mockData = {
|
|
171
|
-
id: 'cust_test_123',
|
|
172
|
-
externalId: 'test_ext',
|
|
173
|
-
name: 'Test Corp',
|
|
174
|
-
email: 'test@example.com',
|
|
175
|
-
status: 'production_active',
|
|
176
|
-
sandboxToken: 'cust_test_token',
|
|
177
|
-
productionToken: 'cust_prod_token',
|
|
178
|
-
governance: { jurisdictions: ['US'], frameworks: ['nist_ai_rmf'] },
|
|
179
|
-
limits: { agents: 50 },
|
|
180
|
-
compliance: { score: 90, status: 'compliant', issues: [], lastAssessment: new Date().toISOString() },
|
|
181
|
-
createdAt: new Date().toISOString(),
|
|
182
|
-
updatedAt: new Date().toISOString(),
|
|
183
|
-
};
|
|
184
|
-
}
|
|
185
|
-
else if (options.method === 'GET') {
|
|
186
|
-
mockData = {
|
|
187
|
-
data: [],
|
|
188
|
-
pagination: { hasMore: false },
|
|
189
|
-
};
|
|
190
|
-
}
|
|
191
|
-
}
|
|
192
|
-
return Promise.resolve({
|
|
193
|
-
data: mockData,
|
|
194
|
-
status: 200,
|
|
195
|
-
headers: { 'content-type': 'application/json' },
|
|
196
|
-
});
|
|
197
|
-
}
|
|
198
183
|
}
|
|
199
184
|
exports.HTTPClient = HTTPClient;
|
|
200
185
|
//# sourceMappingURL=http.js.map
|