@getlimelight/sdk 0.5.2 → 0.5.5
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.js +69 -58
- package/dist/index.js.map +1 -1
- package/dist/index.mjs +69 -58
- package/dist/index.mjs.map +1 -1
- package/package.json +1 -1
package/dist/index.js
CHANGED
|
@@ -201,6 +201,15 @@ var getInitiator = () => {
|
|
|
201
201
|
}
|
|
202
202
|
};
|
|
203
203
|
|
|
204
|
+
// src/helpers/detection/detectGlobalObject.ts
|
|
205
|
+
var detectGlobalObject = () => {
|
|
206
|
+
if (typeof globalThis !== "undefined") return globalThis;
|
|
207
|
+
if (typeof window !== "undefined") return window;
|
|
208
|
+
if (typeof global !== "undefined") return global;
|
|
209
|
+
if (typeof self !== "undefined") return self;
|
|
210
|
+
throw new Error("Unable to locate global object");
|
|
211
|
+
};
|
|
212
|
+
|
|
204
213
|
// src/helpers/graphql/detectGraphQlOperationType.ts
|
|
205
214
|
var detectGraphQlOperationType = (query) => {
|
|
206
215
|
if (!query) return null;
|
|
@@ -276,7 +285,7 @@ var SENSITIVE_HEADERS = [
|
|
|
276
285
|
var LIMELIGHT_WEB_WSS_URL = "wss://api.getlimelight.io";
|
|
277
286
|
var LIMELIGHT_DESKTOP_WSS_URL = "ws://localhost:8484";
|
|
278
287
|
var WS_PATH = "/limelight";
|
|
279
|
-
var SDK_VERSION = true ? "0.5.
|
|
288
|
+
var SDK_VERSION = true ? "0.5.5" : "test-version";
|
|
280
289
|
var RENDER_THRESHOLDS = {
|
|
281
290
|
HOT_VELOCITY: 5,
|
|
282
291
|
HIGH_RENDER_COUNT: 50,
|
|
@@ -593,7 +602,7 @@ var ConsoleInterceptor = class {
|
|
|
593
602
|
}
|
|
594
603
|
this.isSetup = true;
|
|
595
604
|
this.config = config;
|
|
596
|
-
const
|
|
605
|
+
const self2 = this;
|
|
597
606
|
const methods = [
|
|
598
607
|
"log" /* LOG */,
|
|
599
608
|
"warn" /* WARN */,
|
|
@@ -606,28 +615,28 @@ var ConsoleInterceptor = class {
|
|
|
606
615
|
const original = console[level];
|
|
607
616
|
this.originalConsole[level] = original;
|
|
608
617
|
console[level] = function(...args) {
|
|
609
|
-
if (
|
|
618
|
+
if (self2.isInternalLog) {
|
|
610
619
|
return original.apply(console, args);
|
|
611
620
|
}
|
|
612
|
-
|
|
621
|
+
self2.isInternalLog = true;
|
|
613
622
|
try {
|
|
614
623
|
const source = detectLogSource();
|
|
615
624
|
const consoleType = detectConsoleType(level, args);
|
|
616
|
-
const stackTrace =
|
|
625
|
+
const stackTrace = self2.captureStackTrace();
|
|
617
626
|
let consoleEvent = {
|
|
618
|
-
id: `${
|
|
627
|
+
id: `${self2.getSessionId()}-${Date.now()}-${self2.counter++}`,
|
|
619
628
|
phase: "CONSOLE",
|
|
620
629
|
type: "CONSOLE" /* CONSOLE */,
|
|
621
630
|
level,
|
|
622
631
|
timestamp: Date.now(),
|
|
623
|
-
sessionId:
|
|
632
|
+
sessionId: self2.getSessionId(),
|
|
624
633
|
source,
|
|
625
634
|
consoleType,
|
|
626
635
|
args: args.map((arg) => safeStringify(arg)),
|
|
627
636
|
stackTrace
|
|
628
637
|
};
|
|
629
|
-
if (
|
|
630
|
-
const modifiedEvent =
|
|
638
|
+
if (self2.config?.beforeSend) {
|
|
639
|
+
const modifiedEvent = self2.config.beforeSend(consoleEvent);
|
|
631
640
|
if (!modifiedEvent) {
|
|
632
641
|
return original.apply(console, args);
|
|
633
642
|
}
|
|
@@ -639,10 +648,10 @@ var ConsoleInterceptor = class {
|
|
|
639
648
|
}
|
|
640
649
|
consoleEvent = modifiedEvent;
|
|
641
650
|
}
|
|
642
|
-
|
|
651
|
+
self2.sendMessage(consoleEvent);
|
|
643
652
|
} catch (error) {
|
|
644
653
|
} finally {
|
|
645
|
-
|
|
654
|
+
self2.isInternalLog = false;
|
|
646
655
|
}
|
|
647
656
|
return original.apply(console, args);
|
|
648
657
|
};
|
|
@@ -700,11 +709,13 @@ var NetworkInterceptor = class {
|
|
|
700
709
|
constructor(sendMessage, getSessionId) {
|
|
701
710
|
this.sendMessage = sendMessage;
|
|
702
711
|
this.getSessionId = getSessionId;
|
|
703
|
-
this.
|
|
712
|
+
this.globalObject = detectGlobalObject();
|
|
713
|
+
this.originalFetch = this.globalObject.fetch.bind(this.globalObject);
|
|
704
714
|
}
|
|
705
715
|
originalFetch;
|
|
706
716
|
config = null;
|
|
707
717
|
isSetup = false;
|
|
718
|
+
globalObject;
|
|
708
719
|
/**
|
|
709
720
|
* Sets up fetch interception by wrapping the global fetch function.
|
|
710
721
|
* Intercepts all fetch requests to capture network events.
|
|
@@ -721,8 +732,8 @@ var NetworkInterceptor = class {
|
|
|
721
732
|
}
|
|
722
733
|
this.isSetup = true;
|
|
723
734
|
this.config = config;
|
|
724
|
-
const
|
|
725
|
-
|
|
735
|
+
const self2 = this;
|
|
736
|
+
this.globalObject.fetch = async function(input, init = {}) {
|
|
726
737
|
const requestId = generateRequestId();
|
|
727
738
|
const startTime = Date.now();
|
|
728
739
|
const url = typeof input === "string" ? input : input instanceof URL ? input.toString() : input.url;
|
|
@@ -752,7 +763,7 @@ var NetworkInterceptor = class {
|
|
|
752
763
|
}
|
|
753
764
|
} catch {
|
|
754
765
|
requestBodyToSerialize = void 0;
|
|
755
|
-
if (
|
|
766
|
+
if (self2.config?.enableInternalLogging) {
|
|
756
767
|
console.warn(
|
|
757
768
|
"[Limelight] Failed to read request body from Request object"
|
|
758
769
|
);
|
|
@@ -761,10 +772,10 @@ var NetworkInterceptor = class {
|
|
|
761
772
|
}
|
|
762
773
|
const requestBody = serializeBody(
|
|
763
774
|
requestBodyToSerialize,
|
|
764
|
-
|
|
775
|
+
self2.config?.disableBodyCapture
|
|
765
776
|
);
|
|
766
777
|
let graphqlData = void 0;
|
|
767
|
-
if (
|
|
778
|
+
if (self2.config?.enableGraphQL && isGraphQLRequest(url, requestBody)) {
|
|
768
779
|
const rawBody = requestBody?.raw;
|
|
769
780
|
if (rawBody) {
|
|
770
781
|
graphqlData = parseGraphQL(rawBody) ?? void 0;
|
|
@@ -772,7 +783,7 @@ var NetworkInterceptor = class {
|
|
|
772
783
|
}
|
|
773
784
|
let requestEvent = {
|
|
774
785
|
id: requestId,
|
|
775
|
-
sessionId:
|
|
786
|
+
sessionId: self2.getSessionId(),
|
|
776
787
|
timestamp: startTime,
|
|
777
788
|
phase: "REQUEST" /* REQUEST */,
|
|
778
789
|
networkType: "fetch" /* FETCH */,
|
|
@@ -785,20 +796,20 @@ var NetworkInterceptor = class {
|
|
|
785
796
|
requestSize: requestBody?.size ?? 0,
|
|
786
797
|
graphql: graphqlData
|
|
787
798
|
};
|
|
788
|
-
if (
|
|
789
|
-
const modifiedEvent =
|
|
799
|
+
if (self2.config?.beforeSend) {
|
|
800
|
+
const modifiedEvent = self2.config.beforeSend(requestEvent);
|
|
790
801
|
if (!modifiedEvent) {
|
|
791
|
-
return
|
|
802
|
+
return self2.originalFetch(input, modifiedInit);
|
|
792
803
|
}
|
|
793
804
|
if (modifiedEvent.phase !== "REQUEST" /* REQUEST */) {
|
|
794
805
|
console.error("[Limelight] beforeSend must return same event type");
|
|
795
|
-
return
|
|
806
|
+
return self2.originalFetch(input, modifiedInit);
|
|
796
807
|
}
|
|
797
808
|
requestEvent = modifiedEvent;
|
|
798
809
|
}
|
|
799
|
-
|
|
810
|
+
self2.sendMessage(requestEvent);
|
|
800
811
|
try {
|
|
801
|
-
const response = await
|
|
812
|
+
const response = await self2.originalFetch(input, modifiedInit);
|
|
802
813
|
const clone = response.clone();
|
|
803
814
|
const endTime = Date.now();
|
|
804
815
|
const duration = endTime - startTime;
|
|
@@ -814,11 +825,11 @@ var NetworkInterceptor = class {
|
|
|
814
825
|
}
|
|
815
826
|
const responseBody = serializeBody(
|
|
816
827
|
responseText,
|
|
817
|
-
|
|
828
|
+
self2.config?.disableBodyCapture
|
|
818
829
|
);
|
|
819
830
|
let responseEvent = {
|
|
820
831
|
id: requestId,
|
|
821
|
-
sessionId:
|
|
832
|
+
sessionId: self2.getSessionId(),
|
|
822
833
|
timestamp: endTime,
|
|
823
834
|
phase: "RESPONSE" /* RESPONSE */,
|
|
824
835
|
networkType: "fetch" /* FETCH */,
|
|
@@ -831,8 +842,8 @@ var NetworkInterceptor = class {
|
|
|
831
842
|
redirected: response.redirected,
|
|
832
843
|
ok: response.ok
|
|
833
844
|
};
|
|
834
|
-
if (
|
|
835
|
-
const modifiedEvent =
|
|
845
|
+
if (self2.config?.beforeSend) {
|
|
846
|
+
const modifiedEvent = self2.config.beforeSend(responseEvent);
|
|
836
847
|
if (!modifiedEvent) {
|
|
837
848
|
return response;
|
|
838
849
|
}
|
|
@@ -842,28 +853,28 @@ var NetworkInterceptor = class {
|
|
|
842
853
|
}
|
|
843
854
|
responseEvent = modifiedEvent;
|
|
844
855
|
}
|
|
845
|
-
|
|
856
|
+
self2.sendMessage(responseEvent);
|
|
846
857
|
return response;
|
|
847
858
|
} catch (err) {
|
|
859
|
+
const isAbort = err instanceof Error && (err.name === "AbortError" || err.message.includes("aborted"));
|
|
848
860
|
const errorMessage = err instanceof Error ? err.message : String(err);
|
|
849
861
|
const errorStack = err instanceof Error ? err.stack : void 0;
|
|
850
|
-
const isAbort = err instanceof DOMException && err.name === "AbortError";
|
|
851
862
|
let errorEvent = {
|
|
852
863
|
id: requestId,
|
|
853
|
-
sessionId:
|
|
864
|
+
sessionId: self2.getSessionId(),
|
|
854
865
|
timestamp: Date.now(),
|
|
855
866
|
phase: isAbort ? "ABORT" /* ABORT */ : "ERROR" /* ERROR */,
|
|
856
867
|
networkType: "fetch" /* FETCH */,
|
|
857
868
|
errorMessage: isAbort ? "Request aborted" : errorMessage,
|
|
858
869
|
stack: errorStack
|
|
859
870
|
};
|
|
860
|
-
if (
|
|
861
|
-
const modifiedEvent =
|
|
862
|
-
if (modifiedEvent && modifiedEvent.phase === "ERROR" /* ERROR */) {
|
|
871
|
+
if (self2.config?.beforeSend) {
|
|
872
|
+
const modifiedEvent = self2.config.beforeSend(errorEvent);
|
|
873
|
+
if (modifiedEvent && (modifiedEvent.phase === "ERROR" /* ERROR */ || modifiedEvent.phase === "ABORT" /* ABORT */)) {
|
|
863
874
|
errorEvent = modifiedEvent;
|
|
864
875
|
}
|
|
865
876
|
}
|
|
866
|
-
|
|
877
|
+
self2.sendMessage(errorEvent);
|
|
867
878
|
throw err;
|
|
868
879
|
}
|
|
869
880
|
};
|
|
@@ -880,7 +891,7 @@ var NetworkInterceptor = class {
|
|
|
880
891
|
return;
|
|
881
892
|
}
|
|
882
893
|
this.isSetup = false;
|
|
883
|
-
|
|
894
|
+
this.globalObject.fetch = this.originalFetch;
|
|
884
895
|
}
|
|
885
896
|
};
|
|
886
897
|
|
|
@@ -914,7 +925,7 @@ var XHRInterceptor = class {
|
|
|
914
925
|
}
|
|
915
926
|
this.isSetup = true;
|
|
916
927
|
this.config = config;
|
|
917
|
-
const
|
|
928
|
+
const self2 = this;
|
|
918
929
|
XMLHttpRequest.prototype.open = function(method, url) {
|
|
919
930
|
this._limelightData = {
|
|
920
931
|
id: generateRequestId(),
|
|
@@ -924,7 +935,7 @@ var XHRInterceptor = class {
|
|
|
924
935
|
startTime: Date.now(),
|
|
925
936
|
listeners: /* @__PURE__ */ new Map()
|
|
926
937
|
};
|
|
927
|
-
return
|
|
938
|
+
return self2.originalXHROpen.apply(
|
|
928
939
|
this,
|
|
929
940
|
arguments
|
|
930
941
|
);
|
|
@@ -936,21 +947,21 @@ var XHRInterceptor = class {
|
|
|
936
947
|
this._limelightData.skipIntercept = true;
|
|
937
948
|
}
|
|
938
949
|
}
|
|
939
|
-
return
|
|
950
|
+
return self2.originalXHRSetRequestHeader.apply(this, arguments);
|
|
940
951
|
};
|
|
941
952
|
XMLHttpRequest.prototype.send = function(body) {
|
|
942
953
|
const data = this._limelightData;
|
|
943
954
|
if (data?.skipIntercept) {
|
|
944
|
-
return
|
|
955
|
+
return self2.originalXHRSend.apply(this, arguments);
|
|
945
956
|
}
|
|
946
957
|
if (data) {
|
|
947
958
|
const requestBody = serializeBody(
|
|
948
959
|
body,
|
|
949
|
-
|
|
960
|
+
self2.config?.disableBodyCapture
|
|
950
961
|
);
|
|
951
962
|
let requestEvent = {
|
|
952
963
|
id: data.id,
|
|
953
|
-
sessionId:
|
|
964
|
+
sessionId: self2.getSessionId(),
|
|
954
965
|
timestamp: data.startTime,
|
|
955
966
|
phase: "REQUEST" /* REQUEST */,
|
|
956
967
|
networkType: "xhr" /* XHR */,
|
|
@@ -962,18 +973,18 @@ var XHRInterceptor = class {
|
|
|
962
973
|
initiator: getInitiator(),
|
|
963
974
|
requestSize: requestBody?.size ?? 0
|
|
964
975
|
};
|
|
965
|
-
if (
|
|
966
|
-
const modifiedEvent =
|
|
976
|
+
if (self2.config?.beforeSend) {
|
|
977
|
+
const modifiedEvent = self2.config.beforeSend(requestEvent);
|
|
967
978
|
if (!modifiedEvent) {
|
|
968
|
-
return
|
|
979
|
+
return self2.originalXHRSend.apply(this, arguments);
|
|
969
980
|
}
|
|
970
981
|
if (modifiedEvent.phase !== "REQUEST" /* REQUEST */) {
|
|
971
982
|
console.error("[Limelight] beforeSend must return same event type");
|
|
972
|
-
return
|
|
983
|
+
return self2.originalXHRSend.apply(this, arguments);
|
|
973
984
|
}
|
|
974
985
|
requestEvent = modifiedEvent;
|
|
975
986
|
}
|
|
976
|
-
|
|
987
|
+
self2.sendMessage(requestEvent);
|
|
977
988
|
let responseSent = false;
|
|
978
989
|
const cleanup = () => {
|
|
979
990
|
if (data.listeners) {
|
|
@@ -989,7 +1000,7 @@ var XHRInterceptor = class {
|
|
|
989
1000
|
responseSent = true;
|
|
990
1001
|
const endTime = Date.now();
|
|
991
1002
|
const duration = endTime - data.startTime;
|
|
992
|
-
const responseHeaders =
|
|
1003
|
+
const responseHeaders = self2.parseResponseHeaders(
|
|
993
1004
|
this.getAllResponseHeaders()
|
|
994
1005
|
);
|
|
995
1006
|
let responseData;
|
|
@@ -1005,11 +1016,11 @@ var XHRInterceptor = class {
|
|
|
1005
1016
|
}
|
|
1006
1017
|
const responseBody = serializeBody(
|
|
1007
1018
|
responseData,
|
|
1008
|
-
|
|
1019
|
+
self2.config?.disableBodyCapture
|
|
1009
1020
|
);
|
|
1010
1021
|
let responseEvent = {
|
|
1011
1022
|
id: data.id,
|
|
1012
|
-
sessionId:
|
|
1023
|
+
sessionId: self2.getSessionId(),
|
|
1013
1024
|
timestamp: endTime,
|
|
1014
1025
|
phase: "RESPONSE" /* RESPONSE */,
|
|
1015
1026
|
networkType: "xhr" /* XHR */,
|
|
@@ -1022,8 +1033,8 @@ var XHRInterceptor = class {
|
|
|
1022
1033
|
redirected: false,
|
|
1023
1034
|
ok: this.status >= 200 && this.status < 300
|
|
1024
1035
|
};
|
|
1025
|
-
if (
|
|
1026
|
-
const modifiedEvent =
|
|
1036
|
+
if (self2.config?.beforeSend) {
|
|
1037
|
+
const modifiedEvent = self2.config.beforeSend(responseEvent);
|
|
1027
1038
|
if (!modifiedEvent) {
|
|
1028
1039
|
return;
|
|
1029
1040
|
}
|
|
@@ -1035,7 +1046,7 @@ var XHRInterceptor = class {
|
|
|
1035
1046
|
}
|
|
1036
1047
|
responseEvent = modifiedEvent;
|
|
1037
1048
|
}
|
|
1038
|
-
|
|
1049
|
+
self2.sendMessage(responseEvent);
|
|
1039
1050
|
cleanup.call(this);
|
|
1040
1051
|
};
|
|
1041
1052
|
const sendError = (errorMessage, phase = "ERROR" /* ERROR */) => {
|
|
@@ -1043,19 +1054,19 @@ var XHRInterceptor = class {
|
|
|
1043
1054
|
responseSent = true;
|
|
1044
1055
|
let errorEvent = {
|
|
1045
1056
|
id: data.id,
|
|
1046
|
-
sessionId:
|
|
1057
|
+
sessionId: self2.getSessionId(),
|
|
1047
1058
|
timestamp: Date.now(),
|
|
1048
1059
|
phase,
|
|
1049
1060
|
networkType: "xhr" /* XHR */,
|
|
1050
1061
|
errorMessage
|
|
1051
1062
|
};
|
|
1052
|
-
if (
|
|
1053
|
-
const modifiedEvent =
|
|
1063
|
+
if (self2.config?.beforeSend) {
|
|
1064
|
+
const modifiedEvent = self2.config.beforeSend(errorEvent);
|
|
1054
1065
|
if (modifiedEvent && modifiedEvent.phase === "ERROR" /* ERROR */) {
|
|
1055
1066
|
errorEvent = modifiedEvent;
|
|
1056
1067
|
}
|
|
1057
1068
|
}
|
|
1058
|
-
|
|
1069
|
+
self2.sendMessage(errorEvent);
|
|
1059
1070
|
cleanup.call(this);
|
|
1060
1071
|
};
|
|
1061
1072
|
const readyStateChangeHandler = function() {
|
|
@@ -1094,7 +1105,7 @@ var XHRInterceptor = class {
|
|
|
1094
1105
|
data.listeners.set("timeout", timeoutHandler);
|
|
1095
1106
|
data.listeners.set("loadend", loadEndHandler);
|
|
1096
1107
|
}
|
|
1097
|
-
return
|
|
1108
|
+
return self2.originalXHRSend.apply(this, arguments);
|
|
1098
1109
|
};
|
|
1099
1110
|
}
|
|
1100
1111
|
/**
|