@researchdatabox/redbox-core 5.1.0-beta.12568 → 5.1.0-beta.13939

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 (385) hide show
  1. package/browser/redoc-library-loader.cjs +20 -0
  2. package/browser/redoc-standalone.js +143 -0
  3. package/dist/CoreBase.d.ts +43 -0
  4. package/dist/CoreBase.d.ts.map +1 -0
  5. package/dist/CoreBase.js +101 -0
  6. package/dist/CoreController.d.ts +23 -31
  7. package/dist/CoreController.d.ts.map +1 -1
  8. package/dist/CoreController.js +142 -131
  9. package/dist/CoreService.d.ts +13 -33
  10. package/dist/CoreService.d.ts.map +1 -1
  11. package/dist/CoreService.js +69 -95
  12. package/dist/HarvestRunService.d.ts +9 -1
  13. package/dist/HarvestRunService.d.ts.map +1 -1
  14. package/dist/HarvestRunService.js +1 -1
  15. package/dist/RecordRouteForm.d.ts +49 -0
  16. package/dist/RecordRouteForm.d.ts.map +1 -0
  17. package/dist/RecordRouteForm.js +188 -0
  18. package/dist/RecordSaveResponse.d.ts +4 -0
  19. package/dist/RecordSaveResponse.d.ts.map +1 -1
  20. package/dist/RecordSaveResponse.js +3 -2
  21. package/dist/action-execution/executor.d.ts +1 -1
  22. package/dist/action-execution/executor.d.ts.map +1 -1
  23. package/dist/action-execution/executor.js +19 -20
  24. package/dist/action-execution/legacy-result.d.ts +1 -1
  25. package/dist/action-execution/legacy-result.d.ts.map +1 -1
  26. package/dist/action-execution/legacy-result.js +43 -10
  27. package/dist/action-execution/types.d.ts +3 -3
  28. package/dist/action-execution/types.d.ts.map +1 -1
  29. package/dist/api-routes/groups/harvest-runs.d.ts +1 -0
  30. package/dist/api-routes/groups/harvest-runs.d.ts.map +1 -1
  31. package/dist/api-routes/groups/harvest-runs.js +24 -3
  32. package/dist/api-routes/groups/records.d.ts.map +1 -1
  33. package/dist/api-routes/groups/records.js +30 -21
  34. package/dist/api-routes/groups/reports.d.ts.map +1 -1
  35. package/dist/api-routes/groups/reports.js +3 -2
  36. package/dist/api-routes/helpers.d.ts +1 -1
  37. package/dist/api-routes/helpers.d.ts.map +1 -1
  38. package/dist/api-routes/helpers.js +10 -6
  39. package/dist/api-routes/openapi.d.ts.map +1 -1
  40. package/dist/api-routes/openapi.js +15 -1
  41. package/dist/api-routes/request-extraction.js +2 -2
  42. package/dist/api-routes/schemas/common.d.ts.map +1 -1
  43. package/dist/api-routes/schemas/common.js +7 -2
  44. package/dist/api-routes/schemas/responses.d.ts +38 -12
  45. package/dist/api-routes/schemas/responses.d.ts.map +1 -1
  46. package/dist/api-routes/schemas/responses.js +11 -1
  47. package/dist/bootstrap.d.ts.map +1 -1
  48. package/dist/bootstrap.js +13 -3
  49. package/dist/config/agendaQueue.config.d.ts +5 -0
  50. package/dist/config/agendaQueue.config.d.ts.map +1 -1
  51. package/dist/config/agendaQueue.config.js +29 -2
  52. package/dist/config/appConfigSecrets.config.d.ts +14 -0
  53. package/dist/config/appConfigSecrets.config.d.ts.map +1 -0
  54. package/dist/config/appConfigSecrets.config.js +8 -0
  55. package/dist/config/brandingConfigurationDefaults.config.d.ts +16 -3
  56. package/dist/config/brandingConfigurationDefaults.config.d.ts.map +1 -1
  57. package/dist/config/brandingConfigurationDefaults.config.js +1 -1
  58. package/dist/config/dompurify.config.d.ts.map +1 -1
  59. package/dist/config/dompurify.config.js +3 -2
  60. package/dist/config/harvestRuns.config.d.ts +7 -0
  61. package/dist/config/harvestRuns.config.d.ts.map +1 -1
  62. package/dist/config/harvestRuns.config.js +2 -1
  63. package/dist/config/http.config.d.ts +3 -2
  64. package/dist/config/http.config.d.ts.map +1 -1
  65. package/dist/config/http.config.js +108 -12
  66. package/dist/config/i18n.config.d.ts +3 -0
  67. package/dist/config/i18n.config.d.ts.map +1 -1
  68. package/dist/config/i18n.config.js +1 -1
  69. package/dist/config/index.d.ts +4 -0
  70. package/dist/config/index.d.ts.map +1 -1
  71. package/dist/config/index.js +4 -1
  72. package/dist/config/log.config.d.ts +33 -5
  73. package/dist/config/log.config.d.ts.map +1 -1
  74. package/dist/config/log.config.js +58 -54
  75. package/dist/config/record.config.d.ts +17 -0
  76. package/dist/config/record.config.d.ts.map +1 -1
  77. package/dist/config/record.config.js +7 -1
  78. package/dist/config/routes.config.d.ts.map +1 -1
  79. package/dist/config/routes.config.js +11 -2
  80. package/dist/config/session.config.d.ts +2 -2
  81. package/dist/config/session.config.d.ts.map +1 -1
  82. package/dist/config/solr.config.d.ts +8 -0
  83. package/dist/config/solr.config.d.ts.map +1 -1
  84. package/dist/config/solr.config.js +15 -2
  85. package/dist/config/storage.config.d.ts.map +1 -1
  86. package/dist/config/storage.config.js +9 -1
  87. package/dist/config/vocab.config.d.ts +1 -0
  88. package/dist/config/vocab.config.d.ts.map +1 -1
  89. package/dist/config/vocab.config.js +3 -3
  90. package/dist/config/webpack.config.d.ts.map +1 -1
  91. package/dist/config/webpack.config.js +23 -5
  92. package/dist/configmodels/ConfigModels.d.ts.map +1 -1
  93. package/dist/configmodels/ConfigModels.js +3 -2
  94. package/dist/configmodels/FigsharePublishing.d.ts +1 -1
  95. package/dist/controllers/ActionController.d.ts.map +1 -1
  96. package/dist/controllers/ActionController.js +8 -2
  97. package/dist/controllers/BrandingAppController.d.ts.map +1 -1
  98. package/dist/controllers/BrandingAppController.js +21 -2
  99. package/dist/controllers/DynamicAssetController.d.ts +9 -10
  100. package/dist/controllers/DynamicAssetController.d.ts.map +1 -1
  101. package/dist/controllers/DynamicAssetController.js +67 -53
  102. package/dist/controllers/EmailController.d.ts.map +1 -1
  103. package/dist/controllers/EmailController.js +32 -14
  104. package/dist/controllers/ExportController.d.ts +9 -0
  105. package/dist/controllers/ExportController.d.ts.map +1 -1
  106. package/dist/controllers/ExportController.js +154 -3
  107. package/dist/controllers/FormVocabularyController.d.ts.map +1 -1
  108. package/dist/controllers/FormVocabularyController.js +62 -33
  109. package/dist/controllers/RecordAuditController.d.ts.map +1 -1
  110. package/dist/controllers/RecordAuditController.js +4 -2
  111. package/dist/controllers/RecordController.d.ts +4 -1
  112. package/dist/controllers/RecordController.d.ts.map +1 -1
  113. package/dist/controllers/RecordController.js +248 -114
  114. package/dist/controllers/ReportController.d.ts +1 -0
  115. package/dist/controllers/ReportController.d.ts.map +1 -1
  116. package/dist/controllers/ReportController.js +40 -12
  117. package/dist/controllers/TranslationController.d.ts.map +1 -1
  118. package/dist/controllers/TranslationController.js +56 -16
  119. package/dist/controllers/UserController.d.ts +3 -1
  120. package/dist/controllers/UserController.d.ts.map +1 -1
  121. package/dist/controllers/UserController.js +178 -76
  122. package/dist/controllers/VocabularyController.d.ts +0 -1
  123. package/dist/controllers/VocabularyController.d.ts.map +1 -1
  124. package/dist/controllers/VocabularyController.js +18 -16
  125. package/dist/controllers/webservice/AdminController.d.ts.map +1 -1
  126. package/dist/controllers/webservice/AdminController.js +2 -5
  127. package/dist/controllers/webservice/HarvestRunController.d.ts +1 -0
  128. package/dist/controllers/webservice/HarvestRunController.d.ts.map +1 -1
  129. package/dist/controllers/webservice/HarvestRunController.js +46 -2
  130. package/dist/controllers/webservice/IntegrationAuditController.d.ts +0 -1
  131. package/dist/controllers/webservice/IntegrationAuditController.d.ts.map +1 -1
  132. package/dist/controllers/webservice/IntegrationAuditController.js +13 -6
  133. package/dist/controllers/webservice/RecordController.d.ts +1 -1
  134. package/dist/controllers/webservice/RecordController.d.ts.map +1 -1
  135. package/dist/controllers/webservice/RecordController.js +13 -4
  136. package/dist/controllers/webservice/ReportController.d.ts.map +1 -1
  137. package/dist/controllers/webservice/ReportController.js +15 -10
  138. package/dist/controllers/webservice/UserManagementController.d.ts.map +1 -1
  139. package/dist/controllers/webservice/UserManagementController.js +17 -8
  140. package/dist/controllers/webservice/VocabularyController.d.ts.map +1 -1
  141. package/dist/controllers/webservice/VocabularyController.js +19 -13
  142. package/dist/form-config/generated-view-only.d.ts.map +1 -1
  143. package/dist/form-config/generated-view-only.js +12 -1
  144. package/dist/index.d.ts +2 -1
  145. package/dist/index.d.ts.map +1 -1
  146. package/dist/index.js +1 -1
  147. package/dist/loader/index.d.ts +1 -0
  148. package/dist/loader/index.d.ts.map +1 -1
  149. package/dist/loader/index.js +56 -11
  150. package/dist/middleware/redboxSession.d.ts.map +1 -1
  151. package/dist/middleware/redboxSession.js +15 -3
  152. package/dist/middleware/requestChronicle.d.ts +14 -0
  153. package/dist/middleware/requestChronicle.d.ts.map +1 -0
  154. package/dist/middleware/requestChronicle.js +73 -0
  155. package/dist/model/BuildResponse.d.ts +7 -5
  156. package/dist/model/BuildResponse.d.ts.map +1 -1
  157. package/dist/model/RBValidationError.d.ts +18 -5
  158. package/dist/model/RBValidationError.d.ts.map +1 -1
  159. package/dist/model/RBValidationError.js +56 -17
  160. package/dist/model/storage/ExportJobModel.d.ts +33 -0
  161. package/dist/model/storage/ExportJobModel.d.ts.map +1 -0
  162. package/dist/model/storage/ExportJobModel.js +3 -0
  163. package/dist/model/storage/HarvestRunModel.d.ts +20 -0
  164. package/dist/model/storage/HarvestRunModel.d.ts.map +1 -1
  165. package/dist/model/storage/HarvestRunModel.js +2 -1
  166. package/dist/model/storage/index.d.ts +2 -1
  167. package/dist/model/storage/index.d.ts.map +1 -1
  168. package/dist/model/storage/index.js +1 -1
  169. package/dist/policies/checkAuth.d.ts.map +1 -1
  170. package/dist/policies/checkAuth.js +3 -2
  171. package/dist/policies/contentSecurityPolicy.d.ts.map +1 -1
  172. package/dist/policies/contentSecurityPolicy.js +7 -2
  173. package/dist/policies/noCache.d.ts.map +1 -1
  174. package/dist/policies/noCache.js +4 -3
  175. package/dist/record-contract/record-contract-compiler.d.ts.map +1 -1
  176. package/dist/record-contract/record-contract-compiler.js +3 -19
  177. package/dist/record-contract/record-contract-context.d.ts +2 -0
  178. package/dist/record-contract/record-contract-context.d.ts.map +1 -1
  179. package/dist/record-contract/record-contract-context.js +1 -1
  180. package/dist/responses/notFound.d.ts.map +1 -1
  181. package/dist/responses/notFound.js +6 -1
  182. package/dist/responses/serverError.d.ts.map +1 -1
  183. package/dist/responses/serverError.js +13 -3
  184. package/dist/sails.d.ts +27 -17
  185. package/dist/sails.d.ts.map +1 -1
  186. package/dist/services/AgendaQueueService.d.ts +11 -2
  187. package/dist/services/AgendaQueueService.d.ts.map +1 -1
  188. package/dist/services/AgendaQueueService.js +163 -51
  189. package/dist/services/AppConfigSecrets.d.ts +66 -0
  190. package/dist/services/AppConfigSecrets.d.ts.map +1 -0
  191. package/dist/services/AppConfigSecrets.js +396 -0
  192. package/dist/services/AppConfigService.d.ts +16 -1
  193. package/dist/services/AppConfigService.d.ts.map +1 -1
  194. package/dist/services/AppConfigService.js +283 -33
  195. package/dist/services/BrandingThemeCssService.d.ts.map +1 -1
  196. package/dist/services/BrandingThemeCssService.js +32 -3
  197. package/dist/services/BrandingThemeTokens.d.ts.map +1 -1
  198. package/dist/services/BrandingThemeTokens.js +10 -1
  199. package/dist/services/ConfigService.d.ts +1 -0
  200. package/dist/services/ConfigService.d.ts.map +1 -1
  201. package/dist/services/ConfigService.js +24 -9
  202. package/dist/services/DomSanitizerService.d.ts.map +1 -1
  203. package/dist/services/DomSanitizerService.js +19 -6
  204. package/dist/services/EmailService.d.ts +10 -2
  205. package/dist/services/EmailService.d.ts.map +1 -1
  206. package/dist/services/EmailService.js +53 -53
  207. package/dist/services/ExportService.d.ts +62 -0
  208. package/dist/services/ExportService.d.ts.map +1 -0
  209. package/dist/services/ExportService.js +609 -0
  210. package/dist/services/FormVocabularyService.d.ts.map +1 -1
  211. package/dist/services/FormVocabularyService.js +14 -4
  212. package/dist/services/FormsService.d.ts +3 -0
  213. package/dist/services/FormsService.d.ts.map +1 -1
  214. package/dist/services/FormsService.js +10 -3
  215. package/dist/services/HarvestRunService.d.ts +23 -1
  216. package/dist/services/HarvestRunService.d.ts.map +1 -1
  217. package/dist/services/HarvestRunService.js +155 -22
  218. package/dist/services/I18nEntriesService.d.ts +5 -0
  219. package/dist/services/I18nEntriesService.d.ts.map +1 -1
  220. package/dist/services/I18nEntriesService.js +55 -3
  221. package/dist/services/NamedQueryService.d.ts +1 -0
  222. package/dist/services/NamedQueryService.d.ts.map +1 -1
  223. package/dist/services/NamedQueryService.js +67 -31
  224. package/dist/services/RDMPService.d.ts.map +1 -1
  225. package/dist/services/RDMPService.js +69 -83
  226. package/dist/services/RaidService.d.ts.map +1 -1
  227. package/dist/services/RaidService.js +45 -11
  228. package/dist/services/RecordSchemaService.d.ts +3 -1
  229. package/dist/services/RecordSchemaService.d.ts.map +1 -1
  230. package/dist/services/RecordSchemaService.js +2 -1
  231. package/dist/services/RecordValidationService.d.ts +3 -0
  232. package/dist/services/RecordValidationService.d.ts.map +1 -1
  233. package/dist/services/RecordValidationService.js +25 -5
  234. package/dist/services/RecordsService.d.ts +10 -1
  235. package/dist/services/RecordsService.d.ts.map +1 -1
  236. package/dist/services/RecordsService.js +194 -93
  237. package/dist/services/ReportsService.d.ts +1 -0
  238. package/dist/services/ReportsService.d.ts.map +1 -1
  239. package/dist/services/ReportsService.js +10 -9
  240. package/dist/services/RvaImportService.d.ts.map +1 -1
  241. package/dist/services/RvaImportService.js +6 -5
  242. package/dist/services/SolrSearchService.d.ts +7 -2
  243. package/dist/services/SolrSearchService.d.ts.map +1 -1
  244. package/dist/services/SolrSearchService.js +205 -81
  245. package/dist/services/StorageManagerService.d.ts +5 -0
  246. package/dist/services/StorageManagerService.d.ts.map +1 -1
  247. package/dist/services/StorageManagerService.js +4 -1
  248. package/dist/services/TriggerService.d.ts.map +1 -1
  249. package/dist/services/TriggerService.js +64 -56
  250. package/dist/services/UsersService.d.ts +13 -1
  251. package/dist/services/UsersService.d.ts.map +1 -1
  252. package/dist/services/UsersService.js +191 -257
  253. package/dist/services/VocabularyService.d.ts +11 -1
  254. package/dist/services/VocabularyService.d.ts.map +1 -1
  255. package/dist/services/VocabularyService.js +120 -24
  256. package/dist/services/doi-v2/http.d.ts +3 -2
  257. package/dist/services/doi-v2/http.d.ts.map +1 -1
  258. package/dist/services/doi-v2/http.js +38 -4
  259. package/dist/services/doi-v2/runtime.d.ts +4 -3
  260. package/dist/services/doi-v2/runtime.d.ts.map +1 -1
  261. package/dist/services/doi-v2/runtime.js +52 -17
  262. package/dist/services/figshare-v2/assets.d.ts +1 -1
  263. package/dist/services/figshare-v2/assets.d.ts.map +1 -1
  264. package/dist/services/figshare-v2/assets.js +1 -1
  265. package/dist/services/figshare-v2/http.d.ts +3 -2
  266. package/dist/services/figshare-v2/http.d.ts.map +1 -1
  267. package/dist/services/figshare-v2/http.js +38 -4
  268. package/dist/services/figshare-v2/observability.d.ts.map +1 -1
  269. package/dist/services/figshare-v2/observability.js +3 -3
  270. package/dist/services/figshare-v2/runtime.d.ts +4 -3
  271. package/dist/services/figshare-v2/runtime.d.ts.map +1 -1
  272. package/dist/services/figshare-v2/runtime.js +48 -13
  273. package/dist/services/index.d.ts +3 -0
  274. package/dist/services/index.d.ts.map +1 -1
  275. package/dist/services/index.js +8 -3
  276. package/dist/services/integration-v2/runtime.d.ts +1 -1
  277. package/dist/services/integration-v2/runtime.d.ts.map +1 -1
  278. package/dist/services/integration-v2/runtime.js +7 -7
  279. package/dist/services/oni-v2/audit.d.ts +3 -2
  280. package/dist/services/oni-v2/audit.d.ts.map +1 -1
  281. package/dist/services/oni-v2/audit.js +38 -4
  282. package/dist/services/oni-v2/bindings.d.ts +1 -1
  283. package/dist/services/oni-v2/bindings.d.ts.map +1 -1
  284. package/dist/services/oni-v2/bindings.js +37 -4
  285. package/dist/services/oni-v2/repository.d.ts +3 -2
  286. package/dist/services/oni-v2/repository.d.ts.map +1 -1
  287. package/dist/services/oni-v2/repository.js +42 -7
  288. package/dist/services/oni-v2/runtime.d.ts +5 -4
  289. package/dist/services/oni-v2/runtime.d.ts.map +1 -1
  290. package/dist/services/oni-v2/runtime.js +57 -19
  291. package/dist/services/oni-v2/templating.d.ts +4 -2
  292. package/dist/services/oni-v2/templating.d.ts.map +1 -1
  293. package/dist/services/oni-v2/templating.js +42 -7
  294. package/dist/services/raid-v2/audit.d.ts +1 -1
  295. package/dist/services/raid-v2/audit.d.ts.map +1 -1
  296. package/dist/services/raid-v2/audit.js +39 -5
  297. package/dist/services/raid-v2/errors.d.ts +9 -9
  298. package/dist/services/raid-v2/errors.js +44 -11
  299. package/dist/services/raid-v2/http.d.ts +1 -1
  300. package/dist/services/raid-v2/http.d.ts.map +1 -1
  301. package/dist/services/raid-v2/http.js +42 -8
  302. package/dist/services/raid-v2/logger.d.ts +1 -1
  303. package/dist/services/raid-v2/logger.d.ts.map +1 -1
  304. package/dist/services/raid-v2/logger.js +42 -8
  305. package/dist/services/raid-v2/mapping.d.ts +1 -1
  306. package/dist/services/raid-v2/mapping.d.ts.map +1 -1
  307. package/dist/services/raid-v2/mapping.js +41 -7
  308. package/dist/services/raid-v2/runtime.d.ts +1 -1
  309. package/dist/services/raid-v2/runtime.d.ts.map +1 -1
  310. package/dist/services/raid-v2/runtime.js +76 -34
  311. package/dist/services/raid-v2/tags.d.ts +8 -8
  312. package/dist/services/raid-v2/tags.d.ts.map +1 -1
  313. package/dist/services/raid-v2/tags.js +42 -9
  314. package/dist/services/record-hooks/coordinator.d.ts +11 -0
  315. package/dist/services/record-hooks/coordinator.d.ts.map +1 -1
  316. package/dist/services/record-hooks/coordinator.js +70 -6
  317. package/dist/storage/GridFSDriver.d.ts +16 -9
  318. package/dist/storage/GridFSDriver.d.ts.map +1 -1
  319. package/dist/storage/GridFSDriver.js +87 -33
  320. package/dist/storage/TusStorageManagerDataStore.d.ts +11 -1
  321. package/dist/storage/TusStorageManagerDataStore.d.ts.map +1 -1
  322. package/dist/storage/TusStorageManagerDataStore.js +190 -56
  323. package/dist/utilities/HarvestHistoryRetention.d.ts +17 -0
  324. package/dist/utilities/HarvestHistoryRetention.d.ts.map +1 -0
  325. package/dist/utilities/HarvestHistoryRetention.js +141 -0
  326. package/dist/utilities/HarvestRunIndexes.d.ts +12 -0
  327. package/dist/utilities/HarvestRunIndexes.d.ts.map +1 -0
  328. package/dist/utilities/HarvestRunIndexes.js +84 -0
  329. package/dist/utilities/PinoLoggerUtils.d.ts +9 -0
  330. package/dist/utilities/PinoLoggerUtils.d.ts.map +1 -0
  331. package/dist/utilities/PinoLoggerUtils.js +17 -0
  332. package/dist/utilities/RequestChronicle.d.ts +221 -0
  333. package/dist/utilities/RequestChronicle.d.ts.map +1 -0
  334. package/dist/utilities/RequestChronicle.js +770 -0
  335. package/dist/utilities/RequestChronicleContext.d.ts +6 -0
  336. package/dist/utilities/RequestChronicleContext.d.ts.map +1 -0
  337. package/dist/utilities/RequestChronicleContext.js +19 -0
  338. package/dist/utilities/RequestChronicleSettings.d.ts +29 -0
  339. package/dist/utilities/RequestChronicleSettings.d.ts.map +1 -0
  340. package/dist/utilities/RequestChronicleSettings.js +31 -0
  341. package/dist/utilities/TransactionUtils.d.ts +2 -1
  342. package/dist/utilities/TransactionUtils.d.ts.map +1 -1
  343. package/dist/utilities/TransactionUtils.js +1 -1
  344. package/dist/utilities/TranslationHtml.d.ts.map +1 -1
  345. package/dist/utilities/TranslationHtml.js +13 -5
  346. package/dist/utilities/VocabularyAdminAccess.d.ts +10 -0
  347. package/dist/utilities/VocabularyAdminAccess.d.ts.map +1 -0
  348. package/dist/utilities/VocabularyAdminAccess.js +42 -0
  349. package/dist/visitor/construct.visitor.d.ts.map +1 -1
  350. package/dist/visitor/construct.visitor.js +7 -2
  351. package/dist/visitor/context-variables.visitor.d.ts +1 -2
  352. package/dist/visitor/context-variables.visitor.d.ts.map +1 -1
  353. package/dist/visitor/context-variables.visitor.js +1 -1
  354. package/dist/visitor/migrate-config-v4-v5.visitor.d.ts.map +1 -1
  355. package/dist/visitor/migrate-config-v4-v5.visitor.js +5 -1
  356. package/dist/visitor/related-object-data-inline.visitor.d.ts +1 -1
  357. package/dist/visitor/related-object-data-inline.visitor.d.ts.map +1 -1
  358. package/dist/visitor/related-object-data-inline.visitor.js +57 -23
  359. package/dist/visitor/validator.visitor.d.ts.map +1 -1
  360. package/dist/visitor/validator.visitor.js +4 -2
  361. package/dist/visitor/visitor-helpers.js +3 -3
  362. package/dist/visitor/vocab-inline.visitor.d.ts +1 -2
  363. package/dist/visitor/vocab-inline.visitor.d.ts.map +1 -1
  364. package/dist/visitor/vocab-inline.visitor.js +1 -1
  365. package/dist/waterline-models/ExportJob.d.ts +38 -0
  366. package/dist/waterline-models/ExportJob.d.ts.map +1 -0
  367. package/dist/waterline-models/ExportJob.js +148 -0
  368. package/dist/waterline-models/HarvestRecordEvent.d.ts.map +1 -1
  369. package/dist/waterline-models/HarvestRecordEvent.js +3 -9
  370. package/dist/waterline-models/HarvestRun.d.ts +5 -1
  371. package/dist/waterline-models/HarvestRun.d.ts.map +1 -1
  372. package/dist/waterline-models/HarvestRun.js +13 -7
  373. package/dist/waterline-models/HarvestRunChunk.d.ts.map +1 -1
  374. package/dist/waterline-models/HarvestRunChunk.js +3 -7
  375. package/dist/waterline-models/User.d.ts +2 -2
  376. package/dist/waterline-models/User.d.ts.map +1 -1
  377. package/dist/waterline-models/User.js +3 -3
  378. package/dist/waterline-models/index.d.ts +2 -0
  379. package/dist/waterline-models/index.d.ts.map +1 -1
  380. package/dist/waterline-models/index.js +4 -1
  381. package/logfmt-transport.cjs +59 -0
  382. package/package.json +76 -45
  383. package/dist/Logger.d.ts +0 -16
  384. package/dist/Logger.d.ts.map +0 -1
  385. package/dist/Logger.js +0 -3
