@wutiange/log-listener-plugin 2.0.1 → 2.0.2-alpha.2

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 (65) hide show
  1. package/README.md +166 -163
  2. package/dist/index.cjs.js +7 -0
  3. package/dist/index.cjs.js.map +1 -0
  4. package/dist/index.d.ts +34 -2
  5. package/dist/index.esm.js +5 -0
  6. package/dist/index.esm.js.map +1 -0
  7. package/index.ts +3 -3
  8. package/package.json +52 -59
  9. package/src/HTTPInterceptor.ts +340 -340
  10. package/src/Server.ts +174 -178
  11. package/src/__mocks__/react-native/Libraries/Blob/FileReader.js +44 -44
  12. package/src/__mocks__/react-native/Libraries/Network/XHRInterceptor.js +39 -39
  13. package/src/__tests__/HTTPInterceptor.test.ts +322 -322
  14. package/src/__tests__/Server.test.ts +150 -150
  15. package/src/__tests__/utils.test.ts +114 -114
  16. package/src/common.ts +57 -57
  17. package/src/logPlugin.ts +238 -231
  18. package/src/logger.ts +15 -15
  19. package/src/utils.ts +135 -112
  20. package/LICENSE +0 -201
  21. package/dist/console.d.ts +0 -1
  22. package/dist/console.js +0 -20
  23. package/dist/console.js.map +0 -1
  24. package/dist/fetch.d.ts +0 -1
  25. package/dist/fetch.js +0 -48
  26. package/dist/fetch.js.map +0 -1
  27. package/dist/index.js +0 -8
  28. package/dist/index.js.map +0 -1
  29. package/dist/src/HTTPInterceptor.d.ts +0 -50
  30. package/dist/src/HTTPInterceptor.js +0 -227
  31. package/dist/src/HTTPInterceptor.js.map +0 -1
  32. package/dist/src/__mocks__/react-native/Libraries/Blob/FileReader.d.ts +0 -14
  33. package/dist/src/__mocks__/react-native/Libraries/Blob/FileReader.js +0 -41
  34. package/dist/src/__mocks__/react-native/Libraries/Blob/FileReader.js.map +0 -1
  35. package/dist/src/__mocks__/react-native/Libraries/Network/XHRInterceptor.d.ts +0 -17
  36. package/dist/src/__mocks__/react-native/Libraries/Network/XHRInterceptor.js +0 -34
  37. package/dist/src/__mocks__/react-native/Libraries/Network/XHRInterceptor.js.map +0 -1
  38. package/dist/src/__tests__/HTTPInterceptor.test.d.ts +0 -9
  39. package/dist/src/__tests__/HTTPInterceptor.test.js +0 -281
  40. package/dist/src/__tests__/HTTPInterceptor.test.js.map +0 -1
  41. package/dist/src/__tests__/Server.test.d.ts +0 -1
  42. package/dist/src/__tests__/Server.test.js +0 -116
  43. package/dist/src/__tests__/Server.test.js.map +0 -1
  44. package/dist/src/__tests__/console.test.d.ts +0 -1
  45. package/dist/src/__tests__/console.test.js +0 -29
  46. package/dist/src/__tests__/console.test.js.map +0 -1
  47. package/dist/src/__tests__/utils.test.d.ts +0 -1
  48. package/dist/src/__tests__/utils.test.js +0 -112
  49. package/dist/src/__tests__/utils.test.js.map +0 -1
  50. package/dist/src/common.d.ts +0 -14
  51. package/dist/src/common.js +0 -54
  52. package/dist/src/common.js.map +0 -1
  53. package/dist/src/logPlugin.d.ts +0 -35
  54. package/dist/src/logPlugin.js +0 -188
  55. package/dist/src/logPlugin.js.map +0 -1
  56. package/dist/src/logger.d.ts +0 -6
  57. package/dist/src/logger.js +0 -16
  58. package/dist/src/logger.js.map +0 -1
  59. package/dist/src/server.d.ts +0 -21
  60. package/dist/src/server.js +0 -178
  61. package/dist/src/server.js.map +0 -1
  62. package/dist/src/utils.d.ts +0 -6
  63. package/dist/src/utils.js +0 -106
  64. package/dist/src/utils.js.map +0 -1
  65. package/tsconfig.json +0 -27
