@plolink/sdk 0.0.4
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 +259 -0
- package/dist/chunk-4H4RACSE.js +335 -0
- package/dist/chunk-4H4RACSE.js.map +1 -0
- package/dist/chunk-IHAAKFEJ.js +219 -0
- package/dist/chunk-IHAAKFEJ.js.map +1 -0
- package/dist/chunk-JR4HYYQI.cjs +221 -0
- package/dist/chunk-JR4HYYQI.cjs.map +1 -0
- package/dist/chunk-MD4O7FWT.js +46 -0
- package/dist/chunk-MD4O7FWT.js.map +1 -0
- package/dist/chunk-NS3DJP2O.cjs +349 -0
- package/dist/chunk-NS3DJP2O.cjs.map +1 -0
- package/dist/chunk-Y3UJVC2L.cjs +48 -0
- package/dist/chunk-Y3UJVC2L.cjs.map +1 -0
- package/dist/client-CAjIQKPm.d.cts +193 -0
- package/dist/client-CwNikk7i.d.ts +193 -0
- package/dist/common/index.cjs +65 -0
- package/dist/common/index.cjs.map +1 -0
- package/dist/common/index.d.cts +422 -0
- package/dist/common/index.d.ts +422 -0
- package/dist/common/index.js +4 -0
- package/dist/common/index.js.map +1 -0
- package/dist/core-77EbLgbp.d.cts +97 -0
- package/dist/core-77EbLgbp.d.ts +97 -0
- package/dist/index.cjs +350 -0
- package/dist/index.cjs.map +1 -0
- package/dist/index.d.cts +98 -0
- package/dist/index.d.ts +98 -0
- package/dist/index.js +306 -0
- package/dist/index.js.map +1 -0
- package/dist/modules/agent/index.cjs +21 -0
- package/dist/modules/agent/index.cjs.map +1 -0
- package/dist/modules/agent/index.d.cts +71 -0
- package/dist/modules/agent/index.d.ts +71 -0
- package/dist/modules/agent/index.js +19 -0
- package/dist/modules/agent/index.js.map +1 -0
- package/dist/modules/billing/index.cjs +413 -0
- package/dist/modules/billing/index.cjs.map +1 -0
- package/dist/modules/billing/index.d.cts +538 -0
- package/dist/modules/billing/index.d.ts +538 -0
- package/dist/modules/billing/index.js +411 -0
- package/dist/modules/billing/index.js.map +1 -0
- package/dist/modules/chat/index.cjs +20 -0
- package/dist/modules/chat/index.cjs.map +1 -0
- package/dist/modules/chat/index.d.cts +68 -0
- package/dist/modules/chat/index.d.ts +68 -0
- package/dist/modules/chat/index.js +18 -0
- package/dist/modules/chat/index.js.map +1 -0
- package/dist/modules/psych/index.cjs +20 -0
- package/dist/modules/psych/index.cjs.map +1 -0
- package/dist/modules/psych/index.d.cts +69 -0
- package/dist/modules/psych/index.d.ts +69 -0
- package/dist/modules/psych/index.js +18 -0
- package/dist/modules/psych/index.js.map +1 -0
- package/dist/modules/rbac/index.cjs +197 -0
- package/dist/modules/rbac/index.cjs.map +1 -0
- package/dist/modules/rbac/index.d.cts +293 -0
- package/dist/modules/rbac/index.d.ts +293 -0
- package/dist/modules/rbac/index.js +195 -0
- package/dist/modules/rbac/index.js.map +1 -0
- package/dist/modules/team/index.cjs +54 -0
- package/dist/modules/team/index.cjs.map +1 -0
- package/dist/modules/team/index.d.cts +91 -0
- package/dist/modules/team/index.d.ts +91 -0
- package/dist/modules/team/index.js +52 -0
- package/dist/modules/team/index.js.map +1 -0
- package/dist/modules/virtual-account/index.cjs +293 -0
- package/dist/modules/virtual-account/index.cjs.map +1 -0
- package/dist/modules/virtual-account/index.d.cts +366 -0
- package/dist/modules/virtual-account/index.d.ts +366 -0
- package/dist/modules/virtual-account/index.js +291 -0
- package/dist/modules/virtual-account/index.js.map +1 -0
- package/dist/poller-BlIRbwL4.d.cts +201 -0
- package/dist/poller-DWKZjuSw.d.ts +201 -0
- package/dist/shared-6ZepUSPW.d.cts +31 -0
- package/dist/shared-6ZepUSPW.d.ts +31 -0
- package/package.json +96 -0
package/dist/index.cjs
ADDED
|
@@ -0,0 +1,350 @@
|
|
|
1
|
+
'use strict';
|
|
2
|
+
|
|
3
|
+
var chunkNS3DJP2O_cjs = require('./chunk-NS3DJP2O.cjs');
|
|
4
|
+
var chunkJR4HYYQI_cjs = require('./chunk-JR4HYYQI.cjs');
|
|
5
|
+
var chunkY3UJVC2L_cjs = require('./chunk-Y3UJVC2L.cjs');
|
|
6
|
+
var axios = require('axios');
|
|
7
|
+
|
|
8
|
+
function _interopDefault (e) { return e && e.__esModule ? e : { default: e }; }
|
|
9
|
+
|
|
10
|
+
var axios__default = /*#__PURE__*/_interopDefault(axios);
|
|
11
|
+
|
|
12
|
+
// src/core/logger.ts
|
|
13
|
+
var InternalLogger = class _InternalLogger {
|
|
14
|
+
/**
|
|
15
|
+
* 创建一个 InternalLogger 实例
|
|
16
|
+
*
|
|
17
|
+
* @param userLogger - 用户自定义的日志钩子函数
|
|
18
|
+
*/
|
|
19
|
+
constructor(userLogger) {
|
|
20
|
+
this.userLogger = userLogger;
|
|
21
|
+
this.isDebugEnabled = typeof process !== "undefined" && process.env?.PLOLINK_SDK_DEBUG === "true";
|
|
22
|
+
}
|
|
23
|
+
/**
|
|
24
|
+
* 记录信息级别日志
|
|
25
|
+
*
|
|
26
|
+
* @param message - 日志消息
|
|
27
|
+
* @param context - 附加上下文数据
|
|
28
|
+
*/
|
|
29
|
+
info(message, context) {
|
|
30
|
+
this.log("info", message, context);
|
|
31
|
+
}
|
|
32
|
+
/**
|
|
33
|
+
* 记录警告级别日志
|
|
34
|
+
*
|
|
35
|
+
* @param message - 日志消息
|
|
36
|
+
* @param context - 附加上下文数据
|
|
37
|
+
*/
|
|
38
|
+
warn(message, context) {
|
|
39
|
+
this.log("warn", message, context);
|
|
40
|
+
}
|
|
41
|
+
/**
|
|
42
|
+
* 记录错误级别日志
|
|
43
|
+
*
|
|
44
|
+
* @param message - 日志消息
|
|
45
|
+
* @param context - 附加上下文数据
|
|
46
|
+
*/
|
|
47
|
+
error(message, context) {
|
|
48
|
+
this.log("error", message, context);
|
|
49
|
+
}
|
|
50
|
+
/**
|
|
51
|
+
* 记录调试级别日志
|
|
52
|
+
* 只有在 debug 模式下才会输出
|
|
53
|
+
*
|
|
54
|
+
* @param message - 日志消息
|
|
55
|
+
* @param context - 附加上下文数据
|
|
56
|
+
*/
|
|
57
|
+
debug(message, context) {
|
|
58
|
+
if (this.isDebugEnabled) {
|
|
59
|
+
this.log("debug", message, context);
|
|
60
|
+
}
|
|
61
|
+
}
|
|
62
|
+
/**
|
|
63
|
+
* 内部日志记录方法
|
|
64
|
+
*
|
|
65
|
+
* @param level - 日志级别
|
|
66
|
+
* @param message - 日志消息
|
|
67
|
+
* @param context - 附加上下文数据
|
|
68
|
+
*/
|
|
69
|
+
log(level, message, context) {
|
|
70
|
+
const formattedMessage = `[Plolink SDK] ${message}`;
|
|
71
|
+
if (this.userLogger) {
|
|
72
|
+
this.userLogger(level, formattedMessage, context);
|
|
73
|
+
return;
|
|
74
|
+
}
|
|
75
|
+
const logData = context ? [formattedMessage, context] : [formattedMessage];
|
|
76
|
+
switch (level) {
|
|
77
|
+
case "info":
|
|
78
|
+
case "debug":
|
|
79
|
+
console.log(...logData);
|
|
80
|
+
break;
|
|
81
|
+
case "warn":
|
|
82
|
+
console.warn(...logData);
|
|
83
|
+
break;
|
|
84
|
+
case "error":
|
|
85
|
+
console.error(...logData);
|
|
86
|
+
break;
|
|
87
|
+
}
|
|
88
|
+
}
|
|
89
|
+
/**
|
|
90
|
+
* 创建一个带有固定上下文的子 logger
|
|
91
|
+
*
|
|
92
|
+
* @param context - 固定的上下文数据
|
|
93
|
+
* @returns 新的 logger 实例
|
|
94
|
+
*
|
|
95
|
+
* @example
|
|
96
|
+
* ```typescript
|
|
97
|
+
* const logger = new InternalLogger();
|
|
98
|
+
* const moduleLogger = logger.withContext({ module: 'billing' });
|
|
99
|
+
* moduleLogger.info('Payment processed'); // 日志会自动带上 module: 'billing'
|
|
100
|
+
* ```
|
|
101
|
+
*/
|
|
102
|
+
withContext(context) {
|
|
103
|
+
const parentLogger = this.userLogger;
|
|
104
|
+
const wrappedLogger = (level, message, data) => {
|
|
105
|
+
const mergedData = { ...context, ...data || {} };
|
|
106
|
+
if (parentLogger) {
|
|
107
|
+
parentLogger(level, message, mergedData);
|
|
108
|
+
} else {
|
|
109
|
+
const formattedMessage = `[Plolink SDK] ${message}`;
|
|
110
|
+
const logData = [formattedMessage, mergedData];
|
|
111
|
+
switch (level) {
|
|
112
|
+
case "info":
|
|
113
|
+
case "debug":
|
|
114
|
+
console.log(...logData);
|
|
115
|
+
break;
|
|
116
|
+
case "warn":
|
|
117
|
+
console.warn(...logData);
|
|
118
|
+
break;
|
|
119
|
+
case "error":
|
|
120
|
+
console.error(...logData);
|
|
121
|
+
break;
|
|
122
|
+
}
|
|
123
|
+
}
|
|
124
|
+
};
|
|
125
|
+
return new _InternalLogger(wrappedLogger);
|
|
126
|
+
}
|
|
127
|
+
};
|
|
128
|
+
function createAxiosInstance(config, logger) {
|
|
129
|
+
const instance = axios__default.default.create({
|
|
130
|
+
baseURL: config.baseUrl,
|
|
131
|
+
timeout: config.timeout,
|
|
132
|
+
headers: {
|
|
133
|
+
"Content-Type": "application/json"
|
|
134
|
+
}
|
|
135
|
+
});
|
|
136
|
+
instance.interceptors.request.use(
|
|
137
|
+
(requestConfig) => {
|
|
138
|
+
const method = requestConfig.method?.toUpperCase() || "GET";
|
|
139
|
+
const url = requestConfig.url || "";
|
|
140
|
+
logger.debug(`Request: ${method} ${url}`, {
|
|
141
|
+
// eslint-disable-next-line @typescript-eslint/no-unsafe-assignment
|
|
142
|
+
params: requestConfig.params,
|
|
143
|
+
// eslint-disable-next-line @typescript-eslint/no-unsafe-assignment
|
|
144
|
+
data: requestConfig.data
|
|
145
|
+
});
|
|
146
|
+
if (config.token) {
|
|
147
|
+
requestConfig.headers = requestConfig.headers || {};
|
|
148
|
+
requestConfig.headers["Authorization"] = `Bearer ${config.token}`;
|
|
149
|
+
}
|
|
150
|
+
return requestConfig;
|
|
151
|
+
},
|
|
152
|
+
(error) => {
|
|
153
|
+
logger.error("Request interceptor error", { error: error.message });
|
|
154
|
+
return Promise.reject(error);
|
|
155
|
+
}
|
|
156
|
+
);
|
|
157
|
+
instance.interceptors.response.use(
|
|
158
|
+
(response) => {
|
|
159
|
+
const { code, data, message } = response.data;
|
|
160
|
+
logger.debug(`Response: ${response.config.method?.toUpperCase()} ${response.config.url}`, {
|
|
161
|
+
code,
|
|
162
|
+
message
|
|
163
|
+
});
|
|
164
|
+
if (code !== 200 && code !== 0) {
|
|
165
|
+
const error = new chunkY3UJVC2L_cjs.PlolinkError(
|
|
166
|
+
message || "Unknown business error",
|
|
167
|
+
code,
|
|
168
|
+
data
|
|
169
|
+
);
|
|
170
|
+
logger.error("Business error", {
|
|
171
|
+
code,
|
|
172
|
+
message,
|
|
173
|
+
data
|
|
174
|
+
});
|
|
175
|
+
throw error;
|
|
176
|
+
}
|
|
177
|
+
return data;
|
|
178
|
+
},
|
|
179
|
+
(error) => {
|
|
180
|
+
const status = error.response?.status || "NETWORK_ERROR";
|
|
181
|
+
const message = error.response?.data?.message || error.message || "Network request failed";
|
|
182
|
+
const data = error.response?.data?.data;
|
|
183
|
+
logger.error("Response error", {
|
|
184
|
+
status,
|
|
185
|
+
message,
|
|
186
|
+
url: error.config?.url,
|
|
187
|
+
method: error.config?.method
|
|
188
|
+
});
|
|
189
|
+
throw new chunkY3UJVC2L_cjs.PlolinkError(message, status, data);
|
|
190
|
+
}
|
|
191
|
+
);
|
|
192
|
+
return instance;
|
|
193
|
+
}
|
|
194
|
+
|
|
195
|
+
// src/core/client.ts
|
|
196
|
+
var PlolinkClient = class {
|
|
197
|
+
/**
|
|
198
|
+
* 创建一个 PlolinkClient 实例
|
|
199
|
+
*
|
|
200
|
+
* @param config - SDK 配置对象
|
|
201
|
+
* @throws {PlolinkError} 当配置验证失败时抛出
|
|
202
|
+
*
|
|
203
|
+
* @example
|
|
204
|
+
* ```typescript
|
|
205
|
+
* const client = new PlolinkClient({
|
|
206
|
+
* token: 'sk-your-api-key'
|
|
207
|
+
* });
|
|
208
|
+
* ```
|
|
209
|
+
*/
|
|
210
|
+
constructor(config) {
|
|
211
|
+
this.validateConfig(config);
|
|
212
|
+
this.config = {
|
|
213
|
+
baseUrl: config.baseUrl || "https://hiring.djangotech.com/",
|
|
214
|
+
token: config.token,
|
|
215
|
+
timeout: config.timeout || 1e4,
|
|
216
|
+
logger: config.logger || (() => {
|
|
217
|
+
})
|
|
218
|
+
};
|
|
219
|
+
this.logger = new InternalLogger(this.config.logger);
|
|
220
|
+
this.logger.info("Initializing Plolink SDK Client", {
|
|
221
|
+
baseUrl: this.config.baseUrl,
|
|
222
|
+
timeout: this.config.timeout,
|
|
223
|
+
hasToken: !!this.config.token
|
|
224
|
+
});
|
|
225
|
+
this.axiosInstance = createAxiosInstance(
|
|
226
|
+
this.config,
|
|
227
|
+
this.logger
|
|
228
|
+
);
|
|
229
|
+
}
|
|
230
|
+
/**
|
|
231
|
+
* 验证 SDK 配置
|
|
232
|
+
*
|
|
233
|
+
* @param config - SDK 配置对象
|
|
234
|
+
* @throws {PlolinkError} 当配置不合法时抛出
|
|
235
|
+
* @private
|
|
236
|
+
*/
|
|
237
|
+
validateConfig(config) {
|
|
238
|
+
if (!config.token) {
|
|
239
|
+
throw new chunkY3UJVC2L_cjs.PlolinkError(
|
|
240
|
+
"Config validation failed: token is required",
|
|
241
|
+
"CONFIG_ERROR"
|
|
242
|
+
);
|
|
243
|
+
}
|
|
244
|
+
const isApiKey = config.token.startsWith("sk-");
|
|
245
|
+
const isSessionId = /^[0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12}$/i.test(config.token);
|
|
246
|
+
if (!isApiKey && !isSessionId) {
|
|
247
|
+
throw new chunkY3UJVC2L_cjs.PlolinkError(
|
|
248
|
+
"Config validation failed: token must be either an ApiKey (sk-xxx) or a SessionId (UUID format)",
|
|
249
|
+
"CONFIG_ERROR"
|
|
250
|
+
);
|
|
251
|
+
}
|
|
252
|
+
if (config.baseUrl) {
|
|
253
|
+
try {
|
|
254
|
+
new URL(config.baseUrl);
|
|
255
|
+
} catch {
|
|
256
|
+
throw new chunkY3UJVC2L_cjs.PlolinkError(
|
|
257
|
+
`Config validation failed: baseUrl is not a valid URL: ${config.baseUrl}`,
|
|
258
|
+
"CONFIG_ERROR"
|
|
259
|
+
);
|
|
260
|
+
}
|
|
261
|
+
}
|
|
262
|
+
if (config.timeout !== void 0 && (config.timeout <= 0 || !Number.isFinite(config.timeout))) {
|
|
263
|
+
throw new chunkY3UJVC2L_cjs.PlolinkError(
|
|
264
|
+
`Config validation failed: timeout must be a positive number, got ${config.timeout}`,
|
|
265
|
+
"CONFIG_ERROR"
|
|
266
|
+
);
|
|
267
|
+
}
|
|
268
|
+
}
|
|
269
|
+
/**
|
|
270
|
+
* 获取当前 SDK 版本
|
|
271
|
+
*
|
|
272
|
+
* @returns SDK 版本号
|
|
273
|
+
*/
|
|
274
|
+
getVersion() {
|
|
275
|
+
return "1.0.0";
|
|
276
|
+
}
|
|
277
|
+
/**
|
|
278
|
+
* 检查客户端健康状态
|
|
279
|
+
*
|
|
280
|
+
* @returns 健康状态信息
|
|
281
|
+
*
|
|
282
|
+
* @example
|
|
283
|
+
* ```typescript
|
|
284
|
+
* const health = client.healthCheck();
|
|
285
|
+
* console.log(health);
|
|
286
|
+
* // { status: 'ok', baseUrl: '...', version: '...' }
|
|
287
|
+
* ```
|
|
288
|
+
*/
|
|
289
|
+
healthCheck() {
|
|
290
|
+
return {
|
|
291
|
+
status: "ok",
|
|
292
|
+
baseUrl: this.config.baseUrl,
|
|
293
|
+
version: this.getVersion(),
|
|
294
|
+
hasToken: !!this.config.token
|
|
295
|
+
};
|
|
296
|
+
}
|
|
297
|
+
};
|
|
298
|
+
|
|
299
|
+
// src/index.ts
|
|
300
|
+
var VERSION = "1.0.0";
|
|
301
|
+
var DEFAULT_CONFIG = {
|
|
302
|
+
baseUrl: "https://hiring.djangotech.com/",
|
|
303
|
+
timeout: 1e4,
|
|
304
|
+
initialInterval: 1e3,
|
|
305
|
+
maxInterval: 3e4,
|
|
306
|
+
backoffFactor: 1.5
|
|
307
|
+
};
|
|
308
|
+
|
|
309
|
+
Object.defineProperty(exports, "EventEmitter", {
|
|
310
|
+
enumerable: true,
|
|
311
|
+
get: function () { return chunkNS3DJP2O_cjs.EventEmitter; }
|
|
312
|
+
});
|
|
313
|
+
Object.defineProperty(exports, "TypedEventEmitter", {
|
|
314
|
+
enumerable: true,
|
|
315
|
+
get: function () { return chunkNS3DJP2O_cjs.TypedEventEmitter; }
|
|
316
|
+
});
|
|
317
|
+
Object.defineProperty(exports, "environmentInfo", {
|
|
318
|
+
enumerable: true,
|
|
319
|
+
get: function () { return chunkNS3DJP2O_cjs.environmentInfo; }
|
|
320
|
+
});
|
|
321
|
+
Object.defineProperty(exports, "getEnvironment", {
|
|
322
|
+
enumerable: true,
|
|
323
|
+
get: function () { return chunkNS3DJP2O_cjs.getEnvironment; }
|
|
324
|
+
});
|
|
325
|
+
Object.defineProperty(exports, "isBrowser", {
|
|
326
|
+
enumerable: true,
|
|
327
|
+
get: function () { return chunkNS3DJP2O_cjs.isBrowser; }
|
|
328
|
+
});
|
|
329
|
+
Object.defineProperty(exports, "isNode", {
|
|
330
|
+
enumerable: true,
|
|
331
|
+
get: function () { return chunkNS3DJP2O_cjs.isNode; }
|
|
332
|
+
});
|
|
333
|
+
Object.defineProperty(exports, "isWebWorker", {
|
|
334
|
+
enumerable: true,
|
|
335
|
+
get: function () { return chunkNS3DJP2O_cjs.isWebWorker; }
|
|
336
|
+
});
|
|
337
|
+
Object.defineProperty(exports, "Poller", {
|
|
338
|
+
enumerable: true,
|
|
339
|
+
get: function () { return chunkJR4HYYQI_cjs.Poller; }
|
|
340
|
+
});
|
|
341
|
+
Object.defineProperty(exports, "PlolinkError", {
|
|
342
|
+
enumerable: true,
|
|
343
|
+
get: function () { return chunkY3UJVC2L_cjs.PlolinkError; }
|
|
344
|
+
});
|
|
345
|
+
exports.DEFAULT_CONFIG = DEFAULT_CONFIG;
|
|
346
|
+
exports.InternalLogger = InternalLogger;
|
|
347
|
+
exports.PlolinkClient = PlolinkClient;
|
|
348
|
+
exports.VERSION = VERSION;
|
|
349
|
+
//# sourceMappingURL=index.cjs.map
|
|
350
|
+
//# sourceMappingURL=index.cjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/core/logger.ts","../src/core/request.ts","../src/core/client.ts","../src/index.ts"],"names":["axios","PlolinkError"],"mappings":"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","file":"index.cjs","sourcesContent":["import type { LogLevel, LoggerFunction } from '../types';\n\n/**\n * SDK 内部日志器\n * \n * @description\n * 提供统一的日志接口,支持用户自定义日志钩子。\n * 默认使用 console 输出,用户可以通过配置自定义 logger 函数来集成 Sentry 等监控系统。\n * \n * @example\n * ```typescript\n * const logger = new InternalLogger((level, message, data) => {\n * // 自定义日志处理,例如发送到 Sentry\n * console.log(`[${level}] ${message}`, data);\n * });\n * \n * logger.info('Operation started', { userId: '123' });\n * logger.error('Operation failed', { error: 'Network timeout' });\n * ```\n */\nexport class InternalLogger {\n /**\n * 用户自定义的日志钩子函数\n */\n private readonly userLogger?: LoggerFunction;\n\n /**\n * 是否启用日志输出\n * 可以通过环境变量 PLOLINK_SDK_DEBUG 控制\n */\n private readonly isDebugEnabled: boolean;\n\n /**\n * 创建一个 InternalLogger 实例\n * \n * @param userLogger - 用户自定义的日志钩子函数\n */\n constructor(userLogger?: LoggerFunction) {\n this.userLogger = userLogger;\n this.isDebugEnabled =\n typeof process !== 'undefined' &&\n process.env?.PLOLINK_SDK_DEBUG === 'true';\n }\n\n /**\n * 记录信息级别日志\n * \n * @param message - 日志消息\n * @param context - 附加上下文数据\n */\n public info(message: string, context?: unknown): void {\n this.log('info', message, context);\n }\n\n /**\n * 记录警告级别日志\n * \n * @param message - 日志消息\n * @param context - 附加上下文数据\n */\n public warn(message: string, context?: unknown): void {\n this.log('warn', message, context);\n }\n\n /**\n * 记录错误级别日志\n * \n * @param message - 日志消息\n * @param context - 附加上下文数据\n */\n public error(message: string, context?: unknown): void {\n this.log('error', message, context);\n }\n\n /**\n * 记录调试级别日志\n * 只有在 debug 模式下才会输出\n * \n * @param message - 日志消息\n * @param context - 附加上下文数据\n */\n public debug(message: string, context?: unknown): void {\n if (this.isDebugEnabled) {\n this.log('debug', message, context);\n }\n }\n\n /**\n * 内部日志记录方法\n * \n * @param level - 日志级别\n * @param message - 日志消息\n * @param context - 附加上下文数据\n */\n private log(level: LogLevel, message: string, context?: unknown): void {\n const formattedMessage = `[Plolink SDK] ${message}`;\n\n // 优先使用用户自定义的 logger\n if (this.userLogger) {\n this.userLogger(level, formattedMessage, context);\n return;\n }\n\n // 降级到 console 输出\n const logData = context ? [formattedMessage, context] : [formattedMessage];\n\n switch (level) {\n case 'info':\n case 'debug':\n // eslint-disable-next-line no-console\n console.log(...logData);\n break;\n case 'warn':\n console.warn(...logData);\n break;\n case 'error':\n console.error(...logData);\n break;\n }\n }\n\n /**\n * 创建一个带有固定上下文的子 logger\n * \n * @param context - 固定的上下文数据\n * @returns 新的 logger 实例\n * \n * @example\n * ```typescript\n * const logger = new InternalLogger();\n * const moduleLogger = logger.withContext({ module: 'billing' });\n * moduleLogger.info('Payment processed'); // 日志会自动带上 module: 'billing'\n * ```\n */\n public withContext(context: Record<string, unknown>): InternalLogger {\n const parentLogger = this.userLogger;\n const wrappedLogger: LoggerFunction = (level, message, data) => {\n const mergedData = { ...context, ...((data as Record<string, unknown>) || {}) };\n if (parentLogger) {\n parentLogger(level, message, mergedData);\n } else {\n // 使用默认的 console 输出\n const formattedMessage = `[Plolink SDK] ${message}`;\n const logData = [formattedMessage, mergedData];\n switch (level) {\n case 'info':\n case 'debug':\n // eslint-disable-next-line no-console\n console.log(...logData);\n break;\n case 'warn':\n console.warn(...logData);\n break;\n case 'error':\n console.error(...logData);\n break;\n }\n }\n };\n\n return new InternalLogger(wrappedLogger);\n }\n}\n\n","import axios, { type AxiosInstance, type AxiosRequestConfig, AxiosError } from 'axios';\nimport { PlolinkError } from './error';\nimport { InternalLogger } from './logger';\nimport type { SDKConfig } from '../types';\n\n/**\n * 标准 API 响应格式\n */\ninterface APIResponse<T = unknown> {\n code: number;\n message: string;\n data: T;\n}\n\n/**\n * 创建配置好的 Axios 实例\n * \n * @description\n * 创建一个单例的 Axios 实例,配置了请求和响应拦截器。\n * - 请求拦截器:注入 Bearer Token 认证\n * - 响应拦截器:统一处理 code/message/data 格式,只返回 data 部分\n * - 错误处理:将所有错误转换为 PlolinkError\n * \n * @param config - SDK 配置对象\n * @param logger - 日志记录器\n * @returns 配置好的 Axios 实例\n * \n * @internal\n */\nexport function createAxiosInstance(\n config: Required<SDKConfig>,\n logger: InternalLogger\n): AxiosInstance {\n // 创建 Axios 实例\n const instance = axios.create({\n baseURL: config.baseUrl,\n timeout: config.timeout,\n headers: {\n 'Content-Type': 'application/json',\n },\n });\n\n // 请求拦截器:注入认证信息\n instance.interceptors.request.use(\n (requestConfig) => {\n const method = requestConfig.method?.toUpperCase() || 'GET';\n const url = requestConfig.url || '';\n\n logger.debug(`Request: ${method} ${url}`, {\n // eslint-disable-next-line @typescript-eslint/no-unsafe-assignment\n params: requestConfig.params,\n // eslint-disable-next-line @typescript-eslint/no-unsafe-assignment\n data: requestConfig.data,\n });\n\n // 统一使用 Bearer Token 认证\n if (config.token) {\n requestConfig.headers = requestConfig.headers || {};\n requestConfig.headers['Authorization'] = `Bearer ${config.token}`;\n }\n\n return requestConfig;\n },\n (error: AxiosError) => {\n logger.error('Request interceptor error', { error: error.message });\n return Promise.reject(error);\n }\n );\n\n // 响应拦截器:统一格式化与状态检测\n instance.interceptors.response.use(\n (response) => {\n const { code, data, message } = response.data as APIResponse;\n\n logger.debug(`Response: ${response.config.method?.toUpperCase()} ${response.config.url}`, {\n code,\n message,\n });\n\n // 检查业务状态码(根据后端约定,200 或 0 表示成功)\n if (code !== 200 && code !== 0) {\n const error = new PlolinkError(\n message || 'Unknown business error',\n code,\n data\n );\n logger.error('Business error', {\n code,\n message,\n data,\n });\n throw error;\n }\n\n // 直接返回 data 部分\n // eslint-disable-next-line @typescript-eslint/no-unnecessary-type-assertion\n return data as unknown as typeof response;\n },\n (error: AxiosError) => {\n // 处理网络错误和 HTTP 错误\n const status = error.response?.status || 'NETWORK_ERROR';\n const message =\n (error.response?.data as APIResponse)?.message ||\n error.message ||\n 'Network request failed';\n const data = (error.response?.data as APIResponse)?.data;\n\n logger.error('Response error', {\n status,\n message,\n url: error.config?.url,\n method: error.config?.method,\n });\n\n throw new PlolinkError(message, status, data);\n }\n );\n\n return instance;\n}\n\n/**\n * 为 Axios 实例添加类型安全的请求方法\n * \n * @description\n * 这些方法封装了 Axios 的原始方法,提供更好的类型推断。\n */\nexport interface TypedAxiosInstance extends AxiosInstance {\n get<T = unknown>(url: string, config?: AxiosRequestConfig): Promise<T>;\n post<T = unknown>(url: string, data?: unknown, config?: AxiosRequestConfig): Promise<T>;\n put<T = unknown>(url: string, data?: unknown, config?: AxiosRequestConfig): Promise<T>;\n patch<T = unknown>(url: string, data?: unknown, config?: AxiosRequestConfig): Promise<T>;\n delete<T = unknown>(url: string, config?: AxiosRequestConfig): Promise<T>;\n}\n\n","import type { SDKConfig } from '../types';\nimport { InternalLogger } from './logger';\nimport { createAxiosInstance, type TypedAxiosInstance } from './request';\nimport { PlolinkError } from './error';\n\n/**\n * Plolink SDK 客户端主类\n * \n * @description\n * PlolinkClient 是 SDK 的核心类,负责:\n * - 管理 SDK 配置(认证 Token、API 地址等)\n * - 初始化 Axios 实例并配置拦截器\n * - 提供统一的日志接口\n * - 作为所有业务模块的基础依赖\n * \n * @example\n * ```typescript\n * // 使用 ApiKey\n * const client = new PlolinkClient({\n * token: 'sk-123456789',\n * logger: (level, msg, data) => {\n * console.log(`[${level}] ${msg}`, data);\n * }\n * });\n * \n * // 使用 SessionId (登录后获取)\n * const client = new PlolinkClient({\n * token: 'a1b2c3d4-e5f6-7890-abcd-ef1234567890',\n * baseUrl: 'https://api.plolink.com'\n * });\n * ```\n */\nexport class PlolinkClient {\n /**\n * SDK 配置对象(已填充默认值)\n */\n public readonly config: Required<SDKConfig>;\n\n /**\n * Axios 实例,用于发起 HTTP 请求\n */\n public readonly axiosInstance: TypedAxiosInstance;\n\n /**\n * 内部日志记录器\n */\n public readonly logger: InternalLogger;\n\n /**\n * 创建一个 PlolinkClient 实例\n * \n * @param config - SDK 配置对象\n * @throws {PlolinkError} 当配置验证失败时抛出\n * \n * @example\n * ```typescript\n * const client = new PlolinkClient({\n * token: 'sk-your-api-key'\n * });\n * ```\n */\n constructor(config: SDKConfig) {\n // 验证配置\n this.validateConfig(config);\n\n // 填充默认配置\n this.config = {\n baseUrl: config.baseUrl || 'https://hiring.djangotech.com/',\n token: config.token,\n timeout: config.timeout || 10000,\n logger: config.logger || (() => {}),\n };\n\n // 初始化日志记录器\n this.logger = new InternalLogger(this.config.logger);\n\n this.logger.info('Initializing Plolink SDK Client', {\n baseUrl: this.config.baseUrl,\n timeout: this.config.timeout,\n hasToken: !!this.config.token,\n });\n\n // 创建 Axios 实例\n this.axiosInstance = createAxiosInstance(\n this.config,\n this.logger\n ) as TypedAxiosInstance;\n }\n\n /**\n * 验证 SDK 配置\n * \n * @param config - SDK 配置对象\n * @throws {PlolinkError} 当配置不合法时抛出\n * @private\n */\n private validateConfig(config: SDKConfig): void {\n // 验证必填字段 token\n if (!config.token) {\n throw new PlolinkError(\n 'Config validation failed: token is required',\n 'CONFIG_ERROR'\n );\n }\n\n // 验证 token 格式(ApiKey 或 SessionId)\n const isApiKey = config.token.startsWith('sk-');\n const isSessionId = /^[0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12}$/i.test(config.token);\n \n if (!isApiKey && !isSessionId) {\n throw new PlolinkError(\n 'Config validation failed: token must be either an ApiKey (sk-xxx) or a SessionId (UUID format)',\n 'CONFIG_ERROR'\n );\n }\n\n // 验证 baseUrl 格式\n if (config.baseUrl) {\n try {\n new URL(config.baseUrl);\n } catch {\n throw new PlolinkError(\n `Config validation failed: baseUrl is not a valid URL: ${config.baseUrl}`,\n 'CONFIG_ERROR'\n );\n }\n }\n\n // 验证 timeout\n if (config.timeout !== undefined && (config.timeout <= 0 || !Number.isFinite(config.timeout))) {\n throw new PlolinkError(\n `Config validation failed: timeout must be a positive number, got ${config.timeout}`,\n 'CONFIG_ERROR'\n );\n }\n }\n\n /**\n * 获取当前 SDK 版本\n * \n * @returns SDK 版本号\n */\n public getVersion(): string {\n return '1.0.0';\n }\n\n /**\n * 检查客户端健康状态\n * \n * @returns 健康状态信息\n * \n * @example\n * ```typescript\n * const health = client.healthCheck();\n * console.log(health);\n * // { status: 'ok', baseUrl: '...', version: '...' }\n * ```\n */\n public healthCheck(): {\n status: 'ok';\n baseUrl: string;\n version: string;\n hasToken: boolean;\n } {\n return {\n status: 'ok',\n baseUrl: this.config.baseUrl,\n version: this.getVersion(),\n hasToken: !!this.config.token,\n };\n }\n}\n\n","/**\n * Plolink SDK 主入口\n * \n * @description\n * Plolink 开放平台官方 SDK,提供完整的 API 调用能力。\n * \n * @packageDocumentation\n * \n * @example\n * ```typescript\n * import { PlolinkClient } from '@plolink/sdk';\n * \n * // 创建客户端实例\n * const client = new PlolinkClient({\n * token: 'sk-your-api-key',\n * logger: (level, message, data) => {\n * console.log(`[${level}] ${message}`, data);\n * }\n * });\n * \n * // 检查健康状态\n * const health = client.healthCheck();\n * console.log(health);\n * ```\n */\n\n// 导出核心类\nexport { PlolinkClient } from './core/client';\nexport { PlolinkError } from './core/error';\nexport { InternalLogger } from './core/logger';\n\n// 导出公共工具(供高级用户使用)\nexport { Poller } from './common/poller';\nexport { EventEmitter, TypedEventEmitter } from './common/hooks';\nexport {\n isNode,\n isBrowser,\n isWebWorker,\n getEnvironment,\n environmentInfo,\n} from './common/adapter';\n\n// 导出类型定义\nexport type {\n SDKConfig,\n LogLevel,\n LoggerFunction,\n PollerOptions,\n PollerSnapshot,\n // shared (跨模块通用类型)\n RoleType,\n ScopeType,\n AssignRoleParams,\n} from './types';\n\n// 导出版本信息\nexport const VERSION = '1.0.0';\n\n/**\n * SDK 默认配置\n */\nexport const DEFAULT_CONFIG = {\n baseUrl: 'https://hiring.djangotech.com/',\n timeout: 10000,\n initialInterval: 1000,\n maxInterval: 30000,\n backoffFactor: 1.5,\n} as const;\n\n"]}
|
package/dist/index.d.cts
ADDED
|
@@ -0,0 +1,98 @@
|
|
|
1
|
+
export { I as InternalLogger, P as PlolinkClient } from './client-CAjIQKPm.cjs';
|
|
2
|
+
export { P as Poller } from './poller-BlIRbwL4.cjs';
|
|
3
|
+
export { EventEmitter, TypedEventEmitter, environmentInfo, getEnvironment, isBrowser, isNode, isWebWorker } from './common/index.cjs';
|
|
4
|
+
export { L as LogLevel, b as LoggerFunction, P as PollerOptions, a as PollerSnapshot, S as SDKConfig } from './core-77EbLgbp.cjs';
|
|
5
|
+
export { A as AssignRoleParams, R as RoleType, S as ScopeType } from './shared-6ZepUSPW.cjs';
|
|
6
|
+
import 'axios';
|
|
7
|
+
|
|
8
|
+
/**
|
|
9
|
+
* Plolink SDK 统一错误类
|
|
10
|
+
*
|
|
11
|
+
* @description
|
|
12
|
+
* 所有 SDK 内部的业务错误和网络错误都会被转换为 PlolinkError。
|
|
13
|
+
* 调用方可以通过捕获此错误来统一处理异常情况。
|
|
14
|
+
*
|
|
15
|
+
* @example
|
|
16
|
+
* ```typescript
|
|
17
|
+
* try {
|
|
18
|
+
* await client.someMethod();
|
|
19
|
+
* } catch (error) {
|
|
20
|
+
* if (error instanceof PlolinkError) {
|
|
21
|
+
* console.error(`Error ${error.code}: ${error.message}`);
|
|
22
|
+
* console.error('Additional data:', error.data);
|
|
23
|
+
* }
|
|
24
|
+
* }
|
|
25
|
+
* ```
|
|
26
|
+
*/
|
|
27
|
+
declare class PlolinkError extends Error {
|
|
28
|
+
/**
|
|
29
|
+
* 错误代码
|
|
30
|
+
* 可以是 HTTP 状态码(数字)或业务错误码(字符串)
|
|
31
|
+
*/
|
|
32
|
+
readonly code: number | string;
|
|
33
|
+
/**
|
|
34
|
+
* 附加错误数据
|
|
35
|
+
* 包含后端返回的详细错误信息
|
|
36
|
+
*/
|
|
37
|
+
readonly data?: unknown;
|
|
38
|
+
/**
|
|
39
|
+
* 创建一个 PlolinkError 实例
|
|
40
|
+
*
|
|
41
|
+
* @param message - 错误消息
|
|
42
|
+
* @param code - 错误代码
|
|
43
|
+
* @param data - 附加错误数据
|
|
44
|
+
*/
|
|
45
|
+
constructor(message: string, code: number | string, data?: unknown);
|
|
46
|
+
/**
|
|
47
|
+
* 将错误转换为 JSON 格式
|
|
48
|
+
*
|
|
49
|
+
* @returns 包含错误信息的对象
|
|
50
|
+
*/
|
|
51
|
+
toJSON(): Record<string, unknown>;
|
|
52
|
+
/**
|
|
53
|
+
* 将错误转换为字符串
|
|
54
|
+
*
|
|
55
|
+
* @returns 错误的字符串表示
|
|
56
|
+
*/
|
|
57
|
+
toString(): string;
|
|
58
|
+
}
|
|
59
|
+
|
|
60
|
+
/**
|
|
61
|
+
* Plolink SDK 主入口
|
|
62
|
+
*
|
|
63
|
+
* @description
|
|
64
|
+
* Plolink 开放平台官方 SDK,提供完整的 API 调用能力。
|
|
65
|
+
*
|
|
66
|
+
* @packageDocumentation
|
|
67
|
+
*
|
|
68
|
+
* @example
|
|
69
|
+
* ```typescript
|
|
70
|
+
* import { PlolinkClient } from '@plolink/sdk';
|
|
71
|
+
*
|
|
72
|
+
* // 创建客户端实例
|
|
73
|
+
* const client = new PlolinkClient({
|
|
74
|
+
* token: 'sk-your-api-key',
|
|
75
|
+
* logger: (level, message, data) => {
|
|
76
|
+
* console.log(`[${level}] ${message}`, data);
|
|
77
|
+
* }
|
|
78
|
+
* });
|
|
79
|
+
*
|
|
80
|
+
* // 检查健康状态
|
|
81
|
+
* const health = client.healthCheck();
|
|
82
|
+
* console.log(health);
|
|
83
|
+
* ```
|
|
84
|
+
*/
|
|
85
|
+
|
|
86
|
+
declare const VERSION = "1.0.0";
|
|
87
|
+
/**
|
|
88
|
+
* SDK 默认配置
|
|
89
|
+
*/
|
|
90
|
+
declare const DEFAULT_CONFIG: {
|
|
91
|
+
readonly baseUrl: "https://hiring.djangotech.com/";
|
|
92
|
+
readonly timeout: 10000;
|
|
93
|
+
readonly initialInterval: 1000;
|
|
94
|
+
readonly maxInterval: 30000;
|
|
95
|
+
readonly backoffFactor: 1.5;
|
|
96
|
+
};
|
|
97
|
+
|
|
98
|
+
export { DEFAULT_CONFIG, PlolinkError, VERSION };
|
package/dist/index.d.ts
ADDED
|
@@ -0,0 +1,98 @@
|
|
|
1
|
+
export { I as InternalLogger, P as PlolinkClient } from './client-CwNikk7i.js';
|
|
2
|
+
export { P as Poller } from './poller-DWKZjuSw.js';
|
|
3
|
+
export { EventEmitter, TypedEventEmitter, environmentInfo, getEnvironment, isBrowser, isNode, isWebWorker } from './common/index.js';
|
|
4
|
+
export { L as LogLevel, b as LoggerFunction, P as PollerOptions, a as PollerSnapshot, S as SDKConfig } from './core-77EbLgbp.js';
|
|
5
|
+
export { A as AssignRoleParams, R as RoleType, S as ScopeType } from './shared-6ZepUSPW.js';
|
|
6
|
+
import 'axios';
|
|
7
|
+
|
|
8
|
+
/**
|
|
9
|
+
* Plolink SDK 统一错误类
|
|
10
|
+
*
|
|
11
|
+
* @description
|
|
12
|
+
* 所有 SDK 内部的业务错误和网络错误都会被转换为 PlolinkError。
|
|
13
|
+
* 调用方可以通过捕获此错误来统一处理异常情况。
|
|
14
|
+
*
|
|
15
|
+
* @example
|
|
16
|
+
* ```typescript
|
|
17
|
+
* try {
|
|
18
|
+
* await client.someMethod();
|
|
19
|
+
* } catch (error) {
|
|
20
|
+
* if (error instanceof PlolinkError) {
|
|
21
|
+
* console.error(`Error ${error.code}: ${error.message}`);
|
|
22
|
+
* console.error('Additional data:', error.data);
|
|
23
|
+
* }
|
|
24
|
+
* }
|
|
25
|
+
* ```
|
|
26
|
+
*/
|
|
27
|
+
declare class PlolinkError extends Error {
|
|
28
|
+
/**
|
|
29
|
+
* 错误代码
|
|
30
|
+
* 可以是 HTTP 状态码(数字)或业务错误码(字符串)
|
|
31
|
+
*/
|
|
32
|
+
readonly code: number | string;
|
|
33
|
+
/**
|
|
34
|
+
* 附加错误数据
|
|
35
|
+
* 包含后端返回的详细错误信息
|
|
36
|
+
*/
|
|
37
|
+
readonly data?: unknown;
|
|
38
|
+
/**
|
|
39
|
+
* 创建一个 PlolinkError 实例
|
|
40
|
+
*
|
|
41
|
+
* @param message - 错误消息
|
|
42
|
+
* @param code - 错误代码
|
|
43
|
+
* @param data - 附加错误数据
|
|
44
|
+
*/
|
|
45
|
+
constructor(message: string, code: number | string, data?: unknown);
|
|
46
|
+
/**
|
|
47
|
+
* 将错误转换为 JSON 格式
|
|
48
|
+
*
|
|
49
|
+
* @returns 包含错误信息的对象
|
|
50
|
+
*/
|
|
51
|
+
toJSON(): Record<string, unknown>;
|
|
52
|
+
/**
|
|
53
|
+
* 将错误转换为字符串
|
|
54
|
+
*
|
|
55
|
+
* @returns 错误的字符串表示
|
|
56
|
+
*/
|
|
57
|
+
toString(): string;
|
|
58
|
+
}
|
|
59
|
+
|
|
60
|
+
/**
|
|
61
|
+
* Plolink SDK 主入口
|
|
62
|
+
*
|
|
63
|
+
* @description
|
|
64
|
+
* Plolink 开放平台官方 SDK,提供完整的 API 调用能力。
|
|
65
|
+
*
|
|
66
|
+
* @packageDocumentation
|
|
67
|
+
*
|
|
68
|
+
* @example
|
|
69
|
+
* ```typescript
|
|
70
|
+
* import { PlolinkClient } from '@plolink/sdk';
|
|
71
|
+
*
|
|
72
|
+
* // 创建客户端实例
|
|
73
|
+
* const client = new PlolinkClient({
|
|
74
|
+
* token: 'sk-your-api-key',
|
|
75
|
+
* logger: (level, message, data) => {
|
|
76
|
+
* console.log(`[${level}] ${message}`, data);
|
|
77
|
+
* }
|
|
78
|
+
* });
|
|
79
|
+
*
|
|
80
|
+
* // 检查健康状态
|
|
81
|
+
* const health = client.healthCheck();
|
|
82
|
+
* console.log(health);
|
|
83
|
+
* ```
|
|
84
|
+
*/
|
|
85
|
+
|
|
86
|
+
declare const VERSION = "1.0.0";
|
|
87
|
+
/**
|
|
88
|
+
* SDK 默认配置
|
|
89
|
+
*/
|
|
90
|
+
declare const DEFAULT_CONFIG: {
|
|
91
|
+
readonly baseUrl: "https://hiring.djangotech.com/";
|
|
92
|
+
readonly timeout: 10000;
|
|
93
|
+
readonly initialInterval: 1000;
|
|
94
|
+
readonly maxInterval: 30000;
|
|
95
|
+
readonly backoffFactor: 1.5;
|
|
96
|
+
};
|
|
97
|
+
|
|
98
|
+
export { DEFAULT_CONFIG, PlolinkError, VERSION };
|