@bowenqt/qiniu-ai-sdk 0.1.0 → 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 +104 -0
- package/dist/client.d.ts +38 -4
- package/dist/client.d.ts.map +1 -1
- package/dist/client.js +47 -20
- package/dist/client.js.map +1 -1
- package/dist/client.mjs +42 -19
- package/dist/index.d.ts +2 -1
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +9 -1
- package/dist/index.js.map +1 -1
- package/dist/index.mjs +1 -1
- package/dist/lib/logger.d.ts +27 -0
- package/dist/lib/logger.d.ts.map +1 -0
- package/dist/lib/logger.js +58 -0
- package/dist/lib/logger.js.map +1 -0
- package/dist/lib/logger.mjs +54 -0
- package/dist/lib/middleware.d.ts +58 -0
- package/dist/lib/middleware.d.ts.map +1 -0
- package/dist/lib/middleware.js +85 -0
- package/dist/lib/middleware.js.map +1 -0
- package/dist/lib/middleware.mjs +78 -0
- package/dist/lib/request.d.ts +21 -4
- package/dist/lib/request.d.ts.map +1 -1
- package/dist/lib/request.js +138 -36
- package/dist/lib/request.js.map +1 -1
- package/dist/lib/request.mjs +138 -36
- package/dist/lib/types.d.ts +5 -2
- package/dist/lib/types.d.ts.map +1 -1
- package/dist/modules/image/index.d.ts.map +1 -1
- package/dist/modules/image/index.js +16 -2
- package/dist/modules/image/index.js.map +1 -1
- package/dist/modules/image/index.mjs +16 -2
- package/dist/modules/tools/index.d.ts.map +1 -1
- package/dist/modules/tools/index.js +2 -1
- package/dist/modules/tools/index.js.map +1 -1
- package/dist/modules/tools/index.mjs +2 -1
- package/dist/modules/video/index.d.ts.map +1 -1
- package/dist/modules/video/index.js +16 -2
- package/dist/modules/video/index.js.map +1 -1
- package/dist/modules/video/index.mjs +16 -2
- package/package.json +1 -1
package/README.md
CHANGED
|
@@ -67,10 +67,114 @@ console.log(results);
|
|
|
67
67
|
### Client Initialization
|
|
68
68
|
|
|
69
69
|
```typescript
|
|
70
|
+
import { QiniuAI, consoleLogger } from '@bowenqt/qiniu-ai-sdk';
|
|
71
|
+
|
|
70
72
|
const client = new QiniuAI({
|
|
71
73
|
apiKey: string; // Required: Your Qiniu AI API key
|
|
72
74
|
baseUrl?: string; // Optional: API base URL (default: https://api.qnaigc.com/v1)
|
|
73
75
|
timeout?: number; // Optional: Request timeout in ms (default: 60000)
|
|
76
|
+
logger?: Logger; // Optional: Custom logger (use consoleLogger for debug output)
|
|
77
|
+
logLevel?: LogLevel; // Optional: 'debug' | 'info' | 'warn' | 'error' | 'silent' (default: 'info')
|
|
78
|
+
});
|
|
79
|
+
```
|
|
80
|
+
|
|
81
|
+
### Logging
|
|
82
|
+
|
|
83
|
+
Enable debug logging to see request/response details:
|
|
84
|
+
|
|
85
|
+
```typescript
|
|
86
|
+
import { QiniuAI, consoleLogger } from '@bowenqt/qiniu-ai-sdk';
|
|
87
|
+
|
|
88
|
+
const client = new QiniuAI({
|
|
89
|
+
apiKey: 'Sk-xxx',
|
|
90
|
+
logger: consoleLogger,
|
|
91
|
+
logLevel: 'debug',
|
|
92
|
+
});
|
|
93
|
+
|
|
94
|
+
// Now you'll see logs like:
|
|
95
|
+
// [QiniuAI:DEBUG] HTTP Request { requestId: 'req_123...', method: 'POST', url: '...', timeout: 60000 }
|
|
96
|
+
// [QiniuAI:DEBUG] HTTP Response { requestId: 'req_123...', status: 200, duration: 1234 }
|
|
97
|
+
```
|
|
98
|
+
|
|
99
|
+
Use a custom logger (e.g., pino, winston):
|
|
100
|
+
|
|
101
|
+
```typescript
|
|
102
|
+
import { QiniuAI, Logger } from '@bowenqt/qiniu-ai-sdk';
|
|
103
|
+
import pino from 'pino';
|
|
104
|
+
|
|
105
|
+
const pinoLogger = pino();
|
|
106
|
+
|
|
107
|
+
const customLogger: Logger = {
|
|
108
|
+
debug: (msg, meta) => pinoLogger.debug(meta, msg),
|
|
109
|
+
info: (msg, meta) => pinoLogger.info(meta, msg),
|
|
110
|
+
warn: (msg, meta) => pinoLogger.warn(meta, msg),
|
|
111
|
+
error: (msg, meta) => pinoLogger.error(meta, msg),
|
|
112
|
+
};
|
|
113
|
+
|
|
114
|
+
const client = new QiniuAI({
|
|
115
|
+
apiKey: 'Sk-xxx',
|
|
116
|
+
logger: customLogger,
|
|
117
|
+
});
|
|
118
|
+
```
|
|
119
|
+
|
|
120
|
+
### Middleware
|
|
121
|
+
|
|
122
|
+
Use middleware to intercept and modify requests/responses:
|
|
123
|
+
|
|
124
|
+
```typescript
|
|
125
|
+
import { QiniuAI, Middleware, retryMiddleware, headersMiddleware } from '@bowenqt/qiniu-ai-sdk';
|
|
126
|
+
|
|
127
|
+
// Built-in retry middleware (retries on 5xx errors)
|
|
128
|
+
const retry = retryMiddleware({ maxRetries: 3, retryDelay: 1000 });
|
|
129
|
+
|
|
130
|
+
// Built-in headers middleware (adds custom headers)
|
|
131
|
+
const customHeaders = headersMiddleware({
|
|
132
|
+
'X-Custom-Header': 'my-value',
|
|
133
|
+
});
|
|
134
|
+
|
|
135
|
+
// Custom middleware
|
|
136
|
+
const loggingMiddleware: Middleware = async (request, next) => {
|
|
137
|
+
console.log('Request:', request.method, request.url);
|
|
138
|
+
const response = await next(request);
|
|
139
|
+
console.log('Response:', response.status, response.duration + 'ms');
|
|
140
|
+
return response;
|
|
141
|
+
};
|
|
142
|
+
|
|
143
|
+
const client = new QiniuAI({
|
|
144
|
+
apiKey: 'Sk-xxx',
|
|
145
|
+
middleware: [retry, customHeaders, loggingMiddleware],
|
|
146
|
+
});
|
|
147
|
+
```
|
|
148
|
+
|
|
149
|
+
### Custom HTTP Adapter
|
|
150
|
+
|
|
151
|
+
Replace the default `fetch` with a custom HTTP client:
|
|
152
|
+
|
|
153
|
+
```typescript
|
|
154
|
+
import { QiniuAI, FetchAdapter } from '@bowenqt/qiniu-ai-sdk';
|
|
155
|
+
import axios from 'axios';
|
|
156
|
+
|
|
157
|
+
const axiosAdapter: FetchAdapter = {
|
|
158
|
+
async fetch(url, init) {
|
|
159
|
+
const response = await axios({
|
|
160
|
+
url,
|
|
161
|
+
method: init.method as any,
|
|
162
|
+
headers: init.headers as Record<string, string>,
|
|
163
|
+
data: init.body,
|
|
164
|
+
signal: init.signal,
|
|
165
|
+
validateStatus: () => true, // Don't throw on non-2xx
|
|
166
|
+
});
|
|
167
|
+
|
|
168
|
+
return new Response(JSON.stringify(response.data), {
|
|
169
|
+
status: response.status,
|
|
170
|
+
headers: response.headers as any,
|
|
171
|
+
});
|
|
172
|
+
},
|
|
173
|
+
};
|
|
174
|
+
|
|
175
|
+
const client = new QiniuAI({
|
|
176
|
+
apiKey: 'Sk-xxx',
|
|
177
|
+
adapter: axiosAdapter,
|
|
74
178
|
});
|
|
75
179
|
```
|
|
76
180
|
|
package/dist/client.d.ts
CHANGED
|
@@ -1,4 +1,7 @@
|
|
|
1
|
+
import { RequestOptions } from './lib/request';
|
|
1
2
|
import { IQiniuClient } from './lib/types';
|
|
3
|
+
import { Logger, noopLogger, consoleLogger, LogLevel, createFilteredLogger } from './lib/logger';
|
|
4
|
+
import { FetchAdapter, defaultFetchAdapter, Middleware, composeMiddleware, retryMiddleware, headersMiddleware, timingMiddleware } from './lib/middleware';
|
|
2
5
|
import { Chat } from './modules/chat';
|
|
3
6
|
import { Image } from './modules/image';
|
|
4
7
|
import { Video } from './modules/video';
|
|
@@ -7,6 +10,26 @@ export interface QiniuAIOptions {
|
|
|
7
10
|
apiKey: string;
|
|
8
11
|
baseUrl?: string;
|
|
9
12
|
timeout?: number;
|
|
13
|
+
/**
|
|
14
|
+
* Custom logger instance. Use `consoleLogger` for debug output.
|
|
15
|
+
* Default: silent (no logging)
|
|
16
|
+
*/
|
|
17
|
+
logger?: Logger;
|
|
18
|
+
/**
|
|
19
|
+
* Log level filter. Only applies if using a logger.
|
|
20
|
+
* Default: 'info'
|
|
21
|
+
*/
|
|
22
|
+
logLevel?: LogLevel;
|
|
23
|
+
/**
|
|
24
|
+
* Custom HTTP adapter. Allows replacing fetch with axios, got, etc.
|
|
25
|
+
* Default: native fetch
|
|
26
|
+
*/
|
|
27
|
+
adapter?: FetchAdapter;
|
|
28
|
+
/**
|
|
29
|
+
* Middleware functions to process requests/responses.
|
|
30
|
+
* Executed in order, wrapping the core request.
|
|
31
|
+
*/
|
|
32
|
+
middleware?: Middleware[];
|
|
10
33
|
}
|
|
11
34
|
export declare class QiniuAI implements IQiniuClient {
|
|
12
35
|
chat: Chat;
|
|
@@ -16,14 +39,25 @@ export declare class QiniuAI implements IQiniuClient {
|
|
|
16
39
|
private apiKey;
|
|
17
40
|
private baseUrl;
|
|
18
41
|
private timeout;
|
|
42
|
+
private logger;
|
|
43
|
+
private requestContext;
|
|
19
44
|
constructor(options: QiniuAIOptions);
|
|
20
45
|
/**
|
|
21
|
-
*
|
|
46
|
+
* Get the logger instance (for modules to use)
|
|
47
|
+
*/
|
|
48
|
+
getLogger(): Logger;
|
|
49
|
+
/**
|
|
50
|
+
* Generic POST request wrapper with optional per-request options
|
|
22
51
|
*/
|
|
23
|
-
post<T>(endpoint: string, body:
|
|
52
|
+
post<T>(endpoint: string, body: unknown, requestId?: string, options?: RequestOptions): Promise<T>;
|
|
24
53
|
/**
|
|
25
|
-
* Generic GET request wrapper
|
|
54
|
+
* Generic GET request wrapper with optional per-request options
|
|
26
55
|
*/
|
|
27
|
-
get<T>(endpoint: string, params?: Record<string, string
|
|
56
|
+
get<T>(endpoint: string, params?: Record<string, string>, requestId?: string, options?: RequestOptions): Promise<T>;
|
|
28
57
|
}
|
|
58
|
+
export { consoleLogger, noopLogger, createFilteredLogger };
|
|
59
|
+
export type { Logger, LogLevel };
|
|
60
|
+
export { defaultFetchAdapter, composeMiddleware, retryMiddleware, headersMiddleware, timingMiddleware };
|
|
61
|
+
export type { FetchAdapter, Middleware, MiddlewareRequest, MiddlewareResponse } from './lib/middleware';
|
|
62
|
+
export type { RequestOptions } from './lib/request';
|
|
29
63
|
//# sourceMappingURL=client.d.ts.map
|
package/dist/client.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"client.d.ts","sourceRoot":"","sources":["../src/client.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"client.d.ts","sourceRoot":"","sources":["../src/client.ts"],"names":[],"mappings":"AAAA,OAAO,EAA2B,cAAc,EAAE,MAAM,eAAe,CAAC;AACxE,OAAO,EAAE,YAAY,EAAE,MAAM,aAAa,CAAC;AAC3C,OAAO,EAAE,MAAM,EAAE,UAAU,EAAE,aAAa,EAAE,QAAQ,EAAE,oBAAoB,EAAE,MAAM,cAAc,CAAC;AACjG,OAAO,EACH,YAAY,EACZ,mBAAmB,EACnB,UAAU,EACV,iBAAiB,EACjB,eAAe,EACf,iBAAiB,EACjB,gBAAgB,EACnB,MAAM,kBAAkB,CAAC;AAC1B,OAAO,EAAE,IAAI,EAAE,MAAM,gBAAgB,CAAC;AACtC,OAAO,EAAE,KAAK,EAAE,MAAM,iBAAiB,CAAC;AACxC,OAAO,EAAE,KAAK,EAAE,MAAM,iBAAiB,CAAC;AACxC,OAAO,EAAE,KAAK,EAAE,MAAM,iBAAiB,CAAC;AAExC,MAAM,WAAW,cAAc;IAC3B,MAAM,EAAE,MAAM,CAAC;IACf,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB;;;OAGG;IACH,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB;;;OAGG;IACH,QAAQ,CAAC,EAAE,QAAQ,CAAC;IACpB;;;OAGG;IACH,OAAO,CAAC,EAAE,YAAY,CAAC;IACvB;;;OAGG;IACH,UAAU,CAAC,EAAE,UAAU,EAAE,CAAC;CAC7B;AAED,qBAAa,OAAQ,YAAW,YAAY;IACjC,IAAI,EAAE,IAAI,CAAC;IACX,KAAK,EAAE,KAAK,CAAC;IACb,KAAK,EAAE,KAAK,CAAC;IACb,GAAG,EAAE,KAAK,CAAC;IAElB,OAAO,CAAC,MAAM,CAAS;IACvB,OAAO,CAAC,OAAO,CAAS;IACxB,OAAO,CAAC,OAAO,CAAS;IACxB,OAAO,CAAC,MAAM,CAAS;IACvB,OAAO,CAAC,cAAc,CAAiB;gBAE3B,OAAO,EAAE,cAAc;IAoDnC;;OAEG;IACH,SAAS,IAAI,MAAM;IAInB;;OAEG;IACG,IAAI,CAAC,CAAC,EAAE,QAAQ,EAAE,MAAM,EAAE,IAAI,EAAE,OAAO,EAAE,SAAS,CAAC,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE,cAAc,GAAG,OAAO,CAAC,CAAC,CAAC;IAWxG;;OAEG;IACG,GAAG,CAAC,CAAC,EAAE,QAAQ,EAAE,MAAM,EAAE,MAAM,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,EAAE,SAAS,CAAC,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE,cAAc,GAAG,OAAO,CAAC,CAAC,CAAC;CAgB5H;AAGD,OAAO,EAAE,aAAa,EAAE,UAAU,EAAE,oBAAoB,EAAE,CAAC;AAC3D,YAAY,EAAE,MAAM,EAAE,QAAQ,EAAE,CAAC;AAGjC,OAAO,EACH,mBAAmB,EACnB,iBAAiB,EACjB,eAAe,EACf,iBAAiB,EACjB,gBAAgB,EACnB,CAAC;AACF,YAAY,EAAE,YAAY,EAAE,UAAU,EAAE,iBAAiB,EAAE,kBAAkB,EAAE,MAAM,kBAAkB,CAAC;AACxG,YAAY,EAAE,cAAc,EAAE,MAAM,eAAe,CAAC"}
|
package/dist/client.js
CHANGED
|
@@ -1,7 +1,17 @@
|
|
|
1
1
|
"use strict";
|
|
2
2
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
-
exports.QiniuAI = void 0;
|
|
3
|
+
exports.timingMiddleware = exports.headersMiddleware = exports.retryMiddleware = exports.composeMiddleware = exports.defaultFetchAdapter = exports.createFilteredLogger = exports.noopLogger = exports.consoleLogger = exports.QiniuAI = void 0;
|
|
4
4
|
const request_1 = require("./lib/request");
|
|
5
|
+
const logger_1 = require("./lib/logger");
|
|
6
|
+
Object.defineProperty(exports, "noopLogger", { enumerable: true, get: function () { return logger_1.noopLogger; } });
|
|
7
|
+
Object.defineProperty(exports, "consoleLogger", { enumerable: true, get: function () { return logger_1.consoleLogger; } });
|
|
8
|
+
Object.defineProperty(exports, "createFilteredLogger", { enumerable: true, get: function () { return logger_1.createFilteredLogger; } });
|
|
9
|
+
const middleware_1 = require("./lib/middleware");
|
|
10
|
+
Object.defineProperty(exports, "defaultFetchAdapter", { enumerable: true, get: function () { return middleware_1.defaultFetchAdapter; } });
|
|
11
|
+
Object.defineProperty(exports, "composeMiddleware", { enumerable: true, get: function () { return middleware_1.composeMiddleware; } });
|
|
12
|
+
Object.defineProperty(exports, "retryMiddleware", { enumerable: true, get: function () { return middleware_1.retryMiddleware; } });
|
|
13
|
+
Object.defineProperty(exports, "headersMiddleware", { enumerable: true, get: function () { return middleware_1.headersMiddleware; } });
|
|
14
|
+
Object.defineProperty(exports, "timingMiddleware", { enumerable: true, get: function () { return middleware_1.timingMiddleware; } });
|
|
5
15
|
const chat_1 = require("./modules/chat");
|
|
6
16
|
const image_1 = require("./modules/image");
|
|
7
17
|
const video_1 = require("./modules/video");
|
|
@@ -20,6 +30,30 @@ class QiniuAI {
|
|
|
20
30
|
if (this.timeout <= 0) {
|
|
21
31
|
throw new Error('Timeout must be a positive number');
|
|
22
32
|
}
|
|
33
|
+
// Setup logger with level filtering
|
|
34
|
+
const baseLogger = options.logger || logger_1.noopLogger;
|
|
35
|
+
const logLevel = options.logLevel || 'info';
|
|
36
|
+
this.logger = (0, logger_1.createFilteredLogger)(baseLogger, logLevel);
|
|
37
|
+
// Setup request context
|
|
38
|
+
const adapter = options.adapter || middleware_1.defaultFetchAdapter;
|
|
39
|
+
const middleware = options.middleware?.length
|
|
40
|
+
? (0, middleware_1.composeMiddleware)(options.middleware)
|
|
41
|
+
: undefined;
|
|
42
|
+
this.requestContext = {
|
|
43
|
+
logger: this.logger,
|
|
44
|
+
adapter,
|
|
45
|
+
middleware,
|
|
46
|
+
baseHeaders: {
|
|
47
|
+
'Authorization': `Bearer ${this.apiKey}`,
|
|
48
|
+
},
|
|
49
|
+
defaultTimeout: this.timeout,
|
|
50
|
+
};
|
|
51
|
+
this.logger.info('QiniuAI client initialized', {
|
|
52
|
+
baseUrl: this.baseUrl,
|
|
53
|
+
timeout: this.timeout,
|
|
54
|
+
hasMiddleware: !!middleware,
|
|
55
|
+
hasCustomAdapter: !!options.adapter,
|
|
56
|
+
});
|
|
23
57
|
// Initialize modules
|
|
24
58
|
this.chat = new chat_1.Chat(this);
|
|
25
59
|
this.image = new image_1.Image(this);
|
|
@@ -27,36 +61,29 @@ class QiniuAI {
|
|
|
27
61
|
this.sys = new tools_1.Tools(this);
|
|
28
62
|
}
|
|
29
63
|
/**
|
|
30
|
-
*
|
|
64
|
+
* Get the logger instance (for modules to use)
|
|
31
65
|
*/
|
|
32
|
-
|
|
66
|
+
getLogger() {
|
|
67
|
+
return this.logger;
|
|
68
|
+
}
|
|
69
|
+
/**
|
|
70
|
+
* Generic POST request wrapper with optional per-request options
|
|
71
|
+
*/
|
|
72
|
+
async post(endpoint, body, requestId, options) {
|
|
33
73
|
const url = `${this.baseUrl}${endpoint}`;
|
|
34
|
-
return (0, request_1.request)(url, {
|
|
35
|
-
method: 'POST',
|
|
36
|
-
headers: {
|
|
37
|
-
'Authorization': `Bearer ${this.apiKey}`,
|
|
38
|
-
},
|
|
39
|
-
body: JSON.stringify(body),
|
|
40
|
-
timeout: this.timeout,
|
|
41
|
-
});
|
|
74
|
+
return (0, request_1.request)(url, 'POST', body, this.requestContext, { ...options, requestId });
|
|
42
75
|
}
|
|
43
76
|
/**
|
|
44
|
-
* Generic GET request wrapper
|
|
77
|
+
* Generic GET request wrapper with optional per-request options
|
|
45
78
|
*/
|
|
46
|
-
async get(endpoint, params) {
|
|
79
|
+
async get(endpoint, params, requestId, options) {
|
|
47
80
|
const url = new URL(`${this.baseUrl}${endpoint}`);
|
|
48
81
|
if (params) {
|
|
49
82
|
Object.entries(params).forEach(([key, value]) => {
|
|
50
83
|
url.searchParams.append(key, value);
|
|
51
84
|
});
|
|
52
85
|
}
|
|
53
|
-
return (0, request_1.request)(url.toString(), {
|
|
54
|
-
method: 'GET',
|
|
55
|
-
headers: {
|
|
56
|
-
'Authorization': `Bearer ${this.apiKey}`,
|
|
57
|
-
},
|
|
58
|
-
timeout: this.timeout,
|
|
59
|
-
});
|
|
86
|
+
return (0, request_1.request)(url.toString(), 'GET', undefined, this.requestContext, { ...options, requestId });
|
|
60
87
|
}
|
|
61
88
|
}
|
|
62
89
|
exports.QiniuAI = QiniuAI;
|
package/dist/client.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"client.js","sourceRoot":"","sources":["../src/client.ts"],"names":[],"mappings":";;;AAAA,
|
|
1
|
+
{"version":3,"file":"client.js","sourceRoot":"","sources":["../src/client.ts"],"names":[],"mappings":"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"}
|
package/dist/client.mjs
CHANGED
|
@@ -1,4 +1,6 @@
|
|
|
1
1
|
import { request } from './lib/request.mjs';
|
|
2
|
+
import { noopLogger, consoleLogger, createFilteredLogger } from './lib/logger.mjs';
|
|
3
|
+
import { defaultFetchAdapter, composeMiddleware, retryMiddleware, headersMiddleware, timingMiddleware, } from './lib/middleware.mjs';
|
|
2
4
|
import { Chat } from './modules/chat.mjs';
|
|
3
5
|
import { Image } from './modules/image.mjs';
|
|
4
6
|
import { Video } from './modules/video.mjs';
|
|
@@ -17,6 +19,30 @@ export class QiniuAI {
|
|
|
17
19
|
if (this.timeout <= 0) {
|
|
18
20
|
throw new Error('Timeout must be a positive number');
|
|
19
21
|
}
|
|
22
|
+
// Setup logger with level filtering
|
|
23
|
+
const baseLogger = options.logger || noopLogger;
|
|
24
|
+
const logLevel = options.logLevel || 'info';
|
|
25
|
+
this.logger = createFilteredLogger(baseLogger, logLevel);
|
|
26
|
+
// Setup request context
|
|
27
|
+
const adapter = options.adapter || defaultFetchAdapter;
|
|
28
|
+
const middleware = options.middleware?.length
|
|
29
|
+
? composeMiddleware(options.middleware)
|
|
30
|
+
: undefined;
|
|
31
|
+
this.requestContext = {
|
|
32
|
+
logger: this.logger,
|
|
33
|
+
adapter,
|
|
34
|
+
middleware,
|
|
35
|
+
baseHeaders: {
|
|
36
|
+
'Authorization': `Bearer ${this.apiKey}`,
|
|
37
|
+
},
|
|
38
|
+
defaultTimeout: this.timeout,
|
|
39
|
+
};
|
|
40
|
+
this.logger.info('QiniuAI client initialized', {
|
|
41
|
+
baseUrl: this.baseUrl,
|
|
42
|
+
timeout: this.timeout,
|
|
43
|
+
hasMiddleware: !!middleware,
|
|
44
|
+
hasCustomAdapter: !!options.adapter,
|
|
45
|
+
});
|
|
20
46
|
// Initialize modules
|
|
21
47
|
this.chat = new Chat(this);
|
|
22
48
|
this.image = new Image(this);
|
|
@@ -24,36 +50,33 @@ export class QiniuAI {
|
|
|
24
50
|
this.sys = new Tools(this);
|
|
25
51
|
}
|
|
26
52
|
/**
|
|
27
|
-
*
|
|
53
|
+
* Get the logger instance (for modules to use)
|
|
28
54
|
*/
|
|
29
|
-
|
|
55
|
+
getLogger() {
|
|
56
|
+
return this.logger;
|
|
57
|
+
}
|
|
58
|
+
/**
|
|
59
|
+
* Generic POST request wrapper with optional per-request options
|
|
60
|
+
*/
|
|
61
|
+
async post(endpoint, body, requestId, options) {
|
|
30
62
|
const url = `${this.baseUrl}${endpoint}`;
|
|
31
|
-
return request(url, {
|
|
32
|
-
method: 'POST',
|
|
33
|
-
headers: {
|
|
34
|
-
'Authorization': `Bearer ${this.apiKey}`,
|
|
35
|
-
},
|
|
36
|
-
body: JSON.stringify(body),
|
|
37
|
-
timeout: this.timeout,
|
|
38
|
-
});
|
|
63
|
+
return request(url, 'POST', body, this.requestContext, { ...options, requestId });
|
|
39
64
|
}
|
|
40
65
|
/**
|
|
41
|
-
* Generic GET request wrapper
|
|
66
|
+
* Generic GET request wrapper with optional per-request options
|
|
42
67
|
*/
|
|
43
|
-
async get(endpoint, params) {
|
|
68
|
+
async get(endpoint, params, requestId, options) {
|
|
44
69
|
const url = new URL(`${this.baseUrl}${endpoint}`);
|
|
45
70
|
if (params) {
|
|
46
71
|
Object.entries(params).forEach(([key, value]) => {
|
|
47
72
|
url.searchParams.append(key, value);
|
|
48
73
|
});
|
|
49
74
|
}
|
|
50
|
-
return request(url.toString(), {
|
|
51
|
-
method: 'GET',
|
|
52
|
-
headers: {
|
|
53
|
-
'Authorization': `Bearer ${this.apiKey}`,
|
|
54
|
-
},
|
|
55
|
-
timeout: this.timeout,
|
|
56
|
-
});
|
|
75
|
+
return request(url.toString(), 'GET', undefined, this.requestContext, { ...options, requestId });
|
|
57
76
|
}
|
|
58
77
|
}
|
|
78
|
+
// Re-export logger utilities
|
|
79
|
+
export { consoleLogger, noopLogger, createFilteredLogger };
|
|
80
|
+
// Re-export middleware utilities
|
|
81
|
+
export { defaultFetchAdapter, composeMiddleware, retryMiddleware, headersMiddleware, timingMiddleware };
|
|
59
82
|
//# sourceMappingURL=client.js.map
|
package/dist/index.d.ts
CHANGED
|
@@ -1,4 +1,5 @@
|
|
|
1
|
-
export { QiniuAI,
|
|
1
|
+
export { QiniuAI, consoleLogger, noopLogger, createFilteredLogger, defaultFetchAdapter, composeMiddleware, retryMiddleware, headersMiddleware, timingMiddleware, } from './client';
|
|
2
|
+
export type { QiniuAIOptions, Logger, LogLevel, FetchAdapter, Middleware, MiddlewareRequest, MiddlewareResponse, RequestOptions, } from './client';
|
|
2
3
|
export { APIError } from './lib/request';
|
|
3
4
|
export * from './lib/types';
|
|
4
5
|
export type { ChatCompletionRequest, ChatCompletionResponse, ChatCompletionChunk, ChatMessage, ContentPart, ToolCall } from './lib/types';
|
package/dist/index.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AACA,OAAO,
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AACA,OAAO,EACH,OAAO,EACP,aAAa,EACb,UAAU,EACV,oBAAoB,EACpB,mBAAmB,EACnB,iBAAiB,EACjB,eAAe,EACf,iBAAiB,EACjB,gBAAgB,GACnB,MAAM,UAAU,CAAC;AAElB,YAAY,EACR,cAAc,EACd,MAAM,EACN,QAAQ,EACR,YAAY,EACZ,UAAU,EACV,iBAAiB,EACjB,kBAAkB,EAClB,cAAc,GACjB,MAAM,UAAU,CAAC;AAGlB,OAAO,EAAE,QAAQ,EAAE,MAAM,eAAe,CAAC;AAGzC,cAAc,aAAa,CAAC;AAG5B,YAAY,EAAE,qBAAqB,EAAE,sBAAsB,EAAE,mBAAmB,EAAE,WAAW,EAAE,WAAW,EAAE,QAAQ,EAAE,MAAM,aAAa,CAAC;AAG1I,YAAY,EAAE,sBAAsB,EAAE,iBAAiB,EAAE,WAAW,IAAI,gBAAgB,EAAE,MAAM,iBAAiB,CAAC;AAGlH,YAAY,EAAE,sBAAsB,EAAE,iBAAiB,EAAE,WAAW,IAAI,gBAAgB,EAAE,MAAM,iBAAiB,CAAC;AAGlH,YAAY,EAAE,gBAAgB,EAAE,eAAe,EAAE,MAAM,iBAAiB,CAAC"}
|
package/dist/index.js
CHANGED
|
@@ -14,10 +14,18 @@ var __exportStar = (this && this.__exportStar) || function(m, exports) {
|
|
|
14
14
|
for (var p in m) if (p !== "default" && !Object.prototype.hasOwnProperty.call(exports, p)) __createBinding(exports, m, p);
|
|
15
15
|
};
|
|
16
16
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
17
|
-
exports.APIError = exports.QiniuAI = void 0;
|
|
17
|
+
exports.APIError = exports.timingMiddleware = exports.headersMiddleware = exports.retryMiddleware = exports.composeMiddleware = exports.defaultFetchAdapter = exports.createFilteredLogger = exports.noopLogger = exports.consoleLogger = exports.QiniuAI = void 0;
|
|
18
18
|
// Main client
|
|
19
19
|
var client_1 = require("./client");
|
|
20
20
|
Object.defineProperty(exports, "QiniuAI", { enumerable: true, get: function () { return client_1.QiniuAI; } });
|
|
21
|
+
Object.defineProperty(exports, "consoleLogger", { enumerable: true, get: function () { return client_1.consoleLogger; } });
|
|
22
|
+
Object.defineProperty(exports, "noopLogger", { enumerable: true, get: function () { return client_1.noopLogger; } });
|
|
23
|
+
Object.defineProperty(exports, "createFilteredLogger", { enumerable: true, get: function () { return client_1.createFilteredLogger; } });
|
|
24
|
+
Object.defineProperty(exports, "defaultFetchAdapter", { enumerable: true, get: function () { return client_1.defaultFetchAdapter; } });
|
|
25
|
+
Object.defineProperty(exports, "composeMiddleware", { enumerable: true, get: function () { return client_1.composeMiddleware; } });
|
|
26
|
+
Object.defineProperty(exports, "retryMiddleware", { enumerable: true, get: function () { return client_1.retryMiddleware; } });
|
|
27
|
+
Object.defineProperty(exports, "headersMiddleware", { enumerable: true, get: function () { return client_1.headersMiddleware; } });
|
|
28
|
+
Object.defineProperty(exports, "timingMiddleware", { enumerable: true, get: function () { return client_1.timingMiddleware; } });
|
|
21
29
|
// Error types
|
|
22
30
|
var request_1 = require("./lib/request");
|
|
23
31
|
Object.defineProperty(exports, "APIError", { enumerable: true, get: function () { return request_1.APIError; } });
|
package/dist/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;;AAAA,cAAc;AACd,
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;;AAAA,cAAc;AACd,mCAUkB;AATd,iGAAA,OAAO,OAAA;AACP,uGAAA,aAAa,OAAA;AACb,oGAAA,UAAU,OAAA;AACV,8GAAA,oBAAoB,OAAA;AACpB,6GAAA,mBAAmB,OAAA;AACnB,2GAAA,iBAAiB,OAAA;AACjB,yGAAA,eAAe,OAAA;AACf,2GAAA,iBAAiB,OAAA;AACjB,0GAAA,gBAAgB,OAAA;AAcpB,cAAc;AACd,yCAAyC;AAAhC,mGAAA,QAAQ,OAAA;AAEjB,eAAe;AACf,8CAA4B"}
|
package/dist/index.mjs
CHANGED
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
// Main client
|
|
2
|
-
export { QiniuAI } from './client.mjs';
|
|
2
|
+
export { QiniuAI, consoleLogger, noopLogger, createFilteredLogger, defaultFetchAdapter, composeMiddleware, retryMiddleware, headersMiddleware, timingMiddleware, } from './client.mjs';
|
|
3
3
|
// Error types
|
|
4
4
|
export { APIError } from './lib/request.mjs';
|
|
5
5
|
// Shared types
|
|
@@ -0,0 +1,27 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Logger interface for SDK observability.
|
|
3
|
+
* Users can provide their own logger (e.g., pino, winston, console).
|
|
4
|
+
*/
|
|
5
|
+
export interface Logger {
|
|
6
|
+
debug(message: string, meta?: Record<string, unknown>): void;
|
|
7
|
+
info(message: string, meta?: Record<string, unknown>): void;
|
|
8
|
+
warn(message: string, meta?: Record<string, unknown>): void;
|
|
9
|
+
error(message: string, meta?: Record<string, unknown>): void;
|
|
10
|
+
}
|
|
11
|
+
/**
|
|
12
|
+
* Default no-op logger (silent)
|
|
13
|
+
*/
|
|
14
|
+
export declare const noopLogger: Logger;
|
|
15
|
+
/**
|
|
16
|
+
* Console logger for development/debugging
|
|
17
|
+
*/
|
|
18
|
+
export declare const consoleLogger: Logger;
|
|
19
|
+
/**
|
|
20
|
+
* Log levels for filtering
|
|
21
|
+
*/
|
|
22
|
+
export type LogLevel = 'debug' | 'info' | 'warn' | 'error' | 'silent';
|
|
23
|
+
/**
|
|
24
|
+
* Creates a filtered logger that only logs messages at or above the specified level
|
|
25
|
+
*/
|
|
26
|
+
export declare function createFilteredLogger(baseLogger: Logger, level: LogLevel): Logger;
|
|
27
|
+
//# sourceMappingURL=logger.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"logger.d.ts","sourceRoot":"","sources":["../../src/lib/logger.ts"],"names":[],"mappings":"AAAA;;;GAGG;AACH,MAAM,WAAW,MAAM;IACnB,KAAK,CAAC,OAAO,EAAE,MAAM,EAAE,IAAI,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,IAAI,CAAC;IAC7D,IAAI,CAAC,OAAO,EAAE,MAAM,EAAE,IAAI,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,IAAI,CAAC;IAC5D,IAAI,CAAC,OAAO,EAAE,MAAM,EAAE,IAAI,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,IAAI,CAAC;IAC5D,KAAK,CAAC,OAAO,EAAE,MAAM,EAAE,IAAI,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,IAAI,CAAC;CAChE;AAED;;GAEG;AACH,eAAO,MAAM,UAAU,EAAE,MAKxB,CAAC;AAEF;;GAEG;AACH,eAAO,MAAM,aAAa,EAAE,MAK3B,CAAC;AAEF;;GAEG;AACH,MAAM,MAAM,QAAQ,GAAG,OAAO,GAAG,MAAM,GAAG,MAAM,GAAG,OAAO,GAAG,QAAQ,CAAC;AAUtE;;GAEG;AACH,wBAAgB,oBAAoB,CAAC,UAAU,EAAE,MAAM,EAAE,KAAK,EAAE,QAAQ,GAAG,MAAM,CAyBhF"}
|
|
@@ -0,0 +1,58 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.consoleLogger = exports.noopLogger = void 0;
|
|
4
|
+
exports.createFilteredLogger = createFilteredLogger;
|
|
5
|
+
/**
|
|
6
|
+
* Default no-op logger (silent)
|
|
7
|
+
*/
|
|
8
|
+
exports.noopLogger = {
|
|
9
|
+
debug: () => { },
|
|
10
|
+
info: () => { },
|
|
11
|
+
warn: () => { },
|
|
12
|
+
error: () => { },
|
|
13
|
+
};
|
|
14
|
+
/**
|
|
15
|
+
* Console logger for development/debugging
|
|
16
|
+
*/
|
|
17
|
+
exports.consoleLogger = {
|
|
18
|
+
debug: (msg, meta) => console.debug(`[QiniuAI:DEBUG] ${msg}`, meta ?? ''),
|
|
19
|
+
info: (msg, meta) => console.info(`[QiniuAI:INFO] ${msg}`, meta ?? ''),
|
|
20
|
+
warn: (msg, meta) => console.warn(`[QiniuAI:WARN] ${msg}`, meta ?? ''),
|
|
21
|
+
error: (msg, meta) => console.error(`[QiniuAI:ERROR] ${msg}`, meta ?? ''),
|
|
22
|
+
};
|
|
23
|
+
const LOG_LEVEL_PRIORITY = {
|
|
24
|
+
debug: 0,
|
|
25
|
+
info: 1,
|
|
26
|
+
warn: 2,
|
|
27
|
+
error: 3,
|
|
28
|
+
silent: 4,
|
|
29
|
+
};
|
|
30
|
+
/**
|
|
31
|
+
* Creates a filtered logger that only logs messages at or above the specified level
|
|
32
|
+
*/
|
|
33
|
+
function createFilteredLogger(baseLogger, level) {
|
|
34
|
+
const minPriority = LOG_LEVEL_PRIORITY[level];
|
|
35
|
+
return {
|
|
36
|
+
debug: (msg, meta) => {
|
|
37
|
+
if (LOG_LEVEL_PRIORITY.debug >= minPriority) {
|
|
38
|
+
baseLogger.debug(msg, meta);
|
|
39
|
+
}
|
|
40
|
+
},
|
|
41
|
+
info: (msg, meta) => {
|
|
42
|
+
if (LOG_LEVEL_PRIORITY.info >= minPriority) {
|
|
43
|
+
baseLogger.info(msg, meta);
|
|
44
|
+
}
|
|
45
|
+
},
|
|
46
|
+
warn: (msg, meta) => {
|
|
47
|
+
if (LOG_LEVEL_PRIORITY.warn >= minPriority) {
|
|
48
|
+
baseLogger.warn(msg, meta);
|
|
49
|
+
}
|
|
50
|
+
},
|
|
51
|
+
error: (msg, meta) => {
|
|
52
|
+
if (LOG_LEVEL_PRIORITY.error >= minPriority) {
|
|
53
|
+
baseLogger.error(msg, meta);
|
|
54
|
+
}
|
|
55
|
+
},
|
|
56
|
+
};
|
|
57
|
+
}
|
|
58
|
+
//# sourceMappingURL=logger.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"logger.js","sourceRoot":"","sources":["../../src/lib/logger.ts"],"names":[],"mappings":";;;AA+CA,oDAyBC;AA7DD;;GAEG;AACU,QAAA,UAAU,GAAW;IAC9B,KAAK,EAAE,GAAG,EAAE,GAAG,CAAC;IAChB,IAAI,EAAE,GAAG,EAAE,GAAG,CAAC;IACf,IAAI,EAAE,GAAG,EAAE,GAAG,CAAC;IACf,KAAK,EAAE,GAAG,EAAE,GAAG,CAAC;CACnB,CAAC;AAEF;;GAEG;AACU,QAAA,aAAa,GAAW;IACjC,KAAK,EAAE,CAAC,GAAG,EAAE,IAAI,EAAE,EAAE,CAAC,OAAO,CAAC,KAAK,CAAC,mBAAmB,GAAG,EAAE,EAAE,IAAI,IAAI,EAAE,CAAC;IACzE,IAAI,EAAE,CAAC,GAAG,EAAE,IAAI,EAAE,EAAE,CAAC,OAAO,CAAC,IAAI,CAAC,kBAAkB,GAAG,EAAE,EAAE,IAAI,IAAI,EAAE,CAAC;IACtE,IAAI,EAAE,CAAC,GAAG,EAAE,IAAI,EAAE,EAAE,CAAC,OAAO,CAAC,IAAI,CAAC,kBAAkB,GAAG,EAAE,EAAE,IAAI,IAAI,EAAE,CAAC;IACtE,KAAK,EAAE,CAAC,GAAG,EAAE,IAAI,EAAE,EAAE,CAAC,OAAO,CAAC,KAAK,CAAC,mBAAmB,GAAG,EAAE,EAAE,IAAI,IAAI,EAAE,CAAC;CAC5E,CAAC;AAOF,MAAM,kBAAkB,GAA6B;IACjD,KAAK,EAAE,CAAC;IACR,IAAI,EAAE,CAAC;IACP,IAAI,EAAE,CAAC;IACP,KAAK,EAAE,CAAC;IACR,MAAM,EAAE,CAAC;CACZ,CAAC;AAEF;;GAEG;AACH,SAAgB,oBAAoB,CAAC,UAAkB,EAAE,KAAe;IACpE,MAAM,WAAW,GAAG,kBAAkB,CAAC,KAAK,CAAC,CAAC;IAE9C,OAAO;QACH,KAAK,EAAE,CAAC,GAAG,EAAE,IAAI,EAAE,EAAE;YACjB,IAAI,kBAAkB,CAAC,KAAK,IAAI,WAAW,EAAE,CAAC;gBAC1C,UAAU,CAAC,KAAK,CAAC,GAAG,EAAE,IAAI,CAAC,CAAC;YAChC,CAAC;QACL,CAAC;QACD,IAAI,EAAE,CAAC,GAAG,EAAE,IAAI,EAAE,EAAE;YAChB,IAAI,kBAAkB,CAAC,IAAI,IAAI,WAAW,EAAE,CAAC;gBACzC,UAAU,CAAC,IAAI,CAAC,GAAG,EAAE,IAAI,CAAC,CAAC;YAC/B,CAAC;QACL,CAAC;QACD,IAAI,EAAE,CAAC,GAAG,EAAE,IAAI,EAAE,EAAE;YAChB,IAAI,kBAAkB,CAAC,IAAI,IAAI,WAAW,EAAE,CAAC;gBACzC,UAAU,CAAC,IAAI,CAAC,GAAG,EAAE,IAAI,CAAC,CAAC;YAC/B,CAAC;QACL,CAAC;QACD,KAAK,EAAE,CAAC,GAAG,EAAE,IAAI,EAAE,EAAE;YACjB,IAAI,kBAAkB,CAAC,KAAK,IAAI,WAAW,EAAE,CAAC;gBAC1C,UAAU,CAAC,KAAK,CAAC,GAAG,EAAE,IAAI,CAAC,CAAC;YAChC,CAAC;QACL,CAAC;KACJ,CAAC;AACN,CAAC"}
|
|
@@ -0,0 +1,54 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Default no-op logger (silent)
|
|
3
|
+
*/
|
|
4
|
+
export const noopLogger = {
|
|
5
|
+
debug: () => { },
|
|
6
|
+
info: () => { },
|
|
7
|
+
warn: () => { },
|
|
8
|
+
error: () => { },
|
|
9
|
+
};
|
|
10
|
+
/**
|
|
11
|
+
* Console logger for development/debugging
|
|
12
|
+
*/
|
|
13
|
+
export const consoleLogger = {
|
|
14
|
+
debug: (msg, meta) => console.debug(`[QiniuAI:DEBUG] ${msg}`, meta ?? ''),
|
|
15
|
+
info: (msg, meta) => console.info(`[QiniuAI:INFO] ${msg}`, meta ?? ''),
|
|
16
|
+
warn: (msg, meta) => console.warn(`[QiniuAI:WARN] ${msg}`, meta ?? ''),
|
|
17
|
+
error: (msg, meta) => console.error(`[QiniuAI:ERROR] ${msg}`, meta ?? ''),
|
|
18
|
+
};
|
|
19
|
+
const LOG_LEVEL_PRIORITY = {
|
|
20
|
+
debug: 0,
|
|
21
|
+
info: 1,
|
|
22
|
+
warn: 2,
|
|
23
|
+
error: 3,
|
|
24
|
+
silent: 4,
|
|
25
|
+
};
|
|
26
|
+
/**
|
|
27
|
+
* Creates a filtered logger that only logs messages at or above the specified level
|
|
28
|
+
*/
|
|
29
|
+
export function createFilteredLogger(baseLogger, level) {
|
|
30
|
+
const minPriority = LOG_LEVEL_PRIORITY[level];
|
|
31
|
+
return {
|
|
32
|
+
debug: (msg, meta) => {
|
|
33
|
+
if (LOG_LEVEL_PRIORITY.debug >= minPriority) {
|
|
34
|
+
baseLogger.debug(msg, meta);
|
|
35
|
+
}
|
|
36
|
+
},
|
|
37
|
+
info: (msg, meta) => {
|
|
38
|
+
if (LOG_LEVEL_PRIORITY.info >= minPriority) {
|
|
39
|
+
baseLogger.info(msg, meta);
|
|
40
|
+
}
|
|
41
|
+
},
|
|
42
|
+
warn: (msg, meta) => {
|
|
43
|
+
if (LOG_LEVEL_PRIORITY.warn >= minPriority) {
|
|
44
|
+
baseLogger.warn(msg, meta);
|
|
45
|
+
}
|
|
46
|
+
},
|
|
47
|
+
error: (msg, meta) => {
|
|
48
|
+
if (LOG_LEVEL_PRIORITY.error >= minPriority) {
|
|
49
|
+
baseLogger.error(msg, meta);
|
|
50
|
+
}
|
|
51
|
+
},
|
|
52
|
+
};
|
|
53
|
+
}
|
|
54
|
+
//# sourceMappingURL=logger.js.map
|
|
@@ -0,0 +1,58 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* FetchAdapter interface for custom HTTP implementations.
|
|
3
|
+
* Allows users to replace the default fetch with axios, got, undici, etc.
|
|
4
|
+
*/
|
|
5
|
+
export interface FetchAdapter {
|
|
6
|
+
fetch(url: string, init: RequestInit): Promise<Response>;
|
|
7
|
+
}
|
|
8
|
+
/**
|
|
9
|
+
* Default adapter using native fetch
|
|
10
|
+
*/
|
|
11
|
+
export declare const defaultFetchAdapter: FetchAdapter;
|
|
12
|
+
/**
|
|
13
|
+
* Request object passed through middleware chain
|
|
14
|
+
*/
|
|
15
|
+
export interface MiddlewareRequest {
|
|
16
|
+
url: string;
|
|
17
|
+
method: string;
|
|
18
|
+
headers: Record<string, string>;
|
|
19
|
+
body?: string;
|
|
20
|
+
timeout: number;
|
|
21
|
+
endpoint: string;
|
|
22
|
+
requestId: string;
|
|
23
|
+
}
|
|
24
|
+
/**
|
|
25
|
+
* Response object from middleware chain
|
|
26
|
+
*/
|
|
27
|
+
export interface MiddlewareResponse {
|
|
28
|
+
status: number;
|
|
29
|
+
headers: Record<string, string>;
|
|
30
|
+
data: unknown;
|
|
31
|
+
requestId: string;
|
|
32
|
+
duration: number;
|
|
33
|
+
}
|
|
34
|
+
/**
|
|
35
|
+
* Middleware function type.
|
|
36
|
+
* Can modify request before sending, and response after receiving.
|
|
37
|
+
*/
|
|
38
|
+
export type Middleware = (request: MiddlewareRequest, next: (request: MiddlewareRequest) => Promise<MiddlewareResponse>) => Promise<MiddlewareResponse>;
|
|
39
|
+
/**
|
|
40
|
+
* Compose multiple middlewares into a single middleware chain
|
|
41
|
+
*/
|
|
42
|
+
export declare function composeMiddleware(middlewares: Middleware[]): Middleware;
|
|
43
|
+
/**
|
|
44
|
+
* Built-in middleware: Retry on 5xx errors
|
|
45
|
+
*/
|
|
46
|
+
export declare function retryMiddleware(options?: {
|
|
47
|
+
maxRetries?: number;
|
|
48
|
+
retryDelay?: number;
|
|
49
|
+
}): Middleware;
|
|
50
|
+
/**
|
|
51
|
+
* Built-in middleware: Add custom headers to all requests
|
|
52
|
+
*/
|
|
53
|
+
export declare function headersMiddleware(headers: Record<string, string>): Middleware;
|
|
54
|
+
/**
|
|
55
|
+
* Built-in middleware: Request/response timing
|
|
56
|
+
*/
|
|
57
|
+
export declare function timingMiddleware(onTiming: (endpoint: string, duration: number, status: number) => void): Middleware;
|
|
58
|
+
//# sourceMappingURL=middleware.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"middleware.d.ts","sourceRoot":"","sources":["../../src/lib/middleware.ts"],"names":[],"mappings":"AAAA;;;GAGG;AACH,MAAM,WAAW,YAAY;IACzB,KAAK,CAAC,GAAG,EAAE,MAAM,EAAE,IAAI,EAAE,WAAW,GAAG,OAAO,CAAC,QAAQ,CAAC,CAAC;CAC5D;AAED;;GAEG;AACH,eAAO,MAAM,mBAAmB,EAAE,YAEjC,CAAC;AAEF;;GAEG;AACH,MAAM,WAAW,iBAAiB;IAC9B,GAAG,EAAE,MAAM,CAAC;IACZ,MAAM,EAAE,MAAM,CAAC;IACf,OAAO,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IAChC,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,OAAO,EAAE,MAAM,CAAC;IAChB,QAAQ,EAAE,MAAM,CAAC;IACjB,SAAS,EAAE,MAAM,CAAC;CACrB;AAED;;GAEG;AACH,MAAM,WAAW,kBAAkB;IAC/B,MAAM,EAAE,MAAM,CAAC;IACf,OAAO,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IAChC,IAAI,EAAE,OAAO,CAAC;IACd,SAAS,EAAE,MAAM,CAAC;IAClB,QAAQ,EAAE,MAAM,CAAC;CACpB;AAED;;;GAGG;AACH,MAAM,MAAM,UAAU,GAAG,CACrB,OAAO,EAAE,iBAAiB,EAC1B,IAAI,EAAE,CAAC,OAAO,EAAE,iBAAiB,KAAK,OAAO,CAAC,kBAAkB,CAAC,KAChE,OAAO,CAAC,kBAAkB,CAAC,CAAC;AAEjC;;GAEG;AACH,wBAAgB,iBAAiB,CAAC,WAAW,EAAE,UAAU,EAAE,GAAG,UAAU,CAoBvE;AAED;;GAEG;AACH,wBAAgB,eAAe,CAAC,OAAO,GAAE;IAAE,UAAU,CAAC,EAAE,MAAM,CAAC;IAAC,UAAU,CAAC,EAAE,MAAM,CAAA;CAAO,GAAG,UAAU,CA4BtG;AAED;;GAEG;AACH,wBAAgB,iBAAiB,CAAC,OAAO,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,GAAG,UAAU,CAU7E;AAED;;GAEG;AACH,wBAAgB,gBAAgB,CAC5B,QAAQ,EAAE,CAAC,QAAQ,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,KAAK,IAAI,GACvE,UAAU,CAMZ"}
|