feat: Support reporting multiple logs (#49)

* fix: update message

* feat: reports multiple errors

* docs: add comment

* fix: ajax errors

* fix: report errors log
diff --git a/src/errors/ajax.ts b/src/errors/ajax.ts
index 1a4879a..d2174b5 100644
--- a/src/errors/ajax.ts
+++ b/src/errors/ajax.ts
@@ -17,7 +17,7 @@
 
 import uuid from '../services/uuid';
 import Base from '../services/base';
-import { GradeTypeEnum, ErrorsCategory } from '../services/constant';
+import { GradeTypeEnum, ErrorsCategory, ReportTypes } from '../services/constant';
 
 class AjaxErrors extends Base {
   // get http error info
@@ -29,6 +29,11 @@
     const xhrEvent = (event: any) => {
       try {
         if (event && event.currentTarget && (event.currentTarget.status >= 400 || event.currentTarget.status === 0)) {
+          const response = 'net::ERR_EMPTY_RESPONSE';
+
+          if (event.target && event.target.getRequestConfig[1] === options.collector + ReportTypes.ERRORS) {
+            return;
+          }
           this.logInfo = {
             uniqueId: uuid(),
             service: options.service,
@@ -36,10 +41,10 @@
             pagePath: options.pagePath,
             category: ErrorsCategory.AJAX_ERROR,
             grade: GradeTypeEnum.ERROR,
-            errorUrl: event.target.responseURL,
-            message: event.target.response,
+            errorUrl: event.target.getRequestConfig[1],
+            message: event.target.response || response,
             collector: options.collector,
-            stack: event.type + ':' + event.target.response,
+            stack: event.type + ': ' + (event.target.response || response),
           };
           this.traceInfo();
         }
diff --git a/src/services/base.ts b/src/services/base.ts
index bd4a508..9c8ac20 100644
--- a/src/services/base.ts
+++ b/src/services/base.ts
@@ -41,41 +41,13 @@
       jsErrorPv = true;
       this.logInfo.firstReportedError = true;
     }
-    this.handleRecordError();
+    const collector = this.logInfo.collector;
+
+    delete this.logInfo.collector;
+    Task.addTask(this.logInfo, collector);
+    // report errors within 1min
     setTimeout(() => {
       Task.fireTasks();
-    }, 100);
-  }
-
-  private handleRecordError() {
-    try {
-      if (!this.logInfo.message) {
-        return;
-      }
-      const errorInfo = this.handleErrorInfo();
-
-      Task.addTask(errorInfo);
-    } catch (error) {
-      throw error;
-    }
-  }
-
-  private handleErrorInfo() {
-    let message = `error category:${this.logInfo.category}\r\n log info:${this.logInfo.message}\r\n
-      error url: ${this.logInfo.errorUrl}\r\n `;
-
-    switch (this.logInfo.category) {
-      case ErrorsCategory.JS_ERROR:
-        message += `error line number: ${this.logInfo.line}\r\n error col number:${this.logInfo.col}\r\n`;
-        break;
-      default:
-        message;
-        break;
-    }
-    const recordInfo = {
-      ...this.logInfo,
-      message,
-    };
-    return recordInfo;
+    }, 60000);
   }
 }
diff --git a/src/services/report.ts b/src/services/report.ts
index 263bf8e..96ddae4 100644
--- a/src/services/report.ts
+++ b/src/services/report.ts
@@ -51,7 +51,6 @@
   }
 
   public sendByXhr(data: any) {
-    delete data.collector;
     if (!this.url) {
       return;
     }
diff --git a/src/services/task.ts b/src/services/task.ts
index 0fd44df..b777a43 100644
--- a/src/services/task.ts
+++ b/src/services/task.ts
@@ -14,23 +14,24 @@
  * See the License for the specific language governing permissions and
  * limitations under the License.
  */
+import { ErrorInfoFeilds, ReportFields } from './types';
 import Report from './report';
 
 class TaskQueue {
-  private queues: any[] = [];
+  private queues: ((ErrorInfoFeilds & ReportFields) | undefined)[] = [];
+  private collector: string = '';
 
-  public addTask(data: any) {
-    this.queues.push({ data });
+  public addTask(data: ErrorInfoFeilds & ReportFields, collector: string) {
+    this.queues.push(data);
+    this.collector = collector;
   }
 
   public fireTasks() {
-    if (!this.queues || !this.queues.length) {
+    if (!(this.queues && this.queues.length)) {
       return;
     }
-    const item = this.queues[0];
-    new Report('ERROR', item.data.collector).sendByXhr(item.data);
-    this.queues.splice(0, 1);
-    this.fireTasks();
+    new Report('ERRORS', this.collector).sendByXhr(this.queues);
+    this.queues = [];
   }
 }
 
diff --git a/src/trace/interceptors/fetch.ts b/src/trace/interceptors/fetch.ts
index 5d946ed..5bbb1e2 100644
--- a/src/trace/interceptors/fetch.ts
+++ b/src/trace/interceptors/fetch.ts
@@ -73,6 +73,10 @@
         const index = segment.spans.length;
         const values = `${1}-${traceIdStr}-${segmentId}-${index}-${service}-${instance}-${endpoint}-${peer}`;
 
+        if (!args[1]) {
+          args[1] = {};
+          args[1].headers = {};
+        }
         args[1].headers['sw8'] = values;
       }