@cloudcare/browser-core 3.1.24 → 3.2.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/cjs/browser/pageExitObservable.js +1 -1
- package/cjs/browser/pageExitObservable.js.map +1 -1
- package/cjs/console/consoleObservable.js +17 -9
- package/cjs/console/consoleObservable.js.map +1 -1
- package/cjs/dataMap.js +11 -2
- package/cjs/dataMap.js.map +1 -1
- package/cjs/helper/boundedBuffer.js +21 -17
- package/cjs/helper/boundedBuffer.js.map +1 -1
- package/cjs/helper/byteUtils.js +4 -15
- package/cjs/helper/byteUtils.js.map +1 -1
- package/cjs/helper/connectivity.js +16 -0
- package/cjs/helper/connectivity.js.map +1 -0
- package/cjs/helper/display.js +15 -12
- package/cjs/helper/display.js.map +1 -1
- package/cjs/helper/displayAlreadyInitializedError.js +13 -0
- package/cjs/helper/displayAlreadyInitializedError.js.map +1 -0
- package/cjs/helper/encoder.js +43 -0
- package/cjs/helper/encoder.js.map +1 -0
- package/cjs/helper/lifeCycle.js +0 -1
- package/cjs/helper/lifeCycle.js.map +1 -1
- package/cjs/helper/limitModification.js +5 -16
- package/cjs/helper/limitModification.js.map +1 -1
- package/cjs/helper/monitor.js +6 -6
- package/cjs/helper/monitor.js.map +1 -1
- package/cjs/helper/serialisation/jsonStringify.js.map +1 -1
- package/cjs/helper/valueHistory.js +6 -17
- package/cjs/helper/valueHistory.js.map +1 -1
- package/cjs/index.js +33 -0
- package/cjs/index.js.map +1 -1
- package/cjs/report/reportObservable.js +26 -20
- package/cjs/report/reportObservable.js.map +1 -1
- package/cjs/telemetry/telemetry.js +60 -31
- package/cjs/telemetry/telemetry.js.map +1 -1
- package/cjs/telemetry/types.js +2 -1
- package/cjs/telemetry/types.js.map +1 -1
- package/cjs/transport/batch.js +129 -79
- package/cjs/transport/batch.js.map +1 -1
- package/cjs/transport/flushController.js +18 -5
- package/cjs/transport/flushController.js.map +1 -1
- package/cjs/transport/httpRequest.js +35 -22
- package/cjs/transport/httpRequest.js.map +1 -1
- package/cjs/transport/index.js +4 -4
- package/cjs/transport/index.js.map +1 -1
- package/cjs/transport/startBatchWithReplica.js +26 -10
- package/cjs/transport/startBatchWithReplica.js.map +1 -1
- package/esm/browser/pageExitObservable.js +1 -1
- package/esm/browser/pageExitObservable.js.map +1 -1
- package/esm/console/consoleObservable.js +18 -10
- package/esm/console/consoleObservable.js.map +1 -1
- package/esm/dataMap.js +11 -2
- package/esm/dataMap.js.map +1 -1
- package/esm/helper/boundedBuffer.js +21 -16
- package/esm/helper/boundedBuffer.js.map +1 -1
- package/esm/helper/byteUtils.js +4 -15
- package/esm/helper/byteUtils.js.map +1 -1
- package/esm/helper/connectivity.js +10 -0
- package/esm/helper/connectivity.js.map +1 -0
- package/esm/helper/display.js +12 -11
- package/esm/helper/display.js.map +1 -1
- package/esm/helper/displayAlreadyInitializedError.js +7 -0
- package/esm/helper/displayAlreadyInitializedError.js.map +1 -0
- package/esm/helper/encoder.js +37 -0
- package/esm/helper/encoder.js.map +1 -0
- package/esm/helper/lifeCycle.js +0 -1
- package/esm/helper/lifeCycle.js.map +1 -1
- package/esm/helper/limitModification.js +5 -16
- package/esm/helper/limitModification.js.map +1 -1
- package/esm/helper/monitor.js +6 -6
- package/esm/helper/monitor.js.map +1 -1
- package/esm/helper/serialisation/jsonStringify.js.map +1 -1
- package/esm/helper/valueHistory.js +6 -17
- package/esm/helper/valueHistory.js.map +1 -1
- package/esm/index.js +3 -0
- package/esm/index.js.map +1 -1
- package/esm/report/reportObservable.js +27 -21
- package/esm/report/reportObservable.js.map +1 -1
- package/esm/telemetry/telemetry.js +57 -31
- package/esm/telemetry/telemetry.js.map +1 -1
- package/esm/telemetry/types.js +2 -1
- package/esm/telemetry/types.js.map +1 -1
- package/esm/transport/batch.js +127 -77
- package/esm/transport/batch.js.map +1 -1
- package/esm/transport/flushController.js +18 -5
- package/esm/transport/flushController.js.map +1 -1
- package/esm/transport/httpRequest.js +35 -22
- package/esm/transport/httpRequest.js.map +1 -1
- package/esm/transport/index.js +1 -1
- package/esm/transport/index.js.map +1 -1
- package/esm/transport/startBatchWithReplica.js +27 -11
- package/esm/transport/startBatchWithReplica.js.map +1 -1
- package/package.json +2 -2
- package/src/browser/pageExitObservable.js +2 -2
- package/src/console/consoleObservable.js +22 -14
- package/src/dataMap.js +11 -2
- package/src/helper/boundedBuffer.js +21 -14
- package/src/helper/byteUtils.js +2 -1
- package/src/helper/connectivity.js +11 -0
- package/src/helper/display.js +16 -14
- package/src/helper/displayAlreadyInitializedError.js +7 -0
- package/src/helper/encoder.js +43 -0
- package/src/helper/lifeCycle.js +0 -1
- package/src/helper/limitModification.js +2 -1
- package/src/helper/monitor.js +6 -6
- package/src/helper/serialisation/jsonStringify.js +1 -1
- package/src/helper/valueHistory.js +2 -1
- package/src/index.js +3 -0
- package/src/report/reportObservable.js +43 -27
- package/src/telemetry/telemetry.js +60 -37
- package/src/telemetry/types.js +2 -1
- package/src/transport/batch.js +154 -89
- package/src/transport/flushController.js +19 -6
- package/src/transport/httpRequest.js +34 -35
- package/src/transport/index.js +1 -1
- package/src/transport/startBatchWithReplica.js +25 -14
- package/types/index.d.ts +12 -0
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"telemetry.js","names":["ConsoleApiName","toStackTraceString","NO_ERROR_STACK_PRESENT_MESSAGE","computeStackTrace","Observable","displayIfDebugEnabled","startMonitorErrorCollection","startsWith","assign","performDraw","timeStampNow","extend2Lev","jsonStringify","NonErrorPrefix","TelemetryStatusType","TelemetryType","ALLOWED_FRAME_URLS","TelemetryService","LOGS","RUM","telemetryConfiguration","maxEventsPerPage","sentEventCount","telemetryEnabled","onRawTelemetryEventCollected","startTelemetry","telemetryService","configuration","contextProvider","observable","telemetrySampleRate","rawEvent","event","toTelemetryEvent","notify","addTelemetryError","maxTelemetryEventsPerPage","type","date","service","version","__BUILD_ENV__SDK_VERSION__","source","telemetry","undefined","setContextProvider","provider","enabled","resetTelemetry","addTelemetryDebug","message","context","debug","addTelemetry","log","status","e","error","formatError","addTelemetryConfiguration","Error","stackTrace","kind","name","stack","scrubCustomerFrames","UNCAUGHT","filter","frame","url","some","allowedFrameUrl"],"sources":["../../src/telemetry/telemetry.js"],"sourcesContent":["import { ConsoleApiName } from '../helper/display'\nimport {\n toStackTraceString,\n NO_ERROR_STACK_PRESENT_MESSAGE\n} from '../helper/errorTools'\nimport { computeStackTrace } from '../tracekit'\nimport { Observable } from '../helper/observable'\nimport {\n displayIfDebugEnabled,\n startMonitorErrorCollection\n} from '..//helper/monitor'\nimport {\n startsWith,\n assign,\n performDraw,\n timeStampNow,\n extend2Lev\n} from '../helper/tools'\nimport { jsonStringify } from '../helper/serialisation/jsonStringify'\nimport { NonErrorPrefix } from '../helper/enums'\nimport { TelemetryStatusType, TelemetryType } from './types'\n\nconst ALLOWED_FRAME_URLS = [\n 'https://static.guance.com',\n 'http://localhost',\n '<anonymous>'\n]\n\nexport var TelemetryService = {\n LOGS: 'browser-logs-sdk',\n RUM: 'browser-rum-sdk'\n}\n\nvar telemetryConfiguration = {\n maxEventsPerPage: 0,\n sentEventCount: 0,\n telemetryEnabled: false\n}\n\nvar onRawTelemetryEventCollected\n\nexport function startTelemetry(telemetryService, configuration) {\n let contextProvider\n var observable = new Observable()\n telemetryConfiguration.telemetryEnabled =\n configuration.telemetryEnabled &&\n performDraw(configuration.telemetrySampleRate)\n\n onRawTelemetryEventCollected = function (rawEvent) {\n if (telemetryConfiguration.telemetryEnabled) {\n var event = toTelemetryEvent(telemetryService, rawEvent)\n observable.notify(event)\n }\n }\n startMonitorErrorCollection(addTelemetryError)\n\n assign(telemetryConfiguration, {\n maxEventsPerPage: configuration.maxTelemetryEventsPerPage,\n sentEventCount: 0\n })\n\n function toTelemetryEvent(telemetryService, event) {\n return extend2Lev(\n {\n type: 'telemetry',\n date: timeStampNow(),\n service: telemetryService,\n version: __BUILD_ENV__SDK_VERSION__,\n source: 'browser',\n telemetry: event // https://github.com/microsoft/TypeScript/issues/48457\n },\n contextProvider !== undefined ? contextProvider() : {}\n )\n }\n\n return {\n setContextProvider: function (provider) {\n contextProvider = provider\n },\n observable: observable,\n enabled: telemetryConfiguration.telemetryEnabled\n }\n}\n\nexport function resetTelemetry() {\n onRawTelemetryEventCollected = undefined\n}\n\nexport function addTelemetryDebug(message, context) {\n displayIfDebugEnabled(ConsoleApiName.debug, message, context)\n addTelemetry(\n assign(\n {\n type: TelemetryType.log,\n message: message,\n status: TelemetryStatusType.debug\n },\n context\n )\n )\n}\n\nexport function addTelemetryError(e, context) {\n addTelemetry(\n assign(\n {\n type: TelemetryType.log,\n status: TelemetryStatusType.error\n },\n formatError(e),\n context\n )\n )\n}\n\nexport function addTelemetryConfiguration(configuration) {\n if (telemetryConfiguration.telemetryEnabled) {\n addTelemetry({\n type: TelemetryType.configuration,\n configuration: configuration\n })\n }\n}\n\nfunction addTelemetry(event) {\n if (\n onRawTelemetryEventCollected &&\n telemetryConfiguration.sentEventCount <\n telemetryConfiguration.maxEventsPerPage\n ) {\n telemetryConfiguration.sentEventCount += 1\n onRawTelemetryEventCollected(event)\n }\n}\n\nexport function formatError(e) {\n if (e instanceof Error) {\n var stackTrace = computeStackTrace(e)\n return {\n error: {\n kind: stackTrace.name,\n stack: toStackTraceString(scrubCustomerFrames(stackTrace))\n },\n message: stackTrace.message\n }\n }\n return {\n error: {\n stack: NO_ERROR_STACK_PRESENT_MESSAGE\n },\n message: NonErrorPrefix.UNCAUGHT + ' ' + jsonStringify(e)\n }\n}\n\nexport function scrubCustomerFrames(stackTrace) {\n stackTrace.stack = stackTrace.stack.filter(function (frame) {\n return (\n !frame.url ||\n ALLOWED_FRAME_URLS.some(function (allowedFrameUrl) {\n return startsWith(frame.url, allowedFrameUrl)\n })\n )\n })\n return stackTrace\n}\n"],"mappings":"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","ignoreList":[]}
|
|
1
|
+
{"version":3,"file":"telemetry.js","names":["ConsoleApiName","toStackTraceString","NO_ERROR_STACK_PRESENT_MESSAGE","createBoundedBuffer","computeStackTrace","Observable","getConnectivity","displayIfDebugEnabled","startMonitorErrorCollection","startsWith","assign","performDraw","timeStampNow","extend2Lev","jsonStringify","NonErrorPrefix","TelemetryStatusType","TelemetryType","ALLOWED_FRAME_URLS","TelemetryService","LOGS","RUM","preStartTelemetryBuffer","onRawTelemetryEventCollected","event","add","startTelemetry","telemetryService","configuration","contextProvider","observable","alreadySentEvents","Set","telemetryEnabled","telemetrySampleRate","runtimeEnvInfo","getRuntimeEnvInfo","_onRawTelemetryEventCollected","rawEvent","stringifiedEvent","size","maxTelemetryEventsPerPage","has","toTelemetryEvent","notify","addTelemetryError","type","date","service","version","__BUILD_ENV__SDK_VERSION__","source","telemetry","runtime_env","connectivity","undefined","setContextProvider","provider","enabled","is_local_file","window","location","protocol","is_worker","self","startFakeTelemetry","events","push","drainPreStartTelemetry","drain","resetTelemetry","addTelemetryDebug","message","context","log","status","debug","e","error","formatError","addTelemetryConfiguration","addTelemetryUsage","usage","Error","stackTrace","kind","name","stack","scrubCustomerFrames","UNCAUGHT","filter","frame","url","some","allowedFrameUrl"],"sources":["../../src/telemetry/telemetry.js"],"sourcesContent":["import { ConsoleApiName } from '../helper/display'\nimport {\n toStackTraceString,\n NO_ERROR_STACK_PRESENT_MESSAGE\n} from '../helper/errorTools'\nimport { createBoundedBuffer } from '../helper/boundedBuffer'\nimport { computeStackTrace } from '../tracekit'\nimport { Observable } from '../helper/observable'\nimport { getConnectivity } from '../helper/connectivity'\nimport {\n displayIfDebugEnabled,\n startMonitorErrorCollection\n} from '..//helper/monitor'\nimport {\n startsWith,\n assign,\n performDraw,\n timeStampNow,\n extend2Lev\n} from '../helper/tools'\nimport { jsonStringify } from '../helper/serialisation/jsonStringify'\nimport { NonErrorPrefix } from '../helper/enums'\nimport { TelemetryStatusType, TelemetryType } from './types'\n\nconst ALLOWED_FRAME_URLS = [\n 'https://static.guance.com',\n 'http://localhost',\n '<anonymous>'\n]\n\nexport var TelemetryService = {\n LOGS: 'browser-logs-sdk',\n RUM: 'browser-rum-sdk'\n}\n\n// eslint-disable-next-line local-rules/disallow-side-effects\nvar preStartTelemetryBuffer = createBoundedBuffer()\nvar onRawTelemetryEventCollected = function (event) {\n preStartTelemetryBuffer.add(function () {\n onRawTelemetryEventCollected(event)\n })\n}\n\nexport function startTelemetry(telemetryService, configuration) {\n let contextProvider\n var observable = new Observable()\n const alreadySentEvents = new Set()\n const telemetryEnabled =\n configuration.telemetryEnabled &&\n performDraw(configuration.telemetrySampleRate)\n const runtimeEnvInfo = getRuntimeEnvInfo()\n onRawTelemetryEventCollected = function (rawEvent) {\n const stringifiedEvent = jsonStringify(rawEvent)\n if (\n telemetryEnabled &&\n alreadySentEvents.size < configuration.maxTelemetryEventsPerPage &&\n !alreadySentEvents.has(stringifiedEvent)\n ) {\n var event = toTelemetryEvent(telemetryService, rawEvent, runtimeEnvInfo)\n observable.notify(event)\n alreadySentEvents.add(stringifiedEvent)\n }\n }\n startMonitorErrorCollection(addTelemetryError)\n\n function toTelemetryEvent(telemetryService, event, runtimeEnvInfo) {\n return extend2Lev(\n {\n type: 'telemetry',\n date: timeStampNow(),\n service: telemetryService,\n version: __BUILD_ENV__SDK_VERSION__,\n source: 'browser',\n telemetry: extend2Lev(event, {\n runtime_env: runtimeEnvInfo,\n connectivity: getConnectivity()\n })\n },\n contextProvider !== undefined ? contextProvider() : {}\n )\n }\n\n return {\n setContextProvider: function (provider) {\n contextProvider = provider\n },\n observable: observable,\n enabled: telemetryEnabled\n }\n}\nfunction getRuntimeEnvInfo() {\n return {\n is_local_file: window.location.protocol === 'file:',\n is_worker: 'WorkerGlobalScope' in self\n }\n}\nexport function startFakeTelemetry() {\n const events = []\n\n onRawTelemetryEventCollected = function (event) {\n events.push(event)\n }\n\n return events\n}\nexport function drainPreStartTelemetry() {\n preStartTelemetryBuffer.drain()\n}\nexport function resetTelemetry() {\n preStartTelemetryBuffer = createBoundedBuffer()\n onRawTelemetryEventCollected = function (event) {\n preStartTelemetryBuffer.add(function () {\n onRawTelemetryEventCollected(event)\n })\n }\n}\n\nexport function addTelemetryDebug(message, context) {\n displayIfDebugEnabled(message, context)\n onRawTelemetryEventCollected(\n assign(\n {\n type: TelemetryType.log,\n message: message,\n status: TelemetryStatusType.debug\n },\n context\n )\n )\n}\n\nexport function addTelemetryError(e, context) {\n onRawTelemetryEventCollected(\n assign(\n {\n type: TelemetryType.log,\n status: TelemetryStatusType.error\n },\n formatError(e),\n context\n )\n )\n}\n\nexport function addTelemetryConfiguration(configuration) {\n onRawTelemetryEventCollected({\n type: TelemetryType.configuration,\n configuration: configuration\n })\n}\n\nexport function addTelemetryUsage(usage) {\n onRawTelemetryEventCollected({\n type: TelemetryType.usage,\n usage: usage\n })\n}\n\nexport function formatError(e) {\n if (e instanceof Error) {\n var stackTrace = computeStackTrace(e)\n return {\n error: {\n kind: stackTrace.name,\n stack: toStackTraceString(scrubCustomerFrames(stackTrace))\n },\n message: stackTrace.message\n }\n }\n return {\n error: {\n stack: NO_ERROR_STACK_PRESENT_MESSAGE\n },\n message: NonErrorPrefix.UNCAUGHT + ' ' + jsonStringify(e)\n }\n}\n\nexport function scrubCustomerFrames(stackTrace) {\n stackTrace.stack = stackTrace.stack.filter(function (frame) {\n return (\n !frame.url ||\n ALLOWED_FRAME_URLS.some(function (allowedFrameUrl) {\n return startsWith(frame.url, allowedFrameUrl)\n })\n )\n })\n return stackTrace\n}\n"],"mappings":"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","ignoreList":[]}
|
package/esm/telemetry/types.js
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"types.js","names":["TelemetryType","log","configuration","TelemetryStatusType","debug","error"],"sources":["../../src/telemetry/types.js"],"sourcesContent":["export var TelemetryType = {\n log: 'log',\n configuration: 'configuration'\n}\n\nexport var TelemetryStatusType = {\n debug: 'debug',\n error: 'error'\n}\n"],"mappings":"AAAA,OAAO,IAAIA,aAAa,GAAG;EACzBC,GAAG,EAAE,KAAK;EACVC,aAAa,EAAE;
|
|
1
|
+
{"version":3,"file":"types.js","names":["TelemetryType","log","configuration","usage","TelemetryStatusType","debug","error"],"sources":["../../src/telemetry/types.js"],"sourcesContent":["export var TelemetryType = {\n log: 'log',\n configuration: 'configuration',\n usage: 'usage'\n}\n\nexport var TelemetryStatusType = {\n debug: 'debug',\n error: 'error'\n}\n"],"mappings":"AAAA,OAAO,IAAIA,aAAa,GAAG;EACzBC,GAAG,EAAE,KAAK;EACVC,aAAa,EAAE,eAAe;EAC9BC,KAAK,EAAE;AACT,CAAC;AAED,OAAO,IAAIC,mBAAmB,GAAG;EAC/BC,KAAK,EAAE,OAAO;EACdC,KAAK,EAAE;AACT,CAAC","ignoreList":[]}
|
package/esm/transport/batch.js
CHANGED
|
@@ -8,7 +8,6 @@ import { isPageExitReason } from '../browser/pageExitObservable';
|
|
|
8
8
|
import { jsonStringify } from '../helper/serialisation/jsonStringify';
|
|
9
9
|
// https://en.wikipedia.org/wiki/UTF-8
|
|
10
10
|
// eslint-disable-next-line no-control-regex
|
|
11
|
-
var HAS_MULTI_BYTES_CHARACTERS = /[^\u0000-\u007F]/;
|
|
12
11
|
var CUSTOM_KEYS = 'custom_keys';
|
|
13
12
|
export var processedMessageByDataMap = function processedMessageByDataMap(message) {
|
|
14
13
|
if (!message || !message.type) return {
|
|
@@ -101,93 +100,144 @@ export var processedMessageByDataMap = function processedMessageByDataMap(messag
|
|
|
101
100
|
rowData: hasFileds ? rowData : undefined
|
|
102
101
|
};
|
|
103
102
|
};
|
|
104
|
-
|
|
105
|
-
|
|
106
|
-
|
|
107
|
-
|
|
108
|
-
|
|
109
|
-
|
|
110
|
-
|
|
111
|
-
var
|
|
112
|
-
|
|
113
|
-
_this.flush(event);
|
|
103
|
+
export function createBatch(options) {
|
|
104
|
+
var encoder = options.encoder;
|
|
105
|
+
var request = options.request;
|
|
106
|
+
var messageBytesLimit = options.messageBytesLimit;
|
|
107
|
+
var sendContentTypeByJson = options.sendContentTypeByJson;
|
|
108
|
+
var flushController = options.flushController;
|
|
109
|
+
var upsertBuffer = {};
|
|
110
|
+
var flushSubscription = flushController.flushObservable.subscribe(function (event) {
|
|
111
|
+
flush(event);
|
|
114
112
|
});
|
|
115
|
-
|
|
116
|
-
|
|
117
|
-
|
|
118
|
-
|
|
119
|
-
|
|
120
|
-
|
|
121
|
-
|
|
122
|
-
|
|
123
|
-
var messages = this.pushOnlyBuffer.concat(values(this.upsertBuffer));
|
|
124
|
-
this.pushOnlyBuffer = [];
|
|
125
|
-
this.upsertBuffer = {};
|
|
126
|
-
if (messages.length > 0) {
|
|
127
|
-
var payloadData = '';
|
|
128
|
-
if (this.sendContentTypeByJson) {
|
|
129
|
-
payloadData = '[' + messages.join(',') + ']';
|
|
113
|
+
function getMessageText(messages) {
|
|
114
|
+
var isEmpty = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : false;
|
|
115
|
+
if (sendContentTypeByJson) {
|
|
116
|
+
if (isEmpty) {
|
|
117
|
+
return '[' + messages.join(',');
|
|
118
|
+
} else {
|
|
119
|
+
return ',' + messages.join(',');
|
|
120
|
+
}
|
|
130
121
|
} else {
|
|
131
|
-
|
|
122
|
+
if (isEmpty) {
|
|
123
|
+
return messages.join('\n');
|
|
124
|
+
} else {
|
|
125
|
+
return '\n' + messages.join('\n');
|
|
126
|
+
}
|
|
132
127
|
}
|
|
133
|
-
|
|
134
|
-
|
|
135
|
-
|
|
136
|
-
|
|
137
|
-
|
|
138
|
-
|
|
139
|
-
this.request.sendOnExit(payload);
|
|
128
|
+
}
|
|
129
|
+
function push(serializedMessage, estimatedMessageBytesCount, key) {
|
|
130
|
+
flushController.notifyBeforeAddMessage(estimatedMessageBytesCount);
|
|
131
|
+
if (key !== undefined) {
|
|
132
|
+
upsertBuffer[key] = serializedMessage;
|
|
133
|
+
flushController.notifyAfterAddMessage();
|
|
140
134
|
} else {
|
|
141
|
-
|
|
135
|
+
encoder.write(getMessageText([serializedMessage], encoder.isEmpty()), function (realMessageBytesCount) {
|
|
136
|
+
flushController.notifyAfterAddMessage(realMessageBytesCount - estimatedMessageBytesCount);
|
|
137
|
+
});
|
|
142
138
|
}
|
|
143
139
|
}
|
|
144
|
-
|
|
145
|
-
|
|
146
|
-
var _process = this.process(message);
|
|
147
|
-
var processedMessage = _process.processedMessage;
|
|
148
|
-
var messageBytesCount = _process.messageBytesCount;
|
|
149
|
-
if (messageBytesCount >= this.messageBytesLimit) {
|
|
150
|
-
display.warn('Discarded a message whose size was bigger than the maximum allowed size ' + this.messageBytesLimit + 'KB.');
|
|
151
|
-
return;
|
|
140
|
+
function hasMessageFor(key) {
|
|
141
|
+
return key !== undefined && upsertBuffer[key] !== undefined;
|
|
152
142
|
}
|
|
153
|
-
|
|
154
|
-
|
|
143
|
+
function remove(key) {
|
|
144
|
+
var removedMessage = upsertBuffer[key];
|
|
145
|
+
delete upsertBuffer[key];
|
|
146
|
+
var messageBytesCount = encoder.estimateEncodedBytesCount(removedMessage);
|
|
147
|
+
flushController.notifyAfterRemoveMessage(messageBytesCount);
|
|
155
148
|
}
|
|
156
|
-
|
|
157
|
-
|
|
158
|
-
|
|
159
|
-
|
|
160
|
-
|
|
161
|
-
|
|
162
|
-
|
|
163
|
-
processedMessage
|
|
149
|
+
function process(message) {
|
|
150
|
+
var processedMessage = '';
|
|
151
|
+
if (sendContentTypeByJson) {
|
|
152
|
+
processedMessage = jsonStringify(processedMessageByDataMap(message).rowData);
|
|
153
|
+
} else {
|
|
154
|
+
processedMessage = processedMessageByDataMap(message).rowStr;
|
|
155
|
+
}
|
|
156
|
+
return processedMessage;
|
|
157
|
+
}
|
|
158
|
+
function addOrUpdate(message, key) {
|
|
159
|
+
var serializedMessage = process(message);
|
|
160
|
+
var estimatedMessageBytesCount = encoder.estimateEncodedBytesCount(serializedMessage);
|
|
161
|
+
if (estimatedMessageBytesCount >= messageBytesLimit) {
|
|
162
|
+
display.warn("Discarded a message whose size was bigger than the maximum allowed size ".concat(messageBytesLimit, "KB."));
|
|
163
|
+
return;
|
|
164
|
+
}
|
|
165
|
+
if (hasMessageFor(key)) {
|
|
166
|
+
remove(key);
|
|
167
|
+
}
|
|
168
|
+
push(serializedMessage, estimatedMessageBytesCount, key);
|
|
169
|
+
}
|
|
170
|
+
function flush(event) {
|
|
171
|
+
var upsertMessages = values(upsertBuffer).join(sendContentTypeByJson ? ',' : '\n');
|
|
172
|
+
upsertBuffer = {};
|
|
173
|
+
var isPageExit = isPageExitReason(event.reason);
|
|
174
|
+
var send = isPageExit ? request.sendOnExit : request.send;
|
|
175
|
+
if (isPageExit &&
|
|
176
|
+
// Note: checking that the encoder is async is not strictly needed, but it's an optimization:
|
|
177
|
+
// if the encoder is async we need to send two requests in some cases (one for encoded data
|
|
178
|
+
// and the other for non-encoded data). But if it's not async, we don't have to worry about
|
|
179
|
+
// it and always send a single request.
|
|
180
|
+
encoder.isAsync) {
|
|
181
|
+
// 咱不支持json 模式
|
|
182
|
+
var encoderResult = encoder.finishSync();
|
|
183
|
+
|
|
184
|
+
// Send encoded messages
|
|
185
|
+
if (encoderResult.outputBytesCount) {
|
|
186
|
+
send(formatPayloadFromEncoder(encoderResult, sendContentTypeByJson));
|
|
187
|
+
}
|
|
188
|
+
|
|
189
|
+
// Send messages that are not yet encoded at this point
|
|
190
|
+
var pendingMessages = [encoderResult.pendingData, upsertMessages].filter(Boolean).join('\n');
|
|
191
|
+
if (pendingMessages) {
|
|
192
|
+
send({
|
|
193
|
+
data: pendingMessages,
|
|
194
|
+
bytesCount: computeBytesCount(pendingMessages)
|
|
195
|
+
});
|
|
196
|
+
}
|
|
197
|
+
} else {
|
|
198
|
+
if (upsertMessages) {
|
|
199
|
+
var text = getMessageText([upsertMessages], encoder.isEmpty());
|
|
200
|
+
if (sendContentTypeByJson) {
|
|
201
|
+
text += ']';
|
|
202
|
+
}
|
|
203
|
+
encoder.write(text);
|
|
204
|
+
} else {
|
|
205
|
+
if (sendContentTypeByJson) {
|
|
206
|
+
encoder.write(']');
|
|
207
|
+
}
|
|
208
|
+
}
|
|
209
|
+
encoder.finish(function (encoderResult) {
|
|
210
|
+
send(formatPayloadFromEncoder(encoderResult));
|
|
211
|
+
});
|
|
212
|
+
}
|
|
164
213
|
}
|
|
165
|
-
var messageBytesCount = computeBytesCount(processedMessage);
|
|
166
214
|
return {
|
|
167
|
-
|
|
168
|
-
|
|
215
|
+
flushController: flushController,
|
|
216
|
+
add: addOrUpdate,
|
|
217
|
+
upsert: addOrUpdate,
|
|
218
|
+
stop: flushSubscription.unsubscribe
|
|
169
219
|
};
|
|
170
|
-
}
|
|
171
|
-
|
|
172
|
-
var
|
|
173
|
-
|
|
174
|
-
|
|
175
|
-
this.upsertBuffer[key] = processedMessage;
|
|
220
|
+
}
|
|
221
|
+
function formatPayloadFromEncoder(encoderResult, sendContentTypeByJson) {
|
|
222
|
+
var data;
|
|
223
|
+
if (typeof encoderResult.output === 'string') {
|
|
224
|
+
data = encoderResult.output;
|
|
176
225
|
} else {
|
|
177
|
-
|
|
226
|
+
data = new Blob([encoderResult.output], {
|
|
227
|
+
// This will set the 'Content-Type: text/plain' header. Reasoning:
|
|
228
|
+
// * The intake rejects the request if there is no content type.
|
|
229
|
+
// * The browser will issue CORS preflight requests if we set it to 'application/json', which
|
|
230
|
+
// could induce higher intake load (and maybe has other impacts).
|
|
231
|
+
// * Also it's not quite JSON, since we are concatenating multiple JSON objects separated by
|
|
232
|
+
// new lines.
|
|
233
|
+
type: 'text/plain'
|
|
234
|
+
});
|
|
178
235
|
}
|
|
179
|
-
|
|
180
|
-
|
|
181
|
-
|
|
182
|
-
|
|
183
|
-
|
|
184
|
-
|
|
185
|
-
|
|
186
|
-
var separatorBytesCount = this.flushController.getMessagesCount() > 1 ? 1 : 0;
|
|
187
|
-
this.flushController.notifyAfterRemoveMessage(messageBytesCount + separatorBytesCount);
|
|
188
|
-
};
|
|
189
|
-
batch.prototype.hasMessageFor = function (key) {
|
|
190
|
-
return key !== undefined && this.upsertBuffer[key] !== undefined;
|
|
191
|
-
};
|
|
192
|
-
export var Batch = batch;
|
|
236
|
+
return {
|
|
237
|
+
data: data,
|
|
238
|
+
type: sendContentTypeByJson ? 'application/json;UTF-8' : undefined,
|
|
239
|
+
bytesCount: encoderResult.outputBytesCount,
|
|
240
|
+
encoding: encoderResult.encoding
|
|
241
|
+
};
|
|
242
|
+
}
|
|
193
243
|
//# sourceMappingURL=batch.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"batch.js","names":["display","values","findByPath","each","isNumber","isArray","extend","isString","isEmptyObject","isObject","escapeJsonValue","escapeRowField","escapeRowData","commonTags","dataMap","commonFields","RumEventType","computeBytesCount","isPageExitReason","jsonStringify","HAS_MULTI_BYTES_CHARACTERS","CUSTOM_KEYS","processedMessageByDataMap","message","type","rowStr","rowData","undefined","tags","fields","hasFileds","value","key","measurement","tagsStr","filterFileds","value_path","_key","_value","push","fieldsStr","length","_valueData","context","_tagKeys","indexOf","LOGGER","join","date","time","batch","request","flushController","messageBytesLimit","sendContentTypeByJson","pushOnlyBuffer","upsertBuffer","_this","flushObservable","subscribe","event","flush","prototype","add","addOrUpdate","upsert","messages","concat","payloadData","payload","data","bytesCount","flushReason","reason","sendOnExit","send","_process","process","processedMessage","messageBytesCount","warn","hasMessageFor","remove","separatorBytesCount","getMessagesCount","notifyBeforeAddMessage","notifyAfterAddMessage","removedMessage","notifyAfterRemoveMessage","Batch"],"sources":["../../src/transport/batch.js"],"sourcesContent":["import { display } from '../helper/display'\nimport {\n values,\n findByPath,\n each,\n isNumber,\n isArray,\n extend,\n isString,\n isEmptyObject,\n isObject\n} from '../helper/tools'\nimport {\n escapeJsonValue,\n escapeRowField,\n escapeRowData\n} from '../helper/serialisation/rowData'\nimport { commonTags, dataMap, commonFields } from '../dataMap'\nimport { RumEventType } from '../helper/enums'\nimport { computeBytesCount } from '../helper/byteUtils'\nimport { isPageExitReason } from '../browser/pageExitObservable'\nimport { jsonStringify } from '../helper/serialisation/jsonStringify'\n// https://en.wikipedia.org/wiki/UTF-8\n// eslint-disable-next-line no-control-regex\nvar HAS_MULTI_BYTES_CHARACTERS = /[^\\u0000-\\u007F]/\nvar CUSTOM_KEYS = 'custom_keys'\nexport var processedMessageByDataMap = function (message) {\n if (!message || !message.type)\n return {\n rowStr: '',\n rowData: undefined\n }\n\n var rowData = { tags: {}, fields: {} }\n var hasFileds = false\n var rowStr = ''\n each(dataMap, function (value, key) {\n if (value.type === message.type) {\n rowStr += key + ','\n rowData.measurement = key\n var tagsStr = []\n var tags = extend({}, commonTags, value.tags)\n var filterFileds = ['date', 'type', CUSTOM_KEYS] // 已经在datamap中定义过的fields和tags\n each(tags, function (value_path, _key) {\n var _value = findByPath(message, value_path)\n filterFileds.push(_key)\n if (_value || isNumber(_value)) {\n rowData.tags[_key] = escapeJsonValue(_value, true)\n tagsStr.push(escapeRowData(_key) + '=' + escapeRowData(_value))\n }\n })\n\n var fieldsStr = []\n var fields = extend({}, commonFields, value.fields)\n each(fields, function (_value, _key) {\n if (isArray(_value) && _value.length === 2) {\n var value_path = _value[1]\n var _valueData = findByPath(message, value_path)\n filterFileds.push(_key)\n if (_valueData !== undefined && _valueData !== null) {\n rowData.fields[_key] = escapeJsonValue(_valueData) // 这里不需要转译\n fieldsStr.push(\n escapeRowData(_key) + '=' + escapeRowField(_valueData)\n )\n }\n } else if (isString(_value)) {\n var _valueData = findByPath(message, _value)\n filterFileds.push(_key)\n if (_valueData !== undefined && _valueData !== null) {\n rowData.fields[_key] = escapeJsonValue(_valueData) // 这里不需要转译\n fieldsStr.push(\n escapeRowData(_key) + '=' + escapeRowField(_valueData)\n )\n }\n }\n })\n if (\n message.context &&\n isObject(message.context) &&\n !isEmptyObject(message.context)\n ) {\n // 自定义tag, 存储成field\n var _tagKeys = []\n each(message.context, function (_value, _key) {\n // 如果和之前tag重名,则舍弃\n if (filterFileds.indexOf(_key) > -1) return\n filterFileds.push(_key)\n if (_value !== undefined && _value !== null) {\n _tagKeys.push(_key)\n rowData.fields[_key] = escapeJsonValue(_value) // 这里不需要转译\n fieldsStr.push(escapeRowData(_key) + '=' + escapeRowField(_value))\n }\n })\n if (_tagKeys.length) {\n rowData.fields[CUSTOM_KEYS] = escapeJsonValue(_tagKeys)\n fieldsStr.push(\n escapeRowData(CUSTOM_KEYS) + '=' + escapeRowField(_tagKeys)\n )\n }\n }\n if (message.type === RumEventType.LOGGER) {\n // 这里处理日志类型数据自定义字段\n each(message, function (value, key) {\n if (\n filterFileds.indexOf(key) === -1 &&\n value !== undefined &&\n value !== null\n ) {\n rowData.fields[key] = escapeJsonValue(value) // 这里不需要转译\n fieldsStr.push(escapeRowData(key) + '=' + escapeRowField(value))\n }\n })\n }\n if (tagsStr.length) {\n rowStr += tagsStr.join(',')\n }\n if (fieldsStr.length) {\n rowStr += ' '\n rowStr += fieldsStr.join(',')\n hasFileds = true\n }\n rowStr = rowStr + ' ' + message.date\n rowData.time = message.date // 这里不需要转译\n }\n })\n return {\n rowStr: hasFileds ? rowStr : '',\n rowData: hasFileds ? rowData : undefined\n }\n}\nvar batch = function (\n request,\n flushController,\n messageBytesLimit,\n sendContentTypeByJson\n) {\n this.pushOnlyBuffer = []\n this.upsertBuffer = {}\n this.request = request\n this.flushController = flushController\n this.messageBytesLimit = messageBytesLimit\n this.sendContentTypeByJson = sendContentTypeByJson\n var _this = this\n this.flushController.flushObservable.subscribe(function (event) {\n _this.flush(event)\n })\n}\nbatch.prototype.add = function (message) {\n this.addOrUpdate(message)\n}\nbatch.prototype.upsert = function (message, key) {\n this.addOrUpdate(message, key)\n}\nbatch.prototype.flush = function (event) {\n var messages = this.pushOnlyBuffer.concat(values(this.upsertBuffer))\n this.pushOnlyBuffer = []\n this.upsertBuffer = {}\n if (messages.length > 0) {\n var payloadData = ''\n if (this.sendContentTypeByJson) {\n payloadData = '[' + messages.join(',') + ']'\n } else {\n payloadData = messages.join('\\n')\n }\n var payload = {\n data: payloadData,\n bytesCount: event.bytesCount,\n flushReason: event.reason\n }\n if (isPageExitReason(event.reason)) {\n this.request.sendOnExit(payload)\n } else {\n this.request.send(payload)\n }\n }\n}\n\nbatch.prototype.addOrUpdate = function (message, key) {\n var _process = this.process(message)\n var processedMessage = _process.processedMessage\n var messageBytesCount = _process.messageBytesCount\n if (messageBytesCount >= this.messageBytesLimit) {\n display.warn(\n 'Discarded a message whose size was bigger than the maximum allowed size ' +\n this.messageBytesLimit +\n 'KB.'\n )\n return\n }\n if (this.hasMessageFor(key)) {\n this.remove(key)\n }\n this.push(processedMessage, messageBytesCount, key)\n}\nbatch.prototype.process = function (message) {\n var processedMessage = ''\n if (this.sendContentTypeByJson) {\n processedMessage = jsonStringify(processedMessageByDataMap(message).rowData)\n } else {\n processedMessage = processedMessageByDataMap(message).rowStr\n }\n var messageBytesCount = computeBytesCount(processedMessage)\n return {\n processedMessage: processedMessage,\n messageBytesCount: messageBytesCount\n }\n}\n\nbatch.prototype.push = function (processedMessage, messageBytesCount, key) {\n var separatorBytesCount = this.flushController.getMessagesCount() > 0 ? 1 : 0\n this.flushController.notifyBeforeAddMessage(\n messageBytesCount + separatorBytesCount\n )\n if (key !== undefined) {\n this.upsertBuffer[key] = processedMessage\n } else {\n this.pushOnlyBuffer.push(processedMessage)\n }\n this.flushController.notifyAfterAddMessage()\n}\n\nbatch.prototype.remove = function (key) {\n var removedMessage = this.upsertBuffer[key]\n delete this.upsertBuffer[key]\n var messageBytesCount = computeBytesCount(removedMessage)\n // If there are other messages, a '\\n' will be added at serialization\n var separatorBytesCount = this.flushController.getMessagesCount() > 1 ? 1 : 0\n this.flushController.notifyAfterRemoveMessage(\n messageBytesCount + separatorBytesCount\n )\n}\n\nbatch.prototype.hasMessageFor = function (key) {\n return key !== undefined && this.upsertBuffer[key] !== undefined\n}\nexport var Batch = batch\n"],"mappings":"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","ignoreList":[]}
|
|
1
|
+
{"version":3,"file":"batch.js","names":["display","values","findByPath","each","isNumber","isArray","extend","isString","isEmptyObject","isObject","escapeJsonValue","escapeRowField","escapeRowData","commonTags","dataMap","commonFields","RumEventType","computeBytesCount","isPageExitReason","jsonStringify","CUSTOM_KEYS","processedMessageByDataMap","message","type","rowStr","rowData","undefined","tags","fields","hasFileds","value","key","measurement","tagsStr","filterFileds","value_path","_key","_value","push","fieldsStr","length","_valueData","context","_tagKeys","indexOf","LOGGER","join","date","time","createBatch","options","encoder","request","messageBytesLimit","sendContentTypeByJson","flushController","upsertBuffer","flushSubscription","flushObservable","subscribe","event","flush","getMessageText","messages","isEmpty","arguments","serializedMessage","estimatedMessageBytesCount","notifyBeforeAddMessage","notifyAfterAddMessage","write","realMessageBytesCount","hasMessageFor","remove","removedMessage","messageBytesCount","estimateEncodedBytesCount","notifyAfterRemoveMessage","process","processedMessage","addOrUpdate","warn","concat","upsertMessages","isPageExit","reason","send","sendOnExit","isAsync","encoderResult","finishSync","outputBytesCount","formatPayloadFromEncoder","pendingMessages","pendingData","filter","Boolean","data","bytesCount","text","finish","add","upsert","stop","unsubscribe","output","Blob","encoding"],"sources":["../../src/transport/batch.js"],"sourcesContent":["import { display } from '../helper/display'\nimport {\n values,\n findByPath,\n each,\n isNumber,\n isArray,\n extend,\n isString,\n isEmptyObject,\n isObject\n} from '../helper/tools'\nimport {\n escapeJsonValue,\n escapeRowField,\n escapeRowData\n} from '../helper/serialisation/rowData'\nimport { commonTags, dataMap, commonFields } from '../dataMap'\nimport { RumEventType } from '../helper/enums'\nimport { computeBytesCount } from '../helper/byteUtils'\nimport { isPageExitReason } from '../browser/pageExitObservable'\nimport { jsonStringify } from '../helper/serialisation/jsonStringify'\n// https://en.wikipedia.org/wiki/UTF-8\n// eslint-disable-next-line no-control-regex\nvar CUSTOM_KEYS = 'custom_keys'\nexport var processedMessageByDataMap = function (message) {\n if (!message || !message.type)\n return {\n rowStr: '',\n rowData: undefined\n }\n\n var rowData = { tags: {}, fields: {} }\n var hasFileds = false\n var rowStr = ''\n each(dataMap, function (value, key) {\n if (value.type === message.type) {\n rowStr += key + ','\n rowData.measurement = key\n var tagsStr = []\n var tags = extend({}, commonTags, value.tags)\n var filterFileds = ['date', 'type', CUSTOM_KEYS] // 已经在datamap中定义过的fields和tags\n each(tags, function (value_path, _key) {\n var _value = findByPath(message, value_path)\n filterFileds.push(_key)\n if (_value || isNumber(_value)) {\n rowData.tags[_key] = escapeJsonValue(_value, true)\n tagsStr.push(escapeRowData(_key) + '=' + escapeRowData(_value))\n }\n })\n\n var fieldsStr = []\n var fields = extend({}, commonFields, value.fields)\n each(fields, function (_value, _key) {\n if (isArray(_value) && _value.length === 2) {\n var value_path = _value[1]\n var _valueData = findByPath(message, value_path)\n filterFileds.push(_key)\n if (_valueData !== undefined && _valueData !== null) {\n rowData.fields[_key] = escapeJsonValue(_valueData) // 这里不需要转译\n fieldsStr.push(\n escapeRowData(_key) + '=' + escapeRowField(_valueData)\n )\n }\n } else if (isString(_value)) {\n var _valueData = findByPath(message, _value)\n filterFileds.push(_key)\n if (_valueData !== undefined && _valueData !== null) {\n rowData.fields[_key] = escapeJsonValue(_valueData) // 这里不需要转译\n fieldsStr.push(\n escapeRowData(_key) + '=' + escapeRowField(_valueData)\n )\n }\n }\n })\n if (\n message.context &&\n isObject(message.context) &&\n !isEmptyObject(message.context)\n ) {\n // 自定义tag, 存储成field\n var _tagKeys = []\n each(message.context, function (_value, _key) {\n // 如果和之前tag重名,则舍弃\n if (filterFileds.indexOf(_key) > -1) return\n filterFileds.push(_key)\n if (_value !== undefined && _value !== null) {\n _tagKeys.push(_key)\n rowData.fields[_key] = escapeJsonValue(_value) // 这里不需要转译\n fieldsStr.push(escapeRowData(_key) + '=' + escapeRowField(_value))\n }\n })\n if (_tagKeys.length) {\n rowData.fields[CUSTOM_KEYS] = escapeJsonValue(_tagKeys)\n fieldsStr.push(\n escapeRowData(CUSTOM_KEYS) + '=' + escapeRowField(_tagKeys)\n )\n }\n }\n if (message.type === RumEventType.LOGGER) {\n // 这里处理日志类型数据自定义字段\n each(message, function (value, key) {\n if (\n filterFileds.indexOf(key) === -1 &&\n value !== undefined &&\n value !== null\n ) {\n rowData.fields[key] = escapeJsonValue(value) // 这里不需要转译\n fieldsStr.push(escapeRowData(key) + '=' + escapeRowField(value))\n }\n })\n }\n if (tagsStr.length) {\n rowStr += tagsStr.join(',')\n }\n if (fieldsStr.length) {\n rowStr += ' '\n rowStr += fieldsStr.join(',')\n hasFileds = true\n }\n rowStr = rowStr + ' ' + message.date\n rowData.time = message.date // 这里不需要转译\n }\n })\n return {\n rowStr: hasFileds ? rowStr : '',\n rowData: hasFileds ? rowData : undefined\n }\n}\n\nexport function createBatch(options) {\n var encoder = options.encoder\n var request = options.request\n var messageBytesLimit = options.messageBytesLimit\n var sendContentTypeByJson = options.sendContentTypeByJson\n var flushController = options.flushController\n var upsertBuffer = {}\n var flushSubscription = flushController.flushObservable.subscribe(function (\n event\n ) {\n flush(event)\n })\n function getMessageText(messages, isEmpty = false) {\n if (sendContentTypeByJson) {\n if (isEmpty) {\n return '[' + messages.join(',')\n } else {\n return ',' + messages.join(',')\n }\n } else {\n if (isEmpty) {\n return messages.join('\\n')\n } else {\n return '\\n' + messages.join('\\n')\n }\n }\n }\n function push(serializedMessage, estimatedMessageBytesCount, key) {\n flushController.notifyBeforeAddMessage(estimatedMessageBytesCount)\n\n if (key !== undefined) {\n upsertBuffer[key] = serializedMessage\n flushController.notifyAfterAddMessage()\n } else {\n encoder.write(\n getMessageText([serializedMessage], encoder.isEmpty()),\n function (realMessageBytesCount) {\n flushController.notifyAfterAddMessage(\n realMessageBytesCount - estimatedMessageBytesCount\n )\n }\n )\n }\n }\n\n function hasMessageFor(key) {\n return key !== undefined && upsertBuffer[key] !== undefined\n }\n\n function remove(key) {\n var removedMessage = upsertBuffer[key]\n delete upsertBuffer[key]\n var messageBytesCount = encoder.estimateEncodedBytesCount(removedMessage)\n flushController.notifyAfterRemoveMessage(messageBytesCount)\n }\n function process(message) {\n var processedMessage = ''\n if (sendContentTypeByJson) {\n processedMessage = jsonStringify(\n processedMessageByDataMap(message).rowData\n )\n } else {\n processedMessage = processedMessageByDataMap(message).rowStr\n }\n return processedMessage\n }\n function addOrUpdate(message, key) {\n const serializedMessage = process(message)\n\n const estimatedMessageBytesCount =\n encoder.estimateEncodedBytesCount(serializedMessage)\n\n if (estimatedMessageBytesCount >= messageBytesLimit) {\n display.warn(\n `Discarded a message whose size was bigger than the maximum allowed size ${messageBytesLimit}KB.`\n )\n return\n }\n\n if (hasMessageFor(key)) {\n remove(key)\n }\n\n push(serializedMessage, estimatedMessageBytesCount, key)\n }\n\n function flush(event) {\n var upsertMessages = values(upsertBuffer).join(\n sendContentTypeByJson ? ',' : '\\n'\n )\n upsertBuffer = {}\n\n var isPageExit = isPageExitReason(event.reason)\n var send = isPageExit ? request.sendOnExit : request.send\n\n if (\n isPageExit &&\n // Note: checking that the encoder is async is not strictly needed, but it's an optimization:\n // if the encoder is async we need to send two requests in some cases (one for encoded data\n // and the other for non-encoded data). But if it's not async, we don't have to worry about\n // it and always send a single request.\n encoder.isAsync\n ) {\n // 咱不支持json 模式\n var encoderResult = encoder.finishSync()\n\n // Send encoded messages\n if (encoderResult.outputBytesCount) {\n send(formatPayloadFromEncoder(encoderResult, sendContentTypeByJson))\n }\n\n // Send messages that are not yet encoded at this point\n var pendingMessages = [encoderResult.pendingData, upsertMessages]\n .filter(Boolean)\n .join('\\n')\n\n if (pendingMessages) {\n send({\n data: pendingMessages,\n bytesCount: computeBytesCount(pendingMessages)\n })\n }\n } else {\n if (upsertMessages) {\n var text = getMessageText([upsertMessages], encoder.isEmpty())\n if (sendContentTypeByJson) {\n text += ']'\n }\n encoder.write(text)\n } else {\n if (sendContentTypeByJson) {\n encoder.write(']')\n }\n }\n encoder.finish(function (encoderResult) {\n send(formatPayloadFromEncoder(encoderResult))\n })\n }\n }\n\n return {\n flushController: flushController,\n add: addOrUpdate,\n upsert: addOrUpdate,\n stop: flushSubscription.unsubscribe\n }\n}\n\nfunction formatPayloadFromEncoder(encoderResult, sendContentTypeByJson) {\n var data\n if (typeof encoderResult.output === 'string') {\n data = encoderResult.output\n } else {\n data = new Blob([encoderResult.output], {\n // This will set the 'Content-Type: text/plain' header. Reasoning:\n // * The intake rejects the request if there is no content type.\n // * The browser will issue CORS preflight requests if we set it to 'application/json', which\n // could induce higher intake load (and maybe has other impacts).\n // * Also it's not quite JSON, since we are concatenating multiple JSON objects separated by\n // new lines.\n type: 'text/plain'\n })\n }\n\n return {\n data: data,\n type: sendContentTypeByJson ? 'application/json;UTF-8' : undefined,\n bytesCount: encoderResult.outputBytesCount,\n encoding: encoderResult.encoding\n }\n}\n"],"mappings":"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","ignoreList":[]}
|
|
@@ -14,13 +14,18 @@ export function createFlushController(_ref) {
|
|
|
14
14
|
durationLimit = _ref.durationLimit,
|
|
15
15
|
pageExitObservable = _ref.pageExitObservable,
|
|
16
16
|
sessionExpireObservable = _ref.sessionExpireObservable;
|
|
17
|
-
var flushObservable = new Observable();
|
|
18
17
|
pageExitObservable.subscribe(function (event) {
|
|
19
18
|
return flush(event.reason);
|
|
20
19
|
});
|
|
21
20
|
sessionExpireObservable.subscribe(function () {
|
|
22
21
|
return flush('session_expire');
|
|
23
22
|
});
|
|
23
|
+
var flushObservable = new Observable(function () {
|
|
24
|
+
return function () {
|
|
25
|
+
pageExitSubscription.unsubscribe();
|
|
26
|
+
sessionExpireSubscription.unsubscribe();
|
|
27
|
+
};
|
|
28
|
+
});
|
|
24
29
|
var currentBytesCount = 0;
|
|
25
30
|
var currentMessagesCount = 0;
|
|
26
31
|
function flush(flushReason) {
|
|
@@ -61,15 +66,15 @@ export function createFlushController(_ref) {
|
|
|
61
66
|
* This function needs to be called synchronously, right before adding the message, so no flush
|
|
62
67
|
* event can happen after `notifyBeforeAddMessage` and before adding the message.
|
|
63
68
|
*/
|
|
64
|
-
notifyBeforeAddMessage: function notifyBeforeAddMessage(
|
|
65
|
-
if (currentBytesCount +
|
|
69
|
+
notifyBeforeAddMessage: function notifyBeforeAddMessage(estimatedMessageBytesCount) {
|
|
70
|
+
if (currentBytesCount + estimatedMessageBytesCount >= bytesLimit) {
|
|
66
71
|
flush('bytes_limit');
|
|
67
72
|
}
|
|
68
73
|
// Consider the message to be added now rather than in `notifyAfterAddMessage`, because if no
|
|
69
74
|
// message was added yet and `notifyAfterAddMessage` is called asynchronously, we still want
|
|
70
75
|
// to notify when a flush is needed (for example on page exit).
|
|
71
76
|
currentMessagesCount += 1;
|
|
72
|
-
currentBytesCount +=
|
|
77
|
+
currentBytesCount += estimatedMessageBytesCount;
|
|
73
78
|
scheduleDurationLimitTimeout();
|
|
74
79
|
},
|
|
75
80
|
/**
|
|
@@ -78,7 +83,11 @@ export function createFlushController(_ref) {
|
|
|
78
83
|
* This function can be called asynchronously after the message was added, but in this case it
|
|
79
84
|
* should not be called if a flush event occurred in between.
|
|
80
85
|
*/
|
|
81
|
-
notifyAfterAddMessage: function notifyAfterAddMessage() {
|
|
86
|
+
notifyAfterAddMessage: function notifyAfterAddMessage(messageBytesCountDiff) {
|
|
87
|
+
if (messageBytesCountDiff === undefined) {
|
|
88
|
+
messageBytesCountDiff = 0;
|
|
89
|
+
}
|
|
90
|
+
currentBytesCount += messageBytesCountDiff;
|
|
82
91
|
if (currentMessagesCount >= messagesLimit) {
|
|
83
92
|
flush('messages_limit');
|
|
84
93
|
} else if (currentBytesCount >= bytesLimit) {
|
|
@@ -90,6 +99,10 @@ export function createFlushController(_ref) {
|
|
|
90
99
|
*
|
|
91
100
|
* This function needs to be called synchronously, right after removing the message, so no flush
|
|
92
101
|
* event can happen after removing the message and before `notifyAfterRemoveMessage`.
|
|
102
|
+
*
|
|
103
|
+
* @param messageBytesCount: the message bytes count that was added to the pool. Should
|
|
104
|
+
* correspond to the sum of bytes counts passed to `notifyBeforeAddMessage` and
|
|
105
|
+
* `notifyAfterAddMessage`.
|
|
93
106
|
*/
|
|
94
107
|
notifyAfterRemoveMessage: function notifyAfterRemoveMessage(messageBytesCount) {
|
|
95
108
|
currentBytesCount -= messageBytesCount;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"flushController.js","names":["Observable","clearTimeout","setTimeout","createFlushController","_ref","messagesLimit","bytesLimit","durationLimit","pageExitObservable","sessionExpireObservable","
|
|
1
|
+
{"version":3,"file":"flushController.js","names":["Observable","clearTimeout","setTimeout","createFlushController","_ref","messagesLimit","bytesLimit","durationLimit","pageExitObservable","sessionExpireObservable","subscribe","event","flush","reason","flushObservable","pageExitSubscription","unsubscribe","sessionExpireSubscription","currentBytesCount","currentMessagesCount","flushReason","messagesCount","bytesCount","cancelDurationLimitTimeout","notify","durationLimitTimeoutId","scheduleDurationLimitTimeout","undefined","getMessagesCount","notifyBeforeAddMessage","estimatedMessageBytesCount","notifyAfterAddMessage","messageBytesCountDiff","notifyAfterRemoveMessage","messageBytesCount"],"sources":["../../src/transport/flushController.js"],"sourcesContent":["import { Observable } from '../helper/observable'\nimport { clearTimeout, setTimeout } from '../helper/timer'\n\n// type FlushReason = PageExitReason | 'duration_limit' | 'bytes_limit' | 'messages_limit' | 'session_expire'\n\n/**\n * Returns a \"flush controller\", responsible of notifying when flushing a pool of pending data needs\n * to happen. The implementation is designed to support both synchronous and asynchronous usages,\n * but relies on invariants described in each method documentation to keep a coherent state.\n */\nexport function createFlushController({\n messagesLimit,\n bytesLimit,\n durationLimit,\n pageExitObservable,\n sessionExpireObservable\n}) {\n pageExitObservable.subscribe(function (event) {\n return flush(event.reason)\n })\n sessionExpireObservable.subscribe(function () {\n return flush('session_expire')\n })\n var flushObservable = new Observable(function () {\n return function () {\n pageExitSubscription.unsubscribe()\n sessionExpireSubscription.unsubscribe()\n }\n })\n\n var currentBytesCount = 0\n var currentMessagesCount = 0\n\n function flush(flushReason) {\n if (currentMessagesCount === 0) {\n return\n }\n\n var messagesCount = currentMessagesCount\n var bytesCount = currentBytesCount\n\n currentMessagesCount = 0\n currentBytesCount = 0\n cancelDurationLimitTimeout()\n\n flushObservable.notify({\n reason: flushReason,\n messagesCount: messagesCount,\n bytesCount: bytesCount\n })\n }\n\n var durationLimitTimeoutId\n function scheduleDurationLimitTimeout() {\n if (durationLimitTimeoutId === undefined) {\n durationLimitTimeoutId = setTimeout(function () {\n flush('duration_limit')\n }, durationLimit)\n }\n }\n\n function cancelDurationLimitTimeout() {\n clearTimeout(durationLimitTimeoutId)\n durationLimitTimeoutId = undefined\n }\n\n return {\n flushObservable: flushObservable,\n getMessagesCount: function () {\n return currentMessagesCount\n },\n\n /**\n * Notifies that a message will be added to a pool of pending messages waiting to be flushed.\n *\n * This function needs to be called synchronously, right before adding the message, so no flush\n * event can happen after `notifyBeforeAddMessage` and before adding the message.\n */\n notifyBeforeAddMessage: function (estimatedMessageBytesCount) {\n if (currentBytesCount + estimatedMessageBytesCount >= bytesLimit) {\n flush('bytes_limit')\n }\n // Consider the message to be added now rather than in `notifyAfterAddMessage`, because if no\n // message was added yet and `notifyAfterAddMessage` is called asynchronously, we still want\n // to notify when a flush is needed (for example on page exit).\n currentMessagesCount += 1\n currentBytesCount += estimatedMessageBytesCount\n scheduleDurationLimitTimeout()\n },\n\n /**\n * Notifies that a message *was* added to a pool of pending messages waiting to be flushed.\n *\n * This function can be called asynchronously after the message was added, but in this case it\n * should not be called if a flush event occurred in between.\n */\n notifyAfterAddMessage: function (messageBytesCountDiff) {\n if (messageBytesCountDiff === undefined) {\n messageBytesCountDiff = 0\n }\n currentBytesCount += messageBytesCountDiff\n\n if (currentMessagesCount >= messagesLimit) {\n flush('messages_limit')\n } else if (currentBytesCount >= bytesLimit) {\n flush('bytes_limit')\n }\n },\n\n /**\n * Notifies that a message was removed from a pool of pending messages waiting to be flushed.\n *\n * This function needs to be called synchronously, right after removing the message, so no flush\n * event can happen after removing the message and before `notifyAfterRemoveMessage`.\n *\n * @param messageBytesCount: the message bytes count that was added to the pool. Should\n * correspond to the sum of bytes counts passed to `notifyBeforeAddMessage` and\n * `notifyAfterAddMessage`.\n */\n notifyAfterRemoveMessage: function (messageBytesCount) {\n currentBytesCount -= messageBytesCount\n currentMessagesCount -= 1\n if (currentMessagesCount === 0) {\n cancelDurationLimitTimeout()\n }\n }\n }\n}\n"],"mappings":"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","ignoreList":[]}
|
|
@@ -1,6 +1,7 @@
|
|
|
1
1
|
import { newRetryState, sendWithRetryStrategy } from './sendWithRetryStrategy';
|
|
2
2
|
import { addEventListener } from '../browser/addEventListener';
|
|
3
3
|
import { monitor } from '../helper/monitor';
|
|
4
|
+
import { addTelemetryError } from '../telemetry/telemetry';
|
|
4
5
|
/**
|
|
5
6
|
* Use POST request without content type to:
|
|
6
7
|
* - avoid CORS preflight requests
|
|
@@ -9,15 +10,18 @@ import { monitor } from '../helper/monitor';
|
|
|
9
10
|
* multiple elements are sent separated by \n in order
|
|
10
11
|
* to be parsed correctly without content type header
|
|
11
12
|
*/
|
|
12
|
-
function addBatchPrecision(url) {
|
|
13
|
+
function addBatchPrecision(url, encoding) {
|
|
13
14
|
if (!url) return url;
|
|
14
|
-
|
|
15
|
+
url = url + (url.indexOf('?') === -1 ? '?' : '&') + 'precision=ms';
|
|
16
|
+
if (encoding) {
|
|
17
|
+
url = url + '&encoding=' + encoding;
|
|
18
|
+
}
|
|
19
|
+
return url;
|
|
15
20
|
}
|
|
16
|
-
export function createHttpRequest(endpointUrl, bytesLimit,
|
|
17
|
-
var contentType = sendContentTypeByJson ? 'application/json; charset=UTF-8' : undefined;
|
|
21
|
+
export function createHttpRequest(endpointUrl, bytesLimit, reportError) {
|
|
18
22
|
var retryState = newRetryState();
|
|
19
23
|
var sendStrategyForRetry = function sendStrategyForRetry(payload, onResponse) {
|
|
20
|
-
return fetchKeepAliveStrategy(endpointUrl, bytesLimit,
|
|
24
|
+
return fetchKeepAliveStrategy(endpointUrl, bytesLimit, payload, onResponse);
|
|
21
25
|
};
|
|
22
26
|
return {
|
|
23
27
|
send: function send(payload) {
|
|
@@ -28,21 +32,21 @@ export function createHttpRequest(endpointUrl, bytesLimit, sendContentTypeByJson
|
|
|
28
32
|
* keep using sendBeaconStrategy on exit
|
|
29
33
|
*/
|
|
30
34
|
sendOnExit: function sendOnExit(payload) {
|
|
31
|
-
sendBeaconStrategy(endpointUrl, bytesLimit,
|
|
35
|
+
sendBeaconStrategy(endpointUrl, bytesLimit, payload);
|
|
32
36
|
}
|
|
33
37
|
};
|
|
34
38
|
}
|
|
35
|
-
function sendBeaconStrategy(endpointUrl, bytesLimit,
|
|
39
|
+
function sendBeaconStrategy(endpointUrl, bytesLimit, payload) {
|
|
36
40
|
var data = payload.data;
|
|
37
41
|
var bytesCount = payload.bytesCount;
|
|
38
|
-
var url = addBatchPrecision(endpointUrl);
|
|
42
|
+
var url = addBatchPrecision(endpointUrl, payload.encoding);
|
|
39
43
|
var canUseBeacon = !!navigator.sendBeacon && bytesCount < bytesLimit;
|
|
40
44
|
if (canUseBeacon) {
|
|
41
45
|
try {
|
|
42
46
|
var beaconData;
|
|
43
|
-
if (
|
|
47
|
+
if (payload.type) {
|
|
44
48
|
beaconData = new Blob([data], {
|
|
45
|
-
type:
|
|
49
|
+
type: payload.type
|
|
46
50
|
});
|
|
47
51
|
} else {
|
|
48
52
|
beaconData = data;
|
|
@@ -52,15 +56,22 @@ function sendBeaconStrategy(endpointUrl, bytesLimit, contentType, payload) {
|
|
|
52
56
|
return;
|
|
53
57
|
}
|
|
54
58
|
} catch (e) {
|
|
55
|
-
|
|
59
|
+
reportBeaconError(e);
|
|
56
60
|
}
|
|
57
61
|
}
|
|
58
|
-
sendXHR(url,
|
|
62
|
+
sendXHR(url, payload);
|
|
63
|
+
}
|
|
64
|
+
var hasReportedBeaconError = false;
|
|
65
|
+
function reportBeaconError(e) {
|
|
66
|
+
if (!hasReportedBeaconError) {
|
|
67
|
+
hasReportedBeaconError = true;
|
|
68
|
+
addTelemetryError(e);
|
|
69
|
+
}
|
|
59
70
|
}
|
|
60
|
-
export function fetchKeepAliveStrategy(endpointUrl, bytesLimit,
|
|
71
|
+
export function fetchKeepAliveStrategy(endpointUrl, bytesLimit, payload, onResponse) {
|
|
61
72
|
var data = payload.data;
|
|
62
73
|
var bytesCount = payload.bytesCount;
|
|
63
|
-
var url = addBatchPrecision(endpointUrl);
|
|
74
|
+
var url = addBatchPrecision(endpointUrl, payload.encoding);
|
|
64
75
|
var canUseKeepAlive = isKeepAliveSupported() && bytesCount < bytesLimit;
|
|
65
76
|
if (canUseKeepAlive) {
|
|
66
77
|
var fetchOption = {
|
|
@@ -69,9 +80,9 @@ export function fetchKeepAliveStrategy(endpointUrl, bytesLimit, contentType, pay
|
|
|
69
80
|
keepalive: true,
|
|
70
81
|
mode: 'cors'
|
|
71
82
|
};
|
|
72
|
-
if (
|
|
83
|
+
if (payload.type) {
|
|
73
84
|
fetchOption.headers = {
|
|
74
|
-
'Content-Type':
|
|
85
|
+
'Content-Type': payload.type
|
|
75
86
|
};
|
|
76
87
|
}
|
|
77
88
|
fetch(url, fetchOption).then(monitor(function (response) {
|
|
@@ -83,10 +94,10 @@ export function fetchKeepAliveStrategy(endpointUrl, bytesLimit, contentType, pay
|
|
|
83
94
|
}
|
|
84
95
|
}), monitor(function () {
|
|
85
96
|
// failed to queue the request
|
|
86
|
-
sendXHR(url,
|
|
97
|
+
sendXHR(url, payload, onResponse);
|
|
87
98
|
}));
|
|
88
99
|
} else {
|
|
89
|
-
sendXHR(url,
|
|
100
|
+
sendXHR(url, payload, onResponse);
|
|
90
101
|
}
|
|
91
102
|
}
|
|
92
103
|
function isKeepAliveSupported() {
|
|
@@ -97,12 +108,14 @@ function isKeepAliveSupported() {
|
|
|
97
108
|
return false;
|
|
98
109
|
}
|
|
99
110
|
}
|
|
100
|
-
function sendXHR(url,
|
|
111
|
+
function sendXHR(url, payload, onResponse) {
|
|
112
|
+
var data = payload.data;
|
|
101
113
|
var request = new XMLHttpRequest();
|
|
102
114
|
request.open('POST', url, true);
|
|
103
|
-
if (
|
|
104
|
-
|
|
105
|
-
|
|
115
|
+
if (data instanceof Blob) {
|
|
116
|
+
request.setRequestHeader('Content-Type', data.type);
|
|
117
|
+
} else if (payload.type) {
|
|
118
|
+
request.setRequestHeader('Content-Type', payload.type);
|
|
106
119
|
}
|
|
107
120
|
addEventListener(request, 'loadend', function () {
|
|
108
121
|
if (typeof onResponse === 'function') {
|