From 6c0ff60a6808918e9de254ee290af255a3655ed1 Mon Sep 17 00:00:00 2001 From: siyuniu-ms Date: Tue, 7 Jan 2025 14:56:58 -0800 Subject: [PATCH 1/6] fix --- .../src/components/configurationSelection.tsx | 6 +++--- .../src/components/telemetryViewer.tsx | 6 +++--- .../src/configuration/PopupConfigCache.ts | 6 +++--- .../src/dataSources/dataSources.ts | 2 +- .../src/dataSources/defaultDataSource.ts | 2 +- .../src/telemetryViewerPopup.tsx | 10 +++++----- 6 files changed, 16 insertions(+), 16 deletions(-) diff --git a/tools/chrome-debug-extension/src/components/configurationSelection.tsx b/tools/chrome-debug-extension/src/components/configurationSelection.tsx index a5eef9059..4a6e22c8d 100644 --- a/tools/chrome-debug-extension/src/components/configurationSelection.tsx +++ b/tools/chrome-debug-extension/src/components/configurationSelection.tsx @@ -46,7 +46,7 @@ export const ConfigurationSelection = ( function updateCustomConfiguration(newCustomConfiguration: string): void { setCustomConfigurationDirty(true); setCustomConfiguration(newCustomConfiguration); - chrome.storage.local.set({ customConfigurationStorageKey: newCustomConfiguration }); + chrome.storage.local.set({ [customConfigurationStorageKey]: newCustomConfiguration }); } @@ -66,9 +66,9 @@ export const ConfigurationSelection = ( React.useEffect(() => { try { - doAwait(chrome.storage.local.get(customConfigurationStorageKey), (savedValue: any) => { + doAwait(chrome.storage.local.get([customConfigurationStorageKey]), (savedValue: any) => { if (savedValue) { - setCustomConfiguration(savedValue); + setCustomConfiguration(savedValue[customConfigurationStorageKey]); } if (textAreaRef.current) { textAreaRef.current.setAttribute("aria-labelledby", "customConfigurationLabel"); diff --git a/tools/chrome-debug-extension/src/components/telemetryViewer.tsx b/tools/chrome-debug-extension/src/components/telemetryViewer.tsx index 2882908e4..bbf3040c6 100644 --- a/tools/chrome-debug-extension/src/components/telemetryViewer.tsx +++ b/tools/chrome-debug-extension/src/components/telemetryViewer.tsx @@ -39,7 +39,7 @@ export const TelemetryViewer = (props: ITelemetryViewerProps): React.ReactElemen const handleNewFilterSettings = (newFilterSettings: IFilterSettings): void => { try { - chrome.storage.local.set({ filterSettingsCacheKey: JSON.stringify(newFilterSettings) }); + chrome.storage.local.set({ [filterSettingsCacheKey]: JSON.stringify(newFilterSettings) }); } catch { // Default is OK } @@ -111,12 +111,12 @@ export const TelemetryViewer = (props: ITelemetryViewerProps): React.ReactElemen React.useEffect(() => { try { - doAwait(chrome.storage.local.get(filterSettingsCacheKey), (json: any) => { + doAwait(chrome.storage.local.get([filterSettingsCacheKey]), (json: any) => { if (json) { // Make sure we have any defaults set let settings: IFilterSettings = { ...getDefaultFilterSettings(props.session.configuration), - ...(JSON.parse(json)) + ...(JSON.parse(json[filterSettingsCacheKey])) }; setFilterSettings(settings); diff --git a/tools/chrome-debug-extension/src/configuration/PopupConfigCache.ts b/tools/chrome-debug-extension/src/configuration/PopupConfigCache.ts index dc1f475f0..758606962 100644 --- a/tools/chrome-debug-extension/src/configuration/PopupConfigCache.ts +++ b/tools/chrome-debug-extension/src/configuration/PopupConfigCache.ts @@ -13,10 +13,10 @@ export function getPopupSettings() : IPopupSettings { height: 860 }; - doAwait(chrome.storage.local.get(popupWindowSettingsCacheKey), (popupSettings: any) => { + doAwait(chrome.storage.local.get([popupWindowSettingsCacheKey]), (popupSettings: any) => { if (popupSettings) { try { - settings = JSON.parse(popupSettings); + settings = JSON.parse(popupSettings[popupWindowSettingsCacheKey]); } catch (e) { // Just ignore failures and we fallback to the defaults } @@ -38,7 +38,7 @@ function _setPopupSettings(newSettings: IPopupSettings) { settings[name] = value; } }); - chrome.storage.local.set({ popupWindowSettingsCacheKey: JSON.stringify(settings) }); + chrome.storage.local.set({ [popupWindowSettingsCacheKey]: JSON.stringify(settings) }); } export function setPopupSize(width?: number, height?: number) { diff --git a/tools/chrome-debug-extension/src/dataSources/dataSources.ts b/tools/chrome-debug-extension/src/dataSources/dataSources.ts index 163e4f461..f83f23baa 100644 --- a/tools/chrome-debug-extension/src/dataSources/dataSources.ts +++ b/tools/chrome-debug-extension/src/dataSources/dataSources.ts @@ -37,7 +37,7 @@ export function createDataSource(configuration: IConfiguration): IDataSource { } if (!urls || urls.length === 0) { - urls = ["*://*.microsoft.com/OneCollector/*", "*://*.visualstudio.com/v2/track*"]; + urls = ["*://*.microsoft.com/OneCollector/*", "*://*.visualstudio.com/v2/track*", "*://*.eastus-8.in.applicationinsights.azure.com/v2/track*"]; } } diff --git a/tools/chrome-debug-extension/src/dataSources/defaultDataSource.ts b/tools/chrome-debug-extension/src/dataSources/defaultDataSource.ts index 0919507cf..dc666e7cb 100644 --- a/tools/chrome-debug-extension/src/dataSources/defaultDataSource.ts +++ b/tools/chrome-debug-extension/src/dataSources/defaultDataSource.ts @@ -21,7 +21,7 @@ export class DefaultDataSource implements IDataSource { let nextListenerId: number = 0; if (!urls || urls.length === 0) { - urls = ["*://*.microsoft.com/OneCollector/*", "*://*.visualstudio.com/v2/track*"] + urls = ["*://*.microsoft.com/OneCollector/*", "*://*.visualstudio.com/v2/track*", "*://*.eastus-8.in.applicationinsights.azure.com/v2/track*"]; } _self.startListening = (): void => { diff --git a/tools/chrome-debug-extension/src/telemetryViewerPopup.tsx b/tools/chrome-debug-extension/src/telemetryViewerPopup.tsx index a798d10a7..d18a87b8d 100644 --- a/tools/chrome-debug-extension/src/telemetryViewerPopup.tsx +++ b/tools/chrome-debug-extension/src/telemetryViewerPopup.tsx @@ -30,7 +30,7 @@ export const TelemetryViewerPopup = (): React.ReactElement => { function applyConfigurationType(newConfigurationType: ConfigurationType): void { if (newConfigurationType) { - chrome.storage.local.set({ configurationType: newConfigurationType }); + chrome.storage.local.set({ [configurationTypeStorageKey]: newConfigurationType }); } setConfigurationType(newConfigurationType); @@ -46,9 +46,9 @@ export const TelemetryViewerPopup = (): React.ReactElement => { if (configurationTypeToLoad === "Custom") { try { - doAwait(chrome.storage.local.get(customConfigurationStorageKey), (savedValue: any) => { + doAwait(chrome.storage.local.get([customConfigurationStorageKey]), (savedValue: any) => { if (savedValue) { - const newConfiguration = JSON.parse(savedValue) as IConfiguration; + const newConfiguration = JSON.parse(savedValue[customConfigurationStorageKey]) as IConfiguration; let newSession = new Session(newConfiguration, session); session && session.dispose(); setSession(newSession); @@ -118,9 +118,9 @@ export const TelemetryViewerPopup = (): React.ReactElement => { let configurationTypeToSet: ConfigurationType = undefined; try { - doAwait(chrome.storage.local.get(configurationTypeStorageKey), (savedValue: any) => { + doAwait(chrome.storage.local.get([configurationTypeStorageKey]), (savedValue: any) => { if (savedValue && Object.keys(ConfigurationURLs).includes(savedValue)) { - configurationTypeToSet = savedValue as ConfigurationType; + configurationTypeToSet = savedValue[configurationTypeStorageKey] as ConfigurationType; } setConfigurationType(configurationTypeToSet); applyConfigurationType(configurationTypeToSet); From 40acc18059e0d68fa39203010ae6e02e71e11498 Mon Sep 17 00:00:00 2001 From: siyuniu-ms Date: Tue, 7 Jan 2025 15:43:29 -0800 Subject: [PATCH 2/6] Update defaultDataSource.ts --- .../src/dataSources/defaultDataSource.ts | 104 +++++++++++++++++- 1 file changed, 100 insertions(+), 4 deletions(-) diff --git a/tools/chrome-debug-extension/src/dataSources/defaultDataSource.ts b/tools/chrome-debug-extension/src/dataSources/defaultDataSource.ts index dc666e7cb..35762ffc7 100644 --- a/tools/chrome-debug-extension/src/dataSources/defaultDataSource.ts +++ b/tools/chrome-debug-extension/src/dataSources/defaultDataSource.ts @@ -27,7 +27,15 @@ export class DefaultDataSource implements IDataSource { _self.startListening = (): void => { // Monitor network traffic for telemetry chrome.webRequest.onBeforeRequest.addListener( - _processWebRequest, + (details: chrome.webRequest.WebRequestBodyDetails) => { + Promise.resolve(_processWebRequest(details)).then(() => { + return {}; + }).catch((error) => { + console.error("Error during processing:", error); + return {}; + }); + return {}; + }, // filters { urls @@ -39,7 +47,15 @@ export class DefaultDataSource implements IDataSource { }; _self.stopListening = (): void => { - chrome.webRequest.onBeforeRequest.removeListener(_processWebRequest); + chrome.webRequest.onBeforeRequest.removeListener((details: chrome.webRequest.WebRequestBodyDetails) => { + Promise.resolve(_processWebRequest(details)).then(() => { + return {}; + }).catch((error) => { + console.error("Error during processing:", error); + return {}; + }); + return {}; + }); chrome.runtime.onMessage.removeListener(_onMessageReceived); }; @@ -51,10 +67,90 @@ export class DefaultDataSource implements IDataSource { _self.removeListener = (id: number): boolean => { return listeners.delete(id); }; + + let decompressEvents = async function (compressedString: ArrayBuffer) { + // Step 1: Convert the binary string to a Uint8Array + const binaryData = compressedString; + + // Step 2: Create a ReadableStream from the Uint8Array + const compressedReadableStream = new ReadableStream({ + start(controller) { + controller.enqueue(binaryData); + controller.close(); + } + }); + + const DecompressionStream = (window as any).DecompressionStream; + if (!DecompressionStream) { + console.error("DecompressionStream is not available in this environment"); + return null; // Return null or handle the error accordingly + } + + // Step 3: Pipe through DecompressionStream + const decompressedReadableStream = compressedReadableStream.pipeThrough( + new (window as any).DecompressionStream("gzip") + ); + + let decompressedUint8Array: Uint8Array; + + // Read the decompressed chunks + const reader = decompressedReadableStream.getReader(); + let result; + const chunks: Uint8Array[] = []; + + // Read all chunks + while (!(result = await reader.read()).done) { + let chunk = result.value; + if (chunk instanceof Uint8Array) { + chunks.push(chunk); + } + } + + // Calculate the total size of all chunks + const totalLength = chunks.reduce((acc, chunk) => acc + chunk.length, 0); + + // Create a single Uint8Array to hold all chunks + decompressedUint8Array = new Uint8Array(totalLength); + + // Copy all chunks into the decompressedUint8Array + let offset = 0; + for (const chunk of chunks) { + decompressedUint8Array.set(chunk, offset); // Copy the chunk into the array + offset += chunk.length; // Move the offset by the chunk length + } + return decompressedUint8Array.buffer; + }; - function _processWebRequest(details: chrome.webRequest.WebRequestBodyDetails): void { + async function _processWebRequest(details: chrome.webRequest.WebRequestBodyDetails): Promise { if (details && (details.type === "xmlhttprequest" || details.type === "ping")) { - const events = details.requestBody && _convertToStringArray(details.requestBody.raw); + let rawdata: chrome.webRequest.UploadData[] | undefined; + if (details.requestBody && details.requestBody.raw && details.requestBody.raw.length > 0 && details.requestBody.raw[0].bytes) { + rawdata = details.requestBody.raw; + const arrayBuffer = details.requestBody.raw[0].bytes; + + // Check if the data might be gzipped (first two bytes 0x1F 0x8B) + const checkGzip = new Uint8Array(arrayBuffer); + if (checkGzip[0] === 0x1F && checkGzip[1] === 0x8B) { + console.log("This is gzipped."); + + // Decompress the gzipped data + try { + let decompressedData = await decompressEvents(arrayBuffer); + if (decompressedData) { + rawdata[0].bytes = decompressedData; + console.log("After decompression:", rawdata); + } else { + console.error("Decompression failed."); + } + + } catch (error) { + console.error("Error during decompression:", error); + } + } else { + console.log("Data is not gzipped."); + } + } + const events = details.requestBody && _convertToStringArray(rawdata); if (events) { for (let i = events.length - 1; i >= 0; i--) { try { From c5ed4f52d14b35b9c9591375530cbab3196008c3 Mon Sep 17 00:00:00 2001 From: siyuniu-ms Date: Tue, 7 Jan 2025 15:44:58 -0800 Subject: [PATCH 3/6] Revert "Update defaultDataSource.ts" This reverts commit 40acc18059e0d68fa39203010ae6e02e71e11498. --- .../src/dataSources/defaultDataSource.ts | 104 +----------------- 1 file changed, 4 insertions(+), 100 deletions(-) diff --git a/tools/chrome-debug-extension/src/dataSources/defaultDataSource.ts b/tools/chrome-debug-extension/src/dataSources/defaultDataSource.ts index 35762ffc7..dc666e7cb 100644 --- a/tools/chrome-debug-extension/src/dataSources/defaultDataSource.ts +++ b/tools/chrome-debug-extension/src/dataSources/defaultDataSource.ts @@ -27,15 +27,7 @@ export class DefaultDataSource implements IDataSource { _self.startListening = (): void => { // Monitor network traffic for telemetry chrome.webRequest.onBeforeRequest.addListener( - (details: chrome.webRequest.WebRequestBodyDetails) => { - Promise.resolve(_processWebRequest(details)).then(() => { - return {}; - }).catch((error) => { - console.error("Error during processing:", error); - return {}; - }); - return {}; - }, + _processWebRequest, // filters { urls @@ -47,15 +39,7 @@ export class DefaultDataSource implements IDataSource { }; _self.stopListening = (): void => { - chrome.webRequest.onBeforeRequest.removeListener((details: chrome.webRequest.WebRequestBodyDetails) => { - Promise.resolve(_processWebRequest(details)).then(() => { - return {}; - }).catch((error) => { - console.error("Error during processing:", error); - return {}; - }); - return {}; - }); + chrome.webRequest.onBeforeRequest.removeListener(_processWebRequest); chrome.runtime.onMessage.removeListener(_onMessageReceived); }; @@ -67,90 +51,10 @@ export class DefaultDataSource implements IDataSource { _self.removeListener = (id: number): boolean => { return listeners.delete(id); }; - - let decompressEvents = async function (compressedString: ArrayBuffer) { - // Step 1: Convert the binary string to a Uint8Array - const binaryData = compressedString; - - // Step 2: Create a ReadableStream from the Uint8Array - const compressedReadableStream = new ReadableStream({ - start(controller) { - controller.enqueue(binaryData); - controller.close(); - } - }); - - const DecompressionStream = (window as any).DecompressionStream; - if (!DecompressionStream) { - console.error("DecompressionStream is not available in this environment"); - return null; // Return null or handle the error accordingly - } - - // Step 3: Pipe through DecompressionStream - const decompressedReadableStream = compressedReadableStream.pipeThrough( - new (window as any).DecompressionStream("gzip") - ); - - let decompressedUint8Array: Uint8Array; - - // Read the decompressed chunks - const reader = decompressedReadableStream.getReader(); - let result; - const chunks: Uint8Array[] = []; - - // Read all chunks - while (!(result = await reader.read()).done) { - let chunk = result.value; - if (chunk instanceof Uint8Array) { - chunks.push(chunk); - } - } - - // Calculate the total size of all chunks - const totalLength = chunks.reduce((acc, chunk) => acc + chunk.length, 0); - - // Create a single Uint8Array to hold all chunks - decompressedUint8Array = new Uint8Array(totalLength); - - // Copy all chunks into the decompressedUint8Array - let offset = 0; - for (const chunk of chunks) { - decompressedUint8Array.set(chunk, offset); // Copy the chunk into the array - offset += chunk.length; // Move the offset by the chunk length - } - return decompressedUint8Array.buffer; - }; - async function _processWebRequest(details: chrome.webRequest.WebRequestBodyDetails): Promise { + function _processWebRequest(details: chrome.webRequest.WebRequestBodyDetails): void { if (details && (details.type === "xmlhttprequest" || details.type === "ping")) { - let rawdata: chrome.webRequest.UploadData[] | undefined; - if (details.requestBody && details.requestBody.raw && details.requestBody.raw.length > 0 && details.requestBody.raw[0].bytes) { - rawdata = details.requestBody.raw; - const arrayBuffer = details.requestBody.raw[0].bytes; - - // Check if the data might be gzipped (first two bytes 0x1F 0x8B) - const checkGzip = new Uint8Array(arrayBuffer); - if (checkGzip[0] === 0x1F && checkGzip[1] === 0x8B) { - console.log("This is gzipped."); - - // Decompress the gzipped data - try { - let decompressedData = await decompressEvents(arrayBuffer); - if (decompressedData) { - rawdata[0].bytes = decompressedData; - console.log("After decompression:", rawdata); - } else { - console.error("Decompression failed."); - } - - } catch (error) { - console.error("Error during decompression:", error); - } - } else { - console.log("Data is not gzipped."); - } - } - const events = details.requestBody && _convertToStringArray(rawdata); + const events = details.requestBody && _convertToStringArray(details.requestBody.raw); if (events) { for (let i = events.length - 1; i >= 0; i--) { try { From 70645a932d7c9579c341d977d0aea24d1cf0fd38 Mon Sep 17 00:00:00 2001 From: siyuniu-ms Date: Tue, 14 Jan 2025 11:26:02 -0800 Subject: [PATCH 4/6] add compress check --- .../Tests/Unit/src/cfgsyncplugin.tests.ts | 6 +- .../src/dataSources/dataSources.ts | 2 +- .../src/dataSources/defaultDataSource.ts | 96 +++++++++++++++---- tools/chrome-debug-extension/tsconfig.json | 1 + 4 files changed, 85 insertions(+), 20 deletions(-) diff --git a/extensions/applicationinsights-cfgsync-js/Tests/Unit/src/cfgsyncplugin.tests.ts b/extensions/applicationinsights-cfgsync-js/Tests/Unit/src/cfgsyncplugin.tests.ts index 8889f88a1..a8f5c2210 100644 --- a/extensions/applicationinsights-cfgsync-js/Tests/Unit/src/cfgsyncplugin.tests.ts +++ b/extensions/applicationinsights-cfgsync-js/Tests/Unit/src/cfgsyncplugin.tests.ts @@ -571,9 +571,9 @@ export class CfgSyncPluginTests extends AITestClass { let ikeyMsg = throttleMgrConfig["106"]; Assert.equal(ikeyMsg.disabled, false, "ikey msg should be enabled"); let otherMsg = throttleMgrConfig["110"]; - Assert.equal(otherMsg.disabled, true, "other msg should be disabled"); + Assert.equal(otherMsg.disabled, false, "other msg should be enabled"); let cdnOptIn = featureOptIn["CdnUsage"]; - Assert.equal(cdnOptIn.mode, 2, "cdn feature optin should be disabled"); + Assert.equal(cdnOptIn.mode, 3, "cdn feature optin should be enabled"); Assert.equal(ikeyOptIn.mode, 3, "ikey feature optin should be enabled"); return true; } @@ -634,7 +634,7 @@ export class CfgSyncPluginTests extends AITestClass { let otherMsg = throttleMgrConfig["110"]; Assert.equal(otherMsg.disabled, true, "other msg should be disabled"); let cdnOptIn = featureOptIn["CdnUsage"]; - Assert.equal(cdnOptIn.mode, 2, "cdn feature optin should be disabled"); + Assert.equal(cdnOptIn.mode, 3, "cdn feature optin should be disabled"); Assert.equal(ikeyOptIn.mode, 3, "ikey feature optin should be enabled"); return true; } diff --git a/tools/chrome-debug-extension/src/dataSources/dataSources.ts b/tools/chrome-debug-extension/src/dataSources/dataSources.ts index f83f23baa..a637f98d0 100644 --- a/tools/chrome-debug-extension/src/dataSources/dataSources.ts +++ b/tools/chrome-debug-extension/src/dataSources/dataSources.ts @@ -37,7 +37,7 @@ export function createDataSource(configuration: IConfiguration): IDataSource { } if (!urls || urls.length === 0) { - urls = ["*://*.microsoft.com/OneCollector/*", "*://*.visualstudio.com/v2/track*", "*://*.eastus-8.in.applicationinsights.azure.com/v2/track*"]; + urls = ["*://*.microsoft.com/OneCollector/*", "*://*.visualstudio.com/v2/track*", "*://*.applicationinsights.azure.com/v2/track*"]; } } diff --git a/tools/chrome-debug-extension/src/dataSources/defaultDataSource.ts b/tools/chrome-debug-extension/src/dataSources/defaultDataSource.ts index dc666e7cb..94d9e361c 100644 --- a/tools/chrome-debug-extension/src/dataSources/defaultDataSource.ts +++ b/tools/chrome-debug-extension/src/dataSources/defaultDataSource.ts @@ -1,6 +1,7 @@ // Copyright (c) Microsoft Corporation. All rights reserved. // Licensed under the MIT License. +import { createAsyncRejectedPromise, doAwait, IPromise } from "@nevware21/ts-async"; import { MessageSource, MessageType } from "../Enums"; import { IMessage } from "../interfaces/IMessage"; import { IDataSource } from "./IDataSource"; @@ -51,27 +52,90 @@ export class DefaultDataSource implements IDataSource { _self.removeListener = (id: number): boolean => { return listeners.delete(id); }; + + function isGzip(data: ArrayBuffer): boolean { + const checkGzip = new Uint8Array(data); + if (checkGzip[0] === 0x1F && checkGzip[1] === 0x8B) { + console.log("This is gzipped."); + return true; + } + return false; + } + + function decompressEvents(compressedString: ArrayBuffer): IPromise { + const DecompressionStream = (window as any).DecompressionStream; + + if (DecompressionStream && typeof DecompressionStream !== "undefined") { + // If DecompressionStream is available, use it + const binaryData = new Uint8Array(compressedString); + + // Create a ReadableStream from the Uint8Array + const compressedReadableStream = new ReadableStream({ + start(controller) { + controller.enqueue(binaryData); + controller.close(); + } + }); + + // Pipe through the DecompressionStream (gzip) + const decompressedReadableStream = compressedReadableStream.pipeThrough( + new DecompressionStream("gzip") + ); + + // Read the decompressed stream and return a Uint8Array + return new Response(decompressedReadableStream) + .arrayBuffer() + .then((decompressedBuffer) => { + return new Uint8Array(decompressedBuffer); // Return the decompressed data as Uint8Array + }); + } else { + return createAsyncRejectedPromise(new Error("DecompressionStream is not supported in this environment.")); + } + } + + function processEvents(events: string[] | null, details: chrome.webRequest.WebRequestBodyDetails): void { + if (events) { + for (let i = events.length - 1; i >= 0; i--) { + try { + const event = JSON.parse(events[i]); + if (event !== undefined) { + if (Array.isArray(event)) { + for (const subEvent of event) { + _handleMessage(subEvent, details); + } + } else { + _handleMessage(event, details); + } + } + } catch (e) { + // Ignore + } + } + } + } function _processWebRequest(details: chrome.webRequest.WebRequestBodyDetails): void { if (details && (details.type === "xmlhttprequest" || details.type === "ping")) { - const events = details.requestBody && _convertToStringArray(details.requestBody.raw); - if (events) { - for (let i = events.length - 1; i >= 0; i--) { - try { - const event = JSON.parse(events[i]); - if (event !== undefined) { - if (Array.isArray(event)) { - for (const subEvent of event) { - _handleMessage(subEvent, details); - } - } else { - _handleMessage(event, details); - } + if (details.requestBody && details.requestBody.raw) { + let gzipped = isGzip(details.requestBody.raw[0].bytes as ArrayBuffer); + console.log("Gzipped: " + gzipped); + var events: string[] | null; + if (gzipped) { + doAwait(decompressEvents(details.requestBody.raw[0].bytes as ArrayBuffer), (decompressedData) => { + if (decompressedData) { + // details.requestBody.raw[0].bytes = decompressedData; + console.log("After decompression:", decompressedData); + events = _convertToStringArray([{bytes: decompressedData}]); + processEvents(events, details); + } else { + console.error("Decompression failed."); } - } catch (e) { - // Ignore - } + }); + } else { + events = details.requestBody && _convertToStringArray(details.requestBody.raw); + processEvents(events, details); } + } } } diff --git a/tools/chrome-debug-extension/tsconfig.json b/tools/chrome-debug-extension/tsconfig.json index f1ab73827..1dfde3746 100644 --- a/tools/chrome-debug-extension/tsconfig.json +++ b/tools/chrome-debug-extension/tsconfig.json @@ -4,6 +4,7 @@ "target": "es2016", "lib": [ "es2017", + "ES2018.Promise", "dom" ], "sourceMap": true, From b771e322c2384f857df1994e9bccd8bea802b770 Mon Sep 17 00:00:00 2001 From: siyuniu-ms Date: Thu, 16 Jan 2025 13:42:35 -0800 Subject: [PATCH 5/6] Update defaultDataSource.ts --- .../src/dataSources/defaultDataSource.ts | 8 +++++--- 1 file changed, 5 insertions(+), 3 deletions(-) diff --git a/tools/chrome-debug-extension/src/dataSources/defaultDataSource.ts b/tools/chrome-debug-extension/src/dataSources/defaultDataSource.ts index 94d9e361c..105e1381e 100644 --- a/tools/chrome-debug-extension/src/dataSources/defaultDataSource.ts +++ b/tools/chrome-debug-extension/src/dataSources/defaultDataSource.ts @@ -117,18 +117,20 @@ export class DefaultDataSource implements IDataSource { function _processWebRequest(details: chrome.webRequest.WebRequestBodyDetails): void { if (details && (details.type === "xmlhttprequest" || details.type === "ping")) { if (details.requestBody && details.requestBody.raw) { + let gzipped = isGzip(details.requestBody.raw[0].bytes as ArrayBuffer); - console.log("Gzipped: " + gzipped); + + // console.log("Gzipped: " + gzipped); var events: string[] | null; if (gzipped) { doAwait(decompressEvents(details.requestBody.raw[0].bytes as ArrayBuffer), (decompressedData) => { if (decompressedData) { // details.requestBody.raw[0].bytes = decompressedData; - console.log("After decompression:", decompressedData); + // console.log("After decompression:", decompressedData); events = _convertToStringArray([{bytes: decompressedData}]); processEvents(events, details); } else { - console.error("Decompression failed."); + // console.error("Decompression failed."); } }); } else { From 7ca1b8c25d4cd3380a5c07a5592d9a14477673c1 Mon Sep 17 00:00:00 2001 From: siyuniu-ms Date: Thu, 16 Jan 2025 13:45:43 -0800 Subject: [PATCH 6/6] Update defaultDataSource.ts --- .../chrome-debug-extension/src/dataSources/defaultDataSource.ts | 2 -- 1 file changed, 2 deletions(-) diff --git a/tools/chrome-debug-extension/src/dataSources/defaultDataSource.ts b/tools/chrome-debug-extension/src/dataSources/defaultDataSource.ts index 105e1381e..192ffa248 100644 --- a/tools/chrome-debug-extension/src/dataSources/defaultDataSource.ts +++ b/tools/chrome-debug-extension/src/dataSources/defaultDataSource.ts @@ -56,7 +56,6 @@ export class DefaultDataSource implements IDataSource { function isGzip(data: ArrayBuffer): boolean { const checkGzip = new Uint8Array(data); if (checkGzip[0] === 0x1F && checkGzip[1] === 0x8B) { - console.log("This is gzipped."); return true; } return false; @@ -125,7 +124,6 @@ export class DefaultDataSource implements IDataSource { if (gzipped) { doAwait(decompressEvents(details.requestBody.raw[0].bytes as ArrayBuffer), (decompressedData) => { if (decompressedData) { - // details.requestBody.raw[0].bytes = decompressedData; // console.log("After decompression:", decompressedData); events = _convertToStringArray([{bytes: decompressedData}]); processEvents(events, details);