@@ -3,7 +3,12 @@ Object.defineProperty(exports, "__esModule", { value: true });
3
3
  exports.TusStorageManagerDataStore = void 0;
4
4
  const node_stream_1 = require("node:stream");
5
5
  const server_1 = require("@tus/server");
6
+ const record_config_1 = require("../config/record.config");
7
+ const MAX_BUFFERED_PART_SIZE = 8 * 1024 * 1024;
8
+ const PART_DELETE_CONCURRENCY = 8;
6
9
  class TusStorageManagerDataStore extends server_1.DataStore {
10
+ maxSize;
11
+ maxChunkSize;
7
12
  disk;
8
13
  prefix;
9
14
  logger;
@@ -11,6 +16,13 @@ class TusStorageManagerDataStore extends server_1.DataStore {
11
16
  writeLocks = new Map();
12
17
  constructor(options) {
13
18
  super();
19
+ this.maxSize = options.maxSize ?? record_config_1.record.maxUploadSize;
20
+ this.maxChunkSize = options.maxChunkSize ?? this.maxSize;
21
+ for (const limit of [this.maxSize, this.maxChunkSize]) {
22
+ if (!Number.isSafeInteger(limit) || limit <= 0) {
23
+ throw new Error('TUS upload and chunk limits must be positive safe integers');
24
+ }
25
+ }
14
26
  this.disk = options.disk;
15
27
  this.prefix = this.normalizePrefix(options.prefix);
16
28
  this.logger = options.logger;
@@ -24,7 +36,14 @@ class TusStorageManagerDataStore extends server_1.DataStore {
24
36
  ];
25
37
  }
26
38
  async create(file) {
39
+ if (file.size !== undefined) {
40
+ this.validateUploadLength(file.size);
41
+ }
27
42
  const storedUpload = this.toStoredUpload(file);
43
+ // Even a zero-length upload must have a final object before HEAD can report completion.
44
+ if (storedUpload.size === 0) {
45
+ await this.materializeUpload(file.id, storedUpload, []);
46
+ }
28
47
  await this.writeUploadInfo(file.id, storedUpload);
29
48
  file.storage = { type: 'storage-manager', path: this.finalKey(file.id) };
30
49
  this.logger?.verbose(`TusStorageManagerDataStore: create id='${file.id}' size=${file.size ?? 'deferred'} offset=${file.offset} infoKey='${this.infoKey(file.id)}' finalKey='${this.finalKey(file.id)}'`);
@@ -38,49 +57,87 @@ class TusStorageManagerDataStore extends server_1.DataStore {
38
57
  await this.deleteUploadKeys(id);
39
58
  }
40
59
  async write(readable, id, offset) {
41
- const collected = await this.readStream(readable);
42
- this.validateWriteInputs(offset, collected.length);
43
- this.logger?.verbose(`TusStorageManagerDataStore: write received id='${id}' requestOffset=${offset} bytes=${collected.length}`);
60
+ this.validateWriteInputs(offset);
44
61
  return this.withUploadLock(id, async () => {
45
62
  const upload = await this.readStoredUpload(id);
46
63
  this.logger?.verbose(`TusStorageManagerDataStore: write state id='${id}' storedOffset=${upload.offset} size=${upload.size ?? 'deferred'}`);
47
64
  if (upload.offset !== offset) {
48
65
  throw server_1.ERRORS.INVALID_OFFSET;
49
66
  }
50
- const newOffset = offset + collected.length;
51
- if (!Number.isSafeInteger(newOffset) || newOffset < 0) {
52
- throw server_1.ERRORS.FILE_WRITE_ERROR;
67
+ if (upload.size !== undefined) {
68
+ this.validateUploadLength(upload.size);
53
69
  }
54
- if (upload.size !== undefined && newOffset > upload.size) {
70
+ if (upload.size !== undefined && offset > upload.size) {
55
71
  throw server_1.ERRORS.INVALID_OFFSET;
56
72
  }
57
- const partKey = this.partKey(id, offset);
58
- try {
59
- this.logger?.verbose(`TusStorageManagerDataStore: writing part id='${id}' partKey='${partKey}' bytes=${collected.length}`);
60
- await this.disk.put(partKey, collected, { contentLength: collected.length });
61
- upload.offset = newOffset;
62
- await this.writeUploadInfo(id, upload);
63
- this.logger?.verbose(`TusStorageManagerDataStore: wrote part id='${id}' newOffset=${newOffset} infoKey='${this.infoKey(id)}'`);
73
+ if (offset > this.maxSize) {
74
+ throw server_1.ERRORS.ERR_MAX_SIZE_EXCEEDED;
64
75
  }
65
- catch (error) {
66
- this.logger?.error(`TusStorageManagerDataStore: failed writing upload '${id}'`, error);
67
- throw server_1.ERRORS.FILE_WRITE_ERROR;
76
+ // A repeated empty PATCH on a finished upload must not compose deleted parts.
77
+ if (upload.offset === upload.size && await this.disk.exists(this.finalKey(id))) {
78
+ for await (const _part of this.readParts(readable, offset, upload.size)) {
79
+ // readParts rejects any bytes beyond the declared length.
80
+ }
81
+ return offset;
68
82
  }
69
- if (upload.size !== undefined && newOffset === upload.size) {
70
- try {
71
- this.logger?.verbose(`TusStorageManagerDataStore: upload complete id='${id}' size=${upload.size}; materializing to '${this.finalKey(id)}'`);
72
- await this.materializeUpload(id, upload, { deleteParts: true });
83
+ // Retained parts can come from compose failures, interrupted writes, or an
84
+ // ambiguous metadata PUT. Always consult durable storage, including after a
85
+ // restart; a process-local clean-offset cache would miss another writer's tail.
86
+ const partKeys = await this.listPartKeys(id);
87
+ await this.deleteParts(partKeys.filter(key => this.partOffset(key) >= offset));
88
+ const committedParts = partKeys.filter(key => this.partOffset(key) < offset);
89
+ const writtenParts = [];
90
+ let newOffset = offset;
91
+ try {
92
+ // Await each bounded part write before reading more request bytes. This
93
+ // provides backpressure and known content lengths for every disk driver.
94
+ for await (const part of this.readParts(readable, offset, upload.size)) {
95
+ const partKey = this.partKey(id, newOffset);
96
+ writtenParts.push(partKey);
97
+ try {
98
+ await this.disk.put(partKey, part, { contentLength: part.length });
99
+ }
100
+ catch (error) {
101
+ this.logger?.error(`TusStorageManagerDataStore: failed writing part '${partKey}'`, error);
102
+ throw server_1.ERRORS.FILE_WRITE_ERROR;
103
+ }
104
+ newOffset += part.length;
73
105
  }
74
- catch (error) {
75
- upload.offset = offset;
106
+ }
107
+ catch (error) {
108
+ for (const key of writtenParts) {
76
109
  try {
77
- await this.writeUploadInfo(id, upload);
110
+ if (await this.disk.exists(key)) {
111
+ await this.disk.delete(key);
112
+ }
78
113
  }
79
- catch (rollbackError) {
80
- this.logger?.error(`TusStorageManagerDataStore: failed rolling back upload '${id}' after compose failure`, rollbackError);
114
+ catch (cleanupError) {
115
+ this.logger?.error(`TusStorageManagerDataStore: failed cleaning up part '${key}'`, cleanupError);
81
116
  }
82
- throw error;
83
117
  }
118
+ this.logger?.error(`TusStorageManagerDataStore: failed writing upload '${id}'`, error);
119
+ throw error;
120
+ }
121
+ const updatedUpload = { ...upload, offset: newOffset };
122
+ const complete = upload.size !== undefined && newOffset === upload.size;
123
+ if (complete) {
124
+ // Publish the final object BEFORE the completed offset. No metadata
125
+ // rollback is needed if composition fails, even if metadata storage is down.
126
+ // Reuse this request's listing and keys rather than listing S3 again.
127
+ await this.materializeUpload(id, updatedUpload, [...committedParts, ...writtenParts]);
128
+ }
129
+ try {
130
+ await this.writeUploadInfo(id, updatedUpload);
131
+ }
132
+ catch (error) {
133
+ // A rejected PUT may have committed (e.g. a lost S3 response). Retain
134
+ // every part: deleting them or rolling metadata back could destroy bytes
135
+ // already advertised by HEAD. A retry reads the actual durable offset.
136
+ this.logger?.error(`TusStorageManagerDataStore: failed updating upload '${id}'`, error);
137
+ throw server_1.ERRORS.FILE_WRITE_ERROR;
138
+ }
139
+ if (complete) {
140
+ await this.cleanupCompletedParts(id);
84
141
  }
85
142
  return newOffset;
86
143
  });
@@ -96,13 +153,27 @@ class TusStorageManagerDataStore extends server_1.DataStore {
96
153
  });
97
154
  }
98
155
  async declareUploadLength(id, uploadLength) {
99
- const upload = await this.readStoredUpload(id);
100
- upload.size = uploadLength;
101
- await this.writeUploadInfo(id, upload);
102
- this.logger?.verbose(`TusStorageManagerDataStore: declareUploadLength id='${id}' uploadLength=${uploadLength} offset=${upload.offset}`);
103
- if (upload.offset === uploadLength) {
104
- await this.materializeUpload(id, upload, { deleteParts: true });
105
- }
156
+ this.validateUploadLength(uploadLength);
157
+ await this.withUploadLock(id, async () => {
158
+ const upload = await this.readStoredUpload(id);
159
+ if (uploadLength < upload.offset) {
160
+ throw server_1.ERRORS.INVALID_LENGTH;
161
+ }
162
+ if (upload.size === uploadLength && upload.offset === uploadLength
163
+ && (await this.disk.exists(this.finalKey(id)))) {
164
+ return;
165
+ }
166
+ const updatedUpload = { ...upload, size: uploadLength };
167
+ if (upload.offset === uploadLength) {
168
+ const partKeys = await this.listPartKeys(id);
169
+ await this.deleteParts(partKeys.filter(key => this.partOffset(key) >= upload.offset));
170
+ await this.materializeUpload(id, updatedUpload, partKeys.filter(key => this.partOffset(key) < upload.offset));
171
+ }
172
+ await this.writeUploadInfo(id, updatedUpload);
173
+ if (upload.offset === uploadLength) {
174
+ await this.cleanupCompletedParts(id);
175
+ }
176
+ });
106
177
  }
107
178
  async deleteExpired() {
108
179
  if (this.getExpiration() <= 0) {
@@ -154,6 +225,11 @@ class TusStorageManagerDataStore extends server_1.DataStore {
154
225
  partKey(id, offset) {
155
226
  return `${this.partsPrefix(id)}${String(offset).padStart(20, '0')}`;
156
227
  }
228
+ partOffset(key) {
229
+ // Flydrive normalizes leading dots in keys (".tus" becomes "tus"). Compare
230
+ // the numeric suffix, not a listed full key against an unnormalized prefix.
231
+ return Number(key.slice(key.lastIndexOf('/') + 1));
232
+ }
157
233
  toStoredUpload(upload) {
158
234
  return {
159
235
  id: upload.id,
@@ -179,8 +255,7 @@ class TusStorageManagerDataStore extends server_1.DataStore {
179
255
  throw error;
180
256
  }
181
257
  }
182
- async materializeUpload(id, upload, options) {
183
- const partKeys = await this.listPartKeys(id);
258
+ async materializeUpload(id, upload, partKeys) {
184
259
  this.logger?.verbose(`TusStorageManagerDataStore: materialize id='${id}' partCount=${partKeys.length} partsPrefix='${this.partsPrefix(id)}' finalKey='${this.finalKey(id)}' contentLength=${upload.offset}`);
185
260
  if (!partKeys.length && upload.offset > 0) {
186
261
  throw new Error(`No TUS parts found for '${id}' while materializing ${upload.offset} bytes`);
@@ -189,15 +264,36 @@ class TusStorageManagerDataStore extends server_1.DataStore {
189
264
  try {
190
265
  await this.disk.putStream(this.finalKey(id), composed, { contentLength: upload.offset });
191
266
  this.logger?.verbose(`TusStorageManagerDataStore: materialized id='${id}' finalKey='${this.finalKey(id)}' contentLength=${upload.offset}`);
192
- if (options.deleteParts) {
193
- await this.disk.deleteAll(this.partsPrefix(id));
194
- this.logger?.verbose(`TusStorageManagerDataStore: deleted parts id='${id}' partsPrefix='${this.partsPrefix(id)}'`);
195
- }
196
267
  }
197
268
  catch (error) {
198
269
  this.logger?.error(`TusStorageManagerDataStore: failed composing upload '${id}'`, error);
199
270
  throw server_1.ERRORS.FILE_WRITE_ERROR;
200
271
  }
272
+ finally {
273
+ // Some drivers reject before consuming the stream; release its part source.
274
+ composed.destroy();
275
+ }
276
+ }
277
+ async cleanupCompletedParts(id) {
278
+ try {
279
+ await this.disk.deleteAll(this.partsPrefix(id));
280
+ }
281
+ catch (error) {
282
+ // Completion is already durable. Cleanup failure must not roll it back or
283
+ // fail a successful upload after some of its committed parts were deleted.
284
+ this.logger?.error(`TusStorageManagerDataStore: failed cleaning completed upload '${id}'`, error);
285
+ }
286
+ }
287
+ async deleteParts(keys) {
288
+ for (let index = 0; index < keys.length; index += PART_DELETE_CONCURRENCY) {
289
+ // Wait for the whole batch before releasing the upload lock on failure.
290
+ const results = await Promise.allSettled(keys.slice(index, index + PART_DELETE_CONCURRENCY).map(key => this.disk.delete(key)));
291
+ for (const result of results) {
292
+ if (result.status === 'rejected' && !this.isDiskNotFound(result.reason)) {
293
+ throw result.reason;
294
+ }
295
+ }
296
+ }
201
297
  }
202
298
  async *streamPartsSequential(partKeys) {
203
299
  for (const key of partKeys) {
@@ -207,13 +303,18 @@ class TusStorageManagerDataStore extends server_1.DataStore {
207
303
  }
208
304
  }
209
305
  }
210
- validateWriteInputs(offset, collectedLength) {
306
+ validateUploadLength(size) {
307
+ if (!Number.isSafeInteger(size) || size < 0) {
308
+ throw server_1.ERRORS.INVALID_LENGTH;
309
+ }
310
+ if (size > this.maxSize) {
311
+ throw server_1.ERRORS.ERR_MAX_SIZE_EXCEEDED;
312
+ }
313
+ }
314
+ validateWriteInputs(offset) {
211
315
  if (!Number.isSafeInteger(offset) || offset < 0) {
212
316
  throw server_1.ERRORS.INVALID_OFFSET;
213
317
  }
214
- if (!Number.isSafeInteger(collectedLength) || collectedLength < 0) {
215
- throw server_1.ERRORS.FILE_WRITE_ERROR;
216
- }
217
318
  }
218
319
  async withUploadLock(id, action) {
219
320
  const previous = this.writeLocks.get(id) ?? Promise.resolve();
@@ -234,18 +335,44 @@ class TusStorageManagerDataStore extends server_1.DataStore {
234
335
  }
235
336
  }
236
337
  }
237
- async readStream(readable) {
238
- const chunks = [];
338
+ async *readParts(readable, offset, size) {
339
+ const partSize = Math.min(MAX_BUFFERED_PART_SIZE, this.maxChunkSize, this.maxSize - offset, size === undefined ? this.maxSize : size - offset);
340
+ let part;
341
+ let buffered = 0;
342
+ let received = 0;
239
343
  for await (const chunk of readable) {
240
- chunks.push(Buffer.isBuffer(chunk) ? chunk : Buffer.from(chunk));
344
+ const length = typeof chunk === 'string' ? Buffer.byteLength(chunk) : chunk.byteLength;
345
+ received += length;
346
+ if (!Number.isSafeInteger(received) || received > this.maxChunkSize || offset + received > this.maxSize) {
347
+ throw server_1.ERRORS.ERR_MAX_SIZE_EXCEEDED;
348
+ }
349
+ if (size !== undefined && offset + received > size) {
350
+ throw server_1.ERRORS.INVALID_OFFSET;
351
+ }
352
+ const data = Buffer.isBuffer(chunk) ? chunk : Buffer.from(chunk);
353
+ let position = 0;
354
+ while (position < data.length) {
355
+ part ??= Buffer.allocUnsafe(partSize);
356
+ const end = Math.min(data.length, position + part.length - buffered);
357
+ data.copy(part, buffered, position, end);
358
+ buffered += end - position;
359
+ position = end;
360
+ if (buffered === part.length) {
361
+ const completed = part;
362
+ part = undefined;
363
+ buffered = 0;
364
+ yield completed;
365
+ }
366
+ }
367
+ }
368
+ if (part && buffered > 0) {
369
+ yield part.subarray(0, buffered);
241
370
  }
242
- return new Uint8Array(Buffer.concat(chunks));
243
371
  }
244
372
  async listUploadIds() {
245
- const listing = await this.disk.listAll(`${this.prefix}/`, { recursive: true });
373
+ const keys = await this.listKeys(`${this.prefix}/`);
246
374
  const ids = new Set();
247
- for (const object of Array.from(listing.objects)) {
248
- const key = this.listedObjectKey(object);
375
+ for (const key of keys) {
249
376
  const match = key.match(new RegExp(`^${this.escapeRegExp(this.prefix)}/([^/]+)/info\\.json$`));
250
377
  if (match?.[1]) {
251
378
  ids.add(match[1]);
@@ -254,10 +381,17 @@ class TusStorageManagerDataStore extends server_1.DataStore {
254
381
  return Array.from(ids.values()).sort();
255
382
  }
256
383
  async listPartKeys(id) {
257
- const listing = await this.disk.listAll(this.partsPrefix(id), { recursive: true });
258
- return Array.from(listing.objects)
259
- .map((object) => this.listedObjectKey(object))
260
- .sort();
384
+ return (await this.listKeys(this.partsPrefix(id))).sort();
385
+ }
386
+ async listKeys(prefix) {
387
+ const keys = [];
388
+ let paginationToken;
389
+ do {
390
+ const listing = await this.disk.listAll(prefix, { recursive: true, paginationToken });
391
+ keys.push(...Array.from(listing.objects, object => this.listedObjectKey(object)));
392
+ paginationToken = listing.paginationToken;
393
+ } while (paginationToken);
394
+ return keys;
261
395
  }
262
396
  listedObjectKey(object) {
263
397
  const listed = object;
@@ -310,4 +444,4 @@ class TusStorageManagerDataStore extends server_1.DataStore {
310
444
  }
311
445
  }
312
446
  exports.TusStorageManagerDataStore = TusStorageManagerDataStore;
313
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiVHVzU3RvcmFnZU1hbmFnZXJEYXRhU3RvcmUuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9zcmMvc3RvcmFnZS9UdXNTdG9yYWdlTWFuYWdlckRhdGFTdG9yZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7QUFBQSw2Q0FBdUM7QUFDdkMsd0NBQXdEO0FBOEJ4RCxNQUFhLDBCQUEyQixTQUFRLGtCQUFTO0lBQ3RDLElBQUksQ0FBaUI7SUFDckIsTUFBTSxDQUFTO0lBQ2YsTUFBTSxDQUFhO0lBQ25CLDhCQUE4QixDQUFTO0lBQ3ZDLFVBQVUsR0FBRyxJQUFJLEdBQUcsRUFBeUIsQ0FBQztJQUUvRCxZQUFtQixPQUFtQjtRQUNwQyxLQUFLLEVBQUUsQ0FBQztRQUNSLElBQUksQ0FBQyxJQUFJLEdBQUcsT0FBTyxDQUFDLElBQUksQ0FBQztRQUN6QixJQUFJLENBQUMsTUFBTSxHQUFHLElBQUksQ0FBQyxlQUFlLENBQUMsT0FBTyxDQUFDLE1BQU0sQ0FBQyxDQUFDO1FBQ25ELElBQUksQ0FBQyxNQUFNLEdBQUcsT0FBTyxDQUFDLE1BQU0sQ0FBQztRQUM3QixJQUFJLENBQUMsOEJBQThCLEdBQUcsT0FBTyxDQUFDLDhCQUE4QixJQUFJLENBQUMsQ0FBQztRQUNsRixJQUFJLENBQUMsVUFBVSxHQUFHO1lBQ2hCLFVBQVU7WUFDVixzQkFBc0I7WUFDdEIsdUJBQXVCO1lBQ3ZCLGFBQWE7WUFDYixZQUFZO1NBQ2IsQ0FBQztJQUNKLENBQUM7SUFFZSxLQUFLLENBQUMsTUFBTSxDQUFDLElBQVk7UUFDdkMsTUFBTSxZQUFZLEdBQUcsSUFBSSxDQUFDLGNBQWMsQ0FBQyxJQUFJLENBQUMsQ0FBQztRQUMvQyxNQUFNLElBQUksQ0FBQyxlQUFlLENBQUMsSUFBSSxDQUFDLEVBQUUsRUFBRSxZQUFZLENBQUMsQ0FBQztRQUNsRCxJQUFJLENBQUMsT0FBTyxHQUFHLEVBQUUsSUFBSSxFQUFFLGlCQUFpQixFQUFFLElBQUksRUFBRSxJQUFJLENBQUMsUUFBUSxDQUFDLElBQUksQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDO1FBQ3pFLElBQUksQ0FBQyxNQUFNLEVBQUUsT0FBTyxDQUNsQiwwQ0FBMEMsSUFBSSxDQUFDLEVBQUUsVUFBVSxJQUFJLENBQUMsSUFBSSxJQUFJLFVBQVUsV0FBVyxJQUFJLENBQUMsTUFBTSxhQUFhLElBQUksQ0FBQyxPQUFPLENBQUMsSUFBSSxDQUFDLEVBQUUsQ0FBQyxlQUFlLElBQUksQ0FBQyxRQUFRLENBQUMsSUFBSSxDQUFDLEVBQUUsQ0FBQyxHQUFHLENBQ25MLENBQUM7UUFDRixPQUFPLElBQUksQ0FBQztJQUNkLENBQUM7SUFFZSxLQUFLLENBQUMsTUFBTSxDQUFDLEVBQVU7UUFDckMsTUFBTSxNQUFNLEdBQUcsTUFBTSxJQUFJLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxJQUFJLENBQUMsT0FBTyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUM7UUFDeEQsSUFBSSxDQUFDLE1BQU0sRUFBRSxDQUFDO1lBQ1osTUFBTSxlQUFNLENBQUMsY0FBYyxDQUFDO1FBQzlCLENBQUM7UUFDRCxNQUFNLElBQUksQ0FBQyxnQkFBZ0IsQ0FBQyxFQUFFLENBQUMsQ0FBQztJQUNsQyxDQUFDO0lBRWUsS0FBSyxDQUFDLEtBQUssQ0FBQyxRQUFrQixFQUFFLEVBQVUsRUFBRSxNQUFjO1FBQ3hFLE1BQU0sU0FBUyxHQUFHLE1BQU0sSUFBSSxDQUFDLFVBQVUsQ0FBQyxRQUFRLENBQUMsQ0FBQztRQUNsRCxJQUFJLENBQUMsbUJBQW1CLENBQUMsTUFBTSxFQUFFLFNBQVMsQ0FBQyxNQUFNLENBQUMsQ0FBQztRQUNuRCxJQUFJLENBQUMsTUFBTSxFQUFFLE9BQU8sQ0FDbEIsa0RBQWtELEVBQUUsbUJBQW1CLE1BQU0sVUFBVSxTQUFTLENBQUMsTUFBTSxFQUFFLENBQzFHLENBQUM7UUFFRixPQUFPLElBQUksQ0FBQyxjQUFjLENBQUMsRUFBRSxFQUFFLEtBQUssSUFBSSxFQUFFO1lBQ3hDLE1BQU0sTUFBTSxHQUFHLE1BQU0sSUFBSSxDQUFDLGdCQUFnQixDQUFDLEVBQUUsQ0FBQyxDQUFDO1lBQy9DLElBQUksQ0FBQyxNQUFNLEVBQUUsT0FBTyxDQUNsQiwrQ0FBK0MsRUFBRSxrQkFBa0IsTUFBTSxDQUFDLE1BQU0sU0FBUyxNQUFNLENBQUMsSUFBSSxJQUFJLFVBQVUsRUFBRSxDQUNySCxDQUFDO1lBQ0YsSUFBSSxNQUFNLENBQUMsTUFBTSxLQUFLLE1BQU0sRUFBRSxDQUFDO2dCQUM3QixNQUFNLGVBQU0sQ0FBQyxjQUFjLENBQUM7WUFDOUIsQ0FBQztZQUVELE1BQU0sU0FBUyxHQUFHLE1BQU0sR0FBRyxTQUFTLENBQUMsTUFBTSxDQUFDO1lBQzVDLElBQUksQ0FBQyxNQUFNLENBQUMsYUFBYSxDQUFDLFNBQVMsQ0FBQyxJQUFJLFNBQVMsR0FBRyxDQUFDLEVBQUUsQ0FBQztnQkFDdEQsTUFBTSxlQUFNLENBQUMsZ0JBQWdCLENBQUM7WUFDaEMsQ0FBQztZQUNELElBQUksTUFBTSxDQUFDLElBQUksS0FBSyxTQUFTLElBQUksU0FBUyxHQUFHLE1BQU0sQ0FBQyxJQUFJLEVBQUUsQ0FBQztnQkFDekQsTUFBTSxlQUFNLENBQUMsY0FBYyxDQUFDO1lBQzlCLENBQUM7WUFFRCxNQUFNLE9BQU8sR0FBRyxJQUFJLENBQUMsT0FBTyxDQUFDLEVBQUUsRUFBRSxNQUFNLENBQUMsQ0FBQztZQUN6QyxJQUFJLENBQUM7Z0JBQ0gsSUFBSSxDQUFDLE1BQU0sRUFBRSxPQUFPLENBQ2xCLGdEQUFnRCxFQUFFLGNBQWMsT0FBTyxXQUFXLFNBQVMsQ0FBQyxNQUFNLEVBQUUsQ0FDckcsQ0FBQztnQkFDRixNQUFNLElBQUksQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLE9BQU8sRUFBRSxTQUFTLEVBQUUsRUFBRSxhQUFhLEVBQUUsU0FBUyxDQUFDLE1BQU0sRUFBRSxDQUFDLENBQUM7Z0JBQzdFLE1BQU0sQ0FBQyxNQUFNLEdBQUcsU0FBUyxDQUFDO2dCQUMxQixNQUFNLElBQUksQ0FBQyxlQUFlLENBQUMsRUFBRSxFQUFFLE1BQU0sQ0FBQyxDQUFDO2dCQUN2QyxJQUFJLENBQUMsTUFBTSxFQUFFLE9BQU8sQ0FDbEIsOENBQThDLEVBQUUsZUFBZSxTQUFTLGFBQWEsSUFBSSxDQUFDLE9BQU8sQ0FBQyxFQUFFLENBQUMsR0FBRyxDQUN6RyxDQUFDO1lBQ0osQ0FBQztZQUFDLE9BQU8sS0FBSyxFQUFFLENBQUM7Z0JBQ2YsSUFBSSxDQUFDLE1BQU0sRUFBRSxLQUFLLENBQUMsc0RBQXNELEVBQUUsR0FBRyxFQUFFLEtBQUssQ0FBQyxDQUFDO2dCQUN2RixNQUFNLGVBQU0sQ0FBQyxnQkFBZ0IsQ0FBQztZQUNoQyxDQUFDO1lBRUQsSUFBSSxNQUFNLENBQUMsSUFBSSxLQUFLLFNBQVMsSUFBSSxTQUFTLEtBQUssTUFBTSxDQUFDLElBQUksRUFBRSxDQUFDO2dCQUMzRCxJQUFJLENBQUM7b0JBQ0gsSUFBSSxDQUFDLE1BQU0sRUFBRSxPQUFPLENBQ2xCLG1EQUFtRCxFQUFFLFVBQVUsTUFBTSxDQUFDLElBQUksdUJBQXVCLElBQUksQ0FBQyxRQUFRLENBQUMsRUFBRSxDQUFDLEdBQUcsQ0FDdEgsQ0FBQztvQkFDRixNQUFNLElBQUksQ0FBQyxpQkFBaUIsQ0FBQyxFQUFFLEVBQUUsTUFBTSxFQUFFLEVBQUUsV0FBVyxFQUFFLElBQUksRUFBRSxDQUFDLENBQUM7Z0JBQ2xFLENBQUM7Z0JBQUMsT0FBTyxLQUFLLEVBQUUsQ0FBQztvQkFDZixNQUFNLENBQUMsTUFBTSxHQUFHLE1BQU0sQ0FBQztvQkFDdkIsSUFBSSxDQUFDO3dCQUNILE1BQU0sSUFBSSxDQUFDLGVBQWUsQ0FBQyxFQUFFLEVBQUUsTUFBTSxDQUFDLENBQUM7b0JBQ3pDLENBQUM7b0JBQUMsT0FBTyxhQUFhLEVBQUUsQ0FBQzt3QkFDdkIsSUFBSSxDQUFDLE1BQU0sRUFBRSxLQUFLLENBQUMsMkRBQTJELEVBQUUseUJBQXlCLEVBQUUsYUFBYSxDQUFDLENBQUM7b0JBQzVILENBQUM7b0JBQ0QsTUFBTSxLQUFLLENBQUM7Z0JBQ2QsQ0FBQztZQUNILENBQUM7WUFFRCxPQUFPLFNBQVMsQ0FBQztRQUNuQixDQUFDLENBQUMsQ0FBQztJQUNMLENBQUM7SUFFZSxLQUFLLENBQUMsU0FBUyxDQUFDLEVBQVU7UUFDeEMsTUFBTSxNQUFNLEdBQUcsTUFBTSxJQUFJLENBQUMsZ0JBQWdCLENBQUMsRUFBRSxDQUFDLENBQUM7UUFDL0MsT0FBTyxJQUFJLGVBQU0sQ0FBQztZQUNoQixHQUFHLE1BQU07WUFDVCxPQUFPLEVBQUU7Z0JBQ1AsSUFBSSxFQUFFLGlCQUFpQjtnQkFDdkIsSUFBSSxFQUFFLE1BQU0sQ0FBQyxNQUFNLEtBQUssTUFBTSxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLFFBQVEsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLFdBQVcsQ0FBQyxFQUFFLENBQUM7YUFDL0U7U0FDRixDQUFDLENBQUM7SUFDTCxDQUFDO0lBRWUsS0FBSyxDQUFDLG1CQUFtQixDQUFDLEVBQVUsRUFBRSxZQUFvQjtRQUN4RSxNQUFNLE1BQU0sR0FBRyxNQUFNLElBQUksQ0FBQyxnQkFBZ0IsQ0FBQyxFQUFFLENBQUMsQ0FBQztRQUMvQyxNQUFNLENBQUMsSUFBSSxHQUFHLFlBQVksQ0FBQztRQUMzQixNQUFNLElBQUksQ0FBQyxlQUFlLENBQUMsRUFBRSxFQUFFLE1BQU0sQ0FBQyxDQUFDO1FBQ3ZDLElBQUksQ0FBQyxNQUFNLEVBQUUsT0FBTyxDQUNsQix1REFBdUQsRUFBRSxrQkFBa0IsWUFBWSxXQUFXLE1BQU0sQ0FBQyxNQUFNLEVBQUUsQ0FDbEgsQ0FBQztRQUVGLElBQUksTUFBTSxDQUFDLE1BQU0sS0FBSyxZQUFZLEVBQUUsQ0FBQztZQUNuQyxNQUFNLElBQUksQ0FBQyxpQkFBaUIsQ0FBQyxFQUFFLEVBQUUsTUFBTSxFQUFFLEVBQUUsV0FBVyxFQUFFLElBQUksRUFBRSxDQUFDLENBQUM7UUFDbEUsQ0FBQztJQUNILENBQUM7SUFFZSxLQUFLLENBQUMsYUFBYTtRQUNqQyxJQUFJLElBQUksQ0FBQyxhQUFhLEVBQUUsSUFBSSxDQUFDLEVBQUUsQ0FBQztZQUM5QixPQUFPLENBQUMsQ0FBQztRQUNYLENBQUM7UUFFRCxNQUFNLE9BQU8sR0FBRyxNQUFNLElBQUksQ0FBQyxhQUFhLEVBQUUsQ0FBQztRQUMzQyxNQUFNLEdBQUcsR0FBRyxJQUFJLENBQUMsR0FBRyxFQUFFLENBQUM7UUFDdkIsSUFBSSxPQUFPLEdBQUcsQ0FBQyxDQUFDO1FBRWhCLEtBQUssTUFBTSxFQUFFLElBQUksT0FBTyxFQUFFLENBQUM7WUFDekIsSUFBSSxDQUFDO2dCQUNILE1BQU0sTUFBTSxHQUFHLE1BQU0sSUFBSSxDQUFDLGdCQUFnQixDQUFDLEVBQUUsQ0FBQyxDQUFDO2dCQUMvQyxJQUFJLE1BQU0sQ0FBQyxJQUFJLEtBQUssU0FBUyxJQUFJLE1BQU0sQ0FBQyxNQUFNLEtBQUssTUFBTSxDQUFDLElBQUksRUFBRSxDQUFDO29CQUMvRCxTQUFTO2dCQUNYLENBQUM7Z0JBRUQsTUFBTSxTQUFTLEdBQUcsSUFBSSxDQUFDLHVCQUF1QixDQUFDLEVBQUUsRUFBRSxNQUFNLENBQUMsQ0FBQztnQkFDM0QsSUFBSSxHQUFHLEdBQUcsU0FBUyxHQUFHLElBQUksQ0FBQyxhQUFhLEVBQUUsRUFBRSxDQUFDO29CQUMzQyxNQUFNLElBQUksQ0FBQyxnQkFBZ0IsQ0FBQyxFQUFFLENBQUMsQ0FBQztvQkFDaEMsT0FBTyxJQUFJLENBQUMsQ0FBQztnQkFDZixDQUFDO1lBQ0gsQ0FBQztZQUFDLE9BQU8sS0FBSyxFQUFFLENBQUM7Z0JBQ2YsSUFBSSxDQUFDLElBQUksQ0FBQyxhQUFhLENBQUMsS0FBSyxDQUFDLEVBQUUsQ0FBQztvQkFDL0IsTUFBTSxLQUFLLENBQUM7Z0JBQ2QsQ0FBQztZQUNILENBQUM7UUFDSCxDQUFDO1FBRUQsT0FBTyxPQUFPLENBQUM7SUFDakIsQ0FBQztJQUVlLGFBQWE7UUFDM0IsT0FBTyxJQUFJLENBQUMsOEJBQThCLENBQUM7SUFDN0MsQ0FBQztJQUVPLGVBQWUsQ0FBQyxNQUFlO1FBQ3JDLE1BQU0sR0FBRyxHQUFHLE9BQU8sTUFBTSxLQUFLLFFBQVEsQ0FBQyxDQUFDLENBQUMsTUFBTSxDQUFDLElBQUksRUFBRSxDQUFDLENBQUMsQ0FBQyxNQUFNLENBQUM7UUFDaEUsTUFBTSxPQUFPLEdBQUcsR0FBRyxDQUFDLE9BQU8sQ0FBQyxZQUFZLEVBQUUsRUFBRSxDQUFDLENBQUM7UUFDOUMsT0FBTyxPQUFPLElBQUksTUFBTSxDQUFDO0lBQzNCLENBQUM7SUFFTyxZQUFZLENBQUMsRUFBVTtRQUM3QixPQUFPLEdBQUcsSUFBSSxDQUFDLE1BQU0sSUFBSSxFQUFFLEVBQUUsQ0FBQztJQUNoQyxDQUFDO0lBRU8sUUFBUSxDQUFDLEVBQVU7UUFDekIsT0FBTyxFQUFFLENBQUM7SUFDWixDQUFDO0lBRU8sT0FBTyxDQUFDLEVBQVU7UUFDeEIsT0FBTyxHQUFHLElBQUksQ0FBQyxZQUFZLENBQUMsRUFBRSxDQUFDLFlBQVksQ0FBQztJQUM5QyxDQUFDO0lBRU8sV0FBVyxDQUFDLEVBQVU7UUFDNUIsT0FBTyxHQUFHLElBQUksQ0FBQyxZQUFZLENBQUMsRUFBRSxDQUFDLFNBQVMsQ0FBQztJQUMzQyxDQUFDO0lBRU8sT0FBTyxDQUFDLEVBQVUsRUFBRSxNQUFjO1FBQ3hDLE9BQU8sR0FBRyxJQUFJLENBQUMsV0FBVyxDQUFDLEVBQUUsQ0FBQyxHQUFHLE1BQU0sQ0FBQyxNQUFNLENBQUMsQ0FBQyxRQUFRLENBQUMsRUFBRSxFQUFFLEdBQUcsQ0FBQyxFQUFFLENBQUM7SUFDdEUsQ0FBQztJQUVPLGNBQWMsQ0FBQyxNQUFjO1FBQ25DLE9BQU87WUFDTCxFQUFFLEVBQUUsTUFBTSxDQUFDLEVBQUU7WUFDYixJQUFJLEVBQUUsTUFBTSxDQUFDLElBQUk7WUFDakIsTUFBTSxFQUFFLE1BQU0sQ0FBQyxNQUFNO1lBQ3JCLFFBQVEsRUFBRSxNQUFNLENBQUMsUUFBUTtZQUN6QixhQUFhLEVBQUUsTUFBTSxDQUFDLGFBQWE7WUFDbkMsT0FBTyxFQUFFLE1BQU0sQ0FBQyxPQUFPO1NBQ3hCLENBQUM7SUFDSixDQUFDO0lBRU8sS0FBSyxDQUFDLGVBQWUsQ0FBQyxFQUFVLEVBQUUsTUFBdUI7UUFDL0QsTUFBTSxJQUFJLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxJQUFJLENBQUMsT0FBTyxDQUFDLEVBQUUsQ0FBQyxFQUFFLElBQUksQ0FBQyxTQUFTLENBQUMsTUFBTSxDQUFDLEVBQUUsRUFBRSxXQUFXLEVBQUUsa0JBQWtCLEVBQUUsQ0FBQyxDQUFDO0lBQ3JHLENBQUM7SUFFTyxLQUFLLENBQUMsZ0JBQWdCLENBQUMsRUFBVTtRQUN2QyxJQUFJLENBQUM7WUFDSCxNQUFNLEdBQUcsR0FBRyxNQUFNLElBQUksQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLElBQUksQ0FBQyxPQUFPLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQztZQUNsRCxPQUFPLElBQUksQ0FBQyxLQUFLLENBQUMsR0FBRyxDQUFvQixDQUFDO1FBQzVDLENBQUM7UUFBQyxPQUFPLEtBQUssRUFBRSxDQUFDO1lBQ2YsSUFBSSxJQUFJLENBQUMsY0FBYyxDQUFDLEtBQUssQ0FBQyxFQUFFLENBQUM7Z0JBQy9CLE1BQU0sZUFBTSxDQUFDLGNBQWMsQ0FBQztZQUM5QixDQUFDO1lBQ0QsTUFBTSxLQUFLLENBQUM7UUFDZCxDQUFDO0lBQ0gsQ0FBQztJQUVPLEtBQUssQ0FBQyxpQkFBaUIsQ0FBQyxFQUFVLEVBQUUsTUFBdUIsRUFBRSxPQUFpQztRQUNwRyxNQUFNLFFBQVEsR0FBRyxNQUFNLElBQUksQ0FBQyxZQUFZLENBQUMsRUFBRSxDQUFDLENBQUM7UUFDN0MsSUFBSSxDQUFDLE1BQU0sRUFBRSxPQUFPLENBQ2xCLCtDQUErQyxFQUFFLGVBQWUsUUFBUSxDQUFDLE1BQU0saUJBQWlCLElBQUksQ0FBQyxXQUFXLENBQUMsRUFBRSxDQUFDLGVBQWUsSUFBSSxDQUFDLFFBQVEsQ0FBQyxFQUFFLENBQUMsbUJBQW1CLE1BQU0sQ0FBQyxNQUFNLEVBQUUsQ0FDdkwsQ0FBQztRQUNGLElBQUksQ0FBQyxRQUFRLENBQUMsTUFBTSxJQUFJLE1BQU0sQ0FBQyxNQUFNLEdBQUcsQ0FBQyxFQUFFLENBQUM7WUFDMUMsTUFBTSxJQUFJLEtBQUssQ0FBQywyQkFBMkIsRUFBRSx5QkFBeUIsTUFBTSxDQUFDLE1BQU0sUUFBUSxDQUFDLENBQUM7UUFDL0YsQ0FBQztRQUNELE1BQU0sUUFBUSxHQUFHLHNCQUFRLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxxQkFBcUIsQ0FBQyxRQUFRLENBQUMsQ0FBQyxDQUFDO1FBRXJFLElBQUksQ0FBQztZQUNILE1BQU0sSUFBSSxDQUFDLElBQUksQ0FBQyxTQUFTLENBQUMsSUFBSSxDQUFDLFFBQVEsQ0FBQyxFQUFFLENBQUMsRUFBRSxRQUFRLEVBQUUsRUFBRSxhQUFhLEVBQUUsTUFBTSxDQUFDLE1BQU0sRUFBRSxDQUFDLENBQUM7WUFDekYsSUFBSSxDQUFDLE1BQU0sRUFBRSxPQUFPLENBQ2xCLGdEQUFnRCxFQUFFLGVBQWUsSUFBSSxDQUFDLFFBQVEsQ0FBQyxFQUFFLENBQUMsbUJBQW1CLE1BQU0sQ0FBQyxNQUFNLEVBQUUsQ0FDckgsQ0FBQztZQUNGLElBQUksT0FBTyxDQUFDLFdBQVcsRUFBRSxDQUFDO2dCQUN4QixNQUFNLElBQUksQ0FBQyxJQUFJLENBQUMsU0FBUyxDQUFDLElBQUksQ0FBQyxXQUFXLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQztnQkFDaEQsSUFBSSxDQUFDLE1BQU0sRUFBRSxPQUFPLENBQ2xCLGlEQUFpRCxFQUFFLGtCQUFrQixJQUFJLENBQUMsV0FBVyxDQUFDLEVBQUUsQ0FBQyxHQUFHLENBQzdGLENBQUM7WUFDSixDQUFDO1FBQ0gsQ0FBQztRQUFDLE9BQU8sS0FBSyxFQUFFLENBQUM7WUFDZixJQUFJLENBQUMsTUFBTSxFQUFFLEtBQUssQ0FBQyx3REFBd0QsRUFBRSxHQUFHLEVBQUUsS0FBSyxDQUFDLENBQUM7WUFDekYsTUFBTSxlQUFNLENBQUMsZ0JBQWdCLENBQUM7UUFDaEMsQ0FBQztJQUNILENBQUM7SUFFTyxLQUFLLENBQUMsQ0FBQyxxQkFBcUIsQ0FBQyxRQUFrQjtRQUNyRCxLQUFLLE1BQU0sR0FBRyxJQUFJLFFBQVEsRUFBRSxDQUFDO1lBQzNCLE1BQU0sTUFBTSxHQUFHLE1BQU0sSUFBSSxDQUFDLElBQUksQ0FBQyxTQUFTLENBQUMsR0FBRyxDQUFDLENBQUM7WUFDOUMsSUFBSSxLQUFLLEVBQUUsTUFBTSxLQUFLLElBQUksTUFBTSxFQUFFLENBQUM7Z0JBQ2pDLE1BQU0sTUFBTSxDQUFDLFFBQVEsQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxNQUFNLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxDQUFDO1lBQzVELENBQUM7UUFDSCxDQUFDO0lBQ0gsQ0FBQztJQUVPLG1CQUFtQixDQUFDLE1BQWMsRUFBRSxlQUF1QjtRQUNqRSxJQUFJLENBQUMsTUFBTSxDQUFDLGFBQWEsQ0FBQyxNQUFNLENBQUMsSUFBSSxNQUFNLEdBQUcsQ0FBQyxFQUFFLENBQUM7WUFDaEQsTUFBTSxlQUFNLENBQUMsY0FBYyxDQUFDO1FBQzlCLENBQUM7UUFDRCxJQUFJLENBQUMsTUFBTSxDQUFDLGFBQWEsQ0FBQyxlQUFlLENBQUMsSUFBSSxlQUFlLEdBQUcsQ0FBQyxFQUFFLENBQUM7WUFDbEUsTUFBTSxlQUFNLENBQUMsZ0JBQWdCLENBQUM7UUFDaEMsQ0FBQztJQUNILENBQUM7SUFFTyxLQUFLLENBQUMsY0FBYyxDQUFJLEVBQVUsRUFBRSxNQUF3QjtRQUNsRSxNQUFNLFFBQVEsR0FBRyxJQUFJLENBQUMsVUFBVSxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsSUFBSSxPQUFPLENBQUMsT0FBTyxFQUFFLENBQUM7UUFDOUQsSUFBSSxjQUF3QyxDQUFDO1FBQzdDLE1BQU0sT0FBTyxHQUFHLElBQUksT0FBTyxDQUFPLENBQUMsT0FBTyxFQUFFLEVBQUU7WUFDNUMsY0FBYyxHQUFHLE9BQU8sQ0FBQztRQUMzQixDQUFDLENBQUMsQ0FBQztRQUNILE1BQU0sWUFBWSxHQUFHLFFBQVEsQ0FBQyxLQUFLLENBQUMsR0FBRyxFQUFFLENBQUMsU0FBUyxDQUFDLENBQUMsSUFBSSxDQUFDLEdBQUcsRUFBRSxDQUFDLE9BQU8sQ0FBQyxDQUFDO1FBQ3pFLElBQUksQ0FBQyxVQUFVLENBQUMsR0FBRyxDQUFDLEVBQUUsRUFBRSxZQUFZLENBQUMsQ0FBQztRQUV0QyxNQUFNLFFBQVEsQ0FBQyxLQUFLLENBQUMsR0FBRyxFQUFFLENBQUMsU0FBUyxDQUFDLENBQUM7UUFFdEMsSUFBSSxDQUFDO1lBQ0gsT0FBTyxNQUFNLE1BQU0sRUFBRSxDQUFDO1FBQ3hCLENBQUM7Z0JBQVMsQ0FBQztZQUNULGNBQWMsRUFBRSxFQUFFLENBQUM7WUFDbkIsSUFBSSxJQUFJLENBQUMsVUFBVSxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsS0FBSyxZQUFZLEVBQUUsQ0FBQztnQkFDN0MsSUFBSSxDQUFDLFVBQVUsQ0FBQyxNQUFNLENBQUMsRUFBRSxDQUFDLENBQUM7WUFDN0IsQ0FBQztRQUNILENBQUM7SUFDSCxDQUFDO0lBRU8sS0FBSyxDQUFDLFVBQVUsQ0FBQyxRQUFrQjtRQUN6QyxNQUFNLE1BQU0sR0FBYSxFQUFFLENBQUM7UUFDNUIsSUFBSSxLQUFLLEVBQUUsTUFBTSxLQUFLLElBQUksUUFBUSxFQUFFLENBQUM7WUFDbkMsTUFBTSxDQUFDLElBQUksQ0FBQyxNQUFNLENBQUMsUUFBUSxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQztRQUNuRSxDQUFDO1FBQ0QsT0FBTyxJQUFJLFVBQVUsQ0FBQyxNQUFNLENBQUMsTUFBTSxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUM7SUFDL0MsQ0FBQztJQUVPLEtBQUssQ0FBQyxhQUFhO1FBQ3pCLE1BQU0sT0FBTyxHQUFHLE1BQU0sSUFBSSxDQUFDLElBQUksQ0FBQyxPQUFPLENBQUMsR0FBRyxJQUFJLENBQUMsTUFBTSxHQUFHLEVBQUUsRUFBRSxTQUFTLEVBQUUsSUFBSSxFQUFFLENBQUMsQ0FBQztRQUNoRixNQUFNLEdBQUcsR0FBRyxJQUFJLEdBQUcsRUFBVSxDQUFDO1FBRTlCLEtBQUssTUFBTSxNQUFNLElBQUksS0FBSyxDQUFDLElBQUksQ0FBQyxPQUFPLENBQUMsT0FBTyxDQUFDLEVBQUUsQ0FBQztZQUNqRCxNQUFNLEdBQUcsR0FBRyxJQUFJLENBQUMsZUFBZSxDQUFDLE1BQU0sQ0FBQyxDQUFDO1lBQ3pDLE1BQU0sS0FBSyxHQUFHLEdBQUcsQ0FBQyxLQUFLLENBQUMsSUFBSSxNQUFNLENBQUMsSUFBSSxJQUFJLENBQUMsWUFBWSxDQUFDLElBQUksQ0FBQyxNQUFNLENBQUMsdUJBQXVCLENBQUMsQ0FBQyxDQUFDO1lBQy9GLElBQUksS0FBSyxFQUFFLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQztnQkFDZixHQUFHLENBQUMsR0FBRyxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO1lBQ3BCLENBQUM7UUFDSCxDQUFDO1FBRUQsT0FBTyxLQUFLLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxNQUFNLEVBQUUsQ0FBQyxDQUFDLElBQUksRUFBRSxDQUFDO0lBQ3pDLENBQUM7SUFFTyxLQUFLLENBQUMsWUFBWSxDQUFDLEVBQVU7UUFDbkMsTUFBTSxPQUFPLEdBQUcsTUFBTSxJQUFJLENBQUMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxJQUFJLENBQUMsV0FBVyxDQUFDLEVBQUUsQ0FBQyxFQUFFLEVBQUUsU0FBUyxFQUFFLElBQUksRUFBRSxDQUFDLENBQUM7UUFDbkYsT0FBTyxLQUFLLENBQUMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxPQUFPLENBQUM7YUFDL0IsR0FBRyxDQUFDLENBQUMsTUFBTSxFQUFFLEVBQUUsQ0FBQyxJQUFJLENBQUMsZUFBZSxDQUFDLE1BQU0sQ0FBQyxDQUFDO2FBQzdDLElBQUksRUFBRSxDQUFDO0lBQ1osQ0FBQztJQUVPLGVBQWUsQ0FBQyxNQUFlO1FBQ3JDLE1BQU0sTUFBTSxHQUFHLE1BQTBCLENBQUM7UUFDMUMsT0FBTyxNQUFNLENBQUMsTUFBTSxDQUFDLEdBQUcsSUFBSSxNQUFNLENBQUMsSUFBSSxJQUFJLE1BQU0sQ0FBQyxDQUFDO0lBQ3JELENBQUM7SUFFTyxLQUFLLENBQUMsZ0JBQWdCLENBQUMsRUFBVTtRQUN2QyxNQUFNLElBQUksQ0FBQyxJQUFJLENBQUMsU0FBUyxDQUFDLEdBQUcsSUFBSSxDQUFDLFlBQVksQ0FBQyxFQUFFLENBQUMsR0FBRyxDQUFDLENBQUM7UUFDdkQsSUFBSSxNQUFNLElBQUksQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUFDLElBQUksQ0FBQyxRQUFRLENBQUMsRUFBRSxDQUFDLENBQUMsRUFBRSxDQUFDO1lBQzlDLE1BQU0sSUFBSSxDQUFDLElBQUksQ0FBQyxNQUFNLENBQUMsSUFBSSxDQUFDLFFBQVEsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDO1FBQzVDLENBQUM7SUFDSCxDQUFDO0lBRU8sdUJBQXVCLENBQUMsRUFBVSxFQUFFLE1BQXVCO1FBQ2pFLElBQUksQ0FBQyxNQUFNLENBQUMsYUFBYSxFQUFFLENBQUM7WUFDMUIsSUFBSSxDQUFDLE1BQU0sRUFBRSxJQUFJLENBQUMsdUNBQXVDLEVBQUUsNEVBQTRFLENBQUMsQ0FBQztZQUN6SSxPQUFPLENBQUMsQ0FBQztRQUNYLENBQUM7UUFFRCxNQUFNLFNBQVMsR0FBRyxJQUFJLElBQUksQ0FBQyxNQUFNLENBQUMsYUFBYSxDQUFDLENBQUMsT0FBTyxFQUFFLENBQUM7UUFDM0QsSUFBSSxNQUFNLENBQUMsS0FBSyxDQUFDLFNBQVMsQ0FBQyxFQUFFLENBQUM7WUFDNUIsSUFBSSxDQUFDLE1BQU0sRUFBRSxJQUFJLENBQUMsdUNBQXVDLEVBQUUsZ0NBQWdDLE1BQU0sQ0FBQyxhQUFhLHNEQUFzRCxDQUFDLENBQUM7WUFDdkssT0FBTyxDQUFDLENBQUM7UUFDWCxDQUFDO1FBRUQsT0FBTyxTQUFTLENBQUM7SUFDbkIsQ0FBQztJQUVPLGNBQWMsQ0FBQyxLQUFjO1FBQ25DLElBQUksQ0FBQyxLQUFLLElBQUksT0FBTyxLQUFLLEtBQUssUUFBUSxFQUFFLENBQUM7WUFDeEMsT0FBTyxLQUFLLENBQUM7UUFDZixDQUFDO1FBRUQsTUFBTSxZQUFZLEdBQUcsS0FNcEIsQ0FBQztRQUNGLE1BQU0sSUFBSSxHQUFHLFlBQVksQ0FBQyxJQUFJLEVBQUUsV0FBVyxFQUFFLENBQUM7UUFDOUMsTUFBTSxJQUFJLEdBQUcsWUFBWSxDQUFDLElBQUksRUFBRSxXQUFXLEVBQUUsQ0FBQztRQUM5QyxNQUFNLE9BQU8sR0FBRyxZQUFZLENBQUMsT0FBTyxFQUFFLFdBQVcsRUFBRSxJQUFJLEVBQUUsQ0FBQztRQUUxRCxPQUFPLFlBQVksQ0FBQyxNQUFNLEtBQUssR0FBRztlQUM3QixZQUFZLENBQUMsVUFBVSxLQUFLLEdBQUc7ZUFDL0IsSUFBSSxLQUFLLFFBQVE7ZUFDakIsSUFBSSxLQUFLLFdBQVc7ZUFDcEIsSUFBSSxLQUFLLFVBQVU7ZUFDbkIsSUFBSSxLQUFLLGVBQWU7ZUFDeEIsSUFBSSxLQUFLLFVBQVU7ZUFDbkIsSUFBSSxLQUFLLGVBQWU7ZUFDeEIsT0FBTyxDQUFDLFFBQVEsQ0FBQyxXQUFXLENBQUM7ZUFDN0IsT0FBTyxDQUFDLFFBQVEsQ0FBQyxTQUFTLENBQUM7ZUFDM0IsT0FBTyxDQUFDLFFBQVEsQ0FBQyxnQkFBZ0IsQ0FBQztlQUNsQyxPQUFPLENBQUMsUUFBUSxDQUFDLFFBQVEsQ0FBQyxDQUFDO0lBQ2xDLENBQUM7SUFFTyxhQUFhLENBQUMsS0FBYztRQUNsQyxPQUFPLEtBQUssS0FBSyxlQUFNLENBQUMsY0FBYyxJQUFJLEtBQUssS0FBSyxlQUFNLENBQUMscUJBQXFCLENBQUM7SUFDbkYsQ0FBQztJQUVPLFlBQVksQ0FBQyxLQUFhO1FBQ2hDLE9BQU8sS0FBSyxDQUFDLE9BQU8sQ0FBQyxxQkFBcUIsRUFBRSxNQUFNLENBQUMsQ0FBQztJQUN0RCxDQUFDO0NBQ0Y7QUFyWEQsZ0VBcVhDIn0=
447
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiVHVzU3RvcmFnZU1hbmFnZXJEYXRhU3RvcmUuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9zcmMvc3RvcmFnZS9UdXNTdG9yYWdlTWFuYWdlckRhdGFTdG9yZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7QUFBQSw2Q0FBdUM7QUFDdkMsd0NBQXdEO0FBQ3hELDJEQUF3RTtBQUd4RSxNQUFNLHNCQUFzQixHQUFHLENBQUMsR0FBRyxJQUFJLEdBQUcsSUFBSSxDQUFDO0FBQy9DLE1BQU0sdUJBQXVCLEdBQUcsQ0FBQyxDQUFDO0FBZ0NsQyxNQUFhLDBCQUEyQixTQUFRLGtCQUFTO0lBQ3ZDLE9BQU8sQ0FBUztJQUNmLFlBQVksQ0FBUztJQUNyQixJQUFJLENBQWlCO0lBQ3JCLE1BQU0sQ0FBUztJQUNmLE1BQU0sQ0FBYTtJQUNuQiw4QkFBOEIsQ0FBUztJQUN2QyxVQUFVLEdBQUcsSUFBSSxHQUFHLEVBQXlCLENBQUM7SUFFL0QsWUFBbUIsT0FBbUI7UUFDcEMsS0FBSyxFQUFFLENBQUM7UUFDUixJQUFJLENBQUMsT0FBTyxHQUFHLE9BQU8sQ0FBQyxPQUFPLElBQUksc0JBQW1CLENBQUMsYUFBYSxDQUFDO1FBQ3BFLElBQUksQ0FBQyxZQUFZLEdBQUcsT0FBTyxDQUFDLFlBQVksSUFBSSxJQUFJLENBQUMsT0FBTyxDQUFDO1FBQ3pELEtBQUssTUFBTSxLQUFLLElBQUksQ0FBQyxJQUFJLENBQUMsT0FBTyxFQUFFLElBQUksQ0FBQyxZQUFZLENBQUMsRUFBRSxDQUFDO1lBQ3RELElBQUksQ0FBQyxNQUFNLENBQUMsYUFBYSxDQUFDLEtBQUssQ0FBQyxJQUFJLEtBQUssSUFBSSxDQUFDLEVBQUUsQ0FBQztnQkFDL0MsTUFBTSxJQUFJLEtBQUssQ0FBQyw0REFBNEQsQ0FBQyxDQUFDO1lBQ2hGLENBQUM7UUFDSCxDQUFDO1FBQ0QsSUFBSSxDQUFDLElBQUksR0FBRyxPQUFPLENBQUMsSUFBSSxDQUFDO1FBQ3pCLElBQUksQ0FBQyxN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
@@ -0,0 +1,17 @@
1
+ import type { Db } from 'mongodb';
2
+ import type { HarvestHistoryRetentionConfig } from '../config/harvestRuns.config';
3
+ export interface HarvestHistoryRetentionOptions {
4
+ dryRun?: boolean;
5
+ }
6
+ export interface HarvestHistoryRetentionResult {
7
+ enabled: boolean;
8
+ dryRun: boolean;
9
+ runs: number;
10
+ events: number;
11
+ chunks: number;
12
+ successfulCutoff: string;
13
+ failedCutoff: string;
14
+ }
15
+ /** Retain run summaries; remove expired detail in bounded, retryable batches. */
16
+ export declare function pruneHarvestHistory(db: Db, config: HarvestHistoryRetentionConfig, options?: HarvestHistoryRetentionOptions, heartbeat?: () => Promise<unknown>, now?: Date): Promise<HarvestHistoryRetentionResult>;
17
+ //# sourceMappingURL=HarvestHistoryRetention.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"HarvestHistoryRetention.d.ts","sourceRoot":"","sources":["../../src/utilities/HarvestHistoryRetention.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,EAAE,EAAoB,MAAM,SAAS,CAAC;AACpD,OAAO,KAAK,EAAE,6BAA6B,EAAE,MAAM,8BAA8B,CAAC;AAElF,MAAM,WAAW,8BAA8B;IAC7C,MAAM,CAAC,EAAE,OAAO,CAAC;CAClB;AAED,MAAM,WAAW,6BAA6B;IAC5C,OAAO,EAAE,OAAO,CAAC;IACjB,MAAM,EAAE,OAAO,CAAC;IAChB,IAAI,EAAE,MAAM,CAAC;IACb,MAAM,EAAE,MAAM,CAAC;IACf,MAAM,EAAE,MAAM,CAAC;IACf,gBAAgB,EAAE,MAAM,CAAC;IACzB,YAAY,EAAE,MAAM,CAAC;CACtB;AAED,iFAAiF;AACjF,wBAAsB,mBAAmB,CACvC,EAAE,EAAE,EAAE,EACN,MAAM,EAAE,6BAA6B,EACrC,OAAO,GAAE,8BAAmC,EAC5C,SAAS,CAAC,EAAE,MAAM,OAAO,CAAC,OAAO,CAAC,EAClC,GAAG,OAAa,GACf,OAAO,CAAC,6BAA6B,CAAC,CA0IxC"}
@@ -0,0 +1,141 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.pruneHarvestHistory = pruneHarvestHistory;
4
+ /** Retain run summaries; remove expired detail in bounded, retryable batches. */
5
+ async function pruneHarvestHistory(db, config, options = {}, heartbeat, now = new Date()) {
6
+ if (options.dryRun !== undefined && typeof options.dryRun !== 'boolean') {
7
+ throw new Error('Harvest retention dryRun must be a boolean.');
8
+ }
9
+ for (const key of ['successfulDays', 'failedDays', 'batchSize']) {
10
+ if (!Number.isSafeInteger(config[key]) || config[key] < 1) {
11
+ throw new Error(`harvestRuns.retention.${key} must be a positive integer.`);
12
+ }
13
+ }
14
+ if (config.failedDays < config.successfulDays || config.batchSize > 10_000) {
15
+ throw new Error('Harvest retention requires failedDays >= successfulDays and batchSize <= 10000.');
16
+ }
17
+ if (typeof config.enabled !== 'boolean' || !Number.isFinite(now.getTime())) {
18
+ throw new Error('Invalid harvest retention enabled flag or clock.');
19
+ }
20
+ const successfulCutoff = new Date(now.getTime() - config.successfulDays * 86_400_000).toISOString();
21
+ const failedCutoff = new Date(now.getTime() - config.failedDays * 86_400_000).toISOString();
22
+ const result = {
23
+ enabled: config.enabled,
24
+ dryRun: options.dryRun === true,
25
+ runs: 0,
26
+ events: 0,
27
+ chunks: 0,
28
+ successfulCutoff,
29
+ failedCutoff,
30
+ };
31
+ if (!config.enabled)
32
+ return result;
33
+ const runs = db.collection('harvestrun');
34
+ // Missing completion dates and active/stalled runs are deliberately excluded.
35
+ const candidates = {
36
+ status: { $in: ['completed', 'completed_with_errors', 'failed'] },
37
+ completedAt: { $gt: '', $lt: successfulCutoff },
38
+ lastChunkAt: { $not: { $gte: successfulCutoff } },
39
+ 'historyRetention.complete': { $ne: true },
40
+ // Submission and retention claims update this same run document atomically.
41
+ activeSubmissions: { $in: [0, null] },
42
+ };
43
+ // Per-run deletion can exceed the idle cursor timeout. The finally block closes it.
44
+ const cursor = runs.find(candidates, { noCursorTimeout: true }).sort({ completedAt: 1, _id: 1 }).batchSize(100);
45
+ try {
46
+ for await (const run of cursor) {
47
+ await heartbeat?.();
48
+ if (typeof run.brandId !== 'string' || !run.brandId)
49
+ continue;
50
+ const scope = { runId: String(run._id), brandId: run.brandId };
51
+ if (await db.collection('harvestrunchunk').findOne({ ...scope, status: 'processing' }, { projection: { _id: 1 } })) {
52
+ continue;
53
+ }
54
+ const complete = run.completedAt < failedCutoff && (!run.lastChunkAt || run.lastChunkAt < failedCutoff);
55
+ const filters = {
56
+ harvestrecordevent: {
57
+ ...scope,
58
+ $or: [
59
+ { createdAt: { $gt: '', $lt: failedCutoff } },
60
+ {
61
+ createdAt: { $gt: '', $lt: successfulCutoff },
62
+ outcome: { $in: ['created', 'updated', 'deleted', 'unchanged'] },
63
+ },
64
+ ],
65
+ },
66
+ harvestrunchunk: {
67
+ ...scope,
68
+ $or: [
69
+ { submittedAt: { $gt: '', $lt: failedCutoff } },
70
+ { submittedAt: { $gt: '', $lt: successfulCutoff }, status: 'processed', failed: 0 },
71
+ ],
72
+ },
73
+ };
74
+ const expiringEvent = await db
75
+ .collection('harvestrecordevent')
76
+ .findOne(filters.harvestrecordevent, { projection: { _id: 1 } });
77
+ const expiringChunk = await db
78
+ .collection('harvestrunchunk')
79
+ .findOne(filters.harvestrunchunk, { projection: { _id: 1 } });
80
+ if (!expiringEvent && !expiringChunk) {
81
+ if (!result.dryRun &&
82
+ complete &&
83
+ run.historyRetention &&
84
+ !(await db.collection('harvestrecordevent').findOne(scope, { projection: { _id: 1 } })) &&
85
+ !(await db.collection('harvestrunchunk').findOne(scope, { projection: { _id: 1 } }))) {
86
+ await runs.updateOne({ _id: run._id }, { $set: { 'historyRetention.complete': true } });
87
+ }
88
+ continue;
89
+ }
90
+ if (!result.dryRun) {
91
+ // Mark before deleting, so partial failures still disclose lost history and
92
+ // prevent future submissions from using an incomplete deduplication ledger.
93
+ const claim = await runs.updateOne({ _id: run._id, ...candidates }, {
94
+ $set: {
95
+ historyRetention: {
96
+ prunedAt: now.toISOString(),
97
+ successfulDays: config.successfulDays,
98
+ failedDays: config.failedDays,
99
+ complete: false,
100
+ },
101
+ },
102
+ });
103
+ if (claim.matchedCount === 0)
104
+ continue;
105
+ }
106
+ result.runs++;
107
+ for (const name of ['harvestrecordevent', 'harvestrunchunk']) {
108
+ const collection = db.collection(name);
109
+ const counter = name === 'harvestrecordevent' ? 'events' : 'chunks';
110
+ if (result.dryRun) {
111
+ result[counter] += await collection.countDocuments(filters[name]);
112
+ continue;
113
+ }
114
+ while (true) {
115
+ const batch = await collection
116
+ .find(filters[name], { projection: { _id: 1 } })
117
+ .limit(config.batchSize)
118
+ .toArray();
119
+ if (batch.length === 0)
120
+ break;
121
+ const deleted = await collection.deleteMany({ ...scope, _id: { $in: batch.map(row => row._id) } });
122
+ result[counter] += deleted.deletedCount;
123
+ await heartbeat?.();
124
+ }
125
+ }
126
+ if (!result.dryRun && complete) {
127
+ // Only skip future sweeps when nothing remains (including missing dates).
128
+ const remainingEvent = await db.collection('harvestrecordevent').findOne(scope, { projection: { _id: 1 } });
129
+ const remainingChunk = await db.collection('harvestrunchunk').findOne(scope, { projection: { _id: 1 } });
130
+ if (!remainingEvent && !remainingChunk) {
131
+ await runs.updateOne({ _id: run._id }, { $set: { 'historyRetention.complete': true } });
132
+ }
133
+ }
134
+ }
135
+ }
136
+ finally {
137
+ await cursor.close();
138
+ }
139
+ return result;
140
+ }
141
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiSGFydmVzdEhpc3RvcnlSZXRlbnRpb24uanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9zcmMvdXRpbGl0aWVzL0hhcnZlc3RIaXN0b3J5UmV0ZW50aW9uLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7O0FBa0JBLGtEQWdKQztBQWpKRCxpRkFBaUY7QUFDMUUsS0FBSyxVQUFVLG1CQUFtQixDQUN2QyxFQUFNLEVBQ04sTUFBcUMsRUFDckMsVUFBMEMsRUFBRSxFQUM1QyxTQUFrQyxFQUNsQyxHQUFHLEdBQUcsSUFBSSxJQUFJLEVBQUU7SUFFaEIsSUFBSSxPQUFPLENBQUMsTUFBTSxLQUFLLFNBQVMsSUFBSSxPQUFPLE9BQU8sQ0FBQyxNQUFNLEtBQUssU0FBUyxFQUFFLENBQUM7UUFDeEUsTUFBTSxJQUFJLEtBQUssQ0FBQyw2Q0FBNkMsQ0FBQyxDQUFDO0lBQ2pFLENBQUM7SUFDRCxLQUFLLE1BQU0sR0FBRyxJQUFJLENBQUMsZ0JBQWdCLEVBQUUsWUFBWSxFQUFFLFdBQVcsQ0FBVSxFQUFFLENBQUM7UUFDekUsSUFBSSxDQUFDLE1BQU0sQ0FBQyxhQUFhLENBQUMsTUFBTSxDQUFDLEdBQUcsQ0FBQyxDQUFDLElBQUksTUFBTSxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDO1lBQzFELE1BQU0sSUFBSSxLQUFLLENBQUMseUJBQXlCLEdBQUcsOEJBQThCLENBQUMsQ0FBQztRQUM5RSxDQUFDO0lBQ0gsQ0FBQztJQUNELElBQUksTUFBTSxDQUFDLFVBQVUsR0FBRyxNQUFNLENBQUMsY0FBYyxJQUFJLE1BQU0sQ0FBQyxTQUFTLEdBQUcsTUFBTSxFQUFFLENBQUM7UUFDM0UsTUFBTSxJQUFJLEtBQUssQ0FBQyxpRkFBaUYsQ0FBQyxDQUFDO0lBQ3JHLENBQUM7SUFDRCxJQUFJLE9BQU8sTUFBTSxDQUFDLE9BQU8sS0FBSyxTQUFTLElBQUksQ0FBQyxNQUFNLENBQUMsUUFBUSxDQUFDLEdBQUcsQ0FBQyxPQUFPLEVBQUUs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
@@ -0,0 +1,12 @@
1
+ import type { Db, IndexDescription } from 'mongodb';
2
+ export declare const HARVEST_RUN_INDEXES: IndexDescription[];
3
+ export declare const HARVEST_CHUNK_INDEXES: IndexDescription[];
4
+ export declare const HARVEST_EVENT_INDEXES: IndexDescription[];
5
+ /** Read-only deployment check. Never repairs data or changes indexes. */
6
+ export declare function preflightHarvestRunIndexes(db: Db): Promise<string[]>;
7
+ /**
8
+ * Create the required harvest indexes without replacing existing definitions.
9
+ * Repeated calls are safe; duplicates and conflicting options reject startup.
10
+ */
11
+ export declare function ensureHarvestRunIndexes(db: Db): Promise<void>;
12
+ //# sourceMappingURL=HarvestRunIndexes.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"HarvestRunIndexes.d.ts","sourceRoot":"","sources":["../../src/utilities/HarvestRunIndexes.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,EAAE,EAAE,gBAAgB,EAAE,MAAM,SAAS,CAAC;AAIpD,eAAO,MAAM,mBAAmB,EAAE,gBAAgB,EAMjD,CAAC;AAEF,eAAO,MAAM,qBAAqB,EAAE,gBAAgB,EAKnD,CAAC;AAEF,eAAO,MAAM,qBAAqB,EAAE,gBAAgB,EAQnD,CAAC;AAEF,yEAAyE;AACzE,wBAAsB,0BAA0B,CAAC,EAAE,EAAE,EAAE,GAAG,OAAO,CAAC,MAAM,EAAE,CAAC,CA4C1E;AAED;;;GAGG;AACH,wBAAsB,uBAAuB,CAAC,EAAE,EAAE,EAAE,GAAG,OAAO,CAAC,IAAI,CAAC,CAMnE"}