@researchdatabox/redbox-core 5.0.4-beta.12498 → 5.0.4
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.
- package/dist/CoreController.d.ts +3 -7
- package/dist/CoreController.d.ts.map +1 -1
- package/dist/CoreController.js +3 -85
- package/dist/DatastreamService.d.ts +2 -4
- package/dist/DatastreamService.d.ts.map +1 -1
- package/dist/HarvestRunService.d.ts +3 -4
- package/dist/HarvestRunService.d.ts.map +1 -1
- package/dist/HarvestRunService.js +1 -1
- package/dist/QueueService.d.ts +1 -1
- package/dist/QueueService.d.ts.map +1 -1
- package/dist/RecordWriteOptions.d.ts +21 -0
- package/dist/RecordWriteOptions.d.ts.map +1 -0
- package/dist/RecordWriteOptions.js +17 -0
- package/dist/RecordsService.d.ts +14 -105
- package/dist/RecordsService.d.ts.map +1 -1
- package/dist/RecordsService.js +1 -44
- package/dist/SearchService.d.ts +1 -2
- package/dist/SearchService.d.ts.map +1 -1
- package/dist/StorageService.d.ts +20 -48
- package/dist/StorageService.d.ts.map +1 -1
- package/dist/StorageService.js +1 -19
- package/dist/StorageServiceResponse.d.ts +1 -22
- package/dist/StorageServiceResponse.d.ts.map +1 -1
- package/dist/StorageServiceResponse.js +4 -22
- package/dist/api-routes/groups/branding.d.ts +0 -8
- package/dist/api-routes/groups/branding.d.ts.map +1 -1
- package/dist/api-routes/groups/branding.js +11 -86
- package/dist/api-routes/groups/dashboard-config.d.ts +9 -12
- package/dist/api-routes/groups/dashboard-config.d.ts.map +1 -1
- package/dist/api-routes/groups/dashboard-config.js +73 -136
- package/dist/api-routes/groups/forms.d.ts.map +1 -1
- package/dist/api-routes/groups/forms.js +2 -10
- package/dist/api-routes/groups/records.d.ts +0 -1
- package/dist/api-routes/groups/records.d.ts.map +1 -1
- package/dist/api-routes/groups/records.js +26 -141
- package/dist/api-routes/index.d.ts +0 -3
- package/dist/api-routes/index.d.ts.map +1 -1
- package/dist/api-routes/index.js +1 -4
- package/dist/api-routes/openapi.d.ts.map +1 -1
- package/dist/api-routes/openapi.js +5 -7
- package/dist/api-routes/request-extraction.d.ts.map +1 -1
- package/dist/api-routes/request-extraction.js +8 -10
- package/dist/api-routes/route-factory.d.ts.map +1 -1
- package/dist/api-routes/route-factory.js +1 -2
- package/dist/api-routes/route-registry.d.ts.map +1 -1
- package/dist/api-routes/route-registry.js +1 -3
- package/dist/api-routes/schemas/common.d.ts +0 -36
- package/dist/api-routes/schemas/common.d.ts.map +1 -1
- package/dist/api-routes/schemas/common.js +5 -95
- package/dist/api-routes/schemas/responses.d.ts +1 -1424
- package/dist/api-routes/schemas/responses.d.ts.map +1 -1
- package/dist/api-routes/schemas/responses.js +60 -382
- package/dist/api-routes/types.d.ts +0 -1
- package/dist/api-routes/types.d.ts.map +1 -1
- package/dist/api-routes/validation.d.ts +1 -5
- package/dist/api-routes/validation.d.ts.map +1 -1
- package/dist/api-routes/validation.js +15 -14
- package/dist/bootstrap.d.ts +1 -3
- package/dist/bootstrap.d.ts.map +1 -1
- package/dist/bootstrap.js +41 -58
- package/dist/config/agendaQueue.config.d.ts +0 -3
- package/dist/config/agendaQueue.config.d.ts.map +1 -1
- package/dist/config/agendaQueue.config.js +11 -29
- package/dist/config/branding.config.d.ts +0 -13
- package/dist/config/branding.config.d.ts.map +1 -1
- package/dist/config/branding.config.js +2 -34
- package/dist/config/brandingConfigurationDefaults.config.d.ts +0 -4
- package/dist/config/brandingConfigurationDefaults.config.d.ts.map +1 -1
- package/dist/config/brandingConfigurationDefaults.config.js +3 -42
- package/dist/config/datapubs.config.d.ts +72 -0
- package/dist/config/datapubs.config.d.ts.map +1 -0
- package/dist/config/datapubs.config.js +74 -0
- package/dist/config/i18n.config.d.ts +4 -0
- package/dist/config/i18n.config.d.ts.map +1 -1
- package/dist/config/i18n.config.js +1 -1
- package/dist/config/index.d.ts +4 -12
- package/dist/config/index.d.ts.map +1 -1
- package/dist/config/index.js +4 -7
- package/dist/config/policies.config.d.ts.map +1 -1
- package/dist/config/policies.config.js +23 -37
- package/dist/config/raid.config.d.ts +4 -7
- package/dist/config/raid.config.d.ts.map +1 -1
- package/dist/config/raid.config.js +35 -21
- package/dist/config/record.config.d.ts +0 -3
- package/dist/config/record.config.d.ts.map +1 -1
- package/dist/config/record.config.js +35 -37
- package/dist/config/recordtype.config.d.ts +9 -32
- package/dist/config/recordtype.config.d.ts.map +1 -1
- package/dist/config/recordtype.config.js +7 -4
- package/dist/config/routes.config.d.ts.map +1 -1
- package/dist/config/routes.config.js +53 -135
- package/dist/config/workflow.config.d.ts +0 -6
- package/dist/config/workflow.config.d.ts.map +1 -1
- package/dist/config/workflow.config.js +1 -1
- package/dist/configmodels/AdminSidebarConfig.d.ts.map +1 -1
- package/dist/configmodels/AdminSidebarConfig.js +2 -4
- package/dist/configmodels/ConfigModels.d.ts +1 -1
- package/dist/configmodels/ConfigModels.d.ts.map +1 -1
- package/dist/configmodels/ConfigModels.js +9 -26
- package/dist/configmodels/FigsharePublishing.d.ts +103 -0
- package/dist/configmodels/FigsharePublishing.d.ts.map +1 -1
- package/dist/configmodels/FigsharePublishing.js +36 -2
- package/dist/controllers/AppConfigController.d.ts.map +1 -1
- package/dist/controllers/AppConfigController.js +1 -4
- package/dist/controllers/BrandingAppController.d.ts +7 -29
- package/dist/controllers/BrandingAppController.d.ts.map +1 -1
- package/dist/controllers/BrandingAppController.js +69 -265
- package/dist/controllers/BrandingController.d.ts +1 -24
- package/dist/controllers/BrandingController.d.ts.map +1 -1
- package/dist/controllers/BrandingController.js +43 -173
- package/dist/controllers/DashboardConfigController.d.ts +2 -6
- package/dist/controllers/DashboardConfigController.d.ts.map +1 -1
- package/dist/controllers/DashboardConfigController.js +4 -18
- package/dist/controllers/DynamicAssetController.d.ts +5 -7
- package/dist/controllers/DynamicAssetController.d.ts.map +1 -1
- package/dist/controllers/DynamicAssetController.js +12 -21
- package/dist/controllers/RecordAuditController.d.ts.map +1 -1
- package/dist/controllers/RecordAuditController.js +24 -6
- package/dist/controllers/RecordController.d.ts +4 -45
- package/dist/controllers/RecordController.d.ts.map +1 -1
- package/dist/controllers/RecordController.js +345 -778
- package/dist/controllers/index.d.ts.map +1 -1
- package/dist/controllers/index.js +1 -4
- package/dist/controllers/webservice/AdminController.d.ts.map +1 -1
- package/dist/controllers/webservice/AdminController.js +3 -4
- package/dist/controllers/webservice/BrandingController.d.ts +1 -26
- package/dist/controllers/webservice/BrandingController.d.ts.map +1 -1
- package/dist/controllers/webservice/BrandingController.js +116 -292
- package/dist/controllers/webservice/DashboardConfigController.d.ts +17 -25
- package/dist/controllers/webservice/DashboardConfigController.d.ts.map +1 -1
- package/dist/controllers/webservice/DashboardConfigController.js +205 -90
- package/dist/controllers/webservice/FormManagementController.d.ts.map +1 -1
- package/dist/controllers/webservice/FormManagementController.js +3 -37
- package/dist/controllers/webservice/RecordController.d.ts +1 -15
- package/dist/controllers/webservice/RecordController.d.ts.map +1 -1
- package/dist/controllers/webservice/RecordController.js +267 -647
- package/dist/controllers/webservice/RecordTypeController.d.ts +1 -6
- package/dist/controllers/webservice/RecordTypeController.d.ts.map +1 -1
- package/dist/controllers/webservice/RecordTypeController.js +3 -21
- package/dist/controllers/webservice/SearchController.d.ts.map +1 -1
- package/dist/controllers/webservice/SearchController.js +3 -7
- package/dist/hooks/defineRedboxHook.d.ts +0 -3
- package/dist/hooks/defineRedboxHook.d.ts.map +1 -1
- package/dist/hooks/defineRedboxHook.js +1 -4
- package/dist/index.d.ts +25 -50
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +4 -90
- package/dist/loader/bootstrapShimRuntime.d.ts +1 -1
- package/dist/loader/bootstrapShimRuntime.d.ts.map +1 -1
- package/dist/loader/bootstrapShimRuntime.js +12 -20
- package/dist/loader/index.d.ts +0 -9
- package/dist/loader/index.d.ts.map +1 -1
- package/dist/loader/index.js +4 -93
- package/dist/model/BuildResponse.d.ts +11 -25
- package/dist/model/BuildResponse.d.ts.map +1 -1
- package/dist/model/BuildResponse.js +3 -4
- package/dist/model/DashboardTypeResponseModel.d.ts +0 -6
- package/dist/model/DashboardTypeResponseModel.d.ts.map +1 -1
- package/dist/model/DashboardTypeResponseModel.js +1 -7
- package/dist/model/DashboardViewResponseModel.d.ts +1 -5
- package/dist/model/DashboardViewResponseModel.d.ts.map +1 -1
- package/dist/model/DashboardViewResponseModel.js +3 -6
- package/dist/model/RBValidationError.d.ts +0 -17
- package/dist/model/RBValidationError.d.ts.map +1 -1
- package/dist/model/RBValidationError.js +1 -37
- package/dist/model/RecordTypeResponseModel.d.ts +4 -12
- package/dist/model/RecordTypeResponseModel.d.ts.map +1 -1
- package/dist/model/RecordTypeResponseModel.js +2 -11
- package/dist/model/index.d.ts +1 -5
- package/dist/model/index.d.ts.map +1 -1
- package/dist/model/index.js +2 -5
- package/dist/model/storage/BrandingModel.d.ts +0 -7
- package/dist/model/storage/BrandingModel.d.ts.map +1 -1
- package/dist/model/storage/BrandingModel.js +1 -7
- package/dist/model/storage/DeletedRecordModel.d.ts +0 -35
- package/dist/model/storage/DeletedRecordModel.d.ts.map +1 -1
- package/dist/model/storage/DeletedRecordModel.js +1 -62
- package/dist/model/storage/FigshareSyncModel.d.ts +126 -0
- package/dist/model/storage/FigshareSyncModel.d.ts.map +1 -0
- package/dist/model/storage/FigshareSyncModel.js +3 -0
- package/dist/model/storage/IntegrationAuditModel.d.ts +2 -16
- package/dist/model/storage/IntegrationAuditModel.d.ts.map +1 -1
- package/dist/model/storage/IntegrationAuditModel.js +1 -15
- package/dist/model/storage/RecordAuditModel.d.ts +4 -11
- package/dist/model/storage/RecordAuditModel.d.ts.map +1 -1
- package/dist/model/storage/RecordAuditModel.js +30 -8
- package/dist/model/storage/RecordModel.d.ts +3 -6
- package/dist/model/storage/RecordModel.d.ts.map +1 -1
- package/dist/model/storage/RecordTypeModel.d.ts +0 -6
- package/dist/model/storage/RecordTypeModel.d.ts.map +1 -1
- package/dist/model/storage/RecordTypeModel.js +1 -4
- package/dist/model/storage/index.d.ts +10 -12
- package/dist/model/storage/index.d.ts.map +1 -1
- package/dist/model/storage/index.js +2 -24
- package/dist/policies/checkAuth.d.ts +6 -2
- package/dist/policies/checkAuth.d.ts.map +1 -1
- package/dist/policies/checkAuth.js +9 -32
- package/dist/policies/contentSecurityPolicy.d.ts.map +1 -1
- package/dist/policies/contentSecurityPolicy.js +2 -85
- package/dist/policies/index.d.ts +2 -3
- package/dist/policies/index.d.ts.map +1 -1
- package/dist/policies/index.js +2 -4
- package/dist/policies/validateApiContractRequest.d.ts.map +1 -1
- package/dist/policies/validateApiContractRequest.js +11 -49
- package/dist/services/AgendaQueueService.d.ts +1 -1
- package/dist/services/AgendaQueueService.d.ts.map +1 -1
- package/dist/services/AgendaQueueService.js +7 -4
- package/dist/services/AppConfigService.d.ts +0 -6
- package/dist/services/AppConfigService.d.ts.map +1 -1
- package/dist/services/AppConfigService.js +1 -23
- package/dist/services/AttachmentMetadataService.d.ts +0 -58
- package/dist/services/AttachmentMetadataService.d.ts.map +1 -1
- package/dist/services/AttachmentMetadataService.js +8 -643
- package/dist/services/BrandingLogoService.d.ts +1 -6
- package/dist/services/BrandingLogoService.d.ts.map +1 -1
- package/dist/services/BrandingLogoService.js +9 -77
- package/dist/services/BrandingService.d.ts +9 -171
- package/dist/services/BrandingService.d.ts.map +1 -1
- package/dist/services/BrandingService.js +68 -572
- package/dist/services/BrandingThemeCssService.d.ts +1 -17
- package/dist/services/BrandingThemeCssService.d.ts.map +1 -1
- package/dist/services/BrandingThemeCssService.js +9 -71
- package/dist/services/DashboardConfigService.d.ts +54 -214
- package/dist/services/DashboardConfigService.d.ts.map +1 -1
- package/dist/services/DashboardConfigService.js +261 -829
- package/dist/services/DashboardTypesService.d.ts +4 -15
- package/dist/services/DashboardTypesService.d.ts.map +1 -1
- package/dist/services/DashboardTypesService.js +139 -72
- package/dist/services/DoiService.d.ts +1 -1
- package/dist/services/DoiService.d.ts.map +1 -1
- package/dist/services/DoiService.js +45 -71
- package/dist/services/FigshareService.d.ts +15 -10
- package/dist/services/FigshareService.d.ts.map +1 -1
- package/dist/services/FigshareService.js +82 -583
- package/dist/services/FormRecordConsistencyService.d.ts +23 -8
- package/dist/services/FormRecordConsistencyService.d.ts.map +1 -1
- package/dist/services/FormRecordConsistencyService.js +70 -54
- package/dist/services/FormsService.d.ts +2 -91
- package/dist/services/FormsService.d.ts.map +1 -1
- package/dist/services/FormsService.js +64 -324
- package/dist/services/HarvestRunService.d.ts +3 -6
- package/dist/services/HarvestRunService.d.ts.map +1 -1
- package/dist/services/HarvestRunService.js +97 -161
- package/dist/services/I18nEntriesService.d.ts +2 -1
- package/dist/services/I18nEntriesService.d.ts.map +1 -1
- package/dist/services/I18nEntriesService.js +45 -30
- package/dist/services/OniService.d.ts +62 -19
- package/dist/services/OniService.d.ts.map +1 -1
- package/dist/services/OniService.js +691 -223
- package/dist/services/RDMPService.d.ts +1 -1
- package/dist/services/RDMPService.d.ts.map +1 -1
- package/dist/services/RDMPService.js +5 -5
- package/dist/services/RaidService.d.ts +61 -19
- package/dist/services/RaidService.d.ts.map +1 -1
- package/dist/services/RaidService.js +530 -191
- package/dist/services/RecordTypesService.d.ts +0 -29
- package/dist/services/RecordTypesService.d.ts.map +1 -1
- package/dist/services/RecordTypesService.js +11 -106
- package/dist/services/RecordsService.d.ts +26 -313
- package/dist/services/RecordsService.d.ts.map +1 -1
- package/dist/services/RecordsService.js +763 -5089
- package/dist/services/SolrSearchService.d.ts +1 -1
- package/dist/services/SolrSearchService.d.ts.map +1 -1
- package/dist/services/SolrSearchService.js +12 -42
- package/dist/services/StandardDatastreamService.d.ts +5 -4
- package/dist/services/StandardDatastreamService.d.ts.map +1 -1
- package/dist/services/StandardDatastreamService.js +61 -106
- package/dist/services/TriggerService.d.ts.map +1 -1
- package/dist/services/TriggerService.js +30 -54
- package/dist/services/UsersService.d.ts +1 -2
- package/dist/services/UsersService.d.ts.map +1 -1
- package/dist/services/UsersService.js +283 -364
- package/dist/services/VocabularyService.d.ts +0 -2
- package/dist/services/VocabularyService.d.ts.map +1 -1
- package/dist/services/VocabularyService.js +2 -61
- package/dist/services/WorkflowStepsService.d.ts +0 -11
- package/dist/services/WorkflowStepsService.d.ts.map +1 -1
- package/dist/services/WorkflowStepsService.js +3 -32
- package/dist/services/WorkspaceService.d.ts +2 -2
- package/dist/services/WorkspaceService.d.ts.map +1 -1
- package/dist/services/WorkspaceService.js +5 -5
- package/dist/services/doi-v2/bindings.d.ts.map +1 -1
- package/dist/services/doi-v2/bindings.js +20 -3
- package/dist/services/doi-v2/config.d.ts +0 -1
- package/dist/services/doi-v2/config.d.ts.map +1 -1
- package/dist/services/doi-v2/config.js +5 -13
- package/dist/services/doi-v2/runtime.d.ts.map +1 -1
- package/dist/services/doi-v2/runtime.js +54 -14
- package/dist/services/figshare-v2/admin.d.ts +16 -0
- package/dist/services/figshare-v2/admin.d.ts.map +1 -0
- package/dist/services/figshare-v2/admin.js +283 -0
- package/dist/services/figshare-v2/assets.d.ts +20 -1
- package/dist/services/figshare-v2/assets.d.ts.map +1 -1
- package/dist/services/figshare-v2/assets.js +16 -1
- package/dist/services/figshare-v2/bindings.d.ts.map +1 -1
- package/dist/services/figshare-v2/bindings.js +20 -3
- package/dist/services/figshare-v2/config.d.ts +8 -2
- package/dist/services/figshare-v2/config.d.ts.map +1 -1
- package/dist/services/figshare-v2/config.js +31 -3
- package/dist/services/figshare-v2/execution.d.ts +25 -0
- package/dist/services/figshare-v2/execution.d.ts.map +1 -0
- package/dist/services/figshare-v2/execution.js +49 -0
- package/dist/services/figshare-v2/http.d.ts +6 -1
- package/dist/services/figshare-v2/http.d.ts.map +1 -1
- package/dist/services/figshare-v2/http.js +69 -12
- package/dist/services/figshare-v2/identity.d.ts +12 -0
- package/dist/services/figshare-v2/identity.d.ts.map +1 -0
- package/dist/services/figshare-v2/identity.js +78 -0
- package/dist/services/figshare-v2/managed-assets.d.ts +9 -0
- package/dist/services/figshare-v2/managed-assets.d.ts.map +1 -0
- package/dist/services/figshare-v2/managed-assets.js +229 -0
- package/dist/services/figshare-v2/plan.d.ts.map +1 -1
- package/dist/services/figshare-v2/plan.js +2 -9
- package/dist/services/figshare-v2/runtime.d.ts.map +1 -1
- package/dist/services/figshare-v2/runtime.js +58 -11
- package/dist/services/figshare-v2/source-intent.d.ts +9 -0
- package/dist/services/figshare-v2/source-intent.d.ts.map +1 -0
- package/dist/services/figshare-v2/source-intent.js +93 -0
- package/dist/services/figshare-v2/status.d.ts +4 -0
- package/dist/services/figshare-v2/status.d.ts.map +1 -0
- package/dist/services/figshare-v2/status.js +29 -0
- package/dist/services/figshare-v2/sync-store.d.ts +27 -0
- package/dist/services/figshare-v2/sync-store.d.ts.map +1 -0
- package/dist/services/figshare-v2/sync-store.js +139 -0
- package/dist/services/figshare-v2/types.d.ts +3 -0
- package/dist/services/figshare-v2/types.d.ts.map +1 -1
- package/dist/services/figshare-v2/types.js +1 -1
- package/dist/services/figshare-v2/worker.d.ts +16 -0
- package/dist/services/figshare-v2/worker.d.ts.map +1 -0
- package/dist/services/figshare-v2/worker.js +572 -0
- package/dist/services/index.d.ts +0 -9
- package/dist/services/index.d.ts.map +1 -1
- package/dist/services/index.js +3 -45
- package/dist/utilities/TranslationHtml.d.ts +3 -0
- package/dist/utilities/TranslationHtml.d.ts.map +1 -0
- package/dist/utilities/TranslationHtml.js +46 -0
- package/dist/visitor/client.visitor.d.ts +0 -6
- package/dist/visitor/client.visitor.d.ts.map +1 -1
- package/dist/visitor/client.visitor.js +14 -59
- package/dist/visitor/construct.visitor.d.ts +1 -27
- package/dist/visitor/construct.visitor.d.ts.map +1 -1
- package/dist/visitor/construct.visitor.js +177 -265
- package/dist/visitor/context-variables.visitor.d.ts +1 -3
- package/dist/visitor/context-variables.visitor.d.ts.map +1 -1
- package/dist/visitor/context-variables.visitor.js +1 -15
- package/dist/visitor/data-value.visitor.d.ts +0 -6
- package/dist/visitor/data-value.visitor.d.ts.map +1 -1
- package/dist/visitor/data-value.visitor.js +1 -10
- package/dist/visitor/json-type-def.visitor.d.ts +0 -6
- package/dist/visitor/json-type-def.visitor.d.ts.map +1 -1
- package/dist/visitor/json-type-def.visitor.js +1 -10
- package/dist/visitor/migrate-config-v4-v5.visitor.d.ts +0 -11
- package/dist/visitor/migrate-config-v4-v5.visitor.d.ts.map +1 -1
- package/dist/visitor/migrate-config-v4-v5.visitor.js +133 -228
- package/dist/visitor/template.visitor.d.ts +2 -17
- package/dist/visitor/template.visitor.d.ts.map +1 -1
- package/dist/visitor/template.visitor.js +22 -60
- package/dist/visitor/validator.visitor.d.ts +7 -49
- package/dist/visitor/validator.visitor.d.ts.map +1 -1
- package/dist/visitor/validator.visitor.js +178 -275
- package/dist/waterline-models/AttachmentMetadata.d.ts +0 -22
- package/dist/waterline-models/AttachmentMetadata.d.ts.map +1 -1
- package/dist/waterline-models/AttachmentMetadata.js +3 -147
- package/dist/waterline-models/BrandingConfig.d.ts +0 -7
- package/dist/waterline-models/BrandingConfig.d.ts.map +1 -1
- package/dist/waterline-models/BrandingConfig.js +1 -16
- package/dist/waterline-models/BrandingConfigHistory.d.ts +2 -11
- package/dist/waterline-models/BrandingConfigHistory.d.ts.map +1 -1
- package/dist/waterline-models/BrandingConfigHistory.js +1 -21
- package/dist/waterline-models/FigshareSync.d.ts +41 -0
- package/dist/waterline-models/FigshareSync.d.ts.map +1 -0
- package/dist/waterline-models/FigshareSync.js +168 -0
- package/dist/waterline-models/RecordType.d.ts +0 -9
- package/dist/waterline-models/RecordType.d.ts.map +1 -1
- package/dist/waterline-models/RecordType.js +1 -16
- package/dist/waterline-models/User.d.ts.map +1 -1
- package/dist/waterline-models/User.js +15 -10
- package/dist/waterline-models/index.d.ts +2 -2
- package/dist/waterline-models/index.d.ts.map +1 -1
- package/dist/waterline-models/index.js +4 -4
- package/package.json +46 -59
- package/dist/AttachmentStagingIdentity.d.ts +0 -3
- package/dist/AttachmentStagingIdentity.d.ts.map +0 -1
- package/dist/AttachmentStagingIdentity.js +0 -10
- package/dist/RecordConcurrencyObservability.d.ts +0 -51
- package/dist/RecordConcurrencyObservability.d.ts.map +0 -1
- package/dist/RecordConcurrencyObservability.js +0 -136
- package/dist/RecordEntityTag.d.ts +0 -31
- package/dist/RecordEntityTag.d.ts.map +0 -1
- package/dist/RecordEntityTag.js +0 -101
- package/dist/RecordFormFingerprint.d.ts +0 -7
- package/dist/RecordFormFingerprint.d.ts.map +0 -1
- package/dist/RecordFormFingerprint.js +0 -106
- package/dist/RecordHttpConcurrency.d.ts +0 -60
- package/dist/RecordHttpConcurrency.d.ts.map +0 -1
- package/dist/RecordHttpConcurrency.js +0 -181
- package/dist/RecordSaveResponse.d.ts +0 -219
- package/dist/RecordSaveResponse.d.ts.map +0 -1
- package/dist/RecordSaveResponse.js +0 -639
- package/dist/RecordStorageConcurrency.d.ts +0 -48
- package/dist/RecordStorageConcurrency.d.ts.map +0 -1
- package/dist/RecordStorageConcurrency.js +0 -103
- package/dist/RecordWriteClassification.d.ts +0 -12
- package/dist/RecordWriteClassification.d.ts.map +0 -1
- package/dist/RecordWriteClassification.js +0 -70
- package/dist/action-execution/audit.d.ts +0 -41
- package/dist/action-execution/audit.d.ts.map +0 -1
- package/dist/action-execution/audit.js +0 -122
- package/dist/action-execution/executor.d.ts +0 -24
- package/dist/action-execution/executor.d.ts.map +0 -1
- package/dist/action-execution/executor.js +0 -435
- package/dist/action-execution/failure.d.ts +0 -49
- package/dist/action-execution/failure.d.ts.map +0 -1
- package/dist/action-execution/failure.js +0 -129
- package/dist/action-execution/index.d.ts +0 -7
- package/dist/action-execution/index.d.ts.map +0 -1
- package/dist/action-execution/index.js +0 -23
- package/dist/action-execution/legacy-result.d.ts +0 -21
- package/dist/action-execution/legacy-result.d.ts.map +0 -1
- package/dist/action-execution/legacy-result.js +0 -70
- package/dist/action-execution/policy.d.ts +0 -12
- package/dist/action-execution/policy.d.ts.map +0 -1
- package/dist/action-execution/policy.js +0 -138
- package/dist/action-execution/types.d.ts +0 -121
- package/dist/action-execution/types.d.ts.map +0 -1
- package/dist/action-execution/types.js +0 -22
- package/dist/api-routes/groups/record-schemas.d.ts +0 -5
- package/dist/api-routes/groups/record-schemas.d.ts.map +0 -1
- package/dist/api-routes/groups/record-schemas.js +0 -181
- package/dist/api-routes/record-schema-openapi.d.ts +0 -26
- package/dist/api-routes/record-schema-openapi.d.ts.map +0 -1
- package/dist/api-routes/record-schema-openapi.js +0 -38
- package/dist/api-routes/record-schema-response.d.ts +0 -40
- package/dist/api-routes/record-schema-response.d.ts.map +0 -1
- package/dist/api-routes/record-schema-response.js +0 -89
- package/dist/config/recordSchema.config.d.ts +0 -68
- package/dist/config/recordSchema.config.d.ts.map +0 -1
- package/dist/config/recordSchema.config.js +0 -173
- package/dist/config/recordValidation.config.d.ts +0 -19
- package/dist/config/recordValidation.config.d.ts.map +0 -1
- package/dist/config/recordValidation.config.js +0 -10
- package/dist/configmodels/DashboardFieldCatalogue.d.ts +0 -67
- package/dist/configmodels/DashboardFieldCatalogue.d.ts.map +0 -1
- package/dist/configmodels/DashboardFieldCatalogue.js +0 -174
- package/dist/configmodels/DashboardSettings.d.ts +0 -191
- package/dist/configmodels/DashboardSettings.d.ts.map +0 -1
- package/dist/configmodels/DashboardSettings.js +0 -705
- package/dist/configmodels/OniPublishing.d.ts +0 -205
- package/dist/configmodels/OniPublishing.d.ts.map +0 -1
- package/dist/configmodels/OniPublishing.js +0 -335
- package/dist/configmodels/RaidPublishing.d.ts +0 -97
- package/dist/configmodels/RaidPublishing.d.ts.map +0 -1
- package/dist/configmodels/RaidPublishing.js +0 -35
- package/dist/configmodels/WebAnalytics.d.ts +0 -55
- package/dist/configmodels/WebAnalytics.d.ts.map +0 -1
- package/dist/configmodels/WebAnalytics.js +0 -61
- package/dist/controllers/BrandingControllerSupport.d.ts +0 -20
- package/dist/controllers/BrandingControllerSupport.d.ts.map +0 -1
- package/dist/controllers/BrandingControllerSupport.js +0 -80
- package/dist/controllers/webservice/RecordSchemaController.d.ts +0 -32
- package/dist/controllers/webservice/RecordSchemaController.d.ts.map +0 -1
- package/dist/controllers/webservice/RecordSchemaController.js +0 -356
- package/dist/model/BrandingTypeface.d.ts +0 -70
- package/dist/model/BrandingTypeface.d.ts.map +0 -1
- package/dist/model/BrandingTypeface.js +0 -116
- package/dist/model/record-contract.d.ts +0 -42
- package/dist/model/record-contract.d.ts.map +0 -1
- package/dist/model/record-contract.js +0 -3
- package/dist/model/storage/record-schema.d.ts +0 -115
- package/dist/model/storage/record-schema.d.ts.map +0 -1
- package/dist/model/storage/record-schema.js +0 -3
- package/dist/record-contract/ajv-error-mapper.d.ts +0 -34
- package/dist/record-contract/ajv-error-mapper.d.ts.map +0 -1
- package/dist/record-contract/ajv-error-mapper.js +0 -153
- package/dist/record-contract/canonical-json.d.ts +0 -20
- package/dist/record-contract/canonical-json.d.ts.map +0 -1
- package/dist/record-contract/canonical-json.js +0 -126
- package/dist/record-contract/codes.d.ts +0 -36
- package/dist/record-contract/codes.d.ts.map +0 -1
- package/dist/record-contract/codes.js +0 -38
- package/dist/record-contract/contributor-registry.d.ts +0 -76
- package/dist/record-contract/contributor-registry.d.ts.map +0 -1
- package/dist/record-contract/contributor-registry.js +0 -126
- package/dist/record-contract/core-contributors.d.ts +0 -44
- package/dist/record-contract/core-contributors.d.ts.map +0 -1
- package/dist/record-contract/core-contributors.js +0 -395
- package/dist/record-contract/deep-freeze.d.ts +0 -3
- package/dist/record-contract/deep-freeze.d.ts.map +0 -1
- package/dist/record-contract/deep-freeze.js +0 -23
- package/dist/record-contract/index.d.ts +0 -13
- package/dist/record-contract/index.d.ts.map +0 -1
- package/dist/record-contract/index.js +0 -29
- package/dist/record-contract/json-pointer.d.ts +0 -20
- package/dist/record-contract/json-pointer.d.ts.map +0 -1
- package/dist/record-contract/json-pointer.js +0 -70
- package/dist/record-contract/json-schema-renderer.d.ts +0 -51
- package/dist/record-contract/json-schema-renderer.d.ts.map +0 -1
- package/dist/record-contract/json-schema-renderer.js +0 -450
- package/dist/record-contract/record-contract-compiler.d.ts +0 -42
- package/dist/record-contract/record-contract-compiler.d.ts.map +0 -1
- package/dist/record-contract/record-contract-compiler.js +0 -775
- package/dist/record-contract/record-contract-context.d.ts +0 -91
- package/dist/record-contract/record-contract-context.d.ts.map +0 -1
- package/dist/record-contract/record-contract-context.js +0 -39
- package/dist/record-contract/record-json-schema-artifact.d.ts +0 -74
- package/dist/record-contract/record-json-schema-artifact.d.ts.map +0 -1
- package/dist/record-contract/record-json-schema-artifact.js +0 -309
- package/dist/record-contract/record-json-schema-etag.d.ts +0 -15
- package/dist/record-contract/record-json-schema-etag.d.ts.map +0 -1
- package/dist/record-contract/record-json-schema-etag.js +0 -41
- package/dist/record-contract/types.d.ts +0 -151
- package/dist/record-contract/types.d.ts.map +0 -1
- package/dist/record-contract/types.js +0 -6
- package/dist/services/BrandingTypefaceService.d.ts +0 -74
- package/dist/services/BrandingTypefaceService.d.ts.map +0 -1
- package/dist/services/BrandingTypefaceService.js +0 -359
- package/dist/services/BrandingWoff2Inspector.d.ts +0 -17
- package/dist/services/BrandingWoff2Inspector.d.ts.map +0 -1
- package/dist/services/BrandingWoff2Inspector.js +0 -402
- package/dist/services/DashboardLegacyConversion.d.ts +0 -82
- package/dist/services/DashboardLegacyConversion.d.ts.map +0 -1
- package/dist/services/DashboardLegacyConversion.js +0 -427
- package/dist/services/RecordSchemaService.d.ts +0 -440
- package/dist/services/RecordSchemaService.d.ts.map +0 -1
- package/dist/services/RecordSchemaService.js +0 -3061
- package/dist/services/RecordValidationService.d.ts +0 -340
- package/dist/services/RecordValidationService.d.ts.map +0 -1
- package/dist/services/RecordValidationService.js +0 -1898
- package/dist/services/form-record-access-user.d.ts +0 -3
- package/dist/services/form-record-access-user.d.ts.map +0 -1
- package/dist/services/form-record-access-user.js +0 -23
- package/dist/services/integration-v2/bindings.d.ts +0 -3
- package/dist/services/integration-v2/bindings.d.ts.map +0 -1
- package/dist/services/integration-v2/bindings.js +0 -91
- package/dist/services/integration-v2/runtime.d.ts +0 -3
- package/dist/services/integration-v2/runtime.d.ts.map +0 -1
- package/dist/services/integration-v2/runtime.js +0 -50
- package/dist/services/internal-record-schema-authorization.d.ts +0 -8
- package/dist/services/internal-record-schema-authorization.d.ts.map +0 -1
- package/dist/services/internal-record-schema-authorization.js +0 -16
- package/dist/services/oni-v2/audit.d.ts +0 -19
- package/dist/services/oni-v2/audit.d.ts.map +0 -1
- package/dist/services/oni-v2/audit.js +0 -50
- package/dist/services/oni-v2/bindings.d.ts +0 -7
- package/dist/services/oni-v2/bindings.d.ts.map +0 -1
- package/dist/services/oni-v2/bindings.js +0 -31
- package/dist/services/oni-v2/config.d.ts +0 -12
- package/dist/services/oni-v2/config.d.ts.map +0 -1
- package/dist/services/oni-v2/config.js +0 -134
- package/dist/services/oni-v2/context.d.ts +0 -3
- package/dist/services/oni-v2/context.d.ts.map +0 -1
- package/dist/services/oni-v2/context.js +0 -17
- package/dist/services/oni-v2/crate.d.ts +0 -17
- package/dist/services/oni-v2/crate.d.ts.map +0 -1
- package/dist/services/oni-v2/crate.js +0 -504
- package/dist/services/oni-v2/flydriveOcflStore.d.ts +0 -69
- package/dist/services/oni-v2/flydriveOcflStore.d.ts.map +0 -1
- package/dist/services/oni-v2/flydriveOcflStore.js +0 -325
- package/dist/services/oni-v2/ingestion.d.ts +0 -37
- package/dist/services/oni-v2/ingestion.d.ts.map +0 -1
- package/dist/services/oni-v2/ingestion.js +0 -91
- package/dist/services/oni-v2/mapping.d.ts +0 -17
- package/dist/services/oni-v2/mapping.d.ts.map +0 -1
- package/dist/services/oni-v2/mapping.js +0 -137
- package/dist/services/oni-v2/repository.d.ts +0 -9
- package/dist/services/oni-v2/repository.d.ts.map +0 -1
- package/dist/services/oni-v2/repository.js +0 -180
- package/dist/services/oni-v2/runtime.d.ts +0 -23
- package/dist/services/oni-v2/runtime.d.ts.map +0 -1
- package/dist/services/oni-v2/runtime.js +0 -121
- package/dist/services/oni-v2/templating.d.ts +0 -11
- package/dist/services/oni-v2/templating.d.ts.map +0 -1
- package/dist/services/oni-v2/templating.js +0 -27
- package/dist/services/oni-v2/types.d.ts +0 -100
- package/dist/services/oni-v2/types.d.ts.map +0 -1
- package/dist/services/oni-v2/types.js +0 -3
- package/dist/services/raid-v2/audit.d.ts +0 -10
- package/dist/services/raid-v2/audit.d.ts.map +0 -1
- package/dist/services/raid-v2/audit.js +0 -29
- package/dist/services/raid-v2/errors.d.ts +0 -85
- package/dist/services/raid-v2/errors.d.ts.map +0 -1
- package/dist/services/raid-v2/errors.js +0 -36
- package/dist/services/raid-v2/http.d.ts +0 -4
- package/dist/services/raid-v2/http.d.ts.map +0 -1
- package/dist/services/raid-v2/http.js +0 -84
- package/dist/services/raid-v2/logger.d.ts +0 -8
- package/dist/services/raid-v2/logger.d.ts.map +0 -1
- package/dist/services/raid-v2/logger.js +0 -30
- package/dist/services/raid-v2/mapping.d.ts +0 -9
- package/dist/services/raid-v2/mapping.d.ts.map +0 -1
- package/dist/services/raid-v2/mapping.js +0 -168
- package/dist/services/raid-v2/runtime.d.ts +0 -5
- package/dist/services/raid-v2/runtime.d.ts.map +0 -1
- package/dist/services/raid-v2/runtime.js +0 -135
- package/dist/services/raid-v2/tags.d.ts +0 -11
- package/dist/services/raid-v2/tags.d.ts.map +0 -1
- package/dist/services/raid-v2/tags.js +0 -12
- package/dist/services/raid-v2/types.d.ts +0 -66
- package/dist/services/raid-v2/types.d.ts.map +0 -1
- package/dist/services/raid-v2/types.js +0 -3
- package/dist/services/record-hooks/coordinator.d.ts +0 -64
- package/dist/services/record-hooks/coordinator.d.ts.map +0 -1
- package/dist/services/record-hooks/coordinator.js +0 -276
- package/dist/visitor/related-object-data-inline.visitor.d.ts +0 -31
- package/dist/visitor/related-object-data-inline.visitor.d.ts.map +0 -1
- package/dist/visitor/related-object-data-inline.visitor.js +0 -96
- package/dist/waterline-models/DashboardConfiguration.d.ts +0 -29
- package/dist/waterline-models/DashboardConfiguration.d.ts.map +0 -1
- package/dist/waterline-models/DashboardConfiguration.js +0 -52
|
@@ -1,31 +1,14 @@
|
|
|
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");
|
|
5
4
|
const CoreService_1 = require("../CoreService");
|
|
6
|
-
const AttachmentStagingIdentity_1 = require("../AttachmentStagingIdentity");
|
|
7
5
|
var Services;
|
|
8
6
|
(function (Services) {
|
|
9
|
-
const STAGING_COORDINATOR_OID = '__global_attachment_staging__';
|
|
10
|
-
const STAGING_COORDINATOR_LEASE_MS = 5 * 60 * 1000;
|
|
11
7
|
class AttachmentMetadataService extends CoreService_1.Services.Core.Service {
|
|
12
8
|
_exportedMethods = [
|
|
13
9
|
'upsert',
|
|
14
10
|
'findByOid',
|
|
15
|
-
'findUnresolvedByOid',
|
|
16
|
-
'findUnresolvedByStagingFileId',
|
|
17
11
|
'findOneByStorageKey',
|
|
18
|
-
'prepareMutations',
|
|
19
|
-
'markMutation',
|
|
20
|
-
'hasCleanupClaim',
|
|
21
|
-
'claimExpiredStagingCleanup',
|
|
22
|
-
'beginStagingCleanup',
|
|
23
|
-
'authorizeStagingCleanup',
|
|
24
|
-
'releaseStagingCleanup',
|
|
25
|
-
'completeStagingCleanup',
|
|
26
|
-
'recoverStagingCleanup',
|
|
27
|
-
'rebindOid',
|
|
28
|
-
'markDeleted',
|
|
29
12
|
'deleteByStorageKey',
|
|
30
13
|
'recordAccess',
|
|
31
14
|
];
|
|
@@ -38,26 +21,10 @@ var Services;
|
|
|
38
21
|
const payload = this.normalizeMetadataRow(row);
|
|
39
22
|
const oid = String(payload.oid ?? '').trim();
|
|
40
23
|
const fileId = String(payload.fileId ?? '').trim();
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
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
|
-
}
|
|
24
|
+
const existing = await AttachmentMetadata.findOne({ storageKey })
|
|
25
|
+
?? (oid && fileId
|
|
26
|
+
? await AttachmentMetadata.findOne({ oid, fileId })
|
|
27
|
+
: null);
|
|
61
28
|
if (existing?.id) {
|
|
62
29
|
await AttachmentMetadata.updateOne({ id: existing.id }).set(payload);
|
|
63
30
|
return;
|
|
@@ -69,377 +36,14 @@ var Services;
|
|
|
69
36
|
if (!normalizedOid) {
|
|
70
37
|
return [];
|
|
71
38
|
}
|
|
72
|
-
|
|
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
|
-
});
|
|
39
|
+
return await AttachmentMetadata.find({ oid: normalizedOid }).sort([{ createdAt: 'ASC' }]);
|
|
436
40
|
}
|
|
437
41
|
async findOneByStorageKey(storageKey) {
|
|
438
42
|
const normalizedStorageKey = String(storageKey ?? '').trim();
|
|
439
43
|
if (!normalizedStorageKey) {
|
|
440
44
|
return undefined;
|
|
441
45
|
}
|
|
442
|
-
return
|
|
46
|
+
return await AttachmentMetadata.findOne({ storageKey: normalizedStorageKey });
|
|
443
47
|
}
|
|
444
48
|
async deleteByStorageKey(storageKey) {
|
|
445
49
|
const normalizedStorageKey = String(storageKey ?? '').trim();
|
|
@@ -455,9 +59,7 @@ var Services;
|
|
|
455
59
|
return;
|
|
456
60
|
}
|
|
457
61
|
if (normalizedEvent.storageKey && normalizedEvent.action !== 'list') {
|
|
458
|
-
const existing =
|
|
459
|
-
storageKey: normalizedEvent.storageKey,
|
|
460
|
-
}));
|
|
62
|
+
const existing = await AttachmentMetadata.findOne({ storageKey: normalizedEvent.storageKey });
|
|
461
63
|
if (existing?.id) {
|
|
462
64
|
const currentCount = Number(existing.accessCount ?? 0);
|
|
463
65
|
const nextCount = this.shouldIncrementAccessCount(normalizedEvent.action) ? currentCount + 1 : currentCount;
|
|
@@ -475,175 +77,6 @@ var Services;
|
|
|
475
77
|
throw err;
|
|
476
78
|
}
|
|
477
79
|
}
|
|
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
|
-
}
|
|
647
80
|
shouldIncrementAccessCount(action) {
|
|
648
81
|
return action === 'download' || action === 'access';
|
|
649
82
|
}
|
|
@@ -652,10 +85,6 @@ var Services;
|
|
|
652
85
|
oid: String(row.oid ?? '').trim(),
|
|
653
86
|
fileId: String(row.fileId ?? '').trim(),
|
|
654
87
|
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),
|
|
659
88
|
contentType: this.optionalString(row.contentType),
|
|
660
89
|
contentLength: this.optionalNumber(row.contentLength),
|
|
661
90
|
etag: this.optionalString(row.etag),
|
|
@@ -669,70 +98,6 @@ var Services;
|
|
|
669
98
|
accessCount: this.optionalNumber(row.accessCount) ?? 0,
|
|
670
99
|
};
|
|
671
100
|
}
|
|
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
|
-
}
|
|
736
101
|
normalizeAccessEvent(event) {
|
|
737
102
|
return {
|
|
738
103
|
oid: String(event.oid ?? '').trim(),
|
|
@@ -765,4 +130,4 @@ var Services;
|
|
|
765
130
|
}
|
|
766
131
|
Services.AttachmentMetadataService = AttachmentMetadataService;
|
|
767
132
|
})(Services || (exports.Services = Services = {}));
|
|
768
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiQXR0YWNobWVudE1ldGFkYXRhU2VydmljZS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9zZXJ2aWNlcy9BdHRhY2htZW50TWV0YWRhdGFTZXJ2aWNlLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7OztBQUFBLDZDQUFxRDtBQUNyRCxnREFBc0Q7QUFFdEQsNEVBQWdGO0FBRWhGLElBQWlCLFFBQVEsQ0EwOEJ4QjtBQTE4QkQsV0FBaUIsUUFBUTtJQUN2QixNQUFNLHVCQUF1QixHQUFHLCtCQUErQixDQUFDO0lBQ2hFLE1BQU0sNEJBQTRCLEdBQUcsQ0FBQyxHQUFHLEVBQUUsR0FBRyxJQUFJLENBQUM7SUF1RG5ELE1BQWEseUJBQTBCLFNBQVEsc0JBQVEsQ0FBQyxJQUFJLENBQUMsT0FBTztRQUMvQyxnQkFBZ0IsR0FBYTtZQUM5QyxRQUFRO1lBQ1IsV0FBVztZQUNYLHFCQUFxQjtZQUNyQiwrQkFBK0I7WUFDL0IscUJBQXFCO1lBQ3JCLGtCQUFrQjtZQUNsQixjQUFjO1lBQ2QsaUJBQWlCO1lBQ2pCLDRCQUE0QjtZQUM1QixxQkFBcUI7WUFDckIseUJBQXlCO1lBQ3pCLHVCQUF1QjtZQUN2Qix3QkFBd0I7WUFDeEIsdUJBQXVCO1lBQ3ZCLFdBQVc7WUFDWCxhQUFhO1lBQ2Isb0JBQW9CO1lBQ3BCLGNBQWM7U0FDZixDQUFDO1FBRWlCLFNBQVMsR0FBVyw2QkFBNkIsQ0FBQztRQUU5RCxLQUFLLENBQUMsTUFBTSxDQUFDLEdBQTRCO1lBQzlDLE1BQU0sVUFBVSxHQUFHLE1BQU0sQ0FBQyxHQUFHLENBQUMsVUFBVSxJQUFJLEVBQUUsQ0FBQyxDQUFDLElBQUksRUFBRSxDQUFDO1lBQ3ZELElBQUksQ0FBQyxVQUFVLEVBQUUsQ0FBQztnQkFDaEIsTUFBTSxJQUFJLEtBQUssQ0FBQyxzREFBc0QsQ0FBQyxDQUFDO1lBQzFFLENBQUM7WUFFRCxNQUFNLE9BQU8sR0FBRyxJQUFJLENBQUMsb0JBQW9CLENBQUMsR0FBRyxDQUFDLENB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
|
|
133
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiQXR0YWNobWVudE1ldGFkYXRhU2VydmljZS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9zZXJ2aWNlcy9BdHRhY2htZW50TWV0YWRhdGFTZXJ2aWNlLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7OztBQUFBLGdEQUFzRDtBQUd0RCxJQUFpQixRQUFRLENBdUp4QjtBQXZKRCxXQUFpQixRQUFRO0lBYXZCLE1BQWEseUJBQTBCLFNBQVEsc0JBQVEsQ0FBQyxJQUFJLENBQUMsT0FBTztRQUMvQyxnQkFBZ0IsR0FBYTtZQUM5QyxRQUFRO1lBQ1IsV0FBVztZQUNYLHFCQUFxQjtZQUNyQixvQkFBb0I7WUFDcEIsY0FBYztTQUNmLENBQUM7UUFFaUIsU0FBUyxHQUFXLDZCQUE2QixDQUFDO1FBRTlELEtBQUssQ0FBQyxNQUFNLENBQUMsR0FBNEI7WUFDOUMsTUFBTSxVQUFVLEdBQUcsTUFBTSxDQUFDLEdBQUcsQ0FBQyxVQUFVLElBQUksRUFBRSxDQUFDLENBQUMsSUFBSSxFQUFFLENBQUM7WUFDdkQsSUFBSSxDQUFDLFVBQVUsRUFBRSxDQUFDO2dCQUNoQixNQUFNLElBQUksS0FBSyxDQUFDLHNEQUFzRCxDQUFDLENBQUM7WUFDMUUsQ0FBQztZQUVELE1BQU0sT0FBTyxHQUFHLElBQUksQ0FBQyxvQkFBb0IsQ0FBQyxHQUFHLENBQUMsQ0FBQztZQUMvQyxNQUFNLEdBQUcsR0FBRyxNQUFNLENBQUMsT0FBTyxDQUFDLEdBQUcsSUFBSSxFQUFFLENBQUMsQ0FBQyxJQUFJLEVBQUUsQ0FBQztZQUM3QyxNQUFNLE1BQU0sR0FBRyxNQUFNLENBQUMsT0FBTyxDQUFDLE1BQU0sSUFBSSxFQUFFLENBQUMsQ0FBQyxJQUFJLEVBQUUsQ0FBQztZQUNuRCxNQUFNLFFBQVEsR0FBRyxNQUFNLGtCQUFrQixDQUFDLE9BQU8sQ0FBQyxFQUFFLFVBQVUsRUFBRSxDQUF3QzttQkFDbkcsQ0FBQyxHQUFHLElBQUksTUFBTTtvQkFDZixDQUFDLENBQUMs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
|