@qzsy/pdd-core 0.1.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/dist/token.js ADDED
@@ -0,0 +1,62 @@
1
+ /**
2
+ * 进程内令牌缓存。
3
+ *
4
+ * 仅适合单进程开发与测试。生产环境请换成 Redis 等跨进程实现。
5
+ */
6
+ export class MemoryTokenStore {
7
+ #entries = new Map();
8
+ /**
9
+ * 读取未过期的值。
10
+ *
11
+ * @param key 存储键
12
+ * @returns 缓存值;不存在或已过期时返回 `undefined`
13
+ */
14
+ async get(key) {
15
+ const entry = this.#entries.get(key);
16
+ if (!entry) {
17
+ return undefined;
18
+ }
19
+ if (entry.expiresAt <= Date.now()) {
20
+ this.#entries.delete(key);
21
+ return undefined;
22
+ }
23
+ return entry.token;
24
+ }
25
+ /**
26
+ * 写入值。
27
+ *
28
+ * @param key 存储键
29
+ * @param token 令牌
30
+ * @param ttlMs 存活毫秒数
31
+ */
32
+ async set(key, token, ttlMs) {
33
+ this.#entries.set(key, { token, expiresAt: Date.now() + ttlMs });
34
+ }
35
+ /**
36
+ * 删除指定键。
37
+ *
38
+ * @param key 存储键
39
+ */
40
+ async delete(key) {
41
+ this.#entries.delete(key);
42
+ }
43
+ }
44
+ /**
45
+ * 店铺 `access_token` 的存储键。
46
+ *
47
+ * @param clientId 应用 `client_id`
48
+ * @param ownerId 授权主体,未传时使用 `default`
49
+ */
50
+ export function accessTokenKey(clientId, ownerId = "default") {
51
+ return `access_token:${clientId}:${ownerId}`;
52
+ }
53
+ /**
54
+ * 调用方注入令牌时的存储键。
55
+ *
56
+ * @param clientId 应用 `client_id`
57
+ * @param ownerId 授权主体,未传时使用 `default`
58
+ */
59
+ export function authorizerAccessTokenKey(clientId, ownerId = "default") {
60
+ return `authorizer_access_token:${clientId}:${ownerId}`;
61
+ }
62
+ //# sourceMappingURL=token.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"token.js","sourceRoot":"","sources":["../src/token.ts"],"names":[],"mappings":"AAiBA;;;;GAIG;AACH,MAAM,OAAO,gBAAgB;IAClB,QAAQ,GAAG,IAAI,GAAG,EAAuB,CAAC;IAEnD;;;;;OAKG;IACH,KAAK,CAAC,GAAG,CAAC,GAAW;QACnB,MAAM,KAAK,GAAG,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC;QACrC,IAAI,CAAC,KAAK,EAAE,CAAC;YACX,OAAO,SAAS,CAAC;QACnB,CAAC;QACD,IAAI,KAAK,CAAC,SAAS,IAAI,IAAI,CAAC,GAAG,EAAE,EAAE,CAAC;YAClC,IAAI,CAAC,QAAQ,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC;YAC1B,OAAO,SAAS,CAAC;QACnB,CAAC;QACD,OAAO,KAAK,CAAC,KAAK,CAAC;IACrB,CAAC;IAED;;;;;;OAMG;IACH,KAAK,CAAC,GAAG,CAAC,GAAW,EAAE,KAAa,EAAE,KAAa;QACjD,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,GAAG,EAAE,EAAE,KAAK,EAAE,SAAS,EAAE,IAAI,CAAC,GAAG,EAAE,GAAG,KAAK,EAAE,CAAC,CAAC;IACnE,CAAC;IAED;;;;OAIG;IACH,KAAK,CAAC,MAAM,CAAC,GAAW;QACtB,IAAI,CAAC,QAAQ,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC;IAC5B,CAAC;CACF;AAED;;;;;GAKG;AACH,MAAM,UAAU,cAAc,CAAC,QAAgB,EAAE,OAAO,GAAG,SAAS;IAClE,OAAO,gBAAgB,QAAQ,IAAI,OAAO,EAAE,CAAC;AAC/C,CAAC;AAED;;;;;GAKG;AACH,MAAM,UAAU,wBAAwB,CAAC,QAAgB,EAAE,OAAO,GAAG,SAAS;IAC5E,OAAO,2BAA2B,QAAQ,IAAI,OAAO,EAAE,CAAC;AAC1D,CAAC"}
@@ -0,0 +1,304 @@
1
+ /**
2
+ * 业务接口的发起方式。
3
+ *
4
+ * 商家自己持有令牌与调用方注入令牌的 path / 业务参数 / 响应完全相同,只是 `access_token` 从哪来不同。
5
+ *
6
+ * - `merchant`:构造时传入 `accessToken` / `refreshToken`,由 SDK 缓存并在过期时刷新
7
+ * - `authorizer`:由调用方通过 `getAccessToken` 提供店铺授权令牌
8
+ */
9
+ export type PddCallMode = "merchant" | "authorizer";
10
+ /**
11
+ * HTTP 客户端对外暴露的调用身份。
12
+ */
13
+ export type PddCallerKind = PddCallMode | "app";
14
+ /**
15
+ * 拼多多应用调用凭据。
16
+ *
17
+ * 每一个请求都要用 `client_id` + `client_secret` 做 MD5 签名。
18
+ */
19
+ export interface PddAppCredentials {
20
+ /**
21
+ * 开放平台分配的应用 `client_id`。
22
+ */
23
+ clientId: string;
24
+ /**
25
+ * 开放平台分配的应用 `client_secret`。只用于签名与换票,不要写入日志。
26
+ */
27
+ clientSecret: string;
28
+ }
29
+ /**
30
+ * 调用方自行提供店铺授权令牌时的身份。
31
+ *
32
+ * 不持有商家 `refresh_token`。令牌由调用方通过 OAuth 或自有存储提供。
33
+ */
34
+ export interface PddAuthorizerCaller extends PddAppCredentials {
35
+ /**
36
+ * 固定为代调用。
37
+ */
38
+ callMode: "authorizer";
39
+ /**
40
+ * 授权店铺或授权主体标识,用于令牌缓存键。未传时使用 `default`。
41
+ */
42
+ ownerId?: string;
43
+ /**
44
+ * 读取授权店铺 `access_token`。
45
+ *
46
+ * 平台判定令牌失效并重试时会传入 `forceRefresh = true`,此时应换新令牌。
47
+ */
48
+ getAccessToken: (forceRefresh?: boolean) => Promise<string>;
49
+ }
50
+ /**
51
+ * 商家自己调用时的身份。
52
+ *
53
+ * 拼多多商家接口没有 `client_id + client_secret` 直接换票的通道,必须先走 OAuth。
54
+ * 构造时可传入已有 `accessToken`,以及可选的 `refreshToken` 以便过期后自动刷新。
55
+ */
56
+ export interface PddMerchantCaller extends PddAppCredentials {
57
+ /**
58
+ * 授权店铺或授权主体标识,用于令牌缓存键。未传时使用 `default`。
59
+ */
60
+ ownerId?: string;
61
+ /**
62
+ * 当前可用的店铺 `access_token`。
63
+ */
64
+ accessToken?: string;
65
+ /**
66
+ * 刷新令牌。提供后,遇到过期错误码会调用 OAuth 刷新并重试一次。
67
+ */
68
+ refreshToken?: string;
69
+ /**
70
+ * `accessToken` 剩余有效秒数。未传时按 86400 秒写入缓存。
71
+ */
72
+ expiresIn?: number;
73
+ }
74
+ /**
75
+ * 创建 HTTP 客户端时的调用方身份。
76
+ */
77
+ export type PddClientCaller = PddMerchantCaller | PddAuthorizerCaller;
78
+ /**
79
+ * 是否为调用方注入令牌的身份。
80
+ *
81
+ * @param caller 构造客户端时传入的身份
82
+ */
83
+ export declare function isAuthorizerCaller(caller: PddClientCaller): caller is PddAuthorizerCaller;
84
+ /**
85
+ * 拼多多接口统一错误信封。
86
+ *
87
+ * HTTP 成功但存在 `error_response` 时视为失败。
88
+ */
89
+ export interface PddErrorBody {
90
+ /**
91
+ * 错误信封。存在即表示调用失败。
92
+ */
93
+ error_response?: PddErrorResponse;
94
+ }
95
+ /**
96
+ * `error_response` 的字段。
97
+ */
98
+ export interface PddErrorResponse {
99
+ /**
100
+ * 主错误码。
101
+ */
102
+ error_code?: number;
103
+ /**
104
+ * 主错误信息。
105
+ */
106
+ error_msg?: string;
107
+ /**
108
+ * 子错误码。文档里可能是数字或字符串。
109
+ */
110
+ sub_code?: number | string;
111
+ /**
112
+ * 子错误信息。
113
+ */
114
+ sub_msg?: string;
115
+ /**
116
+ * 本次请求的追踪 ID。
117
+ */
118
+ request_id?: string;
119
+ }
120
+ /**
121
+ * 允许写入请求参数的单值。
122
+ *
123
+ * 数组、对象(含官方 `MAP` / `OBJECT`)会按官方惯例序列化为 JSON 字符串。
124
+ */
125
+ export type QueryValue = string | number | boolean | readonly QueryValue[] | {
126
+ readonly [key: string]: QueryValue;
127
+ } | undefined | null;
128
+ /**
129
+ * 业务参数对象。值为 `undefined` / `null` / 空字符串的键不会被序列化,也不会参与签名。
130
+ *
131
+ * `PddHttpClient.call` 也接受各产品包的具体 query interface。
132
+ */
133
+ export type QueryRecord = Record<string, QueryValue>;
134
+ /**
135
+ * 客户端默认注入的令牌策略。
136
+ *
137
+ * - `access_token`:商家接口,自动写入 `access_token`
138
+ * - `none`:多多进宝公开接口、OAuth、获取服务器时间等,不注入令牌
139
+ */
140
+ export type TokenKind = "access_token" | "none";
141
+ /**
142
+ * 单次请求的鉴权方式。
143
+ *
144
+ * - `access_token`:自动写入 `access_token` 并参与签名
145
+ * - `none`:不注入令牌,只带 `client_id` 与签名
146
+ */
147
+ export type AuthMode = "none" | "access_token";
148
+ /**
149
+ * HTTP 方法。网关调用固定为 POST;OAuth 换票也是 POST。
150
+ */
151
+ export type HttpMethod = "GET" | "POST";
152
+ /**
153
+ * `PddHttpClient.call` 的请求选项。
154
+ */
155
+ export interface PddRequestOptions {
156
+ /**
157
+ * 鉴权方式。默认等于客户端的 `tokenKind`。
158
+ */
159
+ auth?: AuthMode;
160
+ /**
161
+ * 额外请求头。`user-agent` 与 `content-type` 由客户端写入。
162
+ */
163
+ headers?: Record<string, string>;
164
+ /**
165
+ * 取消信号。未传时使用客户端 `timeoutMs` 生成的超时信号。
166
+ */
167
+ signal?: AbortSignal;
168
+ /**
169
+ * 官方成功信封字段。推导的 `*_response` 与文档不一致时传入,例如 `response`、`order_info_get_response`。
170
+ */
171
+ responseKey?: string;
172
+ }
173
+ /**
174
+ * 创建 HTTP 客户端时的可选配置。
175
+ */
176
+ export interface PddClientOptions {
177
+ /**
178
+ * 拼多多 POP 网关地址。默认 `https://gw-api.pinduoduo.com/api/router`。
179
+ */
180
+ baseUrl?: string;
181
+ /**
182
+ * OAuth 换票地址。默认 `https://open-api.pinduoduo.com/oauth/token`。
183
+ */
184
+ tokenUrl?: string;
185
+ /**
186
+ * 令牌缓存。默认进程内内存实现;生产环境应换成 Redis 等跨进程存储。
187
+ */
188
+ tokenStore?: TokenStore;
189
+ /**
190
+ * 默认令牌策略。商家为 `access_token`,多多进宝公开接口为 `none`。
191
+ */
192
+ tokenKind?: TokenKind;
193
+ /**
194
+ * 可注入的 `fetch`,便于测试 mock。
195
+ */
196
+ fetch?: typeof fetch;
197
+ /**
198
+ * `User-Agent`。各产品包会写入自己的包名。
199
+ */
200
+ userAgent?: string;
201
+ /**
202
+ * 请求超时毫秒数。默认 15000。
203
+ */
204
+ timeoutMs?: number;
205
+ /**
206
+ * 可注入的当前时间,便于测试固定 `timestamp` 与签名。返回 Unix 毫秒。
207
+ */
208
+ now?: () => number;
209
+ }
210
+ /**
211
+ * 令牌存储。
212
+ *
213
+ * 生产环境应实现跨进程、带 TTL 的版本,避免多实例互相挤掉 `access_token`。
214
+ */
215
+ export interface TokenStore {
216
+ /**
217
+ * 读取未过期的值。
218
+ *
219
+ * @param key 存储键,例如 `access_token:${clientId}:${ownerId}`
220
+ * @returns 缓存值;不存在或已过期时返回 `undefined`
221
+ */
222
+ get(key: string): Promise<string | undefined>;
223
+ /**
224
+ * 写入值,并在 `ttlMs` 后视为过期。
225
+ *
226
+ * @param key 存储键
227
+ * @param token 令牌
228
+ * @param ttlMs 存活毫秒数
229
+ */
230
+ set(key: string, token: string, ttlMs: number): Promise<void>;
231
+ /**
232
+ * 删除指定键。令牌失效重试前会调用。
233
+ *
234
+ * @param key 存储键
235
+ */
236
+ delete(key: string): Promise<void>;
237
+ }
238
+ /**
239
+ * `POST https://open-api.pinduoduo.com/oauth/token` 的成功响应。
240
+ */
241
+ export interface PddAccessTokenResponse {
242
+ /**
243
+ * 店铺接口调用凭证。
244
+ */
245
+ access_token: string;
246
+ /**
247
+ * 凭证有效时间,单位:秒。文档示例为 86400。
248
+ */
249
+ expires_in: number;
250
+ /**
251
+ * 刷新令牌。
252
+ */
253
+ refresh_token: string;
254
+ /**
255
+ * 授权接口列表。
256
+ */
257
+ scope?: string[];
258
+ /**
259
+ * 授权主体标识,通常为店铺相关 ID。
260
+ */
261
+ owner_id?: string;
262
+ /**
263
+ * 授权主体名称。
264
+ */
265
+ owner_name?: string;
266
+ }
267
+ /**
268
+ * OAuth 换票请求体。
269
+ */
270
+ export interface PddOAuthTokenRequest {
271
+ /**
272
+ * `authorization_code` 用授权码换票,`refresh_token` 刷新令牌。
273
+ */
274
+ grant_type: "authorization_code" | "refresh_token";
275
+ /**
276
+ * 商家授权回调拿到的 `code`。`grant_type = authorization_code` 时必填。
277
+ */
278
+ code?: string;
279
+ /**
280
+ * 刷新令牌。`grant_type = refresh_token` 时必填。
281
+ */
282
+ refresh_token?: string;
283
+ }
284
+ /**
285
+ * 拼多多 POP 网关默认地址。
286
+ */
287
+ export declare const DEFAULT_PDD_BASE_URL = "https://gw-api.pinduoduo.com/api/router";
288
+ /**
289
+ * OAuth 换票默认地址。
290
+ */
291
+ export declare const DEFAULT_PDD_TOKEN_URL = "https://open-api.pinduoduo.com/oauth/token";
292
+ /**
293
+ * 默认请求超时,单位:毫秒。
294
+ */
295
+ export declare const DEFAULT_TIMEOUT_MS = 15000;
296
+ /**
297
+ * 令牌提前刷新的偏移量,单位:毫秒。避免临界过期。
298
+ */
299
+ export declare const TOKEN_EXPIRY_SKEW_MS = 60000;
300
+ /**
301
+ * 未提供 `expiresIn` 时,写入缓存的默认有效秒数。
302
+ */
303
+ export declare const DEFAULT_ACCESS_TOKEN_EXPIRES_IN = 86400;
304
+ //# sourceMappingURL=types.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../src/types.ts"],"names":[],"mappings":"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"}
package/dist/types.js ADDED
@@ -0,0 +1,29 @@
1
+ /**
2
+ * 是否为调用方注入令牌的身份。
3
+ *
4
+ * @param caller 构造客户端时传入的身份
5
+ */
6
+ export function isAuthorizerCaller(caller) {
7
+ return "callMode" in caller && caller.callMode === "authorizer";
8
+ }
9
+ /**
10
+ * 拼多多 POP 网关默认地址。
11
+ */
12
+ export const DEFAULT_PDD_BASE_URL = "https://gw-api.pinduoduo.com/api/router";
13
+ /**
14
+ * OAuth 换票默认地址。
15
+ */
16
+ export const DEFAULT_PDD_TOKEN_URL = "https://open-api.pinduoduo.com/oauth/token";
17
+ /**
18
+ * 默认请求超时,单位:毫秒。
19
+ */
20
+ export const DEFAULT_TIMEOUT_MS = 15_000;
21
+ /**
22
+ * 令牌提前刷新的偏移量,单位:毫秒。避免临界过期。
23
+ */
24
+ export const TOKEN_EXPIRY_SKEW_MS = 60_000;
25
+ /**
26
+ * 未提供 `expiresIn` 时,写入缓存的默认有效秒数。
27
+ */
28
+ export const DEFAULT_ACCESS_TOKEN_EXPIRES_IN = 86_400;
29
+ //# sourceMappingURL=types.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"types.js","sourceRoot":"","sources":["../src/types.ts"],"names":[],"mappings":"AAyFA;;;;GAIG;AACH,MAAM,UAAU,kBAAkB,CAAC,MAAuB;IACxD,OAAO,UAAU,IAAI,MAAM,IAAI,MAAM,CAAC,QAAQ,KAAK,YAAY,CAAC;AAClE,CAAC;AAkPD;;GAEG;AACH,MAAM,CAAC,MAAM,oBAAoB,GAAG,yCAAyC,CAAC;AAE9E;;GAEG;AACH,MAAM,CAAC,MAAM,qBAAqB,GAAG,4CAA4C,CAAC;AAElF;;GAEG;AACH,MAAM,CAAC,MAAM,kBAAkB,GAAG,MAAM,CAAC;AAEzC;;GAEG;AACH,MAAM,CAAC,MAAM,oBAAoB,GAAG,MAAM,CAAC;AAE3C;;GAEG;AACH,MAAM,CAAC,MAAM,+BAA+B,GAAG,MAAM,CAAC"}
package/package.json ADDED
@@ -0,0 +1,40 @@
1
+ {
2
+ "name": "@qzsy/pdd-core",
3
+ "version": "0.1.0",
4
+ "type": "module",
5
+ "description": "Shared HTTP client, MD5 sign, token store, and errors for qzsy Pinduoduo SDKs",
6
+ "license": "MIT",
7
+ "author": "qzsy",
8
+ "repository": {
9
+ "type": "git",
10
+ "url": "https://github.com/qzsy/pdd-sdk.git",
11
+ "directory": "packages/core"
12
+ },
13
+ "exports": {
14
+ ".": {
15
+ "types": "./src/index.ts",
16
+ "bun": "./src/index.ts",
17
+ "import": "./src/index.ts",
18
+ "default": "./src/index.ts"
19
+ }
20
+ },
21
+ "main": "./src/index.ts",
22
+ "types": "./src/index.ts",
23
+ "files": ["dist"],
24
+ "publishConfig": {
25
+ "access": "public",
26
+ "exports": {
27
+ ".": {
28
+ "types": "./dist/index.d.ts",
29
+ "import": "./dist/index.js",
30
+ "default": "./dist/index.js"
31
+ }
32
+ },
33
+ "main": "./dist/index.js",
34
+ "types": "./dist/index.d.ts"
35
+ },
36
+ "scripts": {
37
+ "build": "tsc --build",
38
+ "typecheck": "tsc --build --pretty"
39
+ }
40
+ }