@trokky/trokky 3.1.0 → 3.3.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.
Files changed (114) hide show
  1. package/dist/adapters/cloudflare-d1/cloudflare-d1-adapter.d.ts +140 -0
  2. package/dist/adapters/cloudflare-d1/cloudflare-d1-adapter.d.ts.map +1 -0
  3. package/dist/adapters/cloudflare-d1/cloudflare-d1-adapter.js +853 -0
  4. package/dist/adapters/cloudflare-d1/cloudflare-d1-adapter.js.map +1 -0
  5. package/dist/adapters/cloudflare-d1/index.d.ts +5 -0
  6. package/dist/adapters/cloudflare-d1/index.d.ts.map +1 -0
  7. package/dist/adapters/cloudflare-d1/index.js +12 -0
  8. package/dist/adapters/cloudflare-d1/index.js.map +1 -0
  9. package/dist/adapters/cloudflare-d1/rate-limit-store.d.ts +46 -0
  10. package/dist/adapters/cloudflare-d1/rate-limit-store.d.ts.map +1 -0
  11. package/dist/adapters/cloudflare-d1/rate-limit-store.js +96 -0
  12. package/dist/adapters/cloudflare-d1/rate-limit-store.js.map +1 -0
  13. package/dist/adapters/cloudflare-d1/types.d.ts +69 -0
  14. package/dist/adapters/cloudflare-d1/types.d.ts.map +1 -0
  15. package/dist/adapters/cloudflare-d1/types.js +2 -0
  16. package/dist/adapters/cloudflare-d1/types.js.map +1 -0
  17. package/dist/adapters/cloudflare-r2/cloudflare-r2-adapter.d.ts +86 -0
  18. package/dist/adapters/cloudflare-r2/cloudflare-r2-adapter.d.ts.map +1 -0
  19. package/dist/adapters/cloudflare-r2/cloudflare-r2-adapter.js +493 -0
  20. package/dist/adapters/cloudflare-r2/cloudflare-r2-adapter.js.map +1 -0
  21. package/dist/adapters/cloudflare-r2/index.d.ts +3 -0
  22. package/dist/adapters/cloudflare-r2/index.d.ts.map +1 -0
  23. package/dist/adapters/cloudflare-r2/index.js +11 -0
  24. package/dist/adapters/cloudflare-r2/index.js.map +1 -0
  25. package/dist/adapters/cloudflare-r2/types.d.ts +43 -0
  26. package/dist/adapters/cloudflare-r2/types.d.ts.map +1 -0
  27. package/dist/adapters/cloudflare-r2/types.js +2 -0
  28. package/dist/adapters/cloudflare-r2/types.js.map +1 -0
  29. package/dist/adapters/filesystem-data/filesystem-data-adapter.d.ts +9 -0
  30. package/dist/adapters/filesystem-data/filesystem-data-adapter.d.ts.map +1 -1
  31. package/dist/adapters/filesystem-data/filesystem-data-adapter.js +28 -0
  32. package/dist/adapters/filesystem-data/filesystem-data-adapter.js.map +1 -1
  33. package/dist/adapters/postgres-data/postgres-data-adapter.d.ts +9 -0
  34. package/dist/adapters/postgres-data/postgres-data-adapter.d.ts.map +1 -1
  35. package/dist/adapters/postgres-data/postgres-data-adapter.js +59 -0
  36. package/dist/adapters/postgres-data/postgres-data-adapter.js.map +1 -1
  37. package/dist/core/core/engine.d.ts +10 -0
  38. package/dist/core/core/engine.d.ts.map +1 -1
  39. package/dist/core/core/engine.js +16 -2
  40. package/dist/core/core/engine.js.map +1 -1
  41. package/dist/core/media/image-processor.d.ts.map +1 -1
  42. package/dist/core/media/image-processor.js +5 -13
  43. package/dist/core/media/image-processor.js.map +1 -1
  44. package/dist/core/media/processors/sharp.d.ts.map +1 -1
  45. package/dist/core/media/processors/sharp.js +13 -2
  46. package/dist/core/media/processors/sharp.js.map +1 -1
  47. package/dist/core/media/processors/types.d.ts +1 -1
  48. package/dist/core/media/processors/types.d.ts.map +1 -1
  49. package/dist/core/security/rate-limit-store.d.ts +56 -0
  50. package/dist/core/security/rate-limit-store.d.ts.map +1 -0
  51. package/dist/core/security/rate-limit-store.js +55 -0
  52. package/dist/core/security/rate-limit-store.js.map +1 -0
  53. package/dist/core/security/rate-limiter.d.ts +39 -2
  54. package/dist/core/security/rate-limiter.d.ts.map +1 -1
  55. package/dist/core/security/rate-limiter.js +52 -20
  56. package/dist/core/security/rate-limiter.js.map +1 -1
  57. package/dist/core/services/media-service.d.ts +34 -0
  58. package/dist/core/services/media-service.d.ts.map +1 -1
  59. package/dist/core/services/media-service.js +172 -120
  60. package/dist/core/services/media-service.js.map +1 -1
  61. package/dist/core/services/user-service.d.ts +42 -0
  62. package/dist/core/services/user-service.d.ts.map +1 -1
  63. package/dist/core/services/user-service.js +114 -1
  64. package/dist/core/services/user-service.js.map +1 -1
  65. package/dist/core/types/storage-adapters.d.ts +18 -0
  66. package/dist/core/types/storage-adapters.d.ts.map +1 -1
  67. package/dist/core/utils/retry.d.ts +45 -0
  68. package/dist/core/utils/retry.d.ts.map +1 -0
  69. package/dist/core/utils/retry.js +47 -0
  70. package/dist/core/utils/retry.js.map +1 -0
  71. package/dist/i18n/config.d.ts +32 -0
  72. package/dist/i18n/config.d.ts.map +1 -1
  73. package/dist/i18n/locales/en/auth.json +16 -0
  74. package/dist/i18n/locales/fr/auth.json +16 -0
  75. package/dist/integrations/workers/adapter.d.ts +28 -0
  76. package/dist/integrations/workers/adapter.d.ts.map +1 -0
  77. package/dist/integrations/workers/adapter.js +111 -0
  78. package/dist/integrations/workers/adapter.js.map +1 -0
  79. package/dist/integrations/workers/index.d.ts +22 -0
  80. package/dist/integrations/workers/index.d.ts.map +1 -0
  81. package/dist/integrations/workers/index.js +60 -0
  82. package/dist/integrations/workers/index.js.map +1 -0
  83. package/dist/routes/auth/auth-flow-store.d.ts +17 -0
  84. package/dist/routes/auth/auth-flow-store.d.ts.map +1 -1
  85. package/dist/routes/auth/auth-flow-store.js +27 -0
  86. package/dist/routes/auth/auth-flow-store.js.map +1 -1
  87. package/dist/routes/auth/oauth.d.ts.map +1 -1
  88. package/dist/routes/auth/oauth.js +5 -12
  89. package/dist/routes/auth/oauth.js.map +1 -1
  90. package/dist/routes/auth/passkey.d.ts.map +1 -1
  91. package/dist/routes/auth/passkey.js +5 -8
  92. package/dist/routes/auth/passkey.js.map +1 -1
  93. package/dist/routes/handlers/auth.d.ts +14 -0
  94. package/dist/routes/handlers/auth.d.ts.map +1 -1
  95. package/dist/routes/handlers/auth.js +55 -0
  96. package/dist/routes/handlers/auth.js.map +1 -1
  97. package/dist/structure/validation/schemas.d.ts +60 -60
  98. package/package.json +20 -1
  99. package/dist/core/media/processors/cloudflare-images.d.ts +0 -83
  100. package/dist/core/media/processors/cloudflare-images.d.ts.map +0 -1
  101. package/dist/core/media/processors/cloudflare-images.js +0 -241
  102. package/dist/core/media/processors/cloudflare-images.js.map +0 -1
  103. package/dist/core/media/processors/cloudflare-transform-store.d.ts +0 -127
  104. package/dist/core/media/processors/cloudflare-transform-store.d.ts.map +0 -1
  105. package/dist/core/media/processors/cloudflare-transform-store.js +0 -237
  106. package/dist/core/media/processors/cloudflare-transform-store.js.map +0 -1
  107. package/dist/core/media/processors/cloudflare-transformations.d.ts +0 -81
  108. package/dist/core/media/processors/cloudflare-transformations.d.ts.map +0 -1
  109. package/dist/core/media/processors/cloudflare-transformations.js +0 -144
  110. package/dist/core/media/processors/cloudflare-transformations.js.map +0 -1
  111. package/dist/core/media/processors/workers-images.d.ts +0 -112
  112. package/dist/core/media/processors/workers-images.d.ts.map +0 -1
  113. package/dist/core/media/processors/workers-images.js +0 -257
  114. 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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"}