@fengsoft/media-core 0.1.0 → 0.1.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -0,0 +1,85 @@
1
+ import { type StorageBody, type StorageDriver, type StorageMetadata } from "@fengsoft/storage-core";
2
+ export type MediaType = "image" | "video" | "document";
3
+ export type MediaAsset = {
4
+ key: string;
5
+ url: string | null;
6
+ contentType: string;
7
+ contentLength: number;
8
+ width?: number;
9
+ height?: number;
10
+ };
11
+ export type MediaVariant = MediaAsset & {
12
+ variant: "optimized" | "thumbnail" | "responsive";
13
+ };
14
+ export type MediaAssetSet = {
15
+ mediaType: MediaType;
16
+ original: MediaAsset;
17
+ optimized?: MediaVariant;
18
+ thumbnail?: MediaVariant;
19
+ variants: MediaVariant[];
20
+ };
21
+ export type UploadPolicy = {
22
+ maxBytes?: number;
23
+ allowedMimeTypes?: string[];
24
+ imageVariantWidths?: number[];
25
+ thumbnailWidth?: number;
26
+ cacheControl?: string;
27
+ };
28
+ export type MediaUploadInput = {
29
+ namespace: string;
30
+ fileName: string;
31
+ body: StorageBody;
32
+ contentType: string;
33
+ cacheControl?: string;
34
+ metadata?: StorageMetadata;
35
+ };
36
+ export type ImageInfo = {
37
+ width: number | null;
38
+ height: number | null;
39
+ };
40
+ export interface ImageProcessor {
41
+ getInfo(buffer: Buffer): Promise<ImageInfo>;
42
+ optimize(buffer: Buffer): Promise<Buffer>;
43
+ createThumbnail(buffer: Buffer, width: number): Promise<Buffer>;
44
+ createVariant(buffer: Buffer, width: number): Promise<Buffer>;
45
+ }
46
+ export type MediaPathStrategy = {
47
+ createOriginalKey(input: PathStrategyInput): string;
48
+ createOptimizedKey(input: PathStrategyInput): string;
49
+ createThumbnailKey(input: PathStrategyInput): string;
50
+ createVariantKey(input: PathStrategyInput, width: number): string;
51
+ };
52
+ type PathStrategyInput = {
53
+ namespace: string;
54
+ sanitizedBaseName: string;
55
+ extension: string;
56
+ };
57
+ export declare class UploadPolicyError extends Error {
58
+ constructor(message: string);
59
+ }
60
+ export declare class MediaPipeline {
61
+ #private;
62
+ constructor(options: MediaPipelineOptions);
63
+ uploadImage(input: MediaUploadInput): Promise<MediaAssetSet>;
64
+ uploadVideo(input: MediaUploadInput): Promise<MediaAssetSet>;
65
+ uploadDocument(input: MediaUploadInput): Promise<MediaAssetSet>;
66
+ deleteAssetSet(assetSet: MediaAssetSet): Promise<void>;
67
+ }
68
+ export type MediaPipelineOptions = {
69
+ storage: StorageDriver;
70
+ policy?: UploadPolicy;
71
+ pathStrategy?: MediaPathStrategy;
72
+ imageProcessor?: ImageProcessor;
73
+ };
74
+ export declare class SharpImageProcessor implements ImageProcessor {
75
+ getInfo(buffer: Buffer): Promise<ImageInfo>;
76
+ optimize(buffer: Buffer): Promise<Buffer>;
77
+ createThumbnail(buffer: Buffer, width: number): Promise<Buffer>;
78
+ createVariant(buffer: Buffer, width: number): Promise<Buffer>;
79
+ }
80
+ export declare function createDefaultPathStrategy(): MediaPathStrategy;
81
+ export declare function cleanupUploadedObjects(storage: StorageDriver, keys: string[]): Promise<void>;
82
+ export declare function normalizeMimeType(contentType: string): string;
83
+ export declare function sanitizeFileName(fileName: string): string;
84
+ export {};
85
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"}
package/dist/index.js ADDED
@@ -0,0 +1,235 @@
1
+ import { toBuffer, } from "@fengsoft/storage-core";
2
+ export class UploadPolicyError extends Error {
3
+ constructor(message) {
4
+ super(message);
5
+ this.name = "UploadPolicyError";
6
+ }
7
+ }
8
+ export class MediaPipeline {
9
+ #storage;
10
+ #policy;
11
+ #pathStrategy;
12
+ #imageProcessor;
13
+ constructor(options) {
14
+ this.#storage = options.storage;
15
+ this.#policy = {
16
+ maxBytes: options.policy?.maxBytes ?? 10 * 1024 * 1024,
17
+ allowedMimeTypes: options.policy?.allowedMimeTypes ?? DEFAULT_ALLOWED_MIME_TYPES,
18
+ imageVariantWidths: options.policy?.imageVariantWidths ?? DEFAULT_VARIANT_WIDTHS,
19
+ thumbnailWidth: options.policy?.thumbnailWidth ?? 256,
20
+ cacheControl: options.policy?.cacheControl ?? "public, max-age=31536000, immutable",
21
+ };
22
+ this.#pathStrategy = options.pathStrategy ?? createDefaultPathStrategy();
23
+ this.#imageProcessor = options.imageProcessor ?? new SharpImageProcessor();
24
+ }
25
+ async uploadImage(input) {
26
+ const buffer = toBuffer(input.body);
27
+ this.#validateInput(input, buffer);
28
+ const pathInput = createPathStrategyInput(input.namespace, input.fileName);
29
+ if (PASSTHROUGH_IMAGE_MIME_TYPES.has(normalizeMimeType(input.contentType))) {
30
+ const original = await this.#storeOriginal(input, buffer, pathInput);
31
+ return {
32
+ mediaType: "image",
33
+ original,
34
+ variants: [],
35
+ };
36
+ }
37
+ const info = await this.#imageProcessor.getInfo(buffer);
38
+ const original = await this.#storeOriginal(input, buffer, pathInput, info);
39
+ const uploadedKeys = [original.key];
40
+ try {
41
+ const optimizedBuffer = await this.#imageProcessor.optimize(buffer);
42
+ const optimized = await this.#storeDerived(input, optimizedBuffer, "image/webp", this.#pathStrategy.createOptimizedKey(pathInput), "optimized");
43
+ uploadedKeys.push(optimized.key);
44
+ const thumbnailBuffer = await this.#imageProcessor.createThumbnail(buffer, this.#policy.thumbnailWidth);
45
+ const thumbnail = await this.#storeDerived(input, thumbnailBuffer, "image/webp", this.#pathStrategy.createThumbnailKey(pathInput), "thumbnail");
46
+ uploadedKeys.push(thumbnail.key);
47
+ const variants = [];
48
+ for (const width of this.#policy.imageVariantWidths) {
49
+ const variantBuffer = await this.#imageProcessor.createVariant(buffer, width);
50
+ const variant = await this.#storeDerived(input, variantBuffer, "image/webp", this.#pathStrategy.createVariantKey(pathInput, width), "responsive");
51
+ variants.push(variant);
52
+ uploadedKeys.push(variant.key);
53
+ }
54
+ return {
55
+ mediaType: "image",
56
+ original,
57
+ optimized,
58
+ thumbnail,
59
+ variants,
60
+ };
61
+ }
62
+ catch (error) {
63
+ await cleanupUploadedObjects(this.#storage, uploadedKeys);
64
+ throw error;
65
+ }
66
+ }
67
+ async uploadVideo(input) {
68
+ const buffer = toBuffer(input.body);
69
+ this.#validateInput(input, buffer);
70
+ const original = await this.#storeOriginal(input, buffer, createPathStrategyInput(input.namespace, input.fileName));
71
+ return {
72
+ mediaType: "video",
73
+ original,
74
+ variants: [],
75
+ };
76
+ }
77
+ async uploadDocument(input) {
78
+ const buffer = toBuffer(input.body);
79
+ this.#validateInput(input, buffer);
80
+ const original = await this.#storeOriginal(input, buffer, createPathStrategyInput(input.namespace, input.fileName));
81
+ return {
82
+ mediaType: "document",
83
+ original,
84
+ variants: [],
85
+ };
86
+ }
87
+ async deleteAssetSet(assetSet) {
88
+ const keys = [
89
+ assetSet.original.key,
90
+ assetSet.optimized?.key,
91
+ assetSet.thumbnail?.key,
92
+ ...assetSet.variants.map((variant) => variant.key),
93
+ ].filter((value) => Boolean(value));
94
+ await cleanupUploadedObjects(this.#storage, keys);
95
+ }
96
+ #validateInput(input, buffer) {
97
+ const normalizedMime = normalizeMimeType(input.contentType);
98
+ if (!this.#policy.allowedMimeTypes.includes(normalizedMime)) {
99
+ throw new UploadPolicyError(`Unsupported MIME type: ${input.contentType}`);
100
+ }
101
+ if (buffer.length > this.#policy.maxBytes) {
102
+ throw new UploadPolicyError(`Upload exceeds max bytes: ${buffer.length} > ${this.#policy.maxBytes}`);
103
+ }
104
+ }
105
+ async #storeOriginal(input, buffer, pathInput, info) {
106
+ const key = this.#pathStrategy.createOriginalKey(pathInput);
107
+ return this.#storeObject(key, buffer, input.contentType, info, input.metadata, input.cacheControl);
108
+ }
109
+ async #storeDerived(input, buffer, contentType, key, variant) {
110
+ const info = contentType.startsWith("image/")
111
+ ? await this.#imageProcessor.getInfo(buffer)
112
+ : { width: null, height: null };
113
+ const stored = await this.#storeObject(key, buffer, contentType, info, input.metadata, input.cacheControl);
114
+ return {
115
+ ...stored,
116
+ variant,
117
+ };
118
+ }
119
+ async #storeObject(key, buffer, contentType, info = { width: null, height: null }, metadata, cacheControl) {
120
+ await this.#storage.putObject({
121
+ key,
122
+ body: buffer,
123
+ contentType,
124
+ cacheControl: cacheControl ?? this.#policy.cacheControl,
125
+ metadata,
126
+ });
127
+ return {
128
+ key,
129
+ url: this.#storage.resolvePublicUrl(key),
130
+ contentType,
131
+ contentLength: buffer.length,
132
+ width: info.width ?? undefined,
133
+ height: info.height ?? undefined,
134
+ };
135
+ }
136
+ }
137
+ export class SharpImageProcessor {
138
+ async getInfo(buffer) {
139
+ const sharp = await loadSharp();
140
+ const metadata = await sharp(buffer).metadata();
141
+ return {
142
+ width: metadata.width ?? null,
143
+ height: metadata.height ?? null,
144
+ };
145
+ }
146
+ async optimize(buffer) {
147
+ const sharp = await loadSharp();
148
+ return sharp(buffer).webp({ quality: 82 }).toBuffer();
149
+ }
150
+ async createThumbnail(buffer, width) {
151
+ const sharp = await loadSharp();
152
+ return sharp(buffer)
153
+ .resize({ width, fit: "inside", withoutEnlargement: true })
154
+ .webp({ quality: 78 })
155
+ .toBuffer();
156
+ }
157
+ async createVariant(buffer, width) {
158
+ const sharp = await loadSharp();
159
+ return sharp(buffer)
160
+ .resize({ width, fit: "inside", withoutEnlargement: true })
161
+ .webp({ quality: 82 })
162
+ .toBuffer();
163
+ }
164
+ }
165
+ export function createDefaultPathStrategy() {
166
+ return {
167
+ createOriginalKey(input) {
168
+ return `${input.namespace}/originals/${input.sanitizedBaseName}${input.extension}`;
169
+ },
170
+ createOptimizedKey(input) {
171
+ return `${input.namespace}/optimized/${input.sanitizedBaseName}.webp`;
172
+ },
173
+ createThumbnailKey(input) {
174
+ return `${input.namespace}/thumbnails/${input.sanitizedBaseName}.webp`;
175
+ },
176
+ createVariantKey(input, width) {
177
+ return `${input.namespace}/variants/${input.sanitizedBaseName}-${width}.webp`;
178
+ },
179
+ };
180
+ }
181
+ export async function cleanupUploadedObjects(storage, keys) {
182
+ const uniqueKeys = [...new Set(keys)];
183
+ await Promise.all(uniqueKeys.map(async (key) => {
184
+ try {
185
+ await storage.deleteObject({ key });
186
+ }
187
+ catch {
188
+ // cleanup is best-effort by design
189
+ }
190
+ }));
191
+ }
192
+ export function normalizeMimeType(contentType) {
193
+ return contentType.trim().toLowerCase();
194
+ }
195
+ export function sanitizeFileName(fileName) {
196
+ return fileName
197
+ .trim()
198
+ .toLowerCase()
199
+ .replace(/[^a-z0-9._-]+/g, "-")
200
+ .replace(/-+/g, "-")
201
+ .replace(/^-|-$/g, "");
202
+ }
203
+ function createPathStrategyInput(namespace, fileName) {
204
+ const sanitized = sanitizeFileName(fileName);
205
+ const lastDotIndex = sanitized.lastIndexOf(".");
206
+ const baseName = lastDotIndex > 0 ? sanitized.slice(0, lastDotIndex) : sanitized || "asset";
207
+ const extension = lastDotIndex > 0 ? sanitized.slice(lastDotIndex) : "";
208
+ return {
209
+ namespace: namespace.replace(/^\/+|\/+$/g, ""),
210
+ sanitizedBaseName: `${Date.now()}-${baseName}`,
211
+ extension,
212
+ };
213
+ }
214
+ const DEFAULT_ALLOWED_MIME_TYPES = [
215
+ "image/png",
216
+ "image/jpeg",
217
+ "image/webp",
218
+ "image/svg+xml",
219
+ "image/x-icon",
220
+ "video/mp4",
221
+ "application/pdf",
222
+ ];
223
+ const DEFAULT_VARIANT_WIDTHS = [320, 640, 1280];
224
+ const PASSTHROUGH_IMAGE_MIME_TYPES = new Set(["image/svg+xml", "image/x-icon"]);
225
+ let sharpModulePromise = null;
226
+ async function loadSharp() {
227
+ if (!sharpModulePromise) {
228
+ sharpModulePromise = import("sharp").then((module) => {
229
+ const candidate = module;
230
+ return candidate.default ?? candidate;
231
+ });
232
+ }
233
+ return sharpModulePromise;
234
+ }
235
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@fengsoft/media-core",
3
- "version": "0.1.0",
3
+ "version": "0.1.1",
4
4
  "type": "module",
5
5
  "main": "./dist/index.js",
6
6
  "module": "./dist/index.js",
@@ -33,8 +33,8 @@
33
33
  "storage"
34
34
  ],
35
35
  "dependencies": {
36
- "sharp": "^0.34.4",
37
- "@fengsoft/storage-core": "0.1.0"
36
+ "@fengsoft/storage-core": "^0.1.0",
37
+ "sharp": "^0.34.4"
38
38
  },
39
39
  "publishConfig": {
40
40
  "access": "public"