@researchdatabox/redbox-core 5.0.3 → 5.0.4-beta.12498

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 (546) hide show
  1. package/dist/AttachmentStagingIdentity.d.ts +3 -0
  2. package/dist/AttachmentStagingIdentity.d.ts.map +1 -0
  3. package/dist/AttachmentStagingIdentity.js +10 -0
  4. package/dist/CoreController.d.ts +7 -3
  5. package/dist/CoreController.d.ts.map +1 -1
  6. package/dist/CoreController.js +85 -3
  7. package/dist/DatastreamService.d.ts +4 -0
  8. package/dist/DatastreamService.d.ts.map +1 -1
  9. package/dist/HarvestRunService.d.ts +4 -3
  10. package/dist/HarvestRunService.d.ts.map +1 -1
  11. package/dist/HarvestRunService.js +1 -1
  12. package/dist/RecordConcurrencyObservability.d.ts +51 -0
  13. package/dist/RecordConcurrencyObservability.d.ts.map +1 -0
  14. package/dist/RecordConcurrencyObservability.js +136 -0
  15. package/dist/RecordEntityTag.d.ts +31 -0
  16. package/dist/RecordEntityTag.d.ts.map +1 -0
  17. package/dist/RecordEntityTag.js +101 -0
  18. package/dist/RecordFormFingerprint.d.ts +7 -0
  19. package/dist/RecordFormFingerprint.d.ts.map +1 -0
  20. package/dist/RecordFormFingerprint.js +106 -0
  21. package/dist/RecordHttpConcurrency.d.ts +60 -0
  22. package/dist/RecordHttpConcurrency.d.ts.map +1 -0
  23. package/dist/RecordHttpConcurrency.js +181 -0
  24. package/dist/RecordSaveResponse.d.ts +219 -0
  25. package/dist/RecordSaveResponse.d.ts.map +1 -0
  26. package/dist/RecordSaveResponse.js +639 -0
  27. package/dist/RecordStorageConcurrency.d.ts +48 -0
  28. package/dist/RecordStorageConcurrency.d.ts.map +1 -0
  29. package/dist/RecordStorageConcurrency.js +103 -0
  30. package/dist/RecordWriteClassification.d.ts +12 -0
  31. package/dist/RecordWriteClassification.d.ts.map +1 -0
  32. package/dist/RecordWriteClassification.js +70 -0
  33. package/dist/RecordsService.d.ts +105 -12
  34. package/dist/RecordsService.d.ts.map +1 -1
  35. package/dist/RecordsService.js +44 -1
  36. package/dist/SearchService.d.ts +2 -1
  37. package/dist/SearchService.d.ts.map +1 -1
  38. package/dist/StorageService.d.ts +48 -8
  39. package/dist/StorageService.d.ts.map +1 -1
  40. package/dist/StorageService.js +19 -1
  41. package/dist/StorageServiceResponse.d.ts +22 -1
  42. package/dist/StorageServiceResponse.d.ts.map +1 -1
  43. package/dist/StorageServiceResponse.js +22 -4
  44. package/dist/action-execution/audit.d.ts +41 -0
  45. package/dist/action-execution/audit.d.ts.map +1 -0
  46. package/dist/action-execution/audit.js +122 -0
  47. package/dist/action-execution/executor.d.ts +24 -0
  48. package/dist/action-execution/executor.d.ts.map +1 -0
  49. package/dist/action-execution/executor.js +435 -0
  50. package/dist/action-execution/failure.d.ts +49 -0
  51. package/dist/action-execution/failure.d.ts.map +1 -0
  52. package/dist/action-execution/failure.js +129 -0
  53. package/dist/action-execution/index.d.ts +7 -0
  54. package/dist/action-execution/index.d.ts.map +1 -0
  55. package/dist/action-execution/index.js +23 -0
  56. package/dist/action-execution/legacy-result.d.ts +21 -0
  57. package/dist/action-execution/legacy-result.d.ts.map +1 -0
  58. package/dist/action-execution/legacy-result.js +70 -0
  59. package/dist/action-execution/policy.d.ts +12 -0
  60. package/dist/action-execution/policy.d.ts.map +1 -0
  61. package/dist/action-execution/policy.js +138 -0
  62. package/dist/action-execution/types.d.ts +121 -0
  63. package/dist/action-execution/types.d.ts.map +1 -0
  64. package/dist/action-execution/types.js +22 -0
  65. package/dist/api-routes/groups/branding.d.ts +8 -0
  66. package/dist/api-routes/groups/branding.d.ts.map +1 -1
  67. package/dist/api-routes/groups/branding.js +86 -11
  68. package/dist/api-routes/groups/dashboard-config.d.ts +12 -9
  69. package/dist/api-routes/groups/dashboard-config.d.ts.map +1 -1
  70. package/dist/api-routes/groups/dashboard-config.js +136 -73
  71. package/dist/api-routes/groups/forms.d.ts.map +1 -1
  72. package/dist/api-routes/groups/forms.js +10 -2
  73. package/dist/api-routes/groups/record-schemas.d.ts +5 -0
  74. package/dist/api-routes/groups/record-schemas.d.ts.map +1 -0
  75. package/dist/api-routes/groups/record-schemas.js +181 -0
  76. package/dist/api-routes/groups/records.d.ts +1 -0
  77. package/dist/api-routes/groups/records.d.ts.map +1 -1
  78. package/dist/api-routes/groups/records.js +141 -26
  79. package/dist/api-routes/index.d.ts +3 -0
  80. package/dist/api-routes/index.d.ts.map +1 -1
  81. package/dist/api-routes/index.js +4 -1
  82. package/dist/api-routes/openapi.d.ts.map +1 -1
  83. package/dist/api-routes/openapi.js +7 -5
  84. package/dist/api-routes/record-schema-openapi.d.ts +26 -0
  85. package/dist/api-routes/record-schema-openapi.d.ts.map +1 -0
  86. package/dist/api-routes/record-schema-openapi.js +38 -0
  87. package/dist/api-routes/record-schema-response.d.ts +40 -0
  88. package/dist/api-routes/record-schema-response.d.ts.map +1 -0
  89. package/dist/api-routes/record-schema-response.js +89 -0
  90. package/dist/api-routes/request-extraction.d.ts.map +1 -1
  91. package/dist/api-routes/request-extraction.js +10 -8
  92. package/dist/api-routes/route-factory.d.ts.map +1 -1
  93. package/dist/api-routes/route-factory.js +2 -1
  94. package/dist/api-routes/route-registry.d.ts.map +1 -1
  95. package/dist/api-routes/route-registry.js +3 -1
  96. package/dist/api-routes/schemas/common.d.ts +36 -0
  97. package/dist/api-routes/schemas/common.d.ts.map +1 -1
  98. package/dist/api-routes/schemas/common.js +95 -5
  99. package/dist/api-routes/schemas/responses.d.ts +1424 -1
  100. package/dist/api-routes/schemas/responses.d.ts.map +1 -1
  101. package/dist/api-routes/schemas/responses.js +382 -60
  102. package/dist/api-routes/types.d.ts +1 -0
  103. package/dist/api-routes/types.d.ts.map +1 -1
  104. package/dist/api-routes/validation.d.ts +5 -1
  105. package/dist/api-routes/validation.d.ts.map +1 -1
  106. package/dist/api-routes/validation.js +14 -15
  107. package/dist/bootstrap.d.ts +3 -1
  108. package/dist/bootstrap.d.ts.map +1 -1
  109. package/dist/bootstrap.js +58 -41
  110. package/dist/config/agendaQueue.config.d.ts +3 -0
  111. package/dist/config/agendaQueue.config.d.ts.map +1 -1
  112. package/dist/config/agendaQueue.config.js +29 -2
  113. package/dist/config/branding.config.d.ts +13 -0
  114. package/dist/config/branding.config.d.ts.map +1 -1
  115. package/dist/config/branding.config.js +34 -2
  116. package/dist/config/brandingConfigurationDefaults.config.d.ts +4 -0
  117. package/dist/config/brandingConfigurationDefaults.config.d.ts.map +1 -1
  118. package/dist/config/brandingConfigurationDefaults.config.js +42 -3
  119. package/dist/config/index.d.ts +12 -4
  120. package/dist/config/index.d.ts.map +1 -1
  121. package/dist/config/index.js +7 -4
  122. package/dist/config/policies.config.d.ts.map +1 -1
  123. package/dist/config/policies.config.js +37 -23
  124. package/dist/config/raid.config.d.ts +7 -4
  125. package/dist/config/raid.config.d.ts.map +1 -1
  126. package/dist/config/raid.config.js +21 -35
  127. package/dist/config/record.config.d.ts +3 -0
  128. package/dist/config/record.config.d.ts.map +1 -1
  129. package/dist/config/record.config.js +37 -35
  130. package/dist/config/recordSchema.config.d.ts +68 -0
  131. package/dist/config/recordSchema.config.d.ts.map +1 -0
  132. package/dist/config/recordSchema.config.js +173 -0
  133. package/dist/config/recordValidation.config.d.ts +19 -0
  134. package/dist/config/recordValidation.config.d.ts.map +1 -0
  135. package/dist/config/recordValidation.config.js +10 -0
  136. package/dist/config/recordtype.config.d.ts +32 -9
  137. package/dist/config/recordtype.config.d.ts.map +1 -1
  138. package/dist/config/recordtype.config.js +4 -7
  139. package/dist/config/routes.config.d.ts.map +1 -1
  140. package/dist/config/routes.config.js +135 -53
  141. package/dist/config/workflow.config.d.ts +6 -0
  142. package/dist/config/workflow.config.d.ts.map +1 -1
  143. package/dist/config/workflow.config.js +1 -1
  144. package/dist/configmodels/AdminSidebarConfig.d.ts.map +1 -1
  145. package/dist/configmodels/AdminSidebarConfig.js +4 -2
  146. package/dist/configmodels/ConfigModels.d.ts +1 -1
  147. package/dist/configmodels/ConfigModels.d.ts.map +1 -1
  148. package/dist/configmodels/ConfigModels.js +26 -9
  149. package/dist/configmodels/DashboardFieldCatalogue.d.ts +67 -0
  150. package/dist/configmodels/DashboardFieldCatalogue.d.ts.map +1 -0
  151. package/dist/configmodels/DashboardFieldCatalogue.js +174 -0
  152. package/dist/configmodels/DashboardSettings.d.ts +191 -0
  153. package/dist/configmodels/DashboardSettings.d.ts.map +1 -0
  154. package/dist/configmodels/DashboardSettings.js +705 -0
  155. package/dist/configmodels/OniPublishing.d.ts +205 -0
  156. package/dist/configmodels/OniPublishing.d.ts.map +1 -0
  157. package/dist/configmodels/OniPublishing.js +335 -0
  158. package/dist/configmodels/RaidPublishing.d.ts +97 -0
  159. package/dist/configmodels/RaidPublishing.d.ts.map +1 -0
  160. package/dist/configmodels/RaidPublishing.js +35 -0
  161. package/dist/configmodels/WebAnalytics.d.ts +55 -0
  162. package/dist/configmodels/WebAnalytics.d.ts.map +1 -0
  163. package/dist/configmodels/WebAnalytics.js +61 -0
  164. package/dist/controllers/AppConfigController.d.ts.map +1 -1
  165. package/dist/controllers/AppConfigController.js +4 -1
  166. package/dist/controllers/BrandingAppController.d.ts +29 -7
  167. package/dist/controllers/BrandingAppController.d.ts.map +1 -1
  168. package/dist/controllers/BrandingAppController.js +265 -69
  169. package/dist/controllers/BrandingController.d.ts +24 -1
  170. package/dist/controllers/BrandingController.d.ts.map +1 -1
  171. package/dist/controllers/BrandingController.js +173 -43
  172. package/dist/controllers/BrandingControllerSupport.d.ts +20 -0
  173. package/dist/controllers/BrandingControllerSupport.d.ts.map +1 -0
  174. package/dist/controllers/BrandingControllerSupport.js +80 -0
  175. package/dist/controllers/DashboardConfigController.d.ts +6 -2
  176. package/dist/controllers/DashboardConfigController.d.ts.map +1 -1
  177. package/dist/controllers/DashboardConfigController.js +18 -4
  178. package/dist/controllers/DynamicAssetController.d.ts +7 -5
  179. package/dist/controllers/DynamicAssetController.d.ts.map +1 -1
  180. package/dist/controllers/DynamicAssetController.js +21 -12
  181. package/dist/controllers/RecordController.d.ts +45 -4
  182. package/dist/controllers/RecordController.d.ts.map +1 -1
  183. package/dist/controllers/RecordController.js +778 -345
  184. package/dist/controllers/index.d.ts.map +1 -1
  185. package/dist/controllers/index.js +4 -1
  186. package/dist/controllers/webservice/AdminController.d.ts.map +1 -1
  187. package/dist/controllers/webservice/AdminController.js +4 -3
  188. package/dist/controllers/webservice/BrandingController.d.ts +26 -1
  189. package/dist/controllers/webservice/BrandingController.d.ts.map +1 -1
  190. package/dist/controllers/webservice/BrandingController.js +292 -116
  191. package/dist/controllers/webservice/DashboardConfigController.d.ts +25 -17
  192. package/dist/controllers/webservice/DashboardConfigController.d.ts.map +1 -1
  193. package/dist/controllers/webservice/DashboardConfigController.js +90 -205
  194. package/dist/controllers/webservice/FormManagementController.d.ts.map +1 -1
  195. package/dist/controllers/webservice/FormManagementController.js +37 -3
  196. package/dist/controllers/webservice/RecordController.d.ts +15 -1
  197. package/dist/controllers/webservice/RecordController.d.ts.map +1 -1
  198. package/dist/controllers/webservice/RecordController.js +647 -267
  199. package/dist/controllers/webservice/RecordSchemaController.d.ts +32 -0
  200. package/dist/controllers/webservice/RecordSchemaController.d.ts.map +1 -0
  201. package/dist/controllers/webservice/RecordSchemaController.js +356 -0
  202. package/dist/controllers/webservice/RecordTypeController.d.ts +6 -1
  203. package/dist/controllers/webservice/RecordTypeController.d.ts.map +1 -1
  204. package/dist/controllers/webservice/RecordTypeController.js +21 -3
  205. package/dist/controllers/webservice/SearchController.d.ts.map +1 -1
  206. package/dist/controllers/webservice/SearchController.js +7 -3
  207. package/dist/hooks/defineRedboxHook.d.ts +3 -0
  208. package/dist/hooks/defineRedboxHook.d.ts.map +1 -1
  209. package/dist/hooks/defineRedboxHook.js +4 -1
  210. package/dist/index.d.ts +50 -23
  211. package/dist/index.d.ts.map +1 -1
  212. package/dist/index.js +90 -2
  213. package/dist/loader/bootstrapShimRuntime.d.ts +1 -1
  214. package/dist/loader/bootstrapShimRuntime.d.ts.map +1 -1
  215. package/dist/loader/bootstrapShimRuntime.js +20 -12
  216. package/dist/loader/index.d.ts +9 -0
  217. package/dist/loader/index.d.ts.map +1 -1
  218. package/dist/loader/index.js +93 -4
  219. package/dist/model/BrandingTypeface.d.ts +70 -0
  220. package/dist/model/BrandingTypeface.d.ts.map +1 -0
  221. package/dist/model/BrandingTypeface.js +116 -0
  222. package/dist/model/BuildResponse.d.ts +25 -11
  223. package/dist/model/BuildResponse.d.ts.map +1 -1
  224. package/dist/model/BuildResponse.js +4 -3
  225. package/dist/model/DashboardTypeResponseModel.d.ts +6 -0
  226. package/dist/model/DashboardTypeResponseModel.d.ts.map +1 -1
  227. package/dist/model/DashboardTypeResponseModel.js +7 -1
  228. package/dist/model/DashboardViewResponseModel.d.ts +5 -1
  229. package/dist/model/DashboardViewResponseModel.d.ts.map +1 -1
  230. package/dist/model/DashboardViewResponseModel.js +6 -3
  231. package/dist/model/RBValidationError.d.ts +17 -0
  232. package/dist/model/RBValidationError.d.ts.map +1 -1
  233. package/dist/model/RBValidationError.js +37 -1
  234. package/dist/model/RecordTypeResponseModel.d.ts +12 -4
  235. package/dist/model/RecordTypeResponseModel.d.ts.map +1 -1
  236. package/dist/model/RecordTypeResponseModel.js +11 -2
  237. package/dist/model/index.d.ts +5 -1
  238. package/dist/model/index.d.ts.map +1 -1
  239. package/dist/model/index.js +5 -2
  240. package/dist/model/record-contract.d.ts +42 -0
  241. package/dist/model/record-contract.d.ts.map +1 -0
  242. package/dist/model/record-contract.js +3 -0
  243. package/dist/model/storage/BrandingModel.d.ts +7 -0
  244. package/dist/model/storage/BrandingModel.d.ts.map +1 -1
  245. package/dist/model/storage/BrandingModel.js +7 -1
  246. package/dist/model/storage/DeletedRecordModel.d.ts +35 -0
  247. package/dist/model/storage/DeletedRecordModel.d.ts.map +1 -1
  248. package/dist/model/storage/DeletedRecordModel.js +62 -1
  249. package/dist/model/storage/IntegrationAuditModel.d.ts +16 -2
  250. package/dist/model/storage/IntegrationAuditModel.d.ts.map +1 -1
  251. package/dist/model/storage/IntegrationAuditModel.js +15 -1
  252. package/dist/model/storage/RecordAuditModel.d.ts +11 -1
  253. package/dist/model/storage/RecordAuditModel.d.ts.map +1 -1
  254. package/dist/model/storage/RecordAuditModel.js +8 -2
  255. package/dist/model/storage/RecordModel.d.ts +6 -0
  256. package/dist/model/storage/RecordModel.d.ts.map +1 -1
  257. package/dist/model/storage/RecordTypeModel.d.ts +6 -0
  258. package/dist/model/storage/RecordTypeModel.d.ts.map +1 -1
  259. package/dist/model/storage/RecordTypeModel.js +4 -1
  260. package/dist/model/storage/index.d.ts +12 -10
  261. package/dist/model/storage/index.d.ts.map +1 -1
  262. package/dist/model/storage/index.js +24 -2
  263. package/dist/model/storage/record-schema.d.ts +115 -0
  264. package/dist/model/storage/record-schema.d.ts.map +1 -0
  265. package/dist/model/storage/record-schema.js +3 -0
  266. package/dist/policies/checkAuth.d.ts +2 -6
  267. package/dist/policies/checkAuth.d.ts.map +1 -1
  268. package/dist/policies/checkAuth.js +32 -9
  269. package/dist/policies/contentSecurityPolicy.d.ts.map +1 -1
  270. package/dist/policies/contentSecurityPolicy.js +85 -2
  271. package/dist/policies/index.d.ts +3 -2
  272. package/dist/policies/index.d.ts.map +1 -1
  273. package/dist/policies/index.js +4 -2
  274. package/dist/policies/validateApiContractRequest.d.ts.map +1 -1
  275. package/dist/policies/validateApiContractRequest.js +49 -11
  276. package/dist/record-contract/ajv-error-mapper.d.ts +34 -0
  277. package/dist/record-contract/ajv-error-mapper.d.ts.map +1 -0
  278. package/dist/record-contract/ajv-error-mapper.js +153 -0
  279. package/dist/record-contract/canonical-json.d.ts +20 -0
  280. package/dist/record-contract/canonical-json.d.ts.map +1 -0
  281. package/dist/record-contract/canonical-json.js +126 -0
  282. package/dist/record-contract/codes.d.ts +36 -0
  283. package/dist/record-contract/codes.d.ts.map +1 -0
  284. package/dist/record-contract/codes.js +38 -0
  285. package/dist/record-contract/contributor-registry.d.ts +76 -0
  286. package/dist/record-contract/contributor-registry.d.ts.map +1 -0
  287. package/dist/record-contract/contributor-registry.js +126 -0
  288. package/dist/record-contract/core-contributors.d.ts +44 -0
  289. package/dist/record-contract/core-contributors.d.ts.map +1 -0
  290. package/dist/record-contract/core-contributors.js +395 -0
  291. package/dist/record-contract/deep-freeze.d.ts +3 -0
  292. package/dist/record-contract/deep-freeze.d.ts.map +1 -0
  293. package/dist/record-contract/deep-freeze.js +23 -0
  294. package/dist/record-contract/index.d.ts +13 -0
  295. package/dist/record-contract/index.d.ts.map +1 -0
  296. package/dist/record-contract/index.js +29 -0
  297. package/dist/record-contract/json-pointer.d.ts +20 -0
  298. package/dist/record-contract/json-pointer.d.ts.map +1 -0
  299. package/dist/record-contract/json-pointer.js +70 -0
  300. package/dist/record-contract/json-schema-renderer.d.ts +51 -0
  301. package/dist/record-contract/json-schema-renderer.d.ts.map +1 -0
  302. package/dist/record-contract/json-schema-renderer.js +450 -0
  303. package/dist/record-contract/record-contract-compiler.d.ts +42 -0
  304. package/dist/record-contract/record-contract-compiler.d.ts.map +1 -0
  305. package/dist/record-contract/record-contract-compiler.js +775 -0
  306. package/dist/record-contract/record-contract-context.d.ts +91 -0
  307. package/dist/record-contract/record-contract-context.d.ts.map +1 -0
  308. package/dist/record-contract/record-contract-context.js +39 -0
  309. package/dist/record-contract/record-json-schema-artifact.d.ts +74 -0
  310. package/dist/record-contract/record-json-schema-artifact.d.ts.map +1 -0
  311. package/dist/record-contract/record-json-schema-artifact.js +309 -0
  312. package/dist/record-contract/record-json-schema-etag.d.ts +15 -0
  313. package/dist/record-contract/record-json-schema-etag.d.ts.map +1 -0
  314. package/dist/record-contract/record-json-schema-etag.js +41 -0
  315. package/dist/record-contract/types.d.ts +151 -0
  316. package/dist/record-contract/types.d.ts.map +1 -0
  317. package/dist/record-contract/types.js +6 -0
  318. package/dist/services/AppConfigService.d.ts +6 -0
  319. package/dist/services/AppConfigService.d.ts.map +1 -1
  320. package/dist/services/AppConfigService.js +23 -1
  321. package/dist/services/AttachmentMetadataService.d.ts +58 -0
  322. package/dist/services/AttachmentMetadataService.d.ts.map +1 -1
  323. package/dist/services/AttachmentMetadataService.js +643 -8
  324. package/dist/services/BrandingLogoService.d.ts +6 -1
  325. package/dist/services/BrandingLogoService.d.ts.map +1 -1
  326. package/dist/services/BrandingLogoService.js +77 -9
  327. package/dist/services/BrandingService.d.ts +171 -9
  328. package/dist/services/BrandingService.d.ts.map +1 -1
  329. package/dist/services/BrandingService.js +572 -68
  330. package/dist/services/BrandingThemeCssService.d.ts +17 -1
  331. package/dist/services/BrandingThemeCssService.d.ts.map +1 -1
  332. package/dist/services/BrandingThemeCssService.js +71 -9
  333. package/dist/services/BrandingTypefaceService.d.ts +74 -0
  334. package/dist/services/BrandingTypefaceService.d.ts.map +1 -0
  335. package/dist/services/BrandingTypefaceService.js +359 -0
  336. package/dist/services/BrandingWoff2Inspector.d.ts +17 -0
  337. package/dist/services/BrandingWoff2Inspector.d.ts.map +1 -0
  338. package/dist/services/BrandingWoff2Inspector.js +402 -0
  339. package/dist/services/DashboardConfigService.d.ts +214 -54
  340. package/dist/services/DashboardConfigService.d.ts.map +1 -1
  341. package/dist/services/DashboardConfigService.js +829 -261
  342. package/dist/services/DashboardLegacyConversion.d.ts +82 -0
  343. package/dist/services/DashboardLegacyConversion.d.ts.map +1 -0
  344. package/dist/services/DashboardLegacyConversion.js +427 -0
  345. package/dist/services/DashboardTypesService.d.ts +15 -4
  346. package/dist/services/DashboardTypesService.d.ts.map +1 -1
  347. package/dist/services/DashboardTypesService.js +72 -139
  348. package/dist/services/DoiService.d.ts +1 -1
  349. package/dist/services/DoiService.d.ts.map +1 -1
  350. package/dist/services/DoiService.js +71 -45
  351. package/dist/services/FigshareService.d.ts +1 -1
  352. package/dist/services/FigshareService.d.ts.map +1 -1
  353. package/dist/services/FigshareService.js +73 -32
  354. package/dist/services/FormRecordConsistencyService.d.ts +8 -23
  355. package/dist/services/FormRecordConsistencyService.d.ts.map +1 -1
  356. package/dist/services/FormRecordConsistencyService.js +54 -70
  357. package/dist/services/FormsService.d.ts +91 -2
  358. package/dist/services/FormsService.d.ts.map +1 -1
  359. package/dist/services/FormsService.js +324 -64
  360. package/dist/services/HarvestRunService.d.ts +6 -3
  361. package/dist/services/HarvestRunService.d.ts.map +1 -1
  362. package/dist/services/HarvestRunService.js +161 -97
  363. package/dist/services/I18nEntriesService.d.ts +1 -0
  364. package/dist/services/I18nEntriesService.d.ts.map +1 -1
  365. package/dist/services/I18nEntriesService.js +26 -6
  366. package/dist/services/OniService.d.ts +19 -62
  367. package/dist/services/OniService.d.ts.map +1 -1
  368. package/dist/services/OniService.js +223 -691
  369. package/dist/services/RDMPService.d.ts +1 -1
  370. package/dist/services/RDMPService.d.ts.map +1 -1
  371. package/dist/services/RDMPService.js +5 -5
  372. package/dist/services/RaidService.d.ts +19 -61
  373. package/dist/services/RaidService.d.ts.map +1 -1
  374. package/dist/services/RaidService.js +191 -530
  375. package/dist/services/RecordSchemaService.d.ts +440 -0
  376. package/dist/services/RecordSchemaService.d.ts.map +1 -0
  377. package/dist/services/RecordSchemaService.js +3061 -0
  378. package/dist/services/RecordTypesService.d.ts +29 -0
  379. package/dist/services/RecordTypesService.d.ts.map +1 -1
  380. package/dist/services/RecordTypesService.js +106 -11
  381. package/dist/services/RecordValidationService.d.ts +340 -0
  382. package/dist/services/RecordValidationService.d.ts.map +1 -0
  383. package/dist/services/RecordValidationService.js +1898 -0
  384. package/dist/services/RecordsService.d.ts +313 -22
  385. package/dist/services/RecordsService.d.ts.map +1 -1
  386. package/dist/services/RecordsService.js +4948 -509
  387. package/dist/services/SolrSearchService.d.ts +1 -1
  388. package/dist/services/SolrSearchService.d.ts.map +1 -1
  389. package/dist/services/SolrSearchService.js +42 -12
  390. package/dist/services/StandardDatastreamService.d.ts +4 -0
  391. package/dist/services/StandardDatastreamService.d.ts.map +1 -1
  392. package/dist/services/StandardDatastreamService.js +106 -44
  393. package/dist/services/TriggerService.d.ts.map +1 -1
  394. package/dist/services/TriggerService.js +54 -30
  395. package/dist/services/UsersService.d.ts +2 -1
  396. package/dist/services/UsersService.d.ts.map +1 -1
  397. package/dist/services/UsersService.js +364 -283
  398. package/dist/services/VocabularyService.d.ts +2 -0
  399. package/dist/services/VocabularyService.d.ts.map +1 -1
  400. package/dist/services/VocabularyService.js +61 -2
  401. package/dist/services/WorkflowStepsService.d.ts +11 -0
  402. package/dist/services/WorkflowStepsService.d.ts.map +1 -1
  403. package/dist/services/WorkflowStepsService.js +32 -3
  404. package/dist/services/WorkspaceService.d.ts +2 -2
  405. package/dist/services/WorkspaceService.d.ts.map +1 -1
  406. package/dist/services/WorkspaceService.js +5 -5
  407. package/dist/services/doi-v2/bindings.d.ts.map +1 -1
  408. package/dist/services/doi-v2/bindings.js +3 -20
  409. package/dist/services/doi-v2/config.d.ts +1 -0
  410. package/dist/services/doi-v2/config.d.ts.map +1 -1
  411. package/dist/services/doi-v2/config.js +13 -5
  412. package/dist/services/doi-v2/runtime.d.ts.map +1 -1
  413. package/dist/services/doi-v2/runtime.js +14 -54
  414. package/dist/services/figshare-v2/bindings.d.ts.map +1 -1
  415. package/dist/services/figshare-v2/bindings.js +3 -20
  416. package/dist/services/figshare-v2/runtime.d.ts.map +1 -1
  417. package/dist/services/figshare-v2/runtime.js +11 -58
  418. package/dist/services/form-record-access-user.d.ts +3 -0
  419. package/dist/services/form-record-access-user.d.ts.map +1 -0
  420. package/dist/services/form-record-access-user.js +23 -0
  421. package/dist/services/index.d.ts +9 -0
  422. package/dist/services/index.d.ts.map +1 -1
  423. package/dist/services/index.js +45 -3
  424. package/dist/services/integration-v2/bindings.d.ts +3 -0
  425. package/dist/services/integration-v2/bindings.d.ts.map +1 -0
  426. package/dist/services/integration-v2/bindings.js +91 -0
  427. package/dist/services/integration-v2/runtime.d.ts +3 -0
  428. package/dist/services/integration-v2/runtime.d.ts.map +1 -0
  429. package/dist/services/integration-v2/runtime.js +50 -0
  430. package/dist/services/internal-record-schema-authorization.d.ts +8 -0
  431. package/dist/services/internal-record-schema-authorization.d.ts.map +1 -0
  432. package/dist/services/internal-record-schema-authorization.js +16 -0
  433. package/dist/services/oni-v2/audit.d.ts +19 -0
  434. package/dist/services/oni-v2/audit.d.ts.map +1 -0
  435. package/dist/services/oni-v2/audit.js +50 -0
  436. package/dist/services/oni-v2/bindings.d.ts +7 -0
  437. package/dist/services/oni-v2/bindings.d.ts.map +1 -0
  438. package/dist/services/oni-v2/bindings.js +31 -0
  439. package/dist/services/oni-v2/config.d.ts +12 -0
  440. package/dist/services/oni-v2/config.d.ts.map +1 -0
  441. package/dist/services/oni-v2/config.js +134 -0
  442. package/dist/services/oni-v2/context.d.ts +3 -0
  443. package/dist/services/oni-v2/context.d.ts.map +1 -0
  444. package/dist/services/oni-v2/context.js +17 -0
  445. package/dist/services/oni-v2/crate.d.ts +17 -0
  446. package/dist/services/oni-v2/crate.d.ts.map +1 -0
  447. package/dist/services/oni-v2/crate.js +504 -0
  448. package/dist/services/oni-v2/flydriveOcflStore.d.ts +69 -0
  449. package/dist/services/oni-v2/flydriveOcflStore.d.ts.map +1 -0
  450. package/dist/services/oni-v2/flydriveOcflStore.js +325 -0
  451. package/dist/services/oni-v2/ingestion.d.ts +37 -0
  452. package/dist/services/oni-v2/ingestion.d.ts.map +1 -0
  453. package/dist/services/oni-v2/ingestion.js +91 -0
  454. package/dist/services/oni-v2/mapping.d.ts +17 -0
  455. package/dist/services/oni-v2/mapping.d.ts.map +1 -0
  456. package/dist/services/oni-v2/mapping.js +137 -0
  457. package/dist/services/oni-v2/repository.d.ts +9 -0
  458. package/dist/services/oni-v2/repository.d.ts.map +1 -0
  459. package/dist/services/oni-v2/repository.js +180 -0
  460. package/dist/services/oni-v2/runtime.d.ts +23 -0
  461. package/dist/services/oni-v2/runtime.d.ts.map +1 -0
  462. package/dist/services/oni-v2/runtime.js +121 -0
  463. package/dist/services/oni-v2/templating.d.ts +11 -0
  464. package/dist/services/oni-v2/templating.d.ts.map +1 -0
  465. package/dist/services/oni-v2/templating.js +27 -0
  466. package/dist/services/oni-v2/types.d.ts +100 -0
  467. package/dist/services/oni-v2/types.d.ts.map +1 -0
  468. package/dist/services/oni-v2/types.js +3 -0
  469. package/dist/services/raid-v2/audit.d.ts +10 -0
  470. package/dist/services/raid-v2/audit.d.ts.map +1 -0
  471. package/dist/services/raid-v2/audit.js +29 -0
  472. package/dist/services/raid-v2/errors.d.ts +85 -0
  473. package/dist/services/raid-v2/errors.d.ts.map +1 -0
  474. package/dist/services/raid-v2/errors.js +36 -0
  475. package/dist/services/raid-v2/http.d.ts +4 -0
  476. package/dist/services/raid-v2/http.d.ts.map +1 -0
  477. package/dist/services/raid-v2/http.js +84 -0
  478. package/dist/services/raid-v2/logger.d.ts +8 -0
  479. package/dist/services/raid-v2/logger.d.ts.map +1 -0
  480. package/dist/services/raid-v2/logger.js +30 -0
  481. package/dist/services/raid-v2/mapping.d.ts +9 -0
  482. package/dist/services/raid-v2/mapping.d.ts.map +1 -0
  483. package/dist/services/raid-v2/mapping.js +168 -0
  484. package/dist/services/raid-v2/runtime.d.ts +5 -0
  485. package/dist/services/raid-v2/runtime.d.ts.map +1 -0
  486. package/dist/services/raid-v2/runtime.js +135 -0
  487. package/dist/services/raid-v2/tags.d.ts +11 -0
  488. package/dist/services/raid-v2/tags.d.ts.map +1 -0
  489. package/dist/services/raid-v2/tags.js +12 -0
  490. package/dist/services/raid-v2/types.d.ts +66 -0
  491. package/dist/services/raid-v2/types.d.ts.map +1 -0
  492. package/dist/services/raid-v2/types.js +3 -0
  493. package/dist/services/record-hooks/coordinator.d.ts +64 -0
  494. package/dist/services/record-hooks/coordinator.d.ts.map +1 -0
  495. package/dist/services/record-hooks/coordinator.js +276 -0
  496. package/dist/visitor/client.visitor.d.ts +6 -0
  497. package/dist/visitor/client.visitor.d.ts.map +1 -1
  498. package/dist/visitor/client.visitor.js +59 -14
  499. package/dist/visitor/construct.visitor.d.ts +27 -1
  500. package/dist/visitor/construct.visitor.d.ts.map +1 -1
  501. package/dist/visitor/construct.visitor.js +265 -177
  502. package/dist/visitor/context-variables.visitor.d.ts +3 -1
  503. package/dist/visitor/context-variables.visitor.d.ts.map +1 -1
  504. package/dist/visitor/context-variables.visitor.js +15 -1
  505. package/dist/visitor/data-value.visitor.d.ts +6 -0
  506. package/dist/visitor/data-value.visitor.d.ts.map +1 -1
  507. package/dist/visitor/data-value.visitor.js +10 -1
  508. package/dist/visitor/json-type-def.visitor.d.ts +6 -0
  509. package/dist/visitor/json-type-def.visitor.d.ts.map +1 -1
  510. package/dist/visitor/json-type-def.visitor.js +10 -1
  511. package/dist/visitor/migrate-config-v4-v5.visitor.d.ts +11 -0
  512. package/dist/visitor/migrate-config-v4-v5.visitor.d.ts.map +1 -1
  513. package/dist/visitor/migrate-config-v4-v5.visitor.js +228 -133
  514. package/dist/visitor/related-object-data-inline.visitor.d.ts +31 -0
  515. package/dist/visitor/related-object-data-inline.visitor.d.ts.map +1 -0
  516. package/dist/visitor/related-object-data-inline.visitor.js +96 -0
  517. package/dist/visitor/template.visitor.d.ts +17 -2
  518. package/dist/visitor/template.visitor.d.ts.map +1 -1
  519. package/dist/visitor/template.visitor.js +60 -22
  520. package/dist/visitor/validator.visitor.d.ts +49 -7
  521. package/dist/visitor/validator.visitor.d.ts.map +1 -1
  522. package/dist/visitor/validator.visitor.js +275 -178
  523. package/dist/waterline-models/AttachmentMetadata.d.ts +22 -0
  524. package/dist/waterline-models/AttachmentMetadata.d.ts.map +1 -1
  525. package/dist/waterline-models/AttachmentMetadata.js +147 -3
  526. package/dist/waterline-models/BrandingConfig.d.ts +7 -0
  527. package/dist/waterline-models/BrandingConfig.d.ts.map +1 -1
  528. package/dist/waterline-models/BrandingConfig.js +16 -1
  529. package/dist/waterline-models/BrandingConfigHistory.d.ts +11 -2
  530. package/dist/waterline-models/BrandingConfigHistory.d.ts.map +1 -1
  531. package/dist/waterline-models/BrandingConfigHistory.js +21 -1
  532. package/dist/waterline-models/DashboardConfiguration.d.ts +29 -0
  533. package/dist/waterline-models/DashboardConfiguration.d.ts.map +1 -0
  534. package/dist/waterline-models/DashboardConfiguration.js +52 -0
  535. package/dist/waterline-models/RecordType.d.ts +9 -0
  536. package/dist/waterline-models/RecordType.d.ts.map +1 -1
  537. package/dist/waterline-models/RecordType.js +16 -1
  538. package/dist/waterline-models/User.d.ts.map +1 -1
  539. package/dist/waterline-models/User.js +10 -15
  540. package/dist/waterline-models/index.d.ts +2 -0
  541. package/dist/waterline-models/index.d.ts.map +1 -1
  542. package/dist/waterline-models/index.js +4 -1
  543. package/package.json +60 -47
  544. package/dist/config/datapubs.config.d.ts +0 -72
  545. package/dist/config/datapubs.config.d.ts.map +0 -1
  546. package/dist/config/datapubs.config.js +0 -74
