@pluve/logger-sdk 0.0.12 → 0.0.14

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 (47) hide show
  1. package/README.md +35 -32
  2. package/dist/esm/capture/jsError.js +3 -24
  3. package/dist/esm/capture/promiseError.js +3 -24
  4. package/dist/esm/capture/wechatError.js +9 -31
  5. package/dist/esm/compress/compression.js +28 -45
  6. package/dist/esm/core/httpClient.js +53 -76
  7. package/dist/esm/core/loggerSDK.js +201 -234
  8. package/dist/esm/core/queueManager.js +55 -112
  9. package/dist/esm/core/retryManager.js +44 -70
  10. package/dist/esm/stack/stacktrace.js +8 -31
  11. package/dist/esm/transport/beaconTransport.js +20 -61
  12. package/dist/esm/transport/pixelImageTransport.js +55 -77
  13. package/dist/esm/transport/transportAdapter.js +13 -74
  14. package/dist/esm/transport/wechatTransport.js +53 -94
  15. package/dist/esm/utils/tools.js +12 -35
  16. package/dist/types/compress/compression.d.ts +1 -1
  17. package/package.json +3 -3
  18. package/dist/cjs/capture/jsError.js +0 -48
  19. package/dist/cjs/capture/promiseError.js +0 -49
  20. package/dist/cjs/capture/resourceError.js +0 -48
  21. package/dist/cjs/capture/wechatError.js +0 -95
  22. package/dist/cjs/compress/compression.js +0 -105
  23. package/dist/cjs/config/index.js +0 -55
  24. package/dist/cjs/core/fingerprint.js +0 -36
  25. package/dist/cjs/core/httpClient.js +0 -96
  26. package/dist/cjs/core/loggerSDK.js +0 -643
  27. package/dist/cjs/core/queueManager.js +0 -263
  28. package/dist/cjs/core/retryManager.js +0 -127
  29. package/dist/cjs/index.js +0 -34
  30. package/dist/cjs/stack/stacktrace.js +0 -48
  31. package/dist/cjs/transport/beaconTransport.js +0 -64
  32. package/dist/cjs/transport/pixelImageTransport.js +0 -99
  33. package/dist/cjs/transport/transport.js +0 -17
  34. package/dist/cjs/transport/transportAdapter.js +0 -73
  35. package/dist/cjs/transport/wechatTransport.js +0 -103
  36. package/dist/cjs/types/api.js +0 -17
  37. package/dist/cjs/types/env.js +0 -17
  38. package/dist/cjs/types/external.d.ts +0 -21
  39. package/dist/cjs/types/logEvent.js +0 -17
  40. package/dist/cjs/types/logEventLevel.js +0 -17
  41. package/dist/cjs/types/sdkOptions.js +0 -17
  42. package/dist/cjs/types/trackOptions.js +0 -17
  43. package/dist/cjs/utils/environment.js +0 -183
  44. package/dist/cjs/utils/session.js +0 -31
  45. package/dist/cjs/utils/tools.js +0 -82
  46. package/dist/cjs/utils/uuid.js +0 -35
  47. package/dist/umd/logger-sdk.min.js +0 -1
package/README.md CHANGED
@@ -12,33 +12,26 @@
12
12
  ## 快速开始
13
13
 
