@navios/di 0.4.2 → 0.5.0

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 (120) hide show
  1. package/README.md +211 -1
  2. package/coverage/clover.xml +1912 -1277
  3. package/coverage/coverage-final.json +37 -28
  4. package/coverage/docs/examples/basic-usage.mts.html +1 -1
  5. package/coverage/docs/examples/factory-pattern.mts.html +1 -1
  6. package/coverage/docs/examples/index.html +1 -1
  7. package/coverage/docs/examples/injection-tokens.mts.html +1 -1
  8. package/coverage/docs/examples/request-scope-example.mts.html +1 -1
  9. package/coverage/docs/examples/service-lifecycle.mts.html +1 -1
  10. package/coverage/index.html +71 -41
  11. package/coverage/lib/_tsup-dts-rollup.d.mts.html +682 -43
  12. package/coverage/lib/index.d.mts.html +7 -4
  13. package/coverage/lib/index.html +5 -5
  14. package/coverage/lib/testing/index.d.mts.html +91 -0
  15. package/coverage/lib/testing/index.html +116 -0
  16. package/coverage/src/base-instance-holder-manager.mts.html +589 -0
  17. package/coverage/src/container.mts.html +257 -74
  18. package/coverage/src/decorators/factory.decorator.mts.html +1 -1
  19. package/coverage/src/decorators/index.html +1 -1
  20. package/coverage/src/decorators/index.mts.html +1 -1
  21. package/coverage/src/decorators/injectable.decorator.mts.html +20 -20
  22. package/coverage/src/enums/index.html +1 -1
  23. package/coverage/src/enums/index.mts.html +1 -1
  24. package/coverage/src/enums/injectable-scope.enum.mts.html +1 -1
  25. package/coverage/src/enums/injectable-type.enum.mts.html +1 -1
  26. package/coverage/src/errors/di-error.mts.html +292 -0
  27. package/coverage/src/errors/errors.enum.mts.html +30 -21
  28. package/coverage/src/errors/factory-not-found.mts.html +31 -22
  29. package/coverage/src/errors/factory-token-not-resolved.mts.html +29 -26
  30. package/coverage/src/errors/index.html +56 -41
  31. package/coverage/src/errors/index.mts.html +15 -9
  32. package/coverage/src/errors/instance-destroying.mts.html +31 -22
  33. package/coverage/src/errors/instance-expired.mts.html +31 -22
  34. package/coverage/src/errors/instance-not-found.mts.html +31 -22
  35. package/coverage/src/errors/unknown-error.mts.html +31 -43
  36. package/coverage/src/event-emitter.mts.html +14 -14
  37. package/coverage/src/factory-context.mts.html +1 -1
  38. package/coverage/src/index.html +121 -46
  39. package/coverage/src/index.mts.html +7 -4
  40. package/coverage/src/injection-token.mts.html +28 -28
  41. package/coverage/src/injector.mts.html +1 -1
  42. package/coverage/src/instance-resolver.mts.html +1762 -0
  43. package/coverage/src/interfaces/factory.interface.mts.html +1 -1
  44. package/coverage/src/interfaces/index.html +1 -1
  45. package/coverage/src/interfaces/index.mts.html +1 -1
  46. package/coverage/src/interfaces/on-service-destroy.interface.mts.html +1 -1
  47. package/coverage/src/interfaces/on-service-init.interface.mts.html +1 -1
  48. package/coverage/src/registry.mts.html +28 -28
  49. package/coverage/src/request-context-holder.mts.html +183 -102
  50. package/coverage/src/request-context-manager.mts.html +532 -0
  51. package/coverage/src/service-instantiator.mts.html +49 -49
  52. package/coverage/src/service-invalidator.mts.html +1372 -0
  53. package/coverage/src/service-locator-event-bus.mts.html +48 -48
  54. package/coverage/src/service-locator-instance-holder.mts.html +2 -14
  55. package/coverage/src/service-locator-manager.mts.html +71 -335
  56. package/coverage/src/service-locator.mts.html +240 -2328
  57. package/coverage/src/symbols/index.html +1 -1
  58. package/coverage/src/symbols/index.mts.html +1 -1
  59. package/coverage/src/symbols/injectable-token.mts.html +1 -1
  60. package/coverage/src/testing/index.html +131 -0
  61. package/coverage/src/testing/index.mts.html +88 -0
  62. package/coverage/src/testing/test-container.mts.html +445 -0
  63. package/coverage/src/token-processor.mts.html +607 -0
  64. package/coverage/src/utils/defer.mts.html +28 -214
  65. package/coverage/src/utils/get-injectable-token.mts.html +7 -7
  66. package/coverage/src/utils/get-injectors.mts.html +99 -99
  67. package/coverage/src/utils/index.html +15 -15
  68. package/coverage/src/utils/index.mts.html +4 -7
  69. package/coverage/src/utils/types.mts.html +1 -1
  70. package/docs/injectable.md +51 -11
  71. package/docs/scopes.md +63 -29
  72. package/lib/_tsup-dts-rollup.d.mts +376 -213
  73. package/lib/_tsup-dts-rollup.d.ts +376 -213
  74. package/lib/{chunk-3NLYPYBY.mjs → chunk-44F3LXW5.mjs} +1021 -605
  75. package/lib/chunk-44F3LXW5.mjs.map +1 -0
  76. package/lib/index.d.mts +6 -4
  77. package/lib/index.d.ts +6 -4
  78. package/lib/index.js +1192 -776
  79. package/lib/index.js.map +1 -1
  80. package/lib/index.mjs +2 -2
  81. package/lib/testing/index.js +1258 -840
  82. package/lib/testing/index.js.map +1 -1
  83. package/lib/testing/index.mjs +1 -1
  84. package/package.json +1 -1
  85. package/src/__tests__/container.spec.mts +47 -13
  86. package/src/__tests__/errors.spec.mts +53 -27
  87. package/src/__tests__/injectable.spec.mts +73 -0
  88. package/src/__tests__/request-scope.spec.mts +0 -2
  89. package/src/__tests__/service-locator-manager.spec.mts +12 -82
  90. package/src/__tests__/service-locator.spec.mts +1009 -1
  91. package/src/__type-tests__/inject.spec-d.mts +30 -7
  92. package/src/__type-tests__/injectable.spec-d.mts +76 -37
  93. package/src/base-instance-holder-manager.mts +2 -9
  94. package/src/container.mts +61 -9
  95. package/src/decorators/injectable.decorator.mts +29 -5
  96. package/src/errors/di-error.mts +69 -0
  97. package/src/errors/index.mts +9 -7
  98. package/src/injection-token.mts +1 -0
  99. package/src/injector.mts +2 -0
  100. package/src/instance-resolver.mts +559 -0
  101. package/src/request-context-holder.mts +0 -2
  102. package/src/request-context-manager.mts +149 -0
  103. package/src/service-invalidator.mts +429 -0
  104. package/src/service-locator-instance-holder.mts +0 -4
  105. package/src/service-locator-manager.mts +10 -40
  106. package/src/service-locator.mts +86 -782
  107. package/src/token-processor.mts +174 -0
  108. package/src/utils/get-injectors.mts +161 -24
  109. package/src/utils/index.mts +0 -1
  110. package/src/utils/types.mts +12 -8
  111. package/lib/chunk-3NLYPYBY.mjs.map +0 -1
  112. package/src/__tests__/defer.spec.mts +0 -166
  113. package/src/errors/errors.enum.mts +0 -8
  114. package/src/errors/factory-not-found.mts +0 -8
  115. package/src/errors/factory-token-not-resolved.mts +0 -10
  116. package/src/errors/instance-destroying.mts +0 -8
  117. package/src/errors/instance-expired.mts +0 -8
  118. package/src/errors/instance-not-found.mts +0 -8
  119. package/src/errors/unknown-error.mts +0 -15
  120. package/src/utils/defer.mts +0 -73
