@seaverse/conversation-sdk 0.2.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 +284 -0
- package/dist/aggregated/apps-with-conversations.d.ts +47 -0
- package/dist/aggregated/apps-with-conversations.d.ts.map +1 -0
- package/dist/aggregated/apps-with-conversations.js +90 -0
- package/dist/aggregated/apps-with-conversations.js.map +1 -0
- package/dist/aggregated/index.d.ts +3 -0
- package/dist/aggregated/index.d.ts.map +1 -0
- package/dist/aggregated/index.js +2 -0
- package/dist/aggregated/index.js.map +1 -0
- package/dist/client/ConversationClient.d.ts +24 -0
- package/dist/client/ConversationClient.d.ts.map +1 -0
- package/dist/client/ConversationClient.js +56 -0
- package/dist/client/ConversationClient.js.map +1 -0
- package/dist/client/ConversationsClient.d.ts +31 -0
- package/dist/client/ConversationsClient.d.ts.map +1 -0
- package/dist/client/ConversationsClient.js +50 -0
- package/dist/client/ConversationsClient.js.map +1 -0
- package/dist/client/EnvironmentConfig.d.ts +12 -0
- package/dist/client/EnvironmentConfig.d.ts.map +1 -0
- package/dist/client/EnvironmentConfig.js +21 -0
- package/dist/client/EnvironmentConfig.js.map +1 -0
- package/dist/client/MessagesClient.d.ts +31 -0
- package/dist/client/MessagesClient.d.ts.map +1 -0
- package/dist/client/MessagesClient.js +57 -0
- package/dist/client/MessagesClient.js.map +1 -0
- package/dist/client/index.d.ts +3 -0
- package/dist/client/index.d.ts.map +1 -0
- package/dist/client/index.js +3 -0
- package/dist/client/index.js.map +1 -0
- package/dist/data/DbClient.d.ts +76 -0
- package/dist/data/DbClient.d.ts.map +1 -0
- package/dist/data/DbClient.js +107 -0
- package/dist/data/DbClient.js.map +1 -0
- package/dist/data/index.d.ts +2 -0
- package/dist/data/index.d.ts.map +1 -0
- package/dist/data/index.js +2 -0
- package/dist/data/index.js.map +1 -0
- package/dist/data/postgrest-headers.d.ts +10 -0
- package/dist/data/postgrest-headers.d.ts.map +1 -0
- package/dist/data/postgrest-headers.js +58 -0
- package/dist/data/postgrest-headers.js.map +1 -0
- package/dist/data/query.types.d.ts +62 -0
- package/dist/data/query.types.d.ts.map +1 -0
- package/dist/data/query.types.js +2 -0
- package/dist/data/query.types.js.map +1 -0
- package/dist/errors/AuthError.d.ts +8 -0
- package/dist/errors/AuthError.d.ts.map +1 -0
- package/dist/errors/AuthError.js +10 -0
- package/dist/errors/AuthError.js.map +1 -0
- package/dist/errors/BaseError.d.ts +17 -0
- package/dist/errors/BaseError.d.ts.map +1 -0
- package/dist/errors/BaseError.js +26 -0
- package/dist/errors/BaseError.js.map +1 -0
- package/dist/errors/NetworkError.d.ts +8 -0
- package/dist/errors/NetworkError.d.ts.map +1 -0
- package/dist/errors/NetworkError.js +10 -0
- package/dist/errors/NetworkError.js.map +1 -0
- package/dist/errors/ProtocolError.d.ts +8 -0
- package/dist/errors/ProtocolError.d.ts.map +1 -0
- package/dist/errors/ProtocolError.js +10 -0
- package/dist/errors/ProtocolError.js.map +1 -0
- package/dist/errors/TimeoutError.d.ts +8 -0
- package/dist/errors/TimeoutError.d.ts.map +1 -0
- package/dist/errors/TimeoutError.js +10 -0
- package/dist/errors/TimeoutError.js.map +1 -0
- package/dist/errors/index.d.ts +6 -0
- package/dist/errors/index.d.ts.map +1 -0
- package/dist/errors/index.js +6 -0
- package/dist/errors/index.js.map +1 -0
- package/dist/functional-api.d.ts +24 -0
- package/dist/functional-api.d.ts.map +1 -0
- package/dist/functional-api.js +59 -0
- package/dist/functional-api.js.map +1 -0
- package/dist/index.d.ts +5 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +9 -0
- package/dist/index.js.map +1 -0
- package/dist/resources/AppsResource.d.ts +37 -0
- package/dist/resources/AppsResource.d.ts.map +1 -0
- package/dist/resources/AppsResource.js +51 -0
- package/dist/resources/AppsResource.js.map +1 -0
- package/dist/resources/ConversationsResource.d.ts +81 -0
- package/dist/resources/ConversationsResource.d.ts.map +1 -0
- package/dist/resources/ConversationsResource.js +103 -0
- package/dist/resources/ConversationsResource.js.map +1 -0
- package/dist/resources/MessagesResource.d.ts +56 -0
- package/dist/resources/MessagesResource.d.ts.map +1 -0
- package/dist/resources/MessagesResource.js +115 -0
- package/dist/resources/MessagesResource.js.map +1 -0
- package/dist/session/session-token.d.ts +38 -0
- package/dist/session/session-token.d.ts.map +1 -0
- package/dist/session/session-token.js +74 -0
- package/dist/session/session-token.js.map +1 -0
- package/dist/transforms/app.transform.d.ts +6 -0
- package/dist/transforms/app.transform.d.ts.map +1 -0
- package/dist/transforms/app.transform.js +39 -0
- package/dist/transforms/app.transform.js.map +1 -0
- package/dist/transforms/conversation.transform.d.ts +10 -0
- package/dist/transforms/conversation.transform.d.ts.map +1 -0
- package/dist/transforms/conversation.transform.js +45 -0
- package/dist/transforms/conversation.transform.js.map +1 -0
- package/dist/transforms/message.transform.d.ts +12 -0
- package/dist/transforms/message.transform.d.ts.map +1 -0
- package/dist/transforms/message.transform.js +119 -0
- package/dist/transforms/message.transform.js.map +1 -0
- package/dist/transport/HttpClient.d.ts +34 -0
- package/dist/transport/HttpClient.d.ts.map +1 -0
- package/dist/transport/HttpClient.js +158 -0
- package/dist/transport/HttpClient.js.map +1 -0
- package/dist/transport/config.types.d.ts +40 -0
- package/dist/transport/config.types.d.ts.map +1 -0
- package/dist/transport/config.types.js +2 -0
- package/dist/transport/config.types.js.map +1 -0
- package/dist/transport/index.d.ts +10 -0
- package/dist/transport/index.d.ts.map +1 -0
- package/dist/transport/index.js +11 -0
- package/dist/transport/index.js.map +1 -0
- package/dist/transport/timeout.d.ts +12 -0
- package/dist/transport/timeout.d.ts.map +1 -0
- package/dist/transport/timeout.js +29 -0
- package/dist/transport/timeout.js.map +1 -0
- package/dist/types/common.types.d.ts +24 -0
- package/dist/types/common.types.d.ts.map +1 -0
- package/dist/types/common.types.js +5 -0
- package/dist/types/common.types.js.map +1 -0
- package/dist/types/config.types.d.ts +28 -0
- package/dist/types/config.types.d.ts.map +1 -0
- package/dist/types/config.types.js +2 -0
- package/dist/types/config.types.js.map +1 -0
- package/dist/types/http.types.d.ts +47 -0
- package/dist/types/http.types.d.ts.map +1 -0
- package/dist/types/http.types.js +2 -0
- package/dist/types/http.types.js.map +1 -0
- package/dist/types/index.d.ts +7 -0
- package/dist/types/index.d.ts.map +1 -0
- package/dist/types/index.js +2 -0
- package/dist/types/index.js.map +1 -0
- package/dist/types/models.types.d.ts +118 -0
- package/dist/types/models.types.d.ts.map +1 -0
- package/dist/types/models.types.js +5 -0
- package/dist/types/models.types.js.map +1 -0
- package/dist/types/pagination.types.d.ts +69 -0
- package/dist/types/pagination.types.d.ts.map +1 -0
- package/dist/types/pagination.types.js +24 -0
- package/dist/types/pagination.types.js.map +1 -0
- package/dist/types/token.types.d.ts +6 -0
- package/dist/types/token.types.d.ts.map +1 -0
- package/dist/types/token.types.js +2 -0
- package/dist/types/token.types.js.map +1 -0
- package/package.json +38 -0
|
@@ -0,0 +1,38 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Configuration for URL session token generation
|
|
3
|
+
*/
|
|
4
|
+
export interface UrlSessionTokenConfig {
|
|
5
|
+
/**
|
|
6
|
+
* Auth service base URL
|
|
7
|
+
* @default "https://auth.sg.seaverse.dev"
|
|
8
|
+
*/
|
|
9
|
+
authBaseUrl?: string;
|
|
10
|
+
/**
|
|
11
|
+
* Access token for authentication
|
|
12
|
+
*/
|
|
13
|
+
accessToken: string;
|
|
14
|
+
/**
|
|
15
|
+
* Custom fetch implementation (defaults to global fetch)
|
|
16
|
+
*/
|
|
17
|
+
fetch?: typeof fetch;
|
|
18
|
+
/**
|
|
19
|
+
* Request timeout in milliseconds
|
|
20
|
+
* @default 10000
|
|
21
|
+
*/
|
|
22
|
+
timeoutMs?: number;
|
|
23
|
+
}
|
|
24
|
+
/**
|
|
25
|
+
* Get URL session token from auth service
|
|
26
|
+
* Browser-compatible version (no process.env)
|
|
27
|
+
*
|
|
28
|
+
* @param config - Configuration object
|
|
29
|
+
* @returns URL session token or null if failed
|
|
30
|
+
*
|
|
31
|
+
* @example
|
|
32
|
+
* const token = await getUrlSessionToken({
|
|
33
|
+
* accessToken: 'user-access-token',
|
|
34
|
+
* authBaseUrl: 'https://auth.sg.seaverse.dev'
|
|
35
|
+
* });
|
|
36
|
+
*/
|
|
37
|
+
export declare function getUrlSessionToken(config: UrlSessionTokenConfig): Promise<string | null>;
|
|
38
|
+
//# sourceMappingURL=session-token.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"session-token.d.ts","sourceRoot":"","sources":["../../src/session/session-token.ts"],"names":[],"mappings":"AAEA;;GAEG;AACH,MAAM,WAAW,qBAAqB;IACpC;;;OAGG;IACH,WAAW,CAAC,EAAE,MAAM,CAAC;IAErB;;OAEG;IACH,WAAW,EAAE,MAAM,CAAC;IAEpB;;OAEG;IACH,KAAK,CAAC,EAAE,OAAO,KAAK,CAAC;IAErB;;;OAGG;IACH,SAAS,CAAC,EAAE,MAAM,CAAC;CACpB;AAaD;;;;;;;;;;;;GAYG;AACH,wBAAsB,kBAAkB,CACtC,MAAM,EAAE,qBAAqB,GAC5B,OAAO,CAAC,MAAM,GAAG,IAAI,CAAC,CAoFxB"}
|
|
@@ -0,0 +1,74 @@
|
|
|
1
|
+
import { AuthError } from '../errors/AuthError.js';
|
|
2
|
+
/**
|
|
3
|
+
* Get URL session token from auth service
|
|
4
|
+
* Browser-compatible version (no process.env)
|
|
5
|
+
*
|
|
6
|
+
* @param config - Configuration object
|
|
7
|
+
* @returns URL session token or null if failed
|
|
8
|
+
*
|
|
9
|
+
* @example
|
|
10
|
+
* const token = await getUrlSessionToken({
|
|
11
|
+
* accessToken: 'user-access-token',
|
|
12
|
+
* authBaseUrl: 'https://auth.sg.seaverse.dev'
|
|
13
|
+
* });
|
|
14
|
+
*/
|
|
15
|
+
export async function getUrlSessionToken(config) {
|
|
16
|
+
const { authBaseUrl = 'https://auth.sg.seaverse.dev', accessToken, fetch: customFetch = globalThis.fetch, timeoutMs = 10000, } = config;
|
|
17
|
+
const startTime = Date.now();
|
|
18
|
+
try {
|
|
19
|
+
if (!accessToken) {
|
|
20
|
+
console.warn('[getUrlSessionToken] No access token provided');
|
|
21
|
+
return null;
|
|
22
|
+
}
|
|
23
|
+
const endpoint = `${authBaseUrl}/api/v1/url-session/generate`;
|
|
24
|
+
// Create timeout signal
|
|
25
|
+
const controller = new AbortController();
|
|
26
|
+
const timeoutId = setTimeout(() => controller.abort(), timeoutMs);
|
|
27
|
+
try {
|
|
28
|
+
const response = await customFetch(endpoint, {
|
|
29
|
+
method: 'POST',
|
|
30
|
+
headers: {
|
|
31
|
+
'Content-Type': 'application/json',
|
|
32
|
+
'Authorization': `Bearer ${accessToken}`,
|
|
33
|
+
},
|
|
34
|
+
body: '',
|
|
35
|
+
signal: controller.signal,
|
|
36
|
+
});
|
|
37
|
+
clearTimeout(timeoutId);
|
|
38
|
+
const elapsed = Date.now() - startTime;
|
|
39
|
+
if (!response.ok) {
|
|
40
|
+
if (response.status === 401 || response.status === 403) {
|
|
41
|
+
throw new AuthError(`Auth failed: ${response.statusText}`, response.status);
|
|
42
|
+
}
|
|
43
|
+
console.error(`[getUrlSessionToken] Failed: ${response.status} ${response.statusText} (${elapsed}ms)`);
|
|
44
|
+
return null;
|
|
45
|
+
}
|
|
46
|
+
const data = await response.json();
|
|
47
|
+
const urlSessionToken = data.data?.url_session_token || null;
|
|
48
|
+
if (urlSessionToken) {
|
|
49
|
+
console.log(`[getUrlSessionToken] Success: got token (${elapsed}ms)`);
|
|
50
|
+
}
|
|
51
|
+
else {
|
|
52
|
+
console.warn(`[getUrlSessionToken] Response OK but no url_session_token in data (${elapsed}ms)`, data);
|
|
53
|
+
}
|
|
54
|
+
return urlSessionToken;
|
|
55
|
+
}
|
|
56
|
+
catch (error) {
|
|
57
|
+
clearTimeout(timeoutId);
|
|
58
|
+
if (error instanceof Error && error.name === 'AbortError') {
|
|
59
|
+
console.error(`[getUrlSessionToken] Timeout after ${timeoutMs}ms`);
|
|
60
|
+
return null;
|
|
61
|
+
}
|
|
62
|
+
throw error;
|
|
63
|
+
}
|
|
64
|
+
}
|
|
65
|
+
catch (error) {
|
|
66
|
+
const elapsed = Date.now() - startTime;
|
|
67
|
+
if (error instanceof AuthError) {
|
|
68
|
+
throw error;
|
|
69
|
+
}
|
|
70
|
+
console.error(`[getUrlSessionToken] Error (${elapsed}ms):`, error);
|
|
71
|
+
return null;
|
|
72
|
+
}
|
|
73
|
+
}
|
|
74
|
+
//# sourceMappingURL=session-token.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"session-token.js","sourceRoot":"","sources":["../../src/session/session-token.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"app.transform.d.ts","sourceRoot":"","sources":["../../src/transforms/app.transform.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,GAAG,EAAE,QAAQ,EAAE,MAAM,0BAA0B,CAAC;AAE9D;;GAEG;AACH,wBAAgB,YAAY,CAAC,KAAK,EAAE,QAAQ,CAAC,GAAG,GAAG,GAAG,CAwCrD"}
|
|
@@ -0,0 +1,39 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* 转换数据库应用对象为前端模型
|
|
3
|
+
*/
|
|
4
|
+
export function transformApp(dbApp) {
|
|
5
|
+
const metadata = (dbApp.metadata || {});
|
|
6
|
+
const coverImageUrls = Array.isArray(metadata.coverImageUrls)
|
|
7
|
+
? metadata.coverImageUrls
|
|
8
|
+
: Array.isArray(metadata.coverImageURLS)
|
|
9
|
+
? metadata.coverImageURLS
|
|
10
|
+
: [];
|
|
11
|
+
const createdAtRaw = (dbApp.created_at ?? 0);
|
|
12
|
+
const updatedAtRaw = (dbApp.updated_at ?? 0);
|
|
13
|
+
const createdAtMs = typeof createdAtRaw === 'string' ? Date.parse(createdAtRaw) :
|
|
14
|
+
typeof createdAtRaw === 'number' ? (createdAtRaw > 10000000000 ? createdAtRaw : createdAtRaw * 1000) :
|
|
15
|
+
0;
|
|
16
|
+
const updatedAtMs = typeof updatedAtRaw === 'string' ? Date.parse(updatedAtRaw) :
|
|
17
|
+
typeof updatedAtRaw === 'number' ? (updatedAtRaw > 10000000000 ? updatedAtRaw : updatedAtRaw * 1000) :
|
|
18
|
+
0;
|
|
19
|
+
const published = Boolean(metadata.published);
|
|
20
|
+
const id = dbApp.app_id || dbApp.id || '';
|
|
21
|
+
const name = dbApp.app_name || dbApp.name || '';
|
|
22
|
+
return {
|
|
23
|
+
id,
|
|
24
|
+
name,
|
|
25
|
+
displayName: dbApp.display_name || name,
|
|
26
|
+
description: dbApp.description || '',
|
|
27
|
+
thumbnailUrls: dbApp.thumbnail_urls || coverImageUrls,
|
|
28
|
+
userName: dbApp.user_id || dbApp.user_name || '',
|
|
29
|
+
version: dbApp.version || '',
|
|
30
|
+
tags: dbApp.tags ?? null,
|
|
31
|
+
status: dbApp.status || (published ? 'published' : 'draft'),
|
|
32
|
+
positiveCount: dbApp.positive_count || 0,
|
|
33
|
+
forkCount: dbApp.fork_count || 0,
|
|
34
|
+
commentCount: dbApp.comment_count || 0,
|
|
35
|
+
createdAt: Number.isFinite(createdAtMs) ? createdAtMs : 0,
|
|
36
|
+
updatedAt: Number.isFinite(updatedAtMs) ? updatedAtMs : 0,
|
|
37
|
+
};
|
|
38
|
+
}
|
|
39
|
+
//# sourceMappingURL=app.transform.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"app.transform.js","sourceRoot":"","sources":["../../src/transforms/app.transform.ts"],"names":[],"mappings":"AAEA;;GAEG;AACH,MAAM,UAAU,YAAY,CAAC,KAAmB;IAC9C,MAAM,QAAQ,GAAG,CAAC,KAAK,CAAC,QAAQ,IAAI,EAAE,CAAQ,CAAC;IAC/C,MAAM,cAAc,GAAG,KAAK,CAAC,OAAO,CAAC,QAAQ,CAAC,cAAc,CAAC;QAC3D,CAAC,CAAC,QAAQ,CAAC,cAAc;QACzB,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,QAAQ,CAAC,cAAc,CAAC;YACtC,CAAC,CAAC,QAAQ,CAAC,cAAc;YACzB,CAAC,CAAC,EAAE,CAAC;IAET,MAAM,YAAY,GAAG,CAAC,KAAK,CAAC,UAAU,IAAI,CAAC,CAAQ,CAAC;IACpD,MAAM,YAAY,GAAG,CAAC,KAAK,CAAC,UAAU,IAAI,CAAC,CAAQ,CAAC;IAEpD,MAAM,WAAW,GACf,OAAO,YAAY,KAAK,QAAQ,CAAC,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,YAAY,CAAC,CAAC,CAAC;QAC7D,OAAO,YAAY,KAAK,QAAQ,CAAC,CAAC,CAAC,CAAC,YAAY,GAAG,WAAW,CAAC,CAAC,CAAC,YAAY,CAAC,CAAC,CAAC,YAAY,GAAG,IAAI,CAAC,CAAC,CAAC;YACtG,CAAC,CAAC;IACJ,MAAM,WAAW,GACf,OAAO,YAAY,KAAK,QAAQ,CAAC,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,YAAY,CAAC,CAAC,CAAC;QAC7D,OAAO,YAAY,KAAK,QAAQ,CAAC,CAAC,CAAC,CAAC,YAAY,GAAG,WAAW,CAAC,CAAC,CAAC,YAAY,CAAC,CAAC,CAAC,YAAY,GAAG,IAAI,CAAC,CAAC,CAAC;YACtG,CAAC,CAAC;IAEJ,MAAM,SAAS,GAAG,OAAO,CAAC,QAAQ,CAAC,SAAS,CAAC,CAAC;IAC9C,MAAM,EAAE,GAAG,KAAK,CAAC,MAAM,IAAI,KAAK,CAAC,EAAE,IAAI,EAAE,CAAC;IAC1C,MAAM,IAAI,GAAG,KAAK,CAAC,QAAQ,IAAI,KAAK,CAAC,IAAI,IAAI,EAAE,CAAC;IAEhD,OAAO;QACL,EAAE;QACF,IAAI;QACJ,WAAW,EAAE,KAAK,CAAC,YAAY,IAAI,IAAI;QACvC,WAAW,EAAE,KAAK,CAAC,WAAW,IAAI,EAAE;QACpC,aAAa,EAAE,KAAK,CAAC,cAAc,IAAI,cAAc;QACrD,QAAQ,EAAE,KAAK,CAAC,OAAO,IAAI,KAAK,CAAC,SAAS,IAAI,EAAE;QAChD,OAAO,EAAE,KAAK,CAAC,OAAO,IAAI,EAAE;QAC5B,IAAI,EAAE,KAAK,CAAC,IAAI,IAAI,IAAI;QACxB,MAAM,EAAE,KAAK,CAAC,MAAM,IAAI,CAAC,SAAS,CAAC,CAAC,CAAC,WAAW,CAAC,CAAC,CAAC,OAAO,CAAC;QAC3D,aAAa,EAAE,KAAK,CAAC,cAAc,IAAI,CAAC;QACxC,SAAS,EAAE,KAAK,CAAC,UAAU,IAAI,CAAC;QAChC,YAAY,EAAE,KAAK,CAAC,aAAa,IAAI,CAAC;QACtC,SAAS,EAAE,MAAM,CAAC,QAAQ,CAAC,WAAW,CAAC,CAAC,CAAC,CAAC,WAAW,CAAC,CAAC,CAAC,CAAC;QACzD,SAAS,EAAE,MAAM,CAAC,QAAQ,CAAC,WAAW,CAAC,CAAC,CAAC,CAAC,WAAW,CAAC,CAAC,CAAC,CAAC;KAC1D,CAAC;AACJ,CAAC"}
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
import type { Conversation, DbSchema } from '../types/models.types.js';
|
|
2
|
+
/**
|
|
3
|
+
* 转换数据库会话对象为前端模型
|
|
4
|
+
*/
|
|
5
|
+
export declare function transformConversation(dbConv: DbSchema.Conversation): Conversation;
|
|
6
|
+
/**
|
|
7
|
+
* 转换前端会话对象为数据库格式(用于创建/更新)
|
|
8
|
+
*/
|
|
9
|
+
export declare function toDbConversation(conv: Partial<Conversation>): Partial<DbSchema.Conversation>;
|
|
10
|
+
//# sourceMappingURL=conversation.transform.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"conversation.transform.d.ts","sourceRoot":"","sources":["../../src/transforms/conversation.transform.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,YAAY,EAAE,QAAQ,EAAE,MAAM,0BAA0B,CAAC;AAavE;;GAEG;AACH,wBAAgB,qBAAqB,CACnC,MAAM,EAAE,QAAQ,CAAC,YAAY,GAC5B,YAAY,CAYd;AAED;;GAEG;AACH,wBAAgB,gBAAgB,CAAC,IAAI,EAAE,OAAO,CAAC,YAAY,CAAC,GAAG,OAAO,CAAC,QAAQ,CAAC,YAAY,CAAC,CAU5F"}
|
|
@@ -0,0 +1,45 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* 秒时间戳转换为毫秒时间戳
|
|
3
|
+
*/
|
|
4
|
+
function toMilliseconds(seconds) {
|
|
5
|
+
if (!seconds)
|
|
6
|
+
return 0;
|
|
7
|
+
// 如果已经是毫秒时间戳(13位),直接返回
|
|
8
|
+
if (seconds > 10000000000)
|
|
9
|
+
return seconds;
|
|
10
|
+
// 否则转换为毫秒
|
|
11
|
+
return seconds * 1000;
|
|
12
|
+
}
|
|
13
|
+
/**
|
|
14
|
+
* 转换数据库会话对象为前端模型
|
|
15
|
+
*/
|
|
16
|
+
export function transformConversation(dbConv) {
|
|
17
|
+
const id = (dbConv.conversation_id || dbConv.id || '').toString();
|
|
18
|
+
return {
|
|
19
|
+
id,
|
|
20
|
+
title: dbConv.title || 'Untitled',
|
|
21
|
+
appId: dbConv.app_id,
|
|
22
|
+
userId: dbConv.user_id,
|
|
23
|
+
createdAt: toMilliseconds(dbConv.created_at),
|
|
24
|
+
updatedAt: toMilliseconds(dbConv.updated_at),
|
|
25
|
+
lastActiveAt: toMilliseconds(dbConv.last_message_created_at || dbConv.updated_at),
|
|
26
|
+
messageCount: dbConv.message_count,
|
|
27
|
+
};
|
|
28
|
+
}
|
|
29
|
+
/**
|
|
30
|
+
* 转换前端会话对象为数据库格式(用于创建/更新)
|
|
31
|
+
*/
|
|
32
|
+
export function toDbConversation(conv) {
|
|
33
|
+
const result = {};
|
|
34
|
+
// 兼容:优先写 conversation_id
|
|
35
|
+
if (conv.id)
|
|
36
|
+
result.conversation_id = conv.id;
|
|
37
|
+
if (conv.title)
|
|
38
|
+
result.title = conv.title;
|
|
39
|
+
if (conv.appId !== undefined)
|
|
40
|
+
result.app_id = conv.appId;
|
|
41
|
+
if (conv.userId)
|
|
42
|
+
result.user_id = conv.userId;
|
|
43
|
+
return result;
|
|
44
|
+
}
|
|
45
|
+
//# sourceMappingURL=conversation.transform.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"conversation.transform.js","sourceRoot":"","sources":["../../src/transforms/conversation.transform.ts"],"names":[],"mappings":"AAEA;;GAEG;AACH,SAAS,cAAc,CAAC,OAA2B;IACjD,IAAI,CAAC,OAAO;QAAE,OAAO,CAAC,CAAC;IACvB,uBAAuB;IACvB,IAAI,OAAO,GAAG,WAAW;QAAE,OAAO,OAAO,CAAC;IAC1C,UAAU;IACV,OAAO,OAAO,GAAG,IAAI,CAAC;AACxB,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,qBAAqB,CACnC,MAA6B;IAE7B,MAAM,EAAE,GAAG,CAAC,MAAM,CAAC,eAAe,IAAI,MAAM,CAAC,EAAE,IAAI,EAAE,CAAC,CAAC,QAAQ,EAAE,CAAC;IAClE,OAAO;QACL,EAAE;QACF,KAAK,EAAE,MAAM,CAAC,KAAK,IAAI,UAAU;QACjC,KAAK,EAAE,MAAM,CAAC,MAAM;QACpB,MAAM,EAAE,MAAM,CAAC,OAAO;QACtB,SAAS,EAAE,cAAc,CAAC,MAAM,CAAC,UAAU,CAAC;QAC5C,SAAS,EAAE,cAAc,CAAC,MAAM,CAAC,UAAU,CAAC;QAC5C,YAAY,EAAE,cAAc,CAAC,MAAM,CAAC,uBAAuB,IAAI,MAAM,CAAC,UAAU,CAAC;QACjF,YAAY,EAAE,MAAM,CAAC,aAAa;KACnC,CAAC;AACJ,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,gBAAgB,CAAC,IAA2B;IAC1D,MAAM,MAAM,GAAmC,EAAE,CAAC;IAElD,yBAAyB;IACzB,IAAI,IAAI,CAAC,EAAE;QAAE,MAAM,CAAC,eAAe,GAAG,IAAI,CAAC,EAAE,CAAC;IAC9C,IAAI,IAAI,CAAC,KAAK;QAAE,MAAM,CAAC,KAAK,GAAG,IAAI,CAAC,KAAK,CAAC;IAC1C,IAAI,IAAI,CAAC,KAAK,KAAK,SAAS;QAAE,MAAM,CAAC,MAAM,GAAG,IAAI,CAAC,KAAK,CAAC;IACzD,IAAI,IAAI,CAAC,MAAM;QAAE,MAAM,CAAC,OAAO,GAAG,IAAI,CAAC,MAAM,CAAC;IAE9C,OAAO,MAAM,CAAC;AAChB,CAAC"}
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
import type { Message, DbSchema } from '../types/models.types.js';
|
|
2
|
+
/**
|
|
3
|
+
* 转换数据库消息对象为前端模型
|
|
4
|
+
*/
|
|
5
|
+
export declare function transformMessage(dbMsg: DbSchema.Message): Message;
|
|
6
|
+
/**
|
|
7
|
+
* 转换前端消息对象为数据库格式
|
|
8
|
+
*/
|
|
9
|
+
export declare function toDbMessage(msg: Partial<Message> & {
|
|
10
|
+
metadata?: Record<string, unknown>;
|
|
11
|
+
}): Partial<DbSchema.Message>;
|
|
12
|
+
//# sourceMappingURL=message.transform.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"message.transform.d.ts","sourceRoot":"","sources":["../../src/transforms/message.transform.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,OAAO,EAAE,QAAQ,EAAE,MAAM,0BAA0B,CAAC;AAYlE;;GAEG;AACH,wBAAgB,gBAAgB,CAAC,KAAK,EAAE,QAAQ,CAAC,OAAO,GAAG,OAAO,CAqGjE;AAED;;GAEG;AACH,wBAAgB,WAAW,CAAC,GAAG,EAAE,OAAO,CAAC,OAAO,CAAC,GAAG;IAAE,QAAQ,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAA;CAAE,GAAG,OAAO,CAAC,QAAQ,CAAC,OAAO,CAAC,CAUrH"}
|
|
@@ -0,0 +1,119 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* 秒时间戳保持为秒
|
|
3
|
+
* 旧 API 使用秒级时间戳,不转换为毫秒
|
|
4
|
+
*/
|
|
5
|
+
function toSeconds(seconds) {
|
|
6
|
+
// 如果是毫秒级时间戳,转换为秒
|
|
7
|
+
if (seconds > 10000000000)
|
|
8
|
+
return Math.floor(seconds / 1000);
|
|
9
|
+
return seconds;
|
|
10
|
+
}
|
|
11
|
+
/**
|
|
12
|
+
* 转换数据库消息对象为前端模型
|
|
13
|
+
*/
|
|
14
|
+
export function transformMessage(dbMsg) {
|
|
15
|
+
// 获取消息 ID(兼容 message_id 和 id 字段)
|
|
16
|
+
const dbId = dbMsg.message_id || dbMsg.id || '';
|
|
17
|
+
// 解析 content 字段(可能是 JSON 字符串)
|
|
18
|
+
let parsedContent = null;
|
|
19
|
+
let actualContent = dbMsg.content;
|
|
20
|
+
let actualRole = dbMsg.role;
|
|
21
|
+
let actualId = dbId;
|
|
22
|
+
try {
|
|
23
|
+
// 尝试解析 content 为 JSON(如果它是 JSON 字符串)
|
|
24
|
+
if (typeof dbMsg.content === 'string' && dbMsg.content.trim().startsWith('{')) {
|
|
25
|
+
parsedContent = JSON.parse(dbMsg.content);
|
|
26
|
+
// 如果解析成功,使用解析后的内容
|
|
27
|
+
if (parsedContent && typeof parsedContent === 'object') {
|
|
28
|
+
// 优先使用解析后的字段
|
|
29
|
+
if (parsedContent.content !== undefined) {
|
|
30
|
+
actualContent = parsedContent.content;
|
|
31
|
+
}
|
|
32
|
+
if (parsedContent.role !== undefined) {
|
|
33
|
+
actualRole = parsedContent.role;
|
|
34
|
+
}
|
|
35
|
+
if (parsedContent.id !== undefined) {
|
|
36
|
+
actualId = parsedContent.id;
|
|
37
|
+
}
|
|
38
|
+
}
|
|
39
|
+
}
|
|
40
|
+
}
|
|
41
|
+
catch {
|
|
42
|
+
// 解析失败,使用原始 content
|
|
43
|
+
}
|
|
44
|
+
// 基础字段 - 不包含 conversationId
|
|
45
|
+
const base = {
|
|
46
|
+
id: actualId,
|
|
47
|
+
role: actualRole,
|
|
48
|
+
content: actualContent,
|
|
49
|
+
timestamp: toSeconds(dbMsg.created_at),
|
|
50
|
+
};
|
|
51
|
+
// 解析 metadata 中的扩展字段,或从解析后的 content 中提取
|
|
52
|
+
let meta = dbMsg.metadata;
|
|
53
|
+
// 如果 content 被解析了,优先使用解析后的数据
|
|
54
|
+
if (parsedContent) {
|
|
55
|
+
// 提取 type(消息类型)
|
|
56
|
+
if (parsedContent.type) {
|
|
57
|
+
base.type = parsedContent.type;
|
|
58
|
+
// 对于 conversation_tips 类型,添加 conversation_id 字段
|
|
59
|
+
if (parsedContent.type === 'conversation_tips') {
|
|
60
|
+
base.conversation_id = dbMsg.conversation_id;
|
|
61
|
+
}
|
|
62
|
+
}
|
|
63
|
+
// 提取 tips(用于 conversation_tips 类型)
|
|
64
|
+
if (parsedContent.tips && Array.isArray(parsedContent.tips)) {
|
|
65
|
+
base.tips = parsedContent.tips;
|
|
66
|
+
// 确保 tips 消息有 conversation_id
|
|
67
|
+
base.conversation_id = dbMsg.conversation_id;
|
|
68
|
+
// tips 消息不返回 content 字段
|
|
69
|
+
delete base.content;
|
|
70
|
+
}
|
|
71
|
+
// 提取 toolCalls(工具调用信息)
|
|
72
|
+
if (parsedContent.toolCalls && Array.isArray(parsedContent.toolCalls)) {
|
|
73
|
+
base.toolCalls = parsedContent.toolCalls;
|
|
74
|
+
}
|
|
75
|
+
}
|
|
76
|
+
// 如果 metadata 存在,也尝试从中提取字段
|
|
77
|
+
if (meta) {
|
|
78
|
+
// 如果还没有设置 type,从 metadata 中提取
|
|
79
|
+
if (!base.type && meta.type) {
|
|
80
|
+
base.type = meta.type;
|
|
81
|
+
// 对于 conversation_tips 类型,添加 conversation_id 字段
|
|
82
|
+
if (meta.type === 'conversation_tips') {
|
|
83
|
+
base.conversation_id = dbMsg.conversation_id;
|
|
84
|
+
}
|
|
85
|
+
}
|
|
86
|
+
// 如果还没有设置 tips,从 metadata 中提取
|
|
87
|
+
if (!base.tips && meta.tips && Array.isArray(meta.tips)) {
|
|
88
|
+
base.tips = meta.tips;
|
|
89
|
+
// 确保 tips 消息有 conversation_id
|
|
90
|
+
base.conversation_id = dbMsg.conversation_id;
|
|
91
|
+
// tips 消息不返回 content 字段
|
|
92
|
+
delete base.content;
|
|
93
|
+
}
|
|
94
|
+
// 如果还没有设置 toolCalls,从 metadata 中提取
|
|
95
|
+
if (!base.toolCalls && meta.toolCalls && Array.isArray(meta.toolCalls)) {
|
|
96
|
+
base.toolCalls = meta.toolCalls;
|
|
97
|
+
}
|
|
98
|
+
// 不保留 metadata 字段(旧 API 格式)
|
|
99
|
+
}
|
|
100
|
+
return base;
|
|
101
|
+
}
|
|
102
|
+
/**
|
|
103
|
+
* 转换前端消息对象为数据库格式
|
|
104
|
+
*/
|
|
105
|
+
export function toDbMessage(msg) {
|
|
106
|
+
const result = {};
|
|
107
|
+
if (msg.id)
|
|
108
|
+
result.id = msg.id;
|
|
109
|
+
if (msg.conversationId)
|
|
110
|
+
result.conversation_id = msg.conversationId;
|
|
111
|
+
if (msg.role)
|
|
112
|
+
result.role = msg.role;
|
|
113
|
+
if (msg.content)
|
|
114
|
+
result.content = msg.content;
|
|
115
|
+
if (msg.metadata)
|
|
116
|
+
result.metadata = msg.metadata;
|
|
117
|
+
return result;
|
|
118
|
+
}
|
|
119
|
+
//# sourceMappingURL=message.transform.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"message.transform.js","sourceRoot":"","sources":["../../src/transforms/message.transform.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,34 @@
|
|
|
1
|
+
import type { HttpRequestConfig, HttpResponse } from '../types/http.types.js';
|
|
2
|
+
import type { HttpClientConfig } from './config.types.js';
|
|
3
|
+
/**
|
|
4
|
+
* HTTP client for making requests
|
|
5
|
+
*/
|
|
6
|
+
export declare class HttpClient {
|
|
7
|
+
private readonly config;
|
|
8
|
+
constructor(config: HttpClientConfig);
|
|
9
|
+
/**
|
|
10
|
+
* Make an HTTP request
|
|
11
|
+
*/
|
|
12
|
+
request<T = unknown>(path: string, options?: HttpRequestConfig): Promise<HttpResponse<T>>;
|
|
13
|
+
/**
|
|
14
|
+
* Handle error responses
|
|
15
|
+
*/
|
|
16
|
+
private handleErrorResponse;
|
|
17
|
+
/**
|
|
18
|
+
* GET request
|
|
19
|
+
*/
|
|
20
|
+
get<T = unknown>(path: string, options?: Omit<HttpRequestConfig, 'method' | 'body'>): Promise<HttpResponse<T>>;
|
|
21
|
+
/**
|
|
22
|
+
* POST request
|
|
23
|
+
*/
|
|
24
|
+
post<T = unknown>(path: string, body?: unknown, options?: Omit<HttpRequestConfig, 'method' | 'body'>): Promise<HttpResponse<T>>;
|
|
25
|
+
/**
|
|
26
|
+
* PATCH request
|
|
27
|
+
*/
|
|
28
|
+
patch<T = unknown>(path: string, body?: unknown, options?: Omit<HttpRequestConfig, 'method' | 'body'>): Promise<HttpResponse<T>>;
|
|
29
|
+
/**
|
|
30
|
+
* DELETE request
|
|
31
|
+
*/
|
|
32
|
+
delete<T = unknown>(path: string, options?: Omit<HttpRequestConfig, 'method' | 'body'>): Promise<HttpResponse<T>>;
|
|
33
|
+
}
|
|
34
|
+
//# sourceMappingURL=HttpClient.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"HttpClient.d.ts","sourceRoot":"","sources":["../../src/transport/HttpClient.ts"],"names":[],"mappings":"AAMA,OAAO,KAAK,EACV,iBAAiB,EACjB,YAAY,EACb,MAAM,wBAAwB,CAAC;AAChC,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,mBAAmB,CAAC;AAG1D;;GAEG;AACH,qBAAa,UAAU;IACrB,OAAO,CAAC,QAAQ,CAAC,MAAM,CAA6B;gBAExC,MAAM,EAAE,gBAAgB;IAkBpC;;OAEG;IACG,OAAO,CAAC,CAAC,GAAG,OAAO,EACvB,IAAI,EAAE,MAAM,EACZ,OAAO,GAAE,iBAAsB,GAC9B,OAAO,CAAC,YAAY,CAAC,CAAC,CAAC,CAAC;IAyG3B;;OAEG;YACW,mBAAmB;IA8BjC;;OAEG;IACG,GAAG,CAAC,CAAC,GAAG,OAAO,EACnB,IAAI,EAAE,MAAM,EACZ,OAAO,CAAC,EAAE,IAAI,CAAC,iBAAiB,EAAE,QAAQ,GAAG,MAAM,CAAC,GACnD,OAAO,CAAC,YAAY,CAAC,CAAC,CAAC,CAAC;IAI3B;;OAEG;IACG,IAAI,CAAC,CAAC,GAAG,OAAO,EACpB,IAAI,EAAE,MAAM,EACZ,IAAI,CAAC,EAAE,OAAO,EACd,OAAO,CAAC,EAAE,IAAI,CAAC,iBAAiB,EAAE,QAAQ,GAAG,MAAM,CAAC,GACnD,OAAO,CAAC,YAAY,CAAC,CAAC,CAAC,CAAC;IAI3B;;OAEG;IACG,KAAK,CAAC,CAAC,GAAG,OAAO,EACrB,IAAI,EAAE,MAAM,EACZ,IAAI,CAAC,EAAE,OAAO,EACd,OAAO,CAAC,EAAE,IAAI,CAAC,iBAAiB,EAAE,QAAQ,GAAG,MAAM,CAAC,GACnD,OAAO,CAAC,YAAY,CAAC,CAAC,CAAC,CAAC;IAI3B;;OAEG;IACG,MAAM,CAAC,CAAC,GAAG,OAAO,EACtB,IAAI,EAAE,MAAM,EACZ,OAAO,CAAC,EAAE,IAAI,CAAC,iBAAiB,EAAE,QAAQ,GAAG,MAAM,CAAC,GACnD,OAAO,CAAC,YAAY,CAAC,CAAC,CAAC,CAAC;CAG5B"}
|
|
@@ -0,0 +1,158 @@
|
|
|
1
|
+
import { BaseError, NetworkError, AuthError, ProtocolError, } from '../errors/index.js';
|
|
2
|
+
import { withTimeout } from './timeout.js';
|
|
3
|
+
/**
|
|
4
|
+
* HTTP client for making requests
|
|
5
|
+
*/
|
|
6
|
+
export class HttpClient {
|
|
7
|
+
constructor(config) {
|
|
8
|
+
// 注意:在某些浏览器/运行时环境中,直接保存 `window.fetch` 的函数引用再调用
|
|
9
|
+
// 可能触发 "Illegal invocation"(this 绑定丢失)。这里对默认 fetch 做显式绑定,
|
|
10
|
+
// 避免在测试页/嵌入式 WebView 等场景报错。
|
|
11
|
+
const defaultFetch = globalThis.fetch ? globalThis.fetch.bind(globalThis) : undefined;
|
|
12
|
+
this.config = {
|
|
13
|
+
baseUrl: config.baseUrl.replace(/\/$/, ''), // Remove trailing slash
|
|
14
|
+
fetch: config.fetch || defaultFetch,
|
|
15
|
+
getAuthToken: config.getAuthToken || (() => null),
|
|
16
|
+
timeoutMs: config.timeoutMs || 30000,
|
|
17
|
+
defaultHeaders: config.defaultHeaders || {},
|
|
18
|
+
onRequest: config.onRequest || (() => { }),
|
|
19
|
+
onResponse: config.onResponse || (() => { }),
|
|
20
|
+
onError: config.onError || (() => { }),
|
|
21
|
+
};
|
|
22
|
+
}
|
|
23
|
+
/**
|
|
24
|
+
* Make an HTTP request
|
|
25
|
+
*/
|
|
26
|
+
async request(path, options = {}) {
|
|
27
|
+
const url = `${this.config.baseUrl}${path}`;
|
|
28
|
+
const method = options.method || 'GET';
|
|
29
|
+
try {
|
|
30
|
+
// Build headers
|
|
31
|
+
const headers = {
|
|
32
|
+
...this.config.defaultHeaders,
|
|
33
|
+
...options.headers,
|
|
34
|
+
};
|
|
35
|
+
// Add auth token if available
|
|
36
|
+
const token = await this.config.getAuthToken();
|
|
37
|
+
if (token) {
|
|
38
|
+
headers['Authorization'] = `Bearer ${token}`;
|
|
39
|
+
}
|
|
40
|
+
// Add content-type for JSON body
|
|
41
|
+
if (options.body && !headers['Content-Type']) {
|
|
42
|
+
headers['Content-Type'] = 'application/json';
|
|
43
|
+
}
|
|
44
|
+
// Call onRequest hook
|
|
45
|
+
await this.config.onRequest({ url, method, headers, body: options.body });
|
|
46
|
+
// Prepare fetch options
|
|
47
|
+
const fetchOptions = {
|
|
48
|
+
method,
|
|
49
|
+
headers,
|
|
50
|
+
signal: options.signal,
|
|
51
|
+
};
|
|
52
|
+
if (options.body) {
|
|
53
|
+
fetchOptions.body = typeof options.body === 'string'
|
|
54
|
+
? options.body
|
|
55
|
+
: JSON.stringify(options.body);
|
|
56
|
+
}
|
|
57
|
+
// Make request with timeout
|
|
58
|
+
const response = await withTimeout(this.config.fetch(url, fetchOptions), this.config.timeoutMs);
|
|
59
|
+
// Parse response body
|
|
60
|
+
let data;
|
|
61
|
+
const contentType = response.headers.get('content-type');
|
|
62
|
+
if (contentType?.includes('application/json')) {
|
|
63
|
+
// `response.json()` is typed as `any/unknown` depending on TS lib; we
|
|
64
|
+
// intentionally trust the caller's generic `T` here.
|
|
65
|
+
data = (await response.json());
|
|
66
|
+
}
|
|
67
|
+
else if (contentType?.includes('text/')) {
|
|
68
|
+
data = await response.text();
|
|
69
|
+
}
|
|
70
|
+
else {
|
|
71
|
+
data = await response.blob();
|
|
72
|
+
}
|
|
73
|
+
// Handle error responses
|
|
74
|
+
if (!response.ok) {
|
|
75
|
+
// PostgREST 在分页超出范围时可能返回 416(Range Not Satisfiable)。
|
|
76
|
+
// 这类响应对上层“分页查询”来说应被视为“空结果页”,由调用方结合 Content-Range 自行计算 pagination。
|
|
77
|
+
// 因此这里对 416 做透传,不抛异常。
|
|
78
|
+
if (response.status !== 416) {
|
|
79
|
+
await this.handleErrorResponse(response, data);
|
|
80
|
+
}
|
|
81
|
+
}
|
|
82
|
+
const result = {
|
|
83
|
+
data,
|
|
84
|
+
status: response.status,
|
|
85
|
+
statusText: response.statusText,
|
|
86
|
+
headers: response.headers,
|
|
87
|
+
};
|
|
88
|
+
// Call onResponse hook
|
|
89
|
+
await this.config.onResponse({
|
|
90
|
+
url,
|
|
91
|
+
status: response.status,
|
|
92
|
+
statusText: response.statusText,
|
|
93
|
+
headers: response.headers,
|
|
94
|
+
data,
|
|
95
|
+
});
|
|
96
|
+
return result;
|
|
97
|
+
}
|
|
98
|
+
catch (error) {
|
|
99
|
+
// Call onError hook
|
|
100
|
+
if (error instanceof BaseError) {
|
|
101
|
+
await this.config.onError({
|
|
102
|
+
url,
|
|
103
|
+
message: error.message,
|
|
104
|
+
statusCode: error.statusCode,
|
|
105
|
+
details: error.details,
|
|
106
|
+
});
|
|
107
|
+
}
|
|
108
|
+
else if (error instanceof Error) {
|
|
109
|
+
await this.config.onError({
|
|
110
|
+
url,
|
|
111
|
+
message: error.message,
|
|
112
|
+
});
|
|
113
|
+
}
|
|
114
|
+
throw error;
|
|
115
|
+
}
|
|
116
|
+
}
|
|
117
|
+
/**
|
|
118
|
+
* Handle error responses
|
|
119
|
+
*/
|
|
120
|
+
async handleErrorResponse(response, data) {
|
|
121
|
+
const status = response.status;
|
|
122
|
+
// Auth errors
|
|
123
|
+
if (status === 401 || status === 403) {
|
|
124
|
+
throw new AuthError(`Authentication failed: ${response.statusText}`, status, data);
|
|
125
|
+
}
|
|
126
|
+
// Network errors
|
|
127
|
+
if (status >= 500) {
|
|
128
|
+
throw new NetworkError(`Server error: ${response.statusText}`, data);
|
|
129
|
+
}
|
|
130
|
+
// Protocol errors
|
|
131
|
+
throw new ProtocolError(`HTTP ${status}: ${response.statusText}`, data);
|
|
132
|
+
}
|
|
133
|
+
/**
|
|
134
|
+
* GET request
|
|
135
|
+
*/
|
|
136
|
+
async get(path, options) {
|
|
137
|
+
return this.request(path, { ...options, method: 'GET' });
|
|
138
|
+
}
|
|
139
|
+
/**
|
|
140
|
+
* POST request
|
|
141
|
+
*/
|
|
142
|
+
async post(path, body, options) {
|
|
143
|
+
return this.request(path, { ...options, method: 'POST', body });
|
|
144
|
+
}
|
|
145
|
+
/**
|
|
146
|
+
* PATCH request
|
|
147
|
+
*/
|
|
148
|
+
async patch(path, body, options) {
|
|
149
|
+
return this.request(path, { ...options, method: 'PATCH', body });
|
|
150
|
+
}
|
|
151
|
+
/**
|
|
152
|
+
* DELETE request
|
|
153
|
+
*/
|
|
154
|
+
async delete(path, options) {
|
|
155
|
+
return this.request(path, { ...options, method: 'DELETE' });
|
|
156
|
+
}
|
|
157
|
+
}
|
|
158
|
+
//# sourceMappingURL=HttpClient.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"HttpClient.js","sourceRoot":"","sources":["../../src/transport/HttpClient.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,SAAS,EACT,YAAY,EACZ,SAAS,EACT,aAAa,GACd,MAAM,oBAAoB,CAAC;AAM5B,OAAO,EAAE,WAAW,EAAE,MAAM,cAAc,CAAC;AAE3C;;GAEG;AACH,MAAM,OAAO,UAAU;IAGrB,YAAY,MAAwB;QAClC,gDAAgD;QAChD,0DAA0D;QAC1D,4BAA4B;QAC5B,MAAM,YAAY,GAAG,UAAU,CAAC,KAAK,CAAC,CAAC,CAAC,UAAU,CAAC,KAAK,CAAC,IAAI,CAAC,UAAU,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC;QAEtF,IAAI,CAAC,MAAM,GAAG;YACZ,OAAO,EAAE,MAAM,CAAC,OAAO,CAAC,OAAO,CAAC,KAAK,EAAE,EAAE,CAAC,EAAE,wBAAwB;YACpE,KAAK,EAAE,MAAM,CAAC,KAAK,IAAK,YAA6B;YACrD,YAAY,EAAE,MAAM,CAAC,YAAY,IAAI,CAAC,GAAG,EAAE,CAAC,IAAI,CAAC;YACjD,SAAS,EAAE,MAAM,CAAC,SAAS,IAAI,KAAK;YACpC,cAAc,EAAE,MAAM,CAAC,cAAc,IAAI,EAAE;YAC3C,SAAS,EAAE,MAAM,CAAC,SAAS,IAAI,CAAC,GAAG,EAAE,GAAE,CAAC,CAAC;YACzC,UAAU,EAAE,MAAM,CAAC,UAAU,IAAI,CAAC,GAAG,EAAE,GAAE,CAAC,CAAC;YAC3C,OAAO,EAAE,MAAM,CAAC,OAAO,IAAI,CAAC,GAAG,EAAE,GAAE,CAAC,CAAC;SACtC,CAAC;IACJ,CAAC;IAED;;OAEG;IACH,KAAK,CAAC,OAAO,CACX,IAAY,EACZ,UAA6B,EAAE;QAE/B,MAAM,GAAG,GAAG,GAAG,IAAI,CAAC,MAAM,CAAC,OAAO,GAAG,IAAI,EAAE,CAAC;QAC5C,MAAM,MAAM,GAAG,OAAO,CAAC,MAAM,IAAI,KAAK,CAAC;QAEvC,IAAI,CAAC;YACH,gBAAgB;YAChB,MAAM,OAAO,GAA2B;gBACtC,GAAG,IAAI,CAAC,MAAM,CAAC,cAAc;gBAC7B,GAAG,OAAO,CAAC,OAAO;aACnB,CAAC;YAEF,8BAA8B;YAC9B,MAAM,KAAK,GAAG,MAAM,IAAI,CAAC,MAAM,CAAC,YAAY,EAAE,CAAC;YAC/C,IAAI,KAAK,EAAE,CAAC;gBACV,OAAO,CAAC,eAAe,CAAC,GAAG,UAAU,KAAK,EAAE,CAAC;YAC/C,CAAC;YAED,iCAAiC;YACjC,IAAI,OAAO,CAAC,IAAI,IAAI,CAAC,OAAO,CAAC,cAAc,CAAC,EAAE,CAAC;gBAC7C,OAAO,CAAC,cAAc,CAAC,GAAG,kBAAkB,CAAC;YAC/C,CAAC;YAED,sBAAsB;YACtB,MAAM,IAAI,CAAC,MAAM,CAAC,SAAS,CAAC,EAAE,GAAG,EAAE,MAAM,EAAE,OAAO,EAAE,IAAI,EAAE,OAAO,CAAC,IAAI,EAAE,CAAC,CAAC;YAE1E,wBAAwB;YACxB,MAAM,YAAY,GAAgB;gBAChC,MAAM;gBACN,OAAO;gBACP,MAAM,EAAE,OAAO,CAAC,MAAM;aACvB,CAAC;YAEF,IAAI,OAAO,CAAC,IAAI,EAAE,CAAC;gBACjB,YAAY,CAAC,IAAI,GAAG,OAAO,OAAO,CAAC,IAAI,KAAK,QAAQ;oBAClD,CAAC,CAAC,OAAO,CAAC,IAAI;oBACd,CAAC,CAAC,IAAI,CAAC,SAAS,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC;YACnC,CAAC;YAED,4BAA4B;YAC5B,MAAM,QAAQ,GAAG,MAAM,WAAW,CAChC,IAAI,CAAC,MAAM,CAAC,KAAK,CAAC,GAAG,EAAE,YAAY,CAAC,EACpC,IAAI,CAAC,MAAM,CAAC,SAAS,CACtB,CAAC;YAEF,sBAAsB;YACtB,IAAI,IAAO,CAAC;YACZ,MAAM,WAAW,GAAG,QAAQ,CAAC,OAAO,CAAC,GAAG,CAAC,cAAc,CAAC,CAAC;YAEzD,IAAI,WAAW,EAAE,QAAQ,CAAC,kBAAkB,CAAC,EAAE,CAAC;gBAC9C,sEAAsE;gBACtE,qDAAqD;gBACrD,IAAI,GAAG,CAAC,MAAM,QAAQ,CAAC,IAAI,EAAE,CAAM,CAAC;YACtC,CAAC;iBAAM,IAAI,WAAW,EAAE,QAAQ,CAAC,OAAO,CAAC,EAAE,CAAC;gBAC1C,IAAI,GAAG,MAAM,QAAQ,CAAC,IAAI,EAAO,CAAC;YACpC,CAAC;iBAAM,CAAC;gBACN,IAAI,GAAG,MAAM,QAAQ,CAAC,IAAI,EAAO,CAAC;YACpC,CAAC;YAED,yBAAyB;YACzB,IAAI,CAAC,QAAQ,CAAC,EAAE,EAAE,CAAC;gBACjB,qDAAqD;gBACrD,kEAAkE;gBAClE,sBAAsB;gBACtB,IAAI,QAAQ,CAAC,MAAM,KAAK,GAAG,EAAE,CAAC;oBAC5B,MAAM,IAAI,CAAC,mBAAmB,CAAC,QAAQ,EAAE,IAAI,CAAC,CAAC;gBACjD,CAAC;YACH,CAAC;YAED,MAAM,MAAM,GAAoB;gBAC9B,IAAI;gBACJ,MAAM,EAAE,QAAQ,CAAC,MAAM;gBACvB,UAAU,EAAE,QAAQ,CAAC,UAAU;gBAC/B,OAAO,EAAE,QAAQ,CAAC,OAAO;aAC1B,CAAC;YAEF,uBAAuB;YACvB,MAAM,IAAI,CAAC,MAAM,CAAC,UAAU,CAAC;gBAC3B,GAAG;gBACH,MAAM,EAAE,QAAQ,CAAC,MAAM;gBACvB,UAAU,EAAE,QAAQ,CAAC,UAAU;gBAC/B,OAAO,EAAE,QAAQ,CAAC,OAAO;gBACzB,IAAI;aACL,CAAC,CAAC;YAEH,OAAO,MAAM,CAAC;QAChB,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,oBAAoB;YACpB,IAAI,KAAK,YAAY,SAAS,EAAE,CAAC;gBAC/B,MAAM,IAAI,CAAC,MAAM,CAAC,OAAO,CAAC;oBACxB,GAAG;oBACH,OAAO,EAAE,KAAK,CAAC,OAAO;oBACtB,UAAU,EAAE,KAAK,CAAC,UAAU;oBAC5B,OAAO,EAAE,KAAK,CAAC,OAAO;iBACvB,CAAC,CAAC;YACL,CAAC;iBAAM,IAAI,KAAK,YAAY,KAAK,EAAE,CAAC;gBAClC,MAAM,IAAI,CAAC,MAAM,CAAC,OAAO,CAAC;oBACxB,GAAG;oBACH,OAAO,EAAE,KAAK,CAAC,OAAO;iBACvB,CAAC,CAAC;YACL,CAAC;YAED,MAAM,KAAK,CAAC;QACd,CAAC;IACH,CAAC;IAED;;OAEG;IACK,KAAK,CAAC,mBAAmB,CAC/B,QAAkB,EAClB,IAAa;QAEb,MAAM,MAAM,GAAG,QAAQ,CAAC,MAAM,CAAC;QAE/B,cAAc;QACd,IAAI,MAAM,KAAK,GAAG,IAAI,MAAM,KAAK,GAAG,EAAE,CAAC;YACrC,MAAM,IAAI,SAAS,CACjB,0BAA0B,QAAQ,CAAC,UAAU,EAAE,EAC/C,MAAM,EACN,IAAI,CACL,CAAC;QACJ,CAAC;QAED,iBAAiB;QACjB,IAAI,MAAM,IAAI,GAAG,EAAE,CAAC;YAClB,MAAM,IAAI,YAAY,CACpB,iBAAiB,QAAQ,CAAC,UAAU,EAAE,EACtC,IAAI,CACL,CAAC;QACJ,CAAC;QAED,kBAAkB;QAClB,MAAM,IAAI,aAAa,CACrB,QAAQ,MAAM,KAAK,QAAQ,CAAC,UAAU,EAAE,EACxC,IAAI,CACL,CAAC;IACJ,CAAC;IAED;;OAEG;IACH,KAAK,CAAC,GAAG,CACP,IAAY,EACZ,OAAoD;QAEpD,OAAO,IAAI,CAAC,OAAO,CAAI,IAAI,EAAE,EAAE,GAAG,OAAO,EAAE,MAAM,EAAE,KAAK,EAAE,CAAC,CAAC;IAC9D,CAAC;IAED;;OAEG;IACH,KAAK,CAAC,IAAI,CACR,IAAY,EACZ,IAAc,EACd,OAAoD;QAEpD,OAAO,IAAI,CAAC,OAAO,CAAI,IAAI,EAAE,EAAE,GAAG,OAAO,EAAE,MAAM,EAAE,MAAM,EAAE,IAAI,EAAE,CAAC,CAAC;IACrE,CAAC;IAED;;OAEG;IACH,KAAK,CAAC,KAAK,CACT,IAAY,EACZ,IAAc,EACd,OAAoD;QAEpD,OAAO,IAAI,CAAC,OAAO,CAAI,IAAI,EAAE,EAAE,GAAG,OAAO,EAAE,MAAM,EAAE,OAAO,EAAE,IAAI,EAAE,CAAC,CAAC;IACtE,CAAC;IAED;;OAEG;IACH,KAAK,CAAC,MAAM,CACV,IAAY,EACZ,OAAoD;QAEpD,OAAO,IAAI,CAAC,OAAO,CAAI,IAAI,EAAE,EAAE,GAAG,OAAO,EAAE,MAAM,EAAE,QAAQ,EAAE,CAAC,CAAC;IACjE,CAAC;CACF"}
|
|
@@ -0,0 +1,40 @@
|
|
|
1
|
+
import type { TokenProvider } from '../types/token.types.js';
|
|
2
|
+
import type { OnRequestHook, OnResponseHook, OnErrorHook } from '../types/http.types.js';
|
|
3
|
+
/**
|
|
4
|
+
* HTTP client configuration
|
|
5
|
+
*/
|
|
6
|
+
export interface HttpClientConfig {
|
|
7
|
+
/**
|
|
8
|
+
* Base URL for all requests
|
|
9
|
+
*/
|
|
10
|
+
baseUrl: string;
|
|
11
|
+
/**
|
|
12
|
+
* Custom fetch implementation (defaults to global fetch)
|
|
13
|
+
*/
|
|
14
|
+
fetch?: typeof fetch;
|
|
15
|
+
/**
|
|
16
|
+
* Token provider function
|
|
17
|
+
*/
|
|
18
|
+
getAuthToken?: TokenProvider;
|
|
19
|
+
/**
|
|
20
|
+
* Request timeout in milliseconds (default: 30000)
|
|
21
|
+
*/
|
|
22
|
+
timeoutMs?: number;
|
|
23
|
+
/**
|
|
24
|
+
* Default headers to include in all requests
|
|
25
|
+
*/
|
|
26
|
+
defaultHeaders?: Record<string, string>;
|
|
27
|
+
/**
|
|
28
|
+
* Hook called before request is sent
|
|
29
|
+
*/
|
|
30
|
+
onRequest?: OnRequestHook;
|
|
31
|
+
/**
|
|
32
|
+
* Hook called after successful response
|
|
33
|
+
*/
|
|
34
|
+
onResponse?: OnResponseHook;
|
|
35
|
+
/**
|
|
36
|
+
* Hook called on error
|
|
37
|
+
*/
|
|
38
|
+
onError?: OnErrorHook;
|
|
39
|
+
}
|
|
40
|
+
//# sourceMappingURL=config.types.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"config.types.d.ts","sourceRoot":"","sources":["../../src/transport/config.types.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,yBAAyB,CAAC;AAC7D,OAAO,KAAK,EACV,aAAa,EACb,cAAc,EACd,WAAW,EACZ,MAAM,wBAAwB,CAAC;AAEhC;;GAEG;AACH,MAAM,WAAW,gBAAgB;IAC/B;;OAEG;IACH,OAAO,EAAE,MAAM,CAAC;IAEhB;;OAEG;IACH,KAAK,CAAC,EAAE,OAAO,KAAK,CAAC;IAErB;;OAEG;IACH,YAAY,CAAC,EAAE,aAAa,CAAC;IAE7B;;OAEG;IACH,SAAS,CAAC,EAAE,MAAM,CAAC;IAEnB;;OAEG;IACH,cAAc,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IAExC;;OAEG;IACH,SAAS,CAAC,EAAE,aAAa,CAAC;IAE1B;;OAEG;IACH,UAAU,CAAC,EAAE,cAAc,CAAC;IAE5B;;OAEG;IACH,OAAO,CAAC,EAAE,WAAW,CAAC;CACvB"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"config.types.js","sourceRoot":"","sources":["../../src/transport/config.types.ts"],"names":[],"mappings":""}
|