@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.
Files changed (41) hide show
  1. package/README.md +104 -0
  2. package/dist/client.d.ts +38 -4
  3. package/dist/client.d.ts.map +1 -1
  4. package/dist/client.js +47 -20
  5. package/dist/client.js.map +1 -1
  6. package/dist/client.mjs +42 -19
  7. package/dist/index.d.ts +2 -1
  8. package/dist/index.d.ts.map +1 -1
  9. package/dist/index.js +9 -1
  10. package/dist/index.js.map +1 -1
  11. package/dist/index.mjs +1 -1
  12. package/dist/lib/logger.d.ts +27 -0
  13. package/dist/lib/logger.d.ts.map +1 -0
  14. package/dist/lib/logger.js +58 -0
  15. package/dist/lib/logger.js.map +1 -0
  16. package/dist/lib/logger.mjs +54 -0
  17. package/dist/lib/middleware.d.ts +58 -0
  18. package/dist/lib/middleware.d.ts.map +1 -0
  19. package/dist/lib/middleware.js +85 -0
  20. package/dist/lib/middleware.js.map +1 -0
  21. package/dist/lib/middleware.mjs +78 -0
  22. package/dist/lib/request.d.ts +21 -4
  23. package/dist/lib/request.d.ts.map +1 -1
  24. package/dist/lib/request.js +138 -36
  25. package/dist/lib/request.js.map +1 -1
  26. package/dist/lib/request.mjs +138 -36
  27. package/dist/lib/types.d.ts +5 -2
  28. package/dist/lib/types.d.ts.map +1 -1
  29. package/dist/modules/image/index.d.ts.map +1 -1
  30. package/dist/modules/image/index.js +16 -2
  31. package/dist/modules/image/index.js.map +1 -1
  32. package/dist/modules/image/index.mjs +16 -2
  33. package/dist/modules/tools/index.d.ts.map +1 -1
  34. package/dist/modules/tools/index.js +2 -1
  35. package/dist/modules/tools/index.js.map +1 -1
  36. package/dist/modules/tools/index.mjs +2 -1
  37. package/dist/modules/video/index.d.ts.map +1 -1
  38. package/dist/modules/video/index.js +16 -2
  39. package/dist/modules/video/index.js.map +1 -1
  40. package/dist/modules/video/index.mjs +16 -2
  41. 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
