@onlineapps/service-validator-core 1.0.8 → 1.0.10

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 (40) hide show
  1. package/README.md +0 -0
  2. package/jest.config.js +0 -0
  3. package/package.json +5 -1
  4. package/src/config.js +30 -0
  5. package/src/defaults.js +17 -0
  6. package/src/index.js +1 -1
  7. package/src/security/ValidationProofCodec.js +0 -0
  8. package/src/security/ValidationProofVerifier.js +0 -0
  9. package/src/security/certificateManager.js +0 -0
  10. package/src/security/tokenManager.js +17 -12
  11. package/src/types/ValidationProofSchema.js +0 -0
  12. package/src/utils/FingerprintUtils.js +16 -3
  13. package/src/validators/connectorValidator.js +0 -0
  14. package/src/validators/endpointValidator.js +0 -0
  15. package/src/validators/healthValidator.js +0 -0
  16. package/src/validators/openApiValidator.js +0 -0
  17. package/tests/component/validation-flow.test.js +10 -0
  18. package/tests/integration/real-validation.test.js +11 -1
  19. package/tests/unit/ValidationCore.test.js +10 -0
  20. package/coverage/clover.xml +0 -468
  21. package/coverage/coverage-final.json +0 -8
  22. package/coverage/lcov-report/base.css +0 -224
  23. package/coverage/lcov-report/block-navigation.js +0 -87
  24. package/coverage/lcov-report/favicon.png +0 -0
  25. package/coverage/lcov-report/index.html +0 -146
  26. package/coverage/lcov-report/prettify.css +0 -1
  27. package/coverage/lcov-report/prettify.js +0 -2
  28. package/coverage/lcov-report/sort-arrow-sprite.png +0 -0
  29. package/coverage/lcov-report/sorter.js +0 -210
  30. package/coverage/lcov-report/src/index.html +0 -116
  31. package/coverage/lcov-report/src/index.js.html +0 -643
  32. package/coverage/lcov-report/src/security/certificateManager.js.html +0 -799
  33. package/coverage/lcov-report/src/security/index.html +0 -131
  34. package/coverage/lcov-report/src/security/tokenManager.js.html +0 -622
  35. package/coverage/lcov-report/src/validators/connectorValidator.js.html +0 -787
  36. package/coverage/lcov-report/src/validators/endpointValidator.js.html +0 -577
  37. package/coverage/lcov-report/src/validators/healthValidator.js.html +0 -655
  38. package/coverage/lcov-report/src/validators/index.html +0 -161
  39. package/coverage/lcov-report/src/validators/openApiValidator.js.html +0 -517
  40. package/coverage/lcov.info +0 -982