package/src/Server.ts CHANGED
@@ -1,178 +1,174 @@
1
- import { hasPort, sleep } from "./utils";
2
- import Zeroconf from "react-native-zeroconf";
3
- import { getBaseData, LOG_KEY } from "./common";
4
- import logger from "./logger";
5
- import md5 from 'crypto-js/md5';
6
-
7
-
8
- const DEFAULT_PORT = 27751;
9
- class Server {
10
- private baseUrlArr: Set<string> = new Set();
11
- private urlsObj: Map<string, string> = new Map();
12
- private timeout: number;
13
- private baseData: Record<string, any> = {};
14
- private urlsListener: (urls: Set<string>) => void;
15
- private innerBaseData: Record<string, string> = {};
16
-
17
- constructor(url?: string | Set<string>, timeout: number = 30000) {
18
- if (typeof url === "string") {
19
- this.updateUrl(url);
20
- } else {
21
- this.setBaseUrlArr(url ?? new Set());
22
- }
23
- this.timeout = timeout;
24
- this.innerBaseData = getBaseData();
25
- this.handleZeroConf();
26
- }
27
-
28
- addUrlsListener = (
29
- onNewUrlCallback: (urls: Set<string>) => void
30
- ) => {
31
- this.urlsListener = onNewUrlCallback;
32
- };
33
-
34
- private requestJoin = async (url: string, token: string) => {
35
- const response = await fetch(url, {
36
- method: "POST",
37
- headers: {
38
- "Content-Type": "application/json;charset=utf-8",
39
- },
40
- body: JSON.stringify({
41
- token,
42
- model: this.innerBaseData.Model ?? `${this.innerBaseData.systemName}v${this.innerBaseData.osVersion}`,
43
- id: md5(JSON.stringify(this.innerBaseData)).toString(),
44
- }),
45
- });
46
- if (response.status !== 200) {
47
- return false;
48
- }
49
- const json = await response.json();
50
- if (json.code !== 0) {
51
- return false;
52
- }
53
- return true
54
- }
55
-
56
- private async handleZeroConf() {
57
- try {
58
- const Zeroconf = require("react-native-zeroconf")?.default;
59
- if (!Zeroconf) {
60
- return;
61
- }
62
- // @ts-ignore
63
- const zeroconf: Zeroconf = new Zeroconf();
64
- zeroconf.on("resolved", async (service) => {
65
- try {
66
- const { path, token } = service.txt ?? {};
67
- const url = `http://${service.host}:${service.port}`;
68
- if (!(path && token) || this.baseUrlArr.has(url)) {
69
- return;
70
- }
71
- if (!(await this.requestJoin(`${url}${path}`, token))) {
72
- return;
73
- }
74
- this.baseUrlArr.add(url);
75
- this.urlsObj.set(service.name, url)
76
- if (this.urlsListener) {
77
- this.urlsListener(this.baseUrlArr);
78
- }
79
- } catch (error) {
80
- logger.warn(LOG_KEY, "加入日志系统失败---", error);
81
- }
82
- });
83
- zeroconf.on("remove", (name) => {
84
- const currentUrl = this.urlsObj.get(name);
85
- this.baseUrlArr.delete(currentUrl)
86
- this.urlsObj.delete(name)
87
- if (this.urlsListener) {
88
- this.urlsListener(this.baseUrlArr);
89
- }
90
- });
91
- zeroconf.on("error", (err) => {
92
- logger.warn(LOG_KEY, "zeroconf出现错误", err);
93
- })
94
- zeroconf.scan("http", "tcp");
95
- } catch (error: any) {
96
- logger.warn(LOG_KEY, "zeroconf扫描或处理相关逻辑失败或者您根本就没有安装 react-native-zeroconf ,如果您没有安装,那么您将无法使用发现功能", error);
97
- }
98
- }
99
-
100
- updateTimeout(timeout = 3000) {
101
- this.timeout = timeout;
102
- }
103
-
104
- private send = async (
105
- path: string,
106
- data: Record<string, any>
107
- ): Promise<void> => {
108
- const request = async (url: string, _data: Record<string, any>) => {
109
- await Promise.race([
110
- fetch(`${url}/${path}`, {
111
- method: "POST",
112
- headers: {
113
- "Content-Type": "application/json;charset=utf-8",
114
- },
115
- body: JSON.stringify(
116
- { ...this.innerBaseData, ...this.baseData, ..._data },
117
- (_, val) => {
118
- if (val instanceof Error) {
119
- return val.toString();
120
- }
121
- return val;
122
- }
123
- ),
124
- }),
125
- sleep(this.timeout, true),
126
- ]);
127
- };
128
- if (this.baseUrlArr.size === 0) {
129
- return;
130
- }
131
- this.baseUrlArr.forEach(async (e) => {
132
- try {
133
- await request(e, data)
134
- } catch (error: any) {
135
- if (error?.message?.includes("Network request failed") || error?.message?.includes("Timeout")) {
136
- return
137
- }
138
- logger.warn(LOG_KEY, "上报日志失败", error)
139
- }
140
- })
141
- };
142
-
143
- updateUrl(url: string = '') {
144
- const tempUrl = url.includes("http") ? url : `http://${url}`;
145
- if (!url) {
146
- const currentUrl = this.urlsObj.get("Default");
147
- this.baseUrlArr.delete(currentUrl);
148
- this.urlsObj.delete("Default");
149
- } else if (!hasPort(tempUrl)) {
150
- this.updateUrl(`${tempUrl}:${DEFAULT_PORT}`);
151
- } else {
152
- this.baseUrlArr.add(tempUrl);
153
- this.urlsObj.set("Default", tempUrl);
154
- }
155
- }
156
-
157
- setBaseUrlArr(urlArr: Set<string> = new Set()) {
158
- this.baseUrlArr = urlArr;
159
- }
160
-
161
- getBaseUrlArr() {
162
- return this.baseUrlArr;
163
- }
164
-
165
- updateBaseData(data: Record<string, any> = {}) {
166
- this.baseData = data;
167
- }
168
-
169
- log = async (data: Record<string, any>) => {
170
- return this.send("log", data);
171
- };
172
-
173
- network = async (data: Record<string, any>) => {
174
- return this.send("network", data);
175
- };
176
- }
177
-
178
- export default Server;
1
+ import { hasPort, sleep, typeReplacer } from "./utils";
2
+ import { getBaseData, LOG_KEY } from "./common";
3
+ import logger from "./logger";
4
+
5
+ const DEFAULT_PORT = 27751;
6
+ class Server {
7
+ private baseUrlArr: Set<string> = new Set();
8
+ private urlsObj: Map<string, string> = new Map();
9
+ private timeout: number;
10
+ private baseData: Record<string, any> = {};
11
+ private urlsListener: (urls: Set<string>) => void = () => {};
12
+ private innerBaseData: Record<string, string> = {};
13
+
14
+ constructor(url?: string | Set<string>, timeout: number = 30000) {
15
+ if (typeof url === "string") {
16
+ this.updateUrl(url);
17
+ } else {
18
+ this.setBaseUrlArr(url ?? new Set());
19
+ }
20
+ this.timeout = timeout;
21
+ this.innerBaseData = getBaseData();
22
+ this.handleZeroConf();
23
+ }
24
+
25
+ addUrlsListener = (
26
+ onNewUrlCallback: (urls: Set<string>) => void
27
+ ) => {
28
+ this.urlsListener = onNewUrlCallback;
29
+ };
30
+
31
+ private requestJoin = async (url: string, token: string) => {
32
+ const response = await fetch(url, {
33
+ method: "POST",
34
+ headers: {
35
+ "Content-Type": "application/json;charset=utf-8",
36
+ },
37
+ body: JSON.stringify({
38
+ token,
39
+ model: this.innerBaseData.Model ?? `${this.innerBaseData.systemName}v${this.innerBaseData.osVersion}`,
40
+ }),
41
+ });
42
+ if (response.status !== 200) {
43
+ return false;
44
+ }
45
+ const json = await response.json();
46
+ if (json.code !== 0) {
47
+ return false;
48
+ }
49
+ return true
50
+ }
51
+
52
+ private async handleZeroConf() {
53
+ try {
54
+ const ZeroConf: any = require("react-native-zeroconf")?.default
55
+ if (!ZeroConf) {
56
+ return;
57
+ }
58
+ const zeroConf: import("react-native-zeroconf").default = new ZeroConf();
59
+ zeroConf.on("resolved", async (service) => {
60
+ try {
61
+ const { path, token } = service.txt ?? {};
62
+ const url = `http://${service.host}:${service.port}`;
63
+ if (!(path && token) || this.baseUrlArr.has(url)) {
64
+ return;
65
+ }
66
+ if (!(await this.requestJoin(`${url}${path}`, token))) {
67
+ return;
68
+ }
69
+ this.baseUrlArr.add(url);
70
+ this.urlsObj.set(service.name, url)
71
+ if (this.urlsListener) {
72
+ this.urlsListener(this.baseUrlArr);
73
+ }
74
+ } catch (error) {
75
+ logger.warn(LOG_KEY, "加入日志系统失败---", error);
76
+ }
77
+ });
78
+ zeroConf.on("remove", (name: string) => {
79
+ const currentUrl = this.urlsObj.get(name);
80
+ if (currentUrl === undefined) {
81
+ return;
82
+ }
83
+ this.baseUrlArr.delete(currentUrl)
84
+ this.urlsObj.delete(name)
85
+ if (this.urlsListener) {
86
+ this.urlsListener(this.baseUrlArr);
87
+ }
88
+ });
89
+ zeroConf.on("error", (err: any) => {
90
+ logger.warn(LOG_KEY, "zeroconf出现错误", err);
91
+ })
92
+ zeroConf.scan("http", "tcp");
93
+ } catch (error: any) {
94
+ logger.warn(LOG_KEY, "zeroconf扫描或处理相关逻辑失败或者您根本就没有安装 react-native-zeroconf ,如果您没有安装,那么您将无法使用发现功能", error);
95
+ }
96
+ }
97
+
98
+ updateTimeout(timeout = 3000) {
99
+ this.timeout = timeout;
100
+ }
101
+
102
+ private send = async (
103
+ path: string,
104
+ data: Record<string, any>
105
+ ): Promise<void> => {
106
+ const request = async (url: string, _data: Record<string, any>) => {
107
+ await Promise.race([
108
+ fetch(`${url}/${path}`, {
109
+ method: "POST",
110
+ headers: {
111
+ "Content-Type": "application/json;charset=utf-8",
112
+ },
113
+ body: JSON.stringify(
114
+ { ...this.innerBaseData, ...this.baseData, ..._data },
115
+ typeReplacer
116
+ ),
117
+ }),
118
+ sleep(this.timeout, true),
119
+ ]);
120
+ };
121
+ if (this.baseUrlArr.size === 0) {
122
+ return;
123
+ }
124
+ this.baseUrlArr.forEach(async (e) => {
125
+ try {
126
+ await request(e, data)
127
+ } catch (error: any) {
128
+ if (error?.message?.includes("Network request failed") || error?.message?.includes("Timeout")) {
129
+ return
130
+ }
131
+ logger.warn(LOG_KEY, "上报日志失败", error)
132
+ }
133
+ })
134
+ };
135
+
136
+ updateUrl(url: string = '') {
137
+ const tempUrl = url.includes("http") ? url : `http://${url}`;
138
+ if (!url) {
139
+ const currentUrl = this.urlsObj.get("Default");
140
+ if (!currentUrl) {
141
+ return;
142
+ }
143
+ this.baseUrlArr.delete(currentUrl);
144
+ this.urlsObj.delete("Default");
145
+ } else if (!hasPort(tempUrl)) {
146
+ this.updateUrl(`${tempUrl}:${DEFAULT_PORT}`);
147
+ } else {
148
+ this.baseUrlArr.add(tempUrl);
149
+ this.urlsObj.set("Default", tempUrl);
150
+ }
151
+ }
152
+
153
+ setBaseUrlArr(urlArr: Set<string> = new Set()) {
154
+ this.baseUrlArr = urlArr;
155
+ }
156
+
157
+ getBaseUrlArr() {
158
+ return this.baseUrlArr;
159
+ }
160
+
161
+ updateBaseData(data: Record<string, any> = {}) {
162
+ this.baseData = data;
163
+ }
164
+
165
+ log = async (data: Record<string, any>) => {
166
+ return this.send("log", data);
167
+ };
168
+
169
+ network = async (data: Record<string, any>) => {
170
+ return this.send("network", data);
171
+ };
172
+ }
173
+
174
+ export default Server;
@@ -1,45 +1,45 @@
1
- class FileReader {
2
- constructor() {
3
- this.result = null;
4
- this.error = null;
5
- this.readyState = FileReader.EMPTY;
6
- }
7
-
8
- static EMPTY = 0;
9
- static LOADING = 1;
10
- static DONE = 2;
11
-
12
- addEventListener(event, callback) {
13
- this[`on${event}`] = callback;
14
- }
15
-
16
- removeEventListener(event, callback) {
17
- if (this[`on${event}`] === callback) {
18
- this[`on${event}`] = null;
19
- }
20
- }
21
-
22
- readAsText(blob) {
23
- this._read(blob, 'text');
24
- }
25
-
26
- readAsArrayBuffer(blob) {
27
- this._read(blob, 'arraybuffer');
28
- }
29
-
30
- _read(blob, resultType) {
31
- this.readyState = FileReader.LOADING;
32
- setTimeout(() => {
33
- this.readyState = FileReader.DONE;
34
- if (resultType === 'text') {
35
- this.result = blob.text();
36
- } else if (resultType === 'arraybuffer') {
37
- // 这里我们简单地返回一个空的 ArrayBuffer
38
- this.result = new ArrayBuffer(0);
39
- }
40
- if (this.onload) this.onload({target: this});
41
- }, 0);
42
- }
43
- }
44
-
1
+ class FileReader {
2
+ constructor() {
3
+ this.result = null;
4
+ this.error = null;
5
+ this.readyState = FileReader.EMPTY;
6
+ }
7
+
8
+ static EMPTY = 0;
9
+ static LOADING = 1;
10
+ static DONE = 2;
11
+
12
+ addEventListener(event, callback) {
13
+ this[`on${event}`] = callback;
14
+ }
15
+
16
+ removeEventListener(event, callback) {
17
+ if (this[`on${event}`] === callback) {
18
+ this[`on${event}`] = null;
19
+ }
20
+ }
21
+
22
+ readAsText(blob) {
23
+ this._read(blob, 'text');
24
+ }
25
+
26
+ readAsArrayBuffer(blob) {
27
+ this._read(blob, 'arraybuffer');
28
+ }
29
+
30
+ _read(blob, resultType) {
31
+ this.readyState = FileReader.LOADING;
32
+ setTimeout(() => {
33
+ this.readyState = FileReader.DONE;
34
+ if (resultType === 'text') {
35
+ this.result = blob.text();
36
+ } else if (resultType === 'arraybuffer') {
37
+ // 这里我们简单地返回一个空的 ArrayBuffer
38
+ this.result = new ArrayBuffer(0);
39
+ }
40
+ if (this.onload) this.onload({target: this});
41
+ }, 0);
42
+ }
43
+ }
44
+
45
45
  module.exports = FileReader;