@@ -1,14 +1,31 @@
1
1
  "use strict";
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
3
  exports.Services = void 0;
4
+ const node_crypto_1 = require("node:crypto");
4
5
  const CoreService_1 = require("../CoreService");
6
+ const AttachmentStagingIdentity_1 = require("../AttachmentStagingIdentity");
5
7
  var Services;
6
8
  (function (Services) {
9
+ const STAGING_COORDINATOR_OID = '__global_attachment_staging__';
10
+ const STAGING_COORDINATOR_LEASE_MS = 5 * 60 * 1000;
7
11
  class AttachmentMetadataService extends CoreService_1.Services.Core.Service {
8
12
  _exportedMethods = [
9
13
  'upsert',
10
14
  'findByOid',
15
+ 'findUnresolvedByOid',
16
+ 'findUnresolvedByStagingFileId',
11
17
  'findOneByStorageKey',
18
+ 'prepareMutations',
19
+ 'markMutation',
20
+ 'hasCleanupClaim',
21
+ 'claimExpiredStagingCleanup',
22
+ 'beginStagingCleanup',
23
+ 'authorizeStagingCleanup',
24
+ 'releaseStagingCleanup',
25
+ 'completeStagingCleanup',
26
+ 'recoverStagingCleanup',
27
+ 'rebindOid',
28
+ 'markDeleted',
12
29
  'deleteByStorageKey',
13
30
  'recordAccess',
14
31
  ];
@@ -21,10 +38,26 @@ var Services;
21
38
  const payload = this.normalizeMetadataRow(row);
22
39
  const oid = String(payload.oid ?? '').trim();
23
40
  const fileId = String(payload.fileId ?? '').trim();
24
- const existing = await AttachmentMetadata.findOne({ storageKey })
25
- ?? (oid && fileId
26
- ? await AttachmentMetadata.findOne({ oid, fileId })
27
- : null);
41
+ let existing = (await AttachmentMetadata.findOne({ storageKey }));
42
+ // A journal key may be upgraded from the original attachment-only form
43
+ // to the mutation-specific form. Reuse that row when its mutation
44
+ // identity is otherwise unchanged instead of leaving an unresolved
45
+ // legacy row behind on the next retry.
46
+ if (!existing && payload.isJournal === true && payload.attachmentId && payload.generation && payload.mutationFileId) {
47
+ existing = (await AttachmentMetadata.findOne({
48
+ oid,
49
+ attachmentId: payload.attachmentId,
50
+ generation: payload.generation,
51
+ mutationFileId: payload.mutationFileId,
52
+ isJournal: true,
53
+ }));
54
+ }
55
+ // A physical row may retain its identity if a storage prefix changes,
56
+ // but journal rows must never claim the physical {oid,fileId} row.
57
+ if (!existing && payload.isJournal !== true && oid && fileId) {
58
+ const sameFileRows = (await AttachmentMetadata.find({ oid, fileId }));
59
+ existing = (sameFileRows ?? []).find(candidate => candidate.isJournal !== true) ?? null;
60
+ }
28
61
  if (existing?.id) {
29
62
  await AttachmentMetadata.updateOne({ id: existing.id }).set(payload);
30
63
  return;
@@ -36,14 +69,377 @@ var Services;
36
69
  if (!normalizedOid) {
37
70
  return [];
38
71
  }
39
- return await AttachmentMetadata.find({ oid: normalizedOid }).sort([{ createdAt: 'ASC' }]);
72
+ const rows = (await AttachmentMetadata.find({ oid: normalizedOid }).sort([
73
+ { createdAt: 'ASC' },
74
+ ]));
75
+ // Journal rows are retained for reconciliation, but prepared/pending
76
+ // work is not a confirmed physical attachment and must not appear in
77
+ // the listing API. Legacy rows without a mutationState remain visible.
78
+ return rows.filter(row => {
79
+ const mutationState = String(row.mutationState ?? '').trim();
80
+ return (row.isJournal !== true &&
81
+ row.operation !== 'delete' &&
82
+ mutationState !== 'cancelled' &&
83
+ (!mutationState || mutationState === 'applied'));
84
+ });
85
+ }
86
+ async findUnresolvedByOid(oid) {
87
+ const normalizedOid = String(oid ?? '').trim();
88
+ if (!normalizedOid) {
89
+ return [];
90
+ }
91
+ const rows = (await AttachmentMetadata.find({ oid: normalizedOid }).sort([
92
+ { createdAt: 'ASC' },
93
+ ]));
94
+ return rows.filter(row => row.isJournal === true &&
95
+ (row.mutationState === 'prepared' ||
96
+ row.mutationState === 'pending' ||
97
+ row.mutationState === 'incomplete' ||
98
+ row.mutationState === 'unknown'));
99
+ }
100
+ async findUnresolvedByStagingFileId(fileId) {
101
+ const normalizedFileId = (0, AttachmentStagingIdentity_1.normalizeAttachmentStagingFileId)(fileId);
102
+ if (!normalizedFileId)
103
+ return [];
104
+ return (await AttachmentMetadata.find({
105
+ mutationFileId: normalizedFileId,
106
+ isJournal: true,
107
+ mutationState: { in: ['prepared', 'pending', 'incomplete', 'unknown'] },
108
+ }));
109
+ }
110
+ async prepareMutations(rows) {
111
+ for (const row of rows) {
112
+ const attachmentId = String(row.attachmentId ?? '').trim();
113
+ const generation = String(row.generation ?? '').trim();
114
+ const oid = String(row.oid ?? '').trim();
115
+ const mutationFileId = (0, AttachmentStagingIdentity_1.normalizeAttachmentStagingFileId)(row.mutationFileId ?? row.fileId);
116
+ if (!oid || !attachmentId || !generation || !mutationFileId) {
117
+ throw new Error('Attachment mutation preparation requires bounded journal identity.');
118
+ }
119
+ if (await this.hasCleanupClaim(oid, mutationFileId)) {
120
+ throw new Error('Attachment staging cleanup already owns this mutation.');
121
+ }
122
+ const token = (0, node_crypto_1.randomUUID)();
123
+ if (!(await this.acquireStagingCoordinator(oid, mutationFileId, attachmentId, generation, token, 'staging-preparing'))) {
124
+ throw new Error('Attachment staging identity is already reserved.');
125
+ }
126
+ try {
127
+ // The coordinator is held until the prepared row is durable. Cleanup
128
+ // must acquire the same row before its reference scan, so it cannot
129
+ // pass that scan and remove the blob during this preparation window.
130
+ if (await this.hasCleanupClaim(oid, mutationFileId)) {
131
+ throw new Error('Attachment staging cleanup already owns this mutation.');
132
+ }
133
+ const storageKey = String(row.storageKey ?? '').trim();
134
+ const existing = (await AttachmentMetadata.findOne({ storageKey }));
135
+ if (existing) {
136
+ throw new Error('Attachment mutation generation already exists.');
137
+ }
138
+ if (!(await this.acquireStagingCoordinator(oid, mutationFileId, attachmentId, generation, token, 'staging-preparing'))) {
139
+ throw new Error('Attachment staging preparation lease was lost.');
140
+ }
141
+ await this.upsert({
142
+ ...row,
143
+ fileId: this.journalFileId(attachmentId, generation, mutationFileId),
144
+ mutationFileId,
145
+ isJournal: true,
146
+ mutationState: 'prepared',
147
+ });
148
+ }
149
+ finally {
150
+ if (!(await this.releaseStagingCoordinator(mutationFileId, attachmentId, generation, token, 'staging-preparing'))) {
151
+ throw new Error('Attachment staging preparation ownership could not be released safely.');
152
+ }
153
+ }
154
+ }
155
+ }
156
+ async markMutation(oid, attachmentId, generation, mutationState, codeOrMutationFileId, legacyMutationFileId) {
157
+ const mutationFileId = legacyMutationFileId ??
158
+ (mutationState === 'pending' || mutationState === 'applied' ? codeOrMutationFileId : undefined);
159
+ const lastSafeErrorCode = legacyMutationFileId === undefined && mutationFileId !== undefined
160
+ ? undefined
161
+ : codeOrMutationFileId;
162
+ const criteria = {
163
+ oid: String(oid ?? '').trim(),
164
+ attachmentId: String(attachmentId ?? '').trim(),
165
+ generation: String(generation ?? '').trim(),
166
+ isJournal: true,
167
+ ...(String(mutationFileId ?? '').trim()
168
+ ? { mutationFileId: String(mutationFileId).trim() }
169
+ : {}),
170
+ };
171
+ if (!criteria.oid || !criteria.attachmentId || !criteria.generation) {
172
+ return false;
173
+ }
174
+ const existing = (await AttachmentMetadata.findOne(criteria));
175
+ if (!existing?.id) {
176
+ return false;
177
+ }
178
+ const allowedSources = {
179
+ prepared: [],
180
+ pending: ['prepared'],
181
+ applied: ['pending'],
182
+ incomplete: ['applied', 'unknown'],
183
+ unknown: ['prepared', 'pending', 'applied'],
184
+ cancelled: ['prepared', 'incomplete'],
185
+ 'cleanup-pending': ['cancelled'],
186
+ 'cleanup-removing': [],
187
+ cleaned: [],
188
+ };
189
+ const existingState = existing.mutationState;
190
+ if (!existingState || !allowedSources[mutationState].includes(existingState)) {
191
+ return false;
192
+ }
193
+ const updated = await AttachmentMetadata.updateOne({
194
+ id: existing.id,
195
+ mutationState: existing.mutationState,
196
+ }).set({
197
+ mutationState,
198
+ attemptCount: mutationState === 'pending' ? Number(existing.attemptCount ?? 0) + 1 : Number(existing.attemptCount ?? 0),
199
+ lastAttemptAt: new Date().toISOString(),
200
+ ...(lastSafeErrorCode
201
+ ? { lastSafeErrorCode }
202
+ : mutationState === 'applied'
203
+ ? { lastSafeErrorCode: undefined }
204
+ : {}),
205
+ });
206
+ return Boolean(updated);
207
+ }
208
+ async hasCleanupClaim(oid, fileId) {
209
+ const normalizedFileId = (0, AttachmentStagingIdentity_1.normalizeAttachmentStagingFileId)(fileId);
210
+ if (!String(oid ?? '').trim() || !normalizedFileId)
211
+ return false;
212
+ return Boolean(await AttachmentMetadata.findOne({
213
+ mutationFileId: normalizedFileId,
214
+ isJournal: true,
215
+ mutationState: { in: ['cleanup-pending', 'cleanup-checking', 'cleanup-removing', 'cleaned'] },
216
+ }));
217
+ }
218
+ async claimExpiredStagingCleanup(before, limit = 100) {
219
+ const beforeDate = new Date(before);
220
+ if (Number.isNaN(beforeDate.getTime()))
221
+ return [];
222
+ const boundedLimit = Number.isSafeInteger(limit) ? Math.min(1000, Math.max(1, limit)) : 100;
223
+ const beforeIso = beforeDate.toISOString();
224
+ const query = AttachmentMetadata.find({
225
+ isJournal: true,
226
+ mutationState: 'cancelled',
227
+ updatedAt: { '<': beforeIso },
228
+ });
229
+ const rows = await query.sort([{ updatedAt: 'ASC' }]).limit(boundedLimit);
230
+ const claims = [];
231
+ for (const row of rows) {
232
+ const oid = String(row.oid ?? '').trim();
233
+ const attachmentId = String(row.attachmentId ?? '').trim();
234
+ const fileId = (0, AttachmentStagingIdentity_1.normalizeAttachmentStagingFileId)(row.mutationFileId);
235
+ const generation = String(row.generation ?? '').trim();
236
+ if (!row.id || !oid || !attachmentId || !fileId || !generation)
237
+ continue;
238
+ const token = (0, node_crypto_1.randomUUID)();
239
+ const claimed = await AttachmentMetadata.updateOne({
240
+ id: row.id,
241
+ mutationState: 'cancelled',
242
+ updatedAt: { '<': beforeIso },
243
+ }).set({
244
+ mutationState: 'cleanup-pending',
245
+ coordinationToken: token,
246
+ coordinationLeaseExpiresAt: this.coordinationLeaseExpiresAt(),
247
+ lastAttemptAt: new Date().toISOString(),
248
+ lastSafeErrorCode: undefined,
249
+ });
250
+ if (claimed)
251
+ claims.push({ oid, attachmentId, fileId, generation, token, phase: 'checking' });
252
+ }
253
+ const staleQuery = AttachmentMetadata.find({
254
+ isJournal: true,
255
+ mutationState: { in: ['cleanup-pending', 'cleanup-checking', 'cleanup-removing'] },
256
+ coordinationLeaseExpiresAt: { '<': new Date().toISOString() },
257
+ });
258
+ const staleRows = await staleQuery.sort([{ coordinationLeaseExpiresAt: 'ASC' }]).limit(boundedLimit);
259
+ for (const row of staleRows) {
260
+ if (claims.length >= boundedLimit)
261
+ break;
262
+ const oid = String(row.oid ?? '').trim();
263
+ const attachmentId = String(row.attachmentId ?? '').trim();
264
+ const fileId = (0, AttachmentStagingIdentity_1.normalizeAttachmentStagingFileId)(row.mutationFileId);
265
+ const generation = String(row.generation ?? '').trim();
266
+ const previousToken = String(row.coordinationToken ?? '').trim();
267
+ const previousLease = row.coordinationLeaseExpiresAt
268
+ ? new Date(row.coordinationLeaseExpiresAt).toISOString()
269
+ : undefined;
270
+ if (!row.id || !oid || !attachmentId || !fileId || !generation || !previousToken || !previousLease)
271
+ continue;
272
+ const token = (0, node_crypto_1.randomUUID)();
273
+ const phase = row.mutationState === 'cleanup-removing' ? 'removing' : 'checking';
274
+ const reclaimed = await AttachmentMetadata.updateOne({
275
+ id: row.id,
276
+ mutationState: row.mutationState,
277
+ coordinationToken: previousToken,
278
+ coordinationLeaseExpiresAt: previousLease,
279
+ }).set({
280
+ mutationState: phase === 'removing' ? 'cleanup-removing' : 'cleanup-pending',
281
+ coordinationToken: token,
282
+ coordinationLeaseExpiresAt: this.coordinationLeaseExpiresAt(),
283
+ lastAttemptAt: new Date().toISOString(),
284
+ });
285
+ if (reclaimed)
286
+ claims.push({ oid, attachmentId, fileId, generation, token, phase });
287
+ }
288
+ return claims;
289
+ }
290
+ async beginStagingCleanup(claim) {
291
+ const normalized = this.normalizeCleanupClaim(claim);
292
+ if (!normalized)
293
+ return false;
294
+ if (!(await this.acquireStagingCoordinator(normalized.oid, normalized.fileId, normalized.attachmentId, normalized.generation, normalized.token, 'staging-cleanup'))) {
295
+ return false;
296
+ }
297
+ const updated = await AttachmentMetadata.updateOne({
298
+ ...this.cleanupClaimCriteria(normalized),
299
+ isJournal: true,
300
+ mutationState: 'cleanup-pending',
301
+ }).set({
302
+ mutationState: 'cleanup-checking',
303
+ coordinationLeaseExpiresAt: this.coordinationLeaseExpiresAt(),
304
+ lastAttemptAt: new Date().toISOString(),
305
+ });
306
+ if (updated)
307
+ return true;
308
+ const alreadyBegun = await AttachmentMetadata.findOne({
309
+ ...this.cleanupClaimCriteria(normalized),
310
+ isJournal: true,
311
+ mutationState: { in: ['cleanup-checking', 'cleanup-removing'] },
312
+ });
313
+ if (alreadyBegun)
314
+ return true;
315
+ await this.releaseStagingCoordinator(normalized.fileId, normalized.attachmentId, normalized.generation, normalized.token, 'staging-cleanup');
316
+ return false;
317
+ }
318
+ async authorizeStagingCleanup(claim) {
319
+ const normalized = this.normalizeCleanupClaim(claim);
320
+ if (!normalized ||
321
+ !(await this.acquireStagingCoordinator(normalized.oid, normalized.fileId, normalized.attachmentId, normalized.generation, normalized.token, 'staging-cleanup'))) {
322
+ return false;
323
+ }
324
+ const updated = await AttachmentMetadata.updateOne({
325
+ ...this.cleanupClaimCriteria(normalized),
326
+ isJournal: true,
327
+ mutationState: 'cleanup-checking',
328
+ }).set({
329
+ mutationState: 'cleanup-removing',
330
+ coordinationLeaseExpiresAt: this.coordinationLeaseExpiresAt(),
331
+ lastAttemptAt: new Date().toISOString(),
332
+ });
333
+ if (updated)
334
+ return true;
335
+ return Boolean(await AttachmentMetadata.findOne({
336
+ ...this.cleanupClaimCriteria(normalized),
337
+ isJournal: true,
338
+ mutationState: 'cleanup-removing',
339
+ }));
340
+ }
341
+ async releaseStagingCleanup(claim, code) {
342
+ const normalized = this.normalizeCleanupClaim(claim);
343
+ if (!normalized)
344
+ return false;
345
+ const safeCode = /^[A-Za-z0-9][A-Za-z0-9._:-]{0,127}$/.test(code) ? code : 'attachment-cleanup-failed';
346
+ const updated = await AttachmentMetadata.updateOne({
347
+ ...this.cleanupClaimCriteria(normalized),
348
+ isJournal: true,
349
+ mutationState: { in: ['cleanup-pending', 'cleanup-checking'] },
350
+ }).set({
351
+ mutationState: 'cancelled',
352
+ coordinationLeaseExpiresAt: undefined,
353
+ lastAttemptAt: new Date().toISOString(),
354
+ lastSafeErrorCode: safeCode,
355
+ });
356
+ const claimReleased = Boolean(updated) ||
357
+ Boolean(await AttachmentMetadata.findOne({
358
+ ...this.cleanupClaimCriteria(normalized),
359
+ isJournal: true,
360
+ mutationState: 'cancelled',
361
+ }));
362
+ if (!claimReleased)
363
+ return false;
364
+ return this.releaseStagingCoordinator(normalized.fileId, normalized.attachmentId, normalized.generation, normalized.token, 'staging-cleanup');
365
+ }
366
+ async completeStagingCleanup(claim) {
367
+ const normalized = this.normalizeCleanupClaim(claim);
368
+ if (!normalized)
369
+ return false;
370
+ const completed = await AttachmentMetadata.updateOne({
371
+ ...this.cleanupClaimCriteria(normalized),
372
+ isJournal: true,
373
+ mutationState: 'cleanup-removing',
374
+ }).set({
375
+ mutationState: 'cleaned',
376
+ coordinationLeaseExpiresAt: undefined,
377
+ lastAttemptAt: new Date().toISOString(),
378
+ lastSafeErrorCode: 'attachment-cleanup-completed',
379
+ });
380
+ const claimCompleted = Boolean(completed) ||
381
+ Boolean(await AttachmentMetadata.findOne({
382
+ ...this.cleanupClaimCriteria(normalized),
383
+ isJournal: true,
384
+ mutationState: 'cleaned',
385
+ }));
386
+ if (!claimCompleted)
387
+ return false;
388
+ return this.releaseStagingCoordinator(normalized.fileId, normalized.attachmentId, normalized.generation, normalized.token, 'staging-cleanup');
389
+ }
390
+ async recoverStagingCleanup(claim, stagedObjectExists) {
391
+ const normalized = this.normalizeCleanupClaim(claim);
392
+ if (!normalized ||
393
+ !(await this.acquireStagingCoordinator(normalized.oid, normalized.fileId, normalized.attachmentId, normalized.generation, normalized.token, 'staging-cleanup'))) {
394
+ return 'lost';
395
+ }
396
+ if (!stagedObjectExists) {
397
+ return (await this.completeStagingCleanup(normalized)) ? 'completed' : 'lost';
398
+ }
399
+ // Presence is ambiguous after a crash: it may be the old object or a
400
+ // newly uploaded object using the same key. Never delete or release the
401
+ // global identity in that state. The bounded lease allows another
402
+ // worker to reconcile it later, while hasCleanupClaim keeps preparation
403
+ // fail-closed until absence is observed.
404
+ const retained = await AttachmentMetadata.updateOne({
405
+ ...this.cleanupClaimCriteria(normalized),
406
+ isJournal: true,
407
+ mutationState: 'cleanup-removing',
408
+ }).set({
409
+ coordinationLeaseExpiresAt: this.coordinationLeaseExpiresAt(),
410
+ lastAttemptAt: new Date().toISOString(),
411
+ lastSafeErrorCode: 'attachment-cleanup-removal-unconfirmed',
412
+ });
413
+ return retained ? 'retained' : 'lost';
414
+ }
415
+ journalFileId(attachmentId, generation, mutationFileId) {
416
+ const identity = `${attachmentId}\u0000${generation}\u0000${mutationFileId}`;
417
+ const suffix = (0, node_crypto_1.createHash)('sha256').update(identity).digest('hex').slice(0, 32);
418
+ return `journal-${attachmentId}-${generation}-${suffix}`;
419
+ }
420
+ async rebindOid(fromOid, toOid) {
421
+ const from = String(fromOid ?? '').trim();
422
+ const to = String(toOid ?? '').trim();
423
+ if (!from || !to || from === to) {
424
+ return;
425
+ }
426
+ await AttachmentMetadata.update({ oid: from }).set({ oid: to });
427
+ }
428
+ async markDeleted(row) {
429
+ await this.upsert({
430
+ ...row,
431
+ isJournal: false,
432
+ operation: 'delete',
433
+ mutationState: 'applied',
434
+ lastAttemptAt: new Date().toISOString(),
435
+ });
40
436
  }
41
437
  async findOneByStorageKey(storageKey) {
42
438
  const normalizedStorageKey = String(storageKey ?? '').trim();
43
439
  if (!normalizedStorageKey) {
44
440
  return undefined;
45
441
  }
46
- return await AttachmentMetadata.findOne({ storageKey: normalizedStorageKey });
442
+ return (await AttachmentMetadata.findOne({ storageKey: normalizedStorageKey }));
47
443
  }
48
444
  async deleteByStorageKey(storageKey) {
49
445
  const normalizedStorageKey = String(storageKey ?? '').trim();
@@ -59,7 +455,9 @@ var Services;
59
455
  return;
60
456
  }
61
457
  if (normalizedEvent.storageKey && normalizedEvent.action !== 'list') {
62
- const existing = await AttachmentMetadata.findOne({ storageKey: normalizedEvent.storageKey });
458
+ const existing = (await AttachmentMetadata.findOne({
459
+ storageKey: normalizedEvent.storageKey,
460
+ }));
63
461
  if (existing?.id) {
64
462
  const currentCount = Number(existing.accessCount ?? 0);
65
463
  const nextCount = this.shouldIncrementAccessCount(normalizedEvent.action) ? currentCount + 1 : currentCount;
@@ -77,6 +475,175 @@ var Services;
77
475
  throw err;
78
476
  }
79
477
  }
478
+ async acquireStagingCoordinator(oid, fileId, attachmentId, generation, token, ownerState) {
479
+ const identity = this.stagingCoordinatorIdentity(fileId);
480
+ const coordinator = await this.ensureStagingCoordinator(fileId, identity);
481
+ if (coordinator.mutationState === ownerState &&
482
+ coordinator.coordinationToken === token &&
483
+ coordinator.attachmentId === attachmentId &&
484
+ coordinator.generation === generation) {
485
+ return this.renewStagingCoordinator(coordinator, token, ownerState);
486
+ }
487
+ const reclaiming = coordinator.mutationState !== 'staging-available';
488
+ if (reclaiming && !this.coordinationLeaseExpired(coordinator.coordinationLeaseExpiresAt))
489
+ return false;
490
+ const updated = await AttachmentMetadata.updateOne({
491
+ id: coordinator.id,
492
+ oid: STAGING_COORDINATOR_OID,
493
+ fileId: identity.fileId,
494
+ storageKey: identity.storageKey,
495
+ mutationFileId: fileId,
496
+ isJournal: true,
497
+ mutationState: coordinator.mutationState,
498
+ ...(reclaiming
499
+ ? {
500
+ coordinationToken: coordinator.coordinationToken,
501
+ coordinationLeaseExpiresAt: coordinator.coordinationLeaseExpiresAt,
502
+ }
503
+ : {}),
504
+ }).set({
505
+ mutationState: ownerState,
506
+ attachmentId,
507
+ generation,
508
+ coordinationToken: token,
509
+ coordinationLeaseExpiresAt: this.coordinationLeaseExpiresAt(),
510
+ lastAttemptAt: new Date().toISOString(),
511
+ });
512
+ if (updated)
513
+ return true;
514
+ const raced = (await AttachmentMetadata.findOne({ storageKey: identity.storageKey }));
515
+ return Boolean(this.isExpectedStagingCoordinator(raced, fileId, identity) &&
516
+ raced?.mutationState === ownerState &&
517
+ raced.coordinationToken === token &&
518
+ raced.attachmentId === attachmentId &&
519
+ raced.generation === generation);
520
+ }
521
+ async ensureStagingCoordinator(fileId, identity) {
522
+ let coordinator = (await AttachmentMetadata.findOne({
523
+ storageKey: identity.storageKey,
524
+ }));
525
+ if (!coordinator) {
526
+ try {
527
+ coordinator = (await AttachmentMetadata.create({
528
+ oid: STAGING_COORDINATOR_OID,
529
+ fileId: identity.fileId,
530
+ storageKey: identity.storageKey,
531
+ mutationFileId: fileId,
532
+ isJournal: true,
533
+ mutationState: 'staging-available',
534
+ }).fetch());
535
+ }
536
+ catch (error) {
537
+ if (!this.isUniqueConstraintError(error))
538
+ throw error;
539
+ coordinator = (await AttachmentMetadata.findOne({
540
+ storageKey: identity.storageKey,
541
+ }));
542
+ }
543
+ }
544
+ if (!coordinator || !this.isExpectedStagingCoordinator(coordinator, fileId, identity)) {
545
+ throw new Error('Attachment staging coordinator is unavailable or malformed.');
546
+ }
547
+ return coordinator;
548
+ }
549
+ async releaseStagingCoordinator(fileId, attachmentId, generation, token, ownerState) {
550
+ const identity = this.stagingCoordinatorIdentity(fileId);
551
+ const coordinator = (await AttachmentMetadata.findOne({
552
+ storageKey: identity.storageKey,
553
+ }));
554
+ if (!coordinator || !this.isExpectedStagingCoordinator(coordinator, fileId, identity))
555
+ return false;
556
+ const leaseExpiresAt = coordinator.coordinationLeaseExpiresAt;
557
+ if (coordinator.mutationState !== ownerState ||
558
+ coordinator.coordinationToken !== token ||
559
+ coordinator.attachmentId !== attachmentId ||
560
+ coordinator.generation !== generation ||
561
+ !leaseExpiresAt ||
562
+ this.coordinationLeaseExpired(leaseExpiresAt)) {
563
+ return false;
564
+ }
565
+ const released = await AttachmentMetadata.updateOne({
566
+ id: coordinator.id,
567
+ oid: STAGING_COORDINATOR_OID,
568
+ fileId: identity.fileId,
569
+ storageKey: identity.storageKey,
570
+ mutationFileId: fileId,
571
+ isJournal: true,
572
+ mutationState: ownerState,
573
+ coordinationToken: token,
574
+ coordinationLeaseExpiresAt: leaseExpiresAt,
575
+ attachmentId,
576
+ generation,
577
+ }).set({
578
+ mutationState: 'staging-available',
579
+ coordinationToken: undefined,
580
+ coordinationLeaseExpiresAt: undefined,
581
+ lastAttemptAt: new Date().toISOString(),
582
+ });
583
+ return Boolean(released);
584
+ }
585
+ stagingCoordinatorIdentity(fileId) {
586
+ const digest = (0, node_crypto_1.createHash)('sha256').update(fileId).digest('hex');
587
+ return {
588
+ fileId: `staging-coordinator-${digest}`,
589
+ storageKey: `journal/staging-coordinator/${digest}`,
590
+ };
591
+ }
592
+ isExpectedStagingCoordinator(row, fileId, identity) {
593
+ return Boolean(row?.id &&
594
+ row.oid === STAGING_COORDINATOR_OID &&
595
+ row.fileId === identity.fileId &&
596
+ row.storageKey === identity.storageKey &&
597
+ row.mutationFileId === fileId &&
598
+ row.isJournal === true &&
599
+ (row.mutationState === 'staging-available' ||
600
+ row.mutationState === 'staging-preparing' ||
601
+ row.mutationState === 'staging-cleanup'));
602
+ }
603
+ coordinationLeaseExpiresAt() {
604
+ return new Date(Date.now() + STAGING_COORDINATOR_LEASE_MS).toISOString();
605
+ }
606
+ coordinationLeaseExpired(value) {
607
+ const expiresAt = new Date(value).getTime();
608
+ return !Number.isFinite(expiresAt) || expiresAt <= Date.now();
609
+ }
610
+ async renewStagingCoordinator(coordinator, token, ownerState) {
611
+ const currentExpiry = new Date(coordinator.coordinationLeaseExpiresAt).getTime();
612
+ if (Number.isFinite(currentExpiry) && currentExpiry > Date.now() + 60_000)
613
+ return true;
614
+ return Boolean(await AttachmentMetadata.updateOne({
615
+ id: coordinator.id,
616
+ mutationState: ownerState,
617
+ coordinationToken: token,
618
+ coordinationLeaseExpiresAt: coordinator.coordinationLeaseExpiresAt,
619
+ }).set({
620
+ coordinationLeaseExpiresAt: this.coordinationLeaseExpiresAt(),
621
+ lastAttemptAt: new Date().toISOString(),
622
+ }));
623
+ }
624
+ isUniqueConstraintError(error) {
625
+ const details = error;
626
+ return details?.code === 'E_UNIQUE' || details?.raw?.code === 11000 || details?.cause?.code === 11000;
627
+ }
628
+ normalizeCleanupClaim(claim) {
629
+ const oid = String(claim?.oid ?? '').trim();
630
+ const attachmentId = this.optionalIdentifier(claim?.attachmentId);
631
+ const fileId = (0, AttachmentStagingIdentity_1.normalizeAttachmentStagingFileId)(claim?.fileId);
632
+ const generation = this.optionalIdentifier(claim?.generation);
633
+ const token = this.optionalIdentifier(claim?.token);
634
+ if (!oid || !attachmentId || !fileId || !generation || !token)
635
+ return undefined;
636
+ return { oid, attachmentId, fileId, generation, token, phase: claim.phase };
637
+ }
638
+ cleanupClaimCriteria(claim) {
639
+ return {
640
+ oid: claim.oid,
641
+ attachmentId: claim.attachmentId,
642
+ generation: claim.generation,
643
+ mutationFileId: claim.fileId,
644
+ coordinationToken: claim.token,
645
+ };
646
+ }
80
647
  shouldIncrementAccessCount(action) {
81
648
  return action === 'download' || action === 'access';
82
649
  }
@@ -85,6 +652,10 @@ var Services;
85
652
  oid: String(row.oid ?? '').trim(),
86
653
  fileId: String(row.fileId ?? '').trim(),
87
654
  storageKey: String(row.storageKey ?? '').trim(),
655
+ isJournal: row.isJournal === true,
656
+ // Journal fields are only written when the caller supplies them, so an
657
+ // ordinary metadata upsert cannot silently reset reconciliation state.
658
+ ...this.journalRow(row),
88
659
  contentType: this.optionalString(row.contentType),
89
660
  contentLength: this.optionalNumber(row.contentLength),
90
661
  etag: this.optionalString(row.etag),
@@ -98,6 +669,70 @@ var Services;
98
669
  accessCount: this.optionalNumber(row.accessCount) ?? 0,
99
670
  };
100
671
  }
672
+ journalRow(row) {
673
+ const journal = {};
674
+ const attachmentId = this.optionalIdentifier(row.attachmentId);
675
+ if (attachmentId) {
676
+ journal.attachmentId = attachmentId;
677
+ }
678
+ const operation = this.optionalOperation(row.operation);
679
+ if (operation) {
680
+ journal.operation = operation;
681
+ }
682
+ const mutationState = this.optionalMutationState(row.mutationState);
683
+ if (mutationState) {
684
+ journal.mutationState = mutationState;
685
+ }
686
+ const generation = this.optionalIdentifier(row.generation);
687
+ if (generation) {
688
+ journal.generation = generation;
689
+ }
690
+ const mutationFileId = (0, AttachmentStagingIdentity_1.normalizeAttachmentStagingFileId)(row.mutationFileId);
691
+ if (mutationFileId) {
692
+ journal.mutationFileId = mutationFileId;
693
+ }
694
+ const coordinationToken = this.optionalIdentifier(row.coordinationToken);
695
+ if (coordinationToken) {
696
+ journal.coordinationToken = coordinationToken;
697
+ }
698
+ const attemptCount = this.optionalNumber(row.attemptCount);
699
+ if (attemptCount !== undefined) {
700
+ journal.attemptCount = attemptCount;
701
+ }
702
+ const lastAttemptAt = this.optionalDateString(row.lastAttemptAt);
703
+ if (lastAttemptAt) {
704
+ journal.lastAttemptAt = lastAttemptAt;
705
+ }
706
+ const lastSafeErrorCode = this.optionalIdentifier(row.lastSafeErrorCode);
707
+ if (lastSafeErrorCode) {
708
+ journal.lastSafeErrorCode = lastSafeErrorCode;
709
+ }
710
+ return journal;
711
+ }
712
+ optionalIdentifier(value) {
713
+ const normalized = String(value ?? '').trim();
714
+ return normalized && /^[A-Za-z0-9][A-Za-z0-9_-]{0,127}$/.test(normalized) ? normalized : undefined;
715
+ }
716
+ optionalOperation(value) {
717
+ return value === 'add' || value === 'finalize' || value === 'delete' ? value : undefined;
718
+ }
719
+ optionalMutationState(value) {
720
+ return value === 'prepared' ||
721
+ value === 'pending' ||
722
+ value === 'applied' ||
723
+ value === 'incomplete' ||
724
+ value === 'unknown' ||
725
+ value === 'cancelled' ||
726
+ value === 'cleanup-pending' ||
727
+ value === 'cleanup-checking' ||
728
+ value === 'cleanup-removing' ||
729
+ value === 'cleaned' ||
730
+ value === 'staging-available' ||
731
+ value === 'staging-preparing' ||
732
+ value === 'staging-cleanup'
733
+ ? value
734
+ : undefined;
735
+ }
101
736
  normalizeAccessEvent(event) {
102
737
  return {
103
738
  oid: String(event.oid ?? '').trim(),
@@ -130,4 +765,4 @@ var Services;
130
765
  }
131
766
  Services.AttachmentMetadataService = AttachmentMetadataService;
132
767
  })(Services || (exports.Services = Services = {}));
