@leeguoo/pwtk-network-debugger 1.2.18 → 1.2.20

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/dist/index.esm.js CHANGED
@@ -6704,6 +6704,98 @@ function decrypt(encryptedData, keyStr) {
6704
6704
  console.log("[PWTK Decrypt] ❌ All decryption methods failed, returning original data");
6705
6705
  return encryptedData;
6706
6706
  }
6707
+ class Logger {
6708
+ constructor() {
6709
+ this.panel = null;
6710
+ this.enableBrowserConsole = false;
6711
+ this.logLevel = "debug";
6712
+ this.buffer = [];
6713
+ this.maxBufferSize = 100;
6714
+ this.enableBrowserConsole = false;
6715
+ this.logLevel = "debug";
6716
+ }
6717
+ configure(config) {
6718
+ if (config.enableBrowserConsole !== void 0) {
6719
+ this.enableBrowserConsole = config.enableBrowserConsole;
6720
+ }
6721
+ if (config.logLevel !== void 0) {
6722
+ this.logLevel = config.logLevel;
6723
+ }
6724
+ }
6725
+ setPanel(panel) {
6726
+ this.panel = panel;
6727
+ this.flushBuffer();
6728
+ }
6729
+ flushBuffer() {
6730
+ if (!this.panel) return;
6731
+ this.buffer.forEach(({ message, type }) => {
6732
+ this.panel.logToConsole(message, type);
6733
+ });
6734
+ this.buffer = [];
6735
+ }
6736
+ shouldLog(level) {
6737
+ const levels = ["debug", "info", "warn", "error"];
6738
+ const currentIndex = levels.indexOf(this.logLevel);
6739
+ const messageIndex = levels.indexOf(level);
6740
+ return messageIndex >= currentIndex;
6741
+ }
6742
+ formatMessage(level, message, args) {
6743
+ const argsStr = args.map((arg) => {
6744
+ if (typeof arg === "object") {
6745
+ try {
6746
+ return JSON.stringify(arg, null, 2);
6747
+ } catch {
6748
+ return String(arg);
6749
+ }
6750
+ }
6751
+ return String(arg);
6752
+ }).join(" ");
6753
+ return argsStr ? `${message} ${argsStr}` : message;
6754
+ }
6755
+ output(message, type, browserMethod) {
6756
+ if (this.panel) {
6757
+ this.panel.logToConsole(message, type);
6758
+ } else {
6759
+ this.buffer.push({ message, type, timestamp: /* @__PURE__ */ new Date() });
6760
+ if (this.buffer.length > this.maxBufferSize) {
6761
+ this.buffer.shift();
6762
+ }
6763
+ }
6764
+ if (this.enableBrowserConsole) {
6765
+ console[browserMethod](message);
6766
+ }
6767
+ }
6768
+ debug(message, ...args) {
6769
+ if (!this.shouldLog("debug")) return;
6770
+ const formatted = this.formatMessage("[DEBUG]", message, args);
6771
+ this.output(formatted, "log", "log");
6772
+ }
6773
+ log(message, ...args) {
6774
+ if (!this.shouldLog("info")) return;
6775
+ const formatted = this.formatMessage("", message, args);
6776
+ this.output(formatted, "log", "log");
6777
+ }
6778
+ info(message, ...args) {
6779
+ if (!this.shouldLog("info")) return;
6780
+ const formatted = this.formatMessage("[INFO]", message, args);
6781
+ this.output(formatted, "log", "log");
6782
+ }
6783
+ warn(message, ...args) {
6784
+ if (!this.shouldLog("warn")) return;
6785
+ const formatted = this.formatMessage("[WARN]", message, args);
6786
+ this.output(formatted, "warn", "warn");
6787
+ }
6788
+ error(message, ...args) {
6789
+ if (!this.shouldLog("error")) return;
6790
+ const formatted = this.formatMessage("[ERROR]", message, args);
6791
+ this.output(formatted, "error", "error");
6792
+ }
6793
+ // 特殊方法:仅输出到浏览器控制台(用于重要的初始化信息)
6794
+ consoleDirect(message, ...args) {
6795
+ console.log(message, ...args);
6796
+ }
6797
+ }
6798
+ const logger = new Logger();
6707
6799
  class NetworkInterceptor {
6708
6800
  constructor() {
6709
6801
  this.requests = /* @__PURE__ */ new Map();
@@ -6754,12 +6846,12 @@ class NetworkInterceptor {
6754
6846
  try {
6755
6847
  listener(request);
6756
6848
  } catch (error) {
6757
- console.warn("NetworkDebugger: Listener error:", error);
6849
+ logger.warn("NetworkDebugger: Listener error:", error);
6758
6850
  }
6759
6851
  });
6760
6852
  }