@@ -1,39 +1,39 @@
1
- // __mocks__/react-native/Libraries/XHRInterceptor.js
2
-
3
- class XHRInterceptor {
4
- static _isInterceptorEnabled = false
5
- static openCallback = null
6
- static requestHeaderCallback = null
7
- static headerReceivedCallback = null
8
- static sendCallback = null
9
- static responseCallback = null
10
-
11
- static setOpenCallback = jest.fn((callback) => {
12
- XHRInterceptor.openCallback = callback;
13
- })
14
- static setRequestHeaderCallback = jest.fn((callback) => {
15
- XHRInterceptor.requestHeaderCallback = callback;
16
- })
17
- static setHeaderReceivedCallback = jest.fn((callback) => {
18
- XHRInterceptor.headerReceivedCallback = callback;
19
- })
20
- static setSendCallback = jest.fn((callback) => {
21
- XHRInterceptor.sendCallback = callback;
22
- })
23
- static setResponseCallback = jest.fn((callback) => {
24
- XHRInterceptor.responseCallback = callback;
25
- })
26
-
27
- static enableInterception = jest.fn(() => {
28
- XHRInterceptor._isInterceptorEnabled = true;
29
- })
30
-
31
- static disableInterception = jest.fn(() => {
32
- XHRInterceptor._isInterceptorEnabled = false;
33
- })
34
-
35
- static isInterceptorEnabled = jest.fn(() => XHRInterceptor._isInterceptorEnabled)
36
- };
37
-
38
- module.exports = XHRInterceptor;
39
-
1
+ // __mocks__/react-native/Libraries/XHRInterceptor.js
2
+
3
+ class XHRInterceptor {
4
+ static _isInterceptorEnabled = false
5
+ static openCallback = null
6
+ static requestHeaderCallback = null
7
+ static headerReceivedCallback = null
8
+ static sendCallback = null
9
+ static responseCallback = null
10
+
11
+ static setOpenCallback = jest.fn((callback) => {
12
+ XHRInterceptor.openCallback = callback;
13
+ })
14
+ static setRequestHeaderCallback = jest.fn((callback) => {
15
+ XHRInterceptor.requestHeaderCallback = callback;
16
+ })
17
+ static setHeaderReceivedCallback = jest.fn((callback) => {
18
+ XHRInterceptor.headerReceivedCallback = callback;
19
+ })
20
+ static setSendCallback = jest.fn((callback) => {
21
+ XHRInterceptor.sendCallback = callback;
22
+ })
23
+ static setResponseCallback = jest.fn((callback) => {
24
+ XHRInterceptor.responseCallback = callback;
25
+ })
26
+
27
+ static enableInterception = jest.fn(() => {
28
+ XHRInterceptor._isInterceptorEnabled = true;
29
+ })
30
+
31
+ static disableInterception = jest.fn(() => {
32
+ XHRInterceptor._isInterceptorEnabled = false;
33
+ })
34
+
35
+ static isInterceptorEnabled = jest.fn(() => XHRInterceptor._isInterceptorEnabled)
36
+ };
37
+
38
+ module.exports = XHRInterceptor;
39
+