@@ -1,622 +0,0 @@
1
-
2
- <!doctype html>
3
- <html lang="en">
4
-
5
- <head>
6
- <title>Code coverage report for src/security/tokenManager.js</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/security</a> tokenManager.js</h1>
23
- <div class='clearfix'>
24
-
25
- <div class='fl pad1y space-right2'>
26
- <span class="strong">46% </span>
27
- <span class="quiet">Statements</span>
28
- <span class='fraction'>23/50</span>
29
- </div>
30
-
31
-
32
- <div class='fl pad1y space-right2'>
33
- <span class="strong">48.64% </span>
34
- <span class="quiet">Branches</span>
35
- <span class='fraction'>18/37</span>
36
- </div>
37
-
38
-
39
- <div class='fl pad1y space-right2'>
40
- <span class="strong">40% </span>
41
- <span class="quiet">Functions</span>
42
- <span class='fraction'>4/10</span>
43
- </div>
44
-
45
-
46
- <div class='fl pad1y space-right2'>
47
- <span class="strong">46% </span>
48
- <span class="quiet">Lines</span>
49
- <span class='fraction'>23/50</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></td><td class="line-coverage quiet"><span class="cline-any cline-yes">3x</span>
246
- <span class="cline-any cline-yes">3x</span>
247
- <span class="cline-any cline-neutral">&nbsp;</span>
248
- <span class="cline-any cline-neutral">&nbsp;</span>
249
- <span class="cline-any cline-neutral">&nbsp;</span>
250
- <span class="cline-any cline-yes">42x</span>
251
- <span class="cline-any cline-yes">42x</span>
252
- <span class="cline-any cline-yes">42x</span>
253
- <span class="cline-any cline-yes">42x</span>
254
- <span class="cline-any cline-yes">42x</span>
255
- <span class="cline-any cline-neutral">&nbsp;</span>
256
- <span class="cline-any cline-neutral">&nbsp;</span>
257
- <span class="cline-any cline-neutral">&nbsp;</span>
258
- <span class="cline-any cline-neutral">&nbsp;</span>
259
- <span class="cline-any cline-neutral">&nbsp;</span>
260
- <span class="cline-any cline-neutral">&nbsp;</span>
261
- <span class="cline-any cline-neutral">&nbsp;</span>
262
- <span class="cline-any cline-yes">42x</span>
263
- <span class="cline-any cline-neutral">&nbsp;</span>
264
- <span class="cline-any cline-neutral">&nbsp;</span>
265
- <span class="cline-any cline-neutral">&nbsp;</span>
266
- <span class="cline-any cline-neutral">&nbsp;</span>
267
- <span class="cline-any cline-neutral">&nbsp;</span>
268
- <span class="cline-any cline-neutral">&nbsp;</span>
269
- <span class="cline-any cline-neutral">&nbsp;</span>
270
- <span class="cline-any cline-neutral">&nbsp;</span>
271
- <span class="cline-any cline-yes">1x</span>
272
- <span class="cline-any cline-neutral">&nbsp;</span>
273
- <span class="cline-any cline-yes">1x</span>
274
- <span class="cline-any cline-neutral">&nbsp;</span>
275
- <span class="cline-any cline-neutral">&nbsp;</span>
276
- <span class="cline-any cline-neutral">&nbsp;</span>
277
- <span class="cline-any cline-neutral">&nbsp;</span>
278
- <span class="cline-any cline-neutral">&nbsp;</span>
279
- <span class="cline-any cline-neutral">&nbsp;</span>
280
- <span class="cline-any cline-neutral">&nbsp;</span>
281
- <span class="cline-any cline-yes">1x</span>
282
- <span class="cline-any cline-neutral">&nbsp;</span>
283
- <span class="cline-any cline-neutral">&nbsp;</span>
284
- <span class="cline-any cline-neutral">&nbsp;</span>
285
- <span class="cline-any cline-neutral">&nbsp;</span>
286
- <span class="cline-any cline-yes">1x</span>
287
- <span class="cline-any cline-neutral">&nbsp;</span>
288
- <span class="cline-any cline-neutral">&nbsp;</span>
289
- <span class="cline-any cline-neutral">&nbsp;</span>
290
- <span class="cline-any cline-neutral">&nbsp;</span>
291
- <span class="cline-any cline-neutral">&nbsp;</span>
292
- <span class="cline-any cline-neutral">&nbsp;</span>
293
- <span class="cline-any cline-neutral">&nbsp;</span>
294
- <span class="cline-any cline-neutral">&nbsp;</span>
295
- <span class="cline-any cline-yes">2x</span>
296
- <span class="cline-any cline-neutral">&nbsp;</span>
297
- <span class="cline-any cline-yes">2x</span>
298
- <span class="cline-any cline-neutral">&nbsp;</span>
299
- <span class="cline-any cline-neutral">&nbsp;</span>
300
- <span class="cline-any cline-neutral">&nbsp;</span>
301
- <span class="cline-any cline-neutral">&nbsp;</span>
302
- <span class="cline-any cline-neutral">&nbsp;</span>
303
- <span class="cline-any cline-yes">1x</span>
304
- <span class="cline-any cline-no">&nbsp;</span>
305
- <span class="cline-any cline-neutral">&nbsp;</span>
306
- <span class="cline-any cline-neutral">&nbsp;</span>
307
- <span class="cline-any cline-neutral">&nbsp;</span>
308
- <span class="cline-any cline-yes">1x</span>
309
- <span class="cline-any cline-yes">1x</span>
310
- <span class="cline-any cline-neutral">&nbsp;</span>
311
- <span class="cline-any cline-neutral">&nbsp;</span>
312
- <span class="cline-any cline-yes">1x</span>
313
- <span class="cline-any cline-no">&nbsp;</span>
314
- <span class="cline-any cline-neutral">&nbsp;</span>
315
- <span class="cline-any cline-neutral">&nbsp;</span>
316
- <span class="cline-any cline-neutral">&nbsp;</span>
317
- <span class="cline-any cline-yes">1x</span>
318
- <span class="cline-any cline-neutral">&nbsp;</span>
319
- <span class="cline-any cline-yes">1x</span>
320
- <span class="cline-any cline-no">&nbsp;</span>
321
- <span class="cline-any cline-yes">1x</span>
322
- <span class="cline-any cline-yes">1x</span>
323
- <span class="cline-any cline-neutral">&nbsp;</span>
324
- <span class="cline-any cline-no">&nbsp;</span>
325
- <span class="cline-any cline-neutral">&nbsp;</span>
326
- <span class="cline-any cline-neutral">&nbsp;</span>
327
- <span class="cline-any cline-neutral">&nbsp;</span>
328
- <span class="cline-any cline-neutral">&nbsp;</span>
329
- <span class="cline-any cline-neutral">&nbsp;</span>
330
- <span class="cline-any cline-neutral">&nbsp;</span>
331
- <span class="cline-any cline-neutral">&nbsp;</span>
332
- <span class="cline-any cline-neutral">&nbsp;</span>
333
- <span class="cline-any cline-neutral">&nbsp;</span>
334
- <span class="cline-any cline-neutral">&nbsp;</span>
335
- <span class="cline-any cline-no">&nbsp;</span>
336
- <span class="cline-any cline-no">&nbsp;</span>
337
- <span class="cline-any cline-neutral">&nbsp;</span>
338
- <span class="cline-any cline-neutral">&nbsp;</span>
339
- <span class="cline-any cline-no">&nbsp;</span>
340
- <span class="cline-any cline-neutral">&nbsp;</span>
341
- <span class="cline-any cline-neutral">&nbsp;</span>
342
- <span class="cline-any cline-neutral">&nbsp;</span>
343
- <span class="cline-any cline-neutral">&nbsp;</span>
344
- <span class="cline-any cline-neutral">&nbsp;</span>
345
- <span class="cline-any cline-neutral">&nbsp;</span>
346
- <span class="cline-any cline-neutral">&nbsp;</span>
347
- <span class="cline-any cline-neutral">&nbsp;</span>
348
- <span class="cline-any cline-neutral">&nbsp;</span>
349
- <span class="cline-any cline-neutral">&nbsp;</span>
350
- <span class="cline-any cline-neutral">&nbsp;</span>
351
- <span class="cline-any cline-neutral">&nbsp;</span>
352
- <span class="cline-any cline-neutral">&nbsp;</span>
353
- <span class="cline-any cline-neutral">&nbsp;</span>
354
- <span class="cline-any cline-neutral">&nbsp;</span>
355
- <span class="cline-any cline-neutral">&nbsp;</span>
356
- <span class="cline-any cline-no">&nbsp;</span>
357
- <span class="cline-any cline-neutral">&nbsp;</span>
358
- <span class="cline-any cline-no">&nbsp;</span>
359
- <span class="cline-any cline-no">&nbsp;</span>
360
- <span class="cline-any cline-neutral">&nbsp;</span>
361
- <span class="cline-any cline-neutral">&nbsp;</span>
362
- <span class="cline-any cline-no">&nbsp;</span>
363
- <span class="cline-any cline-no">&nbsp;</span>
364
- <span class="cline-any cline-neutral">&nbsp;</span>
365
- <span class="cline-any cline-neutral">&nbsp;</span>
366
- <span class="cline-any cline-no">&nbsp;</span>
367
- <span class="cline-any cline-neutral">&nbsp;</span>
368
- <span class="cline-any cline-neutral">&nbsp;</span>
369
- <span class="cline-any cline-neutral">&nbsp;</span>
370
- <span class="cline-any cline-neutral">&nbsp;</span>
371
- <span class="cline-any cline-neutral">&nbsp;</span>
372
- <span class="cline-any cline-neutral">&nbsp;</span>
373
- <span class="cline-any cline-neutral">&nbsp;</span>
374
- <span class="cline-any cline-neutral">&nbsp;</span>
375
- <span class="cline-any cline-no">&nbsp;</span>
376
- <span class="cline-any cline-no">&nbsp;</span>
377
- <span class="cline-any cline-neutral">&nbsp;</span>
378
- <span class="cline-any cline-neutral">&nbsp;</span>
379
- <span class="cline-any cline-neutral">&nbsp;</span>
380
- <span class="cline-any cline-neutral">&nbsp;</span>
381
- <span class="cline-any cline-neutral">&nbsp;</span>
382
- <span class="cline-any cline-neutral">&nbsp;</span>
383
- <span class="cline-any cline-neutral">&nbsp;</span>
384
- <span class="cline-any cline-no">&nbsp;</span>
385
- <span class="cline-any cline-neutral">&nbsp;</span>
386
- <span class="cline-any cline-no">&nbsp;</span>
387
- <span class="cline-any cline-no">&nbsp;</span>
388
- <span class="cline-any cline-no">&nbsp;</span>
389
- <span class="cline-any cline-neutral">&nbsp;</span>
390
- <span class="cline-any cline-neutral">&nbsp;</span>
391
- <span class="cline-any cline-no">&nbsp;</span>
392
- <span class="cline-any cline-neutral">&nbsp;</span>
393
- <span class="cline-any cline-neutral">&nbsp;</span>
394
- <span class="cline-any cline-neutral">&nbsp;</span>
395
- <span class="cline-any cline-no">&nbsp;</span>
396
- <span class="cline-any cline-neutral">&nbsp;</span>
397
- <span class="cline-any cline-neutral">&nbsp;</span>
398
- <span class="cline-any cline-neutral">&nbsp;</span>
399
- <span class="cline-any cline-neutral">&nbsp;</span>
400
- <span class="cline-any cline-neutral">&nbsp;</span>
401
- <span class="cline-any cline-neutral">&nbsp;</span>
402
- <span class="cline-any cline-neutral">&nbsp;</span>
403
- <span class="cline-any cline-neutral">&nbsp;</span>
404
- <span class="cline-any cline-neutral">&nbsp;</span>
405
- <span class="cline-any cline-no">&nbsp;</span>
406
- <span class="cline-any cline-no">&nbsp;</span>
407
- <span class="cline-any cline-no">&nbsp;</span>
408
- <span class="cline-any cline-neutral">&nbsp;</span>
409
- <span class="cline-any cline-no">&nbsp;</span>
410
- <span class="cline-any cline-neutral">&nbsp;</span>
411
- <span class="cline-any cline-neutral">&nbsp;</span>
412
- <span class="cline-any cline-neutral">&nbsp;</span>
413
- <span class="cline-any cline-neutral">&nbsp;</span>
414
- <span class="cline-any cline-neutral">&nbsp;</span>
415
- <span class="cline-any cline-neutral">&nbsp;</span>
416
- <span class="cline-any cline-neutral">&nbsp;</span>
417
- <span class="cline-any cline-neutral">&nbsp;</span>
418
- <span class="cline-any cline-neutral">&nbsp;</span>
419
- <span class="cline-any cline-no">&nbsp;</span>
420
- <span class="cline-any cline-no">&nbsp;</span>
421
- <span class="cline-any cline-neutral">&nbsp;</span>
422
- <span class="cline-any cline-neutral">&nbsp;</span>
423
- <span class="cline-any cline-neutral">&nbsp;</span>
424
- <span class="cline-any cline-yes">3x</span></td><td class="text"><pre class="prettyprint lang-js">const jwt = require('jsonwebtoken');
425
- const crypto = require('crypto');
426
- &nbsp;
427
- class TokenManager {
428
- constructor(config = {}) {
429
- this.secret = config.secret || process.env.VALIDATION_TOKEN_SECRET || this.generateSecret();
430
- this.expiresIn = config.expiresIn || '24h';
431
- this.algorithm = config.algorithm || 'HS256';
432
- this.issuer = config.issuer || 'validation-core';
433
- this.usedTokens = new Set(); // Track used tokens for single-use enforcement
434
- }
435
- &nbsp;
436
- /**
437
- * Generate a secure secret if none provided
438
- * @returns {string} Generated secret
439
- */
440
- generateSecret() {
441
- return crypto.randomBytes(64).toString('hex');
442
- }
443
- &nbsp;
444
- /**
445
- * Generate a pre-validation token
446
- * @param {object} payload - Token payload
447
- * @returns {Promise&lt;string&gt;} Generated token
448
- */
449
- async generateToken(payload) {
450
- const tokenId = crypto.randomBytes(16).toString('hex');
451
- &nbsp;
452
- const tokenPayload = {
453
- ...payload,
454
- jti: tokenId, // JWT ID for tracking single use
455
- iat: Math.floor(Date.now() / 1000),
456
- iss: this.issuer,
457
- type: payload.type || <span class="branch-1 cbranch-no" title="branch not covered" >'pre-validation'</span>
458
- };
459
- &nbsp;
460
- const options = {
461
- expiresIn: this.expiresIn,
462
- algorithm: this.algorithm
463
- };
464
- &nbsp;
465
- return jwt.sign(tokenPayload, this.secret, options);
466
- }
467
- &nbsp;
468
- /**
469
- * Verify and decode a token
470
- * @param {string} token - Token to verify
471
- * @returns {Promise&lt;object&gt;} Decoded payload
472
- */
473
- async verifyToken(token) {
474
- try {
475
- // Verify token signature and expiration
476
- const decoded = jwt.verify(token, this.secret, {
477
- algorithms: [this.algorithm],
478
- issuer: this.issuer
479
- });
480
- &nbsp;
481
- // Check if token has already been used (single-use enforcement)
482
- <span class="missing-if-branch" title="if path not taken" >I</span>if (decoded.jti &amp;&amp; this.usedTokens.has(decoded.jti)) {
483
- <span class="cstat-no" title="statement not covered" > throw new Error('Token has already been used');</span>
484
- }
485
- &nbsp;
486
- // Mark token as used
487
- <span class="missing-if-branch" title="else path not taken" >E</span>if (decoded.jti) {
488
- this.usedTokens.add(decoded.jti);
489
- &nbsp;
490
- // Clean up old tokens after expiry (prevent memory leak)
491
- <span class="missing-if-branch" title="if path not taken" >I</span>if (this.usedTokens.size &gt; 10000) {
492
- <span class="cstat-no" title="statement not covered" > this.cleanupUsedTokens();</span>
493
- }
494
- }
495
- &nbsp;
496
- return decoded;
497
- } catch (error) {
498
- <span class="missing-if-branch" title="if path not taken" >I</span>if (error.name === 'TokenExpiredError') {
499
- <span class="cstat-no" title="statement not covered" > throw new Error('Token has expired');</span>
500
- } else <span class="missing-if-branch" title="else path not taken" >E</span>if (error.name === 'JsonWebTokenError') {
501
- throw new Error('Invalid token');
502
- }
503
- <span class="cstat-no" title="statement not covered" > throw error;</span>
504
- }
505
- }
506
- &nbsp;
507
- /**
508
- * Generate a validation request token (for service-to-validator communication)
509
- * @param {object} preValidationResult - Pre-validation results
510
- * @param {string} serviceName - Service requesting validation
511
- * @returns {Promise&lt;string&gt;} Request token
512
- */
513
- <span class="fstat-no" title="function not covered" > as</span>ync generateRequestToken(preValidationResult, serviceName) {
514
- <span class="cstat-no" title="statement not covered" > if (!preValidationResult.success) {</span>
515
- <span class="cstat-no" title="statement not covered" > throw new Error('Cannot generate request token for failed pre-validation');</span>
516
- }
517
- &nbsp;
518
- <span class="cstat-no" title="statement not covered" > return this.generateToken({</span>
519
- type: 'validation-request',
520
- serviceName,
521
- preValidation: {
522
- timestamp: preValidationResult.timestamp,
523
- checks: preValidationResult.checks
524
- },
525
- expiresIn: '1h' // Shorter expiry for request tokens
526
- });
527
- }
528
- &nbsp;
529
- /**
530
- * Verify a validation request token
531
- * @param {string} token - Request token
532
- * @returns {Promise&lt;object&gt;} Token payload
533
- */
534
- <span class="fstat-no" title="function not covered" > as</span>ync verifyRequestToken(token) {
535
- const decoded = <span class="cstat-no" title="statement not covered" >await this.verifyToken(token);</span>
536
- &nbsp;
537
- <span class="cstat-no" title="statement not covered" > if (decoded.type !== 'validation-request') {</span>
538
- <span class="cstat-no" title="statement not covered" > throw new Error('Invalid token type for validation request');</span>
539
- }
540
- &nbsp;
541
- <span class="cstat-no" title="statement not covered" > if (!decoded.preValidation) {</span>
542
- <span class="cstat-no" title="statement not covered" > throw new Error('Missing pre-validation data in request token');</span>
543
- }
544
- &nbsp;
545
- <span class="cstat-no" title="statement not covered" > return decoded;</span>
546
- }
547
- &nbsp;
548
- /**
549
- * Clean up expired tokens from used tokens set
550
- */
551
- <span class="fstat-no" title="function not covered" > cl</span>eanupUsedTokens() {
552
- // In a production environment, this would check expiry times
553
- // For now, we'll clear half of the oldest tokens
554
- const tokensToKeep = <span class="cstat-no" title="statement not covered" >Array.from(this.usedTokens).slice(-5000);</span>
555
- <span class="cstat-no" title="statement not covered" > this.usedTokens = new Set(tokensToKeep);</span>
556
- }
557
- &nbsp;
558
- /**
559
- * Revoke a token (add to blacklist)
560
- * @param {string} tokenOrJti - Token or JWT ID to revoke
561
- */
562
- <span class="fstat-no" title="function not covered" > re</span>vokeToken(tokenOrJti) {
563
- <span class="cstat-no" title="statement not covered" > try {</span>
564
- // Try to decode if it's a full token
565
- const decoded = <span class="cstat-no" title="statement not covered" >jwt.decode(tokenOrJti);</span>
566
- <span class="cstat-no" title="statement not covered" > if (decoded &amp;&amp; decoded.jti) {</span>
567
- <span class="cstat-no" title="statement not covered" > this.usedTokens.add(decoded.jti);</span>
568
- } else {
569
- // Assume it's a JTI directly
570
- <span class="cstat-no" title="statement not covered" > this.usedTokens.add(tokenOrJti);</span>
571
- }
572
- } catch {
573
- // If decode fails, assume it's a JTI
574
- <span class="cstat-no" title="statement not covered" > this.usedTokens.add(tokenOrJti);</span>
575
- }
576
- }
577
- &nbsp;
578
- /**
579
- * Check if a token is revoked/used
580
- * @param {string} token - Token to check
581
- * @returns {boolean} True if revoked/used
582
- */
583
- <span class="fstat-no" title="function not covered" > is</span>TokenRevoked(token) {
584
- <span class="cstat-no" title="statement not covered" > try {</span>
585
- const decoded = <span class="cstat-no" title="statement not covered" >jwt.decode(token);</span>
586
- <span class="cstat-no" title="statement not covered" > return decoded &amp;&amp; decoded.jti &amp;&amp; this.usedTokens.has(decoded.jti);</span>
587
- } catch {
588
- <span class="cstat-no" title="statement not covered" > return false;</span>
589
- }
590
- }
591
- &nbsp;
592
- /**
593
- * Generate a fingerprint for validation data
594
- * @param {object} validationData - Data to fingerprint
595
- * @returns {string} Fingerprint hash
596
- */
597
- <span class="fstat-no" title="function not covered" > ge</span>nerateFingerprint(validationData) {
598
- const sortedData = <span class="cstat-no" title="statement not covered" >JSON.stringify(validationData, Object.keys(validationData).sort());</span>
599
- <span class="cstat-no" title="statement not covered" > return crypto.createHash('sha256').update(sortedData).digest('hex');</span>
600
- }
601
- }
602
- &nbsp;
603
- module.exports = TokenManager;</pre></td></tr></table></pre>
604
-
605
- <div class='push'></div><!-- for sticky footer -->
606
- </div><!-- /wrapper -->
607
- <div class='footer quiet pad2 space-top1 center small'>
608
- Code coverage generated by
609
- <a href="https://istanbul.js.org/" target="_blank" rel="noopener noreferrer">istanbul</a>
610
- at 2025-09-18T14:57:28.142Z
611
- </div>
612
- <script src="../../prettify.js"></script>
613
- <script>
614
- window.onload = function () {
615
- prettyPrint();
616
- };
617
- </script>
618
- <script src="../../sorter.js"></script>
619
- <script src="../../block-navigation.js"></script>
620
- </body>
621
- </html>
622
-