@wutiange/log-listener-plugin 2.0.2-alpha.1 → 2.0.2-alpha.3
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 +166 -163
- package/dist/index.cjs.js +1450 -0
- package/dist/index.cjs.js.map +1 -0
- package/dist/index.d.ts +34 -2
- package/dist/index.esm.js +1448 -0
- package/dist/index.esm.js.map +1 -0
- package/index.ts +3 -3
- package/package.json +52 -59
- package/src/HTTPInterceptor.ts +336 -340
- package/src/Server.ts +174 -178
- package/src/__mocks__/react-native/Libraries/Blob/FileReader.js +44 -44
- package/src/__mocks__/react-native/Libraries/Network/XHRInterceptor.js +39 -39
- package/src/__tests__/HTTPInterceptor.test.ts +362 -322
- package/src/__tests__/Server.test.ts +150 -150
- package/src/__tests__/utils.test.ts +236 -114
- package/src/common.ts +57 -57
- package/src/logPlugin.ts +235 -231
- package/src/logger.ts +15 -15
- package/src/utils.ts +72 -112
- package/LICENSE +0 -201
- package/dist/index.js +0 -8
- package/dist/index.js.map +0 -1
- package/dist/src/HTTPInterceptor.d.ts +0 -50
- package/dist/src/HTTPInterceptor.js +0 -227
- package/dist/src/HTTPInterceptor.js.map +0 -1
- package/dist/src/Server.d.ts +0 -21
- package/dist/src/Server.js +0 -178
- package/dist/src/Server.js.map +0 -1
- package/dist/src/__mocks__/react-native/Libraries/Blob/FileReader.d.ts +0 -14
- package/dist/src/__mocks__/react-native/Libraries/Blob/FileReader.js +0 -41
- package/dist/src/__mocks__/react-native/Libraries/Blob/FileReader.js.map +0 -1
- package/dist/src/__mocks__/react-native/Libraries/Network/XHRInterceptor.d.ts +0 -17
- package/dist/src/__mocks__/react-native/Libraries/Network/XHRInterceptor.js +0 -34
- package/dist/src/__mocks__/react-native/Libraries/Network/XHRInterceptor.js.map +0 -1
- package/dist/src/__tests__/HTTPInterceptor.test.d.ts +0 -9
- package/dist/src/__tests__/HTTPInterceptor.test.js +0 -281
- package/dist/src/__tests__/HTTPInterceptor.test.js.map +0 -1
- package/dist/src/__tests__/Server.test.d.ts +0 -1
- package/dist/src/__tests__/Server.test.js +0 -116
- package/dist/src/__tests__/Server.test.js.map +0 -1
- package/dist/src/__tests__/utils.test.d.ts +0 -1
- package/dist/src/__tests__/utils.test.js +0 -112
- package/dist/src/__tests__/utils.test.js.map +0 -1
- package/dist/src/common.d.ts +0 -14
- package/dist/src/common.js +0 -54
- package/dist/src/common.js.map +0 -1
- package/dist/src/logPlugin.d.ts +0 -35
- package/dist/src/logPlugin.js +0 -188
- package/dist/src/logPlugin.js.map +0 -1
- package/dist/src/logger.d.ts +0 -6
- package/dist/src/logger.js +0 -16
- package/dist/src/logger.js.map +0 -1
- package/dist/src/utils.d.ts +0 -6
- package/dist/src/utils.js +0 -106
- package/dist/src/utils.js.map +0 -1
- package/tsconfig.json +0 -27
package/src/common.ts
CHANGED
@@ -1,57 +1,57 @@
|
|
1
|
-
import logger from "./logger";
|
2
|
-
|
3
|
-
export const URLS_KEY = 'log-listener-plugin-urls$$SetKey'
|
4
|
-
export const DEFAULT_TIMEOUT = 3000
|
5
|
-
export const LOG_KEY = '[@wutiange/log-listener-plugin 日志]'
|
6
|
-
export enum Level {
|
7
|
-
LOG = 'log',
|
8
|
-
WARN = 'warn',
|
9
|
-
ERROR = 'error',
|
10
|
-
}
|
11
|
-
|
12
|
-
export enum Tag {
|
13
|
-
LOG_PLUGIN_INTERNAL_ERROR = 'log-plugin-internal-error',
|
14
|
-
DEFAULT = 'default',
|
15
|
-
}
|
16
|
-
|
17
|
-
const getDefaultDeviceINfo = () => {
|
18
|
-
try {
|
19
|
-
const {Platform} = require('react-native')
|
20
|
-
return {
|
21
|
-
SystemName: Platform.OS,
|
22
|
-
Version: Platform.Version,
|
23
|
-
...Platform.constants
|
24
|
-
}
|
25
|
-
} catch (error) {
|
26
|
-
logger.warn(LOG_KEY, '这个插件只能在 react-native 中使用')
|
27
|
-
return {}
|
28
|
-
}
|
29
|
-
}
|
30
|
-
|
31
|
-
export const getBaseData = (): Record<string, string> => {
|
32
|
-
|
33
|
-
try {
|
34
|
-
const DeviceInfo = require("react-native-device-info")?.default;
|
35
|
-
return {
|
36
|
-
Brand: DeviceInfo.getBrand(),
|
37
|
-
Model: DeviceInfo.getModel(),
|
38
|
-
AppVersion: DeviceInfo.getVersion(),
|
39
|
-
Carrier: DeviceInfo.getCarrierSync(),
|
40
|
-
Manufacturer: DeviceInfo.getManufacturerSync(),
|
41
|
-
SystemName: DeviceInfo.getSystemName(),
|
42
|
-
...getDefaultDeviceINfo()
|
43
|
-
};
|
44
|
-
} catch (error) {
|
45
|
-
return getDefaultDeviceINfo()
|
46
|
-
}
|
47
|
-
}
|
48
|
-
|
49
|
-
export const getDefaultStorage = (): Storage => {
|
50
|
-
try {
|
51
|
-
const AsyncStorage = require("@react-native-async-storage/async-storage")?.default;
|
52
|
-
return AsyncStorage;
|
53
|
-
} catch (error) {
|
54
|
-
return null;
|
55
|
-
}
|
56
|
-
}
|
57
|
-
|
1
|
+
import logger from "./logger";
|
2
|
+
|
3
|
+
export const URLS_KEY = 'log-listener-plugin-urls$$SetKey'
|
4
|
+
export const DEFAULT_TIMEOUT = 3000
|
5
|
+
export const LOG_KEY = '[@wutiange/log-listener-plugin 日志]'
|
6
|
+
export enum Level {
|
7
|
+
LOG = 'log',
|
8
|
+
WARN = 'warn',
|
9
|
+
ERROR = 'error',
|
10
|
+
}
|
11
|
+
|
12
|
+
export enum Tag {
|
13
|
+
LOG_PLUGIN_INTERNAL_ERROR = 'log-plugin-internal-error',
|
14
|
+
DEFAULT = 'default',
|
15
|
+
}
|
16
|
+
|
17
|
+
const getDefaultDeviceINfo = () => {
|
18
|
+
try {
|
19
|
+
const {Platform} = require('react-native')
|
20
|
+
return {
|
21
|
+
SystemName: Platform.OS,
|
22
|
+
Version: Platform.Version,
|
23
|
+
...Platform.constants
|
24
|
+
}
|
25
|
+
} catch (error) {
|
26
|
+
logger.warn(LOG_KEY, '这个插件只能在 react-native 中使用')
|
27
|
+
return {}
|
28
|
+
}
|
29
|
+
}
|
30
|
+
|
31
|
+
export const getBaseData = (): Record<string, string> => {
|
32
|
+
|
33
|
+
try {
|
34
|
+
const DeviceInfo = require("react-native-device-info")?.default;
|
35
|
+
return {
|
36
|
+
Brand: DeviceInfo.getBrand(),
|
37
|
+
Model: DeviceInfo.getModel(),
|
38
|
+
AppVersion: DeviceInfo.getVersion(),
|
39
|
+
Carrier: DeviceInfo.getCarrierSync(),
|
40
|
+
Manufacturer: DeviceInfo.getManufacturerSync(),
|
41
|
+
SystemName: DeviceInfo.getSystemName(),
|
42
|
+
...getDefaultDeviceINfo()
|
43
|
+
};
|
44
|
+
} catch (error) {
|
45
|
+
return getDefaultDeviceINfo()
|
46
|
+
}
|
47
|
+
}
|
48
|
+
|
49
|
+
export const getDefaultStorage = (): Storage | null => {
|
50
|
+
try {
|
51
|
+
const AsyncStorage = require("@react-native-async-storage/async-storage")?.default;
|
52
|
+
return AsyncStorage;
|
53
|
+
} catch (error) {
|
54
|
+
return null;
|
55
|
+
}
|
56
|
+
}
|
57
|
+
|
package/src/logPlugin.ts
CHANGED
@@ -1,231 +1,235 @@
|
|
1
|
-
import Server from './Server';
|
2
|
-
import {
|
3
|
-
import {
|
4
|
-
|
5
|
-
|
6
|
-
|
7
|
-
|
8
|
-
|
9
|
-
|
10
|
-
|
11
|
-
|
12
|
-
|
13
|
-
/**
|
14
|
-
*
|
15
|
-
* @default
|
16
|
-
*/
|
17
|
-
|
18
|
-
/**
|
19
|
-
*
|
20
|
-
|
21
|
-
|
22
|
-
|
23
|
-
|
24
|
-
*
|
25
|
-
*/
|
26
|
-
|
27
|
-
/**
|
28
|
-
*
|
29
|
-
|
30
|
-
|
31
|
-
|
32
|
-
|
33
|
-
|
34
|
-
|
35
|
-
|
36
|
-
|
37
|
-
|
38
|
-
|
39
|
-
|
40
|
-
|
41
|
-
|
42
|
-
|
43
|
-
|
44
|
-
|
45
|
-
|
46
|
-
|
47
|
-
|
48
|
-
|
49
|
-
|
50
|
-
|
51
|
-
|
52
|
-
|
53
|
-
|
54
|
-
|
55
|
-
|
56
|
-
|
57
|
-
|
58
|
-
|
59
|
-
|
60
|
-
}
|
61
|
-
|
62
|
-
|
63
|
-
|
64
|
-
|
65
|
-
|
66
|
-
|
67
|
-
|
68
|
-
|
69
|
-
|
70
|
-
|
71
|
-
|
72
|
-
|
73
|
-
|
74
|
-
|
75
|
-
|
76
|
-
|
77
|
-
|
78
|
-
|
79
|
-
this.
|
80
|
-
|
81
|
-
|
82
|
-
|
83
|
-
|
84
|
-
|
85
|
-
|
86
|
-
|
87
|
-
|
88
|
-
this.isAuto =
|
89
|
-
}
|
90
|
-
|
91
|
-
|
92
|
-
|
93
|
-
|
94
|
-
|
95
|
-
|
96
|
-
|
97
|
-
|
98
|
-
|
99
|
-
|
100
|
-
|
101
|
-
|
102
|
-
|
103
|
-
|
104
|
-
|
105
|
-
|
106
|
-
|
107
|
-
|
108
|
-
|
109
|
-
|
110
|
-
|
111
|
-
|
112
|
-
|
113
|
-
|
114
|
-
|
115
|
-
|
116
|
-
|
117
|
-
|
118
|
-
|
119
|
-
|
120
|
-
|
121
|
-
|
122
|
-
|
123
|
-
|
124
|
-
|
125
|
-
|
126
|
-
|
127
|
-
|
128
|
-
|
129
|
-
|
130
|
-
|
131
|
-
|
132
|
-
|
133
|
-
|
134
|
-
|
135
|
-
|
136
|
-
|
137
|
-
|
138
|
-
|
139
|
-
|
140
|
-
|
141
|
-
|
142
|
-
|
143
|
-
|
144
|
-
|
145
|
-
|
146
|
-
|
147
|
-
headers: data.
|
148
|
-
body: data.
|
149
|
-
|
150
|
-
|
151
|
-
|
152
|
-
|
153
|
-
|
154
|
-
|
155
|
-
|
156
|
-
|
157
|
-
|
158
|
-
|
159
|
-
|
160
|
-
|
161
|
-
|
162
|
-
|
163
|
-
|
164
|
-
|
165
|
-
|
166
|
-
|
167
|
-
|
168
|
-
|
169
|
-
|
170
|
-
this.
|
171
|
-
}
|
172
|
-
|
173
|
-
|
174
|
-
|
175
|
-
|
176
|
-
|
177
|
-
|
178
|
-
|
179
|
-
|
180
|
-
|
181
|
-
|
182
|
-
|
183
|
-
|
184
|
-
|
185
|
-
|
186
|
-
|
187
|
-
|
188
|
-
|
189
|
-
|
190
|
-
|
191
|
-
|
192
|
-
|
193
|
-
|
194
|
-
|
195
|
-
|
196
|
-
|
197
|
-
|
198
|
-
|
199
|
-
}
|
200
|
-
|
201
|
-
|
202
|
-
|
203
|
-
|
204
|
-
|
205
|
-
|
206
|
-
|
207
|
-
|
208
|
-
|
209
|
-
|
210
|
-
|
211
|
-
|
212
|
-
|
213
|
-
|
214
|
-
|
215
|
-
|
216
|
-
|
217
|
-
|
218
|
-
|
219
|
-
|
220
|
-
|
221
|
-
|
222
|
-
|
223
|
-
|
224
|
-
|
225
|
-
|
226
|
-
|
227
|
-
|
228
|
-
|
229
|
-
|
230
|
-
|
231
|
-
|
1
|
+
import Server from './Server';
|
2
|
+
import { httpInterceptor } from './HTTPInterceptor';
|
3
|
+
import {
|
4
|
+
DEFAULT_TIMEOUT,
|
5
|
+
getDefaultStorage,
|
6
|
+
Level,
|
7
|
+
Tag,
|
8
|
+
URLS_KEY,
|
9
|
+
} from './common';
|
10
|
+
import logger from './logger';
|
11
|
+
|
12
|
+
type Options = {
|
13
|
+
/**
|
14
|
+
* storage 用于存储已设置的日志系统的 url
|
15
|
+
* @default @react-native-async-storage/async-storage
|
16
|
+
*/
|
17
|
+
storage?: Storage;
|
18
|
+
/**
|
19
|
+
* 设置上传日志的超时时间,单位为毫秒
|
20
|
+
* @default 3000
|
21
|
+
*/
|
22
|
+
timeout?: number;
|
23
|
+
/**
|
24
|
+
* 日志系统的url
|
25
|
+
*/
|
26
|
+
testUrl?: string;
|
27
|
+
/**
|
28
|
+
* 是否自动开启日志记录
|
29
|
+
* @default false
|
30
|
+
*/
|
31
|
+
isAuto?: boolean;
|
32
|
+
/**
|
33
|
+
* 设置日志系统的基础数据,这些数据会自动添加到每条日志中
|
34
|
+
*/
|
35
|
+
baseData?: Record<string, any>;
|
36
|
+
};
|
37
|
+
|
38
|
+
class LogPlugin {
|
39
|
+
private server: Server | null = null;
|
40
|
+
private timeout: number | null = null;
|
41
|
+
private isAuto = false;
|
42
|
+
private storage: Storage | null = getDefaultStorage();
|
43
|
+
|
44
|
+
constructor() {
|
45
|
+
this.init();
|
46
|
+
}
|
47
|
+
|
48
|
+
private init = async () => {
|
49
|
+
this.server = new Server();
|
50
|
+
|
51
|
+
if (this.storage) {
|
52
|
+
const urlsStr = await this.storage.getItem(URLS_KEY);
|
53
|
+
if (urlsStr) {
|
54
|
+
const urls = JSON.parse(urlsStr);
|
55
|
+
if (Array.isArray(urls)) {
|
56
|
+
this.server.setBaseUrlArr(new Set(urls));
|
57
|
+
httpInterceptor.setIgnoredUrls(this.handleIgnoredUrls());
|
58
|
+
}
|
59
|
+
}
|
60
|
+
}
|
61
|
+
|
62
|
+
this.server.addUrlsListener((urlArr) => {
|
63
|
+
if (this.storage) {
|
64
|
+
this.storage.setItem(URLS_KEY, JSON.stringify(urlArr));
|
65
|
+
}
|
66
|
+
httpInterceptor.setIgnoredUrls(this.handleIgnoredUrls());
|
67
|
+
});
|
68
|
+
};
|
69
|
+
|
70
|
+
config = ({ storage, timeout, testUrl, isAuto, baseData = {} }: Options) => {
|
71
|
+
if (isAuto) {
|
72
|
+
this.auto();
|
73
|
+
} else {
|
74
|
+
this.unAuto();
|
75
|
+
}
|
76
|
+
this.storage = storage ?? getDefaultStorage();
|
77
|
+
this.setTimeout(timeout ?? DEFAULT_TIMEOUT);
|
78
|
+
this.setBaseUrl(testUrl);
|
79
|
+
this.setBaseData(baseData);
|
80
|
+
};
|
81
|
+
|
82
|
+
/**
|
83
|
+
* @deprecated 这个方法将在下一个主要版本中被移除。请使用 config({isAuto: true}) 替代。
|
84
|
+
*/
|
85
|
+
auto = () => {
|
86
|
+
this.startRecordNetwork();
|
87
|
+
this.startRecordLog();
|
88
|
+
this.isAuto = true;
|
89
|
+
};
|
90
|
+
|
91
|
+
unAuto = () => {
|
92
|
+
this.stopRecordLog();
|
93
|
+
httpInterceptor.disable();
|
94
|
+
httpInterceptor.removeAllListener();
|
95
|
+
this.isAuto = false;
|
96
|
+
};
|
97
|
+
|
98
|
+
startRecordLog = () => {
|
99
|
+
console.log = (...data: any[]) => {
|
100
|
+
this.log(...data);
|
101
|
+
if (!__DEV__) {
|
102
|
+
return;
|
103
|
+
}
|
104
|
+
logger.log(...data);
|
105
|
+
};
|
106
|
+
|
107
|
+
console.warn = (...data: any[]) => {
|
108
|
+
this.warn(...data);
|
109
|
+
if (!__DEV__) {
|
110
|
+
return;
|
111
|
+
}
|
112
|
+
logger.warn(...data);
|
113
|
+
};
|
114
|
+
|
115
|
+
console.error = (...data: any[]) => {
|
116
|
+
this.error(...data);
|
117
|
+
if (!__DEV__) {
|
118
|
+
return;
|
119
|
+
}
|
120
|
+
logger.error(...data);
|
121
|
+
};
|
122
|
+
};
|
123
|
+
|
124
|
+
stopRecordLog = () => {
|
125
|
+
console.log = logger.log;
|
126
|
+
console.warn = logger.warn;
|
127
|
+
console.error = logger.error;
|
128
|
+
};
|
129
|
+
|
130
|
+
private handleIgnoredUrls = () => {
|
131
|
+
const urls = this.server?.getBaseUrlArr?.();
|
132
|
+
const ignoredUrls: string[] = [];
|
133
|
+
if (urls?.size) {
|
134
|
+
urls.forEach((url) => {
|
135
|
+
ignoredUrls.push(`${url}/log`, `${url}/network`, `${url}/join`);
|
136
|
+
});
|
137
|
+
}
|
138
|
+
return ignoredUrls;
|
139
|
+
};
|
140
|
+
|
141
|
+
startRecordNetwork = () => {
|
142
|
+
httpInterceptor.addListener('send', (data) => {
|
143
|
+
this.server?.network({
|
144
|
+
url: data.url,
|
145
|
+
id: data.id,
|
146
|
+
method: data.method,
|
147
|
+
headers: data.requestHeaders,
|
148
|
+
body: data.requestData,
|
149
|
+
createTime: data.startTime,
|
150
|
+
});
|
151
|
+
});
|
152
|
+
httpInterceptor.addListener('response', (data) => {
|
153
|
+
this.server?.network({
|
154
|
+
headers: data.responseHeaders,
|
155
|
+
body: data.responseData,
|
156
|
+
requestId: data.id,
|
157
|
+
statusCode: data.status,
|
158
|
+
endTime: data.endTime,
|
159
|
+
});
|
160
|
+
});
|
161
|
+
httpInterceptor.enable({ ignoredUrls: this.handleIgnoredUrls() });
|
162
|
+
};
|
163
|
+
|
164
|
+
/**
|
165
|
+
* @deprecated 这个方法将在下一个主要版本中被移除。请使用 config({testUrl: ''}) 替代。
|
166
|
+
*/
|
167
|
+
setBaseUrl = (url?: string) => {
|
168
|
+
const tempUrl = url?.trim();
|
169
|
+
if (this.server) {
|
170
|
+
this.server.updateUrl(tempUrl);
|
171
|
+
} else {
|
172
|
+
this.server = new Server(tempUrl);
|
173
|
+
}
|
174
|
+
httpInterceptor.setIgnoredUrls(this.handleIgnoredUrls());
|
175
|
+
if (this.isAuto) {
|
176
|
+
this.startRecordNetwork();
|
177
|
+
this.startRecordLog();
|
178
|
+
}
|
179
|
+
};
|
180
|
+
|
181
|
+
/**
|
182
|
+
* @deprecated 这个方法将在下一个主要版本中被移除。请使用 config({timeout: 3000}) 替代。
|
183
|
+
*/
|
184
|
+
setTimeout = (timeout: number) => {
|
185
|
+
if (typeof timeout === 'number') {
|
186
|
+
this.timeout = timeout;
|
187
|
+
this.server?.updateTimeout(this.timeout);
|
188
|
+
}
|
189
|
+
};
|
190
|
+
|
191
|
+
/**
|
192
|
+
* @deprecated 这个方法将在下一个主要版本中被移除。移除后将不再支持获取超时时间。
|
193
|
+
*/
|
194
|
+
getTimeout = () => {
|
195
|
+
if (typeof this.timeout === 'number') {
|
196
|
+
return this.timeout;
|
197
|
+
}
|
198
|
+
return null;
|
199
|
+
};
|
200
|
+
|
201
|
+
/**
|
202
|
+
* @deprecated 这个方法将在下一个主要版本中被移除。请使用 config({baseData: {}}) 替代。
|
203
|
+
*/
|
204
|
+
setBaseData = (data: Record<string, any> = {}) => {
|
205
|
+
this.server?.updateBaseData(data);
|
206
|
+
};
|
207
|
+
|
208
|
+
private _log = (level: string, tag: string, ...data: any[]) => {
|
209
|
+
const sendData = {
|
210
|
+
message: data,
|
211
|
+
tag,
|
212
|
+
level: level ?? 'log',
|
213
|
+
createTime: Date.now(),
|
214
|
+
};
|
215
|
+
this.server?.log(sendData);
|
216
|
+
};
|
217
|
+
|
218
|
+
tag = (tag: string, ...data: any[]) => {
|
219
|
+
this._log(Level.LOG, tag, ...data);
|
220
|
+
};
|
221
|
+
|
222
|
+
log = (...data: any[]) => {
|
223
|
+
this._log(Level.LOG, Tag.DEFAULT, ...data);
|
224
|
+
};
|
225
|
+
|
226
|
+
warn = (...data: any[]) => {
|
227
|
+
this._log(Level.WARN, Tag.DEFAULT, ...data);
|
228
|
+
};
|
229
|
+
|
230
|
+
error = (...data: any[]) => {
|
231
|
+
this._log(Level.ERROR, Tag.DEFAULT, ...data);
|
232
|
+
};
|
233
|
+
}
|
234
|
+
const logPlugin = new LogPlugin();
|
235
|
+
export default logPlugin;
|
package/src/logger.ts
CHANGED
@@ -1,15 +1,15 @@
|
|
1
|
-
const [log, warn, error] = [console.log, console.warn, console.error];
|
2
|
-
|
3
|
-
const logger = {
|
4
|
-
log: (...data: any[]) => {
|
5
|
-
log(...data)
|
6
|
-
},
|
7
|
-
warn: (...data: any[]) => {
|
8
|
-
warn(...data)
|
9
|
-
},
|
10
|
-
error: (...data: any[]) => {
|
11
|
-
error(...data)
|
12
|
-
},
|
13
|
-
}
|
14
|
-
|
15
|
-
export default logger
|
1
|
+
const [log, warn, error] = [console.log, console.warn, console.error];
|
2
|
+
|
3
|
+
const logger = {
|
4
|
+
log: (...data: any[]) => {
|
5
|
+
log(...data)
|
6
|
+
},
|
7
|
+
warn: (...data: any[]) => {
|
8
|
+
warn(...data)
|
9
|
+
},
|
10
|
+
error: (...data: any[]) => {
|
11
|
+
error(...data)
|
12
|
+
},
|
13
|
+
}
|
14
|
+
|
15
|
+
export default logger
|