Compare commits

..

2 Commits

Author SHA1 Message Date
weidingjian 085f4fa5fa feat: 公共方法增加错误降级不冒泡错误 2026-06-25 23:11:10 +08:00
weidingjian c55bbde5a8 feat: 公共方法增加错误降级不冒泡错误 2026-06-25 23:10:56 +08:00
40 changed files with 2180 additions and 1226 deletions

File diff suppressed because one or more lines are too long

View File

@ -23,30 +23,30 @@
<div class='clearfix'> <div class='clearfix'>
<div class='fl pad1y space-right2'> <div class='fl pad1y space-right2'>
<span class="strong">49.43% </span> <span class="strong">51.53% </span>
<span class="quiet">Statements</span> <span class="quiet">Statements</span>
<span class='fraction'>2635/5330</span> <span class='fraction'>2834/5499</span>
</div> </div>
<div class='fl pad1y space-right2'> <div class='fl pad1y space-right2'>
<span class="strong">87.24% </span> <span class="strong">85.41% </span>
<span class="quiet">Branches</span> <span class="quiet">Branches</span>
<span class='fraction'>513/588</span> <span class='fraction'>568/665</span>
</div> </div>
<div class='fl pad1y space-right2'> <div class='fl pad1y space-right2'>
<span class="strong">41.97% </span> <span class="strong">51.19% </span>
<span class="quiet">Functions</span> <span class="quiet">Functions</span>
<span class='fraction'>123/293</span> <span class='fraction'>150/293</span>
</div> </div>
<div class='fl pad1y space-right2'> <div class='fl pad1y space-right2'>
<span class="strong">49.43% </span> <span class="strong">51.53% </span>
<span class="quiet">Lines</span> <span class="quiet">Lines</span>
<span class='fraction'>2635/5330</span> <span class='fraction'>2834/5499</span>
</div> </div>
@ -61,7 +61,7 @@
</div> </div>
</template> </template>
</div> </div>
<div class='status-line low'></div> <div class='status-line medium'></div>
<div class="pad1"> <div class="pad1">
<table class="coverage-summary"> <table class="coverage-summary">
<thead> <thead>
@ -79,33 +79,33 @@
</tr> </tr>
</thead> </thead>
<tbody><tr> <tbody><tr>
<td class="file medium" data-value="src"><a href="src/index.html">src</a></td> <td class="file low" data-value="src"><a href="src/index.html">src</a></td>
<td data-value="50.39" class="pic medium"> <td data-value="37.57" class="pic low">
<div class="chart"><div class="cover-fill" style="width: 50%"></div><div class="cover-empty" style="width: 50%"></div></div> <div class="chart"><div class="cover-fill" style="width: 37%"></div><div class="cover-empty" style="width: 63%"></div></div>
</td> </td>
<td data-value="50.39" class="pct medium">50.39%</td> <td data-value="37.57" class="pct low">37.57%</td>
<td data-value="252" class="abs medium">127/252</td> <td data-value="338" class="abs low">127/338</td>
<td data-value="100" class="pct high">100%</td> <td data-value="100" class="pct high">100%</td>
<td data-value="0" class="abs high">0/0</td> <td data-value="0" class="abs high">0/0</td>
<td data-value="0" class="pct low">0%</td> <td data-value="0" class="pct low">0%</td>
<td data-value="21" class="abs low">0/21</td> <td data-value="21" class="abs low">0/21</td>
<td data-value="50.39" class="pct medium">50.39%</td> <td data-value="37.57" class="pct low">37.57%</td>
<td data-value="252" class="abs medium">127/252</td> <td data-value="338" class="abs low">127/338</td>
</tr> </tr>
<tr> <tr>
<td class="file medium" data-value="src/core"><a href="src/core/index.html">src/core</a></td> <td class="file medium" data-value="src/core"><a href="src/core/index.html">src/core</a></td>
<td data-value="60.64" class="pic medium"> <td data-value="69.23" class="pic medium">
<div class="chart"><div class="cover-fill" style="width: 60%"></div><div class="cover-empty" style="width: 40%"></div></div> <div class="chart"><div class="cover-fill" style="width: 69%"></div><div class="cover-empty" style="width: 31%"></div></div>
</td> </td>
<td data-value="60.64" class="pct medium">60.64%</td> <td data-value="69.23" class="pct medium">69.23%</td>
<td data-value="1606" class="abs medium">974/1606</td> <td data-value="1690" class="abs medium">1170/1690</td>
<td data-value="85.78" class="pct high">85.78%</td> <td data-value="80.43" class="pct high">80.43%</td>
<td data-value="197" class="abs high">169/197</td> <td data-value="276" class="abs high">222/276</td>
<td data-value="52" class="pct medium">52%</td> <td data-value="79" class="pct medium">79%</td>
<td data-value="100" class="abs medium">52/100</td> <td data-value="100" class="abs medium">79/100</td>
<td data-value="60.64" class="pct medium">60.64%</td> <td data-value="69.23" class="pct medium">69.23%</td>
<td data-value="1606" class="abs medium">974/1606</td> <td data-value="1690" class="abs medium">1170/1690</td>
</tr> </tr>
<tr> <tr>
@ -125,17 +125,17 @@
<tr> <tr>
<td class="file high" data-value="src/utils"><a href="src/utils/index.html">src/utils</a></td> <td class="file high" data-value="src/utils"><a href="src/utils/index.html">src/utils</a></td>
<td data-value="97.36" class="pic high"> <td data-value="97.71" class="pic high">
<div class="chart"><div class="cover-fill" style="width: 97%"></div><div class="cover-empty" style="width: 3%"></div></div> <div class="chart"><div class="cover-fill" style="width: 97%"></div><div class="cover-empty" style="width: 3%"></div></div>
</td> </td>
<td data-value="97.36" class="pct high">97.36%</td> <td data-value="97.71" class="pct high">97.71%</td>
<td data-value="1138" class="abs high">1108/1138</td> <td data-value="1137" class="abs high">1111/1137</td>
<td data-value="87.87" class="pct high">87.87%</td> <td data-value="88.91" class="pct high">88.91%</td>
<td data-value="363" class="abs high">319/363</td> <td data-value="361" class="abs high">321/361</td>
<td data-value="96.92" class="pct high">96.92%</td> <td data-value="96.92" class="pct high">96.92%</td>
<td data-value="65" class="abs high">63/65</td> <td data-value="65" class="abs high">63/65</td>
<td data-value="97.36" class="pct high">97.36%</td> <td data-value="97.71" class="pct high">97.71%</td>
<td data-value="1138" class="abs high">1108/1138</td> <td data-value="1137" class="abs high">1111/1137</td>
</tr> </tr>
</tbody> </tbody>
@ -146,7 +146,7 @@
<div class='footer quiet pad2 space-top1 center small'> <div class='footer quiet pad2 space-top1 center small'>
Code coverage generated by Code coverage generated by
<a href="https://istanbul.js.org/" target="_blank" rel="noopener noreferrer">istanbul</a> <a href="https://istanbul.js.org/" target="_blank" rel="noopener noreferrer">istanbul</a>
at 2026-06-25T14:49:54.914Z at 2026-06-25T15:09:05.618Z
</div> </div>
<script src="prettify.js"></script> <script src="prettify.js"></script>
<script> <script>

File diff suppressed because it is too large Load Diff

View File

