UNPKG

4.05 kBJavaScriptView Raw
1'use strict';
2
3import UUID from 'uuid-js';
4
5import * as Constants from './Constants';
6import Queue from './lib/Queue';
7
8let logQueue = new Queue();
9let logCounter = 0;
10let sessionId = UUID.create().toString();
11let isSendingLogs = false;
12let groupDepth = 0;
13
14export function enableXDELogging() {
15 // don't use level below info. only use debug for things that
16 // shouldn't be shown to the developer.
17 replaceConsoleFunction('log', 'info');
18 replaceConsoleFunction('debug', 'info');
19 replaceConsoleFunction('info', 'info');
20 replaceConsoleFunction('warn', 'warn');
21 replaceConsoleFunction('error', 'error');
22
23 // console.group
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 // console.assert
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 // TODO: support rest of console methods
85}
86
87export 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 // TODO: support rest of console methods
101}
102
103/** Helpers **/
104
105async 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
143function queueRemoteLog(level, additionalFields, args) {
144 logQueue.enqueue({
145 count: logCounter++,
146 level,
147 groupDepth,
148 body: args,
149 ...additionalFields,
150 });
151
152 // don't block on this
153 sendRemoteLogsAsync();
154}
155
156function 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// Enable by default
173if (Constants.manifest && Constants.manifest.logUrl) {
174 enableXDELogging();
175}