133
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiQXR0YWNobWVudE1ldGFkYXRhU2VydmljZS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9zZXJ2aWNlcy9BdHRhY2htZW50TWV0YWRhdGFTZXJ2aWNlLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7OztBQUFBLGdEQUFzRDtBQUd0RCxJQUFpQixRQUFRLENBdUp4QjtBQXZKRCxXQUFpQixRQUFRO0lBYXZCLE1BQWEseUJBQTBCLFNBQVEsc0JBQVEsQ0FBQyxJQUFJLENBQUMsT0FBTztRQUMvQyxnQkFBZ0IsR0FBYTtZQUM5QyxRQUFRO1lBQ1IsV0FBVztZQUNYLHFCQUFxQjtZQUNyQixvQkFBb0I7WUFDcEIsY0FBYztTQUNmLENBQUM7UUFFaUIsU0FBUyxHQUFXLDZCQUE2QixDQUFDO1FBRTlELEtBQUssQ0FBQyxNQUFNLENBQUMsR0FBNEI7WUFDOUMsTUFBTSxVQUFVLEdBQUcsTUFBTSxDQUFDLEdBQUcsQ0FBQyxVQUFVLElBQUksRUFBRSxDQUFDLENBQUMsSUFBSSxFQUFFLENBQUM7WUFDdkQsSUFBSSxDQUFDLFVBQVUsRUFBRSxDQUFDO2dCQUNoQixNQUFNLElBQUksS0FBSyxDQUFDLHNEQUFzRCxDQUFDLENBQUM7WUFDMUUsQ0FBQztZQUVELE1BQU0sT0FBTyxHQUFHLElBQUksQ0FBQyxvQkFBb0IsQ0FBQyxHQUFHLENBQUMsQ0FBQztZQUMvQyxNQUFNLEdBQUcsR0FBRyxNQUFNLENBQUMsT0FBTyxDQUFDLEdBQUcsSUFBSSxFQUFFLENBQUMsQ0FBQyxJQUFJLEVBQUUsQ0FBQztZQUM3QyxNQUFNLE1BQU0sR0FBRyxNQUFNLENBQUMsT0FBTyxDQUFDLE1BQU0sSUFBSSxFQUFFLENBQUMsQ0FBQyxJQUFJLEVBQUUsQ0FBQztZQUNuRCxNQUFNLFFBQVEsR0FBRyxNQUFNLGtCQUFrQixDQUFDLE9BQU8sQ0FBQyxFQUFFLFVBQVUsRUFBRSxDQUF3QzttQkFDbkcsQ0FBQyxHQUFHLElBQUksTUFBTTtvQkFDZixDQUFDLENBQUMs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
768
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiQXR0YWNobWVudE1ldGFkYXRhU2VydmljZS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9zZXJ2aWNlcy9BdHRhY2htZW50TWV0YWRhdGFTZXJ2aWNlLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7OztBQUFBLDZDQUFxRDtBQUNyRCxnREFBc0Q7QUFFdEQsNEVBQWdGO0FBRWhGLElBQWlCLFFBQVEsQ0EwOEJ4QjtBQTE4QkQsV0FBaUIsUUFBUTtJQUN2QixNQUFNLHVCQUF1QixHQUFHLCtCQUErQixDQUFDO0lBQ2hFLE1BQU0sNEJBQTRCLEdBQUcsQ0FBQyxHQUFHLEVBQUUsR0FBRyxJQUFJLENBQUM7SUF1RG5ELE1BQWEseUJBQTBCLFNBQVEsc0JBQVEsQ0FBQyxJQUFJLENBQUMsT0FBTztRQUMvQyxnQkFBZ0IsR0FBYTtZQUM5QyxRQUFRO1lBQ1IsV0FBVztZQUNYLHFCQUFxQjtZQUNyQiwrQkFBK0I7WUFDL0IscUJBQXFCO1lBQ3JCLGtCQUFrQjtZQUNsQixjQUFjO1lBQ2QsaUJBQWlCO1lBQ2pCLDRCQUE0QjtZQUM1QixxQkFBcUI7WUFDckIseUJBQXlCO1lBQ3pCLHVCQUF1QjtZQUN2Qix3QkFBd0I7WUFDeEIsdUJBQXVCO1lBQ3ZCLFdBQVc7WUFDWCxhQUFhO1lBQ2Isb0JBQW9CO1lBQ3BCLGNBQWM7U0FDZixDQUFDO1FBRWlCLFNBQVMsR0FBVyw2QkFBNkIsQ0FBQztRQUU5RCxLQUFLLENBQUMsTUFBTSxDQUFDLEdBQTRCO1lBQzlDLE1BQU0sVUFBVSxHQUFHLE1BQU0sQ0FBQyxHQUFHLENBQUMsVUFBVSxJQUFJLEVBQUUsQ0FBQyxDQUFDLElBQUksRUFBRSxDQUFDO1lBQ3ZELElBQUksQ0FBQyxVQUFVLEVBQUUsQ0FBQztnQkFDaEIsTUFBTSxJQUFJLEtBQUssQ0FBQyxzREFBc0QsQ0FBQyxDQUFDO1lBQzFFLENBQUM7WUFFRCxNQUFNLE9BQU8sR0FBRyxJQUFJLENBQUMsb0JBQW9CLENBQUMsR0FBRyxDQUFDLENB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