@ -30,9 +30,9 @@
<div class='fl pad1y space-right2'> <div class='fl pad1y space-right2'>
<span class="strong">81.81% </span> <span class="strong">83.63% </span>
<span class="quiet">Branches</span> <span class="quiet">Branches</span>
<span class='fraction'>45/55</span> <span class='fraction'>46/55</span>
</div> </div>
@ -337,50 +337,50 @@
<span class="cline-any cline-yes">1x</span> <span class="cline-any cline-yes">1x</span>
<span class="cline-any cline-yes">1x</span> <span class="cline-any cline-yes">1x</span>
<span class="cline-any cline-yes">1x</span> <span class="cline-any cline-yes">1x</span>
<span class="cline-any cline-yes">40x</span> <span class="cline-any cline-yes">72x</span>
<span class="cline-any cline-yes">40x</span> <span class="cline-any cline-yes">72x</span>
<span class="cline-any cline-yes">1x</span> <span class="cline-any cline-yes">1x</span>
<span class="cline-any cline-yes">1x</span> <span class="cline-any cline-yes">1x</span>
<span class="cline-any cline-yes">1x</span> <span class="cline-any cline-yes">1x</span>
<span class="cline-any cline-yes">1x</span> <span class="cline-any cline-yes">1x</span>
<span class="cline-any cline-yes">1x</span> <span class="cline-any cline-yes">1x</span>
<span class="cline-any cline-yes">1x</span> <span class="cline-any cline-yes">1x</span>
<span class="cline-any cline-yes">10x</span> <span class="cline-any cline-yes">172x</span>
<span class="cline-any cline-yes">10x</span> <span class="cline-any cline-yes">172x</span>
<span class="cline-any cline-yes">1x</span>
<span class="cline-any cline-yes">1x</span>
<span class="cline-any cline-yes">6x</span>
<span class="cline-any cline-yes">6x</span>
<span class="cline-any cline-yes">1x</span>
<span class="cline-any cline-yes">1x</span>
<span class="cline-any cline-yes">1x</span>
<span class="cline-any cline-yes">1x</span>
<span class="cline-any cline-yes">1x</span>
<span class="cline-any cline-yes">1x</span>
<span class="cline-any cline-yes">5x</span>
<span class="cline-any cline-yes">5x</span>
<span class="cline-any cline-yes">1x</span>
<span class="cline-any cline-yes">1x</span>
<span class="cline-any cline-yes">3x</span>
<span class="cline-any cline-yes">3x</span>
<span class="cline-any cline-yes">1x</span> <span class="cline-any cline-yes">1x</span>
<span class="cline-any cline-yes">1x</span> <span class="cline-any cline-yes">1x</span>
<span class="cline-any cline-yes">4x</span> <span class="cline-any cline-yes">4x</span>
<span class="cline-any cline-yes">4x</span> <span class="cline-any cline-yes">4x</span>
<span class="cline-any cline-yes">1x</span>
<span class="cline-any cline-yes">1x</span>
<span class="cline-any cline-yes">1x</span>
<span class="cline-any cline-yes">1x</span>
<span class="cline-any cline-yes">1x</span>
<span class="cline-any cline-yes">1x</span>
<span class="cline-any cline-yes">3x</span>
<span class="cline-any cline-yes">3x</span>
<span class="cline-any cline-yes">1x</span>
<span class="cline-any cline-yes">1x</span>
<span class="cline-any cline-yes">2x</span>
<span class="cline-any cline-yes">2x</span>
<span class="cline-any cline-yes">1x</span>
<span class="cline-any cline-yes">1x</span>
<span class="cline-any cline-yes">3x</span>
<span class="cline-any cline-yes">3x</span>
<span class="cline-any cline-yes">3x</span>
<span class="cline-any cline-yes">3x</span>
<span class="cline-any cline-yes">3x</span>
<span class="cline-any cline-yes">1x</span>
<span class="cline-any cline-yes">1x</span>
<span class="cline-any cline-yes">2x</span>
<span class="cline-any cline-yes">2x</span>
<span class="cline-any cline-yes">2x</span>
<span class="cline-any cline-yes">2x</span>
<span class="cline-any cline-yes">2x</span>
<span class="cline-any cline-yes">1x</span>
<span class="cline-any cline-yes">1x</span>
<span class="cline-any cline-yes">4x</span> <span class="cline-any cline-yes">4x</span>
<span class="cline-any cline-yes">4x</span> <span class="cline-any cline-yes">4x</span>
<span class="cline-any cline-yes">4x</span>
<span class="cline-any cline-yes">1x</span>
<span class="cline-any cline-yes">1x</span>
<span class="cline-any cline-yes">3x</span>
<span class="cline-any cline-yes">3x</span>
<span class="cline-any cline-yes">3x</span>
<span class="cline-any cline-yes">3x</span>
<span class="cline-any cline-yes">3x</span>
<span class="cline-any cline-yes">1x</span>
<span class="cline-any cline-yes">1x</span>
<span class="cline-any cline-yes">7x</span>
<span class="cline-any cline-yes">7x</span>
<span class="cline-any cline-yes">1x</span> <span class="cline-any cline-yes">1x</span>
<span class="cline-any cline-yes">1x</span> <span class="cline-any cline-yes">1x</span>
<span class="cline-any cline-yes">2x</span> <span class="cline-any cline-yes">2x</span>
@ -623,7 +623,7 @@ export class ConfigManager {
} }
&nbsp; &nbsp;
isIgnoredError(message: string): boolean { isIgnoredError(message: string): boolean {
return matchPatterns(message, this.config.<span class="branch-0 cbranch-no" title="branch not covered" >ignoreErrors || [])</span>; return matchPatterns(message, this.config.ignoreErrors || []);
} }
&nbsp; &nbsp;
shouldSample(): boolean { shouldSample(): boolean {
@ -802,7 +802,7 @@ export class ConfigManager {
<div class='footer quiet pad2 space-top1 center small'> <div class='footer quiet pad2 space-top1 center small'>
Code coverage generated by Code coverage generated by
<a href="https://istanbul.js.org/" target="_blank" rel="noopener noreferrer">istanbul</a> <a href="https://istanbul.js.org/" target="_blank" rel="noopener noreferrer">istanbul</a>
at 2026-06-25T14:49:54.914Z at 2026-06-25T15:09:05.618Z
</div> </div>
<script src="../../prettify.js"></script> <script src="../../prettify.js"></script>
<script> <script>

View File

@ -113,49 +113,49 @@
<a name='L48'></a><a href='#L48'>48</a></td><td class="line-coverage quiet"><span class="cline-any cline-yes">1x</span> <a name='L48'></a><a href='#L48'>48</a></td><td class="line-coverage quiet"><span class="cline-any cline-yes">1x</span>
<span class="cline-any cline-yes">1x</span> <span class="cline-any cline-yes">1x</span>
<span class="cline-any cline-yes">1x</span> <span class="cline-any cline-yes">1x</span>
<span class="cline-any cline-yes">42x</span> <span class="cline-any cline-yes">74x</span>
<span class="cline-any cline-yes">1x</span> <span class="cline-any cline-yes">1x</span>
<span class="cline-any cline-yes">1x</span> <span class="cline-any cline-yes">1x</span>
<span class="cline-any cline-yes">21x</span> <span class="cline-any cline-yes">24x</span>
<span class="cline-any cline-yes">18x</span>
<span class="cline-any cline-yes">18x</span>
<span class="cline-any cline-yes">24x</span>
<span class="cline-any cline-yes">24x</span>
<span class="cline-any cline-yes">1x</span>
<span class="cline-any cline-yes">1x</span>
<span class="cline-any cline-yes">10x</span>
<span class="cline-any cline-yes">10x</span>
<span class="cline-any cline-yes">9x</span>
<span class="cline-any cline-yes">9x</span>
<span class="cline-any cline-yes">8x</span>
<span class="cline-any cline-yes">8x</span>
<span class="cline-any cline-yes">9x</span>
<span class="cline-any cline-yes">10x</span>
<span class="cline-any cline-yes">1x</span>
<span class="cline-any cline-yes">1x</span>
<span class="cline-any cline-yes">95x</span>
<span class="cline-any cline-yes">95x</span>
<span class="cline-any cline-yes">16x</span> <span class="cline-any cline-yes">16x</span>
<span class="cline-any cline-yes">16x</span> <span class="cline-any cline-yes">18x</span>
<span class="cline-any cline-yes">21x</span> <span class="cline-any cline-yes">18x</span>
<span class="cline-any cline-yes">21x</span> <span class="cline-any cline-yes">18x</span>
<span class="cline-any cline-yes">1x</span>
<span class="cline-any cline-yes">1x</span>
<span class="cline-any cline-yes">9x</span>
<span class="cline-any cline-yes">9x</span>
<span class="cline-any cline-yes">8x</span>
<span class="cline-any cline-yes">8x</span>
<span class="cline-any cline-yes">7x</span>
<span class="cline-any cline-yes">7x</span>
<span class="cline-any cline-yes">8x</span>
<span class="cline-any cline-yes">9x</span>
<span class="cline-any cline-yes">1x</span>
<span class="cline-any cline-yes">1x</span>
<span class="cline-any cline-yes">88x</span>
<span class="cline-any cline-yes">88x</span>
<span class="cline-any cline-yes">14x</span>
<span class="cline-any cline-yes">15x</span>
<span class="cline-any cline-yes">15x</span>
<span class="cline-any cline-yes">15x</span>
<span class="cline-any cline-yes">2x</span>
<span class="cline-any cline-yes">2x</span>
<span class="cline-any cline-yes">15x</span>
<span class="cline-any cline-yes">14x</span>
<span class="cline-any cline-yes">88x</span>
<span class="cline-any cline-yes">1x</span>
<span class="cline-any cline-yes">1x</span>
<span class="cline-any cline-yes">5x</span>
<span class="cline-any cline-yes">4x</span>
<span class="cline-any cline-yes">4x</span>
<span class="cline-any cline-yes">4x</span>
<span class="cline-any cline-yes">5x</span>
<span class="cline-any cline-yes">5x</span>
<span class="cline-any cline-yes">1x</span>
<span class="cline-any cline-yes">1x</span>
<span class="cline-any cline-yes">3x</span> <span class="cline-any cline-yes">3x</span>
<span class="cline-any cline-yes">3x</span> <span class="cline-any cline-yes">3x</span>
<span class="cline-any cline-yes">18x</span>
<span class="cline-any cline-yes">16x</span>
<span class="cline-any cline-yes">95x</span>
<span class="cline-any cline-yes">1x</span>
<span class="cline-any cline-yes">1x</span>
<span class="cline-any cline-yes">5x</span>
<span class="cline-any cline-yes">4x</span>
<span class="cline-any cline-yes">4x</span>
<span class="cline-any cline-yes">4x</span>
<span class="cline-any cline-yes">5x</span>
<span class="cline-any cline-yes">5x</span>
<span class="cline-any cline-yes">1x</span>
<span class="cline-any cline-yes">1x</span>
<span class="cline-any cline-yes">36x</span>
<span class="cline-any cline-yes">36x</span>
<span class="cline-any cline-yes">1x</span> <span class="cline-any cline-yes">1x</span>
<span class="cline-any cline-neutral">&nbsp;</span></td><td class="text"><pre class="prettyprint lang-js">type Handler = (...args: unknown[]) =&gt; void; <span class="cline-any cline-neutral">&nbsp;</span></td><td class="text"><pre class="prettyprint lang-js">type Handler = (...args: unknown[]) =&gt; void;
&nbsp; &nbsp;
@ -211,7 +211,7 @@ export class EventBus {
<div class='footer quiet pad2 space-top1 center small'> <div class='footer quiet pad2 space-top1 center small'>
Code coverage generated by Code coverage generated by
<a href="https://istanbul.js.org/" target="_blank" rel="noopener noreferrer">istanbul</a> <a href="https://istanbul.js.org/" target="_blank" rel="noopener noreferrer">istanbul</a>
at 2026-06-25T14:49:54.914Z at 2026-06-25T15:09:05.618Z
</div> </div>
<script src="../../prettify.js"></script> <script src="../../prettify.js"></script>
<script> <script>

View File

@ -23,16 +23,16 @@
<div class='clearfix'> <div class='clearfix'>
<div class='fl pad1y space-right2'> <div class='fl pad1y space-right2'>
<span class="strong">89.9% </span> <span class="strong">90.53% </span>
<span class="quiet">Statements</span> <span class="quiet">Statements</span>
<span class='fraction'>285/317</span> <span class='fraction'>287/317</span>
</div> </div>
<div class='fl pad1y space-right2'> <div class='fl pad1y space-right2'>
<span class="strong">83.82% </span> <span class="strong">86.11% </span>
<span class="quiet">Branches</span> <span class="quiet">Branches</span>
<span class='fraction'>57/68</span> <span class='fraction'>62/72</span>
</div> </div>
@ -44,9 +44,9 @@
<div class='fl pad1y space-right2'> <div class='fl pad1y space-right2'>
<span class="strong">89.9% </span> <span class="strong">90.53% </span>
<span class="quiet">Lines</span> <span class="quiet">Lines</span>
<span class='fraction'>285/317</span> <span class='fraction'>287/317</span>
</div> </div>
@ -412,122 +412,122 @@
<span class="cline-any cline-yes">1x</span> <span class="cline-any cline-yes">1x</span>
<span class="cline-any cline-yes">1x</span> <span class="cline-any cline-yes">1x</span>
<span class="cline-any cline-yes">1x</span> <span class="cline-any cline-yes">1x</span>
<span class="cline-any cline-yes">27x</span> <span class="cline-any cline-yes">59x</span>
<span class="cline-any cline-yes">27x</span> <span class="cline-any cline-yes">59x</span>
<span class="cline-any cline-yes">27x</span> <span class="cline-any cline-yes">59x</span>
<span class="cline-any cline-yes">27x</span> <span class="cline-any cline-yes">59x</span>
<span class="cline-any cline-yes">27x</span> <span class="cline-any cline-yes">59x</span>
<span class="cline-any cline-yes">27x</span> <span class="cline-any cline-yes">59x</span>
<span class="cline-any cline-yes">27x</span> <span class="cline-any cline-yes">59x</span>
<span class="cline-any cline-yes">27x</span> <span class="cline-any cline-yes">59x</span>
<span class="cline-any cline-yes">27x</span> <span class="cline-any cline-yes">59x</span>
<span class="cline-any cline-yes">27x</span> <span class="cline-any cline-yes">59x</span>
<span class="cline-any cline-yes">27x</span> <span class="cline-any cline-yes">59x</span>
<span class="cline-any cline-yes">27x</span> <span class="cline-any cline-yes">59x</span>
<span class="cline-any cline-yes">1x</span> <span class="cline-any cline-yes">1x</span>
<span class="cline-any cline-yes">1x</span> <span class="cline-any cline-yes">1x</span>
<span class="cline-any cline-yes">2x</span> <span class="cline-any cline-yes">3x</span>
<span class="cline-any cline-yes">2x</span> <span class="cline-any cline-yes">3x</span>
<span class="cline-any cline-yes">2x</span> <span class="cline-any cline-yes">3x</span>
<span class="cline-any cline-yes">1x</span> <span class="cline-any cline-yes">1x</span>
<span class="cline-any cline-yes">1x</span> <span class="cline-any cline-yes">1x</span>
<span class="cline-any cline-yes">2x</span> <span class="cline-any cline-yes">3x</span>
<span class="cline-any cline-yes">2x</span> <span class="cline-any cline-yes">3x</span>
<span class="cline-any cline-yes">4x</span> <span class="cline-any cline-yes">4x</span>
<span class="cline-any cline-yes">1x</span> <span class="cline-any cline-yes">1x</span>
<span class="cline-any cline-yes">1x</span> <span class="cline-any cline-yes">1x</span>
<span class="cline-any cline-yes">2x</span>
<span class="cline-any cline-yes">2x</span>
<span class="cline-any cline-yes">1x</span>
<span class="cline-any cline-yes">1x</span>
<span class="cline-any cline-yes">2x</span>
<span class="cline-any cline-no">&nbsp;</span>
<span class="cline-any cline-no">&nbsp;</span>
<span class="cline-any cline-no">&nbsp;</span>
<span class="cline-any cline-no">&nbsp;</span>
<span class="cline-any cline-yes">2x</span>
<span class="cline-any cline-yes">2x</span>
<span class="cline-any cline-yes">2x</span>
<span class="cline-any cline-yes">2x</span>
<span class="cline-any cline-yes">2x</span>
<span class="cline-any cline-no">&nbsp;</span>
<span class="cline-any cline-no">&nbsp;</span>
<span class="cline-any cline-no">&nbsp;</span>
<span class="cline-any cline-no">&nbsp;</span>
<span class="cline-any cline-yes">2x</span>
<span class="cline-any cline-no">&nbsp;</span>
<span class="cline-any cline-no">&nbsp;</span>
<span class="cline-any cline-no">&nbsp;</span>
<span class="cline-any cline-no">&nbsp;</span>
<span class="cline-any cline-yes">2x</span>
<span class="cline-any cline-yes">2x</span>
<span class="cline-any cline-yes">2x</span>
<span class="cline-any cline-yes">2x</span>
<span class="cline-any cline-yes">2x</span>
<span class="cline-any cline-yes">1x</span>
<span class="cline-any cline-yes">1x</span>
<span class="cline-any cline-yes">80x</span>
<span class="cline-any cline-yes">80x</span>
<span class="cline-any cline-yes">80x</span>
<span class="cline-any cline-yes">80x</span>
<span class="cline-any cline-yes">26x</span>
<span class="cline-any cline-yes">26x</span>
<span class="cline-any cline-yes">80x</span>
<span class="cline-any cline-yes">80x</span>
<span class="cline-any cline-yes">80x</span>
<span class="cline-any cline-yes">80x</span>
<span class="cline-any cline-yes">80x</span>
<span class="cline-any cline-no">&nbsp;</span>
<span class="cline-any cline-no">&nbsp;</span>
<span class="cline-any cline-yes">80x</span>
<span class="cline-any cline-yes">80x</span>
<span class="cline-any cline-no">&nbsp;</span>
<span class="cline-any cline-no">&nbsp;</span>
<span class="cline-any cline-no">&nbsp;</span>
<span class="cline-any cline-yes">80x</span>
<span class="cline-any cline-yes">80x</span>
<span class="cline-any cline-yes">3x</span> <span class="cline-any cline-yes">3x</span>
<span class="cline-any cline-yes">3x</span> <span class="cline-any cline-yes">3x</span>
<span class="cline-any cline-yes">3x</span>
<span class="cline-any cline-yes">3x</span>
<span class="cline-any cline-yes">3x</span>
<span class="cline-any cline-yes">3x</span>
<span class="cline-any cline-no">&nbsp;</span>
<span class="cline-any cline-no">&nbsp;</span>
<span class="cline-any cline-yes">3x</span>
<span class="cline-any cline-yes">1x</span>
<span class="cline-any cline-yes">1x</span> <span class="cline-any cline-yes">1x</span>
<span class="cline-any cline-yes">1x</span> <span class="cline-any cline-yes">1x</span>
<span class="cline-any cline-yes">3x</span> <span class="cline-any cline-yes">3x</span>
<span class="cline-any cline-no">&nbsp;</span>
<span class="cline-any cline-no">&nbsp;</span>
<span class="cline-any cline-no">&nbsp;</span>
<span class="cline-any cline-no">&nbsp;</span>
<span class="cline-any cline-yes">3x</span>
<span class="cline-any cline-yes">3x</span>
<span class="cline-any cline-yes">3x</span>
<span class="cline-any cline-yes">3x</span>
<span class="cline-any cline-yes">3x</span>
<span class="cline-any cline-no">&nbsp;</span>
<span class="cline-any cline-no">&nbsp;</span>
<span class="cline-any cline-no">&nbsp;</span>
<span class="cline-any cline-no">&nbsp;</span>
<span class="cline-any cline-yes">3x</span>
<span class="cline-any cline-no">&nbsp;</span>
<span class="cline-any cline-no">&nbsp;</span>
<span class="cline-any cline-no">&nbsp;</span>
<span class="cline-any cline-no">&nbsp;</span>
<span class="cline-any cline-yes">3x</span>
<span class="cline-any cline-yes">3x</span>
<span class="cline-any cline-yes">3x</span> <span class="cline-any cline-yes">3x</span>
<span class="cline-any cline-yes">3x</span> <span class="cline-any cline-yes">3x</span>
<span class="cline-any cline-yes">3x</span> <span class="cline-any cline-yes">3x</span>
<span class="cline-any cline-yes">77x</span>
<span class="cline-any cline-yes">77x</span>
<span class="cline-any cline-yes">80x</span>
<span class="cline-any cline-yes">1x</span>
<span class="cline-any cline-yes">1x</span>
<span class="cline-any cline-yes">83x</span>
<span class="cline-any cline-yes">83x</span>
<span class="cline-any cline-yes">83x</span>
<span class="cline-any cline-yes">1x</span>
<span class="cline-any cline-yes">1x</span> <span class="cline-any cline-yes">1x</span>
<span class="cline-any cline-yes">1x</span> <span class="cline-any cline-yes">1x</span>
<span class="cline-any cline-yes">82x</span> <span class="cline-any cline-yes">82x</span>
<span class="cline-any cline-yes">82x</span> <span class="cline-any cline-yes">82x</span>
<span class="cline-any cline-yes">82x</span> <span class="cline-any cline-yes">82x</span>
<span class="cline-any cline-yes">82x</span> <span class="cline-any cline-yes">82x</span>
<span class="cline-any cline-yes">28x</span>
<span class="cline-any cline-yes">28x</span>
<span class="cline-any cline-yes">82x</span>
<span class="cline-any cline-yes">82x</span>
<span class="cline-any cline-yes">82x</span>
<span class="cline-any cline-yes">82x</span>
<span class="cline-any cline-yes">82x</span>
<span class="cline-any cline-no">&nbsp;</span>
<span class="cline-any cline-no">&nbsp;</span>
<span class="cline-any cline-yes">82x</span>
<span class="cline-any cline-yes">82x</span>
<span class="cline-any cline-no">&nbsp;</span>
<span class="cline-any cline-no">&nbsp;</span>
<span class="cline-any cline-no">&nbsp;</span>
<span class="cline-any cline-yes">82x</span>
<span class="cline-any cline-yes">82x</span> <span class="cline-any cline-yes">82x</span>
<span class="cline-any cline-yes">83x</span>
<span class="cline-any cline-yes">80x</span>
<span class="cline-any cline-yes">3x</span> <span class="cline-any cline-yes">3x</span>
<span class="cline-any cline-yes">3x</span> <span class="cline-any cline-yes">3x</span>
<span class="cline-any cline-yes">3x</span> <span class="cline-any cline-yes">3x</span>
<span class="cline-any cline-yes">77x</span> <span class="cline-any cline-yes">3x</span>
<span class="cline-any cline-yes">77x</span> <span class="cline-any cline-yes">3x</span>
<span class="cline-any cline-yes">77x</span> <span class="cline-any cline-yes">3x</span>
<span class="cline-any cline-yes">77x</span> <span class="cline-any cline-no">&nbsp;</span>
<span class="cline-any cline-yes">80x</span> <span class="cline-any cline-no">&nbsp;</span>
<span class="cline-any cline-yes">3x</span>
<span class="cline-any cline-yes">1x</span>
<span class="cline-any cline-yes">1x</span>
<span class="cline-any cline-yes">1x</span>
<span class="cline-any cline-yes">3x</span>
<span class="cline-any cline-yes">3x</span>
<span class="cline-any cline-yes">3x</span>
<span class="cline-any cline-yes">3x</span>
<span class="cline-any cline-yes">79x</span>
<span class="cline-any cline-yes">79x</span>
<span class="cline-any cline-yes">82x</span>
<span class="cline-any cline-yes">1x</span>
<span class="cline-any cline-yes">1x</span>
<span class="cline-any cline-yes">87x</span>
<span class="cline-any cline-yes">87x</span>
<span class="cline-any cline-yes">87x</span>
<span class="cline-any cline-yes">1x</span>
<span class="cline-any cline-yes">1x</span>
<span class="cline-any cline-yes">1x</span>
<span class="cline-any cline-yes">86x</span>
<span class="cline-any cline-yes">86x</span>
<span class="cline-any cline-yes">86x</span>
<span class="cline-any cline-yes">86x</span>
<span class="cline-any cline-yes">86x</span>
<span class="cline-any cline-yes">87x</span>
<span class="cline-any cline-yes">82x</span>
<span class="cline-any cline-yes">3x</span>
<span class="cline-any cline-yes">3x</span>
<span class="cline-any cline-yes">3x</span>
<span class="cline-any cline-yes">79x</span>
<span class="cline-any cline-yes">79x</span>
<span class="cline-any cline-yes">79x</span>
<span class="cline-any cline-yes">79x</span>
<span class="cline-any cline-yes">82x</span>
<span class="cline-any cline-yes">51x</span> <span class="cline-any cline-yes">51x</span>
<span class="cline-any cline-yes">51x</span> <span class="cline-any cline-yes">51x</span>
<span class="cline-any cline-yes">33x</span> <span class="cline-any cline-yes">33x</span>
@ -548,69 +548,69 @@
<span class="cline-any cline-no">&nbsp;</span> <span class="cline-any cline-no">&nbsp;</span>
<span class="cline-any cline-no">&nbsp;</span> <span class="cline-any cline-no">&nbsp;</span>
<span class="cline-any cline-no">&nbsp;</span> <span class="cline-any cline-no">&nbsp;</span>
<span class="cline-any cline-yes">80x</span> <span class="cline-any cline-yes">82x</span>
<span class="cline-any cline-yes">26x</span> <span class="cline-any cline-yes">28x</span>
<span class="cline-any cline-yes">26x</span> <span class="cline-any cline-yes">28x</span>
<span class="cline-any cline-yes">26x</span> <span class="cline-any cline-yes">28x</span>
<span class="cline-any cline-yes">80x</span> <span class="cline-any cline-yes">82x</span>
<span class="cline-any cline-yes">46x</span> <span class="cline-any cline-yes">50x</span>
<span class="cline-any cline-yes">46x</span> <span class="cline-any cline-yes">50x</span>
<span class="cline-any cline-yes">46x</span> <span class="cline-any cline-yes">50x</span>
<span class="cline-any cline-yes">46x</span> <span class="cline-any cline-yes">50x</span>
<span class="cline-any cline-yes">46x</span> <span class="cline-any cline-yes">50x</span>
<span class="cline-any cline-yes">87x</span>
<span class="cline-any cline-yes">1x</span>
<span class="cline-any cline-yes">1x</span>
<span class="cline-any cline-yes">1x</span>
<span class="cline-any cline-yes">87x</span>
<span class="cline-any cline-yes">1x</span>
<span class="cline-any cline-yes">1x</span>
<span class="cline-any cline-yes">86x</span>
<span class="cline-any cline-yes">6x</span>
<span class="cline-any cline-yes">6x</span>
<span class="cline-any cline-yes">6x</span>
<span class="cline-any cline-yes">6x</span>
<span class="cline-any cline-yes">82x</span>
<span class="cline-any cline-yes">5x</span>
<span class="cline-any cline-yes">1x</span>
<span class="cline-any cline-yes">1x</span>
<span class="cline-any cline-yes">5x</span>
<span class="cline-any cline-yes">86x</span>
<span class="cline-any cline-yes">1x</span>
<span class="cline-any cline-yes">1x</span>
<span class="cline-any cline-yes">11x</span>
<span class="cline-any cline-yes">11x</span>
<span class="cline-any cline-yes">11x</span>
<span class="cline-any cline-yes">3x</span>
<span class="cline-any cline-yes">3x</span>
<span class="cline-any cline-yes">3x</span>
<span class="cline-any cline-yes">3x</span>
<span class="cline-any cline-yes">3x</span>
<span class="cline-any cline-yes">3x</span>
<span class="cline-any cline-yes">3x</span>
<span class="cline-any cline-yes">3x</span>
<span class="cline-any cline-yes">3x</span>
<span class="cline-any cline-yes">3x</span>
<span class="cline-any cline-yes">3x</span>
<span class="cline-any cline-yes">11x</span>
<span class="cline-any cline-yes">11x</span>
<span class="cline-any cline-yes">11x</span>
<span class="cline-any cline-yes">1x</span>
<span class="cline-any cline-yes">1x</span>
<span class="cline-any cline-yes">86x</span>
<span class="cline-any cline-yes">83x</span> <span class="cline-any cline-yes">83x</span>
<span class="cline-any cline-yes">1x</span>
<span class="cline-any cline-yes">1x</span>
<span class="cline-any cline-yes">1x</span>
<span class="cline-any cline-yes">83x</span> <span class="cline-any cline-yes">83x</span>
<span class="cline-any cline-yes">83x</span>
<span class="cline-any cline-yes">3x</span>
<span class="cline-any cline-yes">86x</span>
<span class="cline-any cline-yes">1x</span> <span class="cline-any cline-yes">1x</span>
<span class="cline-any cline-yes">1x</span> <span class="cline-any cline-yes">1x</span>
<span class="cline-any cline-yes">82x</span> <span class="cline-any cline-yes">12x</span>
<span class="cline-any cline-yes">12x</span>
<span class="cline-any cline-yes">12x</span>
<span class="cline-any cline-yes">3x</span> <span class="cline-any cline-yes">3x</span>
<span class="cline-any cline-yes">3x</span> <span class="cline-any cline-yes">3x</span>
<span class="cline-any cline-yes">3x</span> <span class="cline-any cline-yes">3x</span>
<span class="cline-any cline-yes">3x</span>
<span class="cline-any cline-yes">3x</span>
<span class="cline-any cline-yes">3x</span>
<span class="cline-any cline-no">&nbsp;</span>
<span class="cline-any cline-no">&nbsp;</span>
<span class="cline-any cline-yes">3x</span>
<span class="cline-any cline-yes">82x</span>
<span class="cline-any cline-yes">1x</span>
<span class="cline-any cline-yes">1x</span>
<span class="cline-any cline-yes">11x</span>
<span class="cline-any cline-yes">11x</span>
<span class="cline-any cline-yes">11x</span>
<span class="cline-any cline-yes">3x</span>
<span class="cline-any cline-yes">3x</span>
<span class="cline-any cline-yes">3x</span>
<span class="cline-any cline-yes">3x</span>
<span class="cline-any cline-yes">3x</span>
<span class="cline-any cline-yes">3x</span>
<span class="cline-any cline-yes">3x</span>
<span class="cline-any cline-yes">3x</span>
<span class="cline-any cline-yes">3x</span>
<span class="cline-any cline-yes">3x</span>
<span class="cline-any cline-yes">3x</span>
<span class="cline-any cline-yes">11x</span>
<span class="cline-any cline-yes">11x</span>
<span class="cline-any cline-yes">11x</span>
<span class="cline-any cline-yes">1x</span>
<span class="cline-any cline-yes">1x</span>
<span class="cline-any cline-yes">82x</span>
<span class="cline-any cline-yes">80x</span>
<span class="cline-any cline-yes">80x</span>
<span class="cline-any cline-yes">80x</span>
<span class="cline-any cline-yes">2x</span>
<span class="cline-any cline-yes">82x</span>
<span class="cline-any cline-yes">1x</span>
<span class="cline-any cline-yes">1x</span>
<span class="cline-any cline-yes">11x</span>
<span class="cline-any cline-yes">11x</span>
<span class="cline-any cline-yes">11x</span>
<span class="cline-any cline-yes">2x</span>
<span class="cline-any cline-yes">2x</span>
<span class="cline-any cline-yes">2x</span>
<span class="cline-any cline-yes">11x</span> <span class="cline-any cline-yes">11x</span>
<span class="cline-any cline-no">&nbsp;</span> <span class="cline-any cline-no">&nbsp;</span>
<span class="cline-any cline-no">&nbsp;</span> <span class="cline-any cline-no">&nbsp;</span>
@ -639,7 +639,7 @@
<span class="cline-any cline-yes">11x</span> <span class="cline-any cline-yes">11x</span>
<span class="cline-any cline-yes">9x</span> <span class="cline-any cline-yes">9x</span>
<span class="cline-any cline-yes">9x</span> <span class="cline-any cline-yes">9x</span>
<span class="cline-any cline-yes">11x</span> <span class="cline-any cline-yes">12x</span>
<span class="cline-any cline-yes">1x</span> <span class="cline-any cline-yes">1x</span>
<span class="cline-any cline-yes">1x</span> <span class="cline-any cline-yes">1x</span>
<span class="cline-any cline-yes">2x</span> <span class="cline-any cline-yes">2x</span>
@ -672,30 +672,30 @@
<span class="cline-any cline-yes">19x</span> <span class="cline-any cline-yes">19x</span>
<span class="cline-any cline-yes">1x</span> <span class="cline-any cline-yes">1x</span>
<span class="cline-any cline-yes">1x</span> <span class="cline-any cline-yes">1x</span>
<span class="cline-any cline-yes">28x</span> <span class="cline-any cline-yes">61x</span>
<span class="cline-any cline-yes">2x</span>
<span class="cline-any cline-yes">2x</span>
<span class="cline-any cline-yes">2x</span>
<span class="cline-any cline-yes">28x</span>
<span class="cline-any cline-yes">3x</span> <span class="cline-any cline-yes">3x</span>
<span class="cline-any cline-yes">3x</span> <span class="cline-any cline-yes">3x</span>
<span class="cline-any cline-yes">3x</span> <span class="cline-any cline-yes">3x</span>
<span class="cline-any cline-yes">28x</span> <span class="cline-any cline-yes">61x</span>
<span class="cline-any cline-yes">2x</span> <span class="cline-any cline-yes">3x</span>
<span class="cline-any cline-yes">2x</span> <span class="cline-any cline-yes">3x</span>
<span class="cline-any cline-yes">28x</span> <span class="cline-any cline-yes">3x</span>
<span class="cline-any cline-yes">28x</span> <span class="cline-any cline-yes">61x</span>
<span class="cline-any cline-yes">2x</span> <span class="cline-any cline-yes">3x</span>
<span class="cline-any cline-yes">2x</span> <span class="cline-any cline-yes">3x</span>
<span class="cline-any cline-yes">28x</span> <span class="cline-any cline-yes">61x</span>
<span class="cline-any cline-yes">2x</span> <span class="cline-any cline-yes">61x</span>
<span class="cline-any cline-yes">2x</span> <span class="cline-any cline-yes">3x</span>
<span class="cline-any cline-yes">28x</span> <span class="cline-any cline-yes">3x</span>
<span class="cline-any cline-yes">28x</span> <span class="cline-any cline-yes">61x</span>
<span class="cline-any cline-yes">28x</span> <span class="cline-any cline-yes">3x</span>
<span class="cline-any cline-yes">28x</span> <span class="cline-any cline-yes">3x</span>
<span class="cline-any cline-yes">28x</span> <span class="cline-any cline-yes">61x</span>
<span class="cline-any cline-yes">28x</span> <span class="cline-any cline-yes">61x</span>
<span class="cline-any cline-yes">61x</span>
<span class="cline-any cline-yes">61x</span>
<span class="cline-any cline-yes">61x</span>
<span class="cline-any cline-yes">61x</span>
<span class="cline-any cline-yes">1x</span> <span class="cline-any cline-yes">1x</span>
<span class="cline-any cline-neutral">&nbsp;</span></td><td class="text"><pre class="prettyprint lang-js">import type { SentryEvent, ErrorEvent, CountEvent } from '../types'; <span class="cline-any cline-neutral">&nbsp;</span></td><td class="text"><pre class="prettyprint lang-js">import type { SentryEvent, ErrorEvent, CountEvent } from '../types';
import { EventBus } from './EventBus'; import { EventBus } from './EventBus';
@ -888,9 +888,9 @@ export class EventQueue {
const expiryTime = 60000; const expiryTime = 60000;
&nbsp; &nbsp;
for (const [key, entry] of this.dedupeMap) { for (const [key, entry] of this.dedupeMap) {
if (currentTime - entry.lastTime &gt; expiryTime) <span class="branch-0 cbranch-no" title="branch not covered" >{</span> if (currentTime - entry.lastTime &gt; expiryTime) {
<span class="cstat-no" title="statement not covered" > this.dedupeMap.delete(key);</span> this.dedupeMap.delete(key);
<span class="cstat-no" title="statement not covered" > }</span> }
} }
} }
&nbsp; &nbsp;
@ -1021,7 +1021,7 @@ export class EventQueue {
<div class='footer quiet pad2 space-top1 center small'> <div class='footer quiet pad2 space-top1 center small'>
Code coverage generated by Code coverage generated by
<a href="https://istanbul.js.org/" target="_blank" rel="noopener noreferrer">istanbul</a> <a href="https://istanbul.js.org/" target="_blank" rel="noopener noreferrer">istanbul</a>
at 2026-06-25T14:49:54.914Z at 2026-06-25T15:09:05.618Z
</div> </div>
<script src="../../prettify.js"></script> <script src="../../prettify.js"></script>
<script> <script>

View File

@ -157,20 +157,20 @@
<span class="cline-any cline-yes">1x</span> <span class="cline-any cline-yes">1x</span>
<span class="cline-any cline-yes">1x</span> <span class="cline-any cline-yes">1x</span>
<span class="cline-any cline-yes">1x</span> <span class="cline-any cline-yes">1x</span>
<span class="cline-any cline-yes">26x</span> <span class="cline-any cline-yes">58x</span>
<span class="cline-any cline-yes">26x</span> <span class="cline-any cline-yes">58x</span>
<span class="cline-any cline-yes">1x</span> <span class="cline-any cline-yes">1x</span>
<span class="cline-any cline-yes">1x</span> <span class="cline-any cline-yes">1x</span>
<span class="cline-any cline-yes">30x</span> <span class="cline-any cline-yes">32x</span>
<span class="cline-any cline-yes">1x</span> <span class="cline-any cline-yes">1x</span>
<span class="cline-any cline-yes">1x</span> <span class="cline-any cline-yes">1x</span>
<span class="cline-any cline-yes">29x</span> <span class="cline-any cline-yes">31x</span>
<span class="cline-any cline-yes">29x</span> <span class="cline-any cline-yes">31x</span>
<span class="cline-any cline-yes">29x</span> <span class="cline-any cline-yes">31x</span>
<span class="cline-any cline-yes">30x</span> <span class="cline-any cline-yes">32x</span>
<span class="cline-any cline-yes">1x</span> <span class="cline-any cline-yes">2x</span>
<span class="cline-any cline-yes">1x</span> <span class="cline-any cline-yes">2x</span>
<span class="cline-any cline-yes">30x</span> <span class="cline-any cline-yes">32x</span>
<span class="cline-any cline-yes">1x</span> <span class="cline-any cline-yes">1x</span>
<span class="cline-any cline-yes">1x</span> <span class="cline-any cline-yes">1x</span>
<span class="cline-any cline-yes">5x</span> <span class="cline-any cline-yes">5x</span>
@ -225,17 +225,17 @@
<span class="cline-any cline-yes">3x</span> <span class="cline-any cline-yes">3x</span>
<span class="cline-any cline-yes">1x</span> <span class="cline-any cline-yes">1x</span>
<span class="cline-any cline-yes">1x</span> <span class="cline-any cline-yes">1x</span>
<span class="cline-any cline-yes">4x</span> <span class="cline-any cline-yes">37x</span>
<span class="cline-any cline-yes">6x</span> <span class="cline-any cline-yes">8x</span>
<span class="cline-any cline-yes">4x</span> <span class="cline-any cline-yes">4x</span>
<span class="cline-any cline-yes">4x</span> <span class="cline-any cline-yes">4x</span>
<span class="cline-any cline-yes">4x</span> <span class="cline-any cline-yes">4x</span>
<span class="cline-any cline-yes">1x</span> <span class="cline-any cline-yes">1x</span>
<span class="cline-any cline-yes">1x</span> <span class="cline-any cline-yes">1x</span>
<span class="cline-any cline-yes">4x</span> <span class="cline-any cline-yes">4x</span>
<span class="cline-any cline-yes">6x</span> <span class="cline-any cline-yes">8x</span>
<span class="cline-any cline-yes">4x</span> <span class="cline-any cline-yes">37x</span>
<span class="cline-any cline-yes">4x</span> <span class="cline-any cline-yes">37x</span>
<span class="cline-any cline-yes">1x</span> <span class="cline-any cline-yes">1x</span>
<span class="cline-any cline-neutral">&nbsp;</span></td><td class="text"><pre class="prettyprint lang-js">import type { LightPlugin, LightClient, SentryEvent } from '../types'; <span class="cline-any cline-neutral">&nbsp;</span></td><td class="text"><pre class="prettyprint lang-js">import type { LightPlugin, LightClient, SentryEvent } from '../types';
&nbsp; &nbsp;
@ -331,7 +331,7 @@ export class PluginManager {
<div class='footer quiet pad2 space-top1 center small'> <div class='footer quiet pad2 space-top1 center small'>
Code coverage generated by Code coverage generated by
<a href="https://istanbul.js.org/" target="_blank" rel="noopener noreferrer">istanbul</a> <a href="https://istanbul.js.org/" target="_blank" rel="noopener noreferrer">istanbul</a>
at 2026-06-25T14:49:54.914Z at 2026-06-25T15:09:05.618Z
</div> </div>
<script src="../../prettify.js"></script> <script src="../../prettify.js"></script>
<script> <script>

View File

@ -23,30 +23,30 @@
<div class='clearfix'> <div class='clearfix'>
<div class='fl pad1y space-right2'> <div class='fl pad1y space-right2'>
<span class="strong">16.9% </span> <span class="strong">18.05% </span>
<span class="quiet">Statements</span> <span class="quiet">Statements</span>
<span class='fraction'>59/349</span> <span class='fraction'>63/349</span>
</div> </div>
<div class='fl pad1y space-right2'> <div class='fl pad1y space-right2'>
<span class="strong">100% </span> <span class="strong">100% </span>
<span class="quiet">Branches</span> <span class="quiet">Branches</span>
<span class='fraction'>0/0</span> <span class='fraction'>1/1</span>
</div> </div>
<div class='fl pad1y space-right2'> <div class='fl pad1y space-right2'>
<span class="strong">0% </span> <span class="strong">8.33% </span>
<span class="quiet">Functions</span> <span class="quiet">Functions</span>
<span class='fraction'>0/12</span> <span class='fraction'>1/12</span>
</div> </div>
<div class='fl pad1y space-right2'> <div class='fl pad1y space-right2'>
<span class="strong">16.9% </span> <span class="strong">18.05% </span>
<span class="quiet">Lines</span> <span class="quiet">Lines</span>
<span class='fraction'>59/349</span> <span class='fraction'>63/349</span>
</div> </div>
@ -425,10 +425,10 @@
<span class="cline-any cline-yes">1x</span> <span class="cline-any cline-yes">1x</span>
<span class="cline-any cline-yes">1x</span> <span class="cline-any cline-yes">1x</span>
<span class="cline-any cline-yes">1x</span> <span class="cline-any cline-yes">1x</span>
<span class="cline-any cline-no">&nbsp;</span> <span class="cline-any cline-yes">32x</span>
<span class="cline-any cline-no">&nbsp;</span> <span class="cline-any cline-yes">32x</span>
<span class="cline-any cline-no">&nbsp;</span> <span class="cline-any cline-yes">32x</span>
<span class="cline-any cline-no">&nbsp;</span> <span class="cline-any cline-yes">32x</span>
<span class="cline-any cline-yes">1x</span> <span class="cline-any cline-yes">1x</span>
<span class="cline-any cline-yes">1x</span> <span class="cline-any cline-yes">1x</span>
<span class="cline-any cline-no">&nbsp;</span> <span class="cline-any cline-no">&nbsp;</span>
@ -773,11 +773,11 @@ export class Reporter {
private retryDelay: number; private retryDelay: number;
private useShortFields: boolean = true; // 是否使用短字段编码 private useShortFields: boolean = true; // 是否使用短字段编码
&nbsp; &nbsp;
<span class="fstat-no" title="function not covered" > constructor(dsn: DSNInfo, maxRetries: number, retryDelay: number) {</span> constructor(dsn: DSNInfo, maxRetries: number, retryDelay: number) {
<span class="cstat-no" title="statement not covered" > this.dsn = dsn;</span> this.dsn = dsn;
<span class="cstat-no" title="statement not covered" > this.maxRetries = maxRetries;</span> this.maxRetries = maxRetries;
<span class="cstat-no" title="statement not covered" > this.retryDelay = retryDelay;</span> this.retryDelay = retryDelay;
<span class="cstat-no" title="statement not covered" > }</span> }
&nbsp; &nbsp;
<span class="fstat-no" title="function not covered" > async report(events: SentryEvent[]): Promise&lt;void&gt; {</span> <span class="fstat-no" title="function not covered" > async report(events: SentryEvent[]): Promise&lt;void&gt; {</span>
<span class="cstat-no" title="statement not covered" > logDebug('Reporter', 'report called', { eventCount: events.length });</span> <span class="cstat-no" title="statement not covered" > logDebug('Reporter', 'report called', { eventCount: events.length });</span>
@ -1117,7 +1117,7 @@ export class Reporter {
<div class='footer quiet pad2 space-top1 center small'> <div class='footer quiet pad2 space-top1 center small'>
Code coverage generated by Code coverage generated by
<a href="https://istanbul.js.org/" target="_blank" rel="noopener noreferrer">istanbul</a> <a href="https://istanbul.js.org/" target="_blank" rel="noopener noreferrer">istanbul</a>
at 2026-06-25T14:49:54.914Z at 2026-06-25T15:09:05.618Z
</div> </div>
<script src="../../prettify.js"></script> <script src="../../prettify.js"></script>
<script> <script>

View File

@ -23,16 +23,16 @@
<div class='clearfix'> <div class='clearfix'>
<div class='fl pad1y space-right2'> <div class='fl pad1y space-right2'>
<span class="strong">86.86% </span> <span class="strong">87.87% </span>
<span class="quiet">Statements</span> <span class="quiet">Statements</span>
<span class='fraction'>172/198</span> <span class='fraction'>174/198</span>
</div> </div>
<div class='fl pad1y space-right2'> <div class='fl pad1y space-right2'>
<span class="strong">80% </span> <span class="strong">89.74% </span>
<span class="quiet">Branches</span> <span class="quiet">Branches</span>
<span class='fraction'>28/35</span> <span class='fraction'>35/39</span>
</div> </div>
@ -44,9 +44,9 @@
<div class='fl pad1y space-right2'> <div class='fl pad1y space-right2'>
<span class="strong">86.86% </span> <span class="strong">87.87% </span>
<span class="quiet">Lines</span> <span class="quiet">Lines</span>
<span class='fraction'>172/198</span> <span class='fraction'>174/198</span>
</div> </div>
@ -273,22 +273,22 @@
<span class="cline-any cline-yes">1x</span> <span class="cline-any cline-yes">1x</span>
<span class="cline-any cline-yes">1x</span> <span class="cline-any cline-yes">1x</span>
<span class="cline-any cline-yes">1x</span> <span class="cline-any cline-yes">1x</span>
<span class="cline-any cline-yes">29x</span> <span class="cline-any cline-yes">61x</span>
<span class="cline-any cline-yes">29x</span> <span class="cline-any cline-yes">61x</span>
<span class="cline-any cline-yes">29x</span> <span class="cline-any cline-yes">61x</span>
<span class="cline-any cline-yes">29x</span> <span class="cline-any cline-yes">61x</span>
<span class="cline-any cline-yes">1x</span>
<span class="cline-any cline-yes">1x</span>
<span class="cline-any cline-yes">3x</span>
<span class="cline-any cline-yes">3x</span>
<span class="cline-any cline-yes">1x</span> <span class="cline-any cline-yes">1x</span>
<span class="cline-any cline-yes">1x</span> <span class="cline-any cline-yes">1x</span>
<span class="cline-any cline-yes">1x</span> <span class="cline-any cline-yes">1x</span>
<span class="cline-any cline-yes">3x</span>
<span class="cline-any cline-yes">1x</span> <span class="cline-any cline-yes">1x</span>
<span class="cline-any cline-yes">1x</span> <span class="cline-any cline-yes">1x</span>
<span class="cline-any cline-yes">1x</span> <span class="cline-any cline-yes">20x</span>
<span class="cline-any cline-yes">1x</span> <span class="cline-any cline-yes">20x</span>
<span class="cline-any cline-yes">1x</span>
<span class="cline-any cline-yes">1x</span>
<span class="cline-any cline-yes">1x</span>
<span class="cline-any cline-yes">19x</span>
<span class="cline-any cline-yes">19x</span>
<span class="cline-any cline-yes">2x</span> <span class="cline-any cline-yes">2x</span>
<span class="cline-any cline-yes">2x</span> <span class="cline-any cline-yes">2x</span>
<span class="cline-any cline-yes">2x</span> <span class="cline-any cline-yes">2x</span>
@ -302,78 +302,78 @@
<span class="cline-any cline-no">&nbsp;</span> <span class="cline-any cline-no">&nbsp;</span>
<span class="cline-any cline-no">&nbsp;</span> <span class="cline-any cline-no">&nbsp;</span>
<span class="cline-any cline-no">&nbsp;</span> <span class="cline-any cline-no">&nbsp;</span>
<span class="cline-any cline-yes">17x</span> <span class="cline-any cline-yes">18x</span>
<span class="cline-any cline-yes">19x</span> <span class="cline-any cline-yes">20x</span>
<span class="cline-any cline-yes">19x</span> <span class="cline-any cline-yes">20x</span>
<span class="cline-any cline-yes">3x</span>
<span class="cline-any cline-no">&nbsp;</span>
<span class="cline-any cline-yes">20x</span>
<span class="cline-any cline-yes">1x</span>
<span class="cline-any cline-yes">1x</span>
<span class="cline-any cline-yes">21x</span>
<span class="cline-any cline-yes">21x</span>
<span class="cline-any cline-yes">21x</span>
<span class="cline-any cline-yes">21x</span>
<span class="cline-any cline-yes">21x</span>
<span class="cline-any cline-yes">21x</span>
<span class="cline-any cline-yes">21x</span>
<span class="cline-any cline-yes">21x</span>
<span class="cline-any cline-yes">21x</span>
<span class="cline-any cline-yes">21x</span>
<span class="cline-any cline-yes">21x</span>
<span class="cline-any cline-yes">21x</span>
<span class="cline-any cline-yes">21x</span>
<span class="cline-any cline-yes">21x</span>
<span class="cline-any cline-yes">21x</span>
<span class="cline-any cline-yes">21x</span>
<span class="cline-any cline-yes">21x</span>
<span class="cline-any cline-yes">21x</span>
<span class="cline-any cline-yes">21x</span>
<span class="cline-any cline-yes">21x</span>
<span class="cline-any cline-yes">21x</span>
<span class="cline-any cline-yes">21x</span>
<span class="cline-any cline-yes">21x</span>
<span class="cline-any cline-yes">21x</span>
<span class="cline-any cline-yes">21x</span>
<span class="cline-any cline-yes">21x</span>
<span class="cline-any cline-yes">21x</span>
<span class="cline-any cline-yes">21x</span>
<span class="cline-any cline-yes">21x</span>
<span class="cline-any cline-yes">1x</span>
<span class="cline-any cline-yes">1x</span>
<span class="cline-any cline-yes">13x</span>
<span class="cline-any cline-yes">13x</span>
<span class="cline-any cline-yes">1x</span>
<span class="cline-any cline-yes">1x</span>
<span class="cline-any cline-no">&nbsp;</span>
<span class="cline-any cline-no">&nbsp;</span>
<span class="cline-any cline-no">&nbsp;</span>
<span class="cline-any cline-no">&nbsp;</span>
<span class="cline-any cline-no">&nbsp;</span>
<span class="cline-any cline-no">&nbsp;</span>
<span class="cline-any cline-no">&nbsp;</span>
<span class="cline-any cline-yes">1x</span>
<span class="cline-any cline-yes">1x</span>
<span class="cline-any cline-yes">22x</span>
<span class="cline-any cline-yes">22x</span>
<span class="cline-any cline-yes">1x</span>
<span class="cline-any cline-yes">1x</span>
<span class="cline-any cline-yes">3x</span>
<span class="cline-any cline-yes">2x</span> <span class="cline-any cline-yes">2x</span>
<span class="cline-any cline-no">&nbsp;</span>
<span class="cline-any cline-yes">19x</span>
<span class="cline-any cline-yes">1x</span>
<span class="cline-any cline-yes">1x</span>
<span class="cline-any cline-yes">20x</span>
<span class="cline-any cline-yes">20x</span>
<span class="cline-any cline-yes">20x</span>
<span class="cline-any cline-yes">20x</span>
<span class="cline-any cline-yes">20x</span>
<span class="cline-any cline-yes">20x</span>
<span class="cline-any cline-yes">20x</span>
<span class="cline-any cline-yes">20x</span>
<span class="cline-any cline-yes">20x</span>
<span class="cline-any cline-yes">20x</span>
<span class="cline-any cline-yes">20x</span>
<span class="cline-any cline-yes">20x</span>
<span class="cline-any cline-yes">20x</span>
<span class="cline-any cline-yes">20x</span>
<span class="cline-any cline-yes">20x</span>
<span class="cline-any cline-yes">20x</span>
<span class="cline-any cline-yes">20x</span>
<span class="cline-any cline-yes">20x</span>
<span class="cline-any cline-yes">20x</span>
<span class="cline-any cline-yes">20x</span>
<span class="cline-any cline-yes">20x</span>
<span class="cline-any cline-yes">20x</span>
<span class="cline-any cline-yes">20x</span>
<span class="cline-any cline-yes">20x</span>
<span class="cline-any cline-yes">20x</span>
<span class="cline-any cline-yes">20x</span>
<span class="cline-any cline-yes">20x</span>
<span class="cline-any cline-yes">20x</span>
<span class="cline-any cline-yes">20x</span>
<span class="cline-any cline-yes">1x</span>
<span class="cline-any cline-yes">1x</span>
<span class="cline-any cline-yes">8x</span>
<span class="cline-any cline-yes">8x</span>
<span class="cline-any cline-yes">1x</span>
<span class="cline-any cline-yes">1x</span>
<span class="cline-any cline-no">&nbsp;</span>
<span class="cline-any cline-no">&nbsp;</span>
<span class="cline-any cline-no">&nbsp;</span>
<span class="cline-any cline-no">&nbsp;</span>
<span class="cline-any cline-no">&nbsp;</span>
<span class="cline-any cline-no">&nbsp;</span>
<span class="cline-any cline-no">&nbsp;</span>
<span class="cline-any cline-yes">1x</span>
<span class="cline-any cline-yes">1x</span>
<span class="cline-any cline-yes">16x</span>
<span class="cline-any cline-yes">16x</span>
<span class="cline-any cline-yes">1x</span> <span class="cline-any cline-yes">1x</span>
<span class="cline-any cline-yes">1x</span> <span class="cline-any cline-yes">1x</span>
<span class="cline-any cline-yes">2x</span> <span class="cline-any cline-yes">2x</span>
<span class="cline-any cline-yes">1x</span> <span class="cline-any cline-yes">1x</span>
<span class="cline-any cline-yes">1x</span> <span class="cline-any cline-yes">1x</span>
<span class="cline-any cline-yes">3x</span>
<span class="cline-any cline-yes">1x</span> <span class="cline-any cline-yes">1x</span>
<span class="cline-any cline-yes">1x</span> <span class="cline-any cline-yes">1x</span>
<span class="cline-any cline-yes">1x</span> <span class="cline-any cline-yes">9x</span>
<span class="cline-any cline-yes">1x</span> <span class="cline-any cline-yes">9x</span>
<span class="cline-any cline-yes">9x</span>
<span class="cline-any cline-yes">2x</span>
<span class="cline-any cline-yes">2x</span>
<span class="cline-any cline-yes">2x</span> <span class="cline-any cline-yes">2x</span>
<span class="cline-any cline-yes">1x</span>
<span class="cline-any cline-yes">1x</span>
<span class="cline-any cline-yes">8x</span>
<span class="cline-any cline-yes">8x</span>
<span class="cline-any cline-yes">8x</span>
<span class="cline-any cline-yes">1x</span>
<span class="cline-any cline-yes">1x</span>
<span class="cline-any cline-yes">1x</span>
<span class="cline-any cline-yes">7x</span> <span class="cline-any cline-yes">7x</span>
<span class="cline-any cline-yes">7x</span> <span class="cline-any cline-yes">7x</span>
<span class="cline-any cline-yes">7x</span> <span class="cline-any cline-yes">7x</span>
@ -404,25 +404,15 @@
<span class="cline-any cline-yes">7x</span> <span class="cline-any cline-yes">7x</span>
<span class="cline-any cline-yes">7x</span> <span class="cline-any cline-yes">7x</span>
<span class="cline-any cline-yes">7x</span> <span class="cline-any cline-yes">7x</span>
<span class="cline-any cline-yes">8x</span> <span class="cline-any cline-yes">9x</span>
<span class="cline-any cline-yes">1x</span>
<span class="cline-any cline-yes">1x</span>
<span class="cline-any cline-yes">1x</span>
<span class="cline-any cline-yes">1x</span>
<span class="cline-any cline-yes">1x</span>
<span class="cline-any cline-yes">1x</span>
<span class="cline-any cline-yes">1x</span>
<span class="cline-any cline-yes">1x</span>
<span class="cline-any cline-no">&nbsp;</span>
<span class="cline-any cline-no">&nbsp;</span>
<span class="cline-any cline-yes">1x</span>
<span class="cline-any cline-yes">1x</span>
<span class="cline-any cline-yes">1x</span>
<span class="cline-any cline-yes">1x</span>
<span class="cline-any cline-yes">1x</span>
<span class="cline-any cline-yes">1x</span>
<span class="cline-any cline-yes">1x</span> <span class="cline-any cline-yes">1x</span>
<span class="cline-any cline-yes">1x</span> <span class="cline-any cline-yes">1x</span>
<span class="cline-any cline-yes">2x</span>
<span class="cline-any cline-yes">2x</span>
<span class="cline-any cline-yes">2x</span>
<span class="cline-any cline-yes">2x</span>
<span class="cline-any cline-yes">2x</span>
<span class="cline-any cline-yes">2x</span>
<span class="cline-any cline-yes">1x</span> <span class="cline-any cline-yes">1x</span>
<span class="cline-any cline-yes">1x</span> <span class="cline-any cline-yes">1x</span>
<span class="cline-any cline-yes">2x</span> <span class="cline-any cline-yes">2x</span>
@ -433,10 +423,20 @@
<span class="cline-any cline-yes">2x</span> <span class="cline-any cline-yes">2x</span>
<span class="cline-any cline-yes">2x</span> <span class="cline-any cline-yes">2x</span>
<span class="cline-any cline-yes">2x</span> <span class="cline-any cline-yes">2x</span>
<span class="cline-any cline-yes">2x</span> <span class="cline-any cline-yes">1x</span>
<span class="cline-any cline-yes">2x</span> <span class="cline-any cline-yes">1x</span>
<span class="cline-any cline-yes">2x</span> <span class="cline-any cline-yes">3x</span>
<span class="cline-any cline-yes">2x</span> <span class="cline-any cline-yes">3x</span>
<span class="cline-any cline-yes">3x</span>
<span class="cline-any cline-yes">3x</span>
<span class="cline-any cline-yes">3x</span>
<span class="cline-any cline-yes">3x</span>
<span class="cline-any cline-yes">3x</span>
<span class="cline-any cline-yes">3x</span>
<span class="cline-any cline-yes">3x</span>
<span class="cline-any cline-yes">3x</span>
<span class="cline-any cline-yes">3x</span>
<span class="cline-any cline-yes">3x</span>
<span class="cline-any cline-yes">1x</span> <span class="cline-any cline-yes">1x</span>
<span class="cline-any cline-yes">1x</span> <span class="cline-any cline-yes">1x</span>
<span class="cline-any cline-no">&nbsp;</span> <span class="cline-any cline-no">&nbsp;</span>
@ -447,17 +447,17 @@
<span class="cline-any cline-no">&nbsp;</span> <span class="cline-any cline-no">&nbsp;</span>
<span class="cline-any cline-yes">1x</span> <span class="cline-any cline-yes">1x</span>
<span class="cline-any cline-yes">1x</span> <span class="cline-any cline-yes">1x</span>
<span class="cline-any cline-yes">31x</span> <span class="cline-any cline-yes">64x</span>
<span class="cline-any cline-yes">17x</span> <span class="cline-any cline-yes">18x</span>
<span class="cline-any cline-yes">17x</span> <span class="cline-any cline-yes">18x</span>
<span class="cline-any cline-yes">17x</span> <span class="cline-any cline-yes">18x</span>
<span class="cline-any cline-yes">17x</span> <span class="cline-any cline-yes">18x</span>
<span class="cline-any cline-no">&nbsp;</span> <span class="cline-any cline-no">&nbsp;</span>
<span class="cline-any cline-no">&nbsp;</span> <span class="cline-any cline-no">&nbsp;</span>
<span class="cline-any cline-yes">17x</span> <span class="cline-any cline-yes">18x</span>
<span class="cline-any cline-yes">31x</span> <span class="cline-any cline-yes">64x</span>
<span class="cline-any cline-yes">31x</span> <span class="cline-any cline-yes">64x</span>
<span class="cline-any cline-yes">31x</span> <span class="cline-any cline-yes">64x</span>
<span class="cline-any cline-yes">1x</span> <span class="cline-any cline-yes">1x</span>
<span class="cline-any cline-neutral">&nbsp;</span></td><td class="text"><pre class="prettyprint lang-js">import type { LightConfig, SpanContext, TransactionContext, Span, Transaction, LightClient, SamplingContext } from '../types'; <span class="cline-any cline-neutral">&nbsp;</span></td><td class="text"><pre class="prettyprint lang-js">import type { LightConfig, SpanContext, TransactionContext, Span, Transaction, LightClient, SamplingContext } from '../types';
import { Span as SpanImpl, Transaction as TransactionImpl } from '../utils/tracing'; import { Span as SpanImpl, Transaction as TransactionImpl } from '../utils/tracing';
@ -501,7 +501,7 @@ export class TracingManager {
<span class="cstat-no" title="statement not covered" > return Math.random() &lt; clampedRate;</span> <span class="cstat-no" title="statement not covered" > return Math.random() &lt; clampedRate;</span>
<span class="cstat-no" title="statement not covered" > }</span> <span class="cstat-no" title="statement not covered" > }</span>
&nbsp; &nbsp;
const rate = this.config.<span class="branch-0 cbranch-no" title="branch not covered" >tracesSampleRate ?? 0;</span> const rate = this.config.tracesSampleRate ?? 0;
if (rate &gt;= 1) return true; if (rate &gt;= 1) return true;
if (rate &lt;= 0) return <span class="branch-0 cbranch-no" title="branch not covered" >false;</span> if (rate &lt;= 0) return <span class="branch-0 cbranch-no" title="branch not covered" >false;</span>
<span class="cstat-no" title="statement not covered" > return Math.random() &lt; rate;</span> <span class="cstat-no" title="statement not covered" > return Math.random() &lt; rate;</span>
@ -610,9 +610,9 @@ export class TracingManager {
this.spanStack.splice(idx, 1); this.spanStack.splice(idx, 1);
} }
&nbsp; &nbsp;
if (this.spanStack.length === <span class="branch-0 cbranch-no" title="branch not covered" >0 &amp;&amp; this.currentTransaction) <span class="branch-0 cbranch-no" title="branch not covered" >{</span></span> if (this.spanStack.length === 0 &amp;&amp; this.currentTransaction) {
<span class="cstat-no" title="statement not covered" > this.spanStack = [this.currentTransaction];</span> this.spanStack = [this.currentTransaction];
<span class="cstat-no" title="statement not covered" > }</span> }
&nbsp; &nbsp;
logDebug('TracingManager', 'Span finished', { logDebug('TracingManager', 'Span finished', {
op: span.op, op: span.op,
@ -664,7 +664,7 @@ export class TracingManager {
<div class='footer quiet pad2 space-top1 center small'> <div class='footer quiet pad2 space-top1 center small'>
Code coverage generated by Code coverage generated by
<a href="https://istanbul.js.org/" target="_blank" rel="noopener noreferrer">istanbul</a> <a href="https://istanbul.js.org/" target="_blank" rel="noopener noreferrer">istanbul</a>
at 2026-06-25T14:49:54.914Z at 2026-06-25T15:09:05.618Z
</div> </div>
<script src="../../prettify.js"></script> <script src="../../prettify.js"></script>
<script> <script>

View File

@ -23,30 +23,30 @@
<div class='clearfix'> <div class='clearfix'>
<div class='fl pad1y space-right2'> <div class='fl pad1y space-right2'>
<span class="strong">60.64% </span> <span class="strong">69.23% </span>
<span class="quiet">Statements</span> <span class="quiet">Statements</span>
<span class='fraction'>974/1606</span> <span class='fraction'>1170/1690</span>
</div> </div>
<div class='fl pad1y space-right2'> <div class='fl pad1y space-right2'>
<span class="strong">85.78% </span> <span class="strong">80.43% </span>
<span class="quiet">Branches</span> <span class="quiet">Branches</span>
<span class='fraction'>169/197</span> <span class='fraction'>222/276</span>
</div> </div>
<div class='fl pad1y space-right2'> <div class='fl pad1y space-right2'>
<span class="strong">52% </span> <span class="strong">79% </span>
<span class="quiet">Functions</span> <span class="quiet">Functions</span>
<span class='fraction'>52/100</span> <span class='fraction'>79/100</span>
</div> </div>
<div class='fl pad1y space-right2'> <div class='fl pad1y space-right2'>
<span class="strong">60.64% </span> <span class="strong">69.23% </span>
<span class="quiet">Lines</span> <span class="quiet">Lines</span>
<span class='fraction'>974/1606</span> <span class='fraction'>1170/1690</span>
</div> </div>
@ -79,18 +79,18 @@
</tr> </tr>
</thead> </thead>
<tbody><tr> <tbody><tr>
<td class="file low" data-value="Client.ts"><a href="Client.ts.html">Client.ts</a></td> <td class="file medium" data-value="Client.ts"><a href="Client.ts.html">Client.ts</a></td>
<td data-value="24.72" class="pic low"> <td data-value="62.05" class="pic medium">
<div class="chart"><div class="cover-fill" style="width: 24%"></div><div class="cover-empty" style="width: 76%"></div></div> <div class="chart"><div class="cover-fill" style="width: 62%"></div><div class="cover-empty" style="width: 38%"></div></div>
</td> </td>
<td data-value="24.72" class="pct low">24.72%</td> <td data-value="62.05" class="pct medium">62.05%</td>
<td data-value="364" class="abs low">90/364</td> <td data-value="448" class="abs medium">278/448</td>
<td data-value="100" class="pct high">100%</td> <td data-value="55.71" class="pct medium">55.71%</td>
<td data-value="0" class="abs high">0/0</td> <td data-value="70" class="abs medium">39/70</td>
<td data-value="0" class="pct low">0%</td> <td data-value="89.65" class="pct high">89.65%</td>
<td data-value="29" class="abs low">0/29</td> <td data-value="29" class="abs high">26/29</td>
<td data-value="24.72" class="pct low">24.72%</td> <td data-value="62.05" class="pct medium">62.05%</td>
<td data-value="364" class="abs low">90/364</td> <td data-value="448" class="abs medium">278/448</td>
</tr> </tr>
<tr> <tr>
@ -100,8 +100,8 @@
</td> </td>
<td data-value="95.9" class="pct high">95.9%</td> <td data-value="95.9" class="pct high">95.9%</td>
<td data-value="244" class="abs high">234/244</td> <td data-value="244" class="abs high">234/244</td>
<td data-value="81.81" class="pct high">81.81%</td> <td data-value="83.63" class="pct high">83.63%</td>
<td data-value="55" class="abs high">45/55</td> <td data-value="55" class="abs high">46/55</td>
<td data-value="92.85" class="pct high">92.85%</td> <td data-value="92.85" class="pct high">92.85%</td>
<td data-value="14" class="abs high">13/14</td> <td data-value="14" class="abs high">13/14</td>
<td data-value="95.9" class="pct high">95.9%</td> <td data-value="95.9" class="pct high">95.9%</td>
@ -125,17 +125,17 @@
<tr> <tr>
<td class="file high" data-value="EventQueue.ts"><a href="EventQueue.ts.html">EventQueue.ts</a></td> <td class="file high" data-value="EventQueue.ts"><a href="EventQueue.ts.html">EventQueue.ts</a></td>
<td data-value="89.9" class="pic high"> <td data-value="90.53" class="pic high">
<div class="chart"><div class="cover-fill" style="width: 89%"></div><div class="cover-empty" style="width: 11%"></div></div> <div class="chart"><div class="cover-fill" style="width: 90%"></div><div class="cover-empty" style="width: 10%"></div></div>
</td> </td>
<td data-value="89.9" class="pct high">89.9%</td> <td data-value="90.53" class="pct high">90.53%</td>
<td data-value="317" class="abs high">285/317</td> <td data-value="317" class="abs high">287/317</td>
<td data-value="83.82" class="pct high">83.82%</td> <td data-value="86.11" class="pct high">86.11%</td>
<td data-value="68" class="abs high">57/68</td> <td data-value="72" class="abs high">62/72</td>
<td data-value="81.25" class="pct high">81.25%</td> <td data-value="81.25" class="pct high">81.25%</td>
<td data-value="16" class="abs high">13/16</td> <td data-value="16" class="abs high">13/16</td>
<td data-value="89.9" class="pct high">89.9%</td> <td data-value="90.53" class="pct high">90.53%</td>
<td data-value="317" class="abs high">285/317</td> <td data-value="317" class="abs high">287/317</td>
</tr> </tr>
<tr> <tr>
@ -155,32 +155,32 @@
<tr> <tr>
<td class="file low" data-value="Reporter.ts"><a href="Reporter.ts.html">Reporter.ts</a></td> <td class="file low" data-value="Reporter.ts"><a href="Reporter.ts.html">Reporter.ts</a></td>
<td data-value="16.9" class="pic low"> <td data-value="18.05" class="pic low">
<div class="chart"><div class="cover-fill" style="width: 16%"></div><div class="cover-empty" style="width: 84%"></div></div> <div class="chart"><div class="cover-fill" style="width: 18%"></div><div class="cover-empty" style="width: 82%"></div></div>
</td> </td>
<td data-value="16.9" class="pct low">16.9%</td> <td data-value="18.05" class="pct low">18.05%</td>
<td data-value="349" class="abs low">59/349</td> <td data-value="349" class="abs low">63/349</td>
<td data-value="100" class="pct high">100%</td> <td data-value="100" class="pct high">100%</td>
<td data-value="0" class="abs high">0/0</td> <td data-value="1" class="abs high">1/1</td>
<td data-value="0" class="pct low">0%</td> <td data-value="8.33" class="pct low">8.33%</td>
<td data-value="12" class="abs low">0/12</td> <td data-value="12" class="abs low">1/12</td>
<td data-value="16.9" class="pct low">16.9%</td> <td data-value="18.05" class="pct low">18.05%</td>
<td data-value="349" class="abs low">59/349</td> <td data-value="349" class="abs low">63/349</td>
</tr> </tr>
<tr> <tr>
<td class="file high" data-value="TracingManager.ts"><a href="TracingManager.ts.html">TracingManager.ts</a></td> <td class="file high" data-value="TracingManager.ts"><a href="TracingManager.ts.html">TracingManager.ts</a></td>
<td data-value="86.86" class="pic high"> <td data-value="87.87" class="pic high">
<div class="chart"><div class="cover-fill" style="width: 86%"></div><div class="cover-empty" style="width: 14%"></div></div> <div class="chart"><div class="cover-fill" style="width: 87%"></div><div class="cover-empty" style="width: 13%"></div></div>
</td> </td>
<td data-value="86.86" class="pct high">86.86%</td> <td data-value="87.87" class="pct high">87.87%</td>
<td data-value="198" class="abs high">172/198</td> <td data-value="198" class="abs high">174/198</td>
<td data-value="80" class="pct high">80%</td> <td data-value="89.74" class="pct high">89.74%</td>
<td data-value="35" class="abs high">28/35</td> <td data-value="39" class="abs high">35/39</td>
<td data-value="78.57" class="pct medium">78.57%</td> <td data-value="78.57" class="pct medium">78.57%</td>
<td data-value="14" class="abs medium">11/14</td> <td data-value="14" class="abs medium">11/14</td>
<td data-value="86.86" class="pct high">86.86%</td> <td data-value="87.87" class="pct high">87.87%</td>
<td data-value="198" class="abs high">172/198</td> <td data-value="198" class="abs high">174/198</td>
</tr> </tr>
</tbody> </tbody>
@ -191,7 +191,7 @@
<div class='footer quiet pad2 space-top1 center small'> <div class='footer quiet pad2 space-top1 center small'>
Code coverage generated by Code coverage generated by
<a href="https://istanbul.js.org/" target="_blank" rel="noopener noreferrer">istanbul</a> <a href="https://istanbul.js.org/" target="_blank" rel="noopener noreferrer">istanbul</a>
at 2026-06-25T14:49:54.914Z at 2026-06-25T15:09:05.618Z
</div> </div>
<script src="../../prettify.js"></script> <script src="../../prettify.js"></script>
<script> <script>

View File

@ -23,9 +23,9 @@
<div class='clearfix'> <div class='clearfix'>
<div class='fl pad1y space-right2'> <div class='fl pad1y space-right2'>
<span class="strong">50.39% </span> <span class="strong">37.57% </span>
<span class="quiet">Statements</span> <span class="quiet">Statements</span>
<span class='fraction'>127/252</span> <span class='fraction'>127/338</span>
</div> </div>
@ -44,9 +44,9 @@
<div class='fl pad1y space-right2'> <div class='fl pad1y space-right2'>
<span class="strong">50.39% </span> <span class="strong">37.57% </span>
<span class="quiet">Lines</span> <span class="quiet">Lines</span>
<span class='fraction'>127/252</span> <span class='fraction'>127/338</span>
</div> </div>
@ -61,7 +61,7 @@
</div> </div>
</template> </template>
</div> </div>
<div class='status-line medium'></div> <div class='status-line low'></div>
<div class="pad1"> <div class="pad1">
<table class="coverage-summary"> <table class="coverage-summary">
<thead> <thead>
@ -79,18 +79,18 @@
</tr> </tr>
</thead> </thead>
<tbody><tr> <tbody><tr>
<td class="file medium" data-value="index.ts"><a href="index.ts.html">index.ts</a></td> <td class="file low" data-value="index.ts"><a href="index.ts.html">index.ts</a></td>
<td data-value="50.39" class="pic medium"> <td data-value="37.57" class="pic low">
<div class="chart"><div class="cover-fill" style="width: 50%"></div><div class="cover-empty" style="width: 50%"></div></div> <div class="chart"><div class="cover-fill" style="width: 37%"></div><div class="cover-empty" style="width: 63%"></div></div>
</td> </td>
<td data-value="50.39" class="pct medium">50.39%</td> <td data-value="37.57" class="pct low">37.57%</td>
<td data-value="252" class="abs medium">127/252</td> <td data-value="338" class="abs low">127/338</td>
<td data-value="100" class="pct high">100%</td> <td data-value="100" class="pct high">100%</td>
<td data-value="0" class="abs high">0/0</td> <td data-value="0" class="abs high">0/0</td>
<td data-value="0" class="pct low">0%</td> <td data-value="0" class="pct low">0%</td>
<td data-value="21" class="abs low">0/21</td> <td data-value="21" class="abs low">0/21</td>
<td data-value="50.39" class="pct medium">50.39%</td> <td data-value="37.57" class="pct low">37.57%</td>
<td data-value="252" class="abs medium">127/252</td> <td data-value="338" class="abs low">127/338</td>
</tr> </tr>
</tbody> </tbody>
@ -101,7 +101,7 @@
<div class='footer quiet pad2 space-top1 center small'> <div class='footer quiet pad2 space-top1 center small'>
Code coverage generated by Code coverage generated by
<a href="https://istanbul.js.org/" target="_blank" rel="noopener noreferrer">istanbul</a> <a href="https://istanbul.js.org/" target="_blank" rel="noopener noreferrer">istanbul</a>
at 2026-06-25T14:49:54.914Z at 2026-06-25T15:09:05.618Z
</div> </div>
<script src="../prettify.js"></script> <script src="../prettify.js"></script>
<script> <script>

View File

@ -23,9 +23,9 @@
<div class='clearfix'> <div class='clearfix'>
<div class='fl pad1y space-right2'> <div class='fl pad1y space-right2'>
<span class="strong">50.39% </span> <span class="strong">37.57% </span>
<span class="quiet">Statements</span> <span class="quiet">Statements</span>
<span class='fraction'>127/252</span> <span class='fraction'>127/338</span>
</div> </div>
@ -44,9 +44,9 @@
<div class='fl pad1y space-right2'> <div class='fl pad1y space-right2'>
<span class="strong">50.39% </span> <span class="strong">37.57% </span>
<span class="quiet">Lines</span> <span class="quiet">Lines</span>
<span class='fraction'>127/252</span> <span class='fraction'>127/338</span>
</div> </div>
@ -61,7 +61,7 @@
</div> </div>
</template> </template>
</div> </div>
<div class='status-line medium'></div> <div class='status-line low'></div>
<pre><table class="coverage"> <pre><table class="coverage">
<tr><td class="line-count quiet"><a name='L1'></a><a href='#L1'>1</a> <tr><td class="line-count quiet"><a name='L1'></a><a href='#L1'>1</a>
<a name='L2'></a><a href='#L2'>2</a> <a name='L2'></a><a href='#L2'>2</a>
@ -315,7 +315,93 @@
<a name='L250'></a><a href='#L250'>250</a> <a name='L250'></a><a href='#L250'>250</a>
<a name='L251'></a><a href='#L251'>251</a> <a name='L251'></a><a href='#L251'>251</a>
<a name='L252'></a><a href='#L252'>252</a> <a name='L252'></a><a href='#L252'>252</a>
<a name='L253'></a><a href='#L253'>253</a></td><td class="line-coverage quiet"><span class="cline-any cline-yes">1x</span> <a name='L253'></a><a href='#L253'>253</a>
<a name='L254'></a><a href='#L254'>254</a>
<a name='L255'></a><a href='#L255'>255</a>
<a name='L256'></a><a href='#L256'>256</a>
<a name='L257'></a><a href='#L257'>257</a>
<a name='L258'></a><a href='#L258'>258</a>
<a name='L259'></a><a href='#L259'>259</a>
<a name='L260'></a><a href='#L260'>260</a>
<a name='L261'></a><a href='#L261'>261</a>
<a name='L262'></a><a href='#L262'>262</a>
<a name='L263'></a><a href='#L263'>263</a>
<a name='L264'></a><a href='#L264'>264</a>
<a name='L265'></a><a href='#L265'>265</a>
<a name='L266'></a><a href='#L266'>266</a>
<a name='L267'></a><a href='#L267'>267</a>
<a name='L268'></a><a href='#L268'>268</a>
<a name='L269'></a><a href='#L269'>269</a>
<a name='L270'></a><a href='#L270'>270</a>
<a name='L271'></a><a href='#L271'>271</a>
<a name='L272'></a><a href='#L272'>272</a>
<a name='L273'></a><a href='#L273'>273</a>
<a name='L274'></a><a href='#L274'>274</a>
<a name='L275'></a><a href='#L275'>275</a>
<a name='L276'></a><a href='#L276'>276</a>
<a name='L277'></a><a href='#L277'>277</a>
<a name='L278'></a><a href='#L278'>278</a>
<a name='L279'></a><a href='#L279'>279</a>
<a name='L280'></a><a href='#L280'>280</a>
<a name='L281'></a><a href='#L281'>281</a>
<a name='L282'></a><a href='#L282'>282</a>
<a name='L283'></a><a href='#L283'>283</a>
<a name='L284'></a><a href='#L284'>284</a>
<a name='L285'></a><a href='#L285'>285</a>
<a name='L286'></a><a href='#L286'>286</a>
<a name='L287'></a><a href='#L287'>287</a>
<a name='L288'></a><a href='#L288'>288</a>
<a name='L289'></a><a href='#L289'>289</a>
<a name='L290'></a><a href='#L290'>290</a>
<a name='L291'></a><a href='#L291'>291</a>
<a name='L292'></a><a href='#L292'>292</a>
<a name='L293'></a><a href='#L293'>293</a>
<a name='L294'></a><a href='#L294'>294</a>
<a name='L295'></a><a href='#L295'>295</a>
<a name='L296'></a><a href='#L296'>296</a>
<a name='L297'></a><a href='#L297'>297</a>
<a name='L298'></a><a href='#L298'>298</a>
<a name='L299'></a><a href='#L299'>299</a>
<a name='L300'></a><a href='#L300'>300</a>
<a name='L301'></a><a href='#L301'>301</a>
<a name='L302'></a><a href='#L302'>302</a>
<a name='L303'></a><a href='#L303'>303</a>
<a name='L304'></a><a href='#L304'>304</a>
<a name='L305'></a><a href='#L305'>305</a>
<a name='L306'></a><a href='#L306'>306</a>
<a name='L307'></a><a href='#L307'>307</a>
<a name='L308'></a><a href='#L308'>308</a>
<a name='L309'></a><a href='#L309'>309</a>
<a name='L310'></a><a href='#L310'>310</a>
<a name='L311'></a><a href='#L311'>311</a>
<a name='L312'></a><a href='#L312'>312</a>
<a name='L313'></a><a href='#L313'>313</a>
<a name='L314'></a><a href='#L314'>314</a>
<a name='L315'></a><a href='#L315'>315</a>
<a name='L316'></a><a href='#L316'>316</a>
<a name='L317'></a><a href='#L317'>317</a>
<a name='L318'></a><a href='#L318'>318</a>
<a name='L319'></a><a href='#L319'>319</a>
<a name='L320'></a><a href='#L320'>320</a>
<a name='L321'></a><a href='#L321'>321</a>
<a name='L322'></a><a href='#L322'>322</a>
<a name='L323'></a><a href='#L323'>323</a>
<a name='L324'></a><a href='#L324'>324</a>
<a name='L325'></a><a href='#L325'>325</a>
<a name='L326'></a><a href='#L326'>326</a>
<a name='L327'></a><a href='#L327'>327</a>
<a name='L328'></a><a href='#L328'>328</a>
<a name='L329'></a><a href='#L329'>329</a>
<a name='L330'></a><a href='#L330'>330</a>
<a name='L331'></a><a href='#L331'>331</a>
<a name='L332'></a><a href='#L332'>332</a>
<a name='L333'></a><a href='#L333'>333</a>
<a name='L334'></a><a href='#L334'>334</a>
<a name='L335'></a><a href='#L335'>335</a>
<a name='L336'></a><a href='#L336'>336</a>
<a name='L337'></a><a href='#L337'>337</a>
<a name='L338'></a><a href='#L338'>338</a>
<a name='L339'></a><a href='#L339'>339</a></td><td class="line-coverage quiet"><span class="cline-any cline-yes">1x</span>
<span class="cline-any cline-yes">1x</span> <span class="cline-any cline-yes">1x</span>
<span class="cline-any cline-yes">1x</span> <span class="cline-any cline-yes">1x</span>
<span class="cline-any cline-yes">1x</span> <span class="cline-any cline-yes">1x</span>
@ -382,6 +468,11 @@
<span class="cline-any cline-no">&nbsp;</span> <span class="cline-any cline-no">&nbsp;</span>
<span class="cline-any cline-no">&nbsp;</span> <span class="cline-any cline-no">&nbsp;</span>
<span class="cline-any cline-no">&nbsp;</span> <span class="cline-any cline-no">&nbsp;</span>
<span class="cline-any cline-no">&nbsp;</span>
<span class="cline-any cline-no">&nbsp;</span>
<span class="cline-any cline-no">&nbsp;</span>
<span class="cline-any cline-no">&nbsp;</span>
<span class="cline-any cline-no">&nbsp;</span>
<span class="cline-any cline-yes">1x</span> <span class="cline-any cline-yes">1x</span>
<span class="cline-any cline-no">&nbsp;</span> <span class="cline-any cline-no">&nbsp;</span>
<span class="cline-any cline-no">&nbsp;</span> <span class="cline-any cline-no">&nbsp;</span>
@ -395,6 +486,69 @@
<span class="cline-any cline-no">&nbsp;</span> <span class="cline-any cline-no">&nbsp;</span>
<span class="cline-any cline-no">&nbsp;</span> <span class="cline-any cline-no">&nbsp;</span>
<span class="cline-any cline-no">&nbsp;</span> <span class="cline-any cline-no">&nbsp;</span>
<span class="cline-any cline-no">&nbsp;</span>
<span class="cline-any cline-no">&nbsp;</span>
<span class="cline-any cline-no">&nbsp;</span>
<span class="cline-any cline-no">&nbsp;</span>
<span class="cline-any cline-yes">1x</span>
<span class="cline-any cline-no">&nbsp;</span>
<span class="cline-any cline-no">&nbsp;</span>
<span class="cline-any cline-no">&nbsp;</span>
<span class="cline-any cline-no">&nbsp;</span>
<span class="cline-any cline-no">&nbsp;</span>
<span class="cline-any cline-no">&nbsp;</span>
<span class="cline-any cline-no">&nbsp;</span>
<span class="cline-any cline-no">&nbsp;</span>
<span class="cline-any cline-no">&nbsp;</span>
<span class="cline-any cline-no">&nbsp;</span>
<span class="cline-any cline-no">&nbsp;</span>
<span class="cline-any cline-no">&nbsp;</span>
<span class="cline-any cline-yes">1x</span>
<span class="cline-any cline-no">&nbsp;</span>
<span class="cline-any cline-no">&nbsp;</span>
<span class="cline-any cline-no">&nbsp;</span>
<span class="cline-any cline-no">&nbsp;</span>
<span class="cline-any cline-no">&nbsp;</span>
<span class="cline-any cline-no">&nbsp;</span>
<span class="cline-any cline-no">&nbsp;</span>
<span class="cline-any cline-no">&nbsp;</span>
<span class="cline-any cline-no">&nbsp;</span>
<span class="cline-any cline-no">&nbsp;</span>
<span class="cline-any cline-no">&nbsp;</span>
<span class="cline-any cline-no">&nbsp;</span>
<span class="cline-any cline-yes">1x</span>
<span class="cline-any cline-no">&nbsp;</span>
<span class="cline-any cline-no">&nbsp;</span>
<span class="cline-any cline-no">&nbsp;</span>
<span class="cline-any cline-no">&nbsp;</span>
<span class="cline-any cline-no">&nbsp;</span>
<span class="cline-any cline-no">&nbsp;</span>
<span class="cline-any cline-no">&nbsp;</span>
<span class="cline-any cline-yes">1x</span>
<span class="cline-any cline-no">&nbsp;</span>
<span class="cline-any cline-no">&nbsp;</span>
<span class="cline-any cline-no">&nbsp;</span>
<span class="cline-any cline-no">&nbsp;</span>
<span class="cline-any cline-no">&nbsp;</span>
<span class="cline-any cline-no">&nbsp;</span>
<span class="cline-any cline-no">&nbsp;</span>
<span class="cline-any cline-yes">1x</span>
<span class="cline-any cline-no">&nbsp;</span>
<span class="cline-any cline-no">&nbsp;</span>
<span class="cline-any cline-no">&nbsp;</span>
<span class="cline-any cline-no">&nbsp;</span>
<span class="cline-any cline-no">&nbsp;</span>
<span class="cline-any cline-no">&nbsp;</span>
<span class="cline-any cline-no">&nbsp;</span>
<span class="cline-any cline-yes">1x</span>
<span class="cline-any cline-no">&nbsp;</span>
<span class="cline-any cline-no">&nbsp;</span>
<span class="cline-any cline-no">&nbsp;</span>
<span class="cline-any cline-no">&nbsp;</span>
<span class="cline-any cline-no">&nbsp;</span>
<span class="cline-any cline-no">&nbsp;</span>
<span class="cline-any cline-no">&nbsp;</span>
<span class="cline-any cline-no">&nbsp;</span>
<span class="cline-any cline-yes">1x</span> <span class="cline-any cline-yes">1x</span>
<span class="cline-any cline-no">&nbsp;</span> <span class="cline-any cline-no">&nbsp;</span>
<span class="cline-any cline-no">&nbsp;</span> <span class="cline-any cline-no">&nbsp;</span>
@ -417,7 +571,8 @@
<span class="cline-any cline-no">&nbsp;</span> <span class="cline-any cline-no">&nbsp;</span>
<span class="cline-any cline-no">&nbsp;</span> <span class="cline-any cline-no">&nbsp;</span>
<span class="cline-any cline-no">&nbsp;</span> <span class="cline-any cline-no">&nbsp;</span>
<span class="cline-any cline-yes">1x</span> <span class="cline-any cline-no">&nbsp;</span>
<span class="cline-any cline-no">&nbsp;</span>
<span class="cline-any cline-no">&nbsp;</span> <span class="cline-any cline-no">&nbsp;</span>
<span class="cline-any cline-no">&nbsp;</span> <span class="cline-any cline-no">&nbsp;</span>
<span class="cline-any cline-no">&nbsp;</span> <span class="cline-any cline-no">&nbsp;</span>
@ -425,7 +580,7 @@
<span class="cline-any cline-no">&nbsp;</span> <span class="cline-any cline-no">&nbsp;</span>
<span class="cline-any cline-no">&nbsp;</span> <span class="cline-any cline-no">&nbsp;</span>
<span class="cline-any cline-no">&nbsp;</span> <span class="cline-any cline-no">&nbsp;</span>
<span class="cline-any cline-yes">1x</span> <span class="cline-any cline-no">&nbsp;</span>
<span class="cline-any cline-no">&nbsp;</span> <span class="cline-any cline-no">&nbsp;</span>
<span class="cline-any cline-no">&nbsp;</span> <span class="cline-any cline-no">&nbsp;</span>
<span class="cline-any cline-no">&nbsp;</span> <span class="cline-any cline-no">&nbsp;</span>
@ -433,7 +588,8 @@
<span class="cline-any cline-no">&nbsp;</span> <span class="cline-any cline-no">&nbsp;</span>
<span class="cline-any cline-no">&nbsp;</span> <span class="cline-any cline-no">&nbsp;</span>
<span class="cline-any cline-no">&nbsp;</span> <span class="cline-any cline-no">&nbsp;</span>
<span class="cline-any cline-yes">1x</span> <span class="cline-any cline-no">&nbsp;</span>
<span class="cline-any cline-no">&nbsp;</span>
<span class="cline-any cline-no">&nbsp;</span> <span class="cline-any cline-no">&nbsp;</span>
<span class="cline-any cline-no">&nbsp;</span> <span class="cline-any cline-no">&nbsp;</span>
<span class="cline-any cline-no">&nbsp;</span> <span class="cline-any cline-no">&nbsp;</span>
@ -441,7 +597,7 @@
<span class="cline-any cline-no">&nbsp;</span> <span class="cline-any cline-no">&nbsp;</span>
<span class="cline-any cline-no">&nbsp;</span> <span class="cline-any cline-no">&nbsp;</span>
<span class="cline-any cline-no">&nbsp;</span> <span class="cline-any cline-no">&nbsp;</span>
<span class="cline-any cline-yes">1x</span> <span class="cline-any cline-no">&nbsp;</span>
<span class="cline-any cline-no">&nbsp;</span> <span class="cline-any cline-no">&nbsp;</span>
<span class="cline-any cline-no">&nbsp;</span> <span class="cline-any cline-no">&nbsp;</span>
<span class="cline-any cline-no">&nbsp;</span> <span class="cline-any cline-no">&nbsp;</span>
@ -449,7 +605,7 @@
<span class="cline-any cline-no">&nbsp;</span> <span class="cline-any cline-no">&nbsp;</span>
<span class="cline-any cline-no">&nbsp;</span> <span class="cline-any cline-no">&nbsp;</span>
<span class="cline-any cline-no">&nbsp;</span> <span class="cline-any cline-no">&nbsp;</span>
<span class="cline-any cline-yes">1x</span> <span class="cline-any cline-no">&nbsp;</span>
<span class="cline-any cline-no">&nbsp;</span> <span class="cline-any cline-no">&nbsp;</span>
<span class="cline-any cline-no">&nbsp;</span> <span class="cline-any cline-no">&nbsp;</span>
<span class="cline-any cline-no">&nbsp;</span> <span class="cline-any cline-no">&nbsp;</span>
@ -457,7 +613,7 @@
<span class="cline-any cline-no">&nbsp;</span> <span class="cline-any cline-no">&nbsp;</span>
<span class="cline-any cline-no">&nbsp;</span> <span class="cline-any cline-no">&nbsp;</span>
<span class="cline-any cline-no">&nbsp;</span> <span class="cline-any cline-no">&nbsp;</span>
<span class="cline-any cline-yes">1x</span> <span class="cline-any cline-no">&nbsp;</span>
<span class="cline-any cline-no">&nbsp;</span> <span class="cline-any cline-no">&nbsp;</span>
<span class="cline-any cline-no">&nbsp;</span> <span class="cline-any cline-no">&nbsp;</span>
<span class="cline-any cline-no">&nbsp;</span> <span class="cline-any cline-no">&nbsp;</span>
@ -465,7 +621,7 @@
<span class="cline-any cline-no">&nbsp;</span> <span class="cline-any cline-no">&nbsp;</span>
<span class="cline-any cline-no">&nbsp;</span> <span class="cline-any cline-no">&nbsp;</span>
<span class="cline-any cline-no">&nbsp;</span> <span class="cline-any cline-no">&nbsp;</span>
<span class="cline-any cline-yes">1x</span> <span class="cline-any cline-no">&nbsp;</span>
<span class="cline-any cline-no">&nbsp;</span> <span class="cline-any cline-no">&nbsp;</span>
<span class="cline-any cline-no">&nbsp;</span> <span class="cline-any cline-no">&nbsp;</span>
<span class="cline-any cline-no">&nbsp;</span> <span class="cline-any cline-no">&nbsp;</span>
@ -473,10 +629,26 @@
<span class="cline-any cline-no">&nbsp;</span> <span class="cline-any cline-no">&nbsp;</span>
<span class="cline-any cline-no">&nbsp;</span> <span class="cline-any cline-no">&nbsp;</span>
<span class="cline-any cline-no">&nbsp;</span> <span class="cline-any cline-no">&nbsp;</span>
<span class="cline-any cline-no">&nbsp;</span>
<span class="cline-any cline-no">&nbsp;</span>
<span class="cline-any cline-no">&nbsp;</span>
<span class="cline-any cline-no">&nbsp;</span>
<span class="cline-any cline-yes">1x</span> <span class="cline-any cline-yes">1x</span>
<span class="cline-any cline-no">&nbsp;</span> <span class="cline-any cline-no">&nbsp;</span>
<span class="cline-any cline-no">&nbsp;</span> <span class="cline-any cline-no">&nbsp;</span>
<span class="cline-any cline-no">&nbsp;</span> <span class="cline-any cline-no">&nbsp;</span>
<span class="cline-any cline-no">&nbsp;</span>
<span class="cline-any cline-no">&nbsp;</span>
<span class="cline-any cline-no">&nbsp;</span>
<span class="cline-any cline-no">&nbsp;</span>
<span class="cline-any cline-yes">1x</span>
<span class="cline-any cline-no">&nbsp;</span>
<span class="cline-any cline-no">&nbsp;</span>
<span class="cline-any cline-no">&nbsp;</span>
<span class="cline-any cline-no">&nbsp;</span>
<span class="cline-any cline-no">&nbsp;</span>
<span class="cline-any cline-no">&nbsp;</span>
<span class="cline-any cline-no">&nbsp;</span>
<span class="cline-any cline-yes">1x</span> <span class="cline-any cline-yes">1x</span>
<span class="cline-any cline-yes">1x</span> <span class="cline-any cline-yes">1x</span>
<span class="cline-any cline-yes">1x</span> <span class="cline-any cline-yes">1x</span>
@ -579,60 +751,65 @@ import InteractionPlugin from './plugins/InteractionPlugin';
import { Span as SpanClass, Transaction as TransactionClass, httpStatusToSpanStatus, dbStatusToSpanStatus, statusToSpanStatus } from './utils/tracing'; import { Span as SpanClass, Transaction as TransactionClass, httpStatusToSpanStatus, dbStatusToSpanStatus, statusToSpanStatus } from './utils/tracing';
import { serializeBaggage, parseBaggage, createBaggageFromTransaction } from './utils/baggage'; import { serializeBaggage, parseBaggage, createBaggageFromTransaction } from './utils/baggage';
import type { LightConfig, LightClient, SentryEvent, EventLevel, UserInfo, Breadcrumb, LightPlugin, ErrorEvent, PerformanceEvent, NetworkEvent, BehaviorEvent, DSNInfo, TransactionContext, SpanContext, Transaction, Span, SamplingContext, BaggageFields, SpanStatus } from './types'; import type { LightConfig, LightClient, SentryEvent, EventLevel, UserInfo, Breadcrumb, LightPlugin, ErrorEvent, PerformanceEvent, NetworkEvent, BehaviorEvent, DSNInfo, TransactionContext, SpanContext, Transaction, Span, SamplingContext, BaggageFields, SpanStatus } from './types';
import { logDebug, setDebug } from './utils/logger'; import { logDebug, logError, setDebug } from './utils/logger';
import { setAnonymousId as setStoredAnonymousId, clearAnonymousId as clearStoredAnonymousId, getAnonymousId as getStoredAnonymousId } from './utils/identity'; import { setAnonymousId as setStoredAnonymousId, clearAnonymousId as clearStoredAnonymousId, getAnonymousId as getStoredAnonymousId } from './utils/identity';
&nbsp; &nbsp;
let globalClient: LightClient | null = null; let globalClient: LightClient | null = null;
&nbsp; &nbsp;
<span class="cstat-no" title="statement not covered" ><span class="fstat-no" title="function not covered" >function init(config: LightConfig): LightClient {</span></span> <span class="cstat-no" title="statement not covered" ><span class="fstat-no" title="function not covered" >function init(config: LightConfig): LightClient {</span></span>
<span class="cstat-no" title="statement not covered" > setDebug(config.debug === true);</span> <span class="cstat-no" title="statement not covered" > try {</span>
<span class="cstat-no" title="statement not covered" > logDebug('Index', 'init called', { dsn: config.dsn, debug: config.debug });</span> <span class="cstat-no" title="statement not covered" > setDebug(config.debug === true);</span>
<span class="cstat-no" title="statement not covered" > logDebug('Index', 'init called', { dsn: config.dsn, debug: config.debug });</span>
<span class="cstat-no" title="statement not covered" ></span> <span class="cstat-no" title="statement not covered" ></span>
<span class="cstat-no" title="statement not covered" > const client = new Client(config);</span> <span class="cstat-no" title="statement not covered" > const client = new Client(config);</span>
<span class="cstat-no" title="statement not covered" ></span> <span class="cstat-no" title="statement not covered" ></span>
<span class="cstat-no" title="statement not covered" > const defaultPlugins: LightPlugin[] = [</span> <span class="cstat-no" title="statement not covered" > const defaultPlugins: LightPlugin[] = [</span>
<span class="cstat-no" title="statement not covered" > new OfflinePlugin(),</span> <span class="cstat-no" title="statement not covered" > new OfflinePlugin(),</span>
<span class="cstat-no" title="statement not covered" > new SamplingPlugin(),</span> <span class="cstat-no" title="statement not covered" > new SamplingPlugin(),</span>
<span class="cstat-no" title="statement not covered" > new ErrorPlugin(),</span> <span class="cstat-no" title="statement not covered" > new ErrorPlugin(),</span>
<span class="cstat-no" title="statement not covered" > ];</span> <span class="cstat-no" title="statement not covered" > ];</span>
<span class="cstat-no" title="statement not covered" ></span> <span class="cstat-no" title="statement not covered" ></span>
<span class="cstat-no" title="statement not covered" > const pluginNames = config.plugins?.filter(p =&gt; typeof p === 'string') as string[] || [];</span> <span class="cstat-no" title="statement not covered" > const pluginNames = config.plugins?.filter(p =&gt; typeof p === 'string') as string[] || [];</span>
<span class="cstat-no" title="statement not covered" > </span> <span class="cstat-no" title="statement not covered" > </span>
<span class="cstat-no" title="statement not covered" > if (pluginNames.includes('performance') || pluginNames.includes('all')) {</span> <span class="cstat-no" title="statement not covered" > if (pluginNames.includes('performance') || pluginNames.includes('all')) {</span>
<span class="cstat-no" title="statement not covered" > defaultPlugins.push(new PerformancePlugin());</span> <span class="cstat-no" title="statement not covered" > defaultPlugins.push(new PerformancePlugin());</span>
<span class="cstat-no" title="statement not covered" > }</span> <span class="cstat-no" title="statement not covered" > }</span>
<span class="cstat-no" title="statement not covered" > if (pluginNames.includes('network') || pluginNames.includes('all')) {</span> <span class="cstat-no" title="statement not covered" > if (pluginNames.includes('network') || pluginNames.includes('all')) {</span>
<span class="cstat-no" title="statement not covered" > defaultPlugins.push(new NetworkPlugin());</span> <span class="cstat-no" title="statement not covered" > defaultPlugins.push(new NetworkPlugin());</span>
<span class="cstat-no" title="statement not covered" > }</span> <span class="cstat-no" title="statement not covered" > }</span>
<span class="cstat-no" title="statement not covered" > if (pluginNames.includes('behavior') || pluginNames.includes('all')) {</span> <span class="cstat-no" title="statement not covered" > if (pluginNames.includes('behavior') || pluginNames.includes('all')) {</span>
<span class="cstat-no" title="statement not covered" > defaultPlugins.push(new BehaviorPlugin());</span> <span class="cstat-no" title="statement not covered" > defaultPlugins.push(new BehaviorPlugin());</span>
<span class="cstat-no" title="statement not covered" > }</span> <span class="cstat-no" title="statement not covered" > }</span>
<span class="cstat-no" title="statement not covered" > if (pluginNames.includes('router') || pluginNames.includes('all')) {</span> <span class="cstat-no" title="statement not covered" > if (pluginNames.includes('router') || pluginNames.includes('all')) {</span>
<span class="cstat-no" title="statement not covered" > defaultPlugins.push(new RouterPlugin());</span> <span class="cstat-no" title="statement not covered" > defaultPlugins.push(new RouterPlugin());</span>
<span class="cstat-no" title="statement not covered" > }</span> <span class="cstat-no" title="statement not covered" > }</span>
<span class="cstat-no" title="statement not covered" > if (pluginNames.includes('interaction') || pluginNames.includes('all')) {</span> <span class="cstat-no" title="statement not covered" > if (pluginNames.includes('interaction') || pluginNames.includes('all')) {</span>
<span class="cstat-no" title="statement not covered" > defaultPlugins.push(new InteractionPlugin());</span> <span class="cstat-no" title="statement not covered" > defaultPlugins.push(new InteractionPlugin());</span>
<span class="cstat-no" title="statement not covered" > }</span> <span class="cstat-no" title="statement not covered" > }</span>
<span class="cstat-no" title="statement not covered" ></span> <span class="cstat-no" title="statement not covered" ></span>
<span class="cstat-no" title="statement not covered" > logDebug('Index', 'Registering plugins', { count: defaultPlugins.length, plugins: defaultPlugins.map(p =&gt; p.name) });</span> <span class="cstat-no" title="statement not covered" > logDebug('Index', 'Registering plugins', { count: defaultPlugins.length, plugins: defaultPlugins.map(p =&gt; p.name) });</span>
<span class="cstat-no" title="statement not covered" ></span> <span class="cstat-no" title="statement not covered" ></span>
<span class="cstat-no" title="statement not covered" > for (const plugin of defaultPlugins) {</span> <span class="cstat-no" title="statement not covered" > for (const plugin of defaultPlugins) {</span>
<span class="cstat-no" title="statement not covered" > client.use(plugin);</span> <span class="cstat-no" title="statement not covered" > client.use(plugin);</span>
<span class="cstat-no" title="statement not covered" > }</span> <span class="cstat-no" title="statement not covered" > }</span>
<span class="cstat-no" title="statement not covered" ></span> <span class="cstat-no" title="statement not covered" ></span>
<span class="cstat-no" title="statement not covered" > if (config.plugins) {</span> <span class="cstat-no" title="statement not covered" > if (config.plugins) {</span>
<span class="cstat-no" title="statement not covered" > for (const plugin of config.plugins) {</span> <span class="cstat-no" title="statement not covered" > for (const plugin of config.plugins) {</span>
<span class="cstat-no" title="statement not covered" > if (typeof plugin === 'object' &amp;&amp; plugin !== null &amp;&amp; 'name' in plugin &amp;&amp; 'setup' in plugin) {</span> <span class="cstat-no" title="statement not covered" > if (typeof plugin === 'object' &amp;&amp; plugin !== null &amp;&amp; 'name' in plugin &amp;&amp; 'setup' in plugin) {</span>
<span class="cstat-no" title="statement not covered" > client.use(plugin as LightPlugin);</span> <span class="cstat-no" title="statement not covered" > client.use(plugin as LightPlugin);</span>
<span class="cstat-no" title="statement not covered" > }</span>
<span class="cstat-no" title="statement not covered" > }</span> <span class="cstat-no" title="statement not covered" > }</span>
<span class="cstat-no" title="statement not covered" > }</span> <span class="cstat-no" title="statement not covered" > }</span>
<span class="cstat-no" title="statement not covered" ></span>
<span class="cstat-no" title="statement not covered" > client.init();</span>
<span class="cstat-no" title="statement not covered" ></span>
<span class="cstat-no" title="statement not covered" > globalClient = client;</span>
<span class="cstat-no" title="statement not covered" > logDebug('Index', 'init completed, globalClient set');</span>
<span class="cstat-no" title="statement not covered" > return client;</span>
<span class="cstat-no" title="statement not covered" > } catch (e) {</span>
<span class="cstat-no" title="statement not covered" > logError('Index', 'init failed', e);</span>
<span class="cstat-no" title="statement not covered" > throw e;</span>
<span class="cstat-no" title="statement not covered" > }</span> <span class="cstat-no" title="statement not covered" > }</span>
<span class="cstat-no" title="statement not covered" ></span>
<span class="cstat-no" title="statement not covered" > client.init();</span>
<span class="cstat-no" title="statement not covered" ></span>
<span class="cstat-no" title="statement not covered" > globalClient = client;</span>
<span class="cstat-no" title="statement not covered" > logDebug('Index', 'init completed, globalClient set');</span>
<span class="cstat-no" title="statement not covered" > return client;</span>
<span class="cstat-no" title="statement not covered" >}</span> <span class="cstat-no" title="statement not covered" >}</span>
&nbsp; &nbsp;
<span class="cstat-no" title="statement not covered" ><span class="fstat-no" title="function not covered" >function getClient(): LightClient | null {</span></span> <span class="cstat-no" title="statement not covered" ><span class="fstat-no" title="function not covered" >function getClient(): LightClient | null {</span></span>
@ -640,94 +817,175 @@ let globalClient: LightClient | null = null;
<span class="cstat-no" title="statement not covered" >}</span> <span class="cstat-no" title="statement not covered" >}</span>
&nbsp; &nbsp;
<span class="cstat-no" title="statement not covered" ><span class="fstat-no" title="function not covered" >function captureException(error: Error | unknown): void {</span></span> <span class="cstat-no" title="statement not covered" ><span class="fstat-no" title="function not covered" >function captureException(error: Error | unknown): void {</span></span>
<span class="cstat-no" title="statement not covered" > logDebug('Index', 'captureException called', { hasClient: !!globalClient });</span> <span class="cstat-no" title="statement not covered" > try {</span>
<span class="cstat-no" title="statement not covered" > if (!globalClient) {</span> <span class="cstat-no" title="statement not covered" > logDebug('Index', 'captureException called', { hasClient: !!globalClient });</span>
<span class="cstat-no" title="statement not covered" > console.warn('[LightSDK] SDK not initialized. Call LightSentry.init() first.');</span> <span class="cstat-no" title="statement not covered" > if (!globalClient) {</span>
<span class="cstat-no" title="statement not covered" > return;</span> <span class="cstat-no" title="statement not covered" > console.warn('[LightSDK] SDK not initialized. Call LightSentry.init() first.');</span>
<span class="cstat-no" title="statement not covered" > return;</span>
<span class="cstat-no" title="statement not covered" > }</span>
<span class="cstat-no" title="statement not covered" > globalClient.captureException(error);</span>
<span class="cstat-no" title="statement not covered" > } catch (e) {</span>
<span class="cstat-no" title="statement not covered" > logError('Index', 'captureException failed', e);</span>
<span class="cstat-no" title="statement not covered" > }</span> <span class="cstat-no" title="statement not covered" > }</span>
<span class="cstat-no" title="statement not covered" > globalClient.captureException(error);</span>
<span class="cstat-no" title="statement not covered" >}</span> <span class="cstat-no" title="statement not covered" >}</span>
&nbsp; &nbsp;
<span class="cstat-no" title="statement not covered" ><span class="fstat-no" title="function not covered" >function captureMessage(message: string, level?: EventLevel): void {</span></span> <span class="cstat-no" title="statement not covered" ><span class="fstat-no" title="function not covered" >function captureMessage(message: string, level?: EventLevel): void {</span></span>
<span class="cstat-no" title="statement not covered" > logDebug('Index', 'captureMessage called', { hasClient: !!globalClient });</span> <span class="cstat-no" title="statement not covered" > try {</span>
<span class="cstat-no" title="statement not covered" > if (!globalClient) {</span> <span class="cstat-no" title="statement not covered" > logDebug('Index', 'captureMessage called', { hasClient: !!globalClient });</span>
<span class="cstat-no" title="statement not covered" > console.warn('[LightSDK] SDK not initialized. Call LightSentry.init() first.');</span> <span class="cstat-no" title="statement not covered" > if (!globalClient) {</span>
<span class="cstat-no" title="statement not covered" > return;</span> <span class="cstat-no" title="statement not covered" > console.warn('[LightSDK] SDK not initialized. Call LightSentry.init() first.');</span>
<span class="cstat-no" title="statement not covered" > return;</span>
<span class="cstat-no" title="statement not covered" > }</span>
<span class="cstat-no" title="statement not covered" > globalClient.captureMessage(message, level);</span>
<span class="cstat-no" title="statement not covered" > } catch (e) {</span>
<span class="cstat-no" title="statement not covered" > logError('Index', 'captureMessage failed', e);</span>
<span class="cstat-no" title="statement not covered" > }</span> <span class="cstat-no" title="statement not covered" > }</span>
<span class="cstat-no" title="statement not covered" > globalClient.captureMessage(message, level);</span>
<span class="cstat-no" title="statement not covered" >}</span> <span class="cstat-no" title="statement not covered" >}</span>
&nbsp; &nbsp;
<span class="cstat-no" title="statement not covered" ><span class="fstat-no" title="function not covered" >function captureEvent(event: Partial&lt;SentryEvent&gt; &amp; { type: string }): void {</span></span> <span class="cstat-no" title="statement not covered" ><span class="fstat-no" title="function not covered" >function captureEvent(event: Partial&lt;SentryEvent&gt; &amp; { type: string }): void {</span></span>
<span class="cstat-no" title="statement not covered" > logDebug('Index', 'captureEvent called', { hasClient: !!globalClient });</span> <span class="cstat-no" title="statement not covered" > try {</span>
<span class="cstat-no" title="statement not covered" > if (!globalClient) {</span> <span class="cstat-no" title="statement not covered" > logDebug('Index', 'captureEvent called', { hasClient: !!globalClient });</span>
<span class="cstat-no" title="statement not covered" > console.warn('[LightSDK] SDK not initialized. Call LightSentry.init() first.');</span> <span class="cstat-no" title="statement not covered" > if (!globalClient) {</span>
<span class="cstat-no" title="statement not covered" > return;</span> <span class="cstat-no" title="statement not covered" > console.warn('[LightSDK] SDK not initialized. Call LightSentry.init() first.');</span>
<span class="cstat-no" title="statement not covered" > return;</span>
<span class="cstat-no" title="statement not covered" > }</span>
<span class="cstat-no" title="statement not covered" > globalClient.captureEvent(event);</span>
<span class="cstat-no" title="statement not covered" > } catch (e) {</span>
<span class="cstat-no" title="statement not covered" > logError('Index', 'captureEvent failed', e);</span>
<span class="cstat-no" title="statement not covered" > }</span> <span class="cstat-no" title="statement not covered" > }</span>
<span class="cstat-no" title="statement not covered" > globalClient.captureEvent(event);</span>
<span class="cstat-no" title="statement not covered" >}</span> <span class="cstat-no" title="statement not covered" >}</span>
&nbsp; &nbsp;
<span class="cstat-no" title="statement not covered" ><span class="fstat-no" title="function not covered" >function setUser(user: UserInfo | null): void {</span></span> <span class="cstat-no" title="statement not covered" ><span class="fstat-no" title="function not covered" >function setUser(user: UserInfo | null): void {</span></span>
<span class="cstat-no" title="statement not covered" > globalClient?.setUser(user);</span> <span class="cstat-no" title="statement not covered" > try {</span>
<span class="cstat-no" title="statement not covered" > globalClient?.setUser(user);</span>
<span class="cstat-no" title="statement not covered" > } catch (e) {</span>
<span class="cstat-no" title="statement not covered" > logError('Index', 'setUser failed', e);</span>
<span class="cstat-no" title="statement not covered" > }</span>
<span class="cstat-no" title="statement not covered" >}</span> <span class="cstat-no" title="statement not covered" >}</span>
&nbsp; &nbsp;
<span class="cstat-no" title="statement not covered" ><span class="fstat-no" title="function not covered" >function setAnonymousId(id: string): void {</span></span> <span class="cstat-no" title="statement not covered" ><span class="fstat-no" title="function not covered" >function setAnonymousId(id: string): void {</span></span>
<span class="cstat-no" title="statement not covered" > setStoredAnonymousId(id);</span> <span class="cstat-no" title="statement not covered" > try {</span>
<span class="cstat-no" title="statement not covered" > setStoredAnonymousId(id);</span>
<span class="cstat-no" title="statement not covered" > } catch (e) {</span>
<span class="cstat-no" title="statement not covered" > logError('Index', 'setAnonymousId failed', e);</span>
<span class="cstat-no" title="statement not covered" > }</span>
<span class="cstat-no" title="statement not covered" >}</span> <span class="cstat-no" title="statement not covered" >}</span>
&nbsp; &nbsp;
<span class="cstat-no" title="statement not covered" ><span class="fstat-no" title="function not covered" >function clearAnonymousId(): void {</span></span> <span class="cstat-no" title="statement not covered" ><span class="fstat-no" title="function not covered" >function clearAnonymousId(): void {</span></span>
<span class="cstat-no" title="statement not covered" > clearStoredAnonymousId();</span> <span class="cstat-no" title="statement not covered" > try {</span>
<span class="cstat-no" title="statement not covered" > clearStoredAnonymousId();</span>
<span class="cstat-no" title="statement not covered" > } catch (e) {</span>
<span class="cstat-no" title="statement not covered" > logError('Index', 'clearAnonymousId failed', e);</span>
<span class="cstat-no" title="statement not covered" > }</span>
<span class="cstat-no" title="statement not covered" >}</span> <span class="cstat-no" title="statement not covered" >}</span>
&nbsp; &nbsp;
<span class="cstat-no" title="statement not covered" ><span class="fstat-no" title="function not covered" >function getAnonymousId(): string | null {</span></span> <span class="cstat-no" title="statement not covered" ><span class="fstat-no" title="function not covered" >function getAnonymousId(): string | null {</span></span>
<span class="cstat-no" title="statement not covered" > return getStoredAnonymousId();</span> <span class="cstat-no" title="statement not covered" > try {</span>
<span class="cstat-no" title="statement not covered" > return getStoredAnonymousId();</span>
<span class="cstat-no" title="statement not covered" > } catch (e) {</span>
<span class="cstat-no" title="statement not covered" > logError('Index', 'getAnonymousId failed', e);</span>
<span class="cstat-no" title="statement not covered" > return null;</span>
<span class="cstat-no" title="statement not covered" > }</span>
<span class="cstat-no" title="statement not covered" >}</span> <span class="cstat-no" title="statement not covered" >}</span>
&nbsp; &nbsp;
<span class="cstat-no" title="statement not covered" ><span class="fstat-no" title="function not covered" >function startTransaction(context: TransactionContext): Transaction | null {</span></span> <span class="cstat-no" title="statement not covered" ><span class="fstat-no" title="function not covered" >function startTransaction(context: TransactionContext): Transaction | null {</span></span>
<span class="cstat-no" title="statement not covered" > return globalClient?.startTransaction(context) || null;</span> <span class="cstat-no" title="statement not covered" > try {</span>
<span class="cstat-no" title="statement not covered" > return globalClient?.startTransaction(context) || null;</span>
<span class="cstat-no" title="statement not covered" > } catch (e) {</span>
<span class="cstat-no" title="statement not covered" > logError('Index', 'startTransaction failed', e);</span>
<span class="cstat-no" title="statement not covered" > return null;</span>
<span class="cstat-no" title="statement not covered" > }</span>
<span class="cstat-no" title="statement not covered" >}</span> <span class="cstat-no" title="statement not covered" >}</span>
&nbsp; &nbsp;
<span class="cstat-no" title="statement not covered" ><span class="fstat-no" title="function not covered" >function getCurrentTransaction(): Transaction | null {</span></span> <span class="cstat-no" title="statement not covered" ><span class="fstat-no" title="function not covered" >function getCurrentTransaction(): Transaction | null {</span></span>
<span class="cstat-no" title="statement not covered" > return globalClient?.getCurrentTransaction() || null;</span> <span class="cstat-no" title="statement not covered" > try {</span>
<span class="cstat-no" title="statement not covered" > return globalClient?.getCurrentTransaction() || null;</span>
<span class="cstat-no" title="statement not covered" > } catch (e) {</span>
<span class="cstat-no" title="statement not covered" > logError('Index', 'getCurrentTransaction failed', e);</span>
<span class="cstat-no" title="statement not covered" > return null;</span>
<span class="cstat-no" title="statement not covered" > }</span>
<span class="cstat-no" title="statement not covered" >}</span> <span class="cstat-no" title="statement not covered" >}</span>
&nbsp; &nbsp;
<span class="cstat-no" title="statement not covered" ><span class="fstat-no" title="function not covered" >function getCurrentSpan(): Span | null {</span></span> <span class="cstat-no" title="statement not covered" ><span class="fstat-no" title="function not covered" >function getCurrentSpan(): Span | null {</span></span>
<span class="cstat-no" title="statement not covered" > return globalClient?.getCurrentSpan() || null;</span> <span class="cstat-no" title="statement not covered" > try {</span>
<span class="cstat-no" title="statement not covered" > return globalClient?.getCurrentSpan() || null;</span>
<span class="cstat-no" title="statement not covered" > } catch (e) {</span>
<span class="cstat-no" title="statement not covered" > logError('Index', 'getCurrentSpan failed', e);</span>
<span class="cstat-no" title="statement not covered" > return null;</span>
<span class="cstat-no" title="statement not covered" > }</span>
<span class="cstat-no" title="statement not covered" >}</span> <span class="cstat-no" title="statement not covered" >}</span>
&nbsp; &nbsp;
<span class="cstat-no" title="statement not covered" ><span class="fstat-no" title="function not covered" >function setSpan(span: Span | null): void {</span></span> <span class="cstat-no" title="statement not covered" ><span class="fstat-no" title="function not covered" >function setSpan(span: Span | null): void {</span></span>
<span class="cstat-no" title="statement not covered" > globalClient?.setSpan(span);</span> <span class="cstat-no" title="statement not covered" > try {</span>
<span class="cstat-no" title="statement not covered" > globalClient?.setSpan(span);</span>
<span class="cstat-no" title="statement not covered" > } catch (e) {</span>
<span class="cstat-no" title="statement not covered" > logError('Index', 'setSpan failed', e);</span>
<span class="cstat-no" title="statement not covered" > }</span>
<span class="cstat-no" title="statement not covered" >}</span> <span class="cstat-no" title="statement not covered" >}</span>
&nbsp; &nbsp;
<span class="cstat-no" title="statement not covered" ><span class="fstat-no" title="function not covered" >function startSpan(context: SpanContext): Span | null {</span></span> <span class="cstat-no" title="statement not covered" ><span class="fstat-no" title="function not covered" >function startSpan(context: SpanContext): Span | null {</span></span>
<span class="cstat-no" title="statement not covered" > return globalClient?.startSpan(context) || null;</span> <span class="cstat-no" title="statement not covered" > try {</span>
<span class="cstat-no" title="statement not covered" > return globalClient?.startSpan(context) || null;</span>
<span class="cstat-no" title="statement not covered" > } catch (e) {</span>
<span class="cstat-no" title="statement not covered" > logError('Index', 'startSpan failed', e);</span>
<span class="cstat-no" title="statement not covered" > return null;</span>
<span class="cstat-no" title="statement not covered" > }</span>
<span class="cstat-no" title="statement not covered" >}</span> <span class="cstat-no" title="statement not covered" >}</span>
&nbsp; &nbsp;
<span class="cstat-no" title="statement not covered" ><span class="fstat-no" title="function not covered" >function setTag(key: string, value: string): void {</span></span> <span class="cstat-no" title="statement not covered" ><span class="fstat-no" title="function not covered" >function setTag(key: string, value: string): void {</span></span>
<span class="cstat-no" title="statement not covered" > globalClient?.setTag(key, value);</span> <span class="cstat-no" title="statement not covered" > try {</span>
<span class="cstat-no" title="statement not covered" > globalClient?.setTag(key, value);</span>
<span class="cstat-no" title="statement not covered" > } catch (e) {</span>
<span class="cstat-no" title="statement not covered" > logError('Index', 'setTag failed', e);</span>
<span class="cstat-no" title="statement not covered" > }</span>
<span class="cstat-no" title="statement not covered" >}</span> <span class="cstat-no" title="statement not covered" >}</span>
&nbsp; &nbsp;
<span class="cstat-no" title="statement not covered" ><span class="fstat-no" title="function not covered" >function setTags(tags: Record&lt;string, string&gt;): void {</span></span> <span class="cstat-no" title="statement not covered" ><span class="fstat-no" title="function not covered" >function setTags(tags: Record&lt;string, string&gt;): void {</span></span>
<span class="cstat-no" title="statement not covered" > globalClient?.setTags(tags);</span> <span class="cstat-no" title="statement not covered" > try {</span>
<span class="cstat-no" title="statement not covered" > globalClient?.setTags(tags);</span>
<span class="cstat-no" title="statement not covered" > } catch (e) {</span>
<span class="cstat-no" title="statement not covered" > logError('Index', 'setTags failed', e);</span>
<span class="cstat-no" title="statement not covered" > }</span>
<span class="cstat-no" title="statement not covered" >}</span> <span class="cstat-no" title="statement not covered" >}</span>
&nbsp; &nbsp;
<span class="cstat-no" title="statement not covered" ><span class="fstat-no" title="function not covered" >function setExtra(key: string, value: unknown): void {</span></span> <span class="cstat-no" title="statement not covered" ><span class="fstat-no" title="function not covered" >function setExtra(key: string, value: unknown): void {</span></span>
<span class="cstat-no" title="statement not covered" > globalClient?.setExtra(key, value);</span> <span class="cstat-no" title="statement not covered" > try {</span>
<span class="cstat-no" title="statement not covered" > globalClient?.setExtra(key, value);</span>
<span class="cstat-no" title="statement not covered" > } catch (e) {</span>
<span class="cstat-no" title="statement not covered" > logError('Index', 'setExtra failed', e);</span>
<span class="cstat-no" title="statement not covered" > }</span>
<span class="cstat-no" title="statement not covered" >}</span> <span class="cstat-no" title="statement not covered" >}</span>
&nbsp; &nbsp;
<span class="cstat-no" title="statement not covered" ><span class="fstat-no" title="function not covered" >function addBreadcrumb(breadcrumb: Omit&lt;Breadcrumb, 'timestamp'&gt;): void {</span></span> <span class="cstat-no" title="statement not covered" ><span class="fstat-no" title="function not covered" >function addBreadcrumb(breadcrumb: Omit&lt;Breadcrumb, 'timestamp'&gt;): void {</span></span>
<span class="cstat-no" title="statement not covered" > globalClient?.addBreadcrumb(breadcrumb);</span> <span class="cstat-no" title="statement not covered" > try {</span>
<span class="cstat-no" title="statement not covered" > globalClient?.addBreadcrumb(breadcrumb);</span>
<span class="cstat-no" title="statement not covered" > } catch (e) {</span>
<span class="cstat-no" title="statement not covered" > logError('Index', 'addBreadcrumb failed', e);</span>
<span class="cstat-no" title="statement not covered" > }</span>
<span class="cstat-no" title="statement not covered" >}</span> <span class="cstat-no" title="statement not covered" >}</span>
&nbsp; &nbsp;
<span class="cstat-no" title="statement not covered" ><span class="fstat-no" title="function not covered" >async function flush(): Promise&lt;void&gt; {</span></span> <span class="cstat-no" title="statement not covered" ><span class="fstat-no" title="function not covered" >async function flush(): Promise&lt;void&gt; {</span></span>
<span class="cstat-no" title="statement not covered" > await globalClient?.flush();</span> <span class="cstat-no" title="statement not covered" > try {</span>
<span class="cstat-no" title="statement not covered" > await globalClient?.flush();</span>
<span class="cstat-no" title="statement not covered" > } catch (e) {</span>
<span class="cstat-no" title="statement not covered" > logError('Index', 'flush failed', e);</span>
<span class="cstat-no" title="statement not covered" > }</span>
<span class="cstat-no" title="statement not covered" >}</span> <span class="cstat-no" title="statement not covered" >}</span>
&nbsp; &nbsp;
<span class="cstat-no" title="statement not covered" ><span class="fstat-no" title="function not covered" >function disable(): void {</span></span> <span class="cstat-no" title="statement not covered" ><span class="fstat-no" title="function not covered" >function disable(): void {</span></span>
<span class="cstat-no" title="statement not covered" > globalClient?.disable();</span> <span class="cstat-no" title="statement not covered" > try {</span>
<span class="cstat-no" title="statement not covered" > globalClient?.disable();</span>
<span class="cstat-no" title="statement not covered" > } catch (e) {</span>
<span class="cstat-no" title="statement not covered" > logError('Index', 'disable failed', e);</span>
<span class="cstat-no" title="statement not covered" > }</span>
<span class="cstat-no" title="statement not covered" >}</span> <span class="cstat-no" title="statement not covered" >}</span>
&nbsp; &nbsp;
<span class="cstat-no" title="statement not covered" ><span class="fstat-no" title="function not covered" >function enable(): void {</span></span> <span class="cstat-no" title="statement not covered" ><span class="fstat-no" title="function not covered" >function enable(): void {</span></span>
<span class="cstat-no" title="statement not covered" > globalClient?.enable();</span> <span class="cstat-no" title="statement not covered" > try {</span>
<span class="cstat-no" title="statement not covered" > globalClient?.enable();</span>
<span class="cstat-no" title="statement not covered" > } catch (e) {</span>
<span class="cstat-no" title="statement not covered" > logError('Index', 'enable failed', e);</span>
<span class="cstat-no" title="statement not covered" > }</span>
<span class="cstat-no" title="statement not covered" >}</span> <span class="cstat-no" title="statement not covered" >}</span>
&nbsp; &nbsp;
export { export {
@ -826,7 +1084,7 @@ export default {
<div class='footer quiet pad2 space-top1 center small'> <div class='footer quiet pad2 space-top1 center small'>
Code coverage generated by Code coverage generated by
<a href="https://istanbul.js.org/" target="_blank" rel="noopener noreferrer">istanbul</a> <a href="https://istanbul.js.org/" target="_blank" rel="noopener noreferrer">istanbul</a>
at 2026-06-25T14:49:54.914Z at 2026-06-25T15:09:05.618Z
</div> </div>
<script src="../prettify.js"></script> <script src="../prettify.js"></script>
<script> <script>

View File

@ -1075,7 +1075,7 @@ export default BehaviorPlugin;
<div class='footer quiet pad2 space-top1 center small'> <div class='footer quiet pad2 space-top1 center small'>
Code coverage generated by Code coverage generated by
<a href="https://istanbul.js.org/" target="_blank" rel="noopener noreferrer">istanbul</a> <a href="https://istanbul.js.org/" target="_blank" rel="noopener noreferrer">istanbul</a>
at 2026-06-25T14:49:54.914Z at 2026-06-25T15:09:05.618Z
</div> </div>
<script src="../../prettify.js"></script> <script src="../../prettify.js"></script>
<script> <script>

View File

@ -967,7 +967,7 @@ export default ErrorPlugin;
<div class='footer quiet pad2 space-top1 center small'> <div class='footer quiet pad2 space-top1 center small'>
Code coverage generated by Code coverage generated by
<a href="https://istanbul.js.org/" target="_blank" rel="noopener noreferrer">istanbul</a> <a href="https://istanbul.js.org/" target="_blank" rel="noopener noreferrer">istanbul</a>
at 2026-06-25T14:49:54.914Z at 2026-06-25T15:09:05.618Z
</div> </div>
<script src="../../prettify.js"></script> <script src="../../prettify.js"></script>
<script> <script>

View File

@ -691,7 +691,7 @@ export default InteractionPlugin;
<div class='footer quiet pad2 space-top1 center small'> <div class='footer quiet pad2 space-top1 center small'>
Code coverage generated by Code coverage generated by
<a href="https://istanbul.js.org/" target="_blank" rel="noopener noreferrer">istanbul</a> <a href="https://istanbul.js.org/" target="_blank" rel="noopener noreferrer">istanbul</a>
at 2026-06-25T14:49:54.914Z at 2026-06-25T15:09:05.618Z
</div> </div>
<script src="../../prettify.js"></script> <script src="../../prettify.js"></script>
<script> <script>

View File

@ -1222,7 +1222,7 @@ export default NetworkPlugin;
<div class='footer quiet pad2 space-top1 center small'> <div class='footer quiet pad2 space-top1 center small'>
Code coverage generated by Code coverage generated by
<a href="https://istanbul.js.org/" target="_blank" rel="noopener noreferrer">istanbul</a> <a href="https://istanbul.js.org/" target="_blank" rel="noopener noreferrer">istanbul</a>
at 2026-06-25T14:49:54.914Z at 2026-06-25T15:09:05.618Z
</div> </div>
<script src="../../prettify.js"></script> <script src="../../prettify.js"></script>
<script> <script>

View File

@ -982,7 +982,7 @@ export default OfflinePlugin;
<div class='footer quiet pad2 space-top1 center small'> <div class='footer quiet pad2 space-top1 center small'>
Code coverage generated by Code coverage generated by
<a href="https://istanbul.js.org/" target="_blank" rel="noopener noreferrer">istanbul</a> <a href="https://istanbul.js.org/" target="_blank" rel="noopener noreferrer">istanbul</a>
at 2026-06-25T14:49:54.914Z at 2026-06-25T15:09:05.618Z
</div> </div>
<script src="../../prettify.js"></script> <script src="../../prettify.js"></script>
<script> <script>

View File

@ -1660,7 +1660,7 @@ export default PerformancePlugin;
<div class='footer quiet pad2 space-top1 center small'> <div class='footer quiet pad2 space-top1 center small'>
Code coverage generated by Code coverage generated by
<a href="https://istanbul.js.org/" target="_blank" rel="noopener noreferrer">istanbul</a> <a href="https://istanbul.js.org/" target="_blank" rel="noopener noreferrer">istanbul</a>
at 2026-06-25T14:49:54.914Z at 2026-06-25T15:09:05.618Z
</div> </div>
<script src="../../prettify.js"></script> <script src="../../prettify.js"></script>
<script> <script>

View File

@ -613,7 +613,7 @@ export default RouterPlugin;
<div class='footer quiet pad2 space-top1 center small'> <div class='footer quiet pad2 space-top1 center small'>
Code coverage generated by Code coverage generated by
<a href="https://istanbul.js.org/" target="_blank" rel="noopener noreferrer">istanbul</a> <a href="https://istanbul.js.org/" target="_blank" rel="noopener noreferrer">istanbul</a>
at 2026-06-25T14:49:54.914Z at 2026-06-25T15:09:05.618Z
</div> </div>
<script src="../../prettify.js"></script> <script src="../../prettify.js"></script>
<script> <script>

View File

@ -352,7 +352,7 @@ export default SamplingPlugin;
<div class='footer quiet pad2 space-top1 center small'> <div class='footer quiet pad2 space-top1 center small'>
Code coverage generated by Code coverage generated by
<a href="https://istanbul.js.org/" target="_blank" rel="noopener noreferrer">istanbul</a> <a href="https://istanbul.js.org/" target="_blank" rel="noopener noreferrer">istanbul</a>
at 2026-06-25T14:49:54.914Z at 2026-06-25T15:09:05.618Z
</div> </div>
<script src="../../prettify.js"></script> <script src="../../prettify.js"></script>
<script> <script>

View File

@ -206,7 +206,7 @@
<div class='footer quiet pad2 space-top1 center small'> <div class='footer quiet pad2 space-top1 center small'>
Code coverage generated by Code coverage generated by
<a href="https://istanbul.js.org/" target="_blank" rel="noopener noreferrer">istanbul</a> <a href="https://istanbul.js.org/" target="_blank" rel="noopener noreferrer">istanbul</a>
at 2026-06-25T14:49:54.914Z at 2026-06-25T15:09:05.618Z
</div> </div>
<script src="../../prettify.js"></script> <script src="../../prettify.js"></script>
<script> <script>

View File

@ -367,7 +367,7 @@ export function createBaggageFromTransaction(
<div class='footer quiet pad2 space-top1 center small'> <div class='footer quiet pad2 space-top1 center small'>
Code coverage generated by Code coverage generated by
<a href="https://istanbul.js.org/" target="_blank" rel="noopener noreferrer">istanbul</a> <a href="https://istanbul.js.org/" target="_blank" rel="noopener noreferrer">istanbul</a>
at 2026-06-25T14:49:54.914Z at 2026-06-25T15:09:05.618Z
</div> </div>
<script src="../../prettify.js"></script> <script src="../../prettify.js"></script>
<script> <script>

View File

@ -95,24 +95,24 @@
<a name='L30'></a><a href='#L30'>30</a></td><td class="line-coverage quiet"><span class="cline-any cline-yes">1x</span> <a name='L30'></a><a href='#L30'>30</a></td><td class="line-coverage quiet"><span class="cline-any cline-yes">1x</span>
<span class="cline-any cline-yes">1x</span> <span class="cline-any cline-yes">1x</span>
<span class="cline-any cline-yes">1x</span> <span class="cline-any cline-yes">1x</span>
<span class="cline-any cline-yes">5x</span> <span class="cline-any cline-yes">37x</span>
<span class="cline-any cline-yes">5x</span> <span class="cline-any cline-yes">37x</span>
<span class="cline-any cline-yes">5x</span> <span class="cline-any cline-yes">37x</span>
<span class="cline-any cline-yes">2x</span> <span class="cline-any cline-yes">2x</span>
<span class="cline-any cline-yes">2x</span> <span class="cline-any cline-yes">2x</span>
<span class="cline-any cline-yes">3x</span> <span class="cline-any cline-yes">35x</span>
<span class="cline-any cline-yes">3x</span> <span class="cline-any cline-yes">35x</span>
<span class="cline-any cline-yes">3x</span> <span class="cline-any cline-yes">35x</span>
<span class="cline-any cline-yes">3x</span> <span class="cline-any cline-yes">35x</span>
<span class="cline-any cline-yes">3x</span> <span class="cline-any cline-yes">35x</span>
<span class="cline-any cline-yes">3x</span> <span class="cline-any cline-yes">35x</span>
<span class="cline-any cline-yes">3x</span> <span class="cline-any cline-yes">35x</span>
<span class="cline-any cline-yes">3x</span> <span class="cline-any cline-yes">35x</span>
<span class="cline-any cline-yes">3x</span> <span class="cline-any cline-yes">35x</span>
<span class="cline-any cline-yes">5x</span> <span class="cline-any cline-yes">37x</span>
<span class="cline-any cline-yes">2x</span> <span class="cline-any cline-yes">2x</span>
<span class="cline-any cline-yes">2x</span> <span class="cline-any cline-yes">2x</span>
<span class="cline-any cline-yes">5x</span> <span class="cline-any cline-yes">37x</span>
<span class="cline-any cline-yes">1x</span> <span class="cline-any cline-yes">1x</span>
<span class="cline-any cline-yes">1x</span> <span class="cline-any cline-yes">1x</span>
<span class="cline-any cline-yes">2x</span> <span class="cline-any cline-yes">2x</span>
@ -157,7 +157,7 @@ export <span class="fstat-no" title="function not covered" >function getStoreUrl
<div class='footer quiet pad2 space-top1 center small'> <div class='footer quiet pad2 space-top1 center small'>
Code coverage generated by Code coverage generated by
<a href="https://istanbul.js.org/" target="_blank" rel="noopener noreferrer">istanbul</a> <a href="https://istanbul.js.org/" target="_blank" rel="noopener noreferrer">istanbul</a>
at 2026-06-25T14:49:54.914Z at 2026-06-25T15:09:05.618Z
</div> </div>
<script src="../../prettify.js"></script> <script src="../../prettify.js"></script>
<script> <script>

View File

@ -949,7 +949,7 @@ export function getContextId(): string {
<div class='footer quiet pad2 space-top1 center small'> <div class='footer quiet pad2 space-top1 center small'>
Code coverage generated by Code coverage generated by
<a href="https://istanbul.js.org/" target="_blank" rel="noopener noreferrer">istanbul</a> <a href="https://istanbul.js.org/" target="_blank" rel="noopener noreferrer">istanbul</a>
at 2026-06-25T14:49:54.914Z at 2026-06-25T15:09:05.618Z
</div> </div>
<script src="../../prettify.js"></script> <script src="../../prettify.js"></script>
<script> <script>

View File

@ -334,7 +334,7 @@ export function decodeFields(obj: Record&lt;string, unknown&gt;): Record&lt;stri
<div class='footer quiet pad2 space-top1 center small'> <div class='footer quiet pad2 space-top1 center small'>
Code coverage generated by Code coverage generated by
<a href="https://istanbul.js.org/" target="_blank" rel="noopener noreferrer">istanbul</a> <a href="https://istanbul.js.org/" target="_blank" rel="noopener noreferrer">istanbul</a>
at 2026-06-25T14:49:54.914Z at 2026-06-25T15:09:05.618Z
</div> </div>
<script src="../../prettify.js"></script> <script src="../../prettify.js"></script>
<script> <script>

View File

@ -130,7 +130,7 @@ export function computeFingerprint(type: string, message: string, frames: { file
<div class='footer quiet pad2 space-top1 center small'> <div class='footer quiet pad2 space-top1 center small'>
Code coverage generated by Code coverage generated by
<a href="https://istanbul.js.org/" target="_blank" rel="noopener noreferrer">istanbul</a> <a href="https://istanbul.js.org/" target="_blank" rel="noopener noreferrer">istanbul</a>
at 2026-06-25T14:49:54.914Z at 2026-06-25T15:09:05.618Z
</div> </div>
<script src="../../prettify.js"></script> <script src="../../prettify.js"></script>
<script> <script>

View File

@ -122,13 +122,13 @@
<span class="cline-any cline-yes">3x</span> <span class="cline-any cline-yes">3x</span>
<span class="cline-any cline-yes">1x</span> <span class="cline-any cline-yes">1x</span>
<span class="cline-any cline-yes">1x</span> <span class="cline-any cline-yes">1x</span>
<span class="cline-any cline-yes">293x</span> <span class="cline-any cline-yes">308x</span>
<span class="cline-any cline-yes">293x</span> <span class="cline-any cline-yes">308x</span>
<span class="cline-any cline-yes">1x</span> <span class="cline-any cline-yes">1x</span>
<span class="cline-any cline-yes">1x</span> <span class="cline-any cline-yes">1x</span>
<span class="cline-any cline-yes">190x</span> <span class="cline-any cline-yes">192x</span>
<span class="cline-any cline-yes">190x</span> <span class="cline-any cline-yes">192x</span>
<span class="cline-any cline-yes">190x</span> <span class="cline-any cline-yes">192x</span>
<span class="cline-any cline-no">&nbsp;</span> <span class="cline-any cline-no">&nbsp;</span>
<span class="cline-any cline-no">&nbsp;</span> <span class="cline-any cline-no">&nbsp;</span>
<span class="cline-any cline-yes">1x</span> <span class="cline-any cline-yes">1x</span>
@ -159,7 +159,7 @@
<span class="cline-any cline-yes">1x</span> <span class="cline-any cline-yes">1x</span>
<span class="cline-any cline-yes">1x</span> <span class="cline-any cline-yes">1x</span>
<span class="cline-any cline-yes">1x</span> <span class="cline-any cline-yes">1x</span>
<span class="cline-any cline-yes">15x</span> <span class="cline-any cline-yes">18x</span>
<span class="cline-any cline-yes">13x</span> <span class="cline-any cline-yes">13x</span>
<span class="cline-any cline-yes">18x</span> <span class="cline-any cline-yes">18x</span>
<span class="cline-any cline-yes">11x</span> <span class="cline-any cline-yes">11x</span>
@ -226,7 +226,7 @@ export function matchPatterns(value: string, patterns: (string | RegExp)[]): boo
<div class='footer quiet pad2 space-top1 center small'> <div class='footer quiet pad2 space-top1 center small'>
Code coverage generated by Code coverage generated by
<a href="https://istanbul.js.org/" target="_blank" rel="noopener noreferrer">istanbul</a> <a href="https://istanbul.js.org/" target="_blank" rel="noopener noreferrer">istanbul</a>
at 2026-06-25T14:49:54.914Z at 2026-06-25T15:09:05.618Z
</div> </div>
<script src="../../prettify.js"></script> <script src="../../prettify.js"></script>
<script> <script>

View File

@ -167,17 +167,17 @@
<span class="cline-any cline-yes">1x</span> <span class="cline-any cline-yes">1x</span>
<span class="cline-any cline-yes">1x</span> <span class="cline-any cline-yes">1x</span>
<span class="cline-any cline-yes">1x</span> <span class="cline-any cline-yes">1x</span>
<span class="cline-any cline-yes">6x</span> <span class="cline-any cline-yes">7x</span>
<span class="cline-any cline-yes">1x</span>
<span class="cline-any cline-yes">1x</span>
<span class="cline-any cline-yes">5x</span>
<span class="cline-any cline-yes">5x</span>
<span class="cline-any cline-yes">5x</span>
<span class="cline-any cline-yes">5x</span>
<span class="cline-any cline-yes">6x</span>
<span class="cline-any cline-yes">1x</span> <span class="cline-any cline-yes">1x</span>
<span class="cline-any cline-yes">1x</span> <span class="cline-any cline-yes">1x</span>
<span class="cline-any cline-yes">6x</span> <span class="cline-any cline-yes">6x</span>
<span class="cline-any cline-yes">6x</span>
<span class="cline-any cline-yes">6x</span>
<span class="cline-any cline-yes">6x</span>
<span class="cline-any cline-yes">7x</span>
<span class="cline-any cline-yes">1x</span>
<span class="cline-any cline-yes">1x</span>
<span class="cline-any cline-yes">7x</span>
<span class="cline-any cline-yes">1x</span> <span class="cline-any cline-yes">1x</span>
<span class="cline-any cline-yes">1x</span> <span class="cline-any cline-yes">1x</span>
<span class="cline-any cline-yes">1x</span> <span class="cline-any cline-yes">1x</span>
@ -280,7 +280,7 @@ export function isAnonymousTrackingEnabled(config: { trackAnonymousUsers?: boole
<div class='footer quiet pad2 space-top1 center small'> <div class='footer quiet pad2 space-top1 center small'>
Code coverage generated by Code coverage generated by
<a href="https://istanbul.js.org/" target="_blank" rel="noopener noreferrer">istanbul</a> <a href="https://istanbul.js.org/" target="_blank" rel="noopener noreferrer">istanbul</a>
at 2026-06-25T14:49:54.914Z at 2026-06-25T15:09:05.618Z
</div> </div>
<script src="../../prettify.js"></script> <script src="../../prettify.js"></script>
<script> <script>

View File

@ -23,16 +23,16 @@
<div class='clearfix'> <div class='clearfix'>
<div class='fl pad1y space-right2'> <div class='fl pad1y space-right2'>
<span class="strong">97.36% </span> <span class="strong">97.71% </span>
<span class="quiet">Statements</span> <span class="quiet">Statements</span>
<span class='fraction'>1108/1138</span> <span class='fraction'>1111/1137</span>
</div> </div>
<div class='fl pad1y space-right2'> <div class='fl pad1y space-right2'>
<span class="strong">87.87% </span> <span class="strong">88.91% </span>
<span class="quiet">Branches</span> <span class="quiet">Branches</span>
<span class='fraction'>319/363</span> <span class='fraction'>321/361</span>
</div> </div>
@ -44,9 +44,9 @@
<div class='fl pad1y space-right2'> <div class='fl pad1y space-right2'>
<span class="strong">97.36% </span> <span class="strong">97.71% </span>
<span class="quiet">Lines</span> <span class="quiet">Lines</span>
<span class='fraction'>1108/1138</span> <span class='fraction'>1111/1137</span>
</div> </div>
@ -189,13 +189,13 @@
<div class="chart"><div class="cover-fill cover-full" style="width: 100%"></div><div class="cover-empty" style="width: 0%"></div></div> <div class="chart"><div class="cover-fill cover-full" style="width: 100%"></div><div class="cover-empty" style="width: 0%"></div></div>
</td> </td>
<td data-value="100" class="pct high">100%</td> <td data-value="100" class="pct high">100%</td>
<td data-value="31" class="abs high">31/31</td> <td data-value="30" class="abs high">30/30</td>
<td data-value="100" class="pct high">100%</td> <td data-value="100" class="pct high">100%</td>
<td data-value="13" class="abs high">13/13</td> <td data-value="11" class="abs high">11/11</td>
<td data-value="100" class="pct high">100%</td> <td data-value="100" class="pct high">100%</td>
<td data-value="4" class="abs high">4/4</td> <td data-value="4" class="abs high">4/4</td>
<td data-value="100" class="pct high">100%</td> <td data-value="100" class="pct high">100%</td>
<td data-value="31" class="abs high">31/31</td> <td data-value="30" class="abs high">30/30</td>
</tr> </tr>
<tr> <tr>
@ -215,17 +215,17 @@
<tr> <tr>
<td class="file high" data-value="tracing.ts"><a href="tracing.ts.html">tracing.ts</a></td> <td class="file high" data-value="tracing.ts"><a href="tracing.ts.html">tracing.ts</a></td>
<td data-value="93.82" class="pic high"> <td data-value="94.94" class="pic high">
<div class="chart"><div class="cover-fill" style="width: 93%"></div><div class="cover-empty" style="width: 7%"></div></div> <div class="chart"><div class="cover-fill" style="width: 94%"></div><div class="cover-empty" style="width: 6%"></div></div>
</td> </td>
<td data-value="93.82" class="pct high">93.82%</td> <td data-value="94.94" class="pct high">94.94%</td>
<td data-value="356" class="abs high">334/356</td> <td data-value="356" class="abs high">338/356</td>
<td data-value="83.08" class="pct high">83.08%</td> <td data-value="86.02" class="pct high">86.02%</td>
<td data-value="136" class="abs high">113/136</td> <td data-value="136" class="abs high">117/136</td>
<td data-value="96.15" class="pct high">96.15%</td> <td data-value="96.15" class="pct high">96.15%</td>
<td data-value="26" class="abs high">25/26</td> <td data-value="26" class="abs high">25/26</td>
<td data-value="93.82" class="pct high">93.82%</td> <td data-value="94.94" class="pct high">94.94%</td>
<td data-value="356" class="abs high">334/356</td> <td data-value="356" class="abs high">338/356</td>
</tr> </tr>
</tbody> </tbody>
@ -236,7 +236,7 @@
<div class='footer quiet pad2 space-top1 center small'> <div class='footer quiet pad2 space-top1 center small'>
Code coverage generated by Code coverage generated by
<a href="https://istanbul.js.org/" target="_blank" rel="noopener noreferrer">istanbul</a> <a href="https://istanbul.js.org/" target="_blank" rel="noopener noreferrer">istanbul</a>
at 2026-06-25T14:49:54.914Z at 2026-06-25T15:09:05.618Z
</div> </div>
<script src="../../prettify.js"></script> <script src="../../prettify.js"></script>
<script> <script>

View File

@ -25,14 +25,14 @@
<div class='fl pad1y space-right2'> <div class='fl pad1y space-right2'>
<span class="strong">100% </span> <span class="strong">100% </span>
<span class="quiet">Statements</span> <span class="quiet">Statements</span>
<span class='fraction'>31/31</span> <span class='fraction'>30/30</span>
</div> </div>
<div class='fl pad1y space-right2'> <div class='fl pad1y space-right2'>
<span class="strong">100% </span> <span class="strong">100% </span>
<span class="quiet">Branches</span> <span class="quiet">Branches</span>
<span class='fraction'>13/13</span> <span class='fraction'>11/11</span>
</div> </div>
@ -46,7 +46,7 @@
<div class='fl pad1y space-right2'> <div class='fl pad1y space-right2'>
<span class="strong">100% </span> <span class="strong">100% </span>
<span class="quiet">Lines</span> <span class="quiet">Lines</span>
<span class='fraction'>31/31</span> <span class='fraction'>30/30</span>
</div> </div>
@ -93,19 +93,18 @@
<a name='L28'></a><a href='#L28'>28</a> <a name='L28'></a><a href='#L28'>28</a>
<a name='L29'></a><a href='#L29'>29</a> <a name='L29'></a><a href='#L29'>29</a>
<a name='L30'></a><a href='#L30'>30</a> <a name='L30'></a><a href='#L30'>30</a>
<a name='L31'></a><a href='#L31'>31</a> <a name='L31'></a><a href='#L31'>31</a></td><td class="line-coverage quiet"><span class="cline-any cline-yes">1x</span>
<a name='L32'></a><a href='#L32'>32</a></td><td class="line-coverage quiet"><span class="cline-any cline-yes">1x</span>
<span class="cline-any cline-yes">1x</span> <span class="cline-any cline-yes">1x</span>
<span class="cline-any cline-yes">1x</span> <span class="cline-any cline-yes">1x</span>
<span class="cline-any cline-yes">42x</span> <span class="cline-any cline-yes">69x</span>
<span class="cline-any cline-yes">42x</span> <span class="cline-any cline-yes">69x</span>
<span class="cline-any cline-yes">1x</span> <span class="cline-any cline-yes">1x</span>
<span class="cline-any cline-yes">1x</span> <span class="cline-any cline-yes">1x</span>
<span class="cline-any cline-yes">6x</span> <span class="cline-any cline-yes">6x</span>
<span class="cline-any cline-yes">6x</span> <span class="cline-any cline-yes">6x</span>
<span class="cline-any cline-yes">1x</span> <span class="cline-any cline-yes">1x</span>
<span class="cline-any cline-yes">1x</span> <span class="cline-any cline-yes">1x</span>
<span class="cline-any cline-yes">289x</span> <span class="cline-any cline-yes">377x</span>
<span class="cline-any cline-yes">8x</span> <span class="cline-any cline-yes">8x</span>
<span class="cline-any cline-yes">8x</span> <span class="cline-any cline-yes">8x</span>
<span class="cline-any cline-yes">10x</span> <span class="cline-any cline-yes">10x</span>
@ -113,17 +112,16 @@
<span class="cline-any cline-yes">10x</span> <span class="cline-any cline-yes">10x</span>
<span class="cline-any cline-yes">5x</span> <span class="cline-any cline-yes">5x</span>
<span class="cline-any cline-yes">5x</span> <span class="cline-any cline-yes">5x</span>
<span class="cline-any cline-yes">289x</span> <span class="cline-any cline-yes">377x</span>
<span class="cline-any cline-yes">1x</span> <span class="cline-any cline-yes">1x</span>
<span class="cline-any cline-yes">1x</span> <span class="cline-any cline-yes">1x</span>
<span class="cline-any cline-yes">10x</span> <span class="cline-any cline-yes">10x</span>
<span class="cline-any cline-yes">8x</span> <span class="cline-any cline-yes">10x</span>
<span class="cline-any cline-yes">8x</span>
<span class="cline-any cline-yes">10x</span> <span class="cline-any cline-yes">10x</span>
<span class="cline-any cline-yes">3x</span> <span class="cline-any cline-yes">3x</span>
<span class="cline-any cline-yes">10x</span> <span class="cline-any cline-yes">10x</span>
<span class="cline-any cline-yes">5x</span> <span class="cline-any cline-yes">7x</span>
<span class="cline-any cline-yes">5x</span> <span class="cline-any cline-yes">7x</span>
<span class="cline-any cline-yes">10x</span> <span class="cline-any cline-yes">10x</span>
<span class="cline-any cline-neutral">&nbsp;</span></td><td class="text"><pre class="prettyprint lang-js">let debugEnabled = false; <span class="cline-any cline-neutral">&nbsp;</span></td><td class="text"><pre class="prettyprint lang-js">let debugEnabled = false;
&nbsp; &nbsp;
@ -147,13 +145,12 @@ export function logDebug(tag: string, message: string, data?: unknown): void {
} }
&nbsp; &nbsp;
export function logError(tag: string, message: string, error?: unknown): void { export function logError(tag: string, message: string, error?: unknown): void {
if (!debugEnabled) return;
const timestamp = new Date().toISOString(); const timestamp = new Date().toISOString();
const prefix = `[LightSDK][${tag}][ERROR]`; const prefix = `[LightSDK][${tag}][ERROR]`;
if (error !== undefined) { if (error !== undefined) {
console.error(`${prefix} ${timestamp} ${message}`, error); console.warn(`${prefix} ${timestamp} ${message}`, error);
} else { } else {
console.error(`${prefix} ${timestamp} ${message}`); console.warn(`${prefix} ${timestamp} ${message}`);
} }
} }
&nbsp;</pre></td></tr></table></pre> &nbsp;</pre></td></tr></table></pre>
@ -163,7 +160,7 @@ export function logError(tag: string, message: string, error?: unknown): void {
<div class='footer quiet pad2 space-top1 center small'> <div class='footer quiet pad2 space-top1 center small'>
Code coverage generated by Code coverage generated by
<a href="https://istanbul.js.org/" target="_blank" rel="noopener noreferrer">istanbul</a> <a href="https://istanbul.js.org/" target="_blank" rel="noopener noreferrer">istanbul</a>
at 2026-06-25T14:49:54.914Z at 2026-06-25T15:09:05.618Z
</div> </div>
<script src="../../prettify.js"></script> <script src="../../prettify.js"></script>
<script> <script>

View File

@ -370,7 +370,7 @@ export function parseStackTrace(stack?: string, options: ParseStackOptions = {})
<div class='footer quiet pad2 space-top1 center small'> <div class='footer quiet pad2 space-top1 center small'>
Code coverage generated by Code coverage generated by
<a href="https://istanbul.js.org/" target="_blank" rel="noopener noreferrer">istanbul</a> <a href="https://istanbul.js.org/" target="_blank" rel="noopener noreferrer">istanbul</a>
at 2026-06-25T14:49:54.914Z at 2026-06-25T15:09:05.618Z
</div> </div>
<script src="../../prettify.js"></script> <script src="../../prettify.js"></script>
<script> <script>

View File

@ -23,16 +23,16 @@
<div class='clearfix'> <div class='clearfix'>
<div class='fl pad1y space-right2'> <div class='fl pad1y space-right2'>
<span class="strong">93.82% </span> <span class="strong">94.94% </span>
<span class="quiet">Statements</span> <span class="quiet">Statements</span>
<span class='fraction'>334/356</span> <span class='fraction'>338/356</span>
</div> </div>
<div class='fl pad1y space-right2'> <div class='fl pad1y space-right2'>
<span class="strong">83.08% </span> <span class="strong">86.02% </span>
<span class="quiet">Branches</span> <span class="quiet">Branches</span>
<span class='fraction'>113/136</span> <span class='fraction'>117/136</span>
</div> </div>
@ -44,9 +44,9 @@
<div class='fl pad1y space-right2'> <div class='fl pad1y space-right2'>
<span class="strong">93.82% </span> <span class="strong">94.94% </span>
<span class="quiet">Lines</span> <span class="quiet">Lines</span>
<span class='fraction'>334/356</span> <span class='fraction'>338/356</span>
</div> </div>
@ -423,13 +423,13 @@
<span class="cline-any cline-yes">1x</span> <span class="cline-any cline-yes">1x</span>
<span class="cline-any cline-yes">1x</span> <span class="cline-any cline-yes">1x</span>
<span class="cline-any cline-yes">1x</span> <span class="cline-any cline-yes">1x</span>
<span class="cline-any cline-yes">81x</span> <span class="cline-any cline-yes">82x</span>
<span class="cline-any cline-yes">81x</span> <span class="cline-any cline-yes">82x</span>
<span class="cline-any cline-yes">81x</span> <span class="cline-any cline-yes">82x</span>
<span class="cline-any cline-yes">1x</span> <span class="cline-any cline-yes">1x</span>
<span class="cline-any cline-yes">98x</span> <span class="cline-any cline-yes">99x</span>
<span class="cline-any cline-yes">98x</span> <span class="cline-any cline-yes">99x</span>
<span class="cline-any cline-yes">98x</span> <span class="cline-any cline-yes">99x</span>
<span class="cline-any cline-yes">1x</span> <span class="cline-any cline-yes">1x</span>
<span class="cline-any cline-yes">1x</span> <span class="cline-any cline-yes">1x</span>
<span class="cline-any cline-yes">21x</span> <span class="cline-any cline-yes">21x</span>
@ -520,18 +520,18 @@
<span class="cline-any cline-yes">1x</span> <span class="cline-any cline-yes">1x</span>
<span class="cline-any cline-yes">1x</span> <span class="cline-any cline-yes">1x</span>
<span class="cline-any cline-yes">1x</span> <span class="cline-any cline-yes">1x</span>
<span class="cline-any cline-yes">99x</span> <span class="cline-any cline-yes">100x</span>
<span class="cline-any cline-yes">99x</span> <span class="cline-any cline-yes">100x</span>
<span class="cline-any cline-yes">99x</span> <span class="cline-any cline-yes">100x</span>
<span class="cline-any cline-yes">99x</span> <span class="cline-any cline-yes">100x</span>
<span class="cline-any cline-yes">99x</span> <span class="cline-any cline-yes">100x</span>
<span class="cline-any cline-yes">99x</span> <span class="cline-any cline-yes">100x</span>
<span class="cline-any cline-yes">99x</span> <span class="cline-any cline-yes">100x</span>
<span class="cline-any cline-yes">99x</span> <span class="cline-any cline-yes">100x</span>
<span class="cline-any cline-yes">99x</span> <span class="cline-any cline-yes">100x</span>
<span class="cline-any cline-yes">99x</span> <span class="cline-any cline-yes">100x</span>
<span class="cline-any cline-yes">99x</span> <span class="cline-any cline-yes">100x</span>
<span class="cline-any cline-yes">99x</span> <span class="cline-any cline-yes">100x</span>
<span class="cline-any cline-yes">1x</span> <span class="cline-any cline-yes">1x</span>
<span class="cline-any cline-yes">1x</span> <span class="cline-any cline-yes">1x</span>
<span class="cline-any cline-yes">11x</span> <span class="cline-any cline-yes">11x</span>
@ -544,9 +544,9 @@
<span class="cline-any cline-yes">4x</span> <span class="cline-any cline-yes">4x</span>
<span class="cline-any cline-yes">1x</span> <span class="cline-any cline-yes">1x</span>
<span class="cline-any cline-yes">1x</span> <span class="cline-any cline-yes">1x</span>
<span class="cline-any cline-yes">28x</span> <span class="cline-any cline-yes">29x</span>
<span class="cline-any cline-yes">28x</span> <span class="cline-any cline-yes">29x</span>
<span class="cline-any cline-yes">28x</span> <span class="cline-any cline-yes">29x</span>
<span class="cline-any cline-yes">1x</span> <span class="cline-any cline-yes">1x</span>
<span class="cline-any cline-yes">1x</span> <span class="cline-any cline-yes">1x</span>
<span class="cline-any cline-yes">4x</span> <span class="cline-any cline-yes">4x</span>
@ -585,17 +585,17 @@
<span class="cline-any cline-yes">16x</span> <span class="cline-any cline-yes">16x</span>
<span class="cline-any cline-yes">1x</span> <span class="cline-any cline-yes">1x</span>
<span class="cline-any cline-yes">1x</span> <span class="cline-any cline-yes">1x</span>
<span class="cline-any cline-yes">23x</span>
<span class="cline-any cline-yes">22x</span> <span class="cline-any cline-yes">22x</span>
<span class="cline-any cline-yes">21x</span> <span class="cline-any cline-yes">23x</span>
<span class="cline-any cline-yes">22x</span> <span class="cline-any cline-yes">23x</span>
<span class="cline-any cline-yes">22x</span> <span class="cline-any cline-yes">23x</span>
<span class="cline-any cline-yes">22x</span> <span class="cline-any cline-yes">18x</span>
<span class="cline-any cline-yes">17x</span> <span class="cline-any cline-yes">18x</span>
<span class="cline-any cline-yes">17x</span> <span class="cline-any cline-yes">1x</span>
<span class="cline-any cline-no">&nbsp;</span> <span class="cline-any cline-yes">1x</span>
<span class="cline-any cline-no">&nbsp;</span> <span class="cline-any cline-yes">18x</span>
<span class="cline-any cline-yes">17x</span> <span class="cline-any cline-yes">23x</span>
<span class="cline-any cline-yes">22x</span>
<span class="cline-any cline-yes">1x</span> <span class="cline-any cline-yes">1x</span>
<span class="cline-any cline-yes">1x</span> <span class="cline-any cline-yes">1x</span>
<span class="cline-any cline-yes">3x</span> <span class="cline-any cline-yes">3x</span>
@ -634,18 +634,18 @@
<span class="cline-any cline-yes">1x</span> <span class="cline-any cline-yes">1x</span>
<span class="cline-any cline-yes">1x</span> <span class="cline-any cline-yes">1x</span>
<span class="cline-any cline-yes">1x</span> <span class="cline-any cline-yes">1x</span>
<span class="cline-any cline-yes">42x</span> <span class="cline-any cline-yes">43x</span>
<span class="cline-any cline-yes">42x</span> <span class="cline-any cline-yes">43x</span>
<span class="cline-any cline-yes">42x</span> <span class="cline-any cline-yes">43x</span>
<span class="cline-any cline-yes">42x</span> <span class="cline-any cline-yes">43x</span>
<span class="cline-any cline-yes">42x</span> <span class="cline-any cline-yes">43x</span>
<span class="cline-any cline-yes">42x</span> <span class="cline-any cline-yes">43x</span>
<span class="cline-any cline-yes">42x</span> <span class="cline-any cline-yes">43x</span>
<span class="cline-any cline-yes">42x</span> <span class="cline-any cline-yes">43x</span>
<span class="cline-any cline-yes">42x</span> <span class="cline-any cline-yes">43x</span>
<span class="cline-any cline-yes">2x</span> <span class="cline-any cline-yes">2x</span>
<span class="cline-any cline-yes">2x</span> <span class="cline-any cline-yes">2x</span>
<span class="cline-any cline-yes">42x</span> <span class="cline-any cline-yes">43x</span>
<span class="cline-any cline-yes">1x</span> <span class="cline-any cline-yes">1x</span>
<span class="cline-any cline-yes">1x</span> <span class="cline-any cline-yes">1x</span>
<span class="cline-any cline-yes">13x</span> <span class="cline-any cline-yes">13x</span>
@ -701,21 +701,21 @@
<span class="cline-any cline-no">&nbsp;</span> <span class="cline-any cline-no">&nbsp;</span>
<span class="cline-any cline-yes">1x</span> <span class="cline-any cline-yes">1x</span>
<span class="cline-any cline-yes">1x</span> <span class="cline-any cline-yes">1x</span>
<span class="cline-any cline-yes">17x</span> <span class="cline-any cline-yes">18x</span>
<span class="cline-any cline-yes">17x</span> <span class="cline-any cline-yes">18x</span>
<span class="cline-any cline-yes">17x</span> <span class="cline-any cline-yes">18x</span>
<span class="cline-any cline-yes">17x</span> <span class="cline-any cline-yes">18x</span>
<span class="cline-any cline-yes">13x</span> <span class="cline-any cline-yes">13x</span>
<span class="cline-any cline-yes">13x</span> <span class="cline-any cline-yes">13x</span>
<span class="cline-any cline-yes">13x</span> <span class="cline-any cline-yes">13x</span>
<span class="cline-any cline-yes">17x</span> <span class="cline-any cline-yes">18x</span>
<span class="cline-any cline-yes">17x</span> <span class="cline-any cline-yes">18x</span>
<span class="cline-any cline-yes">17x</span> <span class="cline-any cline-yes">18x</span>
<span class="cline-any cline-yes">17x</span> <span class="cline-any cline-yes">18x</span>
<span class="cline-any cline-no">&nbsp;</span> <span class="cline-any cline-yes">1x</span>
<span class="cline-any cline-no">&nbsp;</span> <span class="cline-any cline-yes">1x</span>
<span class="cline-any cline-yes">17x</span> <span class="cline-any cline-yes">18x</span>
<span class="cline-any cline-yes">17x</span> <span class="cline-any cline-yes">18x</span>
<span class="cline-any cline-yes">1x</span> <span class="cline-any cline-yes">1x</span>
<span class="cline-any cline-yes">1x</span> <span class="cline-any cline-yes">1x</span>
<span class="cline-any cline-yes">14x</span> <span class="cline-any cline-yes">14x</span>
@ -947,9 +947,9 @@ export class Span implements SpanInterface {
&nbsp; &nbsp;
if (this._client) { if (this._client) {
const clientInternal = this._client as unknown as { tracingManager?: { onSpanFinished: (span: Span) =&gt; void } }; const clientInternal = this._client as unknown as { tracingManager?: { onSpanFinished: (span: Span) =&gt; void } };
if (clientInternal.<span class="branch-0 cbranch-no" title="branch not covered" >tracingManager?.onSpanFinished) <span class="branch-0 cbranch-no" title="branch not covered" >{</span></span> if (clientInternal.tracingManager?.onSpanFinished) {
<span class="cstat-no" title="statement not covered" > clientInternal.tracingManager.onSpanFinished(this);</span> clientInternal.tracingManager.onSpanFinished(this);
<span class="cstat-no" title="statement not covered" > }</span> }
} }
} }
&nbsp; &nbsp;
@ -1067,9 +1067,9 @@ export class Transaction extends Span implements TransactionInterface {
&nbsp; &nbsp;
if (this._client) { if (this._client) {
const clientInternal = this._client as unknown as { tracingManager?: { onTransactionFinished: (tx: Transaction) =&gt; void } }; const clientInternal = this._client as unknown as { tracingManager?: { onTransactionFinished: (tx: Transaction) =&gt; void } };
if (clientInternal.<span class="branch-0 cbranch-no" title="branch not covered" >tracingManager?.onTransactionFinished) <span class="branch-0 cbranch-no" title="branch not covered" >{</span></span> if (clientInternal.tracingManager?.onTransactionFinished) {
<span class="cstat-no" title="statement not covered" > clientInternal.tracingManager.onTransactionFinished(this);</span> clientInternal.tracingManager.onTransactionFinished(this);
<span class="cstat-no" title="statement not covered" > }</span> }
} }
} }
&nbsp; &nbsp;
@ -1138,7 +1138,7 @@ export { generateTraceId, generateSpanId };
<div class='footer quiet pad2 space-top1 center small'> <div class='footer quiet pad2 space-top1 center small'>
Code coverage generated by Code coverage generated by
<a href="https://istanbul.js.org/" target="_blank" rel="noopener noreferrer">istanbul</a> <a href="https://istanbul.js.org/" target="_blank" rel="noopener noreferrer">istanbul</a>
at 2026-06-25T14:49:54.914Z at 2026-06-25T15:09:05.618Z
</div> </div>
<script src="../../prettify.js"></script> <script src="../../prettify.js"></script>
<script> <script>

6
dist/index.cjs.js vendored

File diff suppressed because one or more lines are too long

6
dist/index.esm.js vendored

File diff suppressed because one or more lines are too long

6
dist/index.iife.js vendored

File diff suppressed because one or more lines are too long

View File

@ -3,7 +3,7 @@ import { parseDSN } from '../utils/dsn';
import { now } from '../utils/helper'; import { now } from '../utils/helper';
import { computeFingerprint } from '../utils/hash'; import { computeFingerprint } from '../utils/hash';
import { parseStackTrace } from '../utils/stacktrace'; import { parseStackTrace } from '../utils/stacktrace';
import { logDebug, setDebug } from '../utils/logger'; import { logDebug, logError, setDebug } from '../utils/logger';
import { setAnonymousId as setStoredAnonymousId } from '../utils/identity'; import { setAnonymousId as setStoredAnonymousId } from '../utils/identity';
import { ConfigManager } from './ConfigManager'; import { ConfigManager } from './ConfigManager';
import { EventBus } from './EventBus'; import { EventBus } from './EventBus';
@ -63,9 +63,13 @@ class Client implements LightClient {
} }
init(): void { init(): void {
if (!this.enabled) return; try {
this.queue.start(); if (!this.enabled) return;
this.emit('ready'); this.queue.start();
this.emit('ready');
} catch (e) {
logError('Client', 'init failed', e);
}
} }
private async flushEvents(events: SentryEvent[]): Promise<void> { private async flushEvents(events: SentryEvent[]): Promise<void> {
@ -164,56 +168,68 @@ class Client implements LightClient {
} }
captureException(error: Error | unknown): void { captureException(error: Error | unknown): void {
logDebug('Client', 'captureException called', { error: error instanceof Error ? error.message : String(error) }); try {
logDebug('Client', 'captureException called', { error: error instanceof Error ? error.message : String(error) });
if (!this.enabled) { if (!this.enabled) {
logDebug('Client', 'captureException skipped: SDK disabled'); logDebug('Client', 'captureException skipped: SDK disabled');
return; return;
}
const errorEvent = this.buildErrorEvent(error);
logDebug('Client', 'Error event built', { type: errorEvent.type, message: errorEvent.message, fingerprint: (errorEvent as ErrorEvent).fingerprint });
if (this.configManager.isIgnoredError(errorEvent.message)) {
logDebug('Client', 'captureException skipped: error ignored by ignoreErrors');
return;
}
this.attachTraceContext(errorEvent);
errorEvent.breadcrumbs = [...this.breadcrumbs];
logDebug('Client', 'Enqueue error event', { breadcrumbs: this.breadcrumbs.length });
this.queue.enqueue(errorEvent);
} catch (e) {
logError('Client', 'captureException failed', e);
} }
const errorEvent = this.buildErrorEvent(error);
logDebug('Client', 'Error event built', { type: errorEvent.type, message: errorEvent.message, fingerprint: (errorEvent as ErrorEvent).fingerprint });
if (this.configManager.isIgnoredError(errorEvent.message)) {
logDebug('Client', 'captureException skipped: error ignored by ignoreErrors');
return;
}
this.attachTraceContext(errorEvent);
errorEvent.breadcrumbs = [...this.breadcrumbs];
logDebug('Client', 'Enqueue error event', { breadcrumbs: this.breadcrumbs.length });
this.queue.enqueue(errorEvent);
} }
captureMessage(message: string, level: EventLevel = 'info'): void { captureMessage(message: string, level: EventLevel = 'info'): void {
if (!this.enabled) return; try {
if (!this.enabled) return;
const event: ErrorEvent = { const event: ErrorEvent = {
type: 'error', type: 'error',
level, level,
message, message,
timestamp: now(), timestamp: now(),
breadcrumbs: [...this.breadcrumbs], breadcrumbs: [...this.breadcrumbs],
}; };
if (this.configManager.isIgnoredError(message)) return; if (this.configManager.isIgnoredError(message)) return;
this.attachTraceContext(event); this.attachTraceContext(event);
this.queue.enqueue(event); this.queue.enqueue(event);
} catch (e) {
logError('Client', 'captureMessage failed', e);
}
} }
captureEvent(event: Partial<SentryEvent> & { type: string }): void { captureEvent(event: Partial<SentryEvent> & { type: string }): void {
if (!this.enabled) return; try {
if (!this.enabled) return;
const fullEvent = { const fullEvent = {
timestamp: now(), timestamp: now(),
level: 'info' as EventLevel, level: 'info' as EventLevel,
breadcrumbs: [...this.breadcrumbs], breadcrumbs: [...this.breadcrumbs],
...event, ...event,
} as SentryEvent; } as SentryEvent;
this.attachTraceContext(fullEvent); this.attachTraceContext(fullEvent);
this.queue.enqueue(fullEvent); this.queue.enqueue(fullEvent);
} catch (e) {
logError('Client', 'captureEvent failed', e);
}
} }
private attachTraceContext(event: SentryEvent): void { private attachTraceContext(event: SentryEvent): void {
@ -273,91 +289,159 @@ class Client implements LightClient {
} }
setUser(user: UserInfo | null): void { setUser(user: UserInfo | null): void {
this.configManager.setUser(user); try {
this.tracingManager.updateConfig(this.configManager.getAll()); this.configManager.setUser(user);
this.tracingManager.updateConfig(this.configManager.getAll());
} catch (e) {
logError('Client', 'setUser failed', e);
}
} }
setAnonymousId(id: string): void { setAnonymousId(id: string): void {
setStoredAnonymousId(id); try {
setStoredAnonymousId(id);
} catch (e) {
logError('Client', 'setAnonymousId failed', e);
}
} }
startTransaction(context: TransactionContext): Transaction | null { startTransaction(context: TransactionContext): Transaction | null {
if (!this.enabled) return null; try {
if (!this.enabled) return null;
const transaction = this.tracingManager.startTransaction(context); const transaction = this.tracingManager.startTransaction(context);
if (transaction && transaction.sampled) { if (transaction && transaction.sampled) {
logDebug('Client', 'Transaction started and sampled', { logDebug('Client', 'Transaction started and sampled', {
name: transaction.name, name: transaction.name,
traceId: transaction.traceId, traceId: transaction.traceId,
}); });
}
return transaction;
} catch (e) {
logError('Client', 'startTransaction failed', e);
return null;
} }
return transaction;
} }
getCurrentTransaction(): Transaction | null { getCurrentTransaction(): Transaction | null {
return this.tracingManager.getCurrentTransaction(); try {
return this.tracingManager.getCurrentTransaction();
} catch (e) {
logError('Client', 'getCurrentTransaction failed', e);
return null;
}
} }
getCurrentSpan(): Span | null { getCurrentSpan(): Span | null {
return this.tracingManager.getCurrentSpan(); try {
return this.tracingManager.getCurrentSpan();
} catch (e) {
logError('Client', 'getCurrentSpan failed', e);
return null;
}
} }
setSpan(span: Span | null): void { setSpan(span: Span | null): void {
this.tracingManager.setCurrentSpan(span); try {
this.tracingManager.setCurrentSpan(span);
} catch (e) {
logError('Client', 'setSpan failed', e);
}
} }
startSpan(context: SpanContext): Span | null { startSpan(context: SpanContext): Span | null {
if (!this.enabled) return null; try {
return this.tracingManager.startSpan(context); if (!this.enabled) return null;
return this.tracingManager.startSpan(context);
} catch (e) {
logError('Client', 'startSpan failed', e);
return null;
}
} }
setTag(key: string, value: string): void { setTag(key: string, value: string): void {
this.configManager.setTag(key, value); try {
this.configManager.setTag(key, value);
} catch (e) {
logError('Client', 'setTag failed', e);
}
} }
setTags(tags: Record<string, string>): void { setTags(tags: Record<string, string>): void {
this.configManager.setTags(tags); try {
this.configManager.setTags(tags);
} catch (e) {
logError('Client', 'setTags failed', e);
}
} }
setExtra(key: string, value: unknown): void { setExtra(key: string, value: unknown): void {
this.configManager.setExtra(key, value); try {
this.configManager.setExtra(key, value);
} catch (e) {
logError('Client', 'setExtra failed', e);
}
} }
addBreadcrumb(breadcrumb: Omit<Breadcrumb, 'timestamp'>): void { addBreadcrumb(breadcrumb: Omit<Breadcrumb, 'timestamp'>): void {
const fullBreadcrumb: Breadcrumb = { try {
...breadcrumb, const fullBreadcrumb: Breadcrumb = {
timestamp: now(), ...breadcrumb,
}; timestamp: now(),
};
this.breadcrumbs.push(fullBreadcrumb); this.breadcrumbs.push(fullBreadcrumb);
if (this.breadcrumbs.length > this.maxBreadcrumbs) { if (this.breadcrumbs.length > this.maxBreadcrumbs) {
this.breadcrumbs.shift(); this.breadcrumbs.shift();
}
} catch (e) {
logError('Client', 'addBreadcrumb failed', e);
} }
} }
async flush(): Promise<void> { async flush(): Promise<void> {
await this.queue.flush(); try {
await this.queue.flush();
} catch (e) {
logError('Client', 'flush failed', e);
}
} }
disable(): void { disable(): void {
this.enabled = false; try {
this.enabled = false;
} catch (e) {
logError('Client', 'disable failed', e);
}
} }
enable(): void { enable(): void {
this.enabled = true; try {
this.enabled = true;
} catch (e) {
logError('Client', 'enable failed', e);
}
} }
use(plugin: LightPlugin): void { use(plugin: LightPlugin): void {
this.pluginManager.add(plugin); try {
this.pluginManager.add(plugin);
} catch (e) {
logError('Client', 'use plugin failed', e);
}
} }
destroy(): void { destroy(): void {
this.pluginManager.destroy(); try {
this.tracingManager.destroy(); this.pluginManager.destroy();
this.queue.destroy(); this.tracingManager.destroy();
this.eventBus.destroy(); this.queue.destroy();
this.breadcrumbs = []; this.eventBus.destroy();
this.breadcrumbs = [];
} catch (e) {
logError('Client', 'destroy failed', e);
}
} }
} }

View File

@ -10,60 +10,65 @@ import InteractionPlugin from './plugins/InteractionPlugin';
import { Span as SpanClass, Transaction as TransactionClass, httpStatusToSpanStatus, dbStatusToSpanStatus, statusToSpanStatus } from './utils/tracing'; import { Span as SpanClass, Transaction as TransactionClass, httpStatusToSpanStatus, dbStatusToSpanStatus, statusToSpanStatus } from './utils/tracing';
import { serializeBaggage, parseBaggage, createBaggageFromTransaction } from './utils/baggage'; import { serializeBaggage, parseBaggage, createBaggageFromTransaction } from './utils/baggage';
import type { LightConfig, LightClient, SentryEvent, EventLevel, UserInfo, Breadcrumb, LightPlugin, ErrorEvent, PerformanceEvent, NetworkEvent, BehaviorEvent, DSNInfo, TransactionContext, SpanContext, Transaction, Span, SamplingContext, BaggageFields, SpanStatus } from './types'; import type { LightConfig, LightClient, SentryEvent, EventLevel, UserInfo, Breadcrumb, LightPlugin, ErrorEvent, PerformanceEvent, NetworkEvent, BehaviorEvent, DSNInfo, TransactionContext, SpanContext, Transaction, Span, SamplingContext, BaggageFields, SpanStatus } from './types';
import { logDebug, setDebug } from './utils/logger'; import { logDebug, logError, setDebug } from './utils/logger';
import { setAnonymousId as setStoredAnonymousId, clearAnonymousId as clearStoredAnonymousId, getAnonymousId as getStoredAnonymousId } from './utils/identity'; import { setAnonymousId as setStoredAnonymousId, clearAnonymousId as clearStoredAnonymousId, getAnonymousId as getStoredAnonymousId } from './utils/identity';
let globalClient: LightClient | null = null; let globalClient: LightClient | null = null;
function init(config: LightConfig): LightClient { function init(config: LightConfig): LightClient {
setDebug(config.debug === true); try {
logDebug('Index', 'init called', { dsn: config.dsn, debug: config.debug }); setDebug(config.debug === true);
logDebug('Index', 'init called', { dsn: config.dsn, debug: config.debug });
const client = new Client(config); const client = new Client(config);
const defaultPlugins: LightPlugin[] = [ const defaultPlugins: LightPlugin[] = [
new OfflinePlugin(), new OfflinePlugin(),
new SamplingPlugin(), new SamplingPlugin(),
new ErrorPlugin(), new ErrorPlugin(),
]; ];
const pluginNames = config.plugins?.filter(p => typeof p === 'string') as string[] || []; const pluginNames = config.plugins?.filter(p => typeof p === 'string') as string[] || [];
if (pluginNames.includes('performance') || pluginNames.includes('all')) { if (pluginNames.includes('performance') || pluginNames.includes('all')) {
defaultPlugins.push(new PerformancePlugin()); defaultPlugins.push(new PerformancePlugin());
} }
if (pluginNames.includes('network') || pluginNames.includes('all')) { if (pluginNames.includes('network') || pluginNames.includes('all')) {
defaultPlugins.push(new NetworkPlugin()); defaultPlugins.push(new NetworkPlugin());
} }
if (pluginNames.includes('behavior') || pluginNames.includes('all')) { if (pluginNames.includes('behavior') || pluginNames.includes('all')) {
defaultPlugins.push(new BehaviorPlugin()); defaultPlugins.push(new BehaviorPlugin());
} }
if (pluginNames.includes('router') || pluginNames.includes('all')) { if (pluginNames.includes('router') || pluginNames.includes('all')) {
defaultPlugins.push(new RouterPlugin()); defaultPlugins.push(new RouterPlugin());
} }
if (pluginNames.includes('interaction') || pluginNames.includes('all')) { if (pluginNames.includes('interaction') || pluginNames.includes('all')) {
defaultPlugins.push(new InteractionPlugin()); defaultPlugins.push(new InteractionPlugin());
} }
logDebug('Index', 'Registering plugins', { count: defaultPlugins.length, plugins: defaultPlugins.map(p => p.name) }); logDebug('Index', 'Registering plugins', { count: defaultPlugins.length, plugins: defaultPlugins.map(p => p.name) });
for (const plugin of defaultPlugins) { for (const plugin of defaultPlugins) {
client.use(plugin); client.use(plugin);
} }
if (config.plugins) { if (config.plugins) {
for (const plugin of config.plugins) { for (const plugin of config.plugins) {
if (typeof plugin === 'object' && plugin !== null && 'name' in plugin && 'setup' in plugin) { if (typeof plugin === 'object' && plugin !== null && 'name' in plugin && 'setup' in plugin) {
client.use(plugin as LightPlugin); client.use(plugin as LightPlugin);
}
} }
} }
client.init();
globalClient = client;
logDebug('Index', 'init completed, globalClient set');
return client;
} catch (e) {
logError('Index', 'init failed', e);
throw e;
} }
client.init();
globalClient = client;
logDebug('Index', 'init completed, globalClient set');
return client;
} }
function getClient(): LightClient | null { function getClient(): LightClient | null {
@ -71,94 +76,175 @@ function getClient(): LightClient | null {
} }
function captureException(error: Error | unknown): void { function captureException(error: Error | unknown): void {
logDebug('Index', 'captureException called', { hasClient: !!globalClient }); try {
if (!globalClient) { logDebug('Index', 'captureException called', { hasClient: !!globalClient });
console.warn('[LightSDK] SDK not initialized. Call LightSentry.init() first.'); if (!globalClient) {
return; console.warn('[LightSDK] SDK not initialized. Call LightSentry.init() first.');
return;
}
globalClient.captureException(error);
} catch (e) {
logError('Index', 'captureException failed', e);
} }
globalClient.captureException(error);
} }
function captureMessage(message: string, level?: EventLevel): void { function captureMessage(message: string, level?: EventLevel): void {
logDebug('Index', 'captureMessage called', { hasClient: !!globalClient }); try {
if (!globalClient) { logDebug('Index', 'captureMessage called', { hasClient: !!globalClient });
console.warn('[LightSDK] SDK not initialized. Call LightSentry.init() first.'); if (!globalClient) {
return; console.warn('[LightSDK] SDK not initialized. Call LightSentry.init() first.');
return;
}
globalClient.captureMessage(message, level);
} catch (e) {
logError('Index', 'captureMessage failed', e);
} }
globalClient.captureMessage(message, level);
} }
function captureEvent(event: Partial<SentryEvent> & { type: string }): void { function captureEvent(event: Partial<SentryEvent> & { type: string }): void {
logDebug('Index', 'captureEvent called', { hasClient: !!globalClient }); try {
if (!globalClient) { logDebug('Index', 'captureEvent called', { hasClient: !!globalClient });
console.warn('[LightSDK] SDK not initialized. Call LightSentry.init() first.'); if (!globalClient) {
return; console.warn('[LightSDK] SDK not initialized. Call LightSentry.init() first.');
return;
}
globalClient.captureEvent(event);
} catch (e) {
logError('Index', 'captureEvent failed', e);
} }
globalClient.captureEvent(event);
} }
function setUser(user: UserInfo | null): void { function setUser(user: UserInfo | null): void {
globalClient?.setUser(user); try {
globalClient?.setUser(user);
} catch (e) {
logError('Index', 'setUser failed', e);
}
} }
function setAnonymousId(id: string): void { function setAnonymousId(id: string): void {
setStoredAnonymousId(id); try {
setStoredAnonymousId(id);
} catch (e) {
logError('Index', 'setAnonymousId failed', e);
}
} }
function clearAnonymousId(): void { function clearAnonymousId(): void {
clearStoredAnonymousId(); try {
clearStoredAnonymousId();
} catch (e) {
logError('Index', 'clearAnonymousId failed', e);
}
} }
function getAnonymousId(): string | null { function getAnonymousId(): string | null {
return getStoredAnonymousId(); try {
return getStoredAnonymousId();
} catch (e) {
logError('Index', 'getAnonymousId failed', e);
return null;
}
} }
function startTransaction(context: TransactionContext): Transaction | null { function startTransaction(context: TransactionContext): Transaction | null {
return globalClient?.startTransaction(context) || null; try {
return globalClient?.startTransaction(context) || null;
} catch (e) {
logError('Index', 'startTransaction failed', e);
return null;
}
} }
function getCurrentTransaction(): Transaction | null { function getCurrentTransaction(): Transaction | null {
return globalClient?.getCurrentTransaction() || null; try {
return globalClient?.getCurrentTransaction() || null;
} catch (e) {
logError('Index', 'getCurrentTransaction failed', e);
return null;
}
} }
function getCurrentSpan(): Span | null { function getCurrentSpan(): Span | null {
return globalClient?.getCurrentSpan() || null; try {
return globalClient?.getCurrentSpan() || null;
} catch (e) {
logError('Index', 'getCurrentSpan failed', e);
return null;
}
} }
function setSpan(span: Span | null): void { function setSpan(span: Span | null): void {
globalClient?.setSpan(span); try {
globalClient?.setSpan(span);
} catch (e) {
logError('Index', 'setSpan failed', e);
}
} }
function startSpan(context: SpanContext): Span | null { function startSpan(context: SpanContext): Span | null {
return globalClient?.startSpan(context) || null; try {
return globalClient?.startSpan(context) || null;
} catch (e) {
logError('Index', 'startSpan failed', e);
return null;
}
} }
function setTag(key: string, value: string): void { function setTag(key: string, value: string): void {
globalClient?.setTag(key, value); try {
globalClient?.setTag(key, value);
} catch (e) {
logError('Index', 'setTag failed', e);
}
} }
function setTags(tags: Record<string, string>): void { function setTags(tags: Record<string, string>): void {
globalClient?.setTags(tags); try {
globalClient?.setTags(tags);
} catch (e) {
logError('Index', 'setTags failed', e);
}
} }
function setExtra(key: string, value: unknown): void { function setExtra(key: string, value: unknown): void {
globalClient?.setExtra(key, value); try {
globalClient?.setExtra(key, value);
} catch (e) {
logError('Index', 'setExtra failed', e);
}
} }
function addBreadcrumb(breadcrumb: Omit<Breadcrumb, 'timestamp'>): void { function addBreadcrumb(breadcrumb: Omit<Breadcrumb, 'timestamp'>): void {
globalClient?.addBreadcrumb(breadcrumb); try {
globalClient?.addBreadcrumb(breadcrumb);
} catch (e) {
logError('Index', 'addBreadcrumb failed', e);
}
} }
async function flush(): Promise<void> { async function flush(): Promise<void> {
await globalClient?.flush(); try {
await globalClient?.flush();
} catch (e) {
logError('Index', 'flush failed', e);
}
} }
function disable(): void { function disable(): void {
globalClient?.disable(); try {
globalClient?.disable();
} catch (e) {
logError('Index', 'disable failed', e);
}
} }
function enable(): void { function enable(): void {
globalClient?.enable(); try {
globalClient?.enable();
} catch (e) {
logError('Index', 'enable failed', e);
}
} }
export { export {

View File

@ -20,12 +20,11 @@ export function logDebug(tag: string, message: string, data?: unknown): void {
} }
export function logError(tag: string, message: string, error?: unknown): void { export function logError(tag: string, message: string, error?: unknown): void {
if (!debugEnabled) return;
const timestamp = new Date().toISOString(); const timestamp = new Date().toISOString();
const prefix = `[LightSDK][${tag}][ERROR]`; const prefix = `[LightSDK][${tag}][ERROR]`;
if (error !== undefined) { if (error !== undefined) {
console.error(`${prefix} ${timestamp} ${message}`, error); console.warn(`${prefix} ${timestamp} ${message}`, error);
} else { } else {
console.error(`${prefix} ${timestamp} ${message}`); console.warn(`${prefix} ${timestamp} ${message}`);
} }
} }

270
tests/error-safety.test.ts Normal file
View File

@ -0,0 +1,270 @@
import { describe, it, expect, vi, beforeEach, afterEach } from 'vitest';
import Client from '../src/core/Client';
import { setAnonymousId } from '../src/utils/identity';
describe('SDK Error Safety', () => {
const consoleWarnSpy = vi.spyOn(console, 'warn').mockImplementation(() => {});
const consoleLogSpy = vi.spyOn(console, 'log').mockImplementation(() => {});
beforeEach(() => {
vi.clearAllMocks();
});
afterAll(() => {
consoleWarnSpy.mockRestore();
consoleLogSpy.mockRestore();
});
describe('Client public methods should not throw', () => {
let client: Client;
beforeEach(() => {
client = new Client({
dsn: 'https://proj_abc123@log.example.com/1001',
});
});
afterEach(() => {
client.destroy();
});
it('captureException should not throw on invalid input', () => {
expect(() => {
client.captureException(null as unknown as Error);
}).not.toThrow();
});
it('captureException should not throw on undefined input', () => {
expect(() => {
client.captureException(undefined);
}).not.toThrow();
});
it('captureException should not throw when SDK is disabled', () => {
client.disable();
expect(() => {
client.captureException(new Error('test'));
}).not.toThrow();
});
it('captureMessage should not throw on empty message', () => {
expect(() => {
client.captureMessage('');
}).not.toThrow();
});
it('captureMessage should not throw when SDK is disabled', () => {
client.disable();
expect(() => {
client.captureMessage('test');
}).not.toThrow();
});
it('captureEvent should not throw on minimal event', () => {
expect(() => {
client.captureEvent({ type: 'custom' });
}).not.toThrow();
});
it('captureEvent should not throw when SDK is disabled', () => {
client.disable();
expect(() => {
client.captureEvent({ type: 'custom' });
}).not.toThrow();
});
it('setUser should not throw on null input', () => {
expect(() => {
client.setUser(null);
}).not.toThrow();
});
it('setUser should not throw on valid input', () => {
expect(() => {
client.setUser({ id: '123', username: 'test' });
}).not.toThrow();
});
it('setTag should not throw', () => {
expect(() => {
client.setTag('key', 'value');
}).not.toThrow();
});
it('setTags should not throw', () => {
expect(() => {
client.setTags({ key1: 'val1', key2: 'val2' });
}).not.toThrow();
});
it('setExtra should not throw', () => {
expect(() => {
client.setExtra('key', { nested: true });
}).not.toThrow();
});
it('addBreadcrumb should not throw', () => {
expect(() => {
client.addBreadcrumb({
type: 'default',
message: 'test breadcrumb',
level: 'info',
});
}).not.toThrow();
});
it('addBreadcrumb should not throw on empty breadcrumb', () => {
expect(() => {
client.addBreadcrumb({
type: 'default',
});
}).not.toThrow();
});
it('startTransaction should not throw', () => {
expect(() => {
client.startTransaction({ name: 'test-tx', op: 'test' });
}).not.toThrow();
});
it('startTransaction should not throw when SDK is disabled', () => {
client.disable();
const result = client.startTransaction({ name: 'test-tx', op: 'test' });
expect(result).toBeNull();
});
it('getCurrentTransaction should not throw', () => {
expect(() => {
client.getCurrentTransaction();
}).not.toThrow();
});
it('getCurrentSpan should not throw', () => {
expect(() => {
client.getCurrentSpan();
}).not.toThrow();
});
it('setSpan should not throw', () => {
expect(() => {
client.setSpan(null);
}).not.toThrow();
});
it('startSpan should not throw', () => {
expect(() => {
client.startSpan({ name: 'test-span', op: 'test' });
}).not.toThrow();
});
it('startSpan should not throw when SDK is disabled', () => {
client.disable();
const result = client.startSpan({ name: 'test-span', op: 'test' });
expect(result).toBeNull();
});
it('disable should not throw', () => {
expect(() => {
client.disable();
}).not.toThrow();
});
it('enable should not throw', () => {
expect(() => {
client.enable();
}).not.toThrow();
});
it('use should not throw on valid plugin', () => {
const plugin = {
name: 'test-plugin',
setup: vi.fn(),
};
expect(() => {
client.use(plugin);
}).not.toThrow();
});
it('use should not throw when plugin setup throws', () => {
const plugin = {
name: 'bad-plugin',
setup: () => {
throw new Error('setup failed');
},
};
expect(() => {
client.use(plugin);
}).not.toThrow();
});
it('flush should not throw', async () => {
await expect(client.flush()).resolves.not.toThrow();
});
it('destroy should not throw', () => {
expect(() => {
client.destroy();
}).not.toThrow();
});
it('init should not throw', () => {
const newClient = new Client({
dsn: 'https://proj_abc123@log.example.com/1001',
});
expect(() => {
newClient.init();
}).not.toThrow();
newClient.destroy();
});
it('setAnonymousId should not throw', () => {
expect(() => {
client.setAnonymousId('test-anon-id');
}).not.toThrow();
});
it('on/off/emit should not throw', () => {
const handler = vi.fn();
expect(() => {
client.on('test', handler);
}).not.toThrow();
expect(() => {
client.emit('test', 'data');
}).not.toThrow();
expect(() => {
client.off('test', handler);
}).not.toThrow();
});
it('event handler errors should not affect other handlers', () => {
const handler1 = vi.fn(() => {
throw new Error('handler1 failed');
});
const handler2 = vi.fn();
client.on('test-event', handler1);
client.on('test-event', handler2);
expect(() => {
client.emit('test-event', 'data');
}).not.toThrow();
expect(handler1).toHaveBeenCalled();
expect(handler2).toHaveBeenCalled();
});
});
describe('Config edge cases', () => {
it('should throw on missing DSN (config error, not SDK bug)', () => {
expect(() => {
new Client({ dsn: '' });
}).toThrow();
});
it('should throw on undefined DSN', () => {
expect(() => {
new Client({ dsn: undefined as unknown as string });
}).toThrow();
});
});
});

View File

@ -107,70 +107,73 @@ describe('logger', () => {
}); });
describe('logError', () => { describe('logError', () => {
it('should not log when debug is disabled', () => { it('should always log errors even when debug is disabled', () => {
const consoleSpy = vi.spyOn(console, 'error').mockImplementation(() => {}); setDebug(false);
logError('Test', 'This should not appear'); const consoleSpy = vi.spyOn(console, 'warn').mockImplementation(() => {});
expect(consoleSpy).not.toHaveBeenCalled(); logError('Test', 'This should always appear');
expect(consoleSpy).toHaveBeenCalled();
consoleSpy.mockRestore();
}); });
it('should log error message when debug is enabled', () => { it('should log error message when debug is enabled', () => {
setDebug(true); setDebug(true);
const consoleSpy = vi.spyOn(console, 'error').mockImplementation(() => {}); const consoleSpy = vi.spyOn(console, 'warn').mockImplementation(() => {});
logError('Test', 'This error should appear'); logError('Test', 'This error should appear');
expect(consoleSpy).toHaveBeenCalled(); expect(consoleSpy).toHaveBeenCalled();
consoleSpy.mockRestore();
}); });
it('should include ERROR tag in log message', () => { it('should include ERROR tag in log message', () => {
setDebug(true); const consoleSpy = vi.spyOn(console, 'warn').mockImplementation(() => {});
const consoleSpy = vi.spyOn(console, 'error').mockImplementation(() => {});
logError('Module', 'Error message'); logError('Module', 'Error message');
expect(consoleSpy).toHaveBeenCalled(); expect(consoleSpy).toHaveBeenCalled();
const loggedMessage = consoleSpy.mock.calls[0][0]; const loggedMessage = consoleSpy.mock.calls[0][0];
expect(loggedMessage).toContain('[LightSDK][Module][ERROR]'); expect(loggedMessage).toContain('[LightSDK][Module][ERROR]');
consoleSpy.mockRestore();
}); });
it('should log error with error data', () => { it('should log error with error data', () => {
setDebug(true); const consoleSpy = vi.spyOn(console, 'warn').mockImplementation(() => {});
const consoleSpy = vi.spyOn(console, 'error').mockImplementation(() => {});
const error = new Error('Test error'); const error = new Error('Test error');
logError('Module', 'Error occurred', error); logError('Module', 'Error occurred', error);
expect(consoleSpy).toHaveBeenCalled(); expect(consoleSpy).toHaveBeenCalled();
consoleSpy.mockRestore();
}); });
it('should handle plain object error', () => { it('should handle plain object error', () => {
setDebug(true); const consoleSpy = vi.spyOn(console, 'warn').mockImplementation(() => {});
const consoleSpy = vi.spyOn(console, 'error').mockImplementation(() => {});
const errorObj = { status: 404, message: 'Not found' }; const errorObj = { status: 404, message: 'Not found' };
logError('Module', 'Request failed', errorObj); logError('Module', 'Request failed', errorObj);
expect(consoleSpy).toHaveBeenCalled(); expect(consoleSpy).toHaveBeenCalled();
consoleSpy.mockRestore();
}); });
it('should handle error message without data', () => { it('should handle error message without data', () => {
setDebug(true); const consoleSpy = vi.spyOn(console, 'warn').mockImplementation(() => {});
const consoleSpy = vi.spyOn(console, 'error').mockImplementation(() => {});
logError('Module', 'Simple error'); logError('Module', 'Simple error');
expect(consoleSpy).toHaveBeenCalled(); expect(consoleSpy).toHaveBeenCalled();
consoleSpy.mockRestore();
}); });
it('should handle string error', () => { it('should handle string error', () => {
setDebug(true); const consoleSpy = vi.spyOn(console, 'warn').mockImplementation(() => {});
const consoleSpy = vi.spyOn(console, 'error').mockImplementation(() => {});
logError('Module', 'String error', 'error details'); logError('Module', 'String error', 'error details');
expect(consoleSpy).toHaveBeenCalled(); expect(consoleSpy).toHaveBeenCalled();
consoleSpy.mockRestore();
}); });
it('should handle undefined error', () => { it('should handle undefined error', () => {
setDebug(true); const consoleSpy = vi.spyOn(console, 'warn').mockImplementation(() => {});
const consoleSpy = vi.spyOn(console, 'error').mockImplementation(() => {});
logError('Module', 'Error without details', undefined); logError('Module', 'Error without details', undefined);
expect(consoleSpy).toHaveBeenCalled(); expect(consoleSpy).toHaveBeenCalled();
consoleSpy.mockRestore();
}); });
}); });
describe('debug toggle behavior', () => { describe('debug toggle behavior', () => {
it('should toggle between enabled and disabled', () => { it('should toggle debug logs between enabled and disabled', () => {
const consoleLogSpy = vi.spyOn(console, 'log').mockImplementation(() => {}); const consoleLogSpy = vi.spyOn(console, 'log').mockImplementation(() => {});
const consoleErrorSpy = vi.spyOn(console, 'error').mockImplementation(() => {}); const consoleWarnSpy = vi.spyOn(console, 'warn').mockImplementation(() => {});
setDebug(true); setDebug(true);
logDebug('Test', 'Debug on'); logDebug('Test', 'Debug on');
@ -180,13 +183,18 @@ describe('logger', () => {
logDebug('Test', 'Debug off'); logDebug('Test', 'Debug off');
expect(consoleLogSpy).toHaveBeenCalledTimes(1); expect(consoleLogSpy).toHaveBeenCalledTimes(1);
// logError should always work regardless of debug flag
setDebug(true); setDebug(true);
logError('Test', 'Error on'); logError('Test', 'Error on');
expect(consoleErrorSpy).toHaveBeenCalled(); const errorCallCountWhenOn = consoleWarnSpy.mock.calls.length;
expect(errorCallCountWhenOn).toBeGreaterThan(0);
setDebug(false); setDebug(false);
logError('Test', 'Error off'); logError('Test', 'Error off');
expect(consoleErrorSpy).toHaveBeenCalledTimes(1); expect(consoleWarnSpy).toHaveBeenCalledTimes(errorCallCountWhenOn + 1);
consoleLogSpy.mockRestore();
consoleWarnSpy.mockRestore();
}); });
}); });
}); });