@bluelibs/runner 3.4.2 → 4.0.1

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 (375) hide show
  1. package/AI.md +621 -0
  2. package/README.md +1024 -577
  3. package/dist/context.d.ts +4 -8
  4. package/dist/context.js +5 -12
  5. package/dist/context.js.map +1 -1
  6. package/dist/define.d.ts +9 -113
  7. package/dist/define.js +29 -358
  8. package/dist/define.js.map +1 -1
  9. package/dist/definers/defineEvent.d.ts +2 -0
  10. package/dist/definers/defineEvent.js +23 -0
  11. package/dist/definers/defineEvent.js.map +1 -0
  12. package/dist/definers/defineHook.d.ts +6 -0
  13. package/dist/definers/defineHook.js +24 -0
  14. package/dist/definers/defineHook.js.map +1 -0
  15. package/dist/definers/defineOverride.d.ts +14 -0
  16. package/dist/definers/defineOverride.js +13 -0
  17. package/dist/definers/defineOverride.js.map +1 -0
  18. package/dist/definers/defineResource.d.ts +2 -0
  19. package/dist/definers/defineResource.js +69 -0
  20. package/dist/definers/defineResource.js.map +1 -0
  21. package/dist/definers/defineResourceMiddleware.d.ts +2 -0
  22. package/dist/definers/defineResourceMiddleware.js +42 -0
  23. package/dist/definers/defineResourceMiddleware.js.map +1 -0
  24. package/dist/definers/defineTag.d.ts +12 -0
  25. package/dist/definers/defineTag.js +106 -0
  26. package/dist/definers/defineTag.js.map +1 -0
  27. package/dist/definers/defineTask.d.ts +15 -0
  28. package/dist/definers/defineTask.js +42 -0
  29. package/dist/definers/defineTask.js.map +1 -0
  30. package/dist/definers/defineTaskMiddleware.d.ts +2 -0
  31. package/dist/definers/defineTaskMiddleware.js +42 -0
  32. package/dist/definers/defineTaskMiddleware.js.map +1 -0
  33. package/dist/definers/tools.d.ts +45 -0
  34. package/dist/definers/tools.js +75 -0
  35. package/dist/definers/tools.js.map +1 -0
  36. package/dist/defs.d.ts +16 -424
  37. package/dist/defs.js +26 -38
  38. package/dist/defs.js.map +1 -1
  39. package/dist/errors.d.ts +23 -8
  40. package/dist/errors.js +50 -10
  41. package/dist/errors.js.map +1 -1
  42. package/dist/globals/globalEvents.d.ts +15 -39
  43. package/dist/globals/globalEvents.js +20 -81
  44. package/dist/globals/globalEvents.js.map +1 -1
  45. package/dist/globals/globalMiddleware.d.ts +24 -17
  46. package/dist/globals/globalMiddleware.js +12 -4
  47. package/dist/globals/globalMiddleware.js.map +1 -1
  48. package/dist/globals/globalResources.d.ts +13 -28
  49. package/dist/globals/globalResources.js +15 -7
  50. package/dist/globals/globalResources.js.map +1 -1
  51. package/dist/globals/globalTags.d.ts +9 -0
  52. package/dist/globals/globalTags.js +23 -0
  53. package/dist/globals/globalTags.js.map +1 -0
  54. package/dist/globals/middleware/cache.middleware.d.ts +10 -17
  55. package/dist/globals/middleware/cache.middleware.js +4 -16
  56. package/dist/globals/middleware/cache.middleware.js.map +1 -1
  57. package/dist/globals/middleware/requireContext.middleware.d.ts +1 -1
  58. package/dist/globals/middleware/requireContext.middleware.js +5 -14
  59. package/dist/globals/middleware/requireContext.middleware.js.map +1 -1
  60. package/dist/globals/middleware/retry.middleware.d.ts +2 -1
  61. package/dist/globals/middleware/retry.middleware.js +32 -5
  62. package/dist/globals/middleware/retry.middleware.js.map +1 -1
  63. package/dist/globals/middleware/timeout.middleware.d.ts +2 -1
  64. package/dist/globals/middleware/timeout.middleware.js +31 -5
  65. package/dist/globals/middleware/timeout.middleware.js.map +1 -1
  66. package/dist/globals/resources/debug/debug.resource.d.ts +7 -0
  67. package/dist/globals/resources/debug/debug.resource.js +29 -0
  68. package/dist/globals/resources/debug/debug.resource.js.map +1 -0
  69. package/dist/globals/resources/debug/debug.tag.d.ts +2 -0
  70. package/dist/globals/resources/debug/debug.tag.js +12 -0
  71. package/dist/globals/resources/debug/debug.tag.js.map +1 -0
  72. package/dist/globals/resources/debug/debugConfig.resource.d.ts +22 -0
  73. package/dist/globals/resources/debug/debugConfig.resource.js +20 -0
  74. package/dist/globals/resources/debug/debugConfig.resource.js.map +1 -0
  75. package/dist/globals/resources/debug/executionTracker.middleware.d.ts +50 -0
  76. package/dist/globals/resources/debug/executionTracker.middleware.js +87 -0
  77. package/dist/globals/resources/debug/executionTracker.middleware.js.map +1 -0
  78. package/dist/globals/resources/debug/globalEvent.hook.d.ts +27 -0
  79. package/dist/globals/resources/debug/globalEvent.hook.js +38 -0
  80. package/dist/globals/resources/debug/globalEvent.hook.js.map +1 -0
  81. package/dist/globals/resources/debug/hook.hook.d.ts +25 -0
  82. package/dist/globals/resources/debug/hook.hook.js +42 -0
  83. package/dist/globals/resources/debug/hook.hook.js.map +1 -0
  84. package/dist/globals/resources/debug/index.d.ts +6 -0
  85. package/dist/{types → globals/resources/debug}/index.js +6 -11
  86. package/dist/globals/resources/debug/index.js.map +1 -0
  87. package/dist/globals/resources/debug/middleware.hook.d.ts +25 -0
  88. package/dist/globals/resources/debug/middleware.hook.js +71 -0
  89. package/dist/globals/resources/debug/middleware.hook.js.map +1 -0
  90. package/dist/globals/resources/debug/types.d.ts +25 -0
  91. package/dist/globals/resources/debug/types.js +65 -0
  92. package/dist/globals/resources/debug/types.js.map +1 -0
  93. package/dist/globals/resources/debug/utils.d.ts +2 -0
  94. package/dist/globals/resources/debug/utils.js +9 -0
  95. package/dist/globals/resources/debug/utils.js.map +1 -0
  96. package/dist/globals/resources/queue.resource.d.ts +3 -3
  97. package/dist/globals/resources/queue.resource.js.map +1 -1
  98. package/dist/globals/types.d.ts +1 -0
  99. package/dist/{task.types.js → globals/types.js} +2 -7
  100. package/dist/globals/types.js.map +1 -0
  101. package/dist/index.d.ts +58 -85
  102. package/dist/index.js +23 -10
  103. package/dist/index.js.map +1 -1
  104. package/dist/models/DependencyProcessor.d.ts +8 -6
  105. package/dist/models/DependencyProcessor.js +116 -33
  106. package/dist/models/DependencyProcessor.js.map +1 -1
  107. package/dist/models/EventManager.d.ts +127 -7
  108. package/dist/models/EventManager.js +251 -78
  109. package/dist/models/EventManager.js.map +1 -1
  110. package/dist/models/LogPrinter.d.ts +55 -0
  111. package/dist/models/LogPrinter.js +196 -0
  112. package/dist/models/LogPrinter.js.map +1 -0
  113. package/dist/models/Logger.d.ts +47 -27
  114. package/dist/models/Logger.js +133 -155
  115. package/dist/models/Logger.js.map +1 -1
  116. package/dist/models/MiddlewareManager.d.ts +86 -0
  117. package/dist/models/MiddlewareManager.js +409 -0
  118. package/dist/models/MiddlewareManager.js.map +1 -0
  119. package/dist/models/OverrideManager.d.ts +3 -3
  120. package/dist/models/OverrideManager.js +22 -7
  121. package/dist/models/OverrideManager.js.map +1 -1
  122. package/dist/models/ResourceInitializer.d.ts +4 -3
  123. package/dist/models/ResourceInitializer.js +12 -68
  124. package/dist/models/ResourceInitializer.js.map +1 -1
  125. package/dist/models/RunResult.d.ts +35 -0
  126. package/dist/models/RunResult.js +68 -0
  127. package/dist/models/RunResult.js.map +1 -0
  128. package/dist/models/Store.d.ts +30 -17
  129. package/dist/models/Store.js +87 -25
  130. package/dist/models/Store.js.map +1 -1
  131. package/dist/models/StoreRegistry.d.ts +34 -19
  132. package/dist/models/StoreRegistry.js +248 -100
  133. package/dist/models/StoreRegistry.js.map +1 -1
  134. package/dist/models/StoreValidator.d.ts +5 -7
  135. package/dist/models/StoreValidator.js +50 -17
  136. package/dist/models/StoreValidator.js.map +1 -1
  137. package/dist/models/TaskRunner.d.ts +3 -2
  138. package/dist/models/TaskRunner.js +6 -103
  139. package/dist/models/TaskRunner.js.map +1 -1
  140. package/dist/models/UnhandledError.d.ts +11 -0
  141. package/dist/models/UnhandledError.js +30 -0
  142. package/dist/models/UnhandledError.js.map +1 -0
  143. package/dist/models/index.d.ts +3 -0
  144. package/dist/models/index.js +3 -0
  145. package/dist/models/index.js.map +1 -1
  146. package/dist/{tools → models/utils}/findCircularDependencies.js +8 -16
  147. package/dist/models/utils/findCircularDependencies.js.map +1 -0
  148. package/dist/models/utils/safeStringify.d.ts +3 -0
  149. package/dist/models/utils/safeStringify.js +45 -0
  150. package/dist/models/utils/safeStringify.js.map +1 -0
  151. package/dist/processHooks.d.ts +2 -0
  152. package/dist/processHooks.js +70 -0
  153. package/dist/processHooks.js.map +1 -0
  154. package/dist/run.d.ts +14 -27
  155. package/dist/run.js +100 -36
  156. package/dist/run.js.map +1 -1
  157. package/dist/testing.d.ts +5 -4
  158. package/dist/testing.js +3 -2
  159. package/dist/testing.js.map +1 -1
  160. package/dist/tools/getCallerFile.d.ts +0 -8
  161. package/dist/tools/getCallerFile.js +0 -51
  162. package/dist/tools/getCallerFile.js.map +1 -1
  163. package/dist/types/contracts.d.ts +55 -0
  164. package/dist/types/contracts.js +4 -0
  165. package/dist/types/contracts.js.map +1 -0
  166. package/dist/types/event.d.ts +26 -7
  167. package/dist/types/event.js +1 -1
  168. package/dist/types/event.js.map +1 -1
  169. package/dist/types/hook.d.ts +21 -0
  170. package/dist/{models/StoreTypes.js → types/hook.js} +2 -1
  171. package/dist/types/hook.js.map +1 -0
  172. package/dist/types/meta.d.ts +6 -1
  173. package/dist/types/meta.js +4 -2
  174. package/dist/types/meta.js.map +1 -1
  175. package/dist/types/resource.d.ts +40 -52
  176. package/dist/types/resource.js +1 -0
  177. package/dist/types/resource.js.map +1 -1
  178. package/dist/types/resourceMiddleware.d.ts +47 -0
  179. package/dist/{middleware.types.js → types/resourceMiddleware.js} +1 -1
  180. package/dist/types/resourceMiddleware.js.map +1 -0
  181. package/dist/types/runner.d.ts +37 -0
  182. package/dist/types/{base.js → runner.js} +1 -1
  183. package/dist/types/runner.js.map +1 -0
  184. package/dist/types/storeTypes.d.ts +40 -0
  185. package/dist/types/{metadata.js → storeTypes.js} +1 -1
  186. package/dist/types/storeTypes.js.map +1 -0
  187. package/dist/types/symbols.d.ts +10 -21
  188. package/dist/types/symbols.js +17 -22
  189. package/dist/types/symbols.js.map +1 -1
  190. package/dist/types/tag.d.ts +46 -0
  191. package/dist/{resource.types.js → types/tag.js} +2 -1
  192. package/dist/types/tag.js.map +1 -0
  193. package/dist/types/task.d.ts +28 -52
  194. package/dist/types/task.js +1 -0
  195. package/dist/types/task.js.map +1 -1
  196. package/dist/types/taskMiddleware.d.ts +48 -0
  197. package/dist/{event.types.js → types/taskMiddleware.js} +1 -1
  198. package/dist/types/taskMiddleware.js.map +1 -0
  199. package/dist/types/utilities.d.ts +105 -6
  200. package/dist/types/utilities.js +16 -2
  201. package/dist/types/utilities.js.map +1 -1
  202. package/package.json +14 -5
  203. package/dist/cli/extract-docs.d.ts +0 -2
  204. package/dist/cli/extract-docs.js +0 -88
  205. package/dist/cli/extract-docs.js.map +0 -1
  206. package/dist/common.types.d.ts +0 -20
  207. package/dist/common.types.js +0 -4
  208. package/dist/common.types.js.map +0 -1
  209. package/dist/defs/core.d.ts +0 -144
  210. package/dist/defs/core.js +0 -6
  211. package/dist/defs/core.js.map +0 -1
  212. package/dist/defs/symbols.d.ts +0 -42
  213. package/dist/defs/symbols.js +0 -45
  214. package/dist/defs/symbols.js.map +0 -1
  215. package/dist/defs/tags.d.ts +0 -70
  216. package/dist/defs/tags.js +0 -6
  217. package/dist/defs/tags.js.map +0 -1
  218. package/dist/defs.returnTag.d.ts +0 -36
  219. package/dist/defs.returnTag.js +0 -4
  220. package/dist/defs.returnTag.js.map +0 -1
  221. package/dist/docs/introspect.d.ts +0 -7
  222. package/dist/docs/introspect.js +0 -199
  223. package/dist/docs/introspect.js.map +0 -1
  224. package/dist/docs/markdown.d.ts +0 -2
  225. package/dist/docs/markdown.js +0 -148
  226. package/dist/docs/markdown.js.map +0 -1
  227. package/dist/docs/model.d.ts +0 -62
  228. package/dist/docs/model.js +0 -33
  229. package/dist/docs/model.js.map +0 -1
  230. package/dist/event.types.d.ts +0 -18
  231. package/dist/event.types.js.map +0 -1
  232. package/dist/examples/express-mongo/index.d.ts +0 -0
  233. package/dist/examples/express-mongo/index.js +0 -3
  234. package/dist/examples/express-mongo/index.js.map +0 -1
  235. package/dist/examples/registrator-example.d.ts +0 -122
  236. package/dist/examples/registrator-example.js +0 -147
  237. package/dist/examples/registrator-example.js.map +0 -1
  238. package/dist/express/docsRouter.d.ts +0 -12
  239. package/dist/express/docsRouter.js +0 -54
  240. package/dist/express/docsRouter.js.map +0 -1
  241. package/dist/globalEvents.d.ts +0 -40
  242. package/dist/globalEvents.js +0 -94
  243. package/dist/globalEvents.js.map +0 -1
  244. package/dist/globalResources.d.ts +0 -10
  245. package/dist/globalResources.js +0 -43
  246. package/dist/globalResources.js.map +0 -1
  247. package/dist/middleware.types.d.ts +0 -40
  248. package/dist/middleware.types.js.map +0 -1
  249. package/dist/models/StoreConstants.d.ts +0 -14
  250. package/dist/models/StoreConstants.js +0 -19
  251. package/dist/models/StoreConstants.js.map +0 -1
  252. package/dist/models/StoreTypes.d.ts +0 -21
  253. package/dist/models/StoreTypes.js.map +0 -1
  254. package/dist/models/VarStore.d.ts +0 -17
  255. package/dist/models/VarStore.js +0 -60
  256. package/dist/models/VarStore.js.map +0 -1
  257. package/dist/resource.types.d.ts +0 -31
  258. package/dist/resource.types.js.map +0 -1
  259. package/dist/symbols.d.ts +0 -24
  260. package/dist/symbols.js +0 -29
  261. package/dist/symbols.js.map +0 -1
  262. package/dist/t1.d.ts +0 -1
  263. package/dist/t1.js +0 -13
  264. package/dist/t1.js.map +0 -1
  265. package/dist/task.types.d.ts +0 -55
  266. package/dist/task.types.js.map +0 -1
  267. package/dist/tools/findCircularDependencies.js.map +0 -1
  268. package/dist/tools/registratorId.d.ts +0 -4
  269. package/dist/tools/registratorId.js +0 -40
  270. package/dist/tools/registratorId.js.map +0 -1
  271. package/dist/tools/simpleHash.d.ts +0 -9
  272. package/dist/tools/simpleHash.js +0 -34
  273. package/dist/tools/simpleHash.js.map +0 -1
  274. package/dist/types/base-interfaces.d.ts +0 -18
  275. package/dist/types/base-interfaces.js +0 -6
  276. package/dist/types/base-interfaces.js.map +0 -1
  277. package/dist/types/base.d.ts +0 -13
  278. package/dist/types/base.js.map +0 -1
  279. package/dist/types/dependencies.d.ts +0 -51
  280. package/dist/types/dependencies.js +0 -3
  281. package/dist/types/dependencies.js.map +0 -1
  282. package/dist/types/dependency-core.d.ts +0 -14
  283. package/dist/types/dependency-core.js +0 -5
  284. package/dist/types/dependency-core.js.map +0 -1
  285. package/dist/types/events.d.ts +0 -52
  286. package/dist/types/events.js +0 -6
  287. package/dist/types/events.js.map +0 -1
  288. package/dist/types/hooks.d.ts +0 -16
  289. package/dist/types/hooks.js +0 -5
  290. package/dist/types/hooks.js.map +0 -1
  291. package/dist/types/index.d.ts +0 -8
  292. package/dist/types/index.js.map +0 -1
  293. package/dist/types/metadata.d.ts +0 -75
  294. package/dist/types/metadata.js.map +0 -1
  295. package/dist/types/middleware.d.ts +0 -63
  296. package/dist/types/middleware.js +0 -3
  297. package/dist/types/middleware.js.map +0 -1
  298. package/dist/types/registerable.d.ts +0 -10
  299. package/dist/types/registerable.js +0 -5
  300. package/dist/types/registerable.js.map +0 -1
  301. package/dist/types/resources.d.ts +0 -44
  302. package/dist/types/resources.js +0 -5
  303. package/dist/types/resources.js.map +0 -1
  304. package/dist/types/tasks.d.ts +0 -41
  305. package/dist/types/tasks.js +0 -5
  306. package/dist/types/tasks.js.map +0 -1
  307. package/src/__tests__/benchmark/benchmark.test.ts +0 -148
  308. package/src/__tests__/benchmark/task-benchmark.test.ts +0 -132
  309. package/src/__tests__/context.test.ts +0 -91
  310. package/src/__tests__/createTestResource.test.ts +0 -139
  311. package/src/__tests__/errors.test.ts +0 -341
  312. package/src/__tests__/globalEvents.test.ts +0 -542
  313. package/src/__tests__/globals/cache.middleware.test.ts +0 -772
  314. package/src/__tests__/globals/queue.resource.test.ts +0 -141
  315. package/src/__tests__/globals/requireContext.middleware.test.ts +0 -98
  316. package/src/__tests__/globals/retry.middleware.test.ts +0 -157
  317. package/src/__tests__/globals/timeout.middleware.test.ts +0 -88
  318. package/src/__tests__/index.helper.test.ts +0 -55
  319. package/src/__tests__/models/EventManager.test.ts +0 -585
  320. package/src/__tests__/models/Logger.test.ts +0 -519
  321. package/src/__tests__/models/Queue.test.ts +0 -189
  322. package/src/__tests__/models/ResourceInitializer.test.ts +0 -148
  323. package/src/__tests__/models/Semaphore.test.ts +0 -713
  324. package/src/__tests__/models/Store.test.ts +0 -227
  325. package/src/__tests__/models/TaskRunner.test.ts +0 -221
  326. package/src/__tests__/override.test.ts +0 -104
  327. package/src/__tests__/recursion/README.md +0 -3
  328. package/src/__tests__/recursion/a.resource.ts +0 -25
  329. package/src/__tests__/recursion/b.resource.ts +0 -33
  330. package/src/__tests__/recursion/c.resource.ts +0 -18
  331. package/src/__tests__/run.anonymous.test.ts +0 -706
  332. package/src/__tests__/run.dynamic-register-and-dependencies.test.ts +0 -1185
  333. package/src/__tests__/run.middleware.test.ts +0 -549
  334. package/src/__tests__/run.overrides.test.ts +0 -424
  335. package/src/__tests__/run.test.ts +0 -1040
  336. package/src/__tests__/setOutput.test.ts +0 -244
  337. package/src/__tests__/tags.test.ts +0 -396
  338. package/src/__tests__/tools/findCircularDependencies.test.ts +0 -217
  339. package/src/__tests__/tools/getCallerFile.test.ts +0 -179
  340. package/src/__tests__/typesafety.test.ts +0 -423
  341. package/src/__tests__/validation-edge-cases.test.ts +0 -111
  342. package/src/__tests__/validation-interface.test.ts +0 -428
  343. package/src/context.ts +0 -86
  344. package/src/define.ts +0 -480
  345. package/src/defs.returnTag.ts +0 -91
  346. package/src/defs.ts +0 -596
  347. package/src/errors.ts +0 -105
  348. package/src/globals/globalEvents.ts +0 -125
  349. package/src/globals/globalMiddleware.ts +0 -16
  350. package/src/globals/globalResources.ts +0 -53
  351. package/src/globals/middleware/cache.middleware.ts +0 -115
  352. package/src/globals/middleware/requireContext.middleware.ts +0 -36
  353. package/src/globals/middleware/retry.middleware.ts +0 -56
  354. package/src/globals/middleware/timeout.middleware.ts +0 -46
  355. package/src/globals/resources/queue.resource.ts +0 -34
  356. package/src/index.ts +0 -39
  357. package/src/models/DependencyProcessor.ts +0 -257
  358. package/src/models/EventManager.ts +0 -210
  359. package/src/models/Logger.ts +0 -282
  360. package/src/models/OverrideManager.ts +0 -79
  361. package/src/models/Queue.ts +0 -66
  362. package/src/models/ResourceInitializer.ts +0 -165
  363. package/src/models/Semaphore.ts +0 -208
  364. package/src/models/Store.ts +0 -193
  365. package/src/models/StoreConstants.ts +0 -18
  366. package/src/models/StoreRegistry.ts +0 -253
  367. package/src/models/StoreTypes.ts +0 -47
  368. package/src/models/StoreValidator.ts +0 -43
  369. package/src/models/TaskRunner.ts +0 -203
  370. package/src/models/index.ts +0 -8
  371. package/src/run.ts +0 -116
  372. package/src/testing.ts +0 -66
  373. package/src/tools/findCircularDependencies.ts +0 -69
  374. package/src/tools/getCallerFile.ts +0 -96
  375. /package/dist/{tools → models/utils}/findCircularDependencies.d.ts +0 -0