@@ -0,0 +1,532 @@
1
+
2
+ <!doctype html>
3
+ <html lang="en">
4
+
5
+ <head>
6
+ <title>Code coverage report for src/request-context-manager.mts</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> request-context-manager.mts</h1>
23
+ <div class='clearfix'>
24
+
25
+ <div class='fl pad1y space-right2'>
26
+ <span class="strong">80.64% </span>
27
+ <span class="quiet">Statements</span>
28
+ <span class='fraction'>75/93</span>
29
+ </div>
30
+
31
+
32
+ <div class='fl pad1y space-right2'>
33
+ <span class="strong">83.33% </span>
34
+ <span class="quiet">Branches</span>
35
+ <span class='fraction'>20/24</span>
36
+ </div>
37
+
38
+
39
+ <div class='fl pad1y space-right2'>
40
+ <span class="strong">100% </span>
41
+ <span class="quiet">Functions</span>
42
+ <span class='fraction'>8/8</span>
43
+ </div>
44
+
45
+
46
+ <div class='fl pad1y space-right2'>
47
+ <span class="strong">80.64% </span>
48
+ <span class="quiet">Lines</span>
49
+ <span class='fraction'>75/93</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 high'></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></td><td class="line-coverage quiet"><span class="cline-any cline-neutral">&nbsp;</span>
216
+ <span class="cline-any cline-neutral">&nbsp;</span>
217
+ <span class="cline-any cline-yes">1x</span>
218
+ <span class="cline-any cline-neutral">&nbsp;</span>
219
+ <span class="cline-any cline-neutral">&nbsp;</span>
220
+ <span class="cline-any cline-neutral">&nbsp;</span>
221
+ <span class="cline-any cline-neutral">&nbsp;</span>
222
+ <span class="cline-any cline-neutral">&nbsp;</span>
223
+ <span class="cline-any cline-yes">1x</span>
224
+ <span class="cline-any cline-yes">143x</span>
225
+ <span class="cline-any cline-yes">143x</span>
226
+ <span class="cline-any cline-neutral">&nbsp;</span>
227
+ <span class="cline-any cline-yes">143x</span>
228
+ <span class="cline-any cline-neutral">&nbsp;</span>
229
+ <span class="cline-any cline-neutral">&nbsp;</span>
230
+ <span class="cline-any cline-neutral">&nbsp;</span>
231
+ <span class="cline-any cline-neutral">&nbsp;</span>
232
+ <span class="cline-any cline-neutral">&nbsp;</span>
233
+ <span class="cline-any cline-neutral">&nbsp;</span>
234
+ <span class="cline-any cline-neutral">&nbsp;</span>
235
+ <span class="cline-any cline-neutral">&nbsp;</span>
236
+ <span class="cline-any cline-yes">143x</span>
237
+ <span class="cline-any cline-yes">32x</span>
238
+ <span class="cline-any cline-yes">32x</span>
239
+ <span class="cline-any cline-yes">32x</span>
240
+ <span class="cline-any cline-yes">32x</span>
241
+ <span class="cline-any cline-yes">32x</span>
242
+ <span class="cline-any cline-no">&nbsp;</span>
243
+ <span class="cline-any cline-no">&nbsp;</span>
244
+ <span class="cline-any cline-no">&nbsp;</span>
245
+ <span class="cline-any cline-no">&nbsp;</span>
246
+ <span class="cline-any cline-neutral">&nbsp;</span>
247
+ <span class="cline-any cline-yes">32x</span>
248
+ <span class="cline-any cline-yes">32x</span>
249
+ <span class="cline-any cline-yes">32x</span>
250
+ <span class="cline-any cline-yes">32x</span>
251
+ <span class="cline-any cline-yes">32x</span>
252
+ <span class="cline-any cline-yes">32x</span>
253
+ <span class="cline-any cline-yes">32x</span>
254
+ <span class="cline-any cline-neutral">&nbsp;</span>
255
+ <span class="cline-any cline-yes">32x</span>
256
+ <span class="cline-any cline-yes">32x</span>
257
+ <span class="cline-any cline-yes">32x</span>
258
+ <span class="cline-any cline-yes">32x</span>
259
+ <span class="cline-any cline-yes">32x</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-neutral">&nbsp;</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-yes">143x</span>
266
+ <span class="cline-any cline-yes">26x</span>
267
+ <span class="cline-any cline-yes">26x</span>
268
+ <span class="cline-any cline-no">&nbsp;</span>
269
+ <span class="cline-any cline-no">&nbsp;</span>
270
+ <span class="cline-any cline-no">&nbsp;</span>
271
+ <span class="cline-any cline-no">&nbsp;</span>
272
+ <span class="cline-any cline-no">&nbsp;</span>
273
+ <span class="cline-any cline-neutral">&nbsp;</span>
274
+ <span class="cline-any cline-yes">26x</span>
275
+ <span class="cline-any cline-yes">26x</span>
276
+ <span class="cline-any cline-yes">26x</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-yes">26x</span>
280
+ <span class="cline-any cline-yes">26x</span>
281
+ <span class="cline-any cline-yes">21x</span>
282
+ <span class="cline-any cline-yes">4x</span>
283
+ <span class="cline-any cline-yes">4x</span>
284
+ <span class="cline-any cline-yes">4x</span>
285
+ <span class="cline-any cline-yes">4x</span>
286
+ <span class="cline-any cline-yes">21x</span>
287
+ <span class="cline-any cline-neutral">&nbsp;</span>
288
+ <span class="cline-any cline-yes">26x</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-yes">26x</span>
292
+ <span class="cline-any cline-yes">26x</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">26x</span>
296
+ <span class="cline-any cline-yes">24x</span>
297
+ <span class="cline-any cline-yes">24x</span>
298
+ <span class="cline-any cline-yes">24x</span>
299
+ <span class="cline-any cline-neutral">&nbsp;</span>
300
+ <span class="cline-any cline-yes">26x</span>
301
+ <span class="cline-any cline-yes">26x</span>
302
+ <span class="cline-any cline-yes">26x</span>
303
+ <span class="cline-any cline-yes">26x</span>
304
+ <span class="cline-any cline-neutral">&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-neutral">&nbsp;</span>
309
+ <span class="cline-any cline-yes">143x</span>
310
+ <span class="cline-any cline-yes">445x</span>
311
+ <span class="cline-any cline-yes">445x</span>
312
+ <span class="cline-any cline-neutral">&nbsp;</span>
313
+ <span class="cline-any cline-neutral">&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">143x</span>
318
+ <span class="cline-any cline-yes">3x</span>
319
+ <span class="cline-any cline-yes">3x</span>
320
+ <span class="cline-any cline-no">&nbsp;</span>
321
+ <span class="cline-any cline-no">&nbsp;</span>
322
+ <span class="cline-any cline-no">&nbsp;</span>
323
+ <span class="cline-any cline-no">&nbsp;</span>
324
+ <span class="cline-any cline-yes">3x</span>
325
+ <span class="cline-any cline-yes">3x</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-yes">143x</span>
332
+ <span class="cline-any cline-yes">41x</span>
333
+ <span class="cline-any cline-yes">41x</span>
334
+ <span class="cline-any cline-neutral">&nbsp;</span>
335
+ <span class="cline-any cline-neutral">&nbsp;</span>
336
+ <span class="cline-any cline-neutral">&nbsp;</span>
337
+ <span class="cline-any cline-neutral">&nbsp;</span>
338
+ <span class="cline-any cline-yes">143x</span>
339
+ <span class="cline-any cline-yes">9x</span>
340
+ <span class="cline-any cline-neutral">&nbsp;</span>
341
+ <span class="cline-any cline-yes">9x</span>
342
+ <span class="cline-any cline-yes">7x</span>
343
+ <span class="cline-any cline-yes">7x</span>
344
+ <span class="cline-any cline-yes">7x</span>
345
+ <span class="cline-any cline-neutral">&nbsp;</span>
346
+ <span class="cline-any cline-yes">2x</span>
347
+ <span class="cline-any cline-yes">9x</span>
348
+ <span class="cline-any cline-yes">9x</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-yes">9x</span>
352
+ <span class="cline-any cline-yes">2x</span>
353
+ <span class="cline-any cline-yes">2x</span>
354
+ <span class="cline-any cline-yes">2x</span>
355
+ <span class="cline-any cline-no">&nbsp;</span>
356
+ <span class="cline-any cline-no">&nbsp;</span>
357
+ <span class="cline-any cline-no">&nbsp;</span>
358
+ <span class="cline-any cline-no">&nbsp;</span>
359
+ <span class="cline-any cline-neutral">&nbsp;</span>
360
+ <span class="cline-any cline-no">&nbsp;</span>
361
+ <span class="cline-any cline-yes">2x</span>
362
+ <span class="cline-any cline-yes">9x</span>
363
+ <span class="cline-any cline-yes">143x</span>
364
+ <span class="cline-any cline-neutral">&nbsp;</span></td><td class="text"><pre class="prettyprint lang-js">import type { RequestContextHolder } from './request-context-holder.mjs'
365
+ &nbsp;
366
+ import { DefaultRequestContextHolder } from './request-context-holder.mjs'
367
+ &nbsp;
368
+ /**
369
+ * RequestContextManager handles request context lifecycle management.
370
+ * Extracted from ServiceLocator to improve separation of concerns.
371
+ */
372
+ export class RequestContextManager {
373
+ private readonly requestContexts = new Map&lt;string, RequestContextHolder&gt;()
374
+ private currentRequestContext: RequestContextHolder | null = null
375
+ &nbsp;
376
+ constructor(private readonly logger: Console | null = null) {}
377
+ &nbsp;
378
+ /**
379
+ * Begins a new request context with the given parameters.
380
+ * @param requestId Unique identifier for this request
381
+ * @param metadata Optional metadata for the request
382
+ * @param priority Priority for resolution (higher = more priority)
383
+ * @returns The created request context holder
384
+ */
385
+ beginRequest(
386
+ requestId: string,
387
+ metadata?: Record&lt;string, any&gt;,
388
+ priority: number = 100,
389
+ ): RequestContextHolder {
390
+ if (this.requestContexts.has(requestId)) <span class="branch-0 cbranch-no" title="branch not covered" >{</span>
391
+ <span class="cstat-no" title="statement not covered" > throw new Error(</span>
392
+ <span class="cstat-no" title="statement not covered" > `[RequestContextManager] Request context ${requestId} already exists`,</span>
393
+ <span class="cstat-no" title="statement not covered" > )</span>
394
+ <span class="cstat-no" title="statement not covered" > }</span>
395
+ &nbsp;
396
+ const contextHolder = new DefaultRequestContextHolder(
397
+ requestId,
398
+ priority,
399
+ metadata,
400
+ )
401
+ this.requestContexts.set(requestId, contextHolder)
402
+ this.currentRequestContext = contextHolder
403
+ &nbsp;
404
+ this.logger?.log(
405
+ `[RequestContextManager] Started request context: ${requestId}`,
406
+ )
407
+ return contextHolder
408
+ }
409
+ &nbsp;
410
+ /**
411
+ * Ends a request context and cleans up all associated instances.
412
+ * @param requestId The request ID to end
413
+ */
414
+ async endRequest(requestId: string): Promise&lt;void&gt; {
415
+ const contextHolder = this.requestContexts.get(requestId)
416
+ if (!contextHolder) <span class="branch-0 cbranch-no" title="branch not covered" >{</span>
417
+ <span class="cstat-no" title="statement not covered" > this.logger?.warn(</span>
418
+ <span class="cstat-no" title="statement not covered" > `[RequestContextManager] Request context ${requestId} not found`,</span>
419
+ <span class="cstat-no" title="statement not covered" > )</span>
420
+ <span class="cstat-no" title="statement not covered" > return</span>
421
+ <span class="cstat-no" title="statement not covered" > }</span>
422
+ &nbsp;
423
+ this.logger?.log(
424
+ `[RequestContextManager] Ending request context: ${requestId}`,
425
+ )
426
+ &nbsp;
427
+ // Clean up all request-scoped instances
428
+ const cleanupPromises: Promise&lt;any&gt;[] = []
429
+ for (const [, holder] of contextHolder.holders) {
430
+ if (holder.destroyListeners.length &gt; 0) {
431
+ cleanupPromises.push(
432
+ Promise.all(holder.destroyListeners.map((listener) =&gt; listener())),
433
+ )
434
+ }
435
+ }
436
+ &nbsp;
437
+ await Promise.all(cleanupPromises)
438
+ &nbsp;
439
+ // Clear the context
440
+ contextHolder.clear()
441
+ this.requestContexts.delete(requestId)
442
+ &nbsp;
443
+ // Reset current context if it was the one being ended
444
+ if (this.currentRequestContext === contextHolder) {
445
+ this.currentRequestContext =
446
+ Array.from(this.requestContexts.values()).at(-1) ?? null
447
+ }
448
+ &nbsp;
449
+ this.logger?.log(
450
+ `[RequestContextManager] Request context ${requestId} ended`,
451
+ )
452
+ }
453
+ &nbsp;
454
+ /**
455
+ * Gets the current request context.
456
+ * @returns The current request context holder or null
457
+ */
458
+ getCurrentRequestContext(): RequestContextHolder | null {
459
+ return this.currentRequestContext
460
+ }
461
+ &nbsp;
462
+ /**
463
+ * Sets the current request context.
464
+ * @param requestId The request ID to set as current
465
+ */
466
+ setCurrentRequestContext(requestId: string): void {
467
+ const contextHolder = this.requestContexts.get(requestId)
468
+ if (!contextHolder) <span class="branch-0 cbranch-no" title="branch not covered" >{</span>
469
+ <span class="cstat-no" title="statement not covered" > throw new Error(</span>
470
+ <span class="cstat-no" title="statement not covered" > `[RequestContextManager] Request context ${requestId} not found`,</span>
471
+ <span class="cstat-no" title="statement not covered" > )</span>
472
+ <span class="cstat-no" title="statement not covered" > }</span>
473
+ this.currentRequestContext = contextHolder
474
+ }
475
+ &nbsp;
476
+ /**
477
+ * Gets all request contexts.
478
+ * @returns Map of request contexts
479
+ */
480
+ getRequestContexts(): Map&lt;string, RequestContextHolder&gt; {
481
+ return this.requestContexts
482
+ }
483
+ &nbsp;
484
+ /**
485
+ * Clears all request contexts.
486
+ */
487
+ async clearAllRequestContexts(): Promise&lt;void&gt; {
488
+ const requestIds = Array.from(this.requestContexts.keys())
489
+ &nbsp;
490
+ if (requestIds.length === 0) {
491
+ this.logger?.log('[RequestContextManager] No request contexts to clear')
492
+ return
493
+ }
494
+ &nbsp;
495
+ this.logger?.log(
496
+ `[RequestContextManager] Clearing ${requestIds.length} request contexts: ${requestIds.join(', ')}`,
497
+ )
498
+ &nbsp;
499
+ // Clear request contexts sequentially to avoid race conditions
500
+ for (const requestId of requestIds) {
501
+ try {
502
+ await this.endRequest(requestId)
503
+ <span class="branch-0 cbranch-no" title="branch not covered" > } catch (error) {</span>
504
+ <span class="cstat-no" title="statement not covered" > this.logger?.error(</span>
505
+ <span class="cstat-no" title="statement not covered" > `[RequestContextManager] Error clearing request context ${requestId}:`,</span>
506
+ <span class="cstat-no" title="statement not covered" > error,</span>
507
+ <span class="cstat-no" title="statement not covered" > )</span>
508
+ // Continue with other request contexts even if one fails
509
+ <span class="cstat-no" title="statement not covered" > }</span>
510
+ }
511
+ }
512
+ }
513
+ &nbsp;</pre></td></tr></table></pre>
514
+
515
+ <div class='push'></div><!-- for sticky footer -->
516
+ </div><!-- /wrapper -->
517
+ <div class='footer quiet pad2 space-top1 center small'>
518
+ Code coverage generated by
519
+ <a href="https://istanbul.js.org/" target="_blank" rel="noopener noreferrer">istanbul</a>
520
+ at 2025-09-21T17:47:07.632Z
521
+ </div>
522
+ <script src="../prettify.js"></script>
523
+ <script>
524
+ window.onload = function () {
525
+ prettyPrint();
526
+ };
527
+ </script>
528
+ <script src="../sorter.js"></script>
529
+ <script src="../block-navigation.js"></script>
530
+ </body>
531
+ </html>
532
+