@jrmc/adonis-attachment 6.0.0-alpha.2 → 6.0.0-alpha.3
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/build/commands/commands.json +1 -1
- package/build/commands/make/converter.d.ts +17 -0
- package/build/commands/make/converter.d.ts.map +1 -0
- package/build/commands/make/converter.js +27 -0
- package/build/commands/make/converter.js.map +1 -0
- package/build/index.d.ts +12 -6
- package/build/index.d.ts.map +1 -1
- package/build/index.js +3 -5
- package/build/index.js.map +1 -1
- package/build/providers/attachment_provider.d.ts.map +1 -1
- package/build/providers/attachment_provider.js +20 -1
- package/build/providers/attachment_provider.js.map +1 -1
- package/build/services/converters.d.ts +10 -0
- package/build/services/converters.d.ts.map +1 -0
- package/build/services/converters.js +17 -0
- package/build/services/converters.js.map +1 -0
- package/build/src/adapters/adonis_drive_storage.d.ts.map +1 -1
- package/build/src/adapters/adonis_drive_storage.js +4 -1
- package/build/src/adapters/adonis_drive_storage.js.map +1 -1
- package/build/src/adapters/local_file_storage.d.ts.map +1 -1
- package/build/src/adapters/local_file_storage.js +9 -2
- package/build/src/adapters/local_file_storage.js.map +1 -1
- package/build/src/converters/autodetect_converter.d.ts +24 -0
- package/build/src/converters/autodetect_converter.d.ts.map +1 -0
- package/build/src/converters/autodetect_converter.js +113 -0
- package/build/src/converters/autodetect_converter.js.map +1 -0
- package/build/src/converters/configured_variant_converter_registry.d.ts +36 -0
- package/build/src/converters/configured_variant_converter_registry.d.ts.map +1 -0
- package/build/src/converters/configured_variant_converter_registry.js +81 -0
- package/build/src/converters/configured_variant_converter_registry.js.map +1 -0
- package/build/src/converters/converter.d.ts +148 -0
- package/build/src/converters/converter.d.ts.map +1 -0
- package/build/src/converters/converter.js +24 -0
- package/build/src/converters/converter.js.map +1 -0
- package/build/src/core/attachment.d.ts +7 -3
- package/build/src/core/attachment.d.ts.map +1 -1
- package/build/src/core/attachment.js +29 -4
- package/build/src/core/attachment.js.map +1 -1
- package/build/src/core/attachment_job_processor.d.ts +17 -1
- package/build/src/core/attachment_job_processor.d.ts.map +1 -1
- package/build/src/core/attachment_job_processor.js +81 -8
- package/build/src/core/attachment_job_processor.js.map +1 -1
- package/build/src/core/attachment_metadata_persister.d.ts +13 -0
- package/build/src/core/attachment_metadata_persister.d.ts.map +1 -0
- package/build/src/core/attachment_metadata_persister.js +8 -0
- package/build/src/core/attachment_metadata_persister.js.map +1 -0
- package/build/src/core/attachment_options.d.ts +3 -2
- package/build/src/core/attachment_options.d.ts.map +1 -1
- package/build/src/core/attachment_options.js.map +1 -1
- package/build/src/core/attachment_service.d.ts +24 -1
- package/build/src/core/attachment_service.d.ts.map +1 -1
- package/build/src/core/attachment_service.js +95 -4
- package/build/src/core/attachment_service.js.map +1 -1
- package/build/src/core/index.d.ts +9 -2
- package/build/src/core/index.d.ts.map +1 -1
- package/build/src/core/index.js +8 -2
- package/build/src/core/index.js.map +1 -1
- package/build/src/core/queue.d.ts +11 -1
- package/build/src/core/queue.d.ts.map +1 -1
- package/build/src/define_config.d.ts +27 -3
- package/build/src/define_config.d.ts.map +1 -1
- package/build/src/define_config.js +35 -1
- package/build/src/define_config.js.map +1 -1
- package/build/src/errors.d.ts +57 -0
- package/build/src/errors.d.ts.map +1 -0
- package/build/src/errors.js +96 -0
- package/build/src/errors.js.map +1 -0
- package/build/src/events/adonis_attachment_event_emitter.d.ts +17 -0
- package/build/src/events/adonis_attachment_event_emitter.d.ts.map +1 -0
- package/build/src/events/adonis_attachment_event_emitter.js +17 -0
- package/build/src/events/adonis_attachment_event_emitter.js.map +1 -0
- package/build/src/events/attachment_events.d.ts +43 -0
- package/build/src/events/attachment_events.d.ts.map +1 -0
- package/build/src/events/attachment_events.js +32 -0
- package/build/src/events/attachment_events.js.map +1 -0
- package/build/src/integrations/lucid/index.d.ts +1 -0
- package/build/src/integrations/lucid/index.d.ts.map +1 -1
- package/build/src/integrations/lucid/index.js +1 -0
- package/build/src/integrations/lucid/index.js.map +1 -1
- package/build/src/integrations/lucid/migrations/legacy/migrate_legacy_attachment.d.ts +3 -0
- package/build/src/integrations/lucid/migrations/legacy/migrate_legacy_attachment.d.ts.map +1 -1
- package/build/src/integrations/lucid/migrations/legacy/migrate_legacy_attachment.js +7 -2
- package/build/src/integrations/lucid/migrations/legacy/migrate_legacy_attachment.js.map +1 -1
- package/build/src/integrations/lucid/migrations/legacy/migrate_legacy_attachment_records.d.ts.map +1 -1
- package/build/src/integrations/lucid/migrations/legacy/migrate_legacy_attachment_records.js +4 -1
- package/build/src/integrations/lucid/migrations/legacy/migrate_legacy_attachment_records.js.map +1 -1
- package/build/src/integrations/lucid/models/attachment_link_model.d.ts.map +1 -1
- package/build/src/integrations/lucid/models/attachment_link_model.js +2 -1
- package/build/src/integrations/lucid/models/attachment_link_model.js.map +1 -1
- package/build/src/integrations/lucid/models/attachment_model.d.ts +3 -1
- package/build/src/integrations/lucid/models/attachment_model.d.ts.map +1 -1
- package/build/src/integrations/lucid/models/attachment_model.js +4 -0
- package/build/src/integrations/lucid/models/attachment_model.js.map +1 -1
- package/build/src/integrations/lucid/persistence/lucid_attachment_lifecycle_service.d.ts +1 -1
- package/build/src/integrations/lucid/persistence/lucid_attachment_lifecycle_service.d.ts.map +1 -1
- package/build/src/integrations/lucid/persistence/lucid_attachment_lifecycle_service.js +92 -35
- package/build/src/integrations/lucid/persistence/lucid_attachment_lifecycle_service.js.map +1 -1
- package/build/src/integrations/lucid/persistence/lucid_attachment_metadata_persister.d.ts +17 -0
- package/build/src/integrations/lucid/persistence/lucid_attachment_metadata_persister.d.ts.map +1 -0
- package/build/src/integrations/lucid/persistence/lucid_attachment_metadata_persister.js +18 -0
- package/build/src/integrations/lucid/persistence/lucid_attachment_metadata_persister.js.map +1 -0
- package/build/src/integrations/lucid/persistence/lucid_attachment_store.d.ts.map +1 -1
- package/build/src/integrations/lucid/persistence/lucid_attachment_store.js +5 -3
- package/build/src/integrations/lucid/persistence/lucid_attachment_store.js.map +1 -1
- package/build/src/integrations/lucid/persistence/lucid_variant_generation_service.d.ts +5 -2
- package/build/src/integrations/lucid/persistence/lucid_variant_generation_service.d.ts.map +1 -1
- package/build/src/integrations/lucid/persistence/lucid_variant_generation_service.js +9 -3
- package/build/src/integrations/lucid/persistence/lucid_variant_generation_service.js.map +1 -1
- package/build/src/integrations/lucid/relations/attachment_relation.d.ts +4 -1
- package/build/src/integrations/lucid/relations/attachment_relation.d.ts.map +1 -1
- package/build/src/integrations/lucid/relations/attachment_relation.js +15 -8
- package/build/src/integrations/lucid/relations/attachment_relation.js.map +1 -1
- package/build/src/integrations/lucid/schema/attachment_schema_service.d.ts +4 -0
- package/build/src/integrations/lucid/schema/attachment_schema_service.d.ts.map +1 -1
- package/build/src/integrations/lucid/schema/attachment_schema_service.js +13 -0
- package/build/src/integrations/lucid/schema/attachment_schema_service.js.map +1 -1
- package/build/src/integrations/lucid/schema/attachment_table_names.d.ts.map +1 -1
- package/build/src/integrations/lucid/schema/attachment_table_names.js +4 -1
- package/build/src/integrations/lucid/schema/attachment_table_names.js.map +1 -1
- package/build/src/media/binaries.d.ts +79 -0
- package/build/src/media/binaries.d.ts.map +1 -0
- package/build/src/media/binaries.js +288 -0
- package/build/src/media/binaries.js.map +1 -0
- package/build/src/media/blurhash.d.ts +48 -0
- package/build/src/media/blurhash.d.ts.map +1 -0
- package/build/src/media/blurhash.js +46 -0
- package/build/src/media/blurhash.js.map +1 -0
- package/build/src/media/exif.d.ts +23 -0
- package/build/src/media/exif.d.ts.map +1 -0
- package/build/src/media/exif.js +98 -0
- package/build/src/media/exif.js.map +1 -0
- package/build/src/media/media_metadata.d.ts +55 -0
- package/build/src/media/media_metadata.d.ts.map +1 -0
- package/build/src/media/media_metadata.js +27 -0
- package/build/src/media/media_metadata.js.map +1 -0
- package/build/src/media/sharp.d.ts +45 -0
- package/build/src/media/sharp.d.ts.map +1 -0
- package/build/src/media/sharp.js +76 -0
- package/build/src/media/sharp.js.map +1 -0
- package/build/src/media/v5_metadata.d.ts +20 -0
- package/build/src/media/v5_metadata.d.ts.map +1 -0
- package/build/src/media/v5_metadata.js +20 -0
- package/build/src/media/v5_metadata.js.map +1 -0
- package/build/src/queues/memory_queue.d.ts.map +1 -1
- package/build/src/queues/memory_queue.js +4 -1
- package/build/src/queues/memory_queue.js.map +1 -1
- package/build/src/sources/attachment_manager.d.ts +1 -3
- package/build/src/sources/attachment_manager.d.ts.map +1 -1
- package/build/src/sources/attachment_manager.js +19 -12
- package/build/src/sources/attachment_manager.js.map +1 -1
- package/build/src/variants/variant_converter.d.ts +4 -1
- package/build/src/variants/variant_converter.d.ts.map +1 -1
- package/build/src/variants/variant_generation_service.d.ts +9 -3
- package/build/src/variants/variant_generation_service.d.ts.map +1 -1
- package/build/src/variants/variant_generation_service.js +47 -6
- package/build/src/variants/variant_generation_service.js.map +1 -1
- package/build/stubs/config/attachment.stub +23 -2
- package/build/stubs/converters/converter.stub +18 -0
- package/build/tests/adonis_queue.spec.js +56 -1
- package/build/tests/adonis_queue.spec.js.map +1 -1
- package/build/tests/attachment_events.spec.d.ts +8 -0
- package/build/tests/attachment_events.spec.d.ts.map +1 -0
- package/build/tests/attachment_events.spec.js +65 -0
- package/build/tests/attachment_events.spec.js.map +1 -0
- package/build/tests/attachment_job_processor.spec.js +77 -2
- package/build/tests/attachment_job_processor.spec.js.map +1 -1
- package/build/tests/attachment_provider.spec.js +54 -0
- package/build/tests/attachment_provider.spec.js.map +1 -1
- package/build/tests/attachment_schema_service.spec.js +14 -0
- package/build/tests/attachment_schema_service.spec.js.map +1 -1
- package/build/tests/attachment_service.spec.js +81 -2
- package/build/tests/attachment_service.spec.js.map +1 -1
- package/build/tests/autodetect_converter.spec.d.ts +8 -0
- package/build/tests/autodetect_converter.spec.d.ts.map +1 -0
- package/build/tests/autodetect_converter.spec.js +55 -0
- package/build/tests/autodetect_converter.spec.js.map +1 -0
- package/build/tests/binary_media.spec.d.ts +8 -0
- package/build/tests/binary_media.spec.d.ts.map +1 -0
- package/build/tests/binary_media.spec.js +106 -0
- package/build/tests/binary_media.spec.js.map +1 -0
- package/build/tests/blurhash_media.spec.d.ts +8 -0
- package/build/tests/blurhash_media.spec.d.ts.map +1 -0
- package/build/tests/blurhash_media.spec.js +40 -0
- package/build/tests/blurhash_media.spec.js.map +1 -0
- package/build/tests/configure.spec.js +1 -0
- package/build/tests/configure.spec.js.map +1 -1
- package/build/tests/configured_variant_converter_registry.spec.d.ts +8 -0
- package/build/tests/configured_variant_converter_registry.spec.d.ts.map +1 -0
- package/build/tests/configured_variant_converter_registry.spec.js +73 -0
- package/build/tests/configured_variant_converter_registry.spec.js.map +1 -0
- package/build/tests/converter_config.types.d.ts +36 -0
- package/build/tests/converter_config.types.d.ts.map +1 -0
- package/build/tests/converter_config.types.js +60 -0
- package/build/tests/converter_config.types.js.map +1 -0
- package/build/tests/define_config.spec.js +91 -0
- package/build/tests/define_config.spec.js.map +1 -1
- package/build/tests/errors.spec.d.ts +8 -0
- package/build/tests/errors.spec.d.ts.map +1 -0
- package/build/tests/errors.spec.js +43 -0
- package/build/tests/errors.spec.js.map +1 -0
- package/build/tests/exif_media.spec.d.ts +8 -0
- package/build/tests/exif_media.spec.d.ts.map +1 -0
- package/build/tests/exif_media.spec.js +50 -0
- package/build/tests/exif_media.spec.js.map +1 -0
- package/build/tests/helpers/lucid_test_database.d.ts.map +1 -1
- package/build/tests/helpers/lucid_test_database.js +1 -0
- package/build/tests/helpers/lucid_test_database.js.map +1 -1
- package/build/tests/lucid_attachment_column.spec.js +1 -1
- package/build/tests/lucid_attachment_column.spec.js.map +1 -1
- package/build/tests/lucid_attachment_lifecycle_service.spec.js +54 -0
- package/build/tests/lucid_attachment_lifecycle_service.spec.js.map +1 -1
- package/build/tests/lucid_attachment_metadata_persister.spec.d.ts +8 -0
- package/build/tests/lucid_attachment_metadata_persister.spec.d.ts.map +1 -0
- package/build/tests/lucid_attachment_metadata_persister.spec.js +34 -0
- package/build/tests/lucid_attachment_metadata_persister.spec.js.map +1 -0
- package/build/tests/lucid_attachment_relation.spec.js +71 -10
- package/build/tests/lucid_attachment_relation.spec.js.map +1 -1
- package/build/tests/lucid_sqlite_integration.spec.js +2 -1
- package/build/tests/lucid_sqlite_integration.spec.js.map +1 -1
- package/build/tests/lucid_variant_generation_service.spec.js +17 -0
- package/build/tests/lucid_variant_generation_service.spec.js.map +1 -1
- package/build/tests/make_converter.spec.d.ts +8 -0
- package/build/tests/make_converter.spec.d.ts.map +1 -0
- package/build/tests/make_converter.spec.js +32 -0
- package/build/tests/make_converter.spec.js.map +1 -0
- package/build/tests/media_metadata.spec.d.ts +8 -0
- package/build/tests/media_metadata.spec.d.ts.map +1 -0
- package/build/tests/media_metadata.spec.js +51 -0
- package/build/tests/media_metadata.spec.js.map +1 -0
- package/build/tests/migrate_legacy_attachment.spec.js +15 -5
- package/build/tests/migrate_legacy_attachment.spec.js.map +1 -1
- package/build/tests/package_exports.spec.js +18 -2
- package/build/tests/package_exports.spec.js.map +1 -1
- package/build/tests/sharp_media.spec.d.ts +8 -0
- package/build/tests/sharp_media.spec.d.ts.map +1 -0
- package/build/tests/sharp_media.spec.js +84 -0
- package/build/tests/sharp_media.spec.js.map +1 -0
- package/build/tests/v5_metadata.spec.d.ts +8 -0
- package/build/tests/v5_metadata.spec.d.ts.map +1 -0
- package/build/tests/v5_metadata.spec.js +19 -0
- package/build/tests/v5_metadata.spec.js.map +1 -0
- package/build/tests/variant_generation_service.spec.js +122 -0
- package/build/tests/variant_generation_service.spec.js.map +1 -1
- package/package.json +50 -2
|
@@ -7,14 +7,25 @@
|
|
|
7
7
|
import { AttachmentDraft, type Attachment, type CreateAttachmentInput } from './attachment.js';
|
|
8
8
|
import { type AttachmentPersistenceOptions } from './attachment_options.js';
|
|
9
9
|
import type { AttachmentQueue } from './queue.js';
|
|
10
|
+
import type { AttachmentMetadataPersister } from './attachment_metadata_persister.js';
|
|
10
11
|
import type { AttachmentStorage } from './storage.js';
|
|
12
|
+
import { type MediaMetadataExtractor } from '../media/media_metadata.js';
|
|
13
|
+
import { AttachmentError } from '../errors.js';
|
|
14
|
+
import type { AttachmentVariantKey } from '../../index.js';
|
|
15
|
+
import { type AttachmentEventContext, type AttachmentEventEmitter } from '../events/attachment_events.js';
|
|
11
16
|
export type AttachmentServiceOptions = {
|
|
12
17
|
storage: AttachmentStorage;
|
|
13
18
|
queue: AttachmentQueue;
|
|
14
19
|
defaultDisk: string;
|
|
15
20
|
createId?: () => string;
|
|
16
21
|
defaults?: AttachmentPersistenceOptions;
|
|
22
|
+
metadataExtractors?: readonly MediaMetadataExtractor[];
|
|
23
|
+
metadataMode?: AttachmentMetadataMode;
|
|
24
|
+
metadataPersister?: AttachmentMetadataPersister;
|
|
25
|
+
metadataVariants?: boolean;
|
|
26
|
+
events?: AttachmentEventEmitter;
|
|
17
27
|
};
|
|
28
|
+
export type AttachmentMetadataMode = 'sync' | 'deferred';
|
|
18
29
|
/**
|
|
19
30
|
* Creates files and delegates persistence to the configured storage backend.
|
|
20
31
|
* Database persistence deliberately remains the responsibility of the caller.
|
|
@@ -29,6 +40,18 @@ export declare class AttachmentService {
|
|
|
29
40
|
create(input: CreateAttachmentInput): Promise<Attachment>;
|
|
30
41
|
remove(attachment: Attachment): Promise<void>;
|
|
31
42
|
read(attachment: Attachment): Promise<Uint8Array>;
|
|
32
|
-
|
|
43
|
+
scheduleMetadataExtraction(attachment: Attachment, eventContext?: AttachmentEventContext): Promise<void>;
|
|
44
|
+
extractAndPersistMetadata(attachment: Attachment): Promise<void>;
|
|
45
|
+
scheduleVariantGeneration(attachment: Attachment, variantKeys?: readonly AttachmentVariantKey[], meta?: boolean, eventContext?: AttachmentEventContext): Promise<void>;
|
|
46
|
+
/** Resolves automatic variant keys with manager options taking precedence. */
|
|
47
|
+
getVariantKeys(draft: AttachmentDraft, options?: AttachmentPersistenceOptions): readonly AttachmentVariantKey[] | undefined;
|
|
48
|
+
/** Resolves whether variants should run the configured metadata extractors. */
|
|
49
|
+
getVariantMetadataEnabled(draft: AttachmentDraft | undefined, options?: AttachmentPersistenceOptions): boolean | undefined;
|
|
50
|
+
/** Resolves the configured strategy when metadata is enabled for a persistence operation. */
|
|
51
|
+
getMetadataMode(draft: AttachmentDraft | undefined, options?: AttachmentPersistenceOptions): AttachmentMetadataMode | undefined;
|
|
52
|
+
}
|
|
53
|
+
export declare class DeferredMetadataNotConfiguredError extends AttachmentError {
|
|
54
|
+
static code: string;
|
|
55
|
+
constructor();
|
|
33
56
|
}
|
|
34
57
|
//# sourceMappingURL=attachment_service.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"attachment_service.d.ts","sourceRoot":"","sources":["../../../src/core/attachment_service.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,OAAO,EACL,eAAe,EAEf,KAAK,UAAU,EAEf,KAAK,qBAAqB,EAC3B,MAAM,iBAAiB,CAAA;AAExB,OAAO,EAIL,KAAK,4BAA4B,EAElC,MAAM,yBAAyB,CAAA;AAChC,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,YAAY,CAAA;AACjD,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,cAAc,CAAA;
|
|
1
|
+
{"version":3,"file":"attachment_service.d.ts","sourceRoot":"","sources":["../../../src/core/attachment_service.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,OAAO,EACL,eAAe,EAEf,KAAK,UAAU,EAEf,KAAK,qBAAqB,EAC3B,MAAM,iBAAiB,CAAA;AAExB,OAAO,EAIL,KAAK,4BAA4B,EAElC,MAAM,yBAAyB,CAAA;AAChC,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,YAAY,CAAA;AACjD,OAAO,KAAK,EAAE,2BAA2B,EAAE,MAAM,oCAAoC,CAAA;AACrF,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,cAAc,CAAA;AACrD,OAAO,EAAwB,KAAK,sBAAsB,EAAE,MAAM,4BAA4B,CAAA;AAC9F,OAAO,EAAE,eAAe,EAAE,MAAM,cAAc,CAAA;AAC9C,OAAO,KAAK,EAAE,oBAAoB,EAAE,MAAM,gBAAgB,CAAA;AAC1D,OAAO,EAGL,KAAK,sBAAsB,EAC3B,KAAK,sBAAsB,EAC5B,MAAM,gCAAgC,CAAA;AAEvC,MAAM,MAAM,wBAAwB,GAAG;IACrC,OAAO,EAAE,iBAAiB,CAAA;IAC1B,KAAK,EAAE,eAAe,CAAA;IACtB,WAAW,EAAE,MAAM,CAAA;IACnB,QAAQ,CAAC,EAAE,MAAM,MAAM,CAAA;IACvB,QAAQ,CAAC,EAAE,4BAA4B,CAAA;IACvC,kBAAkB,CAAC,EAAE,SAAS,sBAAsB,EAAE,CAAA;IACtD,YAAY,CAAC,EAAE,sBAAsB,CAAA;IACrC,iBAAiB,CAAC,EAAE,2BAA2B,CAAA;IAC/C,gBAAgB,CAAC,EAAE,OAAO,CAAA;IAC1B,MAAM,CAAC,EAAE,sBAAsB,CAAA;CAChC,CAAA;AAED,MAAM,MAAM,sBAAsB,GAAG,MAAM,GAAG,UAAU,CAAA;AAExD;;;GAGG;AACH,qBAAa,iBAAiB;;gBAWhB,OAAO,EAAE,wBAAwB;IAc7C,WAAW,CACT,KAAK,EAAE,qBAAqB,EAC5B,OAAO,GAAE,4BAAiC,GACzC,eAAe;IAgBlB;;OAEG;IACG,MAAM,CAAC,KAAK,EAAE,qBAAqB,GAAG,OAAO,CAAC,UAAU,CAAC;IAsDzD,MAAM,CAAC,UAAU,EAAE,UAAU,GAAG,OAAO,CAAC,IAAI,CAAC;IAKnD,IAAI,CAAC,UAAU,EAAE,UAAU,GAAG,OAAO,CAAC,UAAU,CAAC;IAIjD,0BAA0B,CACxB,UAAU,EAAE,UAAU,EACtB,YAAY,CAAC,EAAE,sBAAsB,GACpC,OAAO,CAAC,IAAI,CAAC;IAaV,yBAAyB,CAAC,UAAU,EAAE,UAAU,GAAG,OAAO,CAAC,IAAI,CAAC;IAgBtE,yBAAyB,CACvB,UAAU,EAAE,UAAU,EACtB,WAAW,CAAC,EAAE,SAAS,oBAAoB,EAAE,EAC7C,IAAI,CAAC,EAAE,OAAO,EACd,YAAY,CAAC,EAAE,sBAAsB,GACpC,OAAO,CAAC,IAAI,CAAC;IAUhB,8EAA8E;IAC9E,cAAc,CACZ,KAAK,EAAE,eAAe,EACtB,OAAO,CAAC,EAAE,4BAA4B,GACrC,SAAS,oBAAoB,EAAE,GAAG,SAAS;IAI9C,+EAA+E;IAC/E,yBAAyB,CACvB,KAAK,EAAE,eAAe,GAAG,SAAS,EAClC,OAAO,CAAC,EAAE,4BAA4B,GACrC,OAAO,GAAG,SAAS;IAUtB,6FAA6F;IAC7F,eAAe,CACb,KAAK,EAAE,eAAe,GAAG,SAAS,EAClC,OAAO,CAAC,EAAE,4BAA4B,GACrC,sBAAsB,GAAG,SAAS;CAoBtC;AAED,qBAAa,kCAAmC,SAAQ,eAAe;IACrE,MAAM,CAAC,IAAI,SAA8B;;CAM1C"}
|
|
@@ -7,6 +7,9 @@
|
|
|
7
7
|
import { AttachmentDraft, AttachmentFactory, } from './attachment.js';
|
|
8
8
|
import { markAttachmentPending } from './attachment_state.js';
|
|
9
9
|
import { resolveAttachmentPersistenceOptions, } from './attachment_options.js';
|
|
10
|
+
import { MediaMetadataService } from '../media/media_metadata.js';
|
|
11
|
+
import { AttachmentError } from '../errors.js';
|
|
12
|
+
import { emitAttachmentEvent, toAttachmentEventFailure, } from '../events/attachment_events.js';
|
|
10
13
|
/**
|
|
11
14
|
* Creates files and delegates persistence to the configured storage backend.
|
|
12
15
|
* Database persistence deliberately remains the responsibility of the caller.
|
|
@@ -16,11 +19,23 @@ export class AttachmentService {
|
|
|
16
19
|
#queue;
|
|
17
20
|
#factory;
|
|
18
21
|
#defaults;
|
|
22
|
+
#metadata;
|
|
23
|
+
#metadataMode;
|
|
24
|
+
#metadataPersister;
|
|
25
|
+
#metadataVariants;
|
|
26
|
+
#events;
|
|
19
27
|
constructor(options) {
|
|
20
28
|
this.#storage = options.storage;
|
|
21
29
|
this.#queue = options.queue;
|
|
22
30
|
this.#factory = new AttachmentFactory(options);
|
|
23
31
|
this.#defaults = options.defaults ?? {};
|
|
32
|
+
this.#metadata = options.metadataExtractors
|
|
33
|
+
? new MediaMetadataService(options.metadataExtractors)
|
|
34
|
+
: undefined;
|
|
35
|
+
this.#metadataMode = options.metadataMode ?? 'sync';
|
|
36
|
+
this.#metadataPersister = options.metadataPersister;
|
|
37
|
+
this.#metadataVariants = options.metadataVariants ?? true;
|
|
38
|
+
this.#events = options.events;
|
|
24
39
|
}
|
|
25
40
|
createDraft(input, options = {}) {
|
|
26
41
|
const draftOptions = {
|
|
@@ -49,12 +64,29 @@ export class AttachmentService {
|
|
|
49
64
|
const options = resolveAttachmentPersistenceOptions(this.#defaults, request?.options, draft.options);
|
|
50
65
|
const folder = await resolveFolder(options.folder, context);
|
|
51
66
|
const name = await resolveName(options.rename, context);
|
|
52
|
-
|
|
67
|
+
let attachment = this.#factory.create(source, {
|
|
53
68
|
id: draft.id,
|
|
54
69
|
...(options.disk ? { disk: options.disk } : {}),
|
|
55
70
|
...(folder ? { folder } : {}),
|
|
56
71
|
...(name ? { name } : {}),
|
|
57
72
|
});
|
|
73
|
+
if (options.meta && this.#metadata && this.#metadataMode === 'sync') {
|
|
74
|
+
this.#emit('attachment:metadata_started', attachment);
|
|
75
|
+
try {
|
|
76
|
+
const metadata = await this.#metadata.extract({ attachment, body: source.body });
|
|
77
|
+
if (metadata) {
|
|
78
|
+
attachment = {
|
|
79
|
+
...attachment,
|
|
80
|
+
metadata: { ...metadata, ...(source.metadata ?? {}) },
|
|
81
|
+
};
|
|
82
|
+
}
|
|
83
|
+
this.#emit('attachment:metadata_completed', attachment);
|
|
84
|
+
}
|
|
85
|
+
catch (error) {
|
|
86
|
+
this.#emit('attachment:metadata_failed', attachment, undefined, undefined, error);
|
|
87
|
+
throw error;
|
|
88
|
+
}
|
|
89
|
+
}
|
|
58
90
|
await this.#storage.write({
|
|
59
91
|
disk: attachment.disk,
|
|
60
92
|
path: attachment.path,
|
|
@@ -62,21 +94,80 @@ export class AttachmentService {
|
|
|
62
94
|
mimeType: attachment.mimeType,
|
|
63
95
|
});
|
|
64
96
|
markAttachmentPending(draft);
|
|
97
|
+
this.#emit('attachment:created', attachment);
|
|
65
98
|
return attachment;
|
|
66
99
|
}
|
|
67
|
-
remove(attachment) {
|
|
68
|
-
|
|
100
|
+
async remove(attachment) {
|
|
101
|
+
await this.#storage.remove(attachment);
|
|
102
|
+
this.#emit('attachment:deleted', attachment);
|
|
69
103
|
}
|
|
70
104
|
read(attachment) {
|
|
71
105
|
return this.#storage.read({ disk: attachment.disk, path: attachment.path });
|
|
72
106
|
}
|
|
73
|
-
|
|
107
|
+
scheduleMetadataExtraction(attachment, eventContext) {
|
|
108
|
+
if (!this.#metadata || !this.#metadataPersister) {
|
|
109
|
+
throw new DeferredMetadataNotConfiguredError();
|
|
110
|
+
}
|
|
111
|
+
return this.#queue.enqueue({
|
|
112
|
+
type: 'extract-metadata',
|
|
113
|
+
attachmentId: attachment.id,
|
|
114
|
+
attachment,
|
|
115
|
+
...(eventContext ? { eventContext } : {}),
|
|
116
|
+
});
|
|
117
|
+
}
|
|
118
|
+
async extractAndPersistMetadata(attachment) {
|
|
119
|
+
if (!this.#metadata || !this.#metadataPersister) {
|
|
120
|
+
throw new DeferredMetadataNotConfiguredError();
|
|
121
|
+
}
|
|
122
|
+
const extracted = await this.#metadata.extract({ attachment, body: await this.read(attachment) });
|
|
123
|
+
if (!extracted) {
|
|
124
|
+
return;
|
|
125
|
+
}
|
|
126
|
+
await this.#metadataPersister.persistMetadata(attachment, {
|
|
127
|
+
...extracted,
|
|
128
|
+
...(attachment.metadata ?? {}),
|
|
129
|
+
});
|
|
130
|
+
}
|
|
131
|
+
scheduleVariantGeneration(attachment, variantKeys, meta, eventContext) {
|
|
74
132
|
return this.#queue.enqueue({
|
|
75
133
|
type: 'generate-variants',
|
|
76
134
|
attachmentId: attachment.id,
|
|
77
135
|
...(variantKeys ? { variantKeys } : {}),
|
|
136
|
+
...(meta !== undefined ? { meta } : {}),
|
|
137
|
+
...(eventContext ? { eventContext } : {}),
|
|
78
138
|
});
|
|
79
139
|
}
|
|
140
|
+
/** Resolves automatic variant keys with manager options taking precedence. */
|
|
141
|
+
getVariantKeys(draft, options) {
|
|
142
|
+
return resolveAttachmentPersistenceOptions(this.#defaults, options, draft.options).variants;
|
|
143
|
+
}
|
|
144
|
+
/** Resolves whether variants should run the configured metadata extractors. */
|
|
145
|
+
getVariantMetadataEnabled(draft, options) {
|
|
146
|
+
return this.#metadataVariants
|
|
147
|
+
? resolveAttachmentPersistenceOptions(this.#defaults, options, draft?.options).meta
|
|
148
|
+
: undefined;
|
|
149
|
+
}
|
|
150
|
+
/** Resolves the configured strategy when metadata is enabled for a persistence operation. */
|
|
151
|
+
getMetadataMode(draft, options) {
|
|
152
|
+
return resolveAttachmentPersistenceOptions(this.#defaults, options, draft?.options).meta
|
|
153
|
+
? this.#metadataMode
|
|
154
|
+
: undefined;
|
|
155
|
+
}
|
|
156
|
+
#emit(event, attachment, variants, context, error) {
|
|
157
|
+
emitAttachmentEvent(this.#events, event, {
|
|
158
|
+
...(context ?? {}),
|
|
159
|
+
attachment,
|
|
160
|
+
...(variants ? { variants } : {}),
|
|
161
|
+
...(error ? { error: toAttachmentEventFailure(error) } : {}),
|
|
162
|
+
});
|
|
163
|
+
}
|
|
164
|
+
}
|
|
165
|
+
export class DeferredMetadataNotConfiguredError extends AttachmentError {
|
|
166
|
+
static code = 'E_METADATA_NOT_CONFIGURED';
|
|
167
|
+
constructor() {
|
|
168
|
+
super('Deferred metadata extraction requires configured extractors and a metadata persister');
|
|
169
|
+
this.name = 'DeferredMetadataNotConfiguredError';
|
|
170
|
+
}
|
|
80
171
|
}
|
|
81
172
|
async function resolveFolder(folder, context) {
|
|
82
173
|
if (typeof folder === 'function') {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"attachment_service.js","sourceRoot":"","sources":["../../../src/core/attachment_service.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,OAAO,EACL,eAAe,EACf,iBAAiB,GAIlB,MAAM,iBAAiB,CAAA;AACxB,OAAO,EAAE,qBAAqB,EAAE,MAAM,uBAAuB,CAAA;AAC7D,OAAO,EACL,mCAAmC,GAKpC,MAAM,yBAAyB,CAAA;
|
|
1
|
+
{"version":3,"file":"attachment_service.js","sourceRoot":"","sources":["../../../src/core/attachment_service.ts"],"names":[],"mappings":"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"}
|
|
@@ -6,8 +6,15 @@
|
|
|
6
6
|
*/
|
|
7
7
|
export { AttachmentFactory, AttachmentDraft, isAttachmentDraft, type Attachment, type AttachmentDraftPersistence, type AttachmentFactoryOptions, type AttachmentPersistRequest, type CreateAttachmentInput, } from './attachment.js';
|
|
8
8
|
export { resolveAttachmentPersistenceOptions, type AttachmentFolder, type AttachmentPersistenceContext, type AttachmentPersistenceOptions, type AttachmentRename, type ResolvedAttachmentPersistenceOptions, } from './attachment_options.js';
|
|
9
|
-
export { AttachmentService, type AttachmentServiceOptions } from './attachment_service.js';
|
|
10
|
-
export {
|
|
9
|
+
export { AttachmentService, DeferredMetadataNotConfiguredError, type AttachmentMetadataMode, type AttachmentServiceOptions, } from './attachment_service.js';
|
|
10
|
+
export { type AttachmentMetadataPersister } from './attachment_metadata_persister.js';
|
|
11
|
+
export { emitAttachmentEvent, toAttachmentEventFailure, type AttachmentEventContext, type AttachmentEventEmitter, type AttachmentEventFailure, type AttachmentEventName, type AttachmentEventPayload, } from '../events/attachment_events.js';
|
|
12
|
+
export { AttachmentError, AttachmentSourceError, MissingOptionalDependencyError, type AttachmentErrorOptions, } from '../errors.js';
|
|
13
|
+
export { default as Converter, type ConverterAttributes, type ConverterOptions, type BlurhashComponent, type BlurhashOptions, } from '../converters/converter.js';
|
|
14
|
+
export { default as AutodetectConverter, type AutodetectConverterOptions, } from '../converters/autodetect_converter.js';
|
|
15
|
+
export { ConfiguredVariantConverterRegistry, InvalidConverterModuleError, type ConverterConfig, type ConverterConfigMap, type ConverterConstructor, type ConverterModule, type VariantConverterRegistry, } from '../converters/configured_variant_converter_registry.js';
|
|
16
|
+
export { MediaMetadataService, type AttachmentMetadata, type MediaMetadataExtractor, type MediaMetadataInput, } from '../media/media_metadata.js';
|
|
17
|
+
export { AttachmentJobProcessor, AttachmentNotFoundError, DeferredMetadataProcessorNotConfiguredError, type DeferredAttachmentMetadataProcessor, type AttachmentJobProcessorOptions, type VariantGenerationRequest, type VariantGenerator, type VariantGeneratorFactory, } from './attachment_job_processor.js';
|
|
11
18
|
export { type AttachmentRepository } from './attachment_repository.js';
|
|
12
19
|
export { type AttachmentJob, type AttachmentJobHandler, type AttachmentQueue, type GenerateVariantsJob, } from './queue.js';
|
|
13
20
|
export { type AttachmentStorage, type StorageLocation, type WriteAttachmentInput, } from './storage.js';
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/core/index.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,OAAO,EACL,iBAAiB,EACjB,eAAe,EACf,iBAAiB,EACjB,KAAK,UAAU,EACf,KAAK,0BAA0B,EAC/B,KAAK,wBAAwB,EAC7B,KAAK,wBAAwB,EAC7B,KAAK,qBAAqB,GAC3B,MAAM,iBAAiB,CAAA;AACxB,OAAO,EACL,mCAAmC,EACnC,KAAK,gBAAgB,EACrB,KAAK,4BAA4B,EACjC,KAAK,4BAA4B,EACjC,KAAK,gBAAgB,EACrB,KAAK,oCAAoC,GAC1C,MAAM,yBAAyB,CAAA;AAChC,OAAO,
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/core/index.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,OAAO,EACL,iBAAiB,EACjB,eAAe,EACf,iBAAiB,EACjB,KAAK,UAAU,EACf,KAAK,0BAA0B,EAC/B,KAAK,wBAAwB,EAC7B,KAAK,wBAAwB,EAC7B,KAAK,qBAAqB,GAC3B,MAAM,iBAAiB,CAAA;AACxB,OAAO,EACL,mCAAmC,EACnC,KAAK,gBAAgB,EACrB,KAAK,4BAA4B,EACjC,KAAK,4BAA4B,EACjC,KAAK,gBAAgB,EACrB,KAAK,oCAAoC,GAC1C,MAAM,yBAAyB,CAAA;AAChC,OAAO,EACL,iBAAiB,EACjB,kCAAkC,EAClC,KAAK,sBAAsB,EAC3B,KAAK,wBAAwB,GAC9B,MAAM,yBAAyB,CAAA;AAChC,OAAO,EAAE,KAAK,2BAA2B,EAAE,MAAM,oCAAoC,CAAA;AACrF,OAAO,EACL,mBAAmB,EACnB,wBAAwB,EACxB,KAAK,sBAAsB,EAC3B,KAAK,sBAAsB,EAC3B,KAAK,sBAAsB,EAC3B,KAAK,mBAAmB,EACxB,KAAK,sBAAsB,GAC5B,MAAM,gCAAgC,CAAA;AACvC,OAAO,EACL,eAAe,EACf,qBAAqB,EACrB,8BAA8B,EAC9B,KAAK,sBAAsB,GAC5B,MAAM,cAAc,CAAA;AACrB,OAAO,EACL,OAAO,IAAI,SAAS,EACpB,KAAK,mBAAmB,EACxB,KAAK,gBAAgB,EACrB,KAAK,iBAAiB,EACtB,KAAK,eAAe,GACrB,MAAM,4BAA4B,CAAA;AACnC,OAAO,EACL,OAAO,IAAI,mBAAmB,EAC9B,KAAK,0BAA0B,GAChC,MAAM,uCAAuC,CAAA;AAC9C,OAAO,EACL,kCAAkC,EAClC,2BAA2B,EAC3B,KAAK,eAAe,EACpB,KAAK,kBAAkB,EACvB,KAAK,oBAAoB,EACzB,KAAK,eAAe,EACpB,KAAK,wBAAwB,GAC9B,MAAM,wDAAwD,CAAA;AAC/D,OAAO,EACL,oBAAoB,EACpB,KAAK,kBAAkB,EACvB,KAAK,sBAAsB,EAC3B,KAAK,kBAAkB,GACxB,MAAM,4BAA4B,CAAA;AACnC,OAAO,EACL,sBAAsB,EACtB,uBAAuB,EACvB,2CAA2C,EAC3C,KAAK,mCAAmC,EACxC,KAAK,6BAA6B,EAClC,KAAK,wBAAwB,EAC7B,KAAK,gBAAgB,EACrB,KAAK,uBAAuB,GAC7B,MAAM,+BAA+B,CAAA;AACtC,OAAO,EAAE,KAAK,oBAAoB,EAAE,MAAM,4BAA4B,CAAA;AACtE,OAAO,EACL,KAAK,aAAa,EAClB,KAAK,oBAAoB,EACzB,KAAK,eAAe,EACpB,KAAK,mBAAmB,GACzB,MAAM,YAAY,CAAA;AACnB,OAAO,EACL,KAAK,iBAAiB,EACtB,KAAK,eAAe,EACpB,KAAK,oBAAoB,GAC1B,MAAM,cAAc,CAAA"}
|
package/build/src/core/index.js
CHANGED
|
@@ -6,6 +6,12 @@
|
|
|
6
6
|
*/
|
|
7
7
|
export { AttachmentFactory, AttachmentDraft, isAttachmentDraft, } from './attachment.js';
|
|
8
8
|
export { resolveAttachmentPersistenceOptions, } from './attachment_options.js';
|
|
9
|
-
export { AttachmentService } from './attachment_service.js';
|
|
10
|
-
export {
|
|
9
|
+
export { AttachmentService, DeferredMetadataNotConfiguredError, } from './attachment_service.js';
|
|
10
|
+
export { emitAttachmentEvent, toAttachmentEventFailure, } from '../events/attachment_events.js';
|
|
11
|
+
export { AttachmentError, AttachmentSourceError, MissingOptionalDependencyError, } from '../errors.js';
|
|
12
|
+
export { default as Converter, } from '../converters/converter.js';
|
|
13
|
+
export { default as AutodetectConverter, } from '../converters/autodetect_converter.js';
|
|
14
|
+
export { ConfiguredVariantConverterRegistry, InvalidConverterModuleError, } from '../converters/configured_variant_converter_registry.js';
|
|
15
|
+
export { MediaMetadataService, } from '../media/media_metadata.js';
|
|
16
|
+
export { AttachmentJobProcessor, AttachmentNotFoundError, DeferredMetadataProcessorNotConfiguredError, } from './attachment_job_processor.js';
|
|
11
17
|
//# sourceMappingURL=index.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/core/index.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,OAAO,EACL,iBAAiB,EACjB,eAAe,EACf,iBAAiB,GAMlB,MAAM,iBAAiB,CAAA;AACxB,OAAO,EACL,mCAAmC,GAMpC,MAAM,yBAAyB,CAAA;AAChC,OAAO,
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/core/index.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,OAAO,EACL,iBAAiB,EACjB,eAAe,EACf,iBAAiB,GAMlB,MAAM,iBAAiB,CAAA;AACxB,OAAO,EACL,mCAAmC,GAMpC,MAAM,yBAAyB,CAAA;AAChC,OAAO,EACL,iBAAiB,EACjB,kCAAkC,GAGnC,MAAM,yBAAyB,CAAA;AAEhC,OAAO,EACL,mBAAmB,EACnB,wBAAwB,GAMzB,MAAM,gCAAgC,CAAA;AACvC,OAAO,EACL,eAAe,EACf,qBAAqB,EACrB,8BAA8B,GAE/B,MAAM,cAAc,CAAA;AACrB,OAAO,EACL,OAAO,IAAI,SAAS,GAKrB,MAAM,4BAA4B,CAAA;AACnC,OAAO,EACL,OAAO,IAAI,mBAAmB,GAE/B,MAAM,uCAAuC,CAAA;AAC9C,OAAO,EACL,kCAAkC,EAClC,2BAA2B,GAM5B,MAAM,wDAAwD,CAAA;AAC/D,OAAO,EACL,oBAAoB,GAIrB,MAAM,4BAA4B,CAAA;AACnC,OAAO,EACL,sBAAsB,EACtB,uBAAuB,EACvB,2CAA2C,GAM5C,MAAM,+BAA+B,CAAA"}
|
|
@@ -4,12 +4,22 @@
|
|
|
4
4
|
* @license MIT
|
|
5
5
|
* @copyright Jeremy Chaufourier <jeremy@chaufourier.fr>
|
|
6
6
|
*/
|
|
7
|
+
import type { Attachment } from './attachment.js';
|
|
8
|
+
import type { AttachmentEventContext } from '../events/attachment_events.js';
|
|
7
9
|
export type GenerateVariantsJob = {
|
|
8
10
|
type: 'generate-variants';
|
|
9
11
|
attachmentId: string;
|
|
10
12
|
variantKeys?: readonly string[];
|
|
13
|
+
meta?: boolean;
|
|
14
|
+
eventContext?: AttachmentEventContext;
|
|
11
15
|
};
|
|
12
|
-
export type
|
|
16
|
+
export type ExtractMetadataJob = {
|
|
17
|
+
type: 'extract-metadata';
|
|
18
|
+
attachmentId: string;
|
|
19
|
+
attachment: Attachment;
|
|
20
|
+
eventContext?: AttachmentEventContext;
|
|
21
|
+
};
|
|
22
|
+
export type AttachmentJob = GenerateVariantsJob | ExtractMetadataJob;
|
|
13
23
|
/**
|
|
14
24
|
* Dispatch boundary. External queues only need to accept an AttachmentJob.
|
|
15
25
|
*/
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"queue.d.ts","sourceRoot":"","sources":["../../../src/core/queue.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,MAAM,MAAM,mBAAmB,GAAG;IAChC,IAAI,EAAE,mBAAmB,CAAA;IACzB,YAAY,EAAE,MAAM,CAAA;IACpB,WAAW,CAAC,EAAE,SAAS,MAAM,EAAE,CAAA;
|
|
1
|
+
{"version":3,"file":"queue.d.ts","sourceRoot":"","sources":["../../../src/core/queue.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,iBAAiB,CAAA;AACjD,OAAO,KAAK,EAAE,sBAAsB,EAAE,MAAM,gCAAgC,CAAA;AAE5E,MAAM,MAAM,mBAAmB,GAAG;IAChC,IAAI,EAAE,mBAAmB,CAAA;IACzB,YAAY,EAAE,MAAM,CAAA;IACpB,WAAW,CAAC,EAAE,SAAS,MAAM,EAAE,CAAA;IAC/B,IAAI,CAAC,EAAE,OAAO,CAAA;IACd,YAAY,CAAC,EAAE,sBAAsB,CAAA;CACtC,CAAA;AAED,MAAM,MAAM,kBAAkB,GAAG;IAC/B,IAAI,EAAE,kBAAkB,CAAA;IACxB,YAAY,EAAE,MAAM,CAAA;IACpB,UAAU,EAAE,UAAU,CAAA;IACtB,YAAY,CAAC,EAAE,sBAAsB,CAAA;CACtC,CAAA;AAED,MAAM,MAAM,aAAa,GAAG,mBAAmB,GAAG,kBAAkB,CAAA;AAEpE;;GAEG;AACH,MAAM,WAAW,eAAe;IAC9B,OAAO,CAAC,GAAG,EAAE,aAAa,GAAG,OAAO,CAAC,IAAI,CAAC,CAAA;CAC3C;AAED,MAAM,MAAM,oBAAoB,GAAG,CAAC,GAAG,EAAE,aAAa,KAAK,OAAO,CAAC,IAAI,CAAC,CAAA"}
|
|
@@ -7,12 +7,17 @@
|
|
|
7
7
|
import { type AttachmentTableNames } from './integrations/lucid/schema/attachment_table_names.js';
|
|
8
8
|
import type { ApplicationService, ConfigProvider } from '@adonisjs/core/types';
|
|
9
9
|
import type { AttachmentServiceOptions } from './core/attachment_service.js';
|
|
10
|
+
import type { AttachmentMetadataMode } from './core/attachment_service.js';
|
|
11
|
+
import type { AttachmentMetadataPersister } from './core/attachment_metadata_persister.js';
|
|
10
12
|
import type { AttachmentJobProcessor } from './core/attachment_job_processor.js';
|
|
11
13
|
import type { AttachmentRepository } from './core/attachment_repository.js';
|
|
12
14
|
import type { AttachmentJobHandler, AttachmentQueue } from './core/queue.js';
|
|
13
15
|
import type { AttachmentStorage } from './core/storage.js';
|
|
14
16
|
import type { AttachmentManagerOptions } from './sources/attachment_manager.js';
|
|
15
17
|
import type { AttachmentPersistenceOptions } from './core/attachment_options.js';
|
|
18
|
+
import type { MediaMetadataExtractor } from './media/media_metadata.js';
|
|
19
|
+
import type { AttachmentEventEmitter } from './events/attachment_events.js';
|
|
20
|
+
import { type ConverterConfigMap, type VariantConverterRegistry } from './converters/configured_variant_converter_registry.js';
|
|
16
21
|
type Integration<T> = T | ((app: ApplicationService) => T | Promise<T>);
|
|
17
22
|
export type AttachmentRouteConfig = false | {
|
|
18
23
|
prefix?: string;
|
|
@@ -28,7 +33,20 @@ export type AttachmentIntegrationsConfig = {
|
|
|
28
33
|
/** Optional configuration for the Lucid persistence integration. */
|
|
29
34
|
lucid?: LucidAttachmentConfig;
|
|
30
35
|
};
|
|
31
|
-
export type
|
|
36
|
+
export type AttachmentMediaConfig = {
|
|
37
|
+
/** Extracts technical metadata when a persistence option enables `meta`. */
|
|
38
|
+
metadata?: Integration<readonly MediaMetadataExtractor[]>;
|
|
39
|
+
metadataPolicy?: {
|
|
40
|
+
mode?: AttachmentMetadataMode;
|
|
41
|
+
variants?: boolean;
|
|
42
|
+
};
|
|
43
|
+
metadataPersister?: Integration<AttachmentMetadataPersister>;
|
|
44
|
+
};
|
|
45
|
+
/** Optional application event emitter used for attachment lifecycle events. */
|
|
46
|
+
export type AttachmentEventsConfig = Integration<AttachmentEventEmitter>;
|
|
47
|
+
/** v5-style named converter declarations, resolved lazily when a job needs one. */
|
|
48
|
+
export type AttachmentConvertersConfig = ConverterConfigMap;
|
|
49
|
+
export type AttachmentConfig<KnownConverters extends ConverterConfigMap = ConverterConfigMap> = {
|
|
32
50
|
/** Overrides the storage default. Falls back to `fs` when no adapter provides one. */
|
|
33
51
|
defaultDisk?: string;
|
|
34
52
|
storage: Integration<AttachmentStorage>;
|
|
@@ -41,10 +59,13 @@ export type AttachmentConfig = {
|
|
|
41
59
|
sources?: AttachmentManagerOptions;
|
|
42
60
|
route?: AttachmentRouteConfig;
|
|
43
61
|
integrations?: AttachmentIntegrationsConfig;
|
|
62
|
+
media?: AttachmentMediaConfig;
|
|
63
|
+
events?: AttachmentEventsConfig;
|
|
64
|
+
converters?: KnownConverters;
|
|
44
65
|
queueConcurrency?: number;
|
|
45
66
|
createId?: () => string;
|
|
46
67
|
};
|
|
47
|
-
export type ResolvedAttachmentConfig = AttachmentServiceOptions & {
|
|
68
|
+
export type ResolvedAttachmentConfig<KnownConverters extends ConverterConfigMap = ConverterConfigMap> = AttachmentServiceOptions & {
|
|
48
69
|
repository?: AttachmentRepository;
|
|
49
70
|
defaults?: AttachmentPersistenceOptions;
|
|
50
71
|
sources?: AttachmentManagerOptions;
|
|
@@ -52,10 +73,13 @@ export type ResolvedAttachmentConfig = AttachmentServiceOptions & {
|
|
|
52
73
|
integrations?: {
|
|
53
74
|
lucid?: AttachmentTableNames;
|
|
54
75
|
};
|
|
76
|
+
converters?: VariantConverterRegistry<Extract<keyof KnownConverters, string>>;
|
|
55
77
|
};
|
|
78
|
+
/** Extracts the converter map from a config returned by `defineConfig`. */
|
|
79
|
+
export type InferConverters<Config> = Config extends ConfigProvider<ResolvedAttachmentConfig<infer KnownConverters>> ? KnownConverters : never;
|
|
56
80
|
/**
|
|
57
81
|
* Defers resolution of optional Adonis integrations until application boot.
|
|
58
82
|
*/
|
|
59
|
-
export declare function defineConfig(config: AttachmentConfig): ConfigProvider<ResolvedAttachmentConfig
|
|
83
|
+
export declare function defineConfig<const KnownConverters extends ConverterConfigMap = {}>(config: AttachmentConfig<KnownConverters>): ConfigProvider<ResolvedAttachmentConfig<KnownConverters>>;
|
|
60
84
|
export {};
|
|
61
85
|
//# sourceMappingURL=define_config.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"define_config.d.ts","sourceRoot":"","sources":["../../src/define_config.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;
|
|
1
|
+
{"version":3,"file":"define_config.d.ts","sourceRoot":"","sources":["../../src/define_config.ts"],"names":[],"mappings":"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"}
|
|
@@ -6,7 +6,9 @@
|
|
|
6
6
|
*/
|
|
7
7
|
import { configProvider } from '@adonisjs/core';
|
|
8
8
|
import { MemoryAttachmentQueue } from './queues/memory_queue.js';
|
|
9
|
+
import { AttachmentError } from './errors.js';
|
|
9
10
|
import { resolveAttachmentTableNames, } from './integrations/lucid/schema/attachment_table_names.js';
|
|
11
|
+
import { ConfiguredVariantConverterRegistry, } from './converters/configured_variant_converter_registry.js';
|
|
10
12
|
/**
|
|
11
13
|
* Defers resolution of optional Adonis integrations until application boot.
|
|
12
14
|
*/
|
|
@@ -26,6 +28,21 @@ export function defineConfig(config) {
|
|
|
26
28
|
: async () => { },
|
|
27
29
|
...(config.queueConcurrency ? { concurrency: config.queueConcurrency } : {}),
|
|
28
30
|
});
|
|
31
|
+
const metadataExtractors = config.media?.metadata
|
|
32
|
+
? await resolveIntegration(config.media.metadata, app)
|
|
33
|
+
: undefined;
|
|
34
|
+
const metadataPersister = config.media?.metadataPersister
|
|
35
|
+
? await resolveIntegration(config.media.metadataPersister, app)
|
|
36
|
+
: undefined;
|
|
37
|
+
const resolvedMetadataPersister = metadataPersister
|
|
38
|
+
?? await resolveLucidMetadataPersister(config.media?.metadataPolicy?.mode, config.integrations?.lucid);
|
|
39
|
+
const events = config.events ? await resolveIntegration(config.events, app) : undefined;
|
|
40
|
+
if (processor && events) {
|
|
41
|
+
processor.setEventEmitter(events);
|
|
42
|
+
}
|
|
43
|
+
if (config.media?.metadataPolicy?.mode === 'deferred' && !resolvedMetadataPersister) {
|
|
44
|
+
throw new AttachmentError('Deferred metadata extraction requires media.metadataPersister or integrations.lucid', { code: 'E_INVALID_ATTACHMENT_CONFIG' });
|
|
45
|
+
}
|
|
29
46
|
return {
|
|
30
47
|
defaultDisk: config.defaultDisk ?? storage.defaultDisk ?? 'fs',
|
|
31
48
|
storage,
|
|
@@ -36,6 +53,14 @@ export function defineConfig(config) {
|
|
|
36
53
|
: {}),
|
|
37
54
|
...(config.defaults ? { defaults: config.defaults } : {}),
|
|
38
55
|
...(config.sources ? { sources: config.sources } : {}),
|
|
56
|
+
...(metadataExtractors ? { metadataExtractors } : {}),
|
|
57
|
+
...(config.media?.metadataPolicy?.mode ? { metadataMode: config.media.metadataPolicy.mode } : {}),
|
|
58
|
+
...(config.media?.metadataPolicy?.variants !== undefined ? { metadataVariants: config.media.metadataPolicy.variants } : {}),
|
|
59
|
+
...(resolvedMetadataPersister ? { metadataPersister: resolvedMetadataPersister } : {}),
|
|
60
|
+
...(events ? { events } : {}),
|
|
61
|
+
...(config.converters
|
|
62
|
+
? { converters: new ConfiguredVariantConverterRegistry(config.converters) }
|
|
63
|
+
: {}),
|
|
39
64
|
...(config.integrations?.lucid
|
|
40
65
|
? {
|
|
41
66
|
integrations: {
|
|
@@ -47,13 +72,22 @@ export function defineConfig(config) {
|
|
|
47
72
|
};
|
|
48
73
|
});
|
|
49
74
|
}
|
|
75
|
+
async function resolveLucidMetadataPersister(mode, lucid) {
|
|
76
|
+
if (mode !== 'deferred' || !lucid) {
|
|
77
|
+
return undefined;
|
|
78
|
+
}
|
|
79
|
+
const { LucidAttachmentMetadataPersister } = await import('./integrations/lucid/persistence/lucid_attachment_metadata_persister.js');
|
|
80
|
+
return new LucidAttachmentMetadataPersister();
|
|
81
|
+
}
|
|
50
82
|
function resolveRoute(route) {
|
|
51
83
|
if (route === false) {
|
|
52
84
|
return false;
|
|
53
85
|
}
|
|
54
86
|
const prefix = route?.prefix ?? '/attachments';
|
|
55
87
|
if (!prefix.startsWith('/') || prefix.includes(':')) {
|
|
56
|
-
throw new
|
|
88
|
+
throw new AttachmentError('Attachment route prefix must start with "/" and cannot contain parameters', {
|
|
89
|
+
code: 'E_INVALID_ATTACHMENT_ROUTE',
|
|
90
|
+
});
|
|
57
91
|
}
|
|
58
92
|
return { path: `${prefix.replace(/\/+$/, '') || ''}/:id` };
|
|
59
93
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"define_config.js","sourceRoot":"","sources":["../../src/define_config.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,OAAO,EAAE,cAAc,EAAE,MAAM,gBAAgB,CAAA;AAC/C,OAAO,EAAE,qBAAqB,EAAE,MAAM,0BAA0B,CAAA;AAChE,OAAO,EACL,2BAA2B,GAE5B,MAAM,uDAAuD,CAAA;
|
|
1
|
+
{"version":3,"file":"define_config.js","sourceRoot":"","sources":["../../src/define_config.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,57 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @jrmc/adonis-attachment
|
|
3
|
+
*
|
|
4
|
+
* @license MIT
|
|
5
|
+
* @copyright Jeremy Chaufourier <jeremy@chaufourier.fr>
|
|
6
|
+
*/
|
|
7
|
+
import { Exception } from '@adonisjs/core/exceptions';
|
|
8
|
+
export type AttachmentErrorOptions = ErrorOptions & {
|
|
9
|
+
code?: string;
|
|
10
|
+
status?: number;
|
|
11
|
+
};
|
|
12
|
+
/** Base exception for every error emitted by this package. */
|
|
13
|
+
export declare class AttachmentError extends Exception {
|
|
14
|
+
static code: string;
|
|
15
|
+
static status: number;
|
|
16
|
+
constructor(message: string, options?: AttachmentErrorOptions);
|
|
17
|
+
}
|
|
18
|
+
/** Raised when an attachment source cannot be normalized. */
|
|
19
|
+
export declare class AttachmentSourceError extends AttachmentError {
|
|
20
|
+
constructor(message: string, options?: AttachmentErrorOptions);
|
|
21
|
+
}
|
|
22
|
+
/** Raised when caller-provided attachment data fails a package invariant. */
|
|
23
|
+
export declare class AttachmentValidationError extends AttachmentError {
|
|
24
|
+
static code: string;
|
|
25
|
+
static status: number;
|
|
26
|
+
}
|
|
27
|
+
/** Raised when an attachment operation conflicts with current persisted state. */
|
|
28
|
+
export declare class AttachmentConflictError extends AttachmentError {
|
|
29
|
+
static code: string;
|
|
30
|
+
static status: number;
|
|
31
|
+
}
|
|
32
|
+
/** Raised when an adapter or integration has been configured incorrectly. */
|
|
33
|
+
export declare class AttachmentConfigurationError extends AttachmentError {
|
|
34
|
+
static code: string;
|
|
35
|
+
}
|
|
36
|
+
export declare class AttachmentNotFoundError extends AttachmentError {
|
|
37
|
+
constructor(attachmentId: string);
|
|
38
|
+
}
|
|
39
|
+
export declare class DeferredMetadataProcessorNotConfiguredError extends AttachmentError {
|
|
40
|
+
constructor();
|
|
41
|
+
}
|
|
42
|
+
export declare class DeferredMetadataNotConfiguredError extends AttachmentError {
|
|
43
|
+
constructor();
|
|
44
|
+
}
|
|
45
|
+
export declare class InvalidConverterModuleError extends AttachmentError {
|
|
46
|
+
constructor(key: string);
|
|
47
|
+
}
|
|
48
|
+
export declare class UnknownVariantConverterError extends AttachmentError {
|
|
49
|
+
constructor(key: string);
|
|
50
|
+
}
|
|
51
|
+
export declare class PersistedAttachmentNotFoundError extends AttachmentError {
|
|
52
|
+
constructor(id: string);
|
|
53
|
+
}
|
|
54
|
+
export declare class MissingOptionalDependencyError extends AttachmentError {
|
|
55
|
+
constructor(packages: string | readonly string[]);
|
|
56
|
+
}
|
|
57
|
+
//# sourceMappingURL=errors.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"errors.d.ts","sourceRoot":"","sources":["../../src/errors.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,OAAO,EAAE,SAAS,EAAE,MAAM,2BAA2B,CAAA;AAErD,MAAM,MAAM,sBAAsB,GAAG,YAAY,GAAG;IAClD,IAAI,CAAC,EAAE,MAAM,CAAA;IACb,MAAM,CAAC,EAAE,MAAM,CAAA;CAChB,CAAA;AAED,8DAA8D;AAC9D,qBAAa,eAAgB,SAAQ,SAAS;IAC5C,MAAM,CAAC,IAAI,SAAuB;IAClC,MAAM,CAAC,MAAM,SAAM;gBAEP,OAAO,EAAE,MAAM,EAAE,OAAO,GAAE,sBAA2B;CAMlE;AAED,6DAA6D;AAC7D,qBAAa,qBAAsB,SAAQ,eAAe;gBAC5C,OAAO,EAAE,MAAM,EAAE,OAAO,GAAE,sBAA2B;CAOlE;AAED,6EAA6E;AAC7E,qBAAa,yBAA0B,SAAQ,eAAe;IAC5D,MAAM,CAAC,IAAI,SAAyB;IACpC,MAAM,CAAC,MAAM,SAAM;CACpB;AAED,kFAAkF;AAClF,qBAAa,uBAAwB,SAAQ,eAAe;IAC1D,MAAM,CAAC,IAAI,SAA0B;IACrC,MAAM,CAAC,MAAM,SAAM;CACpB;AAED,6EAA6E;AAC7E,qBAAa,4BAA6B,SAAQ,eAAe;IAC/D,MAAM,CAAC,IAAI,SAA+B;CAC3C;AAED,qBAAa,uBAAwB,SAAQ,eAAe;gBAC9C,YAAY,EAAE,MAAM;CAMjC;AAED,qBAAa,2CAA4C,SAAQ,eAAe;;CAM/E;AAED,qBAAa,kCAAmC,SAAQ,eAAe;;CAMtE;AAED,qBAAa,2BAA4B,SAAQ,eAAe;gBAClD,GAAG,EAAE,MAAM;CAKxB;AAED,qBAAa,4BAA6B,SAAQ,eAAe;gBACnD,GAAG,EAAE,MAAM;CAMxB;AAED,qBAAa,gCAAiC,SAAQ,eAAe;gBACvD,EAAE,EAAE,MAAM;CAMvB;AAED,qBAAa,8BAA+B,SAAQ,eAAe;gBACrD,QAAQ,EAAE,MAAM,GAAG,SAAS,MAAM,EAAE;CAMjD"}
|