@claude-flow/security 3.0.0-alpha.1 → 3.0.0-alpha.8

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (82) hide show
  1. package/README.md +59 -1
  2. package/__tests__/acceptance/security-compliance.test.ts +1 -1
  3. package/__tests__/credential-generator.test.ts +1 -1
  4. package/__tests__/fixtures/configurations.ts +9 -3
  5. package/__tests__/input-validator.test.ts +3 -2
  6. package/__tests__/password-hasher.test.ts +1 -1
  7. package/__tests__/path-validator.test.ts +1 -1
  8. package/__tests__/safe-executor.test.ts +1 -1
  9. package/__tests__/token-generator.test.ts +1 -1
  10. package/__tests__/unit/credential-generator.test.ts +1 -1
  11. package/__tests__/unit/password-hasher.test.ts +2 -2
  12. package/__tests__/unit/path-validator.test.ts +2 -2
  13. package/__tests__/unit/safe-executor.test.ts +4 -4
  14. package/__tests__/unit/token-generator.test.ts +1 -1
  15. package/dist/domain/services/security-domain-service.js +1 -1
  16. package/dist/domain/services/security-domain-service.js.map +1 -1
  17. package/dist/index.d.ts +1 -1
  18. package/dist/index.js +1 -1
  19. package/dist/index.js.map +1 -1
  20. package/dist/password-hasher.d.ts.map +1 -1
  21. package/dist/password-hasher.js +8 -1
  22. package/dist/password-hasher.js.map +1 -1
  23. package/dist/safe-executor.d.ts +7 -0
  24. package/dist/safe-executor.d.ts.map +1 -1
  25. package/dist/safe-executor.js +21 -1
  26. package/dist/safe-executor.js.map +1 -1
  27. package/package.json +3 -4
  28. package/ruvector.db +0 -0
  29. package/src/domain/services/security-domain-service.ts +1 -1
  30. package/src/index.ts +2 -2
  31. package/src/password-hasher.ts +8 -1
  32. package/src/safe-executor.ts +22 -1
  33. package/tmp.json +0 -0
  34. package/tsconfig.tsbuildinfo +1 -1
  35. package/vitest.config.ts +20 -0
  36. package/.agentic-flow/intelligence.json +0 -16
  37. package/__tests__/coverage/base.css +0 -224
  38. package/__tests__/coverage/block-navigation.js +0 -87
  39. package/__tests__/coverage/coverage-final.json +0 -11
  40. package/__tests__/coverage/favicon.png +0 -0
  41. package/__tests__/coverage/index.html +0 -161
  42. package/__tests__/coverage/lcov-report/base.css +0 -224
  43. package/__tests__/coverage/lcov-report/block-navigation.js +0 -87
  44. package/__tests__/coverage/lcov-report/favicon.png +0 -0
  45. package/__tests__/coverage/lcov-report/index.html +0 -161
  46. package/__tests__/coverage/lcov-report/prettify.css +0 -1
  47. package/__tests__/coverage/lcov-report/prettify.js +0 -2
  48. package/__tests__/coverage/lcov-report/sort-arrow-sprite.png +0 -0
  49. package/__tests__/coverage/lcov-report/sorter.js +0 -210
  50. package/__tests__/coverage/lcov-report/src/CVE-REMEDIATION.ts.html +0 -838
  51. package/__tests__/coverage/lcov-report/src/application/services/index.html +0 -116
  52. package/__tests__/coverage/lcov-report/src/application/services/security-application-service.ts.html +0 -664
  53. package/__tests__/coverage/lcov-report/src/credential-generator.ts.html +0 -1189
  54. package/__tests__/coverage/lcov-report/src/domain/entities/index.html +0 -116
  55. package/__tests__/coverage/lcov-report/src/domain/entities/security-context.ts.html +0 -604
  56. package/__tests__/coverage/lcov-report/src/domain/services/index.html +0 -116
  57. package/__tests__/coverage/lcov-report/src/domain/services/security-domain-service.ts.html +0 -973
  58. package/__tests__/coverage/lcov-report/src/index.html +0 -206
  59. package/__tests__/coverage/lcov-report/src/input-validator.ts.html +0 -1483
  60. package/__tests__/coverage/lcov-report/src/password-hasher.ts.html +0 -895
  61. package/__tests__/coverage/lcov-report/src/path-validator.ts.html +0 -1660
  62. package/__tests__/coverage/lcov-report/src/safe-executor.ts.html +0 -1660
  63. package/__tests__/coverage/lcov-report/src/token-generator.ts.html +0 -1474
  64. package/__tests__/coverage/lcov.info +0 -3650
  65. package/__tests__/coverage/prettify.css +0 -1
  66. package/__tests__/coverage/prettify.js +0 -2
  67. package/__tests__/coverage/sort-arrow-sprite.png +0 -0
  68. package/__tests__/coverage/sorter.js +0 -210
  69. package/__tests__/coverage/src/CVE-REMEDIATION.ts.html +0 -838
  70. package/__tests__/coverage/src/application/services/index.html +0 -116
  71. package/__tests__/coverage/src/application/services/security-application-service.ts.html +0 -664
  72. package/__tests__/coverage/src/credential-generator.ts.html +0 -1189
  73. package/__tests__/coverage/src/domain/entities/index.html +0 -116
  74. package/__tests__/coverage/src/domain/entities/security-context.ts.html +0 -604
  75. package/__tests__/coverage/src/domain/services/index.html +0 -116
  76. package/__tests__/coverage/src/domain/services/security-domain-service.ts.html +0 -973
  77. package/__tests__/coverage/src/index.html +0 -206
  78. package/__tests__/coverage/src/input-validator.ts.html +0 -1483
  79. package/__tests__/coverage/src/password-hasher.ts.html +0 -895
  80. package/__tests__/coverage/src/path-validator.ts.html +0 -1660
  81. package/__tests__/coverage/src/safe-executor.ts.html +0 -1660
  82. package/__tests__/coverage/src/token-generator.ts.html +0 -1474
