1 | 'use strict';
|
2 |
|
3 | import UUID from 'uuid-js';
|
4 |
|
5 | import * as Constants from './Constants';
|
6 | import Queue from './lib/Queue';
|
7 |
|
8 | let logQueue = new Queue();
|
9 | let logCounter = 0;
|
10 | let sessionId = UUID.create().toString();
|
11 | let isSendingLogs = false;
|
12 | let groupDepth = 0;
|
13 |
|
14 | export function enableXDELogging() {
|
15 |
|
16 |
|
17 | replaceConsoleFunction('log', 'info');
|
18 | replaceConsoleFunction('debug', 'info');
|
19 | replaceConsoleFunction('info', 'info');
|
20 | replaceConsoleFunction('warn', 'warn');
|
21 | replaceConsoleFunction('error', 'error');
|
22 |
|
23 |
|
24 | let originalGroup = console.group;
|
25 | console.group = function(...args) {
|
26 | if (originalGroup) {
|
27 | originalGroup.apply(console, args);
|
28 | }
|
29 |
|
30 | queueRemoteLog('info', {}, args);
|
31 | groupDepth++;
|
32 | };
|
33 | console.group.__restore = function() {
|
34 | console.group = originalGroup;
|
35 | };
|
36 |
|
37 | let originalGroupCollapsed = console.groupCollapsed;
|
38 | console.groupCollapsed = function(...args) {
|
39 | if (originalGroupCollapsed) {
|
40 | originalGroupCollapsed.apply(console, args);
|
41 | }
|
42 |
|
43 | queueRemoteLog('info', {
|
44 | groupCollapsed: true,
|
45 | }, args);
|
46 | groupDepth++;
|
47 | };
|
48 | console.groupCollapsed.__restore = function() {
|
49 | console.groupCollapsed = originalGroupCollapsed;
|
50 | };
|
51 |
|
52 | let originalGroupEnd = console.groupEnd;
|
53 | console.groupEnd = function(...args) {
|
54 | if (originalGroupEnd) {
|
55 | originalGroupEnd.apply(console, args);
|
56 | }
|
57 |
|
58 | if (groupDepth > 0) {
|
59 | groupDepth--;
|
60 | }
|
61 | queueRemoteLog('info', {
|
62 | shouldHide: true,
|
63 | }, args);
|
64 | };
|
65 | console.groupEnd.__restore = function() {
|
66 | console.groupEnd = originalGroupEnd;
|
67 | };
|
68 |
|
69 |
|
70 | let originalAssert = console.assert;
|
71 | console.assert = function(assertion, errorString) {
|
72 | if (originalAssert) {
|
73 | originalAssert.apply(console, [assertion, errorString]);
|
74 | }
|
75 |
|
76 | if (!assertion) {
|
77 | queueRemoteLog('error', {}, `Assertion failed: ${errorString}`);
|
78 | }
|
79 | };
|
80 | console.assert.__restore = function() {
|
81 | console.assert = originalAssert;
|
82 | };
|
83 |
|
84 |
|
85 | }
|
86 |
|
87 | export function disableXDELogging() {
|
88 | console.log.__restore();
|
89 | console.debug.__restore();
|
90 | console.info.__restore();
|
91 | console.warn.__restore();
|
92 | console.error.__restore();
|
93 |
|
94 | console.group.__restore();
|
95 | console.groupCollapsed.__restore();
|
96 | console.groupEnd.__restore();
|
97 |
|
98 | console.assert.__restore();
|
99 |
|
100 |
|
101 | }
|
102 |
|
103 |
|
104 |
|
105 | async function sendRemoteLogsAsync() {
|
106 | if (isSendingLogs) {
|
107 | return;
|
108 | }
|
109 |
|
110 | let logs = [];
|
111 | let currentLog = logQueue.dequeue();
|
112 | if (!currentLog) {
|
113 | return;
|
114 | } else {
|
115 | isSendingLogs = true;
|
116 | }
|
117 |
|
118 | while (currentLog) {
|
119 | logs.push(currentLog);
|
120 | currentLog = logQueue.dequeue();
|
121 | }
|
122 |
|
123 | try {
|
124 | await fetch(Constants.manifest.logUrl, {
|
125 | method: 'post',
|
126 | headers: {
|
127 | 'Content-Type': 'application/json',
|
128 | 'Connection': 'keep-alive',
|
129 | 'Proxy-Connection': 'keep-alive',
|
130 | 'Accept': 'application/json',
|
131 | 'Device-Id': Constants.deviceId,
|
132 | 'Device-Name': Constants.deviceName,
|
133 | 'Session-Id': sessionId,
|
134 | },
|
135 | body: JSON.stringify(logs),
|
136 | });
|
137 | } catch (e) {}
|
138 |
|
139 | isSendingLogs = false;
|
140 | sendRemoteLogsAsync();
|
141 | }
|
142 |
|
143 | function queueRemoteLog(level, additionalFields, args) {
|
144 | logQueue.enqueue({
|
145 | count: logCounter++,
|
146 | level,
|
147 | groupDepth,
|
148 | body: args,
|
149 | ...additionalFields,
|
150 | });
|
151 |
|
152 |
|
153 | sendRemoteLogsAsync();
|
154 | }
|
155 |
|
156 | function replaceConsoleFunction(consoleFunc, level, additionalFields) {
|
157 | const original = console[consoleFunc];
|
158 | const newConsoleFunc = function(...args) {
|
159 | if (original) {
|
160 | original.apply(console, args);
|
161 | }
|
162 | queueRemoteLog(level, additionalFields, args);
|
163 | };
|
164 |
|
165 | newConsoleFunc.__restore = function() {
|
166 | console[consoleFunc] = original;
|
167 | };
|
168 |
|
169 | console[consoleFunc] = newConsoleFunc;
|
170 | }
|
171 |
|
172 |
|
173 | if (Constants.manifest && Constants.manifest.logUrl) {
|
174 | enableXDELogging();
|
175 | }
|