@@ -1,208 +0,0 @@
1
- interface WaitingOperation {
2
- resolve: () => void;
3
- reject: (error: Error) => void;
4
- timeout?: NodeJS.Timeout;
5
- abortController?: AbortController;
6
- }
7
-
8
- /**
9
- * A semaphore that limits the number of concurrent operations.
10
- * Used to prevent connection pool exhaustion by limiting concurrent
11
- * database operations to the pool size.
12
- */
13
- export class Semaphore {
14
- private permits: number;
15
- private readonly waitingQueue: Array<WaitingOperation> = [];
16
- private disposed = false;
17
- private readonly maxPermits: number;
18
-
19
- constructor(maxPermits: number) {
20
- if (maxPermits <= 0) {
21
- throw new Error("maxPermits must be greater than 0");
22
- }
23
- this.permits = maxPermits;
24
- this.maxPermits = maxPermits;
25
- }
26
-
27
- /**
28
- * Acquire a permit. If no permits are available, waits until one becomes available.
29
- */
30
- async acquire(options?: {
31
- timeout?: number;
32
- signal?: AbortSignal;
33
- }): Promise<void> {
34
- if (this.disposed) {
35
- throw new Error("Semaphore has been disposed");
36
- }
37
-
38
- if (options?.signal?.aborted) {
39
- throw new Error("Operation was aborted");
40
- }
41
-
42
- if (this.permits > 0) {
43
- this.permits--;
44
- return;
45
- }
46
-
47
- // No permits available, wait in queue
48
- return new Promise<void>((resolve, reject) => {
49
- const operation: WaitingOperation = { resolve, reject };
50
-
51
- // Set up timeout if provided
52
- if (options?.timeout && options.timeout > 0) {
53
- operation.timeout = setTimeout(() => {
54
- this.removeFromQueue(operation);
55
- reject(
56
- new Error(`Semaphore acquire timeout after ${options.timeout}ms`)
57
- );
58
- }, options.timeout);
59
- }
60
-
61
- // Set up abort signal if provided
62
- if (options?.signal) {
63
- const abortHandler = () => {
64
- this.removeFromQueue(operation);
65
- reject(new Error("Operation was aborted"));
66
- };
67
- options.signal.addEventListener("abort", abortHandler, { once: true });
68
-
69
- // Clean up the abort listener when operation completes
70
- const originalResolve = operation.resolve;
71
- const originalReject = operation.reject;
72
-
73
- operation.resolve = () => {
74
- options.signal!.removeEventListener("abort", abortHandler);
75
- originalResolve();
76
- };
77
-
78
- operation.reject = (error: Error) => {
79
- options.signal!.removeEventListener("abort", abortHandler);
80
- originalReject(error);
81
- };
82
- }
83
-
84
- this.waitingQueue.push(operation);
85
- });
86
- }
87
-
88
- /**
89
- * Release a permit, allowing waiting operations to proceed.
90
- */
91
- release(): void {
92
- if (this.disposed) {
93
- return;
94
- }
95
-
96
- if (this.waitingQueue.length > 0) {
97
- // Give permit directly to next waiting operation
98
- const nextOperation = this.waitingQueue.shift()!;
99
-
100
- // Clear timeout if it exists
101
- if (nextOperation.timeout) {
102
- clearTimeout(nextOperation.timeout);
103
- }
104
-
105
- nextOperation.resolve();
106
- } else {
107
- // No one waiting, increment available permits (but don't exceed max)
108
- this.permits = Math.min(this.permits + 1, this.maxPermits);
109
- }
110
- }
111
-
112
- private removeFromQueue(operation: WaitingOperation): void {
113
- const index = this.waitingQueue.indexOf(operation);
114
- if (index !== -1) {
115
- this.waitingQueue.splice(index, 1);
116
-
117
- // Clear timeout if it exists
118
- if (operation.timeout) {
119
- clearTimeout(operation.timeout);
120
- }
121
- }
122
- }
123
-
124
- /**
125
- * Execute a function with a permit, automatically releasing it afterwards.
126
- */
127
- async withPermit<T>(
128
- fn: () => Promise<T>,
129
- options?: { timeout?: number; signal?: AbortSignal }
130
- ): Promise<T> {
131
- await this.acquire(options);
132
- try {
133
- return await fn();
134
- } finally {
135
- this.release();
136
- }
137
- }
138
-
139
- /**
140
- * Dispose the semaphore, rejecting all waiting operations and preventing new ones.
141
- */
142
- dispose(): void {
143
- if (this.disposed) {
144
- return;
145
- }
146
-
147
- this.disposed = true;
148
-
149
- // Reject all waiting operations
150
- while (this.waitingQueue.length > 0) {
151
- const operation = this.waitingQueue.shift()!;
152
-
153
- // Clear timeout if it exists
154
- if (operation.timeout) {
155
- clearTimeout(operation.timeout);
156
- }
157
-
158
- operation.reject(new Error("Semaphore has been disposed"));
159
- }
160
- }
161
-
162
- /**
163
- * Get current number of available permits (for debugging)
164
- */
165
- getAvailablePermits(): number {
166
- return this.permits;
167
- }
168
-
169
- /**
170
- * Get current number of waiting operations (for debugging)
171
- */
172
- getWaitingCount(): number {
173
- return this.waitingQueue.length;
174
- }
175
-
176
- /**
177
- * Get maximum number of permits
178
- */
179
- getMaxPermits(): number {
180
- return this.maxPermits;
181
- }
182
-
183
- /**
184
- * Check if the semaphore has been disposed
185
- */
186
- isDisposed(): boolean {
187
- return this.disposed;
188
- }
189
-
190
- /**
191
- * Get metrics about the current state of the semaphore
192
- */
193
- getMetrics(): {
194
- availablePermits: number;
195
- waitingCount: number;
196
- maxPermits: number;
197
- utilization: number;
198
- disposed: boolean;
199
- } {
200
- return {
201
- availablePermits: this.permits,
202
- waitingCount: this.waitingQueue.length,
203
- maxPermits: this.maxPermits,
204
- utilization: (this.maxPermits - this.permits) / this.maxPermits,
205
- disposed: this.disposed,
206
- };
207
- }
208
- }
@@ -1,193 +0,0 @@
1
- import {
2
- DependencyMapType,
3
- IResource,
4
- RegisterableItems,
5
- IMiddleware,
6
- ITag,
7
- } from "../defs";
8
- import { IDependentNode } from "../tools/findCircularDependencies";
9
- import { globalEventsArray } from "../globals/globalEvents";
10
- import { StoreAlreadyInitializedError } from "../errors";
11
- import { EventManager } from "./EventManager";
12
- import { Logger } from "./Logger";
13
- import { StoreRegistry } from "./StoreRegistry";
14
- import { OverrideManager } from "./OverrideManager";
15
- import { StoreValidator } from "./StoreValidator";
16
- import {
17
- ResourceStoreElementType,
18
- TaskStoreElementType,
19
- MiddlewareStoreElementType,
20
- EventStoreElementType,
21
- } from "./StoreTypes";
22
- import { getBuiltInResources, getBuiltInMiddlewares } from "./StoreConstants";
23
-
24
- // Re-export types for backward compatibility
25
- export {
26
- ResourceStoreElementType,
27
- TaskStoreElementType,
28
- MiddlewareStoreElementType,
29
- EventStoreElementType,
30
- };
31
-
32
- /**
33
- * Store class which is used to store all the resources, tasks, middleware and events.
34
- */
35
- export class Store {
36
- root!: ResourceStoreElementType;
37
- private registry: StoreRegistry;
38
- private overrideManager: OverrideManager;
39
- private validator: StoreValidator;
40
-
41
- #isLocked = false;
42
- #isInitialized = false;
43
-
44
- constructor(
45
- protected readonly eventManager: EventManager,
46
- protected readonly logger: Logger
47
- ) {
48
- this.registry = new StoreRegistry();
49
- this.validator = this.registry.getValidator();
50
- this.overrideManager = new OverrideManager(this.registry);
51
- }
52
-
53
- // Delegate properties to registry
54
- get tasks() {
55
- return this.registry.tasks;
56
- }
57
- get resources() {
58
- return this.registry.resources;
59
- }
60
- get events() {
61
- return this.registry.events;
62
- }
63
- get middlewares() {
64
- return this.registry.middlewares;
65
- }
66
- get overrides() {
67
- return this.overrideManager.overrides;
68
- }
69
- get overrideRequests() {
70
- return this.overrideManager.overrideRequests;
71
- }
72
-
73
- get isLocked() {
74
- return this.#isLocked;
75
- }
76
-
77
- lock() {
78
- this.#isLocked = true;
79
- this.eventManager.lock();
80
- }
81
-
82
- checkLock() {
83
- if (this.#isLocked) {
84
- throw new Error("Cannot modify the Store when it is locked.");
85
- }
86
- }
87
-
88
- private registerGlobalComponents() {
89
- // Register built-in resources
90
- const builtInResources = getBuiltInResources(this.eventManager, this);
91
- builtInResources.forEach((resource) => {
92
- this.registry.storeGenericItem(resource);
93
- });
94
-
95
- // Register global events
96
- globalEventsArray.forEach((event) => {
97
- this.registry.storeEvent(event);
98
- });
99
-
100
- // Register built-in middlewares
101
- const builtInMiddlewares = getBuiltInMiddlewares();
102
- builtInMiddlewares.forEach((middleware) => {
103
- this.registry.middlewares.set(middleware.id, {
104
- middleware,
105
- computedDependencies: {},
106
- });
107
- });
108
- }
109
-
110
- private setupRootResource(root: IResource<any>, config: any) {
111
- root.dependencies =
112
- typeof root.dependencies === "function"
113
- ? root.dependencies(config)
114
- : root.dependencies;
115
-
116
- this.root = {
117
- resource: root,
118
- computedDependencies: {},
119
- config,
120
- value: undefined,
121
- isInitialized: false,
122
- context: {},
123
- };
124
-
125
- this.registry.computeRegistrationDeeply(root, config);
126
- this.registry.resources.set(root.id, this.root);
127
- }
128
-
129
- initializeStore(root: IResource<any, any, any, any, any>, config: any) {
130
- if (this.#isInitialized) {
131
- throw new StoreAlreadyInitializedError();
132
- }
133
-
134
- this.registerGlobalComponents();
135
- this.setupRootResource(root, config);
136
- this.validator.runSanityChecks();
137
-
138
- for (const resource of this.resources.values()) {
139
- this.overrideManager.storeOverridesDeeply(resource.resource);
140
- }
141
-
142
- this.#isInitialized = true;
143
- }
144
-
145
- public async dispose() {
146
- for (const resource of this.resources.values()) {
147
- if (resource.resource.dispose) {
148
- await resource.resource.dispose(
149
- resource.value,
150
- resource.config,
151
- resource.computedDependencies as DependencyMapType,
152
- resource.context
153
- );
154
- }
155
- }
156
- }
157
-
158
- public processOverrides() {
159
- this.overrideManager.processOverrides();
160
- }
161
-
162
- public getEverywhereMiddlewareForTasks(
163
- excludingIds: Array<string | symbol>
164
- ): IMiddleware[] {
165
- return this.registry.getEverywhereMiddlewareForTasks(excludingIds);
166
- }
167
-
168
- public getEverywhereMiddlewareForResources(
169
- excludingIds: Array<string | symbol>
170
- ): IMiddleware[] {
171
- return this.registry.getEverywhereMiddlewareForResources(excludingIds);
172
- }
173
-
174
- public storeGenericItem<C>(item: RegisterableItems) {
175
- return this.registry.storeGenericItem<C>(item);
176
- }
177
-
178
- public storeEventsForAllTasks() {
179
- this.registry.storeEventsForAllTasks();
180
- }
181
-
182
- public getTasksWithTag(tag: string | ITag) {
183
- return this.registry.getTasksWithTag(tag);
184
- }
185
-
186
- public getResourcesWithTag(tag: string | ITag) {
187
- return this.registry.getResourcesWithTag(tag);
188
- }
189
-
190
- getDependentNodes(): IDependentNode[] {
191
- return this.registry.getDependentNodes();
192
- }
193
- }
@@ -1,18 +0,0 @@
1
- import { globalResources } from "../globals/globalResources";
2
- import { requireContextMiddleware } from "../globals/middleware/requireContext.middleware";
3
- import { retryMiddleware } from "../globals/middleware/retry.middleware";
4
- import { timeoutMiddleware } from "../globals/middleware/timeout.middleware";
5
- import { EventManager } from "./EventManager";
6
- import { Store } from "./Store";
7
-
8
- export function getBuiltInResources(eventManager: EventManager, store: Store) {
9
- return [
10
- globalResources.eventManager.with(eventManager),
11
- globalResources.store.with(store),
12
- globalResources.queue,
13
- ];
14
- }
15
-
16
- export function getBuiltInMiddlewares() {
17
- return [requireContextMiddleware, retryMiddleware, timeoutMiddleware];
18
- }
@@ -1,253 +0,0 @@
1
- import {
2
- DependencyMapType,
3
- IMiddlewareDefinition,
4
- IEventDefinition,
5
- IResource,
6
- ITask,
7
- IResourceWithConfig,
8
- RegisterableItems,
9
- IMiddleware,
10
- symbolMiddlewareEverywhereResources,
11
- symbolMiddlewareEverywhereTasks,
12
- IEvent,
13
- ITag,
14
- } from "../defs";
15
- import * as utils from "../define";
16
- import { UnknownItemTypeError } from "../errors";
17
- import {
18
- TaskStoreElementType,
19
- MiddlewareStoreElementType,
20
- ResourceStoreElementType,
21
- EventStoreElementType,
22
- } from "./StoreTypes";
23
- import { StoreValidator } from "./StoreValidator";
24
-
25
- export class StoreRegistry {
26
- public tasks: Map<string | symbol, TaskStoreElementType> = new Map();
27
- public resources: Map<string | symbol, ResourceStoreElementType> = new Map();
28
- public events: Map<string | symbol, EventStoreElementType> = new Map();
29
- public middlewares: Map<string | symbol, MiddlewareStoreElementType> =
30
- new Map();
31
-
32
- private validator: StoreValidator;
33
-
34
- constructor() {
35
- this.validator = new StoreValidator(
36
- this.tasks,
37
- this.resources,
38
- this.events,
39
- this.middlewares
40
- );
41
- }
42
-
43
- getValidator(): StoreValidator {
44
- return this.validator;
45
- }
46
-
47
- storeGenericItem<C>(item: RegisterableItems) {
48
- if (utils.isTask(item)) {
49
- this.storeTask<C>(item);
50
- } else if (utils.isResource(item)) {
51
- this.storeResource<C>(item);
52
- } else if (utils.isEvent(item)) {
53
- this.storeEvent<C>(item);
54
- } else if (utils.isMiddleware(item)) {
55
- this.storeMiddleware<C>(item);
56
- } else if (utils.isResourceWithConfig(item)) {
57
- this.storeResourceWithConfig<C>(item);
58
- } else {
59
- throw new UnknownItemTypeError(item);
60
- }
61
- }
62
-
63
- storeMiddleware<C>(item: IMiddleware<any>, check = true) {
64
- check && this.validator.checkIfIDExists(item.id);
65
-
66
- item.dependencies =
67
- typeof item.dependencies === "function"
68
- ? item.dependencies(item.config)
69
- : item.dependencies;
70
-
71
- this.middlewares.set(item.id, {
72
- middleware: item,
73
- computedDependencies: {},
74
- });
75
- }
76
-
77
- storeEvent<C>(item: IEvent<void>) {
78
- this.validator.checkIfIDExists(item.id);
79
- this.events.set(item.id, { event: item });
80
- }
81
-
82
- storeResourceWithConfig<C>(
83
- item: IResourceWithConfig<any, any, any>,
84
- check = true
85
- ) {
86
- check && this.validator.checkIfIDExists(item.resource.id);
87
-
88
- this.prepareResource(item.resource, item.config);
89
-
90
- this.resources.set(item.resource.id, {
91
- resource: item.resource,
92
- config: item.config,
93
- value: undefined,
94
- isInitialized: false,
95
- context: {},
96
- });
97
-
98
- this.computeRegistrationDeeply(item.resource, item.config);
99
- return item.resource;
100
- }
101
-
102
- computeRegistrationDeeply<C>(element: IResource<C>, config?: C) {
103
- const items =
104
- typeof element.register === "function"
105
- ? element.register(config as C)
106
- : element.register;
107
-
108
- // if it was a computed function ensure the registered terms are stored, not the function.
109
- element.register = items;
110
-
111
- for (const item of items) {
112
- // will call registration if it detects another resource.
113
- this.storeGenericItem<C>(item);
114
- }
115
- }
116
-
117
- storeResource<C>(item: IResource<any, any, any>, check = true) {
118
- check && this.validator.checkIfIDExists(item.id);
119
-
120
- this.prepareResource(item, {});
121
-
122
- this.resources.set(item.id, {
123
- resource: item,
124
- config: {},
125
- value: undefined,
126
- isInitialized: false,
127
- context: item.context?.() || {},
128
- });
129
-
130
- this.computeRegistrationDeeply(item, {});
131
- return item;
132
- }
133
-
134
- storeTask<C>(item: ITask<any, any, {}>, check = true) {
135
- check && this.validator.checkIfIDExists(item.id);
136
-
137
- item.dependencies =
138
- typeof item.dependencies === "function"
139
- ? item.dependencies()
140
- : item.dependencies;
141
-
142
- this.tasks.set(item.id, {
143
- task: item,
144
- computedDependencies: {},
145
- isInitialized: false,
146
- });
147
- }
148
-
149
- storeEventsForAllTasks() {
150
- for (const task of this.tasks.values()) {
151
- this.storeEvent(task.task.events.beforeRun);
152
- this.storeEvent(task.task.events.afterRun);
153
- this.storeEvent(task.task.events.onError);
154
- }
155
-
156
- for (const resource of this.resources.values()) {
157
- this.storeEvent(resource.resource.events.beforeInit);
158
- this.storeEvent(resource.resource.events.afterInit);
159
- this.storeEvent(resource.resource.events.onError);
160
- }
161
- }
162
-
163
- getEverywhereMiddlewareForTasks(
164
- excludingIds: Array<string | symbol>
165
- ): IMiddleware[] {
166
- return Array.from(this.middlewares.values())
167
- .filter((x) => x.middleware[symbolMiddlewareEverywhereTasks])
168
- .filter((x) => !excludingIds.includes(x.middleware.id))
169
- .map((x) => x.middleware);
170
- }
171
-
172
- getEverywhereMiddlewareForResources(
173
- excludingIds: Array<string | symbol>
174
- ): IMiddleware[] {
175
- return Array.from(this.middlewares.values())
176
- .filter((x) => x.middleware[symbolMiddlewareEverywhereResources])
177
- .filter((x) => !excludingIds.includes(x.middleware.id))
178
- .map((x) => x.middleware);
179
- }
180
-
181
- private prepareResource<C>(
182
- item: IResource<any, any, any>,
183
- config: any
184
- ): IResource<any, any, any> {
185
- item.dependencies =
186
- typeof item.dependencies === "function"
187
- ? item.dependencies(config)
188
- : item.dependencies;
189
-
190
- return item;
191
- }
192
-
193
- private middlewareAsMap(middleware: IMiddleware[]) {
194
- return middleware.reduce((acc, item) => {
195
- acc[item.id] = item;
196
- return acc;
197
- }, {} as Record<string | symbol, IMiddleware>);
198
- }
199
-
200
- getDependentNodes() {
201
- const depenedants: any[] = [];
202
- for (const task of this.tasks.values()) {
203
- depenedants.push({
204
- id: task.task.id,
205
- dependencies: {
206
- ...task.task.dependencies,
207
- ...this.middlewareAsMap(task.task.middleware),
208
- },
209
- });
210
- }
211
- for (const middleware of this.middlewares.values()) {
212
- depenedants.push({
213
- id: middleware.middleware.id,
214
- dependencies: middleware.middleware.dependencies,
215
- });
216
- }
217
- for (const resource of this.resources.values()) {
218
- depenedants.push({
219
- id: resource.resource.id,
220
- dependencies: {
221
- ...resource.resource.dependencies,
222
- ...this.middlewareAsMap(resource.resource.middleware),
223
- },
224
- });
225
- }
226
-
227
- return depenedants;
228
- }
229
-
230
- getTasksWithTag(tag: string | ITag) {
231
- if (typeof tag === "string") {
232
- return Array.from(this.tasks.values()).filter((x) =>
233
- x.task.meta?.tags?.includes(tag)
234
- );
235
- }
236
-
237
- return Array.from(this.tasks.values())
238
- .filter((x) => tag.extract(x.task.meta?.tags))
239
- .map((x) => x.task);
240
- }
241
-
242
- getResourcesWithTag(tag: string | ITag) {
243
- if (typeof tag === "string") {
244
- return Array.from(this.resources.values()).filter((x) =>
245
- x.resource.meta?.tags?.includes(tag)
246
- );
247
- }
248
-
249
- return Array.from(this.resources.values())
250
- .filter((x) => tag.extract(x.resource.meta?.tags))
251
- .map((x) => x.resource);
252
- }
253
- }
@@ -1,47 +0,0 @@
1
- import {
2
- DependencyMapType,
3
- DependencyValuesType,
4
- IMiddlewareDefinition,
5
- IEventDefinition,
6
- IResource,
7
- ITask,
8
- IResourceWithConfig,
9
- RegisterableItems,
10
- IMiddleware,
11
- IEvent,
12
- } from "../defs";
13
-
14
- export type ResourceStoreElementType<
15
- C = any,
16
- V extends Promise<any> = any,
17
- D extends DependencyMapType = {},
18
- TContext = any
19
- > = {
20
- resource: IResource<C, V, D>;
21
- computedDependencies?: DependencyValuesType<D>;
22
- config: C;
23
- value: V;
24
- context: TContext;
25
- isInitialized?: boolean;
26
- };
27
-
28
- export type TaskStoreElementType<
29
- Input = any,
30
- Output extends Promise<any> = any,
31
- D extends DependencyMapType = any,
32
- TOn extends "*" | IEventDefinition | undefined = any
33
- > = {
34
- task: ITask<Input, Output, D, TOn>;
35
- computedDependencies: DependencyValuesType<D>;
36
- isInitialized: boolean;
37
- };
38
-
39
- export type MiddlewareStoreElementType<TDeps extends DependencyMapType = any> =
40
- {
41
- middleware: IMiddleware<TDeps>;
42
- computedDependencies: DependencyValuesType<TDeps>;
43
- };
44
-
45
- export type EventStoreElementType = {
46
- event: IEvent<any>;
47
- };