- * Generic POST request wrapper
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: any): Promise<T>;
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>): Promise<T>;
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
@@ -1 +1 @@
1
- {"version":3,"file":"client.d.ts","sourceRoot":"","sources":["../src/client.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,YAAY,EAAE,MAAM,aAAa,CAAC;AAC3C,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;CACpB;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;gBAEZ,OAAO,EAAE,cAAc;IAwBnC;;OAEG;IACG,IAAI,CAAC,CAAC,EAAE,QAAQ,EAAE,MAAM,EAAE,IAAI,EAAE,GAAG,GAAG,OAAO,CAAC,CAAC,CAAC;IAYtD;;OAEG;IACG,GAAG,CAAC,CAAC,EAAE,QAAQ,EAAE,MAAM,EAAE,MAAM,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,GAAG,OAAO,CAAC,CAAC,CAAC;CAgB9E"}
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
- * Generic POST request wrapper
64
+ * Get the logger instance (for modules to use)
31
65
  */
32
- async post(endpoint, body) {
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;
@@ -1 +1 @@
1
- {"version":3,"file":"client.js","sourceRoot":"","sources":["../src/client.ts"],"names":[],"mappings":";;;AAAA,2CAAwC;AAExC,yCAAsC;AACtC,2CAAwC;AACxC,2CAAwC;AACxC,2CAAwC;AAQxC,MAAa,OAAO;IAUhB,YAAY,OAAuB;QAC/B,sBAAsB;QACtB,IAAI,CAAC,OAAO,CAAC,MAAM,IAAI,OAAO,OAAO,CAAC,MAAM,KAAK,QAAQ,IAAI,CAAC,OAAO,CAAC,MAAM,CAAC,IAAI,EAAE,EAAE,CAAC;YAClF,MAAM,IAAI,KAAK,CAAC,oDAAoD,CAAC,CAAC;QAC1E,CAAC;QAED,IAAI,CAAC,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC,IAAI,EAAE,CAAC;QAEpC,6CAA6C;QAC7C,IAAI,OAAO,GAAG,OAAO,CAAC,OAAO,IAAI,2BAA2B,CAAC;QAC7D,IAAI,CAAC,OAAO,GAAG,OAAO,CAAC,OAAO,CAAC,MAAM,EAAE,EAAE,CAAC,CAAC;QAE3C,IAAI,CAAC,OAAO,GAAG,OAAO,CAAC,OAAO,IAAI,KAAK,CAAC;QACxC,IAAI,IAAI,CAAC,OAAO,IAAI,CAAC,EAAE,CAAC;YACpB,MAAM,IAAI,KAAK,CAAC,mCAAmC,CAAC,CAAC;QACzD,CAAC;QAED,qBAAqB;QACrB,IAAI,CAAC,IAAI,GAAG,IAAI,WAAI,CAAC,IAAI,CAAC,CAAC;QAC3B,IAAI,CAAC,KAAK,GAAG,IAAI,aAAK,CAAC,IAAI,CAAC,CAAC;QAC7B,IAAI,CAAC,KAAK,GAAG,IAAI,aAAK,CAAC,IAAI,CAAC,CAAC;QAC7B,IAAI,CAAC,GAAG,GAAG,IAAI,aAAK,CAAC,IAAI,CAAC,CAAC;IAC/B,CAAC;IAED;;OAEG;IACH,KAAK,CAAC,IAAI,CAAI,QAAgB,EAAE,IAAS;QACrC,MAAM,GAAG,GAAG,GAAG,IAAI,CAAC,OAAO,GAAG,QAAQ,EAAE,CAAC;QACzC,OAAO,IAAA,iBAAO,EAAI,GAAG,EAAE;YACnB,MAAM,EAAE,MAAM;YACd,OAAO,EAAE;gBACL,eAAe,EAAE,UAAU,IAAI,CAAC,MAAM,EAAE;aAC3C;YACD,IAAI,EAAE,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC;YAC1B,OAAO,EAAE,IAAI,CAAC,OAAO;SACxB,CAAC,CAAC;IACP,CAAC;IAED;;OAEG;IACH,KAAK,CAAC,GAAG,CAAI,QAAgB,EAAE,MAA+B;QAC1D,MAAM,GAAG,GAAG,IAAI,GAAG,CAAC,GAAG,IAAI,CAAC,OAAO,GAAG,QAAQ,EAAE,CAAC,CAAC;QAClD,IAAI,MAAM,EAAE,CAAC;YACT,MAAM,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,GAAG,EAAE,KAAK,CAAC,EAAE,EAAE;gBAC5C,GAAG,CAAC,YAAY,CAAC,MAAM,CAAC,GAAG,EAAE,KAAK,CAAC,CAAC;YACxC,CAAC,CAAC,CAAC;QACP,CAAC;QAED,OAAO,IAAA,iBAAO,EAAI,GAAG,CAAC,QAAQ,EAAE,EAAE;YAC9B,MAAM,EAAE,KAAK;YACb,OAAO,EAAE;gBACL,eAAe,EAAE,UAAU,IAAI,CAAC,MAAM,EAAE;aAC3C;YACD,OAAO,EAAE,IAAI,CAAC,OAAO;SACxB,CAAC,CAAC;IACP,CAAC;CACJ;AApED,0BAoEC"}
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
- * Generic POST request wrapper
53
+ * Get the logger instance (for modules to use)
28
54
  */
29
- async post(endpoint, body) {
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, QiniuAIOptions } from './client';
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';
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,OAAO,EAAE,cAAc,EAAE,MAAM,UAAU,CAAC;AAGnD,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"}
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,mCAAmD;AAA1C,iGAAA,OAAO,OAAA;AAEhB,cAAc;AACd,yCAAyC;AAAhC,mGAAA,QAAQ,OAAA;AAEjB,eAAe;AACf,8CAA4B"}
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"}