6761
6853
  async tryDecrypt(data, headers) {
6762
- console.log("[PWTK Debug] tryDecrypt called:", {
6854
+ logger.debug("[PWTK Debug] tryDecrypt called:", {
6763
6855
  dataType: typeof data,
6764
6856
  dataLength: typeof data === "string" ? data.length : JSON.stringify(data).length,
6765
6857
  dataPreview: typeof data === "string" ? data.substring(0, 100) : JSON.stringify(data).substring(0, 100),
@@ -6768,14 +6860,14 @@ class NetworkInterceptor {
6768
6860
  hasWindowDecrypt: typeof window.decrypt === "function"
6769
6861
  });
6770
6862
  if (!this.decryptConfig.enabled || !data) {
6771
- console.log("[PWTK Debug] Decrypt disabled or no data");
6863
+ logger.debug("[PWTK Debug] Decrypt disabled or no data");
6772
6864
  return null;
6773
6865
  }
6774
6866
  try {
6775
6867
  let key = "";
6776
6868
  let slk = "";
6777
6869
  if (headers.cid && this.decryptConfig.autoFetchKeys !== false) {
6778
- console.log("[PWTK Debug] Trying to fetch key with cid:", headers.cid);
6870
+ logger.debug("[PWTK Debug] Trying to fetch key with cid:", headers.cid);
6779
6871
  try {
6780
6872
  const apiUrl = this.decryptConfig.keyApiUrl || "https://gw-card-pay.buyacard.cc/ip/getSK";
6781
6873
  const fetchHeaders = {
@@ -6784,57 +6876,57 @@ class NetworkInterceptor {
6784
6876
  device: headers.device || "Web",
6785
6877
  language: headers.language || "CN"
6786
6878
  };
6787
- console.log("[PWTK Debug] Fetching key from:", apiUrl, "with headers:", fetchHeaders);
6879
+ logger.debug("[PWTK Debug] Fetching key from:", apiUrl, "with headers:", fetchHeaders);
6788
6880
  const originalFetch = window.__originalFetch || window.fetch;
6789
6881
  const response = await originalFetch(apiUrl, { headers: fetchHeaders });
6790
6882
  const result = await response.json();
6791
- console.log("[PWTK Debug] getSK API response:", result);
6883
+ logger.debug("[PWTK Debug] getSK API response:", result);
6792
6884
  if (result.success && result.data) {
6793
6885
  const num = String(result.data);
6794
- console.log("[PWTK Debug] getSK returned num:", num, "length:", num.length);
6886
+ logger.debug("[PWTK Debug] getSK returned num:", num, "length:", num.length);
6795
6887
  if (num.length >= 9) {
6796
6888
  key = num.charAt(2) + num.charAt(5) + num.charAt(8);
6797
- console.log("[PWTK Debug] Extracted key from getSK:", key);
6889
+ logger.debug("[PWTK Debug] Extracted key from getSK:", key);
6798
6890
  } else {
6799
- console.log("[PWTK Debug] getSK num too short:", num);
6891
+ logger.debug("[PWTK Debug] getSK num too short:", num);
6800
6892
  }
6801
6893
  } else {
6802
- console.log("[PWTK Debug] getSK failed:", result);
6894
+ logger.debug("[PWTK Debug] getSK failed:", result);
6803
6895
  }
6804
6896
  } catch (e) {
6805
- console.warn("[PWTK Debug] getSK API error:", e);
6897
+ logger.warn("[PWTK Debug] getSK API error:", e);
6806
6898
  }
6807
6899
  } else {
6808
- console.log("[PWTK Debug] No cid or autoFetchKeys disabled");
6900
+ logger.debug("[PWTK Debug] No cid or autoFetchKeys disabled");
6809
6901
  }
6810
6902
  if (!key && this.decryptConfig.keyExtractor) {
6811
6903
  key = this.decryptConfig.keyExtractor(headers);
6812
- console.log("[PWTK Debug] Key from custom extractor:", key);
6904
+ logger.debug("[PWTK Debug] Key from custom extractor:", key);
6813
6905
  } else if (!key) {
6814
6906
  key = headers.decryptKey || headers.keys || headers.cid || "";
6815
- console.log("[PWTK Debug] Key from headers:", key, "from:", headers.decryptKey ? "decryptKey" : headers.keys ? "keys" : headers.cid ? "cid" : "none");
6907
+ logger.debug("[PWTK Debug] Key from headers:", key, "from:", headers.decryptKey ? "decryptKey" : headers.keys ? "keys" : headers.cid ? "cid" : "none");
6816
6908
  }
6817
6909
  if (this.decryptConfig.slkExtractor) {
6818
6910
  slk = this.decryptConfig.slkExtractor(headers);
6819
- console.log("[PWTK Debug] SLK from custom extractor:", slk);
6911
+ logger.debug("[PWTK Debug] SLK from custom extractor:", slk);
6820
6912
  } else {
6821
6913
  slk = headers.decryptSlk || headers.slk || "";
6822
- console.log("[PWTK Debug] SLK from headers:", slk, "from:", headers.decryptSlk ? "decryptSlk" : headers.slk ? "slk" : "none");
6914
+ logger.debug("[PWTK Debug] SLK from headers:", slk, "from:", headers.decryptSlk ? "decryptSlk" : headers.slk ? "slk" : "none");
6823
6915
  }
6824
6916
  const fullKey = key + slk;
6825
- console.log("[PWTK Debug] Full decrypt key:", fullKey ? `"${fullKey}" (length: ${fullKey.length})` : "empty");
6917
+ logger.debug("[PWTK Debug] Full decrypt key:", fullKey ? `"${fullKey}" (length: ${fullKey.length})` : "empty");
6826
6918
  if (fullKey) {
6827
6919
  let dataToDecrypt = data;
6828
6920
  let isWrappedData = false;
6829
6921
  if (typeof data === "object" && data !== null && data.data && typeof data.data === "string") {
6830
- console.log('[PWTK Debug] Data is wrapped in {"data": "..."} format, extracting inner data');
6922
+ logger.debug('[PWTK Debug] Data is wrapped in {"data": "..."} format, extracting inner data');
6831
6923
  dataToDecrypt = data.data;
6832
6924
  isWrappedData = true;
6833
6925
  } else if (typeof data === "string") {
6834
6926
  try {
6835
6927
  const parsed = JSON.parse(data);
6836
6928
  if (parsed.data && typeof parsed.data === "string") {
6837
- console.log("[PWTK Debug] Data is JSON string with data field, extracting");
6929
+ logger.debug("[PWTK Debug] Data is JSON string with data field, extracting");
6838
6930
  dataToDecrypt = parsed.data;
6839
6931
  isWrappedData = true;
6840
6932
  }
@@ -6842,32 +6934,32 @@ class NetworkInterceptor {
6842
6934
  }
6843
6935
  }
6844
6936
  const dataStr = typeof dataToDecrypt === "string" ? dataToDecrypt : JSON.stringify(dataToDecrypt);
6845
- console.log("[PWTK Debug] Calling decrypt with:", {
6937
+ logger.debug("[PWTK Debug] Calling decrypt with:", {
6846
6938
  dataLength: dataStr.length,
6847
6939
  dataPreview: dataStr.substring(0, 50),
6848
6940
  key: fullKey,
6849
6941
  isWrapped: isWrappedData
6850
6942
  });
6851
6943
  const decrypted = decrypt(dataStr, fullKey);
6852
- console.log("[PWTK Debug] Decrypt result:", {
6944
+ logger.debug("[PWTK Debug] Decrypt result:", {
6853
6945
  success: decrypted && decrypted !== dataStr,
6854
6946
  decryptedType: typeof decrypted,
6855
6947
  decryptedLength: decrypted ? typeof decrypted === "string" ? decrypted.length : JSON.stringify(decrypted).length : 0,
6856
6948
  preview: decrypted ? typeof decrypted === "string" ? decrypted.substring(0, 100) : JSON.stringify(decrypted).substring(0, 100) : null
6857
6949
  });
6858
6950
  if (decrypted && decrypted !== dataStr) {
6859
- console.log("[PWTK Debug] ✅ Decryption successful! Result:", decrypted);
6951
+ logger.debug("[PWTK Debug] ✅ Decryption successful! Result:", decrypted);
6860
6952
  return decrypted;
6861
6953
  } else {
6862
- console.log("[PWTK Debug] ❌ Decryption failed or returned same data");
6954
+ logger.debug("[PWTK Debug] ❌ Decryption failed or returned same data");
6863
6955
  }
6864
6956
  } else {
6865
- console.log("[PWTK Debug] No key available, skipping decryption");
6957
+ logger.debug("[PWTK Debug] No key available, skipping decryption");
6866
6958
  }
6867
6959
  } catch (error) {
6868
- console.error("[PWTK Debug] tryDecrypt error:", error);
6960
+ logger.error("[PWTK Debug] tryDecrypt error:", error);
6869
6961
  }
6870
- console.log("[PWTK Debug] tryDecrypt returning null");
6962
+ logger.debug("[PWTK Debug] tryDecrypt returning null");
6871
6963
  return null;
6872
6964
  }
6873
6965
  interceptXHR() {
@@ -6911,17 +7003,17 @@ class NetworkInterceptor {
6911
7003
  if (decrypted !== null) {
6912
7004
  requestData.decryptedRequest = decrypted;
6913
7005
  self2.requests.set(requestId, requestData);
6914
- console.log("[PWTK Debug] Request decrypted, notifying UI");
7006
+ logger.debug("[PWTK Debug] Request decrypted, notifying UI");
6915
7007
  self2.notifyListeners(requestData);
6916
7008
  }
6917
- }).catch((e) => console.warn("解密请求失败:", e));
7009
+ }).catch((e) => logger.warn("解密请求失败:", e));
6918
7010
  }
6919
7011
  self2.requests.set(requestId, requestData);
6920
7012
  self2.notifyListeners(requestData);
6921
7013
  return originalSend.call(this, body);
6922
7014
  };
6923
7015
  xhr.addEventListener("readystatechange", function() {
6924
- console.log("[PWTK Debug] XHR state changed:", {
7016
+ logger.debug("[PWTK Debug] XHR state changed:", {
6925
7017
  readyState: xhr.readyState,
6926
7018
  readyStateName: ["UNSENT", "OPENED", "HEADERS_RECEIVED", "LOADING", "DONE"][xhr.readyState],
6927
7019
  status: xhr.status,
@@ -6929,7 +7021,7 @@ class NetworkInterceptor {
6929
7021
  requestId,
6930
7022
  url
6931
7023
  });
6932
- console.log("[PWTK Debug] Checking response condition:", {
7024
+ logger.debug("[PWTK Debug] Checking response condition:", {
6933
7025
  readyState: xhr.readyState,
6934
7026
  isDone: xhr.readyState === 4,
6935
7027
  XMLHttpRequestDONE: typeof XMLHttpRequest !== "undefined" ? XMLHttpRequest.DONE : "undefined",
@@ -6937,11 +7029,11 @@ class NetworkInterceptor {
6937
7029
  shouldProcess: xhr.readyState === 4 && !isInternalRequest
6938
7030
  });
6939
7031
  if (xhr.readyState === 4 && !isInternalRequest) {
6940
- console.log("[PWTK Debug] XHR completed, processing response");
7032
+ logger.debug("[PWTK Debug] XHR completed, processing response");
6941
7033
  const endTime = Date.now();
6942
7034
  const requestData = self2.requests.get(requestId);
6943
7035
  if (requestData) {
6944
- console.log("[PWTK Debug] Found request data, updating with response");
7036
+ logger.debug("[PWTK Debug] Found request data, updating with response");
6945
7037
  requestData.status = xhr.status;
6946
7038
  requestData.statusText = xhr.statusText;
6947
7039
  requestData.duration = endTime - startTime;
@@ -6957,7 +7049,7 @@ class NetworkInterceptor {
6957
7049
  }
6958
7050
  requestData.responseHeaders = responseHeaders;
6959
7051
  const hasResponseText = xhr.responseText !== null && xhr.responseText !== void 0 && xhr.responseText !== "";
6960
- console.log("[PWTK Debug] XHR Response received:", {
7052
+ logger.debug("[PWTK Debug] XHR Response received:", {
6961
7053
  status: requestData.status,
6962
7054
  hasResponseText,
6963
7055
  responseTextLength: xhr.responseText?.length,
@@ -6966,16 +7058,16 @@ class NetworkInterceptor {
6966
7058
  if (hasResponseText) {
6967
7059
  try {
6968
7060
  requestData.responseBody = JSON.parse(xhr.responseText);
6969
- console.log("[PWTK Debug] Response parsed as JSON:", requestData.responseBody);
7061
+ logger.debug("[PWTK Debug] Response parsed as JSON:", requestData.responseBody);
6970
7062
  } catch {
6971
7063
  requestData.responseBody = xhr.responseText;
6972
- console.log("[PWTK Debug] Response kept as text");
7064
+ logger.debug("[PWTK Debug] Response kept as text");
6973
7065
  }
6974
7066
  } else {
6975
7067
  requestData.responseBody = null;
6976
- console.log("[PWTK Debug] No response body");
7068
+ logger.debug("[PWTK Debug] No response body");
6977
7069
  }
6978
- console.log("[PWTK Debug] Updating request with response data");
7070
+ logger.debug("[PWTK Debug] Updating request with response data");
6979
7071
  self2.requests.set(requestId, requestData);
6980
7072
  self2.notifyListeners(requestData);
6981
7073
  if (requestData.responseBody) {
@@ -6983,13 +7075,13 @@ class NetworkInterceptor {
6983
7075
  if (decrypted !== null) {
6984
7076
  requestData.decryptedResponse = decrypted;
6985
7077
  self2.requests.set(requestId, requestData);
6986
- console.log("[PWTK Debug] Response decrypted, notifying UI:", decrypted);
7078
+ logger.debug("[PWTK Debug] Response decrypted, notifying UI:", decrypted);
6987
7079
  self2.notifyListeners(requestData);
6988
7080
  }
6989
- }).catch((e) => console.warn("解密响应失败:", e));
7081
+ }).catch((e) => logger.warn("解密响应失败:", e));
6990
7082
  }
6991
7083
  } else {
6992
- console.log("[PWTK Debug] WARNING: Request data not found for ID:", requestId);
7084
+ logger.debug("[PWTK Debug] WARNING: Request data not found for ID:", requestId);
6993
7085
  }
6994
7086
  }
6995
7087
  });
@@ -7049,10 +7141,10 @@ class NetworkInterceptor {
7049
7141
  if (decrypted !== null) {
7050
7142
  requestData.decryptedRequest = decrypted;
7051
7143
  self2.requests.set(requestId, requestData);
7052
- console.log("[PWTK Debug] Fetch request decrypted, notifying UI");
7144
+ logger.debug("[PWTK Debug] Fetch request decrypted, notifying UI");
7053
7145
  self2.notifyListeners(requestData);
7054
7146
  }
7055
- }).catch((e) => console.warn("解密请求失败:", e));
7147
+ }).catch((e) => logger.warn("解密请求失败:", e));
7056
7148
  }
7057
7149
  self2.requests.set(requestId, requestData);
7058
7150
  self2.notifyListeners(requestData);
@@ -7072,7 +7164,7 @@ class NetworkInterceptor {
7072
7164
  updatedRequestData.responseHeaders = responseHeaders;
7073
7165
  try {
7074
7166
  const responseText = await responseClone.text();
7075
- console.log("[PWTK Debug] Fetch Response received:", {
7167
+ logger.debug("[PWTK Debug] Fetch Response received:", {
7076
7168
  status: updatedRequestData.status,
7077
7169
  textLength: responseText.length,
7078
7170
  textPreview: responseText.substring(0, 100)
@@ -7092,10 +7184,10 @@ class NetworkInterceptor {
7092
7184
  if (decrypted !== null) {
7093
7185
  updatedRequestData.decryptedResponse = decrypted;
7094
7186
  self2.requests.set(requestId, updatedRequestData);
7095
- console.log("[PWTK Debug] Fetch response decrypted, notifying UI:", decrypted);
7187
+ logger.debug("[PWTK Debug] Fetch response decrypted, notifying UI:", decrypted);
7096
7188
  self2.notifyListeners(updatedRequestData);
7097
7189
  }
7098
- }).catch((e) => console.warn("解密响应失败:", e));
7190
+ }).catch((e) => logger.warn("解密响应失败:", e));
7099
7191
  }
7100
7192
  } catch (error) {
7101
7193
  updatedRequestData.error = `Failed to read response: ${error}`;
@@ -7124,14 +7216,14 @@ class WasmLoader {
7124
7216
  this.loading = false;
7125
7217
  }
7126
7218
  async loadWasm(wasmUrl, jsUrl) {
7127
- console.log("[PWTK WASM] loadWasm called");
7128
- console.log("[PWTK WASM] Current state:", {
7219
+ logger.debug("[PWTK WASM] loadWasm called");
7220
+ logger.debug("[PWTK WASM] Current state:", {
7129
7221
  hasWindowDecrypt: typeof window.decrypt === "function",
7130
7222
  hasWindowEncrypt: typeof window.encrypt === "function",
7131
7223
  hasWindowGo: typeof window.Go !== "undefined"
7132
7224
  });
7133
7225
  if (typeof window.decrypt === "function") {
7134
- console.log("[PWTK WASM] window.decrypt already exists, skipping WASM load");
7226
+ logger.debug("[PWTK WASM] window.decrypt already exists, skipping WASM load");
7135
7227
  this.loaded = true;
7136
7228
  return true;
7137
7229
  }
@@ -7170,11 +7262,11 @@ class WasmLoader {
7170
7262
  await this.loadScript(jsPath);
7171
7263
  if (typeof window.Go !== "undefined") {
7172
7264
  jsLoaded = true;
7173
- console.log("[PWTK WASM] wasm_exec.js loaded successfully from:", jsPath);
7265
+ logger.debug("[PWTK WASM] wasm_exec.js loaded successfully from:", jsPath);
7174
7266
  break;
7175
7267
  }
7176
7268
  } catch (e) {
7177
- console.warn("NetworkDebugger: 尝试加载", jsPath, "失败:", e);
7269
+ logger.warn("NetworkDebugger: 尝试加载", jsPath, "失败:", e);
7178
7270
  continue;
7179
7271
  }
7180
7272
  }
@@ -7194,23 +7286,23 @@ class WasmLoader {
7194
7286
  fetch(wasmPath),
7195
7287
  go.importObject
7196
7288
  );
7197
- console.log("NetworkDebugger: WebAssembly 加载成功:", wasmPath);
7289
+ logger.info("NetworkDebugger: WebAssembly 加载成功:", wasmPath);
7198
7290
  break;
7199
7291
  } catch (streamError) {
7200
- console.warn("instantiateStreaming 失败,尝试传统方式:", streamError);
7292
+ logger.warn("instantiateStreaming 失败,尝试传统方式:", streamError);
7201
7293
  const wasmBuffer = await fetch(wasmPath).then((response) => response.arrayBuffer());
7202
7294
  wasmModule = await WebAssembly.instantiate(wasmBuffer, go.importObject);
7203
- console.log("NetworkDebugger: WebAssembly 加载成功(传统方式):", wasmPath);
7295
+ logger.info("NetworkDebugger: WebAssembly 加载成功(传统方式):", wasmPath);
7204
7296
  break;
7205
7297
  }
7206
7298
  } else {
7207
7299
  const wasmBuffer = await fetch(wasmPath).then((response) => response.arrayBuffer());
7208
7300
  wasmModule = await WebAssembly.instantiate(wasmBuffer, go.importObject);
7209
- console.log("NetworkDebugger: WebAssembly 加载成功(传统方式):", wasmPath);
7301
+ logger.info("NetworkDebugger: WebAssembly 加载成功(传统方式):", wasmPath);
7210
7302
  break;
7211
7303
  }
7212
7304
  } catch (error) {
7213
- console.warn("NetworkDebugger: 尝试加载", wasmPath, "失败:", error);
7305
+ logger.warn("NetworkDebugger: 尝试加载", wasmPath, "失败:", error);
7214
7306
  continue;
7215
7307
  }
7216
7308
  }
@@ -7219,25 +7311,25 @@ class WasmLoader {
7219
7311
  }
7220
7312
  go.run(wasmModule.instance);
7221
7313
  await new Promise((resolve) => setTimeout(resolve, 100));
7222
- console.log("[PWTK WASM] After WASM load, checking functions:", {
7314
+ logger.debug("[PWTK WASM] After WASM load, checking functions:", {
7223
7315
  hasDecrypt: typeof window.decrypt === "function",
7224
7316
  hasEncrypt: typeof window.encrypt === "function",
7225
7317
  windowKeys: Object.keys(window).filter((k) => k.includes("crypt"))
7226
7318
  });
7227
7319
  if (typeof window.decrypt === "function") {
7228
7320
  this.loaded = true;
7229
- console.log("[PWTK WASM] ✅ WebAssembly loaded successfully, decrypt function available");
7321
+ logger.debug("[PWTK WASM] ✅ WebAssembly loaded successfully, decrypt function available");
7230
7322
  return true;
7231
7323
  } else {
7232
- console.warn("[PWTK WASM] ❌ WebAssembly loaded but decrypt function not available");
7324
+ logger.warn("[PWTK WASM] ❌ WebAssembly loaded but decrypt function not available");
7233
7325
  return false;
7234
7326
  }
7235
7327
  } catch (error) {
7236
- console.error("[PWTK WASM] WebAssembly loading failed:", error);
7328
+ logger.error("[PWTK WASM] WebAssembly loading failed:", error);
7237
7329
  return false;
7238
7330
  } finally {
7239
7331
  this.loading = false;
7240
- console.log("[PWTK WASM] Load complete, final state:", {
7332
+ logger.debug("[PWTK WASM] Load complete, final state:", {
7241
7333
  loaded: this.loaded,
7242
7334
  hasDecrypt: typeof window.decrypt === "function"
7243
7335
  });
@@ -7900,13 +7992,13 @@ async function createShareLink(requestData) {
7900
7992
  const result = await response.json();
7901
7993
  if (result.shareId) {
7902
7994
  const shareUrl = `https://curl.bwg.leeguoo.com/share/${result.shareId}`;
7903
- console.log(`🔗 分享链接创建成功 (by Leo): ${shareUrl}`);
7995
+ logger.info(`🔗 分享链接创建成功 (by Leo): ${shareUrl}`);
7904
7996
  return shareUrl;
7905
7997
  } else {
7906
7998
  throw new Error(result.error || "创建分享失败");
7907
7999
  }
7908
8000
  } catch (error) {
7909
- console.error("NetworkDebugger: 创建分享链接失败:", error);
8001
+ logger.error("NetworkDebugger: 创建分享链接失败:", error);
7910
8002
  throw error;
7911
8003
  }
7912
8004
  }
@@ -7927,7 +8019,7 @@ async function copyToClipboard(text) {
7927
8019
  return success;
7928
8020
  }
7929
8021
  } catch (error) {
7930
- console.error("复制到剪贴板失败:", error);
8022
+ logger.error("复制到剪贴板失败:", error);
7931
8023
  return false;
7932
8024
  }
7933
8025
  }
@@ -7966,6 +8058,7 @@ class DebugPanel {
7966
8058
  this.createPanel();
7967
8059
  this.bindEvents();
7968
8060
  this.startListening();
8061
+ logger.setPanel(this);
7969
8062
  }
7970
8063
  createPanel() {
7971
8064
  if (!document.getElementById("network-debugger-styles")) {
@@ -8024,7 +8117,7 @@ class DebugPanel {
8024
8117
  <div class="about-panel" data-panel="about" style="display: none;">
8025
8118
  <div style="padding: 20px; color: #fff; text-align: center;">
8026
8119
  <h2 style="margin: 0 0 20px 0;">🔓 PWTK 解密小工具</h2>
8027
- <p style="margin: 10px 0;">Version: 1.2.14</p>
8120
+ <p style="margin: 10px 0;">Version: 1.2.20</p>
8028
8121
  <p style="margin: 10px 0;">👨‍💻 Created by <strong>Leo (@leeguoo)</strong></p>
8029
8122
  <p style="margin: 10px 0;">📧 技术支持:请联系 Leo</p>
8030
8123
  <p style="margin: 10px 0;">🌐 分享服务:curl.bwg.leeguoo.com</p>
@@ -8294,6 +8387,10 @@ class DebugPanel {
8294
8387
  return "status-error";
8295
8388
  }
8296
8389
  truncateUrl(url) {
8390
+ const questionIndex = url.indexOf("?");
8391
+ if (questionIndex > -1) {
8392
+ return url.substring(0, questionIndex);
8393
+ }
8297
8394
  return url;
8298
8395
  }
8299
8396
  switchTab(tabName) {
@@ -8349,7 +8446,7 @@ Created by Leo (@leeguoo)`);
8349
8446
  throw new Error("无法创建分享链接");
8350
8447
  }
8351
8448
  } catch (error) {
8352
- console.error("分享失败:", error);
8449
+ logger.error("分享失败:", error);
8353
8450
  this.logToConsole(`❌ 分享失败: ${error}`);
8354
8451
  alert("分享失败,请稍后重试");
8355
8452
  }
@@ -8592,7 +8689,7 @@ class NetworkDebugger {
8592
8689
  }
8593
8690
  async init(config = {}) {
8594
8691
  if (this.initialized) {
8595
- console.warn("NetworkDebugger already initialized");
8692
+ logger.warn("NetworkDebugger already initialized");
8596
8693
  return;
8597
8694
  }
8598
8695
  this.config = {
@@ -8611,20 +8708,29 @@ class NetworkDebugger {
8611
8708
  keyApiUrl: "https://gw-card-pay.buyacard.cc/ip/getSK",
8612
8709
  ...config.decrypt
8613
8710
  },
8711
+ log: {
8712
+ toBrowserConsole: false,
8713
+ level: "info",
8714
+ ...config.log
8715
+ },
8614
8716
  ...config
8615
8717
  };
8718
+ logger.configure({
8719
+ enableBrowserConsole: this.config.log?.toBrowserConsole || false,
8720
+ logLevel: this.config.log?.level || "info"
8721
+ });
8616
8722
  try {
8617
8723
  if (this.config.wasm?.enabled !== false) {
8618
- console.log("[PWTK Init] Starting WASM initialization");
8724
+ logger.info("[PWTK Init] Starting WASM initialization");
8619
8725
  this.wasmLoader = new WasmLoader();
8620
8726
  const wasmLoaded = await this.wasmLoader.loadWasm(this.config.wasm?.wasmUrl, this.config.wasm?.jsUrl);
8621
8727
  if (wasmLoaded) {
8622
- console.log("[PWTK Init] ✅ WASM decrypt function ready");
8728
+ logger.info("[PWTK Init] ✅ WASM decrypt function ready");
8623
8729
  } else {
8624
- console.log("[PWTK Init] ⚠️ WASM load failed or decrypt function unavailable, will rely on page-provided decryption");
8730
+ logger.warn("[PWTK Init] ⚠️ WASM load failed or decrypt function unavailable, will rely on page-provided decryption");
8625
8731
  }
8626
8732
  } else {
8627
- console.log("[PWTK Init] WASM disabled in config");
8733
+ logger.info("[PWTK Init] WASM disabled in config");
8628
8734
  }
8629
8735
  this.interceptor = new NetworkInterceptor();
8630
8736
  if (this.config.decrypt?.enabled) {
@@ -8639,23 +8745,23 @@ class NetworkDebugger {
8639
8745
  this.createPanel();
8640
8746
  }
8641
8747
  this.initialized = true;
8642
- console.log(`
8748
+ logger.consoleDirect(`
8643
8749
  ╔════════════════════════════════════════╗
8644
- ║ 🔓 PWTK 解密小工具 v1.2.18
8750
+ ║ 🔓 PWTK 解密小工具 v1.2.20
8645
8751
  ║ Created by Leo (@leeguoo) ║
8646
8752
  ║ 技术支持: 请联系 Leo ║
8647
8753
  ║ 分享服务: curl.bwg.leeguoo.com ║
8648
8754
  ╚════════════════════════════════════════╝
8649
8755
  `);
8650
- console.log("🔍 NetworkDebugger initialized successfully");
8756
+ logger.info("🔍 NetworkDebugger initialized successfully");
8651
8757
  } catch (error) {
8652
- console.error("NetworkDebugger initialization failed:", error);
8758
+ logger.error("NetworkDebugger initialization failed:", error);
8653
8759
  throw error;
8654
8760
  }
8655
8761
  }
8656
8762
  show() {
8657
8763
  if (!this.initialized) {
8658
- console.error("NetworkDebugger not initialized. Call init() first.");
8764
+ logger.error("NetworkDebugger not initialized. Call init() first.");
8659
8765
  return;
8660
8766
  }
8661
8767
  if (!this.panel) {
@@ -8675,7 +8781,7 @@ class NetworkDebugger {
8675
8781
  this.panel = null;
8676
8782
  }
8677
8783
  this.initialized = false;
8678
- console.log("NetworkDebugger destroyed");
8784
+ logger.info("NetworkDebugger destroyed");
8679
8785
  }
8680
8786
  getRequests() {
8681
8787
  return this.interceptor?.getRequests() || [];
@@ -8707,7 +8813,7 @@ class NetworkDebugger {
8707
8813
  }
8708
8814
  createPanel() {
8709
8815
  if (!this.interceptor) {
8710
- console.error("Cannot create panel: interceptor not initialized");
8816
+ logger.error("Cannot create panel: interceptor not initialized");
8711
8817
  return;
8712
8818
  }
8713
8819
  this.panel = new DebugPanel(this.interceptor, {
@@ -8728,7 +8834,7 @@ let globalInstance = null;
8728
8834
  const NetworkDebuggerGlobal = {
8729
8835
  async init(config) {
8730
8836
  if (globalInstance) {
8731
- console.warn("NetworkDebugger already has a global instance");
8837
+ logger.warn("NetworkDebugger already has a global instance");
8732
8838
  return globalInstance;
8733
8839
  }
8734
8840
  globalInstance = await NetworkDebugger.create(config);