14
14
  ```ts
15
- import { LoggerSDK } from './core/loggerSDK';
15
+ import { LoggerSDK } from '@pluve/logger-sdk';
16
16
 
17
17
  const sdk = LoggerSDK.getInstance();
18
18
 
19
19
  sdk.init({
20
- // endpoint: 'https://logger.yfpharmacy.com/log', // 实际使用以 config 中 API 为准
21
- appId: 'fe-vue-pc-seed-frontend',
22
- env: 'develop',
23
- logStage: 'develop',
24
- debug: true,
25
- // 采集与性能
20
+ appId: 'app',
21
+ logStage: 'product',
22
+ debug: false,
26
23
  enableGzip: true,
27
- enableBatch: true,
28
- batchSize: 10,
24
+ enableBatch: false,
25
+ batchSize: 20,
29
26
  batchInterval: 15000,
30
27
  maxPixelUrlLen: 8192,
31
- // 重试
32
- enableRetry: true,
33
- maxRetries: 3,
34
- retryDelay: 1000,
35
- retryBackoff: true,
36
- // 身份与鉴权
28
+ enableRetry: false,
37
29
  userId: 'u-001',
38
30
  storeCode: 's-001',
39
31
  token: '<token>',
40
- // 采样率(可选)
41
32
  sampleRate: 1,
33
+ enableAutoCapture: true,
34
+ autoCapture: { js: true, promise: true, resource: true, wechat: true },
42
35
  });
43
36
 
44
37
  // 业务日志
@@ -64,16 +57,18 @@ sdk.setStage('testing');
64
57
  - enableStorage:队列持久化开关(默认 true)
65
58
  - enableRetry/maxRetries/retryDelay/retryBackoff:重试相关配置
66
59
  - sampleRate/levelSampleRate/sourceSampleRate/pathSampleRate:采样配置
60
+ - enableAutoCapture:自动采集总开关(默认开启)
61
+ - autoCapture:细粒度开关 { js, promise, resource, wechat }
67
62
 
68
- 详细定义参考类型文件:[sdkOptions.ts](src/pages/logger-sdk-tester/logger-sdk-v2/types/sdkOptions.ts).
63
+ 详细定义参考类型文件:[sdkOptions.ts](./src/types/sdkOptions.ts).
69
64
 
70
65
  ## 压缩实现
71
66
 
72
67
  - gzipCompress(data)
73
68
  - 浏览器支持 CompressionStream 时,流式 gzip 压缩,再转 Base64 字符串
74
- - 不支持时,回退到 fflate.gzipSync(默认压缩级别),转 Base64
69
+ - 不支持时,回退到 fflate.gzipSync,使用 btoa/Buffer 生成 Base64
75
70
  - 返回值为 Base64 字符串,适用于传输(像素图 URL/JSON 体)
76
- - 代码参考:[compression.ts](src/pages/logger-sdk-tester/logger-sdk-v2/compress/compression.ts).
71
+ - 代码参考:[compression.ts](./src/compress/compression.ts).
77
72
  - 备注:当前默认压缩级别,无级别可调参数暴露;如需级别控制可在 fflate 路径引入配置。
78
73
 
79
74
  ## 传输适配
@@ -85,7 +80,7 @@ sdk.setStage('testing');
85
80
  - 请求体字符串化 safeStringify
86
81
  - enableGzip 时使用 gzipCompress 生成 Base64,Content-Type 设为 `application/json; charset=utf-8`
87
82
  - PixelImageTransport
88
- - 字符串化 items,enableGzip 时压缩为 Base64URL 参数附带 `gzip=1`
83
+ - 字符串化 items,enableGzip 时压缩为 Base64;非 gzip 情况下优先使用全局 Base64,其次 btoa,再次 encodeURIComponent;URL 参数附带 `gzip=1`
89
84
  - 构造像素上报 URL(含 appId、appStage、items、cacheBuster)
90
85
  - URL 超长打印警告
91
86
  - BeaconTransport
@@ -93,26 +88,26 @@ sdk.setStage('testing');
93
88
 
94
89
  代码参考:
95
90
 
96
- - 适配器选择:[transportAdapter.ts](src/pages/logger-sdk-tester/logger-sdk-v2/transport/transportAdapter.ts)
97
- - WeChat:[wechatTransport.ts](src/pages/logger-sdk-tester/logger-sdk-v2/transport/wechatTransport.ts)
98
- - Pixel Image:[pixelImageTransport.ts](src/pages/logger-sdk-tester/logger-sdk-v2/transport/pixelImageTransport.ts)
99
- - Beacon:[beaconTransport.ts](src/pages/logger-sdk-tester/logger-sdk-v2/transport/beaconTransport.ts)
91
+ - 适配器选择:[transportAdapter.ts](./src/transport/transportAdapter.ts)
92
+ - WeChat:[wechatTransport.ts](./src/transport/wechatTransport.ts)
93
+ - Pixel Image:[pixelImageTransport.ts](./src/transport/pixelImageTransport.ts)
94
+ - Beacon:[beaconTransport.ts](./src/transport/beaconTransport.ts)
100
95
 
101
96
  ## 批量与队列
102
97
 
103
98
  - 启用批量后,事件入队,当队列大小达到 batchSize 或定时器触发时 flush
104
99
  - flush:按 appId|stage 分组与分块(最多 200/块),批量发送成功后出队
105
- - 队列持久化:localforage 存储,页面刷新/卸载可恢复
100
+ - 队列持久化:优先 IndexedDB(localforage),失败回退 localStorage;仅在浏览器环境启用
106
101
  - 页面事件触发 flush:visibilitychange(hidden)、pagehide、beforeunload
107
102
  - 代码参考:
108
- - [queueManager.ts](src/pages/logger-sdk-tester/logger-sdk-v2/core/queueManager.ts)
109
- - [loggerSDK.ts(flush/sendBatch)](src/pages/logger-sdk-tester/logger-sdk-v2/core/loggerSDK.ts#L452-L485)
103
+ - [queueManager.ts](./src/core/queueManager.ts)
104
+ - [loggerSDK.ts(flush/sendBatch)](./src/core/loggerSDK.ts#L394-L467)
110
105
 
111
106
  ## 重试策略
112
107
 
113
108
  - 单个事件 sendEvent 与批量 sendBatch 均支持 executeWithRetry
114
109
  - 可配置最大次数、基础延迟、指数退避
115
- - 代码参考:[retryManager.ts](src/pages/logger-sdk-tester/logger-sdk-v2/core/retryManager.ts)
110
+ - 代码参考:[retryManager.ts](./src/core/retryManager.ts)
116
111
 
117
112
  ## 采样与开关
118
113
 
@@ -124,13 +119,13 @@ sdk.setStage('testing');
124
119
  - 综合 level/source/path/global 采样率
125
120
  - 基于 seed 哈希概率决定是否发送
126
121
  - 参考:
127
- - [loggerSDK.ts(shouldSend)](src/pages/logger-sdk-tester/logger-sdk-v2/core/loggerSDK.ts#L348-L411)
128
- - [api.ts](src/pages/logger-sdk-tester/logger-sdk-v2/types/api.ts)
122
+ - [loggerSDK.ts(shouldSend)](./src/core/loggerSDK.ts#L324-L365)
123
+ - [api.ts](./src/types/api.ts)
129
124
 
130
125
  ## 数据格式
131
126
 
132
127
  - LogEvent:标准化日志格式(logId/seq/appId/stage/level/traceId/frontendId/url/location/message/throwable/userId/storeCode/tags)
133
- - 类型参考:[logEvent.ts](src/pages/logger-sdk-tester/logger-sdk-v2/types/logEvent.ts)
128
+ - 类型参考:[logEvent.ts](./src/types/logEvent.ts)
134
129
  - ReportData:上报批次(appId/appStage/items[])
135
130
 
136
131
  ## 限制与注意
@@ -139,8 +134,16 @@ sdk.setStage('testing');
139
134
  - 像素图:URL 长度受限;压缩可显著降低长度但 Base64 会比二进制略增
140
135
  - 压缩:CompressionStream 不提供压缩级别参数;fflate 同步压缩适合小批量数据
141
136
  - 安全:不要在日志中包含敏感数据(token、密码、隐私信息等)
137
+ - 依赖:js-base64、localforage 均为 peerDependencies;UMD 外部化由应用或 CDN 提供全局;ESM/CJS 下由应用安装解析
142
138
 
143
139
  ## 流程图
144
140
 
145
141
  - 完整 Mermaid 流程图见文件:
146
- - [logger-sdk.mermaid](src/pages/logger-sdk-tester/logger-sdk-v2/logger-sdk.mermaid)
142
+ - [logger-sdk.mermaid](./src/logger-sdk.mermaid)
143
+ - [logger-sdk.svg](./src/logger-sdk.svg)
144
+
145
+ ## 类型与打包
146
+
147
+ - 类型入口:package.json exports.types 与 typesVersions 指向 dist/types
148
+ - TypeScript 解析:推荐在应用设置 moduleResolution: "bundler" 或 "nodenext"/"node16"
149
+ - 声明构建:`yarn build-types`(tsconfig.types.json 禁用默认 @types 扫描,避免冲突)
@@ -1,42 +1,21 @@
1
- var __async = (__this, __arguments, generator) => {
2
- return new Promise((resolve, reject) => {
3
- var fulfilled = (value) => {
4
- try {
5
- step(generator.next(value));
6
- } catch (e) {
7
- reject(e);
8
- }
9
- };
10
- var rejected = (value) => {
11
- try {
12
- step(generator.throw(value));
13
- } catch (e) {
14
- reject(e);
15
- }
16
- };
17
- var step = (x) => x.done ? resolve(x.value) : Promise.resolve(x.value).then(fulfilled, rejected);
18
- step((generator = generator.apply(__this, __arguments)).next());
19
- });
20
- };
21
-
22
1
  // src/capture/jsError.ts
23
2
  import { parseStack } from "../stack/stacktrace";
24
3
  import { logDebug } from "../utils/tools";
25
4
  function registerJsErrorCapture(debug, callback) {
26
5
  if (typeof window === "undefined")
27
6
  return void 0;
28
- const handler = (e) => __async(this, null, function* () {
7
+ const handler = async (e) => {
29
8
  logDebug(debug, "registerJsErrorCapture error", e);
30
9
  if (!e.error)
31
10
  return;
32
- const stack = yield parseStack(e.error);
11
+ const stack = await parseStack(e.error);
33
12
  callback({
34
13
  type: "js",
35
14
  message: e.error.message,
36
15
  stack,
37
16
  throwable: e.error.stack || ""
38
17
  });
39
- });
18
+ };
40
19
  window.addEventListener("error", handler);
41
20
  return () => window.removeEventListener("error", handler);
42
21
  }
@@ -1,35 +1,14 @@
1
- var __async = (__this, __arguments, generator) => {
2
- return new Promise((resolve, reject) => {
3
- var fulfilled = (value) => {
4
- try {
5
- step(generator.next(value));
6
- } catch (e) {
7
- reject(e);
8
- }
9
- };
10
- var rejected = (value) => {
11
- try {
12
- step(generator.throw(value));
13
- } catch (e) {
14
- reject(e);
15
- }
16
- };
17
- var step = (x) => x.done ? resolve(x.value) : Promise.resolve(x.value).then(fulfilled, rejected);
18
- step((generator = generator.apply(__this, __arguments)).next());
19
- });
20
- };
21
-
22
1
  // src/capture/promiseError.ts
23
2
  import { parseStack } from "../stack/stacktrace";
24
3
  import { logDebug } from "../utils/tools";
25
4
  function registerPromiseErrorCapture(debug, callback) {
26
5
  if (typeof window === "undefined")
27
6
  return void 0;
28
- const handler = (e) => __async(this, null, function* () {
7
+ const handler = async (e) => {
29
8
  logDebug(debug, "registerPromiseErrorCapture unhandledrejection", e);
30
9
  const { reason } = e;
31
10
  if (reason instanceof Error) {
32
- const stack = yield parseStack(reason);
11
+ const stack = await parseStack(reason);
33
12
  callback({
34
13
  type: "promise",
35
14
  message: reason.message,
@@ -37,7 +16,7 @@ function registerPromiseErrorCapture(debug, callback) {
37
16
  throwable: reason.stack || ""
38
17
  });
39
18
  }
40
- });
19
+ };
41
20
  window.addEventListener("unhandledrejection", handler);
42
21
  return () => window.removeEventListener("unhandledrejection", handler);
43
22
  }
@@ -1,24 +1,3 @@
1
- var __async = (__this, __arguments, generator) => {
2
- return new Promise((resolve, reject) => {
3
- var fulfilled = (value) => {
4
- try {
5
- step(generator.next(value));
6
- } catch (e) {
7
- reject(e);
8
- }
9
- };
10
- var rejected = (value) => {
11
- try {
12
- step(generator.throw(value));
13
- } catch (e) {
14
- reject(e);
15
- }
16
- };
17
- var step = (x) => x.done ? resolve(x.value) : Promise.resolve(x.value).then(fulfilled, rejected);
18
- step((generator = generator.apply(__this, __arguments)).next());
19
- });
20
- };
21
-
22
1
  // src/capture/wechatError.ts
23
2
  import { parseStack } from "../stack/stacktrace";
24
3
  import { isWeChatMiniProgram } from "../utils/environment";
@@ -29,24 +8,23 @@ function registerWechatErrorCapture(debug, callback) {
29
8
  try {
30
9
  const wxAny = globalThis.wx;
31
10
  if (wxAny && typeof wxAny.onError === "function") {
32
- const handler = (error) => __async(this, null, function* () {
33
- var _a;
11
+ const handler = async (error) => {
34
12
  logDebug(debug, "registerWechatErrorCapture onError", error);
35
- const msg = String((_a = error == null ? void 0 : error.message) != null ? _a : error);
13
+ const msg = String((error == null ? void 0 : error.message) ?? error);
36
14
  const err = error instanceof Error ? error : new Error(msg);
37
- const stack = yield parseStack(err);
15
+ const stack = await parseStack(err);
38
16
  callback({
39
17
  type: "js",
40
18
  message: err.message,
41
19
  stack,
42
20
  throwable: err.stack || ""
43
21
  });
44
- });
22
+ };
45
23
  wxAny.onError(handler);
46
24
  return () => {
47
25
  try {
48
26
  wxAny.offError && wxAny.offError(handler);
49
- } catch (e) {
27
+ } catch {
50
28
  }
51
29
  };
52
30
  }
@@ -61,23 +39,23 @@ function registerWechatUnhandledCapture(debug, callback) {
61
39
  try {
62
40
  const wxAny = globalThis.wx;
63
41
  if (wxAny && typeof wxAny.onUnhandledRejection === "function") {
64
- const handler = (res) => __async(this, null, function* () {
42
+ const handler = async (res) => {
65
43
  const reason = res == null ? void 0 : res.reason;
66
44
  logDebug(debug, "registerWechatUnhandledCapture onUnhandledRejection", reason);
67
45
  const err = reason instanceof Error ? reason : new Error(String(reason));
68
- const stack = yield parseStack(err);
46
+ const stack = await parseStack(err);
69
47
  callback({
70
48
  type: "promise",
71
49
  message: err.message,
72
50
  stack,
73
51
  throwable: err.stack || ""
74
52
  });
75
- });
53
+ };
76
54
  wxAny.onUnhandledRejection(handler);
77
55
  return () => {
78
56
  try {
79
57
  wxAny.offUnhandledRejection && wxAny.offUnhandledRejection(handler);
80
- } catch (e) {
58
+ } catch {
81
59
  }
82
60
  };
83
61
  }
@@ -1,24 +1,3 @@
1
- var __async = (__this, __arguments, generator) => {
2
- return new Promise((resolve, reject) => {
3
- var fulfilled = (value) => {
4
- try {
5
- step(generator.next(value));
6
- } catch (e) {
7
- reject(e);
8
- }
9
- };
10
- var rejected = (value) => {
11
- try {
12
- step(generator.throw(value));
13
- } catch (e) {
14
- reject(e);
15
- }
16
- };
17
- var step = (x) => x.done ? resolve(x.value) : Promise.resolve(x.value).then(fulfilled, rejected);
18
- step((generator = generator.apply(__this, __arguments)).next());
19
- });
20
- };
21
-
22
1
  // src/compress/compression.ts
23
2
  import { gzipSync } from "fflate";
24
3
  import { isBrowser } from "../utils/environment";
@@ -39,31 +18,29 @@ function toUtf8Bytes(s) {
39
18
  }
40
19
  return new Uint8Array(out);
41
20
  }
42
- function gzipCompress(data) {
43
- return __async(this, null, function* () {
44
- if (isBrowser() && typeof CompressionStream !== "undefined") {
45
- try {
46
- const encoder = new TextEncoder();
47
- const input = encoder.encode(data);
48
- const gzip = new CompressionStream("gzip");
49
- const readable = new Blob([input]).stream();
50
- const compressedStream = readable.pipeThrough(gzip);
51
- const compressedBuffer = yield new Response(compressedStream).arrayBuffer();
52
- const bytes = new Uint8Array(compressedBuffer);
53
- return convert2Base64FromArray(bytes);
54
- } catch (e) {
55
- console.log("gzipCompress 压缩失败,尝试使用 fflate 库", e);
56
- }
57
- }
21
+ async function gzipCompress(data) {
22
+ if (isBrowser() && typeof CompressionStream !== "undefined") {
58
23
  try {
59
- const input = toUtf8Bytes(data);
60
- const compressed = gzipSync(input);
61
- return convert2Base64FromArray(compressed);
24
+ const encoder = new TextEncoder();
25
+ const input = encoder.encode(data);
26
+ const gzip = new CompressionStream("gzip");
27
+ const readable = new Blob([input]).stream();
28
+ const compressedStream = readable.pipeThrough(gzip);
29
+ const compressedBuffer = await new Response(compressedStream).arrayBuffer();
30
+ const bytes = new Uint8Array(compressedBuffer);
31
+ return convert2Base64FromArray(bytes);
62
32
  } catch (e) {
63
- console.log("gzipCompress 压缩失败", e);
33
+ console.log("gzipCompress 压缩失败,尝试使用 fflate 库", e);
64
34
  }
65
- return data;
66
- });
35
+ }
36
+ try {
37
+ const input = toUtf8Bytes(data);
38
+ const compressed = gzipSync(input);
39
+ return convert2Base64FromArray(compressed);
40
+ } catch (e) {
41
+ console.log("gzipCompress 压缩失败", e);
42
+ }
43
+ throw new Error("gzipCompress 不支持压缩");
67
44
  }
68
45
  function convert2Base64FromArray(data) {
69
46
  let binary = "";
@@ -78,16 +55,22 @@ function convert2Base64FromArray(data) {
78
55
  }
79
56
  throw new Error("convert2Base64FromArray 不支持转换");
80
57
  }
81
- function convert2Base64(data) {
58
+ async function convert2Base64(data) {
82
59
  if (typeof btoa !== "undefined") {
83
60
  try {
84
61
  return btoa(data);
85
- } catch (e) {
62
+ } catch {
86
63
  }
87
64
  }
88
65
  if (typeof Buffer !== "undefined") {
89
66
  return Buffer.from(data, "base64").toString("base64");
90
67
  }
68
+ try {
69
+ const mod = await import("js-base64");
70
+ return mod.Base64.encode(data);
71
+ } catch (e) {
72
+ console.log("convert2Base64 动态引入 js-base64 库失败", e);
73
+ }
91
74
  return data;
92
75
  }
93
76
  function isGzipSupported() {
@@ -1,24 +1,3 @@
1
- var __async = (__this, __arguments, generator) => {
2
- return new Promise((resolve, reject) => {
3
- var fulfilled = (value) => {
4
- try {
5
- step(generator.next(value));
6
- } catch (e) {
7
- reject(e);
8
- }
9
- };
10
- var rejected = (value) => {
11
- try {
12
- step(generator.throw(value));
13
- } catch (e) {
14
- reject(e);
15
- }
16
- };
17
- var step = (x) => x.done ? resolve(x.value) : Promise.resolve(x.value).then(fulfilled, rejected);
18
- step((generator = generator.apply(__this, __arguments)).next());
19
- });
20
- };
21
-
22
1
  // src/core/httpClient.ts
23
2
  import { isWeChatMiniProgram } from "../utils/environment";
24
3
  import { logDebug } from "../utils/tools";
@@ -26,67 +5,65 @@ var HttpClient = class {
26
5
  /**
27
6
  * 发送 POST 请求,需要兼容浏览器和微信小程序
28
7
  */
29
- static post(url, data, token) {
30
- return __async(this, null, function* () {
31
- logDebug(true, "post", url, data, token);
32
- if (isWeChatMiniProgram()) {
33
- return new Promise((resolve, reject) => {
34
- wx.request({
35
- url,
36
- method: "POST",
37
- data: JSON.stringify(data),
38
- header: {
39
- "Content-Type": "application/json",
40
- Authorization: `Bearer ${token}`
41
- },
42
- success: (res) => resolve({
43
- type: "wechat",
44
- response: res
45
- }),
46
- fail: (err) => (
47
- // eslint-disable-next-line prefer-promise-reject-errors
48
- reject({
49
- type: "wechat",
50
- error: err
51
- })
52
- )
53
- });
54
- });
55
- }
56
- if (typeof fetch === "undefined") {
57
- return new Promise((resolve, reject) => {
58
- const xhr = new XMLHttpRequest();
59
- xhr.open("POST", url, true);
60
- xhr.setRequestHeader("Content-Type", "application/json");
61
- xhr.setRequestHeader("Authorization", `Bearer ${token}`);
62
- xhr.onreadystatechange = () => {
63
- if (xhr.readyState === 4) {
64
- if (xhr.status === 200) {
65
- resolve({
66
- type: "xhr",
67
- response: xhr.responseText
68
- });
69
- } else {
70
- reject({
71
- type: "xhr",
72
- error: new Error(xhr.statusText)
73
- });
74
- }
75
- }
76
- };
77
- xhr.send(JSON.stringify(data));
78
- });
79
- }
8
+ static async post(url, data, token) {
9
+ logDebug(true, "post", url, data, token);
10
+ if (isWeChatMiniProgram()) {
80
11
  return new Promise((resolve, reject) => {
81
- fetch(url, {
12
+ wx.request({
13
+ url,
82
14
  method: "POST",
83
- body: JSON.stringify(data),
84
- headers: {
15
+ data: JSON.stringify(data),
16
+ header: {
85
17
  "Content-Type": "application/json",
86
18
  Authorization: `Bearer ${token}`
19
+ },
20
+ success: (res) => resolve({
21
+ type: "wechat",
22
+ response: res
23
+ }),
24
+ fail: (err) => (
25
+ // eslint-disable-next-line prefer-promise-reject-errors
26
+ reject({
27
+ type: "wechat",
28
+ error: err
29
+ })
30
+ )
31
+ });
32
+ });
33
+ }
34
+ if (typeof fetch === "undefined") {
35
+ return new Promise((resolve, reject) => {
36
+ const xhr = new XMLHttpRequest();
37
+ xhr.open("POST", url, true);
38
+ xhr.setRequestHeader("Content-Type", "application/json");
39
+ xhr.setRequestHeader("Authorization", `Bearer ${token}`);
40
+ xhr.onreadystatechange = () => {
41
+ if (xhr.readyState === 4) {
42
+ if (xhr.status === 200) {
43
+ resolve({
44
+ type: "xhr",
45
+ response: xhr.responseText
46
+ });
47
+ } else {
48
+ reject({
49
+ type: "xhr",
50
+ error: new Error(xhr.statusText)
51
+ });
52
+ }
87
53
  }
88
- }).then((res) => resolve({ type: "fetch", response: res })).catch((err) => reject({ type: "fetch", error: err }));
54
+ };
55
+ xhr.send(JSON.stringify(data));
89
56
  });
57
+ }
58
+ return new Promise((resolve, reject) => {
59
+ fetch(url, {
60
+ method: "POST",
61
+ body: JSON.stringify(data),
62
+ headers: {
63
+ "Content-Type": "application/json",
64
+ Authorization: `Bearer ${token}`
65
+ }
66
+ }).then((res) => resolve({ type: "fetch", response: res })).catch((err) => reject({ type: "fetch", error: err }));
90
67
  });
91
68
  }
92
69
  };