@trokky/trokky 3.0.0 → 3.2.0
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/adapters/cloudflare-d1/cloudflare-d1-adapter.d.ts +132 -0
- package/dist/adapters/cloudflare-d1/cloudflare-d1-adapter.d.ts.map +1 -0
- package/dist/adapters/cloudflare-d1/cloudflare-d1-adapter.js +811 -0
- package/dist/adapters/cloudflare-d1/cloudflare-d1-adapter.js.map +1 -0
- package/dist/adapters/cloudflare-d1/index.d.ts +5 -0
- package/dist/adapters/cloudflare-d1/index.d.ts.map +1 -0
- package/dist/adapters/cloudflare-d1/index.js +12 -0
- package/dist/adapters/cloudflare-d1/index.js.map +1 -0
- package/dist/adapters/cloudflare-d1/rate-limit-store.d.ts +46 -0
- package/dist/adapters/cloudflare-d1/rate-limit-store.d.ts.map +1 -0
- package/dist/adapters/cloudflare-d1/rate-limit-store.js +96 -0
- package/dist/adapters/cloudflare-d1/rate-limit-store.js.map +1 -0
- package/dist/adapters/cloudflare-d1/types.d.ts +69 -0
- package/dist/adapters/cloudflare-d1/types.d.ts.map +1 -0
- package/dist/adapters/cloudflare-d1/types.js +2 -0
- package/dist/adapters/cloudflare-d1/types.js.map +1 -0
- package/dist/adapters/cloudflare-r2/cloudflare-r2-adapter.d.ts +86 -0
- package/dist/adapters/cloudflare-r2/cloudflare-r2-adapter.d.ts.map +1 -0
- package/dist/adapters/cloudflare-r2/cloudflare-r2-adapter.js +493 -0
- package/dist/adapters/cloudflare-r2/cloudflare-r2-adapter.js.map +1 -0
- package/dist/adapters/cloudflare-r2/index.d.ts +3 -0
- package/dist/adapters/cloudflare-r2/index.d.ts.map +1 -0
- package/dist/adapters/cloudflare-r2/index.js +11 -0
- package/dist/adapters/cloudflare-r2/index.js.map +1 -0
- package/dist/adapters/cloudflare-r2/types.d.ts +43 -0
- package/dist/adapters/cloudflare-r2/types.d.ts.map +1 -0
- package/dist/adapters/cloudflare-r2/types.js +2 -0
- package/dist/adapters/cloudflare-r2/types.js.map +1 -0
- package/dist/core/media/image-processor.d.ts.map +1 -1
- package/dist/core/media/image-processor.js +5 -13
- package/dist/core/media/image-processor.js.map +1 -1
- package/dist/core/media/processors/sharp.d.ts.map +1 -1
- package/dist/core/media/processors/sharp.js +13 -2
- package/dist/core/media/processors/sharp.js.map +1 -1
- package/dist/core/media/processors/types.d.ts +1 -1
- package/dist/core/media/processors/types.d.ts.map +1 -1
- package/dist/core/security/rate-limit-store.d.ts +56 -0
- package/dist/core/security/rate-limit-store.d.ts.map +1 -0
- package/dist/core/security/rate-limit-store.js +55 -0
- package/dist/core/security/rate-limit-store.js.map +1 -0
- package/dist/core/security/rate-limiter.d.ts +30 -2
- package/dist/core/security/rate-limiter.d.ts.map +1 -1
- package/dist/core/security/rate-limiter.js +50 -19
- package/dist/core/security/rate-limiter.js.map +1 -1
- package/dist/core/services/media-service.d.ts +34 -0
- package/dist/core/services/media-service.d.ts.map +1 -1
- package/dist/core/services/media-service.js +172 -120
- package/dist/core/services/media-service.js.map +1 -1
- package/dist/core/utils/retry.d.ts +45 -0
- package/dist/core/utils/retry.d.ts.map +1 -0
- package/dist/core/utils/retry.js +47 -0
- package/dist/core/utils/retry.js.map +1 -0
- package/dist/integrations/express/config.d.ts +31 -14
- package/dist/integrations/express/config.d.ts.map +1 -1
- package/dist/integrations/express/config.js +25 -8
- package/dist/integrations/express/config.js.map +1 -1
- package/dist/integrations/express/integration.d.ts.map +1 -1
- package/dist/integrations/express/integration.js +13 -6
- package/dist/integrations/express/integration.js.map +1 -1
- package/dist/integrations/express/server.d.ts.map +1 -1
- package/dist/integrations/express/server.js +5 -2
- package/dist/integrations/express/server.js.map +1 -1
- package/dist/integrations/express/types.d.ts +0 -5
- package/dist/integrations/express/types.d.ts.map +1 -1
- package/dist/integrations/workers/adapter.d.ts +28 -0
- package/dist/integrations/workers/adapter.d.ts.map +1 -0
- package/dist/integrations/workers/adapter.js +111 -0
- package/dist/integrations/workers/adapter.js.map +1 -0
- package/dist/integrations/workers/index.d.ts +22 -0
- package/dist/integrations/workers/index.d.ts.map +1 -0
- package/dist/integrations/workers/index.js +60 -0
- package/dist/integrations/workers/index.js.map +1 -0
- package/dist/routes/auth/auth-flow-store.d.ts +17 -0
- package/dist/routes/auth/auth-flow-store.d.ts.map +1 -1
- package/dist/routes/auth/auth-flow-store.js +27 -0
- package/dist/routes/auth/auth-flow-store.js.map +1 -1
- package/dist/routes/auth/oauth.d.ts.map +1 -1
- package/dist/routes/auth/oauth.js +5 -12
- package/dist/routes/auth/oauth.js.map +1 -1
- package/dist/routes/auth/passkey.d.ts.map +1 -1
- package/dist/routes/auth/passkey.js +5 -8
- package/dist/routes/auth/passkey.js.map +1 -1
- package/dist/structure/validation/schemas.d.ts +69 -69
- package/package.json +20 -1
- package/dist/core/media/processors/cloudflare-images.d.ts +0 -83
- package/dist/core/media/processors/cloudflare-images.d.ts.map +0 -1
- package/dist/core/media/processors/cloudflare-images.js +0 -241
- package/dist/core/media/processors/cloudflare-images.js.map +0 -1
- package/dist/core/media/processors/cloudflare-transform-store.d.ts +0 -127
- package/dist/core/media/processors/cloudflare-transform-store.d.ts.map +0 -1
- package/dist/core/media/processors/cloudflare-transform-store.js +0 -237
- package/dist/core/media/processors/cloudflare-transform-store.js.map +0 -1
- package/dist/core/media/processors/cloudflare-transformations.d.ts +0 -81
- package/dist/core/media/processors/cloudflare-transformations.d.ts.map +0 -1
- package/dist/core/media/processors/cloudflare-transformations.js +0 -144
- package/dist/core/media/processors/cloudflare-transformations.js.map +0 -1
- package/dist/core/media/processors/workers-images.d.ts +0 -112
- package/dist/core/media/processors/workers-images.d.ts.map +0 -1
- package/dist/core/media/processors/workers-images.js +0 -257
- package/dist/core/media/processors/workers-images.js.map +0 -1
|
@@ -1,81 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* Cloudflare Image Transformations Processor
|
|
3
|
-
*
|
|
4
|
-
* Uses Cloudflare's Image Transformations feature to transform images on-the-fly
|
|
5
|
-
* via URL parameters. Works with images stored in R2 and served through Cloudflare.
|
|
6
|
-
*
|
|
7
|
-
* Unlike Cloudflare Images, this doesn't require a separate service or storage.
|
|
8
|
-
* Images are stored in R2 and transformed when requested via URL parameters.
|
|
9
|
-
*
|
|
10
|
-
* Example URLs:
|
|
11
|
-
* - Original: https://example.com/media/image.jpg
|
|
12
|
-
* - Thumbnail: https://example.com/media/image.jpg?width=300&height=300&fit=crop&format=webp
|
|
13
|
-
* - Medium: https://example.com/media/image.jpg?width=800&height=600&fit=crop&format=webp
|
|
14
|
-
*
|
|
15
|
-
* Documentation: https://developers.cloudflare.com/images/image-resizing/
|
|
16
|
-
*/
|
|
17
|
-
import { ImageProcessor } from './types.js';
|
|
18
|
-
import type { ImageProcessorConfig, ProcessedImage } from './types.js';
|
|
19
|
-
export interface CloudflareTransformationsConfig extends ImageProcessorConfig {
|
|
20
|
-
type: 'cloudflare-transformations';
|
|
21
|
-
options: {
|
|
22
|
-
/**
|
|
23
|
-
* Base URL for serving images (your domain with Cloudflare proxy)
|
|
24
|
-
* Example: 'https://trokky.dev' or 'https://cdn.example.com'
|
|
25
|
-
*/
|
|
26
|
-
baseUrl: string;
|
|
27
|
-
/**
|
|
28
|
-
* Media path prefix (should match your R2 public URL structure)
|
|
29
|
-
* Example: '/media' if images are served at https://trokky.dev/media/filename.jpg
|
|
30
|
-
*/
|
|
31
|
-
mediaPath?: string;
|
|
32
|
-
/**
|
|
33
|
-
* Default format for transformations
|
|
34
|
-
*/
|
|
35
|
-
defaultFormat?: 'webp' | 'avif' | 'jpeg' | 'png';
|
|
36
|
-
/**
|
|
37
|
-
* Default quality (1-100)
|
|
38
|
-
*/
|
|
39
|
-
defaultQuality?: number;
|
|
40
|
-
/**
|
|
41
|
-
* Whether to enable automatic format optimization based on browser support
|
|
42
|
-
*/
|
|
43
|
-
autoFormat?: boolean;
|
|
44
|
-
};
|
|
45
|
-
}
|
|
46
|
-
/**
|
|
47
|
-
* Cloudflare Image Transformations processor
|
|
48
|
-
*
|
|
49
|
-
* This processor doesn't actually transform images - it generates URLs
|
|
50
|
-
* that will be transformed by Cloudflare when requested.
|
|
51
|
-
*/
|
|
52
|
-
export declare class CloudflareTransformationsProcessor extends ImageProcessor {
|
|
53
|
-
private baseUrl;
|
|
54
|
-
private mediaPath;
|
|
55
|
-
private defaultFormat;
|
|
56
|
-
private defaultQuality;
|
|
57
|
-
private autoFormat;
|
|
58
|
-
constructor(config: CloudflareTransformationsConfig);
|
|
59
|
-
processImage(file: File, metadata: {
|
|
60
|
-
id: string;
|
|
61
|
-
filename: string;
|
|
62
|
-
path: string;
|
|
63
|
-
}): Promise<ProcessedImage>;
|
|
64
|
-
/**
|
|
65
|
-
* Build a Cloudflare Image Transformations URL
|
|
66
|
-
*/
|
|
67
|
-
private buildTransformationUrl;
|
|
68
|
-
/**
|
|
69
|
-
* Get the URL for a specific variant
|
|
70
|
-
*/
|
|
71
|
-
getImageUrl(imageId: string, variantName?: string): string;
|
|
72
|
-
/**
|
|
73
|
-
* Delete image - no-op since transformations don't store anything
|
|
74
|
-
*/
|
|
75
|
-
deleteImage(imageId: string): Promise<void>;
|
|
76
|
-
/**
|
|
77
|
-
* Health check - verify base URL is accessible
|
|
78
|
-
*/
|
|
79
|
-
healthCheck(): Promise<boolean>;
|
|
80
|
-
}
|
|
81
|
-
//# sourceMappingURL=cloudflare-transformations.d.ts.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"cloudflare-transformations.d.ts","sourceRoot":"","sources":["../../../../src/core/media/processors/cloudflare-transformations.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;GAeG;AAEH,OAAO,EAAE,cAAc,EAAE,MAAM,YAAY,CAAA;AAC3C,OAAO,KAAK,EAAE,oBAAoB,EAAgB,cAAc,EAAyB,MAAM,YAAY,CAAA;AAE3G,MAAM,WAAW,+BAAgC,SAAQ,oBAAoB;IAC3E,IAAI,EAAE,4BAA4B,CAAA;IAClC,OAAO,EAAE;QACP;;;WAGG;QACH,OAAO,EAAE,MAAM,CAAA;QAEf;;;WAGG;QACH,SAAS,CAAC,EAAE,MAAM,CAAA;QAElB;;WAEG;QACH,aAAa,CAAC,EAAE,MAAM,GAAG,MAAM,GAAG,MAAM,GAAG,KAAK,CAAA;QAEhD;;WAEG;QACH,cAAc,CAAC,EAAE,MAAM,CAAA;QAEvB;;WAEG;QACH,UAAU,CAAC,EAAE,OAAO,CAAA;KACrB,CAAA;CACF;AAED;;;;;GAKG;AACH,qBAAa,kCAAmC,SAAQ,cAAc;IACpE,OAAO,CAAC,OAAO,CAAQ;IACvB,OAAO,CAAC,SAAS,CAAQ;IACzB,OAAO,CAAC,aAAa,CAAQ;IAC7B,OAAO,CAAC,cAAc,CAAQ;IAC9B,OAAO,CAAC,UAAU,CAAS;gBAEf,MAAM,EAAE,+BAA+B;IAY7C,YAAY,CAChB,IAAI,EAAE,IAAI,EACV,QAAQ,EAAE;QAAE,EAAE,EAAE,MAAM,CAAC;QAAC,QAAQ,EAAE,MAAM,CAAC;QAAC,IAAI,EAAE,MAAM,CAAA;KAAE,GACvD,OAAO,CAAC,cAAc,CAAC;IAoC1B;;OAEG;IACH,OAAO,CAAC,sBAAsB;IA6C9B;;OAEG;IACI,WAAW,CAAC,OAAO,EAAE,MAAM,EAAE,WAAW,CAAC,EAAE,MAAM,GAAG,MAAM;IAgBjE;;OAEG;IACU,WAAW,CAAC,OAAO,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAKxD;;OAEG;IACU,WAAW,IAAI,OAAO,CAAC,OAAO,CAAC;CAQ7C"}
|
|
@@ -1,144 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* Cloudflare Image Transformations Processor
|
|
3
|
-
*
|
|
4
|
-
* Uses Cloudflare's Image Transformations feature to transform images on-the-fly
|
|
5
|
-
* via URL parameters. Works with images stored in R2 and served through Cloudflare.
|
|
6
|
-
*
|
|
7
|
-
* Unlike Cloudflare Images, this doesn't require a separate service or storage.
|
|
8
|
-
* Images are stored in R2 and transformed when requested via URL parameters.
|
|
9
|
-
*
|
|
10
|
-
* Example URLs:
|
|
11
|
-
* - Original: https://example.com/media/image.jpg
|
|
12
|
-
* - Thumbnail: https://example.com/media/image.jpg?width=300&height=300&fit=crop&format=webp
|
|
13
|
-
* - Medium: https://example.com/media/image.jpg?width=800&height=600&fit=crop&format=webp
|
|
14
|
-
*
|
|
15
|
-
* Documentation: https://developers.cloudflare.com/images/image-resizing/
|
|
16
|
-
*/
|
|
17
|
-
import { ImageProcessor } from './types.js';
|
|
18
|
-
/**
|
|
19
|
-
* Cloudflare Image Transformations processor
|
|
20
|
-
*
|
|
21
|
-
* This processor doesn't actually transform images - it generates URLs
|
|
22
|
-
* that will be transformed by Cloudflare when requested.
|
|
23
|
-
*/
|
|
24
|
-
export class CloudflareTransformationsProcessor extends ImageProcessor {
|
|
25
|
-
baseUrl;
|
|
26
|
-
mediaPath;
|
|
27
|
-
defaultFormat;
|
|
28
|
-
defaultQuality;
|
|
29
|
-
autoFormat;
|
|
30
|
-
constructor(config) {
|
|
31
|
-
super(config);
|
|
32
|
-
const { baseUrl, mediaPath, defaultFormat, defaultQuality, autoFormat } = config.options;
|
|
33
|
-
this.baseUrl = baseUrl.replace(/\/$/, ''); // Remove trailing slash
|
|
34
|
-
this.mediaPath = mediaPath || '/media';
|
|
35
|
-
this.defaultFormat = defaultFormat || 'webp';
|
|
36
|
-
this.defaultQuality = defaultQuality || 85;
|
|
37
|
-
this.autoFormat = autoFormat !== false; // Default to true
|
|
38
|
-
}
|
|
39
|
-
async processImage(file, metadata) {
|
|
40
|
-
// For transformations, we don't process the image physically
|
|
41
|
-
// We just generate URLs that will be transformed on-the-fly
|
|
42
|
-
const buffer = await file.arrayBuffer();
|
|
43
|
-
const baseImageUrl = `${this.baseUrl}${this.mediaPath}/${metadata.id}`;
|
|
44
|
-
// Original variant (no transformations)
|
|
45
|
-
const original = {
|
|
46
|
-
url: baseImageUrl,
|
|
47
|
-
width: 0, // Unknown until first request
|
|
48
|
-
height: 0,
|
|
49
|
-
format: file.type.split('/')[1] || 'jpeg',
|
|
50
|
-
size: file.size,
|
|
51
|
-
buffer: Buffer.from(buffer)
|
|
52
|
-
};
|
|
53
|
-
// Generate transformation URLs for each variant
|
|
54
|
-
const variants = {};
|
|
55
|
-
for (const variant of this.config.variants || []) {
|
|
56
|
-
const transformationUrl = this.buildTransformationUrl(baseImageUrl, variant);
|
|
57
|
-
variants[variant.name] = {
|
|
58
|
-
url: transformationUrl,
|
|
59
|
-
width: variant.width || 0,
|
|
60
|
-
height: variant.height || 0,
|
|
61
|
-
format: variant.format || this.defaultFormat,
|
|
62
|
-
size: 0, // Unknown until transformation
|
|
63
|
-
buffer: null // Transformations don't have buffers
|
|
64
|
-
};
|
|
65
|
-
}
|
|
66
|
-
return { original, variants };
|
|
67
|
-
}
|
|
68
|
-
/**
|
|
69
|
-
* Build a Cloudflare Image Transformations URL
|
|
70
|
-
*/
|
|
71
|
-
buildTransformationUrl(baseUrl, variant) {
|
|
72
|
-
const params = new URLSearchParams();
|
|
73
|
-
// Dimensions
|
|
74
|
-
if (variant.width) {
|
|
75
|
-
params.set('width', variant.width.toString());
|
|
76
|
-
}
|
|
77
|
-
if (variant.height) {
|
|
78
|
-
params.set('height', variant.height.toString());
|
|
79
|
-
}
|
|
80
|
-
// Fit mode
|
|
81
|
-
if (variant.fit) {
|
|
82
|
-
// Map Trokky fit modes to Cloudflare fit modes
|
|
83
|
-
const fitMap = {
|
|
84
|
-
'cover': 'crop',
|
|
85
|
-
'contain': 'scale-down',
|
|
86
|
-
'fill': 'crop',
|
|
87
|
-
'inside': 'scale-down',
|
|
88
|
-
'outside': 'crop'
|
|
89
|
-
};
|
|
90
|
-
params.set('fit', fitMap[variant.fit] || variant.fit);
|
|
91
|
-
}
|
|
92
|
-
// Format
|
|
93
|
-
const format = variant.format || this.defaultFormat;
|
|
94
|
-
if (format !== 'jpeg') { // JPEG is default, no need to specify
|
|
95
|
-
params.set('format', format);
|
|
96
|
-
}
|
|
97
|
-
// Quality
|
|
98
|
-
const quality = variant.quality || this.defaultQuality;
|
|
99
|
-
if (quality !== 85) { // 85 is Cloudflare's default
|
|
100
|
-
params.set('quality', quality.toString());
|
|
101
|
-
}
|
|
102
|
-
// Auto format optimization
|
|
103
|
-
if (this.autoFormat) {
|
|
104
|
-
params.set('anim', 'false'); // Disable animation for better compression
|
|
105
|
-
}
|
|
106
|
-
const queryString = params.toString();
|
|
107
|
-
return queryString ? `${baseUrl}?${queryString}` : baseUrl;
|
|
108
|
-
}
|
|
109
|
-
/**
|
|
110
|
-
* Get the URL for a specific variant
|
|
111
|
-
*/
|
|
112
|
-
getImageUrl(imageId, variantName) {
|
|
113
|
-
const baseImageUrl = `${this.baseUrl}${this.mediaPath}/${imageId}`;
|
|
114
|
-
if (!variantName || variantName === 'original') {
|
|
115
|
-
return baseImageUrl;
|
|
116
|
-
}
|
|
117
|
-
// Find the variant configuration
|
|
118
|
-
const variant = this.config.variants?.find(v => v.name === variantName);
|
|
119
|
-
if (!variant) {
|
|
120
|
-
return baseImageUrl;
|
|
121
|
-
}
|
|
122
|
-
return this.buildTransformationUrl(baseImageUrl, variant);
|
|
123
|
-
}
|
|
124
|
-
/**
|
|
125
|
-
* Delete image - no-op since transformations don't store anything
|
|
126
|
-
*/
|
|
127
|
-
async deleteImage(imageId) {
|
|
128
|
-
// No-op - transformations don't store images
|
|
129
|
-
// The original will be deleted from R2 by the media adapter
|
|
130
|
-
}
|
|
131
|
-
/**
|
|
132
|
-
* Health check - verify base URL is accessible
|
|
133
|
-
*/
|
|
134
|
-
async healthCheck() {
|
|
135
|
-
try {
|
|
136
|
-
const response = await fetch(this.baseUrl, { method: 'HEAD' });
|
|
137
|
-
return response.ok;
|
|
138
|
-
}
|
|
139
|
-
catch {
|
|
140
|
-
return false;
|
|
141
|
-
}
|
|
142
|
-
}
|
|
143
|
-
}
|
|
144
|
-
//# sourceMappingURL=cloudflare-transformations.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"cloudflare-transformations.js","sourceRoot":"","sources":["../../../../src/core/media/processors/cloudflare-transformations.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,112 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* Cloudflare Workers Images Processor
|
|
3
|
-
*
|
|
4
|
-
* Uses Cloudflare Workers' built-in image resizing to transform and store images.
|
|
5
|
-
* This is the recommended approach for Cloudflare Workers as it works seamlessly
|
|
6
|
-
* with R2 storage and doesn't require external API calls.
|
|
7
|
-
*
|
|
8
|
-
* How it works:
|
|
9
|
-
* 1. Fetch original image from R2
|
|
10
|
-
* 2. Use Workers fetch() with image resizing options
|
|
11
|
-
* 3. Store transformed variants back in R2
|
|
12
|
-
* 4. Return R2 URLs for all variants
|
|
13
|
-
*
|
|
14
|
-
* Requirements:
|
|
15
|
-
* - Cloudflare Workers with image resizing enabled
|
|
16
|
-
* - R2 bucket for storage
|
|
17
|
-
* - Your worker must serve images from a route
|
|
18
|
-
*
|
|
19
|
-
* Documentation: https://developers.cloudflare.com/images/image-resizing/resize-with-workers/
|
|
20
|
-
*/
|
|
21
|
-
import { ImageProcessor } from './types.js';
|
|
22
|
-
import type { ImageProcessorConfig, ProcessedImage } from './types.js';
|
|
23
|
-
export interface WorkersImagesConfig extends ImageProcessorConfig {
|
|
24
|
-
type: 'workers-images';
|
|
25
|
-
options: {
|
|
26
|
-
/**
|
|
27
|
-
* Base URL where your worker serves images
|
|
28
|
-
* Example: 'https://your-worker.workers.dev' or 'https://yourdomain.com'
|
|
29
|
-
*/
|
|
30
|
-
baseUrl: string;
|
|
31
|
-
/**
|
|
32
|
-
* Path prefix for media files
|
|
33
|
-
* Example: '/media'
|
|
34
|
-
*/
|
|
35
|
-
mediaPath?: string;
|
|
36
|
-
/**
|
|
37
|
-
* Whether to store variants with a flat structure
|
|
38
|
-
* true: /media/[id]-thumbnail.webp
|
|
39
|
-
* false: /media/[id]/thumbnail.webp
|
|
40
|
-
*/
|
|
41
|
-
flatStructure?: boolean;
|
|
42
|
-
/**
|
|
43
|
-
* Default format for variants
|
|
44
|
-
*/
|
|
45
|
-
defaultFormat?: 'webp' | 'avif' | 'jpeg' | 'png';
|
|
46
|
-
/**
|
|
47
|
-
* Default quality (1-100)
|
|
48
|
-
*/
|
|
49
|
-
defaultQuality?: number;
|
|
50
|
-
/**
|
|
51
|
-
* Whether to process variants immediately or on-demand
|
|
52
|
-
* immediate: Process and store all variants during upload
|
|
53
|
-
* on-demand: Generate variants when first requested
|
|
54
|
-
*/
|
|
55
|
-
processingMode?: 'immediate' | 'on-demand';
|
|
56
|
-
};
|
|
57
|
-
}
|
|
58
|
-
/**
|
|
59
|
-
* Workers Images processor using built-in Cloudflare Workers image resizing
|
|
60
|
-
*/
|
|
61
|
-
export declare class WorkersImagesProcessor extends ImageProcessor {
|
|
62
|
-
private baseUrl;
|
|
63
|
-
private mediaPath;
|
|
64
|
-
private flatStructure;
|
|
65
|
-
private defaultFormat;
|
|
66
|
-
private defaultQuality;
|
|
67
|
-
private processingMode;
|
|
68
|
-
private env?;
|
|
69
|
-
constructor(config: WorkersImagesConfig);
|
|
70
|
-
/**
|
|
71
|
-
* Set the Worker environment (includes R2 binding)
|
|
72
|
-
*/
|
|
73
|
-
setEnv(env: any): void;
|
|
74
|
-
processImage(file: File, metadata: {
|
|
75
|
-
id: string;
|
|
76
|
-
filename: string;
|
|
77
|
-
path: string;
|
|
78
|
-
}): Promise<ProcessedImage>;
|
|
79
|
-
/**
|
|
80
|
-
* Transform an image using Workers fetch with resizing options
|
|
81
|
-
*/
|
|
82
|
-
private transformImage;
|
|
83
|
-
/**
|
|
84
|
-
* Build resize options for Cloudflare Workers
|
|
85
|
-
*/
|
|
86
|
-
private buildResizeOptions;
|
|
87
|
-
/**
|
|
88
|
-
* Create an on-demand variant URL (transformation happens when accessed)
|
|
89
|
-
*/
|
|
90
|
-
private createOnDemandVariant;
|
|
91
|
-
/**
|
|
92
|
-
* Get the storage key for a variant
|
|
93
|
-
*/
|
|
94
|
-
private getVariantKey;
|
|
95
|
-
/**
|
|
96
|
-
* Store a variant in R2
|
|
97
|
-
*/
|
|
98
|
-
private storeVariant;
|
|
99
|
-
/**
|
|
100
|
-
* Get the URL for a specific variant
|
|
101
|
-
*/
|
|
102
|
-
getImageUrl(imageId: string, variantName?: string): string;
|
|
103
|
-
/**
|
|
104
|
-
* Delete image and all variants
|
|
105
|
-
*/
|
|
106
|
-
deleteImage(imageId: string): Promise<void>;
|
|
107
|
-
/**
|
|
108
|
-
* Health check
|
|
109
|
-
*/
|
|
110
|
-
healthCheck(): Promise<boolean>;
|
|
111
|
-
}
|
|
112
|
-
//# sourceMappingURL=workers-images.d.ts.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"workers-images.d.ts","sourceRoot":"","sources":["../../../../src/core/media/processors/workers-images.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;GAmBG;AAEH,OAAO,EAAE,cAAc,EAAE,MAAM,YAAY,CAAA;AAC3C,OAAO,KAAK,EAAE,oBAAoB,EAAgB,cAAc,EAAyB,MAAM,YAAY,CAAA;AAK3G,MAAM,WAAW,mBAAoB,SAAQ,oBAAoB;IAC/D,IAAI,EAAE,gBAAgB,CAAA;IACtB,OAAO,EAAE;QACP;;;WAGG;QACH,OAAO,EAAE,MAAM,CAAA;QAEf;;;WAGG;QACH,SAAS,CAAC,EAAE,MAAM,CAAA;QAElB;;;;WAIG;QACH,aAAa,CAAC,EAAE,OAAO,CAAA;QAEvB;;WAEG;QACH,aAAa,CAAC,EAAE,MAAM,GAAG,MAAM,GAAG,MAAM,GAAG,KAAK,CAAA;QAEhD;;WAEG;QACH,cAAc,CAAC,EAAE,MAAM,CAAA;QAEvB;;;;WAIG;QACH,cAAc,CAAC,EAAE,WAAW,GAAG,WAAW,CAAA;KAC3C,CAAA;CACF;AAED;;GAEG;AACH,qBAAa,sBAAuB,SAAQ,cAAc;IACxD,OAAO,CAAC,OAAO,CAAQ;IACvB,OAAO,CAAC,SAAS,CAAQ;IACzB,OAAO,CAAC,aAAa,CAAS;IAC9B,OAAO,CAAC,aAAa,CAAQ;IAC7B,OAAO,CAAC,cAAc,CAAQ;IAC9B,OAAO,CAAC,cAAc,CAA2B;IACjD,OAAO,CAAC,GAAG,CAAC,CAAK;gBAEL,MAAM,EAAE,mBAAmB;IAoBvC;;OAEG;IACH,MAAM,CAAC,GAAG,EAAE,GAAG,GAAG,IAAI;IAIhB,YAAY,CAChB,IAAI,EAAE,IAAI,EACV,QAAQ,EAAE;QAAE,EAAE,EAAE,MAAM,CAAC;QAAC,QAAQ,EAAE,MAAM,CAAC;QAAC,IAAI,EAAE,MAAM,CAAA;KAAE,GACvD,OAAO,CAAC,cAAc,CAAC;IAyC1B;;OAEG;YACW,cAAc;IAgD5B;;OAEG;IACH,OAAO,CAAC,kBAAkB;IAgC1B;;OAEG;IACH,OAAO,CAAC,qBAAqB;IAqB7B;;OAEG;IACH,OAAO,CAAC,aAAa;IASrB;;OAEG;YACW,YAAY;IAwB1B;;OAEG;IACI,WAAW,CAAC,OAAO,EAAE,MAAM,EAAE,WAAW,CAAC,EAAE,MAAM,GAAG,MAAM;IAqBjE;;OAEG;IACU,WAAW,CAAC,OAAO,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAmBxD;;OAEG;IACU,WAAW,IAAI,OAAO,CAAC,OAAO,CAAC;CAG7C"}
|
|
@@ -1,257 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* Cloudflare Workers Images Processor
|
|
3
|
-
*
|
|
4
|
-
* Uses Cloudflare Workers' built-in image resizing to transform and store images.
|
|
5
|
-
* This is the recommended approach for Cloudflare Workers as it works seamlessly
|
|
6
|
-
* with R2 storage and doesn't require external API calls.
|
|
7
|
-
*
|
|
8
|
-
* How it works:
|
|
9
|
-
* 1. Fetch original image from R2
|
|
10
|
-
* 2. Use Workers fetch() with image resizing options
|
|
11
|
-
* 3. Store transformed variants back in R2
|
|
12
|
-
* 4. Return R2 URLs for all variants
|
|
13
|
-
*
|
|
14
|
-
* Requirements:
|
|
15
|
-
* - Cloudflare Workers with image resizing enabled
|
|
16
|
-
* - R2 bucket for storage
|
|
17
|
-
* - Your worker must serve images from a route
|
|
18
|
-
*
|
|
19
|
-
* Documentation: https://developers.cloudflare.com/images/image-resizing/resize-with-workers/
|
|
20
|
-
*/
|
|
21
|
-
import { ImageProcessor } from './types.js';
|
|
22
|
-
import { createLogger } from '../../utils/logger.js';
|
|
23
|
-
const logger = createLogger('media', 'WorkersImages');
|
|
24
|
-
/**
|
|
25
|
-
* Workers Images processor using built-in Cloudflare Workers image resizing
|
|
26
|
-
*/
|
|
27
|
-
export class WorkersImagesProcessor extends ImageProcessor {
|
|
28
|
-
baseUrl;
|
|
29
|
-
mediaPath;
|
|
30
|
-
flatStructure;
|
|
31
|
-
defaultFormat;
|
|
32
|
-
defaultQuality;
|
|
33
|
-
processingMode;
|
|
34
|
-
env;
|
|
35
|
-
constructor(config) {
|
|
36
|
-
super(config);
|
|
37
|
-
const { baseUrl, mediaPath, flatStructure, defaultFormat, defaultQuality, processingMode } = config.options;
|
|
38
|
-
this.baseUrl = baseUrl.replace(/\/$/, ''); // Remove trailing slash
|
|
39
|
-
this.mediaPath = mediaPath || '/media';
|
|
40
|
-
this.flatStructure = flatStructure !== false; // Default to true
|
|
41
|
-
this.defaultFormat = defaultFormat || 'webp';
|
|
42
|
-
this.defaultQuality = defaultQuality || 85;
|
|
43
|
-
this.processingMode = processingMode || 'immediate';
|
|
44
|
-
}
|
|
45
|
-
/**
|
|
46
|
-
* Set the Worker environment (includes R2 binding)
|
|
47
|
-
*/
|
|
48
|
-
setEnv(env) {
|
|
49
|
-
this.env = env;
|
|
50
|
-
}
|
|
51
|
-
async processImage(file, metadata) {
|
|
52
|
-
const buffer = await file.arrayBuffer();
|
|
53
|
-
const variants = {};
|
|
54
|
-
// Original image info - use the /file endpoint
|
|
55
|
-
const original = {
|
|
56
|
-
url: `${this.baseUrl}${this.mediaPath}/${metadata.id}/file`,
|
|
57
|
-
width: 0,
|
|
58
|
-
height: 0,
|
|
59
|
-
format: file.type.split('/')[1] || 'jpeg',
|
|
60
|
-
size: file.size,
|
|
61
|
-
buffer: Buffer.from(buffer)
|
|
62
|
-
};
|
|
63
|
-
if (this.processingMode === 'immediate') {
|
|
64
|
-
// Process all variants immediately
|
|
65
|
-
for (const variant of this.config.variants || []) {
|
|
66
|
-
try {
|
|
67
|
-
const transformedData = await this.transformImage(metadata.id, buffer, variant);
|
|
68
|
-
variants[variant.name] = transformedData;
|
|
69
|
-
}
|
|
70
|
-
catch (error) {
|
|
71
|
-
logger.error('Failed to process variant', { variantName: variant.name, error });
|
|
72
|
-
// Create a URL-only variant as fallback
|
|
73
|
-
variants[variant.name] = this.createOnDemandVariant(metadata.id, variant);
|
|
74
|
-
}
|
|
75
|
-
}
|
|
76
|
-
}
|
|
77
|
-
else {
|
|
78
|
-
// Create on-demand URLs for all variants
|
|
79
|
-
for (const variant of this.config.variants || []) {
|
|
80
|
-
variants[variant.name] = this.createOnDemandVariant(metadata.id, variant);
|
|
81
|
-
}
|
|
82
|
-
}
|
|
83
|
-
return { original, variants };
|
|
84
|
-
}
|
|
85
|
-
/**
|
|
86
|
-
* Transform an image using Workers fetch with resizing options
|
|
87
|
-
*/
|
|
88
|
-
async transformImage(imageId, imageBuffer, variant) {
|
|
89
|
-
// Build the resize options for Cloudflare Workers
|
|
90
|
-
const resizeOptions = this.buildResizeOptions(variant);
|
|
91
|
-
// Construct the URL with transformation parameters
|
|
92
|
-
// Use the /file endpoint to get the actual file content
|
|
93
|
-
const originalUrl = `${this.baseUrl}${this.mediaPath}/${imageId}/file`;
|
|
94
|
-
const variantUrl = `${originalUrl}?${new URLSearchParams(resizeOptions).toString()}`;
|
|
95
|
-
try {
|
|
96
|
-
// Use Workers fetch with cf.image options
|
|
97
|
-
// @ts-ignore - cf property is Cloudflare-specific
|
|
98
|
-
const response = await fetch(originalUrl, {
|
|
99
|
-
cf: {
|
|
100
|
-
image: resizeOptions
|
|
101
|
-
}
|
|
102
|
-
});
|
|
103
|
-
if (!response.ok) {
|
|
104
|
-
throw new Error(`Image transformation failed: ${response.status}`);
|
|
105
|
-
}
|
|
106
|
-
const transformedBuffer = await response.arrayBuffer();
|
|
107
|
-
// Store the variant if we have R2 access
|
|
108
|
-
if (this.env?.R2) {
|
|
109
|
-
const variantKey = this.getVariantKey(imageId, variant.name);
|
|
110
|
-
await this.storeVariant(variantKey, Buffer.from(transformedBuffer), variant);
|
|
111
|
-
}
|
|
112
|
-
return {
|
|
113
|
-
url: variantUrl,
|
|
114
|
-
width: variant.width || 0,
|
|
115
|
-
height: variant.height || 0,
|
|
116
|
-
format: variant.format || this.defaultFormat,
|
|
117
|
-
size: transformedBuffer.byteLength,
|
|
118
|
-
buffer: Buffer.from(transformedBuffer)
|
|
119
|
-
};
|
|
120
|
-
}
|
|
121
|
-
catch (error) {
|
|
122
|
-
logger.error('Transformation failed, using on-demand URL', error);
|
|
123
|
-
return this.createOnDemandVariant(imageId, variant);
|
|
124
|
-
}
|
|
125
|
-
}
|
|
126
|
-
/**
|
|
127
|
-
* Build resize options for Cloudflare Workers
|
|
128
|
-
*/
|
|
129
|
-
buildResizeOptions(variant) {
|
|
130
|
-
const options = {};
|
|
131
|
-
// Dimensions
|
|
132
|
-
if (variant.width) {
|
|
133
|
-
options.width = variant.width;
|
|
134
|
-
}
|
|
135
|
-
if (variant.height) {
|
|
136
|
-
options.height = variant.height;
|
|
137
|
-
}
|
|
138
|
-
// Fit mode
|
|
139
|
-
if (variant.fit) {
|
|
140
|
-
const fitMap = {
|
|
141
|
-
'cover': 'cover',
|
|
142
|
-
'contain': 'contain',
|
|
143
|
-
'fill': 'scale-down',
|
|
144
|
-
'inside': 'pad',
|
|
145
|
-
'outside': 'crop'
|
|
146
|
-
};
|
|
147
|
-
options.fit = fitMap[variant.fit] || variant.fit;
|
|
148
|
-
}
|
|
149
|
-
// Format
|
|
150
|
-
options.format = variant.format || this.defaultFormat;
|
|
151
|
-
// Quality
|
|
152
|
-
options.quality = variant.quality || this.defaultQuality;
|
|
153
|
-
return options;
|
|
154
|
-
}
|
|
155
|
-
/**
|
|
156
|
-
* Create an on-demand variant URL (transformation happens when accessed)
|
|
157
|
-
*/
|
|
158
|
-
createOnDemandVariant(imageId, variant) {
|
|
159
|
-
const params = new URLSearchParams();
|
|
160
|
-
if (variant.width)
|
|
161
|
-
params.set('width', variant.width.toString());
|
|
162
|
-
if (variant.height)
|
|
163
|
-
params.set('height', variant.height.toString());
|
|
164
|
-
if (variant.fit)
|
|
165
|
-
params.set('fit', variant.fit);
|
|
166
|
-
params.set('format', variant.format || this.defaultFormat);
|
|
167
|
-
params.set('quality', (variant.quality || this.defaultQuality).toString());
|
|
168
|
-
const variantUrl = `${this.baseUrl}${this.mediaPath}/${imageId}?${params.toString()}`;
|
|
169
|
-
return {
|
|
170
|
-
url: variantUrl,
|
|
171
|
-
width: variant.width || 0,
|
|
172
|
-
height: variant.height || 0,
|
|
173
|
-
format: variant.format || this.defaultFormat,
|
|
174
|
-
size: 0, // Unknown until transformed
|
|
175
|
-
buffer: null // No buffer for on-demand variants
|
|
176
|
-
};
|
|
177
|
-
}
|
|
178
|
-
/**
|
|
179
|
-
* Get the storage key for a variant
|
|
180
|
-
*/
|
|
181
|
-
getVariantKey(imageId, variantName) {
|
|
182
|
-
const format = this.defaultFormat;
|
|
183
|
-
if (this.flatStructure) {
|
|
184
|
-
return `${imageId}-${variantName}.${format}`;
|
|
185
|
-
}
|
|
186
|
-
else {
|
|
187
|
-
return `${imageId}/${variantName}.${format}`;
|
|
188
|
-
}
|
|
189
|
-
}
|
|
190
|
-
/**
|
|
191
|
-
* Store a variant in R2
|
|
192
|
-
*/
|
|
193
|
-
async storeVariant(key, buffer, variant) {
|
|
194
|
-
if (!this.env?.R2) {
|
|
195
|
-
return;
|
|
196
|
-
}
|
|
197
|
-
const fullKey = `${this.mediaPath}/${key}`.replace(/^\//, '');
|
|
198
|
-
const contentType = `image/${variant.format || this.defaultFormat}`;
|
|
199
|
-
try {
|
|
200
|
-
await this.env.R2.put(fullKey, buffer, {
|
|
201
|
-
httpMetadata: {
|
|
202
|
-
contentType,
|
|
203
|
-
cacheControl: 'public, max-age=31536000' // 1 year cache
|
|
204
|
-
}
|
|
205
|
-
});
|
|
206
|
-
}
|
|
207
|
-
catch (error) {
|
|
208
|
-
logger.error('Failed to store variant', { key, error });
|
|
209
|
-
}
|
|
210
|
-
}
|
|
211
|
-
/**
|
|
212
|
-
* Get the URL for a specific variant
|
|
213
|
-
*/
|
|
214
|
-
getImageUrl(imageId, variantName) {
|
|
215
|
-
if (!variantName || variantName === 'original') {
|
|
216
|
-
return `${this.baseUrl}${this.mediaPath}/${imageId}/file`;
|
|
217
|
-
}
|
|
218
|
-
// Find the variant configuration
|
|
219
|
-
const variant = this.config.variants?.find(v => v.name === variantName);
|
|
220
|
-
if (!variant) {
|
|
221
|
-
return `${this.baseUrl}${this.mediaPath}/${imageId}`;
|
|
222
|
-
}
|
|
223
|
-
// For immediate processing, return the stored variant URL
|
|
224
|
-
if (this.processingMode === 'immediate') {
|
|
225
|
-
const variantKey = this.getVariantKey(imageId, variantName);
|
|
226
|
-
return `${this.baseUrl}${this.mediaPath}/${variantKey}`;
|
|
227
|
-
}
|
|
228
|
-
// For on-demand, return URL with transformation parameters
|
|
229
|
-
return this.createOnDemandVariant(imageId, variant).url;
|
|
230
|
-
}
|
|
231
|
-
/**
|
|
232
|
-
* Delete image and all variants
|
|
233
|
-
*/
|
|
234
|
-
async deleteImage(imageId) {
|
|
235
|
-
if (!this.env?.R2) {
|
|
236
|
-
return;
|
|
237
|
-
}
|
|
238
|
-
// Delete original
|
|
239
|
-
const originalKey = `${this.mediaPath}/${imageId}`.replace(/^\//, '');
|
|
240
|
-
await this.env.R2.delete(originalKey);
|
|
241
|
-
// Delete all stored variants
|
|
242
|
-
if (this.processingMode === 'immediate') {
|
|
243
|
-
for (const variant of this.config.variants || []) {
|
|
244
|
-
const variantKey = this.getVariantKey(imageId, variant.name);
|
|
245
|
-
const fullKey = `${this.mediaPath}/${variantKey}`.replace(/^\//, '');
|
|
246
|
-
await this.env.R2.delete(fullKey);
|
|
247
|
-
}
|
|
248
|
-
}
|
|
249
|
-
}
|
|
250
|
-
/**
|
|
251
|
-
* Health check
|
|
252
|
-
*/
|
|
253
|
-
async healthCheck() {
|
|
254
|
-
return true;
|
|
255
|
-
}
|
|
256
|
-
}
|
|
257
|
-
//# sourceMappingURL=workers-images.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"workers-images.js","sourceRoot":"","sources":["../../../../src/core/media/processors/workers-images.ts"],"names":[],"mappings":"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"}
|