@mikashboks/react-native-agent-sdk 0.1.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/dist/cjs/agent-sdk.d.ts +114 -0
- package/dist/cjs/agent-sdk.d.ts.map +1 -0
- package/dist/cjs/agent-sdk.js +384 -0
- package/dist/cjs/agent-sdk.js.map +1 -0
- package/dist/cjs/constants.d.ts +2 -0
- package/dist/cjs/constants.d.ts.map +1 -0
- package/dist/cjs/constants.js +7 -0
- package/dist/cjs/constants.js.map +1 -0
- package/dist/cjs/errors.d.ts +21 -0
- package/dist/cjs/errors.d.ts.map +1 -0
- package/dist/cjs/errors.js +50 -0
- package/dist/cjs/errors.js.map +1 -0
- package/dist/cjs/http-client.d.ts +47 -0
- package/dist/cjs/http-client.d.ts.map +1 -0
- package/dist/cjs/http-client.js +264 -0
- package/dist/cjs/http-client.js.map +1 -0
- package/dist/cjs/index.d.ts +7 -0
- package/dist/cjs/index.d.ts.map +1 -0
- package/dist/cjs/index.js +25 -0
- package/dist/cjs/index.js.map +1 -0
- package/dist/cjs/package.json +3 -0
- package/dist/cjs/types.d.ts +256 -0
- package/dist/cjs/types.d.ts.map +1 -0
- package/dist/cjs/types.js +3 -0
- package/dist/cjs/types.js.map +1 -0
- package/dist/cjs/utils/phone.d.ts +2 -0
- package/dist/cjs/utils/phone.d.ts.map +1 -0
- package/dist/cjs/utils/phone.js +72 -0
- package/dist/cjs/utils/phone.js.map +1 -0
- package/dist/esm/agent-sdk.d.ts +114 -0
- package/dist/esm/agent-sdk.d.ts.map +1 -0
- package/dist/esm/agent-sdk.js +380 -0
- package/dist/esm/agent-sdk.js.map +1 -0
- package/dist/esm/constants.d.ts +2 -0
- package/dist/esm/constants.d.ts.map +1 -0
- package/dist/esm/constants.js +2 -0
- package/dist/esm/constants.js.map +1 -0
- package/dist/esm/errors.d.ts +21 -0
- package/dist/esm/errors.d.ts.map +1 -0
- package/dist/esm/errors.js +41 -0
- package/dist/esm/errors.js.map +1 -0
- package/dist/esm/http-client.d.ts +47 -0
- package/dist/esm/http-client.d.ts.map +1 -0
- package/dist/esm/http-client.js +260 -0
- package/dist/esm/http-client.js.map +1 -0
- package/dist/esm/index.d.ts +7 -0
- package/dist/esm/index.d.ts.map +1 -0
- package/dist/esm/index.js +5 -0
- package/dist/esm/index.js.map +1 -0
- package/dist/esm/types.d.ts +256 -0
- package/dist/esm/types.d.ts.map +1 -0
- package/dist/esm/types.js +2 -0
- package/dist/esm/types.js.map +1 -0
- package/dist/esm/utils/phone.d.ts +2 -0
- package/dist/esm/utils/phone.d.ts.map +1 -0
- package/dist/esm/utils/phone.js +68 -0
- package/dist/esm/utils/phone.js.map +1 -0
- package/package.json +55 -0
|
@@ -0,0 +1,41 @@
|
|
|
1
|
+
export class AgentSDKError extends Error {
|
|
2
|
+
statusCode;
|
|
3
|
+
responseBody;
|
|
4
|
+
constructor(message, statusCode, responseBody) {
|
|
5
|
+
super(message);
|
|
6
|
+
this.statusCode = statusCode;
|
|
7
|
+
this.responseBody = responseBody;
|
|
8
|
+
this.name = 'AgentSDKError';
|
|
9
|
+
}
|
|
10
|
+
}
|
|
11
|
+
export class AuthenticationError extends AgentSDKError {
|
|
12
|
+
constructor(message = 'Authentication failed', responseBody) {
|
|
13
|
+
super(message, 401, responseBody);
|
|
14
|
+
this.name = 'AuthenticationError';
|
|
15
|
+
}
|
|
16
|
+
}
|
|
17
|
+
export class ForbiddenError extends AgentSDKError {
|
|
18
|
+
constructor(message = 'Access denied', responseBody) {
|
|
19
|
+
super(message, 403, responseBody);
|
|
20
|
+
this.name = 'ForbiddenError';
|
|
21
|
+
}
|
|
22
|
+
}
|
|
23
|
+
export class NotFoundError extends AgentSDKError {
|
|
24
|
+
constructor(message = 'Resource not found', responseBody) {
|
|
25
|
+
super(message, 404, responseBody);
|
|
26
|
+
this.name = 'NotFoundError';
|
|
27
|
+
}
|
|
28
|
+
}
|
|
29
|
+
export class ConflictError extends AgentSDKError {
|
|
30
|
+
constructor(message = 'Resource conflict', responseBody) {
|
|
31
|
+
super(message, 409, responseBody);
|
|
32
|
+
this.name = 'ConflictError';
|
|
33
|
+
}
|
|
34
|
+
}
|
|
35
|
+
export class NetworkError extends AgentSDKError {
|
|
36
|
+
constructor(message = 'Network request failed') {
|
|
37
|
+
super(message);
|
|
38
|
+
this.name = 'NetworkError';
|
|
39
|
+
}
|
|
40
|
+
}
|
|
41
|
+
//# sourceMappingURL=errors.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"errors.js","sourceRoot":"","sources":["../../src/errors.ts"],"names":[],"mappings":"AAAA,MAAM,OAAO,aAAc,SAAQ,KAAK;IAGpB;IACA;IAHlB,YACE,OAAe,EACC,UAAmB,EACnB,YAAsB;QAEtC,KAAK,CAAC,OAAO,CAAC,CAAC;QAHC,eAAU,GAAV,UAAU,CAAS;QACnB,iBAAY,GAAZ,YAAY,CAAU;QAGtC,IAAI,CAAC,IAAI,GAAG,eAAe,CAAC;IAC9B,CAAC;CACF;AAED,MAAM,OAAO,mBAAoB,SAAQ,aAAa;IACpD,YAAY,UAAkB,uBAAuB,EAAE,YAAsB;QAC3E,KAAK,CAAC,OAAO,EAAE,GAAG,EAAE,YAAY,CAAC,CAAC;QAClC,IAAI,CAAC,IAAI,GAAG,qBAAqB,CAAC;IACpC,CAAC;CACF;AAED,MAAM,OAAO,cAAe,SAAQ,aAAa;IAC/C,YAAY,UAAkB,eAAe,EAAE,YAAsB;QACnE,KAAK,CAAC,OAAO,EAAE,GAAG,EAAE,YAAY,CAAC,CAAC;QAClC,IAAI,CAAC,IAAI,GAAG,gBAAgB,CAAC;IAC/B,CAAC;CACF;AAED,MAAM,OAAO,aAAc,SAAQ,aAAa;IAC9C,YAAY,UAAkB,oBAAoB,EAAE,YAAsB;QACxE,KAAK,CAAC,OAAO,EAAE,GAAG,EAAE,YAAY,CAAC,CAAC;QAClC,IAAI,CAAC,IAAI,GAAG,eAAe,CAAC;IAC9B,CAAC;CACF;AAED,MAAM,OAAO,aAAc,SAAQ,aAAa;IAC9C,YAAY,UAAkB,mBAAmB,EAAE,YAAsB;QACvE,KAAK,CAAC,OAAO,EAAE,GAAG,EAAE,YAAY,CAAC,CAAC;QAClC,IAAI,CAAC,IAAI,GAAG,eAAe,CAAC;IAC9B,CAAC;CACF;AAED,MAAM,OAAO,YAAa,SAAQ,aAAa;IAC7C,YAAY,UAAkB,wBAAwB;QACpD,KAAK,CAAC,OAAO,CAAC,CAAC;QACf,IAAI,CAAC,IAAI,GAAG,cAAc,CAAC;IAC7B,CAAC;CACF"}
|
|
@@ -0,0 +1,47 @@
|
|
|
1
|
+
export interface HttpClientConfig {
|
|
2
|
+
baseUrl: string;
|
|
3
|
+
projectId: string;
|
|
4
|
+
fetchFn: typeof globalThis.fetch;
|
|
5
|
+
timeoutMs: number;
|
|
6
|
+
getAccessToken: () => string | null;
|
|
7
|
+
refreshAuth?: () => Promise<boolean>;
|
|
8
|
+
onAuthFailure?: () => void;
|
|
9
|
+
}
|
|
10
|
+
interface RequestOptions {
|
|
11
|
+
token?: string;
|
|
12
|
+
headers?: Record<string, string>;
|
|
13
|
+
projectId?: string | null;
|
|
14
|
+
suppressAuthFailure?: boolean;
|
|
15
|
+
timeoutMs?: number;
|
|
16
|
+
onUploadProgress?: (progress: {
|
|
17
|
+
loaded: number;
|
|
18
|
+
total: number | null;
|
|
19
|
+
}) => void;
|
|
20
|
+
}
|
|
21
|
+
export declare class HttpClient {
|
|
22
|
+
private readonly config;
|
|
23
|
+
constructor(config: HttpClientConfig);
|
|
24
|
+
get<T>(path: string, options?: RequestOptions): Promise<T>;
|
|
25
|
+
post<T>(path: string, body?: unknown, options?: RequestOptions): Promise<T>;
|
|
26
|
+
patch<T>(path: string, body?: unknown, options?: RequestOptions): Promise<T>;
|
|
27
|
+
put<T>(path: string, body?: unknown, options?: RequestOptions): Promise<T>;
|
|
28
|
+
postFormData<T>(path: string, formData: FormData, options?: RequestOptions, hasRetriedAuth?: boolean): Promise<T>;
|
|
29
|
+
private postFormDataWithXhr;
|
|
30
|
+
private request;
|
|
31
|
+
private buildUrl;
|
|
32
|
+
private buildProjectHeaders;
|
|
33
|
+
private fetchWithTimeout;
|
|
34
|
+
private handleResponse;
|
|
35
|
+
private shouldAttemptRefresh;
|
|
36
|
+
private shouldNotifyAuthFailure;
|
|
37
|
+
private getRequestAuthMode;
|
|
38
|
+
/**
|
|
39
|
+
* True only when the refresh endpoint itself rejected the request (4xx),
|
|
40
|
+
* meaning the refresh token is invalid/expired. NetworkError (no statusCode)
|
|
41
|
+
* and 5xx responses are transient and must not end the session.
|
|
42
|
+
*/
|
|
43
|
+
private isRefreshRejectedByServer;
|
|
44
|
+
private retryOriginalRequest;
|
|
45
|
+
}
|
|
46
|
+
export {};
|
|
47
|
+
//# sourceMappingURL=http-client.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"http-client.d.ts","sourceRoot":"","sources":["../../src/http-client.ts"],"names":[],"mappings":"AASA,MAAM,WAAW,gBAAgB;IAC/B,OAAO,EAAE,MAAM,CAAC;IAChB,SAAS,EAAE,MAAM,CAAC;IAClB,OAAO,EAAE,OAAO,UAAU,CAAC,KAAK,CAAC;IACjC,SAAS,EAAE,MAAM,CAAC;IAClB,cAAc,EAAE,MAAM,MAAM,GAAG,IAAI,CAAC;IACpC,WAAW,CAAC,EAAE,MAAM,OAAO,CAAC,OAAO,CAAC,CAAC;IACrC,aAAa,CAAC,EAAE,MAAM,IAAI,CAAC;CAC5B;AAED,UAAU,cAAc;IACtB,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,OAAO,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IACjC,SAAS,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IAC1B,mBAAmB,CAAC,EAAE,OAAO,CAAC;IAC9B,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,gBAAgB,CAAC,EAAE,CAAC,QAAQ,EAAE;QAAE,MAAM,EAAE,MAAM,CAAC;QAAC,KAAK,EAAE,MAAM,GAAG,IAAI,CAAA;KAAE,KAAK,IAAI,CAAC;CACjF;AAqBD,qBAAa,UAAU;IACT,OAAO,CAAC,QAAQ,CAAC,MAAM;gBAAN,MAAM,EAAE,gBAAgB;IAE/C,GAAG,CAAC,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE,cAAc,GAAG,OAAO,CAAC,CAAC,CAAC;IAI1D,IAAI,CAAC,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,CAAC,EAAE,OAAO,EAAE,OAAO,CAAC,EAAE,cAAc,GAAG,OAAO,CAAC,CAAC,CAAC;IAI3E,KAAK,CAAC,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,CAAC,EAAE,OAAO,EAAE,OAAO,CAAC,EAAE,cAAc,GAAG,OAAO,CAAC,CAAC,CAAC;IAI5E,GAAG,CAAC,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,CAAC,EAAE,OAAO,EAAE,OAAO,CAAC,EAAE,cAAc,GAAG,OAAO,CAAC,CAAC,CAAC;IAI1E,YAAY,CAAC,CAAC,EAClB,IAAI,EAAE,MAAM,EACZ,QAAQ,EAAE,QAAQ,EAClB,OAAO,CAAC,EAAE,cAAc,EACxB,cAAc,UAAQ,GACrB,OAAO,CAAC,CAAC,CAAC;IAsDb,OAAO,CAAC,mBAAmB;YA4Cb,OAAO;IA6CrB,OAAO,CAAC,QAAQ;IAOhB,OAAO,CAAC,mBAAmB;YAMb,gBAAgB;YA0BhB,cAAc;IA6E5B,OAAO,CAAC,oBAAoB;IAY5B,OAAO,CAAC,uBAAuB;IAO/B,OAAO,CAAC,kBAAkB;IAgB1B;;;;OAIG;IACH,OAAO,CAAC,yBAAyB;YAiBnB,oBAAoB;CAkBnC"}
|
|
@@ -0,0 +1,260 @@
|
|
|
1
|
+
import { AgentSDKError, AuthenticationError, ConflictError, ForbiddenError, NetworkError, NotFoundError, } from './errors.js';
|
|
2
|
+
const AUTH_REFRESH_EXCLUDED_PATHS = new Set([
|
|
3
|
+
'/external/agents/login-challenge',
|
|
4
|
+
'/external/agents/login',
|
|
5
|
+
'/external/agents/refresh',
|
|
6
|
+
'/external/agents/logout',
|
|
7
|
+
]);
|
|
8
|
+
export class HttpClient {
|
|
9
|
+
config;
|
|
10
|
+
constructor(config) {
|
|
11
|
+
this.config = config;
|
|
12
|
+
}
|
|
13
|
+
async get(path, options) {
|
|
14
|
+
return this.request('GET', path, undefined, options);
|
|
15
|
+
}
|
|
16
|
+
async post(path, body, options) {
|
|
17
|
+
return this.request('POST', path, body, options);
|
|
18
|
+
}
|
|
19
|
+
async patch(path, body, options) {
|
|
20
|
+
return this.request('PATCH', path, body, options);
|
|
21
|
+
}
|
|
22
|
+
async put(path, body, options) {
|
|
23
|
+
return this.request('PUT', path, body, options);
|
|
24
|
+
}
|
|
25
|
+
async postFormData(path, formData, options, hasRetriedAuth = false) {
|
|
26
|
+
const url = this.buildUrl(path);
|
|
27
|
+
const headers = this.buildProjectHeaders(options);
|
|
28
|
+
const token = options?.token ?? this.config.getAccessToken();
|
|
29
|
+
if (token) {
|
|
30
|
+
headers['Authorization'] = `Bearer ${token}`;
|
|
31
|
+
}
|
|
32
|
+
if (options?.onUploadProgress && typeof XMLHttpRequest !== 'undefined') {
|
|
33
|
+
const response = await this.postFormDataWithXhr(url, formData, headers, options);
|
|
34
|
+
return this.handleResponse(response, {
|
|
35
|
+
method: 'POST',
|
|
36
|
+
path,
|
|
37
|
+
body: formData,
|
|
38
|
+
options,
|
|
39
|
+
hasRetriedAuth,
|
|
40
|
+
isFormData: true,
|
|
41
|
+
url,
|
|
42
|
+
}, options?.suppressAuthFailure);
|
|
43
|
+
}
|
|
44
|
+
// Do NOT set Content-Type for FormData — browser/RN sets it with boundary
|
|
45
|
+
const response = await this.fetchWithTimeout(url, {
|
|
46
|
+
method: 'POST',
|
|
47
|
+
headers,
|
|
48
|
+
body: formData,
|
|
49
|
+
}, options?.timeoutMs);
|
|
50
|
+
return this.handleResponse(response, {
|
|
51
|
+
method: 'POST',
|
|
52
|
+
path,
|
|
53
|
+
body: formData,
|
|
54
|
+
options,
|
|
55
|
+
hasRetriedAuth,
|
|
56
|
+
isFormData: true,
|
|
57
|
+
url,
|
|
58
|
+
}, options?.suppressAuthFailure);
|
|
59
|
+
}
|
|
60
|
+
postFormDataWithXhr(url, formData, headers, options) {
|
|
61
|
+
return new Promise((resolve, reject) => {
|
|
62
|
+
const xhr = new XMLHttpRequest();
|
|
63
|
+
const timeoutMs = options?.timeoutMs ?? this.config.timeoutMs;
|
|
64
|
+
xhr.open('POST', url, true);
|
|
65
|
+
xhr.responseType = 'text';
|
|
66
|
+
xhr.timeout = timeoutMs;
|
|
67
|
+
for (const [key, value] of Object.entries(headers)) {
|
|
68
|
+
xhr.setRequestHeader(key, value);
|
|
69
|
+
}
|
|
70
|
+
xhr.upload.onprogress = event => {
|
|
71
|
+
options?.onUploadProgress?.({
|
|
72
|
+
loaded: event.loaded,
|
|
73
|
+
total: event.lengthComputable ? event.total : null,
|
|
74
|
+
});
|
|
75
|
+
};
|
|
76
|
+
xhr.onload = () => {
|
|
77
|
+
resolve({
|
|
78
|
+
ok: xhr.status >= 200 && xhr.status < 300,
|
|
79
|
+
status: xhr.status,
|
|
80
|
+
text: async () => xhr.responseText,
|
|
81
|
+
});
|
|
82
|
+
};
|
|
83
|
+
xhr.onerror = () => {
|
|
84
|
+
reject(new NetworkError('Network request failed'));
|
|
85
|
+
};
|
|
86
|
+
xhr.ontimeout = () => {
|
|
87
|
+
reject(new NetworkError(`Request timed out after ${timeoutMs}ms`));
|
|
88
|
+
};
|
|
89
|
+
xhr.onabort = () => {
|
|
90
|
+
reject(new NetworkError('Request aborted'));
|
|
91
|
+
};
|
|
92
|
+
xhr.send(formData);
|
|
93
|
+
});
|
|
94
|
+
}
|
|
95
|
+
async request(method, path, body, options, hasRetriedAuth = false) {
|
|
96
|
+
const url = this.buildUrl(path);
|
|
97
|
+
const headers = {
|
|
98
|
+
'Content-Type': 'application/json',
|
|
99
|
+
...this.buildProjectHeaders(options),
|
|
100
|
+
...(options?.headers ?? {}),
|
|
101
|
+
};
|
|
102
|
+
const token = options?.token ?? this.config.getAccessToken();
|
|
103
|
+
if (token) {
|
|
104
|
+
headers['Authorization'] = `Bearer ${token}`;
|
|
105
|
+
}
|
|
106
|
+
const response = await this.fetchWithTimeout(url, {
|
|
107
|
+
method,
|
|
108
|
+
headers,
|
|
109
|
+
body: body !== undefined ? JSON.stringify(body) : undefined,
|
|
110
|
+
}, options?.timeoutMs);
|
|
111
|
+
return this.handleResponse(response, {
|
|
112
|
+
method,
|
|
113
|
+
path,
|
|
114
|
+
body,
|
|
115
|
+
options,
|
|
116
|
+
hasRetriedAuth,
|
|
117
|
+
isFormData: false,
|
|
118
|
+
url,
|
|
119
|
+
}, options?.suppressAuthFailure);
|
|
120
|
+
}
|
|
121
|
+
buildUrl(path) {
|
|
122
|
+
const trimmedBaseUrl = this.config.baseUrl.replace(/\/+$/, '');
|
|
123
|
+
const normalizedPath = path.startsWith('/') ? path : `/${path}`;
|
|
124
|
+
return `${trimmedBaseUrl}${normalizedPath}`;
|
|
125
|
+
}
|
|
126
|
+
buildProjectHeaders(options) {
|
|
127
|
+
const projectId = options?.projectId === undefined ? this.config.projectId : options.projectId;
|
|
128
|
+
return projectId ? { 'x-project-id': projectId } : {};
|
|
129
|
+
}
|
|
130
|
+
async fetchWithTimeout(url, init, timeoutMs = this.config.timeoutMs) {
|
|
131
|
+
const controller = new AbortController();
|
|
132
|
+
const timeoutId = setTimeout(() => controller.abort(), timeoutMs);
|
|
133
|
+
try {
|
|
134
|
+
const response = await this.config.fetchFn(url, {
|
|
135
|
+
...init,
|
|
136
|
+
signal: controller.signal,
|
|
137
|
+
});
|
|
138
|
+
return response;
|
|
139
|
+
}
|
|
140
|
+
catch (error) {
|
|
141
|
+
if (error instanceof Error && error.name === 'AbortError') {
|
|
142
|
+
throw new NetworkError(`Request timed out after ${timeoutMs}ms`);
|
|
143
|
+
}
|
|
144
|
+
throw new NetworkError(error instanceof Error ? error.message : 'Network request failed');
|
|
145
|
+
}
|
|
146
|
+
finally {
|
|
147
|
+
clearTimeout(timeoutId);
|
|
148
|
+
}
|
|
149
|
+
}
|
|
150
|
+
async handleResponse(response, requestContext, suppressAuthFailure = false) {
|
|
151
|
+
let responseBody;
|
|
152
|
+
let rawText = '';
|
|
153
|
+
try {
|
|
154
|
+
rawText = await response.text();
|
|
155
|
+
responseBody = rawText ? JSON.parse(rawText) : undefined;
|
|
156
|
+
}
|
|
157
|
+
catch {
|
|
158
|
+
if (response.ok) {
|
|
159
|
+
console.warn('[AgentSDK] Failed to parse JSON response body', {
|
|
160
|
+
status: response.status,
|
|
161
|
+
url: requestContext.url,
|
|
162
|
+
});
|
|
163
|
+
responseBody = undefined;
|
|
164
|
+
}
|
|
165
|
+
else {
|
|
166
|
+
responseBody = rawText || undefined;
|
|
167
|
+
}
|
|
168
|
+
}
|
|
169
|
+
if (response.ok) {
|
|
170
|
+
return responseBody;
|
|
171
|
+
}
|
|
172
|
+
const message = typeof responseBody === 'string' && responseBody.trim().length > 0
|
|
173
|
+
? responseBody
|
|
174
|
+
: typeof responseBody === 'object' && responseBody !== null && 'message' in responseBody
|
|
175
|
+
? String(responseBody.message)
|
|
176
|
+
: `HTTP ${response.status}`;
|
|
177
|
+
switch (response.status) {
|
|
178
|
+
case 401:
|
|
179
|
+
if (this.shouldAttemptRefresh(requestContext, suppressAuthFailure)) {
|
|
180
|
+
let refreshed;
|
|
181
|
+
try {
|
|
182
|
+
refreshed = await this.config.refreshAuth?.();
|
|
183
|
+
}
|
|
184
|
+
catch (error) {
|
|
185
|
+
// Only a server-side rejection of the refresh request is a terminal
|
|
186
|
+
// auth failure. Network failures (timeouts, offline) and 5xx refresh
|
|
187
|
+
// responses are retryable: rethrow them WITHOUT onAuthFailure so the
|
|
188
|
+
// caller does not wipe a still-valid session.
|
|
189
|
+
if (this.isRefreshRejectedByServer(error)) {
|
|
190
|
+
this.config.onAuthFailure?.();
|
|
191
|
+
}
|
|
192
|
+
throw error;
|
|
193
|
+
}
|
|
194
|
+
if (refreshed) {
|
|
195
|
+
// The refresh succeeded, so the session is valid. Errors from the
|
|
196
|
+
// retried request (including network failures) propagate untouched;
|
|
197
|
+
// a repeat 401 is handled by the nested handleResponse call.
|
|
198
|
+
return this.retryOriginalRequest(requestContext);
|
|
199
|
+
}
|
|
200
|
+
}
|
|
201
|
+
if (this.shouldNotifyAuthFailure(requestContext, suppressAuthFailure)) {
|
|
202
|
+
this.config.onAuthFailure?.();
|
|
203
|
+
}
|
|
204
|
+
throw new AuthenticationError(message, responseBody);
|
|
205
|
+
case 403:
|
|
206
|
+
throw new ForbiddenError(message, responseBody);
|
|
207
|
+
case 404:
|
|
208
|
+
throw new NotFoundError(message, responseBody);
|
|
209
|
+
case 409:
|
|
210
|
+
throw new ConflictError(message, responseBody);
|
|
211
|
+
default:
|
|
212
|
+
throw new AgentSDKError(message, response.status, responseBody);
|
|
213
|
+
}
|
|
214
|
+
}
|
|
215
|
+
shouldAttemptRefresh(requestContext, suppressAuthFailure) {
|
|
216
|
+
return (!suppressAuthFailure &&
|
|
217
|
+
!requestContext.hasRetriedAuth &&
|
|
218
|
+
this.getRequestAuthMode(requestContext) === 'agent' &&
|
|
219
|
+
Boolean(this.config.refreshAuth));
|
|
220
|
+
}
|
|
221
|
+
shouldNotifyAuthFailure(requestContext, suppressAuthFailure) {
|
|
222
|
+
return !suppressAuthFailure && this.getRequestAuthMode(requestContext) === 'agent';
|
|
223
|
+
}
|
|
224
|
+
getRequestAuthMode(requestContext) {
|
|
225
|
+
if (AUTH_REFRESH_EXCLUDED_PATHS.has(requestContext.path)) {
|
|
226
|
+
return 'none';
|
|
227
|
+
}
|
|
228
|
+
if (typeof requestContext.options?.token === 'string') {
|
|
229
|
+
return 'explicit';
|
|
230
|
+
}
|
|
231
|
+
if (requestContext.path.startsWith('/external/agents/')) {
|
|
232
|
+
return 'agent';
|
|
233
|
+
}
|
|
234
|
+
return 'none';
|
|
235
|
+
}
|
|
236
|
+
/**
|
|
237
|
+
* True only when the refresh endpoint itself rejected the request (4xx),
|
|
238
|
+
* meaning the refresh token is invalid/expired. NetworkError (no statusCode)
|
|
239
|
+
* and 5xx responses are transient and must not end the session.
|
|
240
|
+
*/
|
|
241
|
+
isRefreshRejectedByServer(error) {
|
|
242
|
+
if (error instanceof NetworkError) {
|
|
243
|
+
return false;
|
|
244
|
+
}
|
|
245
|
+
if (error instanceof AuthenticationError) {
|
|
246
|
+
return true;
|
|
247
|
+
}
|
|
248
|
+
return (error instanceof AgentSDKError &&
|
|
249
|
+
typeof error.statusCode === 'number' &&
|
|
250
|
+
error.statusCode >= 400 &&
|
|
251
|
+
error.statusCode < 500);
|
|
252
|
+
}
|
|
253
|
+
async retryOriginalRequest(requestContext) {
|
|
254
|
+
if (requestContext.isFormData) {
|
|
255
|
+
return this.postFormData(requestContext.path, requestContext.body, requestContext.options, true);
|
|
256
|
+
}
|
|
257
|
+
return this.request(requestContext.method, requestContext.path, requestContext.body, requestContext.options, true);
|
|
258
|
+
}
|
|
259
|
+
}
|
|
260
|
+
//# sourceMappingURL=http-client.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"http-client.js","sourceRoot":"","sources":["../../src/http-client.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
export { AgentSDK } from './agent-sdk.js';
|
|
2
|
+
export type { AgentDeviceAttestationMode, AgentDeviceAttestationPayload, AgentDeviceAttestationPlatform, AgentDeviceAttestationProvider, AgentFlowConfig, AgentFlowStepDefinition, AgentLoginChallenge, AgentLoginChallengeRequest, AgentPromotionConfig, AgentPromotionCtaConfig, AgentPromotionPlacement, AgentPromotionSmsConfig, AgentScreenType, AgentWorkflowLaunchFlowConfig, AgentSDKConfig, AgentStats, AgentProfile, AgentWorkflowDefinitionSummary, ChangePasswordParams, ClientTimingPayload, CreateWorkflowParams, CreateWorkflowResult, CustomerInfo, DocumentMetadata, FlowContext, GeoLocation, ListWorkflowsParams, LoginChallengeParams, LoginChallengeResult, LoginAgentSummary, LoginParams, LoginProjectSelectionResult, LoginRequestOptions, LoginResult, LoginTenantConfig, LoginWithProjectResolutionResult, LogoutParams, PreSubmissionCheckOutcome, PreSubmissionCheckOptions, PushTokenRegistration, PreSubmissionCheckIssue, PreSubmissionCheckResult, RegisterPushTokenParams, ReissueWorkflowTokenResult, RefreshResult, ReactNativeUploadFile, RequestTimeoutOptions, SubmitFlowOptions, UploadDocumentOptions, UploadResult, UploadProgress, UploadDocumentInput, UnregisterPushTokenParams, UnregisterPushTokenResult, WorkflowDetail, WorkflowStatus, WorkflowSummaryPage, WorkflowSummary, } from './types.js';
|
|
3
|
+
export { normalizeInternationalPhoneNumber } from './utils/phone.js';
|
|
4
|
+
export type { AgentCameraFacing, AgentCaptureReasonOption, AgentCaptureReasonStepConfig, AgentCustomerField, AgentCustomerFieldDefinition, AgentCustomerFieldInputType, AgentWorkflowDetail, AgentDocumentCaptureStepConfig, AgentDocumentSelectStepConfig, AgentDocumentTypeOption, AgentWorkflowDefinitionManifest, AgentWorkflowHistoryItem, AgentWorkflowHistoryPage, AgentWorkflowLaunchResult, AgentReviewStepConfig, AgentSelfieCaptureStepConfig, AgentSubmittingStepConfig, AgentCustomerInfoStepConfig, } from '@mikashboks/agent-flow-contract';
|
|
5
|
+
export { AGENT_DEVICE_ATTESTATION_MODES, AGENT_DEVICE_ATTESTATION_PLATFORMS, AGENT_DEVICE_ATTESTATION_PROVIDERS, AGENT_SCREEN_TYPES, DEFAULT_AGENT_WORKFLOW_DEFINITION_ID, SIERRA_LEONE_AGENT_WORKFLOW_DEFINITION_ID, SIERRA_LEONE_AGENT_FLOW_CONFIG, SUPPORTED_AGENT_FLOW_CONFIG_VERSION, normalizeAgentFlowConfig, } from '@mikashboks/agent-flow-contract';
|
|
6
|
+
export { AgentSDKError, AuthenticationError, ConflictError, ForbiddenError, NetworkError, NotFoundError, } from './errors.js';
|
|
7
|
+
//# sourceMappingURL=index.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,MAAM,gBAAgB,CAAC;AAC1C,YAAY,EACV,0BAA0B,EAC1B,6BAA6B,EAC7B,8BAA8B,EAC9B,8BAA8B,EAC9B,eAAe,EACf,uBAAuB,EACvB,mBAAmB,EACnB,0BAA0B,EAC1B,oBAAoB,EACpB,uBAAuB,EACvB,uBAAuB,EACvB,uBAAuB,EACvB,eAAe,EACf,6BAA6B,EAC7B,cAAc,EACd,UAAU,EACV,YAAY,EACZ,8BAA8B,EAC9B,oBAAoB,EACpB,mBAAmB,EACnB,oBAAoB,EACpB,oBAAoB,EACpB,YAAY,EACZ,gBAAgB,EAChB,WAAW,EACX,WAAW,EACX,mBAAmB,EACnB,oBAAoB,EACpB,oBAAoB,EACpB,iBAAiB,EACjB,WAAW,EACX,2BAA2B,EAC3B,mBAAmB,EACnB,WAAW,EACX,iBAAiB,EACjB,gCAAgC,EAChC,YAAY,EACZ,yBAAyB,EACzB,yBAAyB,EACzB,qBAAqB,EACrB,uBAAuB,EACvB,wBAAwB,EACxB,uBAAuB,EACvB,0BAA0B,EAC1B,aAAa,EACb,qBAAqB,EACrB,qBAAqB,EACrB,iBAAiB,EACjB,qBAAqB,EACrB,YAAY,EACZ,cAAc,EACd,mBAAmB,EACnB,yBAAyB,EACzB,yBAAyB,EACzB,cAAc,EACd,cAAc,EACd,mBAAmB,EACnB,eAAe,GAChB,MAAM,YAAY,CAAC;AACpB,OAAO,EAAE,iCAAiC,EAAE,MAAM,kBAAkB,CAAC;AACrE,YAAY,EACV,iBAAiB,EACjB,wBAAwB,EACxB,4BAA4B,EAC5B,kBAAkB,EAClB,4BAA4B,EAC5B,2BAA2B,EAC3B,mBAAmB,EACnB,8BAA8B,EAC9B,6BAA6B,EAC7B,uBAAuB,EACvB,+BAA+B,EAC/B,wBAAwB,EACxB,wBAAwB,EACxB,yBAAyB,EACzB,qBAAqB,EACrB,4BAA4B,EAC5B,yBAAyB,EACzB,2BAA2B,GAC5B,MAAM,iCAAiC,CAAC;AACzC,OAAO,EACL,8BAA8B,EAC9B,kCAAkC,EAClC,kCAAkC,EAClC,kBAAkB,EAClB,oCAAoC,EACpC,yCAAyC,EACzC,8BAA8B,EAC9B,mCAAmC,EACnC,wBAAwB,GACzB,MAAM,iCAAiC,CAAC;AACzC,OAAO,EACL,aAAa,EACb,mBAAmB,EACnB,aAAa,EACb,cAAc,EACd,YAAY,EACZ,aAAa,GACd,MAAM,aAAa,CAAC"}
|
|
@@ -0,0 +1,5 @@
|
|
|
1
|
+
export { AgentSDK } from './agent-sdk.js';
|
|
2
|
+
export { normalizeInternationalPhoneNumber } from './utils/phone.js';
|
|
3
|
+
export { AGENT_DEVICE_ATTESTATION_MODES, AGENT_DEVICE_ATTESTATION_PLATFORMS, AGENT_DEVICE_ATTESTATION_PROVIDERS, AGENT_SCREEN_TYPES, DEFAULT_AGENT_WORKFLOW_DEFINITION_ID, SIERRA_LEONE_AGENT_WORKFLOW_DEFINITION_ID, SIERRA_LEONE_AGENT_FLOW_CONFIG, SUPPORTED_AGENT_FLOW_CONFIG_VERSION, normalizeAgentFlowConfig, } from '@mikashboks/agent-flow-contract';
|
|
4
|
+
export { AgentSDKError, AuthenticationError, ConflictError, ForbiddenError, NetworkError, NotFoundError, } from './errors.js';
|
|
5
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,MAAM,gBAAgB,CAAC;AA6D1C,OAAO,EAAE,iCAAiC,EAAE,MAAM,kBAAkB,CAAC;AAqBrE,OAAO,EACL,8BAA8B,EAC9B,kCAAkC,EAClC,kCAAkC,EAClC,kBAAkB,EAClB,oCAAoC,EACpC,yCAAyC,EACzC,8BAA8B,EAC9B,mCAAmC,EACnC,wBAAwB,GACzB,MAAM,iCAAiC,CAAC;AACzC,OAAO,EACL,aAAa,EACb,mBAAmB,EACnB,aAAa,EACb,cAAc,EACd,YAAY,EACZ,aAAa,GACd,MAAM,aAAa,CAAC"}
|
|
@@ -0,0 +1,256 @@
|
|
|
1
|
+
import type { AgentDeviceAttestationMode, AgentDeviceAttestationPayload, AgentDeviceAttestationPlatform, AgentDeviceAttestationProvider, AgentFlowConfig, AgentFlowStepDefinition, AgentLoginChallenge, AgentLoginChallengeRequest, AgentScreenType, AgentWorkflowDetail, AgentWorkflowDefinitionSummary, AgentWorkflowHistoryItem, AgentWorkflowHistoryPage, AgentWorkflowLaunchFlowConfig, AgentWorkflowLaunchResult } from '@mikashboks/agent-flow-contract';
|
|
2
|
+
export interface AgentSDKConfig {
|
|
3
|
+
/** Base URL of the Ballerine API (e.g., "https://api.verify.example.com/api/v1") */
|
|
4
|
+
baseUrl: string;
|
|
5
|
+
/** Project ID sent as x-project-id header */
|
|
6
|
+
projectId: string;
|
|
7
|
+
/** Custom fetch implementation (defaults to globalThis.fetch) */
|
|
8
|
+
fetch?: typeof globalThis.fetch;
|
|
9
|
+
/** Timeout in milliseconds (default: 30000) */
|
|
10
|
+
timeoutMs?: number;
|
|
11
|
+
/** Called when access token is refreshed (persist new tokens) */
|
|
12
|
+
onTokenRefresh?: (tokens: {
|
|
13
|
+
accessToken: string;
|
|
14
|
+
refreshToken: string;
|
|
15
|
+
}) => void;
|
|
16
|
+
/** Called when auth fails irrecoverably (e.g., refresh token expired) */
|
|
17
|
+
onAuthFailure?: () => void;
|
|
18
|
+
}
|
|
19
|
+
export interface LoginParams {
|
|
20
|
+
phone: string;
|
|
21
|
+
password: string;
|
|
22
|
+
deviceId?: string;
|
|
23
|
+
attestation?: AgentDeviceAttestationPayload;
|
|
24
|
+
}
|
|
25
|
+
export interface LoginRequestOptions {
|
|
26
|
+
projectId?: string | null;
|
|
27
|
+
}
|
|
28
|
+
export type LoginChallengeParams = AgentLoginChallengeRequest;
|
|
29
|
+
export type LoginChallengeResult = AgentLoginChallenge;
|
|
30
|
+
/** Slim agent summary returned from login (not the full profile). */
|
|
31
|
+
export interface LoginAgentSummary {
|
|
32
|
+
id: string;
|
|
33
|
+
externalId: string;
|
|
34
|
+
firstName: string;
|
|
35
|
+
lastName: string;
|
|
36
|
+
employerName: string;
|
|
37
|
+
status: 'Active' | 'Suspended' | 'Revoked';
|
|
38
|
+
}
|
|
39
|
+
export interface LoginResult {
|
|
40
|
+
accessToken: string;
|
|
41
|
+
refreshToken: string;
|
|
42
|
+
mustChangePassword: boolean;
|
|
43
|
+
agent: LoginAgentSummary;
|
|
44
|
+
tenantConfig?: LoginTenantConfig;
|
|
45
|
+
}
|
|
46
|
+
export interface LoginTenantConfig {
|
|
47
|
+
tenantAlias: string;
|
|
48
|
+
tenantLabel: string;
|
|
49
|
+
projectId: string;
|
|
50
|
+
projectName?: string;
|
|
51
|
+
workflowDefinitionId: string;
|
|
52
|
+
apiBaseUrl?: string;
|
|
53
|
+
}
|
|
54
|
+
export interface LoginProjectSelectionResult {
|
|
55
|
+
requiresProjectSelection: true;
|
|
56
|
+
projects: LoginTenantConfig[];
|
|
57
|
+
}
|
|
58
|
+
export type LoginWithProjectResolutionResult = LoginResult | LoginProjectSelectionResult;
|
|
59
|
+
export interface RefreshResult {
|
|
60
|
+
accessToken: string;
|
|
61
|
+
refreshToken: string;
|
|
62
|
+
}
|
|
63
|
+
export interface ChangePasswordParams {
|
|
64
|
+
currentPassword: string;
|
|
65
|
+
newPassword: string;
|
|
66
|
+
}
|
|
67
|
+
export interface LogoutParams {
|
|
68
|
+
refreshToken?: string;
|
|
69
|
+
allSessions?: boolean;
|
|
70
|
+
}
|
|
71
|
+
export interface RegisterPushTokenParams {
|
|
72
|
+
expoPushToken: string;
|
|
73
|
+
nativePushToken?: string;
|
|
74
|
+
deviceId?: string;
|
|
75
|
+
platform?: AgentDeviceAttestationPlatform;
|
|
76
|
+
}
|
|
77
|
+
export interface PushTokenRegistration {
|
|
78
|
+
id: string;
|
|
79
|
+
expoPushToken: string;
|
|
80
|
+
nativePushToken?: string;
|
|
81
|
+
deviceId?: string;
|
|
82
|
+
platform?: string;
|
|
83
|
+
enabled: boolean;
|
|
84
|
+
lastRegisteredAt: string;
|
|
85
|
+
}
|
|
86
|
+
export interface UnregisterPushTokenParams {
|
|
87
|
+
expoPushToken?: string;
|
|
88
|
+
deviceId?: string;
|
|
89
|
+
}
|
|
90
|
+
export interface UnregisterPushTokenResult {
|
|
91
|
+
success: boolean;
|
|
92
|
+
}
|
|
93
|
+
export interface AgentProfile {
|
|
94
|
+
id: string;
|
|
95
|
+
externalId: string;
|
|
96
|
+
firstName: string;
|
|
97
|
+
lastName: string;
|
|
98
|
+
phone: string;
|
|
99
|
+
email?: string;
|
|
100
|
+
employerName: string;
|
|
101
|
+
employerCode?: string;
|
|
102
|
+
status: 'Active' | 'Suspended' | 'Revoked';
|
|
103
|
+
location?: string;
|
|
104
|
+
mustChangePassword: boolean;
|
|
105
|
+
availableWorkflows?: AgentWorkflowDefinitionSummary[];
|
|
106
|
+
defaultWorkflowDefinitionId?: string | null;
|
|
107
|
+
dailyCaptureLimit?: number | null;
|
|
108
|
+
agentFlowConfig?: AgentFlowConfig | null;
|
|
109
|
+
promotionConfig?: AgentPromotionConfig | null;
|
|
110
|
+
}
|
|
111
|
+
export type AgentPromotionPlacement = 'kyc_final' | 'kyc_status_card' | 'agent_dashboard' | 'agent_settings';
|
|
112
|
+
export interface AgentPromotionCtaConfig {
|
|
113
|
+
enabled: boolean;
|
|
114
|
+
title: string;
|
|
115
|
+
body: string;
|
|
116
|
+
label: string;
|
|
117
|
+
url: string;
|
|
118
|
+
placements: AgentPromotionPlacement[];
|
|
119
|
+
}
|
|
120
|
+
export interface AgentPromotionSmsConfig {
|
|
121
|
+
poweredByFooterEnabled?: boolean;
|
|
122
|
+
marketingCtaEnabled: false;
|
|
123
|
+
}
|
|
124
|
+
export interface AgentPromotionConfig {
|
|
125
|
+
enabled: boolean;
|
|
126
|
+
poweredByLabel?: string;
|
|
127
|
+
cta?: AgentPromotionCtaConfig;
|
|
128
|
+
sms?: AgentPromotionSmsConfig;
|
|
129
|
+
}
|
|
130
|
+
export interface CustomerInfo {
|
|
131
|
+
firstName?: string;
|
|
132
|
+
lastName?: string;
|
|
133
|
+
phone?: string;
|
|
134
|
+
nationalId?: string;
|
|
135
|
+
email?: string;
|
|
136
|
+
dateOfBirth?: string;
|
|
137
|
+
}
|
|
138
|
+
export interface GeoLocation {
|
|
139
|
+
lat: number;
|
|
140
|
+
lng: number;
|
|
141
|
+
accuracy?: number;
|
|
142
|
+
}
|
|
143
|
+
export interface CreateWorkflowParams {
|
|
144
|
+
customerInfo?: CustomerInfo | null;
|
|
145
|
+
subjectType?: 'individual' | 'business';
|
|
146
|
+
subjectData?: Record<string, unknown> | null;
|
|
147
|
+
externalEntityId?: string;
|
|
148
|
+
workflowDefinitionId: string;
|
|
149
|
+
workflowDefinitionVersion?: number;
|
|
150
|
+
idempotencyKey?: string;
|
|
151
|
+
geoLocation?: GeoLocation;
|
|
152
|
+
captureReason?: string;
|
|
153
|
+
}
|
|
154
|
+
export type CreateWorkflowResult = AgentWorkflowLaunchResult;
|
|
155
|
+
export interface ReissueWorkflowTokenResult {
|
|
156
|
+
workflowId: string;
|
|
157
|
+
workflowToken: string;
|
|
158
|
+
expiresAt: string;
|
|
159
|
+
}
|
|
160
|
+
export type WorkflowSummary = AgentWorkflowHistoryItem;
|
|
161
|
+
export interface ListWorkflowsParams {
|
|
162
|
+
limit?: number;
|
|
163
|
+
cursor?: string | null;
|
|
164
|
+
}
|
|
165
|
+
export type WorkflowSummaryPage = AgentWorkflowHistoryPage;
|
|
166
|
+
export type WorkflowDetail = AgentWorkflowDetail;
|
|
167
|
+
export interface AgentStats {
|
|
168
|
+
todayCount: number;
|
|
169
|
+
last24HoursCount?: number;
|
|
170
|
+
totalCount: number;
|
|
171
|
+
activeCount: number;
|
|
172
|
+
completedCount: number;
|
|
173
|
+
failedCount: number;
|
|
174
|
+
}
|
|
175
|
+
export interface WorkflowStatus {
|
|
176
|
+
id: string;
|
|
177
|
+
status: string;
|
|
178
|
+
state?: string;
|
|
179
|
+
createdAt: string;
|
|
180
|
+
resolvedAt?: string;
|
|
181
|
+
}
|
|
182
|
+
export interface DocumentMetadata {
|
|
183
|
+
type: string;
|
|
184
|
+
side?: 'front' | 'back';
|
|
185
|
+
category?: string;
|
|
186
|
+
issuingCountry?: string;
|
|
187
|
+
issuingVersion?: string | number;
|
|
188
|
+
pageNumber?: number;
|
|
189
|
+
endUserId?: string;
|
|
190
|
+
businessId?: string;
|
|
191
|
+
documentType?: string;
|
|
192
|
+
documentVariant?: 'front' | 'back' | 'other';
|
|
193
|
+
geoLocation?: GeoLocation;
|
|
194
|
+
[key: string]: unknown;
|
|
195
|
+
}
|
|
196
|
+
export interface UploadResult {
|
|
197
|
+
id: string;
|
|
198
|
+
[key: string]: unknown;
|
|
199
|
+
}
|
|
200
|
+
export interface UploadProgress {
|
|
201
|
+
loaded: number;
|
|
202
|
+
total: number | null;
|
|
203
|
+
}
|
|
204
|
+
export interface RequestTimeoutOptions {
|
|
205
|
+
timeoutMs?: number;
|
|
206
|
+
}
|
|
207
|
+
export interface UploadDocumentOptions extends RequestTimeoutOptions {
|
|
208
|
+
onUploadProgress?: (progress: UploadProgress) => void;
|
|
209
|
+
}
|
|
210
|
+
export interface ReactNativeUploadFile {
|
|
211
|
+
uri: string;
|
|
212
|
+
name?: string;
|
|
213
|
+
type?: string;
|
|
214
|
+
}
|
|
215
|
+
export type UploadDocumentInput = Blob | ReactNativeUploadFile;
|
|
216
|
+
export interface FlowContext {
|
|
217
|
+
entity?: Record<string, unknown>;
|
|
218
|
+
documents?: Array<Record<string, unknown>>;
|
|
219
|
+
metadata?: Record<string, unknown>;
|
|
220
|
+
[key: string]: unknown;
|
|
221
|
+
}
|
|
222
|
+
export interface PreSubmissionCheckIssue {
|
|
223
|
+
code: string;
|
|
224
|
+
target: string;
|
|
225
|
+
severity: 'retake' | 'warning';
|
|
226
|
+
message: string;
|
|
227
|
+
[key: string]: unknown;
|
|
228
|
+
}
|
|
229
|
+
export type PreSubmissionCheckOutcome = 'BLOCK_RETAKE' | 'WARN_ALLOW_SUBMIT' | 'UNAVAILABLE_ALLOW_SUBMIT';
|
|
230
|
+
export interface PreSubmissionCheckResult {
|
|
231
|
+
status: 'READY' | 'RETAKE_REQUIRED' | 'CHECK_UNAVAILABLE';
|
|
232
|
+
canSubmit: boolean;
|
|
233
|
+
issues: PreSubmissionCheckIssue[];
|
|
234
|
+
outcome?: PreSubmissionCheckOutcome;
|
|
235
|
+
normalized?: {
|
|
236
|
+
identityDocumentType?: string;
|
|
237
|
+
country?: string;
|
|
238
|
+
[key: string]: unknown;
|
|
239
|
+
};
|
|
240
|
+
preSubmissionCheckId?: string;
|
|
241
|
+
[key: string]: unknown;
|
|
242
|
+
}
|
|
243
|
+
export interface PreSubmissionCheckOptions extends RequestTimeoutOptions {
|
|
244
|
+
}
|
|
245
|
+
export interface SubmitFlowOptions extends RequestTimeoutOptions {
|
|
246
|
+
preSubmissionCheckId?: string;
|
|
247
|
+
}
|
|
248
|
+
export interface ClientTimingPayload {
|
|
249
|
+
eventName: string;
|
|
250
|
+
workflowId?: string | null;
|
|
251
|
+
mode?: string;
|
|
252
|
+
timings?: Record<string, number>;
|
|
253
|
+
[key: string]: unknown;
|
|
254
|
+
}
|
|
255
|
+
export type { AgentDeviceAttestationMode, AgentDeviceAttestationPayload, AgentDeviceAttestationPlatform, AgentDeviceAttestationProvider, AgentFlowConfig, AgentFlowStepDefinition, AgentLoginChallenge, AgentLoginChallengeRequest, AgentScreenType, AgentWorkflowDetail, AgentWorkflowDefinitionSummary, AgentWorkflowLaunchFlowConfig, AgentWorkflowLaunchResult, };
|
|
256
|
+
//# sourceMappingURL=types.d.ts.map
|