@@ -1,1474 +0,0 @@
1
-
2
- <!doctype html>
3
- <html lang="en">
4
-
5
- <head>
6
- <title>Code coverage report for src/token-generator.ts</title>
7
- <meta charset="utf-8" />
8
- <link rel="stylesheet" href="../prettify.css" />
9
- <link rel="stylesheet" href="../base.css" />
10
- <link rel="shortcut icon" type="image/x-icon" href="../favicon.png" />
11
- <meta name="viewport" content="width=device-width, initial-scale=1" />
12
- <style type='text/css'>
13
- .coverage-summary .sorter {
14
- background-image: url(../sort-arrow-sprite.png);
15
- }
16
- </style>
17
- </head>
18
-
19
- <body>
20
- <div class='wrapper'>
21
- <div class='pad1'>
22
- <h1><a href="../index.html">All files</a> / <a href="index.html">src</a> token-generator.ts</h1>
23
- <div class='clearfix'>
24
-
25
- <div class='fl pad1y space-right2'>
26
- <span class="strong">0% </span>
27
- <span class="quiet">Statements</span>
28
- <span class='fraction'>0/463</span>
29
- </div>
30
-
31
-
32
- <div class='fl pad1y space-right2'>
33
- <span class="strong">0% </span>
34
- <span class="quiet">Branches</span>
35
- <span class='fraction'>0/1</span>
36
- </div>
37
-
38
-
39
- <div class='fl pad1y space-right2'>
40
- <span class="strong">0% </span>
41
- <span class="quiet">Functions</span>
42
- <span class='fraction'>0/1</span>
43
- </div>
44
-
45
-
46
- <div class='fl pad1y space-right2'>
47
- <span class="strong">0% </span>
48
- <span class="quiet">Lines</span>
49
- <span class='fraction'>0/463</span>
50
- </div>
51
-
52
-
53
- </div>
54
- <p class="quiet">
55
- Press <em>n</em> or <em>j</em> to go to the next uncovered block, <em>b</em>, <em>p</em> or <em>k</em> for the previous block.
56
- </p>
57
- <template id="filterTemplate">
58
- <div class="quiet">
59
- Filter:
60
- <input type="search" id="fileSearch">
61
- </div>
62
- </template>
63
- </div>
64
- <div class='status-line low'></div>
65
- <pre><table class="coverage">
66
- <tr><td class="line-count quiet"><a name='L1'></a><a href='#L1'>1</a>
67
- <a name='L2'></a><a href='#L2'>2</a>
68
- <a name='L3'></a><a href='#L3'>3</a>
69
- <a name='L4'></a><a href='#L4'>4</a>
70
- <a name='L5'></a><a href='#L5'>5</a>
71
- <a name='L6'></a><a href='#L6'>6</a>
72
- <a name='L7'></a><a href='#L7'>7</a>
73
- <a name='L8'></a><a href='#L8'>8</a>
74
- <a name='L9'></a><a href='#L9'>9</a>
75
- <a name='L10'></a><a href='#L10'>10</a>
76
- <a name='L11'></a><a href='#L11'>11</a>
77
- <a name='L12'></a><a href='#L12'>12</a>
78
- <a name='L13'></a><a href='#L13'>13</a>
79
- <a name='L14'></a><a href='#L14'>14</a>
80
- <a name='L15'></a><a href='#L15'>15</a>
81
- <a name='L16'></a><a href='#L16'>16</a>
82
- <a name='L17'></a><a href='#L17'>17</a>
83
- <a name='L18'></a><a href='#L18'>18</a>
84
- <a name='L19'></a><a href='#L19'>19</a>
85
- <a name='L20'></a><a href='#L20'>20</a>
86
- <a name='L21'></a><a href='#L21'>21</a>
87
- <a name='L22'></a><a href='#L22'>22</a>
88
- <a name='L23'></a><a href='#L23'>23</a>
89
- <a name='L24'></a><a href='#L24'>24</a>
90
- <a name='L25'></a><a href='#L25'>25</a>
91
- <a name='L26'></a><a href='#L26'>26</a>
92
- <a name='L27'></a><a href='#L27'>27</a>
93
- <a name='L28'></a><a href='#L28'>28</a>
94
- <a name='L29'></a><a href='#L29'>29</a>
95
- <a name='L30'></a><a href='#L30'>30</a>
96
- <a name='L31'></a><a href='#L31'>31</a>
97
- <a name='L32'></a><a href='#L32'>32</a>
98
- <a name='L33'></a><a href='#L33'>33</a>
99
- <a name='L34'></a><a href='#L34'>34</a>
100
- <a name='L35'></a><a href='#L35'>35</a>
101
- <a name='L36'></a><a href='#L36'>36</a>
102
- <a name='L37'></a><a href='#L37'>37</a>
103
- <a name='L38'></a><a href='#L38'>38</a>
104
- <a name='L39'></a><a href='#L39'>39</a>
105
- <a name='L40'></a><a href='#L40'>40</a>
106
- <a name='L41'></a><a href='#L41'>41</a>
107
- <a name='L42'></a><a href='#L42'>42</a>
108
- <a name='L43'></a><a href='#L43'>43</a>
109
- <a name='L44'></a><a href='#L44'>44</a>
110
- <a name='L45'></a><a href='#L45'>45</a>
111
- <a name='L46'></a><a href='#L46'>46</a>
112
- <a name='L47'></a><a href='#L47'>47</a>
113
- <a name='L48'></a><a href='#L48'>48</a>
114
- <a name='L49'></a><a href='#L49'>49</a>
115
- <a name='L50'></a><a href='#L50'>50</a>
116
- <a name='L51'></a><a href='#L51'>51</a>
117
- <a name='L52'></a><a href='#L52'>52</a>
118
- <a name='L53'></a><a href='#L53'>53</a>
119
- <a name='L54'></a><a href='#L54'>54</a>
120
- <a name='L55'></a><a href='#L55'>55</a>
121
- <a name='L56'></a><a href='#L56'>56</a>
122
- <a name='L57'></a><a href='#L57'>57</a>
123
- <a name='L58'></a><a href='#L58'>58</a>
124
- <a name='L59'></a><a href='#L59'>59</a>
125
- <a name='L60'></a><a href='#L60'>60</a>
126
- <a name='L61'></a><a href='#L61'>61</a>
127
- <a name='L62'></a><a href='#L62'>62</a>
128
- <a name='L63'></a><a href='#L63'>63</a>
129
- <a name='L64'></a><a href='#L64'>64</a>
130
- <a name='L65'></a><a href='#L65'>65</a>
131
- <a name='L66'></a><a href='#L66'>66</a>
132
- <a name='L67'></a><a href='#L67'>67</a>
133
- <a name='L68'></a><a href='#L68'>68</a>
134
- <a name='L69'></a><a href='#L69'>69</a>
135
- <a name='L70'></a><a href='#L70'>70</a>
136
- <a name='L71'></a><a href='#L71'>71</a>
137
- <a name='L72'></a><a href='#L72'>72</a>
138
- <a name='L73'></a><a href='#L73'>73</a>
139
- <a name='L74'></a><a href='#L74'>74</a>
140
- <a name='L75'></a><a href='#L75'>75</a>
141
- <a name='L76'></a><a href='#L76'>76</a>
142
- <a name='L77'></a><a href='#L77'>77</a>
143
- <a name='L78'></a><a href='#L78'>78</a>
144
- <a name='L79'></a><a href='#L79'>79</a>
145
- <a name='L80'></a><a href='#L80'>80</a>
146
- <a name='L81'></a><a href='#L81'>81</a>
147
- <a name='L82'></a><a href='#L82'>82</a>
148
- <a name='L83'></a><a href='#L83'>83</a>
149
- <a name='L84'></a><a href='#L84'>84</a>
150
- <a name='L85'></a><a href='#L85'>85</a>
151
- <a name='L86'></a><a href='#L86'>86</a>
152
- <a name='L87'></a><a href='#L87'>87</a>
153
- <a name='L88'></a><a href='#L88'>88</a>
154
- <a name='L89'></a><a href='#L89'>89</a>
155
- <a name='L90'></a><a href='#L90'>90</a>
156
- <a name='L91'></a><a href='#L91'>91</a>
157
- <a name='L92'></a><a href='#L92'>92</a>
158
- <a name='L93'></a><a href='#L93'>93</a>
159
- <a name='L94'></a><a href='#L94'>94</a>
160
- <a name='L95'></a><a href='#L95'>95</a>
161
- <a name='L96'></a><a href='#L96'>96</a>
162
- <a name='L97'></a><a href='#L97'>97</a>
163
- <a name='L98'></a><a href='#L98'>98</a>
164
- <a name='L99'></a><a href='#L99'>99</a>
165
- <a name='L100'></a><a href='#L100'>100</a>
166
- <a name='L101'></a><a href='#L101'>101</a>
167
- <a name='L102'></a><a href='#L102'>102</a>
168
- <a name='L103'></a><a href='#L103'>103</a>
169
- <a name='L104'></a><a href='#L104'>104</a>
170
- <a name='L105'></a><a href='#L105'>105</a>
171
- <a name='L106'></a><a href='#L106'>106</a>
172
- <a name='L107'></a><a href='#L107'>107</a>
173
- <a name='L108'></a><a href='#L108'>108</a>
174
- <a name='L109'></a><a href='#L109'>109</a>
175
- <a name='L110'></a><a href='#L110'>110</a>
176
- <a name='L111'></a><a href='#L111'>111</a>
177
- <a name='L112'></a><a href='#L112'>112</a>
178
- <a name='L113'></a><a href='#L113'>113</a>
179
- <a name='L114'></a><a href='#L114'>114</a>
180
- <a name='L115'></a><a href='#L115'>115</a>
181
- <a name='L116'></a><a href='#L116'>116</a>
182
- <a name='L117'></a><a href='#L117'>117</a>
183
- <a name='L118'></a><a href='#L118'>118</a>
184
- <a name='L119'></a><a href='#L119'>119</a>
185
- <a name='L120'></a><a href='#L120'>120</a>
186
- <a name='L121'></a><a href='#L121'>121</a>
187
- <a name='L122'></a><a href='#L122'>122</a>
188
- <a name='L123'></a><a href='#L123'>123</a>
189
- <a name='L124'></a><a href='#L124'>124</a>
190
- <a name='L125'></a><a href='#L125'>125</a>
191
- <a name='L126'></a><a href='#L126'>126</a>
192
- <a name='L127'></a><a href='#L127'>127</a>
193
- <a name='L128'></a><a href='#L128'>128</a>
194
- <a name='L129'></a><a href='#L129'>129</a>
195
- <a name='L130'></a><a href='#L130'>130</a>
196
- <a name='L131'></a><a href='#L131'>131</a>
197
- <a name='L132'></a><a href='#L132'>132</a>
198
- <a name='L133'></a><a href='#L133'>133</a>
199
- <a name='L134'></a><a href='#L134'>134</a>
200
- <a name='L135'></a><a href='#L135'>135</a>
201
- <a name='L136'></a><a href='#L136'>136</a>
202
- <a name='L137'></a><a href='#L137'>137</a>
203
- <a name='L138'></a><a href='#L138'>138</a>
204
- <a name='L139'></a><a href='#L139'>139</a>
205
- <a name='L140'></a><a href='#L140'>140</a>
206
- <a name='L141'></a><a href='#L141'>141</a>
207
- <a name='L142'></a><a href='#L142'>142</a>
208
- <a name='L143'></a><a href='#L143'>143</a>
209
- <a name='L144'></a><a href='#L144'>144</a>
210
- <a name='L145'></a><a href='#L145'>145</a>
211
- <a name='L146'></a><a href='#L146'>146</a>
212
- <a name='L147'></a><a href='#L147'>147</a>
213
- <a name='L148'></a><a href='#L148'>148</a>
214
- <a name='L149'></a><a href='#L149'>149</a>
215
- <a name='L150'></a><a href='#L150'>150</a>
216
- <a name='L151'></a><a href='#L151'>151</a>
217
- <a name='L152'></a><a href='#L152'>152</a>
218
- <a name='L153'></a><a href='#L153'>153</a>
219
- <a name='L154'></a><a href='#L154'>154</a>
220
- <a name='L155'></a><a href='#L155'>155</a>
221
- <a name='L156'></a><a href='#L156'>156</a>
222
- <a name='L157'></a><a href='#L157'>157</a>
223
- <a name='L158'></a><a href='#L158'>158</a>
224
- <a name='L159'></a><a href='#L159'>159</a>
225
- <a name='L160'></a><a href='#L160'>160</a>
226
- <a name='L161'></a><a href='#L161'>161</a>
227
- <a name='L162'></a><a href='#L162'>162</a>
228
- <a name='L163'></a><a href='#L163'>163</a>
229
- <a name='L164'></a><a href='#L164'>164</a>
230
- <a name='L165'></a><a href='#L165'>165</a>
231
- <a name='L166'></a><a href='#L166'>166</a>
232
- <a name='L167'></a><a href='#L167'>167</a>
233
- <a name='L168'></a><a href='#L168'>168</a>
234
- <a name='L169'></a><a href='#L169'>169</a>
235
- <a name='L170'></a><a href='#L170'>170</a>
236
- <a name='L171'></a><a href='#L171'>171</a>
237
- <a name='L172'></a><a href='#L172'>172</a>
238
- <a name='L173'></a><a href='#L173'>173</a>
239
- <a name='L174'></a><a href='#L174'>174</a>
240
- <a name='L175'></a><a href='#L175'>175</a>
241
- <a name='L176'></a><a href='#L176'>176</a>
242
- <a name='L177'></a><a href='#L177'>177</a>
243
- <a name='L178'></a><a href='#L178'>178</a>
244
- <a name='L179'></a><a href='#L179'>179</a>
245
- <a name='L180'></a><a href='#L180'>180</a>
246
- <a name='L181'></a><a href='#L181'>181</a>
247
- <a name='L182'></a><a href='#L182'>182</a>
248
- <a name='L183'></a><a href='#L183'>183</a>
249
- <a name='L184'></a><a href='#L184'>184</a>
250
- <a name='L185'></a><a href='#L185'>185</a>
251
- <a name='L186'></a><a href='#L186'>186</a>
252
- <a name='L187'></a><a href='#L187'>187</a>
253
- <a name='L188'></a><a href='#L188'>188</a>
254
- <a name='L189'></a><a href='#L189'>189</a>
255
- <a name='L190'></a><a href='#L190'>190</a>
256
- <a name='L191'></a><a href='#L191'>191</a>
257
- <a name='L192'></a><a href='#L192'>192</a>
258
- <a name='L193'></a><a href='#L193'>193</a>
259
- <a name='L194'></a><a href='#L194'>194</a>
260
- <a name='L195'></a><a href='#L195'>195</a>
261
- <a name='L196'></a><a href='#L196'>196</a>
262
- <a name='L197'></a><a href='#L197'>197</a>
263
- <a name='L198'></a><a href='#L198'>198</a>
264
- <a name='L199'></a><a href='#L199'>199</a>
265
- <a name='L200'></a><a href='#L200'>200</a>
266
- <a name='L201'></a><a href='#L201'>201</a>
267
- <a name='L202'></a><a href='#L202'>202</a>
268
- <a name='L203'></a><a href='#L203'>203</a>
269
- <a name='L204'></a><a href='#L204'>204</a>
270
- <a name='L205'></a><a href='#L205'>205</a>
271
- <a name='L206'></a><a href='#L206'>206</a>
272
- <a name='L207'></a><a href='#L207'>207</a>
273
- <a name='L208'></a><a href='#L208'>208</a>
274
- <a name='L209'></a><a href='#L209'>209</a>
275
- <a name='L210'></a><a href='#L210'>210</a>
276
- <a name='L211'></a><a href='#L211'>211</a>
277
- <a name='L212'></a><a href='#L212'>212</a>
278
- <a name='L213'></a><a href='#L213'>213</a>
279
- <a name='L214'></a><a href='#L214'>214</a>
280
- <a name='L215'></a><a href='#L215'>215</a>
281
- <a name='L216'></a><a href='#L216'>216</a>
282
- <a name='L217'></a><a href='#L217'>217</a>
283
- <a name='L218'></a><a href='#L218'>218</a>
284
- <a name='L219'></a><a href='#L219'>219</a>
285
- <a name='L220'></a><a href='#L220'>220</a>
286
- <a name='L221'></a><a href='#L221'>221</a>
287
- <a name='L222'></a><a href='#L222'>222</a>
288
- <a name='L223'></a><a href='#L223'>223</a>
289
- <a name='L224'></a><a href='#L224'>224</a>
290
- <a name='L225'></a><a href='#L225'>225</a>
291
- <a name='L226'></a><a href='#L226'>226</a>
292
- <a name='L227'></a><a href='#L227'>227</a>
293
- <a name='L228'></a><a href='#L228'>228</a>
294
- <a name='L229'></a><a href='#L229'>229</a>
295
- <a name='L230'></a><a href='#L230'>230</a>
296
- <a name='L231'></a><a href='#L231'>231</a>
297
- <a name='L232'></a><a href='#L232'>232</a>
298
- <a name='L233'></a><a href='#L233'>233</a>
299
- <a name='L234'></a><a href='#L234'>234</a>
300
- <a name='L235'></a><a href='#L235'>235</a>
301
- <a name='L236'></a><a href='#L236'>236</a>
302
- <a name='L237'></a><a href='#L237'>237</a>
303
- <a name='L238'></a><a href='#L238'>238</a>
304
- <a name='L239'></a><a href='#L239'>239</a>
305
- <a name='L240'></a><a href='#L240'>240</a>
306
- <a name='L241'></a><a href='#L241'>241</a>
307
- <a name='L242'></a><a href='#L242'>242</a>
308
- <a name='L243'></a><a href='#L243'>243</a>
309
- <a name='L244'></a><a href='#L244'>244</a>
310
- <a name='L245'></a><a href='#L245'>245</a>
311
- <a name='L246'></a><a href='#L246'>246</a>
312
- <a name='L247'></a><a href='#L247'>247</a>
313
- <a name='L248'></a><a href='#L248'>248</a>
314
- <a name='L249'></a><a href='#L249'>249</a>
315
- <a name='L250'></a><a href='#L250'>250</a>
316
- <a name='L251'></a><a href='#L251'>251</a>
317
- <a name='L252'></a><a href='#L252'>252</a>
318
- <a name='L253'></a><a href='#L253'>253</a>
319
- <a name='L254'></a><a href='#L254'>254</a>
320
- <a name='L255'></a><a href='#L255'>255</a>
321
- <a name='L256'></a><a href='#L256'>256</a>
322
- <a name='L257'></a><a href='#L257'>257</a>
323
- <a name='L258'></a><a href='#L258'>258</a>
324
- <a name='L259'></a><a href='#L259'>259</a>
325
- <a name='L260'></a><a href='#L260'>260</a>
326
- <a name='L261'></a><a href='#L261'>261</a>
327
- <a name='L262'></a><a href='#L262'>262</a>
328
- <a name='L263'></a><a href='#L263'>263</a>
329
- <a name='L264'></a><a href='#L264'>264</a>
330
- <a name='L265'></a><a href='#L265'>265</a>
331
- <a name='L266'></a><a href='#L266'>266</a>
332
- <a name='L267'></a><a href='#L267'>267</a>
333
- <a name='L268'></a><a href='#L268'>268</a>
334
- <a name='L269'></a><a href='#L269'>269</a>
335
- <a name='L270'></a><a href='#L270'>270</a>
336
- <a name='L271'></a><a href='#L271'>271</a>
337
- <a name='L272'></a><a href='#L272'>272</a>
338
- <a name='L273'></a><a href='#L273'>273</a>
339
- <a name='L274'></a><a href='#L274'>274</a>
340
- <a name='L275'></a><a href='#L275'>275</a>
341
- <a name='L276'></a><a href='#L276'>276</a>
342
- <a name='L277'></a><a href='#L277'>277</a>
343
- <a name='L278'></a><a href='#L278'>278</a>
344
- <a name='L279'></a><a href='#L279'>279</a>
345
- <a name='L280'></a><a href='#L280'>280</a>
346
- <a name='L281'></a><a href='#L281'>281</a>
347
- <a name='L282'></a><a href='#L282'>282</a>
348
- <a name='L283'></a><a href='#L283'>283</a>
349
- <a name='L284'></a><a href='#L284'>284</a>
350
- <a name='L285'></a><a href='#L285'>285</a>
351
- <a name='L286'></a><a href='#L286'>286</a>
352
- <a name='L287'></a><a href='#L287'>287</a>
353
- <a name='L288'></a><a href='#L288'>288</a>
354
- <a name='L289'></a><a href='#L289'>289</a>
355
- <a name='L290'></a><a href='#L290'>290</a>
356
- <a name='L291'></a><a href='#L291'>291</a>
357
- <a name='L292'></a><a href='#L292'>292</a>
358
- <a name='L293'></a><a href='#L293'>293</a>
359
- <a name='L294'></a><a href='#L294'>294</a>
360
- <a name='L295'></a><a href='#L295'>295</a>
361
- <a name='L296'></a><a href='#L296'>296</a>
362
- <a name='L297'></a><a href='#L297'>297</a>
363
- <a name='L298'></a><a href='#L298'>298</a>
364
- <a name='L299'></a><a href='#L299'>299</a>
365
- <a name='L300'></a><a href='#L300'>300</a>
366
- <a name='L301'></a><a href='#L301'>301</a>
367
- <a name='L302'></a><a href='#L302'>302</a>
368
- <a name='L303'></a><a href='#L303'>303</a>
369
- <a name='L304'></a><a href='#L304'>304</a>
370
- <a name='L305'></a><a href='#L305'>305</a>
371
- <a name='L306'></a><a href='#L306'>306</a>
372
- <a name='L307'></a><a href='#L307'>307</a>
373
- <a name='L308'></a><a href='#L308'>308</a>
374
- <a name='L309'></a><a href='#L309'>309</a>
375
- <a name='L310'></a><a href='#L310'>310</a>
376
- <a name='L311'></a><a href='#L311'>311</a>
377
- <a name='L312'></a><a href='#L312'>312</a>
378
- <a name='L313'></a><a href='#L313'>313</a>
379
- <a name='L314'></a><a href='#L314'>314</a>
380
- <a name='L315'></a><a href='#L315'>315</a>
381
- <a name='L316'></a><a href='#L316'>316</a>
382
- <a name='L317'></a><a href='#L317'>317</a>
383
- <a name='L318'></a><a href='#L318'>318</a>
384
- <a name='L319'></a><a href='#L319'>319</a>
385
- <a name='L320'></a><a href='#L320'>320</a>
386
- <a name='L321'></a><a href='#L321'>321</a>
387
- <a name='L322'></a><a href='#L322'>322</a>
388
- <a name='L323'></a><a href='#L323'>323</a>
389
- <a name='L324'></a><a href='#L324'>324</a>
390
- <a name='L325'></a><a href='#L325'>325</a>
391
- <a name='L326'></a><a href='#L326'>326</a>
392
- <a name='L327'></a><a href='#L327'>327</a>
393
- <a name='L328'></a><a href='#L328'>328</a>
394
- <a name='L329'></a><a href='#L329'>329</a>
395
- <a name='L330'></a><a href='#L330'>330</a>
396
- <a name='L331'></a><a href='#L331'>331</a>
397
- <a name='L332'></a><a href='#L332'>332</a>
398
- <a name='L333'></a><a href='#L333'>333</a>
399
- <a name='L334'></a><a href='#L334'>334</a>
400
- <a name='L335'></a><a href='#L335'>335</a>
401
- <a name='L336'></a><a href='#L336'>336</a>
402
- <a name='L337'></a><a href='#L337'>337</a>
403
- <a name='L338'></a><a href='#L338'>338</a>
404
- <a name='L339'></a><a href='#L339'>339</a>
405
- <a name='L340'></a><a href='#L340'>340</a>
406
- <a name='L341'></a><a href='#L341'>341</a>
407
- <a name='L342'></a><a href='#L342'>342</a>
408
- <a name='L343'></a><a href='#L343'>343</a>
409
- <a name='L344'></a><a href='#L344'>344</a>
410
- <a name='L345'></a><a href='#L345'>345</a>
411
- <a name='L346'></a><a href='#L346'>346</a>
412
- <a name='L347'></a><a href='#L347'>347</a>
413
- <a name='L348'></a><a href='#L348'>348</a>
414
- <a name='L349'></a><a href='#L349'>349</a>
415
- <a name='L350'></a><a href='#L350'>350</a>
416
- <a name='L351'></a><a href='#L351'>351</a>
417
- <a name='L352'></a><a href='#L352'>352</a>
418
- <a name='L353'></a><a href='#L353'>353</a>
419
- <a name='L354'></a><a href='#L354'>354</a>
420
- <a name='L355'></a><a href='#L355'>355</a>
421
- <a name='L356'></a><a href='#L356'>356</a>
422
- <a name='L357'></a><a href='#L357'>357</a>
423
- <a name='L358'></a><a href='#L358'>358</a>
424
- <a name='L359'></a><a href='#L359'>359</a>
425
- <a name='L360'></a><a href='#L360'>360</a>
426
- <a name='L361'></a><a href='#L361'>361</a>
427
- <a name='L362'></a><a href='#L362'>362</a>
428
- <a name='L363'></a><a href='#L363'>363</a>
429
- <a name='L364'></a><a href='#L364'>364</a>
430
- <a name='L365'></a><a href='#L365'>365</a>
431
- <a name='L366'></a><a href='#L366'>366</a>
432
- <a name='L367'></a><a href='#L367'>367</a>
433
- <a name='L368'></a><a href='#L368'>368</a>
434
- <a name='L369'></a><a href='#L369'>369</a>
435
- <a name='L370'></a><a href='#L370'>370</a>
436
- <a name='L371'></a><a href='#L371'>371</a>
437
- <a name='L372'></a><a href='#L372'>372</a>
438
- <a name='L373'></a><a href='#L373'>373</a>
439
- <a name='L374'></a><a href='#L374'>374</a>
440
- <a name='L375'></a><a href='#L375'>375</a>
441
- <a name='L376'></a><a href='#L376'>376</a>
442
- <a name='L377'></a><a href='#L377'>377</a>
443
- <a name='L378'></a><a href='#L378'>378</a>
444
- <a name='L379'></a><a href='#L379'>379</a>
445
- <a name='L380'></a><a href='#L380'>380</a>
446
- <a name='L381'></a><a href='#L381'>381</a>
447
- <a name='L382'></a><a href='#L382'>382</a>
448
- <a name='L383'></a><a href='#L383'>383</a>
449
- <a name='L384'></a><a href='#L384'>384</a>
450
- <a name='L385'></a><a href='#L385'>385</a>
451
- <a name='L386'></a><a href='#L386'>386</a>
452
- <a name='L387'></a><a href='#L387'>387</a>
453
- <a name='L388'></a><a href='#L388'>388</a>
454
- <a name='L389'></a><a href='#L389'>389</a>
455
- <a name='L390'></a><a href='#L390'>390</a>
456
- <a name='L391'></a><a href='#L391'>391</a>
457
- <a name='L392'></a><a href='#L392'>392</a>
458
- <a name='L393'></a><a href='#L393'>393</a>
459
- <a name='L394'></a><a href='#L394'>394</a>
460
- <a name='L395'></a><a href='#L395'>395</a>
461
- <a name='L396'></a><a href='#L396'>396</a>
462
- <a name='L397'></a><a href='#L397'>397</a>
463
- <a name='L398'></a><a href='#L398'>398</a>
464
- <a name='L399'></a><a href='#L399'>399</a>
465
- <a name='L400'></a><a href='#L400'>400</a>
466
- <a name='L401'></a><a href='#L401'>401</a>
467
- <a name='L402'></a><a href='#L402'>402</a>
468
- <a name='L403'></a><a href='#L403'>403</a>
469
- <a name='L404'></a><a href='#L404'>404</a>
470
- <a name='L405'></a><a href='#L405'>405</a>
471
- <a name='L406'></a><a href='#L406'>406</a>
472
- <a name='L407'></a><a href='#L407'>407</a>
473
- <a name='L408'></a><a href='#L408'>408</a>
474
- <a name='L409'></a><a href='#L409'>409</a>
475
- <a name='L410'></a><a href='#L410'>410</a>
476
- <a name='L411'></a><a href='#L411'>411</a>
477
- <a name='L412'></a><a href='#L412'>412</a>
478
- <a name='L413'></a><a href='#L413'>413</a>
479
- <a name='L414'></a><a href='#L414'>414</a>
480
- <a name='L415'></a><a href='#L415'>415</a>
481
- <a name='L416'></a><a href='#L416'>416</a>
482
- <a name='L417'></a><a href='#L417'>417</a>
483
- <a name='L418'></a><a href='#L418'>418</a>
484
- <a name='L419'></a><a href='#L419'>419</a>
485
- <a name='L420'></a><a href='#L420'>420</a>
486
- <a name='L421'></a><a href='#L421'>421</a>
487
- <a name='L422'></a><a href='#L422'>422</a>
488
- <a name='L423'></a><a href='#L423'>423</a>
489
- <a name='L424'></a><a href='#L424'>424</a>
490
- <a name='L425'></a><a href='#L425'>425</a>
491
- <a name='L426'></a><a href='#L426'>426</a>
492
- <a name='L427'></a><a href='#L427'>427</a>
493
- <a name='L428'></a><a href='#L428'>428</a>
494
- <a name='L429'></a><a href='#L429'>429</a>
495
- <a name='L430'></a><a href='#L430'>430</a>
496
- <a name='L431'></a><a href='#L431'>431</a>
497
- <a name='L432'></a><a href='#L432'>432</a>
498
- <a name='L433'></a><a href='#L433'>433</a>
499
- <a name='L434'></a><a href='#L434'>434</a>
500
- <a name='L435'></a><a href='#L435'>435</a>
501
- <a name='L436'></a><a href='#L436'>436</a>
502
- <a name='L437'></a><a href='#L437'>437</a>
503
- <a name='L438'></a><a href='#L438'>438</a>
504
- <a name='L439'></a><a href='#L439'>439</a>
505
- <a name='L440'></a><a href='#L440'>440</a>
506
- <a name='L441'></a><a href='#L441'>441</a>
507
- <a name='L442'></a><a href='#L442'>442</a>
508
- <a name='L443'></a><a href='#L443'>443</a>
509
- <a name='L444'></a><a href='#L444'>444</a>
510
- <a name='L445'></a><a href='#L445'>445</a>
511
- <a name='L446'></a><a href='#L446'>446</a>
512
- <a name='L447'></a><a href='#L447'>447</a>
513
- <a name='L448'></a><a href='#L448'>448</a>
514
- <a name='L449'></a><a href='#L449'>449</a>
515
- <a name='L450'></a><a href='#L450'>450</a>
516
- <a name='L451'></a><a href='#L451'>451</a>
517
- <a name='L452'></a><a href='#L452'>452</a>
518
- <a name='L453'></a><a href='#L453'>453</a>
519
- <a name='L454'></a><a href='#L454'>454</a>
520
- <a name='L455'></a><a href='#L455'>455</a>
521
- <a name='L456'></a><a href='#L456'>456</a>
522
- <a name='L457'></a><a href='#L457'>457</a>
523
- <a name='L458'></a><a href='#L458'>458</a>
524
- <a name='L459'></a><a href='#L459'>459</a>
525
- <a name='L460'></a><a href='#L460'>460</a>
526
- <a name='L461'></a><a href='#L461'>461</a>
527
- <a name='L462'></a><a href='#L462'>462</a>
528
- <a name='L463'></a><a href='#L463'>463</a>
529
- <a name='L464'></a><a href='#L464'>464</a></td><td class="line-coverage quiet"><span class="cline-any cline-no">&nbsp;</span>
530
- <span class="cline-any cline-no">&nbsp;</span>
531
- <span class="cline-any cline-no">&nbsp;</span>
532
- <span class="cline-any cline-no">&nbsp;</span>
533
- <span class="cline-any cline-no">&nbsp;</span>
534
- <span class="cline-any cline-no">&nbsp;</span>
535
- <span class="cline-any cline-no">&nbsp;</span>
536
- <span class="cline-any cline-no">&nbsp;</span>
537
- <span class="cline-any cline-no">&nbsp;</span>
538
- <span class="cline-any cline-no">&nbsp;</span>
539
- <span class="cline-any cline-no">&nbsp;</span>
540
- <span class="cline-any cline-no">&nbsp;</span>
541
- <span class="cline-any cline-no">&nbsp;</span>
542
- <span class="cline-any cline-no">&nbsp;</span>
543
- <span class="cline-any cline-no">&nbsp;</span>
544
- <span class="cline-any cline-no">&nbsp;</span>
545
- <span class="cline-any cline-no">&nbsp;</span>
546
- <span class="cline-any cline-no">&nbsp;</span>
547
- <span class="cline-any cline-no">&nbsp;</span>
548
- <span class="cline-any cline-no">&nbsp;</span>
549
- <span class="cline-any cline-no">&nbsp;</span>
550
- <span class="cline-any cline-no">&nbsp;</span>
551
- <span class="cline-any cline-no">&nbsp;</span>
552
- <span class="cline-any cline-no">&nbsp;</span>
553
- <span class="cline-any cline-no">&nbsp;</span>
554
- <span class="cline-any cline-no">&nbsp;</span>
555
- <span class="cline-any cline-no">&nbsp;</span>
556
- <span class="cline-any cline-no">&nbsp;</span>
557
- <span class="cline-any cline-no">&nbsp;</span>
558
- <span class="cline-any cline-no">&nbsp;</span>
559
- <span class="cline-any cline-no">&nbsp;</span>
560
- <span class="cline-any cline-no">&nbsp;</span>
561
- <span class="cline-any cline-no">&nbsp;</span>
562
- <span class="cline-any cline-no">&nbsp;</span>
563
- <span class="cline-any cline-no">&nbsp;</span>
564
- <span class="cline-any cline-no">&nbsp;</span>
565
- <span class="cline-any cline-no">&nbsp;</span>
566
- <span class="cline-any cline-no">&nbsp;</span>
567
- <span class="cline-any cline-no">&nbsp;</span>
568
- <span class="cline-any cline-no">&nbsp;</span>
569
- <span class="cline-any cline-no">&nbsp;</span>
570
- <span class="cline-any cline-no">&nbsp;</span>
571
- <span class="cline-any cline-no">&nbsp;</span>
572
- <span class="cline-any cline-no">&nbsp;</span>
573
- <span class="cline-any cline-no">&nbsp;</span>
574
- <span class="cline-any cline-no">&nbsp;</span>
575
- <span class="cline-any cline-no">&nbsp;</span>
576
- <span class="cline-any cline-no">&nbsp;</span>
577
- <span class="cline-any cline-no">&nbsp;</span>
578
- <span class="cline-any cline-no">&nbsp;</span>
579
- <span class="cline-any cline-no">&nbsp;</span>
580
- <span class="cline-any cline-no">&nbsp;</span>
581
- <span class="cline-any cline-no">&nbsp;</span>
582
- <span class="cline-any cline-no">&nbsp;</span>
583
- <span class="cline-any cline-no">&nbsp;</span>
584
- <span class="cline-any cline-no">&nbsp;</span>
585
- <span class="cline-any cline-no">&nbsp;</span>
586
- <span class="cline-any cline-no">&nbsp;</span>
587
- <span class="cline-any cline-no">&nbsp;</span>
588
- <span class="cline-any cline-no">&nbsp;</span>
589
- <span class="cline-any cline-no">&nbsp;</span>
590
- <span class="cline-any cline-no">&nbsp;</span>
591
- <span class="cline-any cline-no">&nbsp;</span>
592
- <span class="cline-any cline-no">&nbsp;</span>
593
- <span class="cline-any cline-no">&nbsp;</span>
594
- <span class="cline-any cline-no">&nbsp;</span>
595
- <span class="cline-any cline-no">&nbsp;</span>
596
- <span class="cline-any cline-no">&nbsp;</span>
597
- <span class="cline-any cline-no">&nbsp;</span>
598
- <span class="cline-any cline-no">&nbsp;</span>
599
- <span class="cline-any cline-no">&nbsp;</span>
600
- <span class="cline-any cline-no">&nbsp;</span>
601
- <span class="cline-any cline-no">&nbsp;</span>
602
- <span class="cline-any cline-no">&nbsp;</span>
603
- <span class="cline-any cline-no">&nbsp;</span>
604
- <span class="cline-any cline-no">&nbsp;</span>
605
- <span class="cline-any cline-no">&nbsp;</span>
606
- <span class="cline-any cline-no">&nbsp;</span>
607
- <span class="cline-any cline-no">&nbsp;</span>
608
- <span class="cline-any cline-no">&nbsp;</span>
609
- <span class="cline-any cline-no">&nbsp;</span>
610
- <span class="cline-any cline-no">&nbsp;</span>
611
- <span class="cline-any cline-no">&nbsp;</span>
612
- <span class="cline-any cline-no">&nbsp;</span>
613
- <span class="cline-any cline-no">&nbsp;</span>
614
- <span class="cline-any cline-no">&nbsp;</span>
615
- <span class="cline-any cline-no">&nbsp;</span>
616
- <span class="cline-any cline-no">&nbsp;</span>
617
- <span class="cline-any cline-no">&nbsp;</span>
618
- <span class="cline-any cline-no">&nbsp;</span>
619
- <span class="cline-any cline-no">&nbsp;</span>
620
- <span class="cline-any cline-no">&nbsp;</span>
621
- <span class="cline-any cline-no">&nbsp;</span>
622
- <span class="cline-any cline-no">&nbsp;</span>
623
- <span class="cline-any cline-no">&nbsp;</span>
624
- <span class="cline-any cline-no">&nbsp;</span>
625
- <span class="cline-any cline-no">&nbsp;</span>
626
- <span class="cline-any cline-no">&nbsp;</span>
627
- <span class="cline-any cline-no">&nbsp;</span>
628
- <span class="cline-any cline-no">&nbsp;</span>
629
- <span class="cline-any cline-no">&nbsp;</span>
630
- <span class="cline-any cline-no">&nbsp;</span>
631
- <span class="cline-any cline-no">&nbsp;</span>
632
- <span class="cline-any cline-no">&nbsp;</span>
633
- <span class="cline-any cline-no">&nbsp;</span>
634
- <span class="cline-any cline-no">&nbsp;</span>
635
- <span class="cline-any cline-no">&nbsp;</span>
636
- <span class="cline-any cline-no">&nbsp;</span>
637
- <span class="cline-any cline-no">&nbsp;</span>
638
- <span class="cline-any cline-no">&nbsp;</span>
639
- <span class="cline-any cline-no">&nbsp;</span>
640
- <span class="cline-any cline-no">&nbsp;</span>
641
- <span class="cline-any cline-no">&nbsp;</span>
642
- <span class="cline-any cline-no">&nbsp;</span>
643
- <span class="cline-any cline-no">&nbsp;</span>
644
- <span class="cline-any cline-no">&nbsp;</span>
645
- <span class="cline-any cline-no">&nbsp;</span>
646
- <span class="cline-any cline-no">&nbsp;</span>
647
- <span class="cline-any cline-no">&nbsp;</span>
648
- <span class="cline-any cline-no">&nbsp;</span>
649
- <span class="cline-any cline-no">&nbsp;</span>
650
- <span class="cline-any cline-no">&nbsp;</span>
651
- <span class="cline-any cline-no">&nbsp;</span>
652
- <span class="cline-any cline-no">&nbsp;</span>
653
- <span class="cline-any cline-no">&nbsp;</span>
654
- <span class="cline-any cline-no">&nbsp;</span>
655
- <span class="cline-any cline-no">&nbsp;</span>
656
- <span class="cline-any cline-no">&nbsp;</span>
657
- <span class="cline-any cline-no">&nbsp;</span>
658
- <span class="cline-any cline-no">&nbsp;</span>
659
- <span class="cline-any cline-no">&nbsp;</span>
660
- <span class="cline-any cline-no">&nbsp;</span>
661
- <span class="cline-any cline-no">&nbsp;</span>
662
- <span class="cline-any cline-no">&nbsp;</span>
663
- <span class="cline-any cline-no">&nbsp;</span>
664
- <span class="cline-any cline-no">&nbsp;</span>
665
- <span class="cline-any cline-no">&nbsp;</span>
666
- <span class="cline-any cline-no">&nbsp;</span>
667
- <span class="cline-any cline-no">&nbsp;</span>
668
- <span class="cline-any cline-no">&nbsp;</span>
669
- <span class="cline-any cline-no">&nbsp;</span>
670
- <span class="cline-any cline-no">&nbsp;</span>
671
- <span class="cline-any cline-no">&nbsp;</span>
672
- <span class="cline-any cline-no">&nbsp;</span>
673
- <span class="cline-any cline-no">&nbsp;</span>
674
- <span class="cline-any cline-no">&nbsp;</span>
675
- <span class="cline-any cline-no">&nbsp;</span>
676
- <span class="cline-any cline-no">&nbsp;</span>
677
- <span class="cline-any cline-no">&nbsp;</span>
678
- <span class="cline-any cline-no">&nbsp;</span>
679
- <span class="cline-any cline-no">&nbsp;</span>
680
- <span class="cline-any cline-no">&nbsp;</span>
681
- <span class="cline-any cline-no">&nbsp;</span>
682
- <span class="cline-any cline-no">&nbsp;</span>
683
- <span class="cline-any cline-no">&nbsp;</span>
684
- <span class="cline-any cline-no">&nbsp;</span>
685
- <span class="cline-any cline-no">&nbsp;</span>
686
- <span class="cline-any cline-no">&nbsp;</span>
687
- <span class="cline-any cline-no">&nbsp;</span>
688
- <span class="cline-any cline-no">&nbsp;</span>
689
- <span class="cline-any cline-no">&nbsp;</span>
690
- <span class="cline-any cline-no">&nbsp;</span>
691
- <span class="cline-any cline-no">&nbsp;</span>
692
- <span class="cline-any cline-no">&nbsp;</span>
693
- <span class="cline-any cline-no">&nbsp;</span>
694
- <span class="cline-any cline-no">&nbsp;</span>
695
- <span class="cline-any cline-no">&nbsp;</span>
696
- <span class="cline-any cline-no">&nbsp;</span>
697
- <span class="cline-any cline-no">&nbsp;</span>
698
- <span class="cline-any cline-no">&nbsp;</span>
699
- <span class="cline-any cline-no">&nbsp;</span>
700
- <span class="cline-any cline-no">&nbsp;</span>
701
- <span class="cline-any cline-no">&nbsp;</span>
702
- <span class="cline-any cline-no">&nbsp;</span>
703
- <span class="cline-any cline-no">&nbsp;</span>
704
- <span class="cline-any cline-no">&nbsp;</span>
705
- <span class="cline-any cline-no">&nbsp;</span>
706
- <span class="cline-any cline-no">&nbsp;</span>
707
- <span class="cline-any cline-no">&nbsp;</span>
708
- <span class="cline-any cline-no">&nbsp;</span>
709
- <span class="cline-any cline-no">&nbsp;</span>
710
- <span class="cline-any cline-no">&nbsp;</span>
711
- <span class="cline-any cline-no">&nbsp;</span>
712
- <span class="cline-any cline-no">&nbsp;</span>
713
- <span class="cline-any cline-no">&nbsp;</span>
714
- <span class="cline-any cline-no">&nbsp;</span>
715
- <span class="cline-any cline-no">&nbsp;</span>
716
- <span class="cline-any cline-no">&nbsp;</span>
717
- <span class="cline-any cline-no">&nbsp;</span>
718
- <span class="cline-any cline-no">&nbsp;</span>
719
- <span class="cline-any cline-no">&nbsp;</span>
720
- <span class="cline-any cline-no">&nbsp;</span>
721
- <span class="cline-any cline-no">&nbsp;</span>
722
- <span class="cline-any cline-no">&nbsp;</span>
723
- <span class="cline-any cline-no">&nbsp;</span>
724
- <span class="cline-any cline-no">&nbsp;</span>
725
- <span class="cline-any cline-no">&nbsp;</span>
726
- <span class="cline-any cline-no">&nbsp;</span>
727
- <span class="cline-any cline-no">&nbsp;</span>
728
- <span class="cline-any cline-no">&nbsp;</span>
729
- <span class="cline-any cline-no">&nbsp;</span>
730
- <span class="cline-any cline-no">&nbsp;</span>
731
- <span class="cline-any cline-no">&nbsp;</span>
732
- <span class="cline-any cline-no">&nbsp;</span>
733
- <span class="cline-any cline-no">&nbsp;</span>
734
- <span class="cline-any cline-no">&nbsp;</span>
735
- <span class="cline-any cline-no">&nbsp;</span>
736
- <span class="cline-any cline-no">&nbsp;</span>
737
- <span class="cline-any cline-no">&nbsp;</span>
738
- <span class="cline-any cline-no">&nbsp;</span>
739
- <span class="cline-any cline-no">&nbsp;</span>
740
- <span class="cline-any cline-no">&nbsp;</span>
741
- <span class="cline-any cline-no">&nbsp;</span>
742
- <span class="cline-any cline-no">&nbsp;</span>
743
- <span class="cline-any cline-no">&nbsp;</span>
744
- <span class="cline-any cline-no">&nbsp;</span>
745
- <span class="cline-any cline-no">&nbsp;</span>
746
- <span class="cline-any cline-no">&nbsp;</span>
747
- <span class="cline-any cline-no">&nbsp;</span>
748
- <span class="cline-any cline-no">&nbsp;</span>
749
- <span class="cline-any cline-no">&nbsp;</span>
750
- <span class="cline-any cline-no">&nbsp;</span>
751
- <span class="cline-any cline-no">&nbsp;</span>
752
- <span class="cline-any cline-no">&nbsp;</span>
753
- <span class="cline-any cline-no">&nbsp;</span>
754
- <span class="cline-any cline-no">&nbsp;</span>
755
- <span class="cline-any cline-no">&nbsp;</span>
756
- <span class="cline-any cline-no">&nbsp;</span>
757
- <span class="cline-any cline-no">&nbsp;</span>
758
- <span class="cline-any cline-no">&nbsp;</span>
759
- <span class="cline-any cline-no">&nbsp;</span>
760
- <span class="cline-any cline-no">&nbsp;</span>
761
- <span class="cline-any cline-no">&nbsp;</span>
762
- <span class="cline-any cline-no">&nbsp;</span>
763
- <span class="cline-any cline-no">&nbsp;</span>
764
- <span class="cline-any cline-no">&nbsp;</span>
765
- <span class="cline-any cline-no">&nbsp;</span>
766
- <span class="cline-any cline-no">&nbsp;</span>
767
- <span class="cline-any cline-no">&nbsp;</span>
768
- <span class="cline-any cline-no">&nbsp;</span>
769
- <span class="cline-any cline-no">&nbsp;</span>
770
- <span class="cline-any cline-no">&nbsp;</span>
771
- <span class="cline-any cline-no">&nbsp;</span>
772
- <span class="cline-any cline-no">&nbsp;</span>
773
- <span class="cline-any cline-no">&nbsp;</span>
774
- <span class="cline-any cline-no">&nbsp;</span>
775
- <span class="cline-any cline-no">&nbsp;</span>
776
- <span class="cline-any cline-no">&nbsp;</span>
777
- <span class="cline-any cline-no">&nbsp;</span>
778
- <span class="cline-any cline-no">&nbsp;</span>
779
- <span class="cline-any cline-no">&nbsp;</span>
780
- <span class="cline-any cline-no">&nbsp;</span>
781
- <span class="cline-any cline-no">&nbsp;</span>
782
- <span class="cline-any cline-no">&nbsp;</span>
783
- <span class="cline-any cline-no">&nbsp;</span>
784
- <span class="cline-any cline-no">&nbsp;</span>
785
- <span class="cline-any cline-no">&nbsp;</span>
786
- <span class="cline-any cline-no">&nbsp;</span>
787
- <span class="cline-any cline-no">&nbsp;</span>
788
- <span class="cline-any cline-no">&nbsp;</span>
789
- <span class="cline-any cline-no">&nbsp;</span>
790
- <span class="cline-any cline-no">&nbsp;</span>
791
- <span class="cline-any cline-no">&nbsp;</span>
792
- <span class="cline-any cline-no">&nbsp;</span>
793
- <span class="cline-any cline-no">&nbsp;</span>
794
- <span class="cline-any cline-no">&nbsp;</span>
795
- <span class="cline-any cline-no">&nbsp;</span>
796
- <span class="cline-any cline-no">&nbsp;</span>
797
- <span class="cline-any cline-no">&nbsp;</span>
798
- <span class="cline-any cline-no">&nbsp;</span>
799
- <span class="cline-any cline-no">&nbsp;</span>
800
- <span class="cline-any cline-no">&nbsp;</span>
801
- <span class="cline-any cline-no">&nbsp;</span>
802
- <span class="cline-any cline-no">&nbsp;</span>
803
- <span class="cline-any cline-no">&nbsp;</span>
804
- <span class="cline-any cline-no">&nbsp;</span>
805
- <span class="cline-any cline-no">&nbsp;</span>
806
- <span class="cline-any cline-no">&nbsp;</span>
807
- <span class="cline-any cline-no">&nbsp;</span>
808
- <span class="cline-any cline-no">&nbsp;</span>
809
- <span class="cline-any cline-no">&nbsp;</span>
810
- <span class="cline-any cline-no">&nbsp;</span>
811
- <span class="cline-any cline-no">&nbsp;</span>
812
- <span class="cline-any cline-no">&nbsp;</span>
813
- <span class="cline-any cline-no">&nbsp;</span>
814
- <span class="cline-any cline-no">&nbsp;</span>
815
- <span class="cline-any cline-no">&nbsp;</span>
816
- <span class="cline-any cline-no">&nbsp;</span>
817
- <span class="cline-any cline-no">&nbsp;</span>
818
- <span class="cline-any cline-no">&nbsp;</span>
819
- <span class="cline-any cline-no">&nbsp;</span>
820
- <span class="cline-any cline-no">&nbsp;</span>
821
- <span class="cline-any cline-no">&nbsp;</span>
822
- <span class="cline-any cline-no">&nbsp;</span>
823
- <span class="cline-any cline-no">&nbsp;</span>
824
- <span class="cline-any cline-no">&nbsp;</span>
825
- <span class="cline-any cline-no">&nbsp;</span>
826
- <span class="cline-any cline-no">&nbsp;</span>
827
- <span class="cline-any cline-no">&nbsp;</span>
828
- <span class="cline-any cline-no">&nbsp;</span>
829
- <span class="cline-any cline-no">&nbsp;</span>
830
- <span class="cline-any cline-no">&nbsp;</span>
831
- <span class="cline-any cline-no">&nbsp;</span>
832
- <span class="cline-any cline-no">&nbsp;</span>
833
- <span class="cline-any cline-no">&nbsp;</span>
834
- <span class="cline-any cline-no">&nbsp;</span>
835
- <span class="cline-any cline-no">&nbsp;</span>
836
- <span class="cline-any cline-no">&nbsp;</span>
837
- <span class="cline-any cline-no">&nbsp;</span>
838
- <span class="cline-any cline-no">&nbsp;</span>
839
- <span class="cline-any cline-no">&nbsp;</span>
840
- <span class="cline-any cline-no">&nbsp;</span>
841
- <span class="cline-any cline-no">&nbsp;</span>
842
- <span class="cline-any cline-no">&nbsp;</span>
843
- <span class="cline-any cline-no">&nbsp;</span>
844
- <span class="cline-any cline-no">&nbsp;</span>
845
- <span class="cline-any cline-no">&nbsp;</span>
846
- <span class="cline-any cline-no">&nbsp;</span>
847
- <span class="cline-any cline-no">&nbsp;</span>
848
- <span class="cline-any cline-no">&nbsp;</span>
849
- <span class="cline-any cline-no">&nbsp;</span>
850
- <span class="cline-any cline-no">&nbsp;</span>
851
- <span class="cline-any cline-no">&nbsp;</span>
852
- <span class="cline-any cline-no">&nbsp;</span>
853
- <span class="cline-any cline-no">&nbsp;</span>
854
- <span class="cline-any cline-no">&nbsp;</span>
855
- <span class="cline-any cline-no">&nbsp;</span>
856
- <span class="cline-any cline-no">&nbsp;</span>
857
- <span class="cline-any cline-no">&nbsp;</span>
858
- <span class="cline-any cline-no">&nbsp;</span>
859
- <span class="cline-any cline-no">&nbsp;</span>
860
- <span class="cline-any cline-no">&nbsp;</span>
861
- <span class="cline-any cline-no">&nbsp;</span>
862
- <span class="cline-any cline-no">&nbsp;</span>
863
- <span class="cline-any cline-no">&nbsp;</span>
864
- <span class="cline-any cline-no">&nbsp;</span>
865
- <span class="cline-any cline-no">&nbsp;</span>
866
- <span class="cline-any cline-no">&nbsp;</span>
867
- <span class="cline-any cline-no">&nbsp;</span>
868
- <span class="cline-any cline-no">&nbsp;</span>
869
- <span class="cline-any cline-no">&nbsp;</span>
870
- <span class="cline-any cline-no">&nbsp;</span>
871
- <span class="cline-any cline-no">&nbsp;</span>
872
- <span class="cline-any cline-no">&nbsp;</span>
873
- <span class="cline-any cline-no">&nbsp;</span>
874
- <span class="cline-any cline-no">&nbsp;</span>
875
- <span class="cline-any cline-no">&nbsp;</span>
876
- <span class="cline-any cline-no">&nbsp;</span>
877
- <span class="cline-any cline-no">&nbsp;</span>
878
- <span class="cline-any cline-no">&nbsp;</span>
879
- <span class="cline-any cline-no">&nbsp;</span>
880
- <span class="cline-any cline-no">&nbsp;</span>
881
- <span class="cline-any cline-no">&nbsp;</span>
882
- <span class="cline-any cline-no">&nbsp;</span>
883
- <span class="cline-any cline-no">&nbsp;</span>
884
- <span class="cline-any cline-no">&nbsp;</span>
885
- <span class="cline-any cline-no">&nbsp;</span>
886
- <span class="cline-any cline-no">&nbsp;</span>
887
- <span class="cline-any cline-no">&nbsp;</span>
888
- <span class="cline-any cline-no">&nbsp;</span>
889
- <span class="cline-any cline-no">&nbsp;</span>
890
- <span class="cline-any cline-no">&nbsp;</span>
891
- <span class="cline-any cline-no">&nbsp;</span>
892
- <span class="cline-any cline-no">&nbsp;</span>
893
- <span class="cline-any cline-no">&nbsp;</span>
894
- <span class="cline-any cline-no">&nbsp;</span>
895
- <span class="cline-any cline-no">&nbsp;</span>
896
- <span class="cline-any cline-no">&nbsp;</span>
897
- <span class="cline-any cline-no">&nbsp;</span>
898
- <span class="cline-any cline-no">&nbsp;</span>
899
- <span class="cline-any cline-no">&nbsp;</span>
900
- <span class="cline-any cline-no">&nbsp;</span>
901
- <span class="cline-any cline-no">&nbsp;</span>
902
- <span class="cline-any cline-no">&nbsp;</span>
903
- <span class="cline-any cline-no">&nbsp;</span>
904
- <span class="cline-any cline-no">&nbsp;</span>
905
- <span class="cline-any cline-no">&nbsp;</span>
906
- <span class="cline-any cline-no">&nbsp;</span>
907
- <span class="cline-any cline-no">&nbsp;</span>
908
- <span class="cline-any cline-no">&nbsp;</span>
909
- <span class="cline-any cline-no">&nbsp;</span>
910
- <span class="cline-any cline-no">&nbsp;</span>
911
- <span class="cline-any cline-no">&nbsp;</span>
912
- <span class="cline-any cline-no">&nbsp;</span>
913
- <span class="cline-any cline-no">&nbsp;</span>
914
- <span class="cline-any cline-no">&nbsp;</span>
915
- <span class="cline-any cline-no">&nbsp;</span>
916
- <span class="cline-any cline-no">&nbsp;</span>
917
- <span class="cline-any cline-no">&nbsp;</span>
918
- <span class="cline-any cline-no">&nbsp;</span>
919
- <span class="cline-any cline-no">&nbsp;</span>
920
- <span class="cline-any cline-no">&nbsp;</span>
921
- <span class="cline-any cline-no">&nbsp;</span>
922
- <span class="cline-any cline-no">&nbsp;</span>
923
- <span class="cline-any cline-no">&nbsp;</span>
924
- <span class="cline-any cline-no">&nbsp;</span>
925
- <span class="cline-any cline-no">&nbsp;</span>
926
- <span class="cline-any cline-no">&nbsp;</span>
927
- <span class="cline-any cline-no">&nbsp;</span>
928
- <span class="cline-any cline-no">&nbsp;</span>
929
- <span class="cline-any cline-no">&nbsp;</span>
930
- <span class="cline-any cline-no">&nbsp;</span>
931
- <span class="cline-any cline-no">&nbsp;</span>
932
- <span class="cline-any cline-no">&nbsp;</span>
933
- <span class="cline-any cline-no">&nbsp;</span>
934
- <span class="cline-any cline-no">&nbsp;</span>
935
- <span class="cline-any cline-no">&nbsp;</span>
936
- <span class="cline-any cline-no">&nbsp;</span>
937
- <span class="cline-any cline-no">&nbsp;</span>
938
- <span class="cline-any cline-no">&nbsp;</span>
939
- <span class="cline-any cline-no">&nbsp;</span>
940
- <span class="cline-any cline-no">&nbsp;</span>
941
- <span class="cline-any cline-no">&nbsp;</span>
942
- <span class="cline-any cline-no">&nbsp;</span>
943
- <span class="cline-any cline-no">&nbsp;</span>
944
- <span class="cline-any cline-no">&nbsp;</span>
945
- <span class="cline-any cline-no">&nbsp;</span>
946
- <span class="cline-any cline-no">&nbsp;</span>
947
- <span class="cline-any cline-no">&nbsp;</span>
948
- <span class="cline-any cline-no">&nbsp;</span>
949
- <span class="cline-any cline-no">&nbsp;</span>
950
- <span class="cline-any cline-no">&nbsp;</span>
951
- <span class="cline-any cline-no">&nbsp;</span>
952
- <span class="cline-any cline-no">&nbsp;</span>
953
- <span class="cline-any cline-no">&nbsp;</span>
954
- <span class="cline-any cline-no">&nbsp;</span>
955
- <span class="cline-any cline-no">&nbsp;</span>
956
- <span class="cline-any cline-no">&nbsp;</span>
957
- <span class="cline-any cline-no">&nbsp;</span>
958
- <span class="cline-any cline-no">&nbsp;</span>
959
- <span class="cline-any cline-no">&nbsp;</span>
960
- <span class="cline-any cline-no">&nbsp;</span>
961
- <span class="cline-any cline-no">&nbsp;</span>
962
- <span class="cline-any cline-no">&nbsp;</span>
963
- <span class="cline-any cline-no">&nbsp;</span>
964
- <span class="cline-any cline-no">&nbsp;</span>
965
- <span class="cline-any cline-no">&nbsp;</span>
966
- <span class="cline-any cline-no">&nbsp;</span>
967
- <span class="cline-any cline-no">&nbsp;</span>
968
- <span class="cline-any cline-no">&nbsp;</span>
969
- <span class="cline-any cline-no">&nbsp;</span>
970
- <span class="cline-any cline-no">&nbsp;</span>
971
- <span class="cline-any cline-no">&nbsp;</span>
972
- <span class="cline-any cline-no">&nbsp;</span>
973
- <span class="cline-any cline-no">&nbsp;</span>
974
- <span class="cline-any cline-no">&nbsp;</span>
975
- <span class="cline-any cline-no">&nbsp;</span>
976
- <span class="cline-any cline-no">&nbsp;</span>
977
- <span class="cline-any cline-no">&nbsp;</span>
978
- <span class="cline-any cline-no">&nbsp;</span>
979
- <span class="cline-any cline-no">&nbsp;</span>
980
- <span class="cline-any cline-no">&nbsp;</span>
981
- <span class="cline-any cline-no">&nbsp;</span>
982
- <span class="cline-any cline-no">&nbsp;</span>
983
- <span class="cline-any cline-no">&nbsp;</span>
984
- <span class="cline-any cline-no">&nbsp;</span>
985
- <span class="cline-any cline-no">&nbsp;</span>
986
- <span class="cline-any cline-no">&nbsp;</span>
987
- <span class="cline-any cline-no">&nbsp;</span>
988
- <span class="cline-any cline-no">&nbsp;</span>
989
- <span class="cline-any cline-no">&nbsp;</span>
990
- <span class="cline-any cline-no">&nbsp;</span>
991
- <span class="cline-any cline-no">&nbsp;</span>
992
- <span class="cline-any cline-neutral">&nbsp;</span></td><td class="text"><pre class="prettyprint lang-js"><span class="cstat-no" title="statement not covered" >/**<span class="fstat-no" title="function not covered" ><span class="branch-0 cbranch-no" title="branch not covered" ></span></span></span>
993
- <span class="cstat-no" title="statement not covered" > * Token Generator - Secure Token Generation</span>
994
- <span class="cstat-no" title="statement not covered" > *</span>
995
- <span class="cstat-no" title="statement not covered" > * Provides cryptographically secure token generation for:</span>
996
- <span class="cstat-no" title="statement not covered" > * - JWT tokens</span>
997
- <span class="cstat-no" title="statement not covered" > * - Session tokens</span>
998
- <span class="cstat-no" title="statement not covered" > * - CSRF tokens</span>
999
- <span class="cstat-no" title="statement not covered" > * - API tokens</span>
1000
- <span class="cstat-no" title="statement not covered" > * - Verification codes</span>
1001
- <span class="cstat-no" title="statement not covered" > *</span>
1002
- <span class="cstat-no" title="statement not covered" > * Security Properties:</span>
1003
- <span class="cstat-no" title="statement not covered" > * - Uses crypto.randomBytes for all randomness</span>
1004
- <span class="cstat-no" title="statement not covered" > * - Configurable entropy levels</span>
1005
- <span class="cstat-no" title="statement not covered" > * - Timing-safe comparison</span>
1006
- <span class="cstat-no" title="statement not covered" > * - Token expiration handling</span>
1007
- <span class="cstat-no" title="statement not covered" > *</span>
1008
- <span class="cstat-no" title="statement not covered" > * @module v3/security/token-generator</span>
1009
- <span class="cstat-no" title="statement not covered" > */</span>
1010
- <span class="cstat-no" title="statement not covered" ></span>
1011
- <span class="cstat-no" title="statement not covered" >import { randomBytes, createHmac, timingSafeEqual } from 'crypto';</span>
1012
- <span class="cstat-no" title="statement not covered" ></span>
1013
- <span class="cstat-no" title="statement not covered" >export interface TokenConfig {</span>
1014
- <span class="cstat-no" title="statement not covered" > /**</span>
1015
- <span class="cstat-no" title="statement not covered" > * Default token length in bytes.</span>
1016
- <span class="cstat-no" title="statement not covered" > * Default: 32 (256 bits)</span>
1017
- <span class="cstat-no" title="statement not covered" > */</span>
1018
- <span class="cstat-no" title="statement not covered" > defaultLength?: number;</span>
1019
- <span class="cstat-no" title="statement not covered" ></span>
1020
- <span class="cstat-no" title="statement not covered" > /**</span>
1021
- <span class="cstat-no" title="statement not covered" > * Token encoding format.</span>
1022
- <span class="cstat-no" title="statement not covered" > * Default: 'base64url'</span>
1023
- <span class="cstat-no" title="statement not covered" > */</span>
1024
- <span class="cstat-no" title="statement not covered" > encoding?: 'hex' | 'base64' | 'base64url';</span>
1025
- <span class="cstat-no" title="statement not covered" ></span>
1026
- <span class="cstat-no" title="statement not covered" > /**</span>
1027
- <span class="cstat-no" title="statement not covered" > * HMAC secret for signed tokens.</span>
1028
- <span class="cstat-no" title="statement not covered" > */</span>
1029
- <span class="cstat-no" title="statement not covered" > hmacSecret?: string;</span>
1030
- <span class="cstat-no" title="statement not covered" ></span>
1031
- <span class="cstat-no" title="statement not covered" > /**</span>
1032
- <span class="cstat-no" title="statement not covered" > * Default expiration time in seconds.</span>
1033
- <span class="cstat-no" title="statement not covered" > * Default: 3600 (1 hour)</span>
1034
- <span class="cstat-no" title="statement not covered" > */</span>
1035
- <span class="cstat-no" title="statement not covered" > defaultExpiration?: number;</span>
1036
- <span class="cstat-no" title="statement not covered" >}</span>
1037
- <span class="cstat-no" title="statement not covered" ></span>
1038
- <span class="cstat-no" title="statement not covered" >export interface Token {</span>
1039
- <span class="cstat-no" title="statement not covered" > value: string;</span>
1040
- <span class="cstat-no" title="statement not covered" > createdAt: Date;</span>
1041
- <span class="cstat-no" title="statement not covered" > expiresAt: Date;</span>
1042
- <span class="cstat-no" title="statement not covered" > metadata?: Record&lt;string, unknown&gt;;</span>
1043
- <span class="cstat-no" title="statement not covered" >}</span>
1044
- <span class="cstat-no" title="statement not covered" ></span>
1045
- <span class="cstat-no" title="statement not covered" >export interface SignedToken {</span>
1046
- <span class="cstat-no" title="statement not covered" > token: string;</span>
1047
- <span class="cstat-no" title="statement not covered" > signature: string;</span>
1048
- <span class="cstat-no" title="statement not covered" > combined: string;</span>
1049
- <span class="cstat-no" title="statement not covered" > createdAt: Date;</span>
1050
- <span class="cstat-no" title="statement not covered" > expiresAt: Date;</span>
1051
- <span class="cstat-no" title="statement not covered" >}</span>
1052
- <span class="cstat-no" title="statement not covered" ></span>
1053
- <span class="cstat-no" title="statement not covered" >export interface VerificationCode {</span>
1054
- <span class="cstat-no" title="statement not covered" > code: string;</span>
1055
- <span class="cstat-no" title="statement not covered" > createdAt: Date;</span>
1056
- <span class="cstat-no" title="statement not covered" > expiresAt: Date;</span>
1057
- <span class="cstat-no" title="statement not covered" > attempts: number;</span>
1058
- <span class="cstat-no" title="statement not covered" > maxAttempts: number;</span>
1059
- <span class="cstat-no" title="statement not covered" >}</span>
1060
- <span class="cstat-no" title="statement not covered" ></span>
1061
- <span class="cstat-no" title="statement not covered" >export class TokenGeneratorError extends Error {</span>
1062
- <span class="cstat-no" title="statement not covered" > constructor(</span>
1063
- <span class="cstat-no" title="statement not covered" > message: string,</span>
1064
- <span class="cstat-no" title="statement not covered" > public readonly code: string,</span>
1065
- <span class="cstat-no" title="statement not covered" > ) {</span>
1066
- <span class="cstat-no" title="statement not covered" > super(message);</span>
1067
- <span class="cstat-no" title="statement not covered" > this.name = 'TokenGeneratorError';</span>
1068
- <span class="cstat-no" title="statement not covered" > }</span>
1069
- <span class="cstat-no" title="statement not covered" >}</span>
1070
- <span class="cstat-no" title="statement not covered" ></span>
1071
- <span class="cstat-no" title="statement not covered" >/**</span>
1072
- <span class="cstat-no" title="statement not covered" > * Secure token generator.</span>
1073
- <span class="cstat-no" title="statement not covered" > *</span>
1074
- <span class="cstat-no" title="statement not covered" > * @example</span>
1075
- <span class="cstat-no" title="statement not covered" > * ```typescript</span>
1076
- <span class="cstat-no" title="statement not covered" > * const generator = new TokenGenerator({ hmacSecret: 'secret' });</span>
1077
- <span class="cstat-no" title="statement not covered" > *</span>
1078
- <span class="cstat-no" title="statement not covered" > * // Generate session token</span>
1079
- <span class="cstat-no" title="statement not covered" > * const session = generator.generateSessionToken();</span>
1080
- <span class="cstat-no" title="statement not covered" > *</span>
1081
- <span class="cstat-no" title="statement not covered" > * // Generate signed token</span>
1082
- <span class="cstat-no" title="statement not covered" > * const signed = generator.generateSignedToken({ userId: '123' });</span>
1083
- <span class="cstat-no" title="statement not covered" > *</span>
1084
- <span class="cstat-no" title="statement not covered" > * // Verify signed token</span>
1085
- <span class="cstat-no" title="statement not covered" > * const isValid = generator.verifySignedToken(signed.combined);</span>
1086
- <span class="cstat-no" title="statement not covered" > * ```</span>
1087
- <span class="cstat-no" title="statement not covered" > */</span>
1088
- <span class="cstat-no" title="statement not covered" >export class TokenGenerator {</span>
1089
- <span class="cstat-no" title="statement not covered" > private readonly config: Required&lt;TokenConfig&gt;;</span>
1090
- <span class="cstat-no" title="statement not covered" ></span>
1091
- <span class="cstat-no" title="statement not covered" > constructor(config: TokenConfig = {}) {</span>
1092
- <span class="cstat-no" title="statement not covered" > this.config = {</span>
1093
- <span class="cstat-no" title="statement not covered" > defaultLength: config.defaultLength ?? 32,</span>
1094
- <span class="cstat-no" title="statement not covered" > encoding: config.encoding ?? 'base64url',</span>
1095
- <span class="cstat-no" title="statement not covered" > hmacSecret: config.hmacSecret ?? '',</span>
1096
- <span class="cstat-no" title="statement not covered" > defaultExpiration: config.defaultExpiration ?? 3600,</span>
1097
- <span class="cstat-no" title="statement not covered" > };</span>
1098
- <span class="cstat-no" title="statement not covered" ></span>
1099
- <span class="cstat-no" title="statement not covered" > if (this.config.defaultLength &lt; 16) {</span>
1100
- <span class="cstat-no" title="statement not covered" > throw new TokenGeneratorError(</span>
1101
- <span class="cstat-no" title="statement not covered" > 'Token length must be at least 16 bytes',</span>
1102
- <span class="cstat-no" title="statement not covered" > 'INVALID_LENGTH'</span>
1103
- <span class="cstat-no" title="statement not covered" > );</span>
1104
- <span class="cstat-no" title="statement not covered" > }</span>
1105
- <span class="cstat-no" title="statement not covered" > }</span>
1106
- <span class="cstat-no" title="statement not covered" ></span>
1107
- <span class="cstat-no" title="statement not covered" > /**</span>
1108
- <span class="cstat-no" title="statement not covered" > * Generates a random token.</span>
1109
- <span class="cstat-no" title="statement not covered" > *</span>
1110
- <span class="cstat-no" title="statement not covered" > * @param length - Token length in bytes</span>
1111
- <span class="cstat-no" title="statement not covered" > * @returns Random token string</span>
1112
- <span class="cstat-no" title="statement not covered" > */</span>
1113
- <span class="cstat-no" title="statement not covered" > generate(length?: number): string {</span>
1114
- <span class="cstat-no" title="statement not covered" > const len = length ?? this.config.defaultLength;</span>
1115
- <span class="cstat-no" title="statement not covered" > const buffer = randomBytes(len);</span>
1116
- <span class="cstat-no" title="statement not covered" > return this.encode(buffer);</span>
1117
- <span class="cstat-no" title="statement not covered" > }</span>
1118
- <span class="cstat-no" title="statement not covered" ></span>
1119
- <span class="cstat-no" title="statement not covered" > /**</span>
1120
- <span class="cstat-no" title="statement not covered" > * Generates a token with expiration.</span>
1121
- <span class="cstat-no" title="statement not covered" > *</span>
1122
- <span class="cstat-no" title="statement not covered" > * @param expirationSeconds - Expiration time in seconds</span>
1123
- <span class="cstat-no" title="statement not covered" > * @param metadata - Optional metadata to attach</span>
1124
- <span class="cstat-no" title="statement not covered" > * @returns Token with expiration</span>
1125
- <span class="cstat-no" title="statement not covered" > */</span>
1126
- <span class="cstat-no" title="statement not covered" > generateWithExpiration(</span>
1127
- <span class="cstat-no" title="statement not covered" > expirationSeconds?: number,</span>
1128
- <span class="cstat-no" title="statement not covered" > metadata?: Record&lt;string, unknown&gt;</span>
1129
- <span class="cstat-no" title="statement not covered" > ): Token {</span>
1130
- <span class="cstat-no" title="statement not covered" > const expiration = expirationSeconds ?? this.config.defaultExpiration;</span>
1131
- <span class="cstat-no" title="statement not covered" > const now = new Date();</span>
1132
- <span class="cstat-no" title="statement not covered" > const expiresAt = new Date(now.getTime() + expiration * 1000);</span>
1133
- <span class="cstat-no" title="statement not covered" ></span>
1134
- <span class="cstat-no" title="statement not covered" > return {</span>
1135
- <span class="cstat-no" title="statement not covered" > value: this.generate(),</span>
1136
- <span class="cstat-no" title="statement not covered" > createdAt: now,</span>
1137
- <span class="cstat-no" title="statement not covered" > expiresAt,</span>
1138
- <span class="cstat-no" title="statement not covered" > metadata,</span>
1139
- <span class="cstat-no" title="statement not covered" > };</span>
1140
- <span class="cstat-no" title="statement not covered" > }</span>
1141
- <span class="cstat-no" title="statement not covered" ></span>
1142
- <span class="cstat-no" title="statement not covered" > /**</span>
1143
- <span class="cstat-no" title="statement not covered" > * Generates a session token (URL-safe).</span>
1144
- <span class="cstat-no" title="statement not covered" > *</span>
1145
- <span class="cstat-no" title="statement not covered" > * @param length - Token length in bytes (default: 32)</span>
1146
- <span class="cstat-no" title="statement not covered" > * @returns Session token</span>
1147
- <span class="cstat-no" title="statement not covered" > */</span>
1148
- <span class="cstat-no" title="statement not covered" > generateSessionToken(length = 32): Token {</span>
1149
- <span class="cstat-no" title="statement not covered" > return this.generateWithExpiration(this.config.defaultExpiration);</span>
1150
- <span class="cstat-no" title="statement not covered" > }</span>
1151
- <span class="cstat-no" title="statement not covered" ></span>
1152
- <span class="cstat-no" title="statement not covered" > /**</span>
1153
- <span class="cstat-no" title="statement not covered" > * Generates a CSRF token.</span>
1154
- <span class="cstat-no" title="statement not covered" > *</span>
1155
- <span class="cstat-no" title="statement not covered" > * @returns CSRF token (shorter expiration)</span>
1156
- <span class="cstat-no" title="statement not covered" > */</span>
1157
- <span class="cstat-no" title="statement not covered" > generateCsrfToken(): Token {</span>
1158
- <span class="cstat-no" title="statement not covered" > return this.generateWithExpiration(1800); // 30 minutes</span>
1159
- <span class="cstat-no" title="statement not covered" > }</span>
1160
- <span class="cstat-no" title="statement not covered" ></span>
1161
- <span class="cstat-no" title="statement not covered" > /**</span>
1162
- <span class="cstat-no" title="statement not covered" > * Generates an API token with prefix.</span>
1163
- <span class="cstat-no" title="statement not covered" > *</span>
1164
- <span class="cstat-no" title="statement not covered" > * @param prefix - Token prefix (e.g., 'cf_')</span>
1165
- <span class="cstat-no" title="statement not covered" > * @returns Prefixed API token</span>
1166
- <span class="cstat-no" title="statement not covered" > */</span>
1167
- <span class="cstat-no" title="statement not covered" > generateApiToken(prefix = 'cf_'): Token {</span>
1168
- <span class="cstat-no" title="statement not covered" > const tokenBody = this.generate(32);</span>
1169
- <span class="cstat-no" title="statement not covered" > const now = new Date();</span>
1170
- <span class="cstat-no" title="statement not covered" ></span>
1171
- <span class="cstat-no" title="statement not covered" > return {</span>
1172
- <span class="cstat-no" title="statement not covered" > value: `${prefix}${tokenBody}`,</span>
1173
- <span class="cstat-no" title="statement not covered" > createdAt: now,</span>
1174
- <span class="cstat-no" title="statement not covered" > expiresAt: new Date(now.getTime() + 365 * 24 * 60 * 60 * 1000), // 1 year</span>
1175
- <span class="cstat-no" title="statement not covered" > };</span>
1176
- <span class="cstat-no" title="statement not covered" > }</span>
1177
- <span class="cstat-no" title="statement not covered" ></span>
1178
- <span class="cstat-no" title="statement not covered" > /**</span>
1179
- <span class="cstat-no" title="statement not covered" > * Generates a numeric verification code.</span>
1180
- <span class="cstat-no" title="statement not covered" > *</span>
1181
- <span class="cstat-no" title="statement not covered" > * @param length - Number of digits (default: 6)</span>
1182
- <span class="cstat-no" title="statement not covered" > * @param expirationMinutes - Expiration in minutes (default: 10)</span>
1183
- <span class="cstat-no" title="statement not covered" > * @param maxAttempts - Maximum verification attempts (default: 3)</span>
1184
- <span class="cstat-no" title="statement not covered" > * @returns Verification code</span>
1185
- <span class="cstat-no" title="statement not covered" > */</span>
1186
- <span class="cstat-no" title="statement not covered" > generateVerificationCode(</span>
1187
- <span class="cstat-no" title="statement not covered" > length = 6,</span>
1188
- <span class="cstat-no" title="statement not covered" > expirationMinutes = 10,</span>
1189
- <span class="cstat-no" title="statement not covered" > maxAttempts = 3</span>
1190
- <span class="cstat-no" title="statement not covered" > ): VerificationCode {</span>
1191
- <span class="cstat-no" title="statement not covered" > const buffer = randomBytes(length);</span>
1192
- <span class="cstat-no" title="statement not covered" > let code = '';</span>
1193
- <span class="cstat-no" title="statement not covered" ></span>
1194
- <span class="cstat-no" title="statement not covered" > for (let i = 0; i &lt; length; i++) {</span>
1195
- <span class="cstat-no" title="statement not covered" > code += (buffer[i] % 10).toString();</span>
1196
- <span class="cstat-no" title="statement not covered" > }</span>
1197
- <span class="cstat-no" title="statement not covered" ></span>
1198
- <span class="cstat-no" title="statement not covered" > const now = new Date();</span>
1199
- <span class="cstat-no" title="statement not covered" ></span>
1200
- <span class="cstat-no" title="statement not covered" > return {</span>
1201
- <span class="cstat-no" title="statement not covered" > code,</span>
1202
- <span class="cstat-no" title="statement not covered" > createdAt: now,</span>
1203
- <span class="cstat-no" title="statement not covered" > expiresAt: new Date(now.getTime() + expirationMinutes * 60 * 1000),</span>
1204
- <span class="cstat-no" title="statement not covered" > attempts: 0,</span>
1205
- <span class="cstat-no" title="statement not covered" > maxAttempts,</span>
1206
- <span class="cstat-no" title="statement not covered" > };</span>
1207
- <span class="cstat-no" title="statement not covered" > }</span>
1208
- <span class="cstat-no" title="statement not covered" ></span>
1209
- <span class="cstat-no" title="statement not covered" > /**</span>
1210
- <span class="cstat-no" title="statement not covered" > * Generates a signed token using HMAC.</span>
1211
- <span class="cstat-no" title="statement not covered" > *</span>
1212
- <span class="cstat-no" title="statement not covered" > * @param payload - Data to include in token</span>
1213
- <span class="cstat-no" title="statement not covered" > * @param expirationSeconds - Token expiration</span>
1214
- <span class="cstat-no" title="statement not covered" > * @returns Signed token</span>
1215
- <span class="cstat-no" title="statement not covered" > */</span>
1216
- <span class="cstat-no" title="statement not covered" > generateSignedToken(</span>
1217
- <span class="cstat-no" title="statement not covered" > payload: Record&lt;string, unknown&gt;,</span>
1218
- <span class="cstat-no" title="statement not covered" > expirationSeconds?: number</span>
1219
- <span class="cstat-no" title="statement not covered" > ): SignedToken {</span>
1220
- <span class="cstat-no" title="statement not covered" > if (!this.config.hmacSecret) {</span>
1221
- <span class="cstat-no" title="statement not covered" > throw new TokenGeneratorError(</span>
1222
- <span class="cstat-no" title="statement not covered" > 'HMAC secret required for signed tokens',</span>
1223
- <span class="cstat-no" title="statement not covered" > 'NO_SECRET'</span>
1224
- <span class="cstat-no" title="statement not covered" > );</span>
1225
- <span class="cstat-no" title="statement not covered" > }</span>
1226
- <span class="cstat-no" title="statement not covered" ></span>
1227
- <span class="cstat-no" title="statement not covered" > const expiration = expirationSeconds ?? this.config.defaultExpiration;</span>
1228
- <span class="cstat-no" title="statement not covered" > const now = new Date();</span>
1229
- <span class="cstat-no" title="statement not covered" > const expiresAt = new Date(now.getTime() + expiration * 1000);</span>
1230
- <span class="cstat-no" title="statement not covered" ></span>
1231
- <span class="cstat-no" title="statement not covered" > const tokenData = {</span>
1232
- <span class="cstat-no" title="statement not covered" > ...payload,</span>
1233
- <span class="cstat-no" title="statement not covered" > iat: now.getTime(),</span>
1234
- <span class="cstat-no" title="statement not covered" > exp: expiresAt.getTime(),</span>
1235
- <span class="cstat-no" title="statement not covered" > nonce: this.generate(8),</span>
1236
- <span class="cstat-no" title="statement not covered" > };</span>
1237
- <span class="cstat-no" title="statement not covered" ></span>
1238
- <span class="cstat-no" title="statement not covered" > const token = Buffer.from(JSON.stringify(tokenData)).toString('base64url');</span>
1239
- <span class="cstat-no" title="statement not covered" > const signature = this.sign(token);</span>
1240
- <span class="cstat-no" title="statement not covered" ></span>
1241
- <span class="cstat-no" title="statement not covered" > return {</span>
1242
- <span class="cstat-no" title="statement not covered" > token,</span>
1243
- <span class="cstat-no" title="statement not covered" > signature,</span>
1244
- <span class="cstat-no" title="statement not covered" > combined: `${token}.${signature}`,</span>
1245
- <span class="cstat-no" title="statement not covered" > createdAt: now,</span>
1246
- <span class="cstat-no" title="statement not covered" > expiresAt,</span>
1247
- <span class="cstat-no" title="statement not covered" > };</span>
1248
- <span class="cstat-no" title="statement not covered" > }</span>
1249
- <span class="cstat-no" title="statement not covered" ></span>
1250
- <span class="cstat-no" title="statement not covered" > /**</span>
1251
- <span class="cstat-no" title="statement not covered" > * Verifies a signed token.</span>
1252
- <span class="cstat-no" title="statement not covered" > *</span>
1253
- <span class="cstat-no" title="statement not covered" > * @param combined - Combined token string (token.signature)</span>
1254
- <span class="cstat-no" title="statement not covered" > * @returns Decoded payload if valid, null otherwise</span>
1255
- <span class="cstat-no" title="statement not covered" > */</span>
1256
- <span class="cstat-no" title="statement not covered" > verifySignedToken(combined: string): Record&lt;string, unknown&gt; | null {</span>
1257
- <span class="cstat-no" title="statement not covered" > if (!this.config.hmacSecret) {</span>
1258
- <span class="cstat-no" title="statement not covered" > throw new TokenGeneratorError(</span>
1259
- <span class="cstat-no" title="statement not covered" > 'HMAC secret required for signed tokens',</span>
1260
- <span class="cstat-no" title="statement not covered" > 'NO_SECRET'</span>
1261
- <span class="cstat-no" title="statement not covered" > );</span>
1262
- <span class="cstat-no" title="statement not covered" > }</span>
1263
- <span class="cstat-no" title="statement not covered" ></span>
1264
- <span class="cstat-no" title="statement not covered" > const parts = combined.split('.');</span>
1265
- <span class="cstat-no" title="statement not covered" > if (parts.length !== 2) {</span>
1266
- <span class="cstat-no" title="statement not covered" > return null;</span>
1267
- <span class="cstat-no" title="statement not covered" > }</span>
1268
- <span class="cstat-no" title="statement not covered" ></span>
1269
- <span class="cstat-no" title="statement not covered" > const [token, signature] = parts;</span>
1270
- <span class="cstat-no" title="statement not covered" ></span>
1271
- <span class="cstat-no" title="statement not covered" > // Verify signature</span>
1272
- <span class="cstat-no" title="statement not covered" > const expectedSignature = this.sign(token);</span>
1273
- <span class="cstat-no" title="statement not covered" ></span>
1274
- <span class="cstat-no" title="statement not covered" > try {</span>
1275
- <span class="cstat-no" title="statement not covered" > const sigBuffer = Buffer.from(signature, 'base64url');</span>
1276
- <span class="cstat-no" title="statement not covered" > const expectedBuffer = Buffer.from(expectedSignature, 'base64url');</span>
1277
- <span class="cstat-no" title="statement not covered" ></span>
1278
- <span class="cstat-no" title="statement not covered" > if (sigBuffer.length !== expectedBuffer.length) {</span>
1279
- <span class="cstat-no" title="statement not covered" > return null;</span>
1280
- <span class="cstat-no" title="statement not covered" > }</span>
1281
- <span class="cstat-no" title="statement not covered" ></span>
1282
- <span class="cstat-no" title="statement not covered" > if (!timingSafeEqual(sigBuffer, expectedBuffer)) {</span>
1283
- <span class="cstat-no" title="statement not covered" > return null;</span>
1284
- <span class="cstat-no" title="statement not covered" > }</span>
1285
- <span class="cstat-no" title="statement not covered" > } catch {</span>
1286
- <span class="cstat-no" title="statement not covered" > return null;</span>
1287
- <span class="cstat-no" title="statement not covered" > }</span>
1288
- <span class="cstat-no" title="statement not covered" ></span>
1289
- <span class="cstat-no" title="statement not covered" > // Decode and validate payload</span>
1290
- <span class="cstat-no" title="statement not covered" > try {</span>
1291
- <span class="cstat-no" title="statement not covered" > const payload = JSON.parse(Buffer.from(token, 'base64url').toString());</span>
1292
- <span class="cstat-no" title="statement not covered" ></span>
1293
- <span class="cstat-no" title="statement not covered" > // Check expiration</span>
1294
- <span class="cstat-no" title="statement not covered" > if (payload.exp &amp;&amp; payload.exp &lt; Date.now()) {</span>
1295
- <span class="cstat-no" title="statement not covered" > return null;</span>
1296
- <span class="cstat-no" title="statement not covered" > }</span>
1297
- <span class="cstat-no" title="statement not covered" ></span>
1298
- <span class="cstat-no" title="statement not covered" > return payload;</span>
1299
- <span class="cstat-no" title="statement not covered" > } catch {</span>
1300
- <span class="cstat-no" title="statement not covered" > return null;</span>
1301
- <span class="cstat-no" title="statement not covered" > }</span>
1302
- <span class="cstat-no" title="statement not covered" > }</span>
1303
- <span class="cstat-no" title="statement not covered" ></span>
1304
- <span class="cstat-no" title="statement not covered" > /**</span>
1305
- <span class="cstat-no" title="statement not covered" > * Generates a refresh token pair.</span>
1306
- <span class="cstat-no" title="statement not covered" > *</span>
1307
- <span class="cstat-no" title="statement not covered" > * @returns Access and refresh tokens</span>
1308
- <span class="cstat-no" title="statement not covered" > */</span>
1309
- <span class="cstat-no" title="statement not covered" > generateTokenPair(): {</span>
1310
- <span class="cstat-no" title="statement not covered" > accessToken: Token;</span>
1311
- <span class="cstat-no" title="statement not covered" > refreshToken: Token;</span>
1312
- <span class="cstat-no" title="statement not covered" > } {</span>
1313
- <span class="cstat-no" title="statement not covered" > return {</span>
1314
- <span class="cstat-no" title="statement not covered" > accessToken: this.generateWithExpiration(900), // 15 minutes</span>
1315
- <span class="cstat-no" title="statement not covered" > refreshToken: this.generateWithExpiration(604800), // 7 days</span>
1316
- <span class="cstat-no" title="statement not covered" > };</span>
1317
- <span class="cstat-no" title="statement not covered" > }</span>
1318
- <span class="cstat-no" title="statement not covered" ></span>
1319
- <span class="cstat-no" title="statement not covered" > /**</span>
1320
- <span class="cstat-no" title="statement not covered" > * Generates a password reset token.</span>
1321
- <span class="cstat-no" title="statement not covered" > *</span>
1322
- <span class="cstat-no" title="statement not covered" > * @returns Password reset token (short expiration)</span>
1323
- <span class="cstat-no" title="statement not covered" > */</span>
1324
- <span class="cstat-no" title="statement not covered" > generatePasswordResetToken(): Token {</span>
1325
- <span class="cstat-no" title="statement not covered" > return this.generateWithExpiration(1800); // 30 minutes</span>
1326
- <span class="cstat-no" title="statement not covered" > }</span>
1327
- <span class="cstat-no" title="statement not covered" ></span>
1328
- <span class="cstat-no" title="statement not covered" > /**</span>
1329
- <span class="cstat-no" title="statement not covered" > * Generates an email verification token.</span>
1330
- <span class="cstat-no" title="statement not covered" > *</span>
1331
- <span class="cstat-no" title="statement not covered" > * @returns Email verification token</span>
1332
- <span class="cstat-no" title="statement not covered" > */</span>
1333
- <span class="cstat-no" title="statement not covered" > generateEmailVerificationToken(): Token {</span>
1334
- <span class="cstat-no" title="statement not covered" > return this.generateWithExpiration(86400); // 24 hours</span>
1335
- <span class="cstat-no" title="statement not covered" > }</span>
1336
- <span class="cstat-no" title="statement not covered" ></span>
1337
- <span class="cstat-no" title="statement not covered" > /**</span>
1338
- <span class="cstat-no" title="statement not covered" > * Generates a unique request ID.</span>
1339
- <span class="cstat-no" title="statement not covered" > *</span>
1340
- <span class="cstat-no" title="statement not covered" > * @returns Request ID (shorter, for logging)</span>
1341
- <span class="cstat-no" title="statement not covered" > */</span>
1342
- <span class="cstat-no" title="statement not covered" > generateRequestId(): string {</span>
1343
- <span class="cstat-no" title="statement not covered" > return this.generate(8);</span>
1344
- <span class="cstat-no" title="statement not covered" > }</span>
1345
- <span class="cstat-no" title="statement not covered" ></span>
1346
- <span class="cstat-no" title="statement not covered" > /**</span>
1347
- <span class="cstat-no" title="statement not covered" > * Generates a correlation ID for distributed tracing.</span>
1348
- <span class="cstat-no" title="statement not covered" > *</span>
1349
- <span class="cstat-no" title="statement not covered" > * @returns Correlation ID</span>
1350
- <span class="cstat-no" title="statement not covered" > */</span>
1351
- <span class="cstat-no" title="statement not covered" > generateCorrelationId(): string {</span>
1352
- <span class="cstat-no" title="statement not covered" > const timestamp = Date.now().toString(36);</span>
1353
- <span class="cstat-no" title="statement not covered" > const random = this.generate(8);</span>
1354
- <span class="cstat-no" title="statement not covered" > return `${timestamp}-${random}`;</span>
1355
- <span class="cstat-no" title="statement not covered" > }</span>
1356
- <span class="cstat-no" title="statement not covered" ></span>
1357
- <span class="cstat-no" title="statement not covered" > /**</span>
1358
- <span class="cstat-no" title="statement not covered" > * Checks if a token has expired.</span>
1359
- <span class="cstat-no" title="statement not covered" > *</span>
1360
- <span class="cstat-no" title="statement not covered" > * @param token - Token to check</span>
1361
- <span class="cstat-no" title="statement not covered" > * @returns True if expired</span>
1362
- <span class="cstat-no" title="statement not covered" > */</span>
1363
- <span class="cstat-no" title="statement not covered" > isExpired(token: Token | VerificationCode): boolean {</span>
1364
- <span class="cstat-no" title="statement not covered" > return token.expiresAt &lt; new Date();</span>
1365
- <span class="cstat-no" title="statement not covered" > }</span>
1366
- <span class="cstat-no" title="statement not covered" ></span>
1367
- <span class="cstat-no" title="statement not covered" > /**</span>
1368
- <span class="cstat-no" title="statement not covered" > * Compares two tokens in constant time.</span>
1369
- <span class="cstat-no" title="statement not covered" > *</span>
1370
- <span class="cstat-no" title="statement not covered" > * @param a - First token</span>
1371
- <span class="cstat-no" title="statement not covered" > * @param b - Second token</span>
1372
- <span class="cstat-no" title="statement not covered" > * @returns True if equal</span>
1373
- <span class="cstat-no" title="statement not covered" > */</span>
1374
- <span class="cstat-no" title="statement not covered" > compare(a: string, b: string): boolean {</span>
1375
- <span class="cstat-no" title="statement not covered" > if (a.length !== b.length) {</span>
1376
- <span class="cstat-no" title="statement not covered" > return false;</span>
1377
- <span class="cstat-no" title="statement not covered" > }</span>
1378
- <span class="cstat-no" title="statement not covered" ></span>
1379
- <span class="cstat-no" title="statement not covered" > try {</span>
1380
- <span class="cstat-no" title="statement not covered" > const bufferA = Buffer.from(a);</span>
1381
- <span class="cstat-no" title="statement not covered" > const bufferB = Buffer.from(b);</span>
1382
- <span class="cstat-no" title="statement not covered" > return timingSafeEqual(bufferA, bufferB);</span>
1383
- <span class="cstat-no" title="statement not covered" > } catch {</span>
1384
- <span class="cstat-no" title="statement not covered" > return false;</span>
1385
- <span class="cstat-no" title="statement not covered" > }</span>
1386
- <span class="cstat-no" title="statement not covered" > }</span>
1387
- <span class="cstat-no" title="statement not covered" ></span>
1388
- <span class="cstat-no" title="statement not covered" > /**</span>
1389
- <span class="cstat-no" title="statement not covered" > * Signs data using HMAC-SHA256.</span>
1390
- <span class="cstat-no" title="statement not covered" > */</span>
1391
- <span class="cstat-no" title="statement not covered" > private sign(data: string): string {</span>
1392
- <span class="cstat-no" title="statement not covered" > return createHmac('sha256', this.config.hmacSecret)</span>
1393
- <span class="cstat-no" title="statement not covered" > .update(data)</span>
1394
- <span class="cstat-no" title="statement not covered" > .digest('base64url');</span>
1395
- <span class="cstat-no" title="statement not covered" > }</span>
1396
- <span class="cstat-no" title="statement not covered" ></span>
1397
- <span class="cstat-no" title="statement not covered" > /**</span>
1398
- <span class="cstat-no" title="statement not covered" > * Encodes bytes according to configuration.</span>
1399
- <span class="cstat-no" title="statement not covered" > */</span>
1400
- <span class="cstat-no" title="statement not covered" > private encode(buffer: Buffer): string {</span>
1401
- <span class="cstat-no" title="statement not covered" > switch (this.config.encoding) {</span>
1402
- <span class="cstat-no" title="statement not covered" > case 'hex':</span>
1403
- <span class="cstat-no" title="statement not covered" > return buffer.toString('hex');</span>
1404
- <span class="cstat-no" title="statement not covered" > case 'base64':</span>
1405
- <span class="cstat-no" title="statement not covered" > return buffer.toString('base64');</span>
1406
- <span class="cstat-no" title="statement not covered" > case 'base64url':</span>
1407
- <span class="cstat-no" title="statement not covered" > default:</span>
1408
- <span class="cstat-no" title="statement not covered" > return buffer.toString('base64url');</span>
1409
- <span class="cstat-no" title="statement not covered" > }</span>
1410
- <span class="cstat-no" title="statement not covered" > }</span>
1411
- <span class="cstat-no" title="statement not covered" >}</span>
1412
- <span class="cstat-no" title="statement not covered" ></span>
1413
- <span class="cstat-no" title="statement not covered" >/**</span>
1414
- <span class="cstat-no" title="statement not covered" > * Factory function to create a production token generator.</span>
1415
- <span class="cstat-no" title="statement not covered" > *</span>
1416
- <span class="cstat-no" title="statement not covered" > * @param hmacSecret - HMAC secret for signed tokens</span>
1417
- <span class="cstat-no" title="statement not covered" > * @returns Configured TokenGenerator</span>
1418
- <span class="cstat-no" title="statement not covered" > */</span>
1419
- <span class="cstat-no" title="statement not covered" >export function createTokenGenerator(hmacSecret: string): TokenGenerator {</span>
1420
- <span class="cstat-no" title="statement not covered" > return new TokenGenerator({</span>
1421
- <span class="cstat-no" title="statement not covered" > hmacSecret,</span>
1422
- <span class="cstat-no" title="statement not covered" > defaultLength: 32,</span>
1423
- <span class="cstat-no" title="statement not covered" > encoding: 'base64url',</span>
1424
- <span class="cstat-no" title="statement not covered" > });</span>
1425
- <span class="cstat-no" title="statement not covered" >}</span>
1426
- <span class="cstat-no" title="statement not covered" ></span>
1427
- <span class="cstat-no" title="statement not covered" >/**</span>
1428
- <span class="cstat-no" title="statement not covered" > * Singleton instance for quick token generation without configuration.</span>
1429
- <span class="cstat-no" title="statement not covered" > */</span>
1430
- <span class="cstat-no" title="statement not covered" >let defaultGenerator: TokenGenerator | null = null;</span>
1431
- <span class="cstat-no" title="statement not covered" ></span>
1432
- <span class="cstat-no" title="statement not covered" >/**</span>
1433
- <span class="cstat-no" title="statement not covered" > * Gets or creates the default token generator.</span>
1434
- <span class="cstat-no" title="statement not covered" > * Note: Does not support signed tokens without configuration.</span>
1435
- <span class="cstat-no" title="statement not covered" > */</span>
1436
- <span class="cstat-no" title="statement not covered" >export function getDefaultGenerator(): TokenGenerator {</span>
1437
- <span class="cstat-no" title="statement not covered" > if (!defaultGenerator) {</span>
1438
- <span class="cstat-no" title="statement not covered" > defaultGenerator = new TokenGenerator();</span>
1439
- <span class="cstat-no" title="statement not covered" > }</span>
1440
- <span class="cstat-no" title="statement not covered" > return defaultGenerator;</span>
1441
- <span class="cstat-no" title="statement not covered" >}</span>
1442
- <span class="cstat-no" title="statement not covered" ></span>
1443
- <span class="cstat-no" title="statement not covered" >/**</span>
1444
- <span class="cstat-no" title="statement not covered" > * Quick token generation functions.</span>
1445
- <span class="cstat-no" title="statement not covered" > */</span>
1446
- <span class="cstat-no" title="statement not covered" >export const quickGenerate = {</span>
1447
- <span class="cstat-no" title="statement not covered" > token: (length = 32) =&gt; getDefaultGenerator().generate(length),</span>
1448
- <span class="cstat-no" title="statement not covered" > sessionToken: () =&gt; getDefaultGenerator().generateSessionToken(),</span>
1449
- <span class="cstat-no" title="statement not covered" > csrfToken: () =&gt; getDefaultGenerator().generateCsrfToken(),</span>
1450
- <span class="cstat-no" title="statement not covered" > apiToken: (prefix = 'cf_') =&gt; getDefaultGenerator().generateApiToken(prefix),</span>
1451
- <span class="cstat-no" title="statement not covered" > verificationCode: (length = 6) =&gt; getDefaultGenerator().generateVerificationCode(length),</span>
1452
- <span class="cstat-no" title="statement not covered" > requestId: () =&gt; getDefaultGenerator().generateRequestId(),</span>
1453
- <span class="cstat-no" title="statement not covered" > correlationId: () =&gt; getDefaultGenerator().generateCorrelationId(),</span>
1454
- <span class="cstat-no" title="statement not covered" >};</span>
1455
- &nbsp;</pre></td></tr></table></pre>
1456
-
1457
- <div class='push'></div><!-- for sticky footer -->
1458
- </div><!-- /wrapper -->
1459
- <div class='footer quiet pad2 space-top1 center small'>
1460
- Code coverage generated by
1461
- <a href="https://istanbul.js.org/" target="_blank" rel="noopener noreferrer">istanbul</a>
1462
- at 2026-01-06T16:55:48.110Z
1463
- </div>
1464
- <script src="../prettify.js"></script>
1465
- <script>
1466
- window.onload = function () {
1467
- prettyPrint();
1468
- };
1469
- </script>
1470
- <script src="../sorter.js"></script>
1471
- <script src="../block-navigation.js"></script>
1472
- </body>
1473
- </html>
1474
-