Skip to content

Commit 4e543ce

Browse files
authored
Merge pull request #78 from MrMineO5/master
Handle NodeJS stacktraces
2 parents 439a96d + 82a5966 commit 4e543ce

File tree

5 files changed

+46
-0
lines changed

5 files changed

+46
-0
lines changed

src/commonMain/kotlin/spp.protocol/artifact/exception/LiveStackTrace.kt

Lines changed: 21 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -77,15 +77,36 @@ class LiveStackTrace(
7777
private val pythonFrameRegex = Regex(
7878
" {2}File \"(.+)\", line ([0-9]+), in (.+)\\n {4}(.+)"
7979
)
80+
private val nodeFrameRegex = Regex(
81+
"at (.+) \\((.+):([0-9]+):([0-9]+)\\)"
82+
)
8083

8184
fun fromString(data: String): LiveStackTrace? {
8285
return when {
86+
nodeFrameRegex.containsMatchIn(data) -> extractNodeStackTrace(data)
8387
frameRegex.containsMatchIn(data) -> extractJvmStackTrace(data)
8488
pythonFrameRegex.containsMatchIn(data) -> extractPythonStackTrace(data)
8589
else -> null
8690
}
8791
}
8892

93+
private fun extractNodeStackTrace(data: String): LiveStackTrace {
94+
val elements = mutableListOf<LiveStackTraceElement>()
95+
for (el in nodeFrameRegex.findAll(data)) {
96+
val method = el.groupValues[1]
97+
98+
val file = el.groupValues[2]
99+
val line = el.groupValues[3].toInt()
100+
val column = el.groupValues[4].toInt()
101+
102+
elements.add(LiveStackTraceElement(method, "$file:$line", column))
103+
}
104+
val firstLine = data.split("\n").first()
105+
val exceptionType = firstLine.split(":").firstOrNull() ?: "n/a"
106+
val message = firstLine.split(": ").drop(1).firstOrNull() ?: "n/a"
107+
return LiveStackTrace(exceptionType, message, elements)
108+
}
109+
89110
private fun extractPythonStackTrace(data: String): LiveStackTrace {
90111
val elements = mutableListOf<LiveStackTraceElement>()
91112
for (el in pythonFrameRegex.findAll(data).toList().reversed()) {

src/commonMain/kotlin/spp.protocol/artifact/exception/LiveStackTraceElement.kt

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -30,6 +30,7 @@ import spp.protocol.instrument.variable.LiveVariable
3030
data class LiveStackTraceElement(
3131
val method: String,
3232
val source: String,
33+
val column: Int? = null,
3334
val variables: MutableList<LiveVariable> = mutableListOf(),
3435
var sourceCode: String? = null
3536
) {

src/jvmTest/kotlin/spp/protocol/artifact/trace/LiveStackTraceTest.kt

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -43,4 +43,16 @@ class LiveStackTraceTest {
4343
assertEquals(23, stackTrace!!.elements.size)
4444
assertEquals(16, stackTrace.getElements(true).size)
4545
}
46+
47+
@Test
48+
fun parseNodeJsStackTrace() {
49+
val stackTrace = LiveStackTrace.fromString(
50+
Resources.toString(Resources.getResource("nodejsStackTrace.txt"), Charsets.UTF_8)
51+
)
52+
assertNotNull(stackTrace)
53+
assertEquals(stackTrace!!.exceptionType, "Error")
54+
assertEquals(stackTrace.message, "Something unexpected has occurred.")
55+
assertEquals(8, stackTrace.elements.size)
56+
assertEquals(8, stackTrace.getElements(true).size)
57+
}
4658
}

src/jvmTest/kotlin/spp/protocol/marshall/ProtocolMarshallerTest.kt

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -134,6 +134,7 @@ class ProtocolMarshallerTest {
134134
LiveStackTraceElement(
135135
"method",
136136
"source",
137+
null,
137138
mutableListOf(
138139
LiveVariable(
139140
"name",
@@ -155,6 +156,7 @@ class ProtocolMarshallerTest {
155156
LiveStackTraceElement(
156157
"method",
157158
"source",
159+
null,
158160
mutableListOf(
159161
LiveVariable(
160162
"name",
Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,10 @@
1+
Error: Something unexpected has occurred.
2+
at main (c:\Users\Me\Documents\MyApp\app.js:9:15)
3+
at Object. (c:\Users\Me\Documents\MyApp\app.js:17:1)
4+
at Module._compile (module.js:460:26)
5+
at Object.Module._extensions..js (module.js:478:10)
6+
at Module.load (module.js:355:32)
7+
at Function.Module._load (module.js:310:12)
8+
at Function.Module.runMain (module.js:501:10)
9+
at startup (node.js:129:16)
10+
at node.js:814:3

0 commit comments

Comments
 (0)