From c91a82acd61a6d39326740127ac93335851d489c Mon Sep 17 00:00:00 2001 From: Arka Mondal Date: Mon, 13 Jul 2026 13:42:17 +0100 Subject: [PATCH 1/3] Add metadata filtering to the Images binding hosted.list() --- src/cloudflare/internal/images.d.ts | 20 ++++++ .../internal/test/images/images-api-test.js | 21 ++++++ .../test/images/images-upstream-mock.js | 65 ++++++++++++++++++- types/defines/images.d.ts | 20 ++++++ .../experimental/index.d.ts | 17 +++++ .../generated-snapshot/experimental/index.ts | 17 +++++ types/generated-snapshot/index.d.ts | 17 +++++ types/generated-snapshot/index.ts | 17 +++++ 8 files changed, 191 insertions(+), 3 deletions(-) diff --git a/src/cloudflare/internal/images.d.ts b/src/cloudflare/internal/images.d.ts index 280061e03e9..60bd4570a81 100644 --- a/src/cloudflare/internal/images.d.ts +++ b/src/cloudflare/internal/images.d.ts @@ -140,11 +140,31 @@ interface ImageUpdateOptions { creator?: string; } +type ImageMetadataFilterOperators = { + eq?: string | number | boolean; + in?: string[] | number[]; + gt?: number; + gte?: number; + lt?: number; + lte?: number; +}; + +type ImageMetadataFilterValue = + | string + | number + | boolean + | ImageMetadataFilterOperators; + +interface ImageListFilter { + metadata?: Record; +} + interface ImageListOptions { limit?: number; cursor?: string; sortOrder?: 'asc' | 'desc'; creator?: string; + filter?: ImageListFilter; } interface ImageList { diff --git a/src/cloudflare/internal/test/images/images-api-test.js b/src/cloudflare/internal/test/images/images-api-test.js index 00e9de64de2..37fe736fcd6 100644 --- a/src/cloudflare/internal/test/images/images-api-test.js +++ b/src/cloudflare/internal/test/images/images-api-test.js @@ -645,6 +645,27 @@ export const test_images_list_with_options = { }, }; +export const test_images_list_metadata_filter_forwards_correctly = { + /** + * @param {unknown} _ + * @param {Env} env + */ + async test(_, env) { + const result = await env.images.hosted.list({ + filter: { + metadata: { + status: 'active', + priority: { gte: 1, lte: 3 }, + 'config.region': 'eu-west', + }, + }, + }); + + assert.equal(result.images.length, 1); + assert.equal(result.images[0].id, 'image-1'); + }, +}; + // UPLOAD with base64 encoding export const test_images_upload_base64_stream = { /** diff --git a/src/cloudflare/internal/test/images/images-upstream-mock.js b/src/cloudflare/internal/test/images/images-upstream-mock.js index 3b7c65597c4..c08388909a0 100644 --- a/src/cloudflare/internal/test/images/images-upstream-mock.js +++ b/src/cloudflare/internal/test/images/images-upstream-mock.js @@ -20,6 +20,57 @@ async function imageAsString(blob) { return blob.text(); } +function resolveMetaPath(obj, path) { + return path + .split('.') + .reduce( + (acc, key) => (acc && typeof acc === 'object' ? acc[key] : undefined), + obj + ); +} + +function matchesCondition(actual, condition) { + if ( + condition === null || + typeof condition !== 'object' || + Array.isArray(condition) + ) { + return actual === condition; + } + + return Object.entries(condition).every(([op, expected]) => { + switch (op) { + case 'eq': + return actual === expected; + case 'in': + return ( + Array.isArray(expected) && + expected.some((candidate) => candidate === actual) + ); + case 'gt': + return typeof actual === 'number' && actual > expected; + case 'gte': + return typeof actual === 'number' && actual >= expected; + case 'lt': + return typeof actual === 'number' && actual < expected; + case 'lte': + return typeof actual === 'number' && actual <= expected; + default: + return false; + } + }); +} + +function matchesMetadataFilters(image, filters) { + if (!filters) { + return true; + } + + return Object.entries(filters).every(([field, condition]) => + matchesCondition(resolveMetaPath(image.meta ?? {}, field), condition) + ); +} + class ImageHandleMock extends RpcTarget { /** @type {string} */ #imageId; @@ -133,7 +184,7 @@ export class ServiceEntrypoint extends WorkerEntrypoint { uploaded: '2024-01-01T00:00:00Z', requireSignedURLs: false, variants: ['public'], - meta: {}, + meta: { status: 'active', priority: 1, config: { region: 'eu-west' } }, creator: 'test-creator', }, { @@ -142,13 +193,21 @@ export class ServiceEntrypoint extends WorkerEntrypoint { uploaded: '2024-01-02T00:00:00Z', requireSignedURLs: false, variants: ['public'], - meta: {}, + meta: { + status: 'archived', + priority: 5, + config: { region: 'us-east' }, + }, creator: 'test-creator', }, ]; + const filtered = images.filter((image) => + matchesMetadataFilters(image, options?.filter?.metadata) + ); + const limit = options?.limit || 50; - const slicedImages = images.slice(0, limit); + const slicedImages = filtered.slice(0, limit); return { images: slicedImages, diff --git a/types/defines/images.d.ts b/types/defines/images.d.ts index caf381f6afb..eb46d6622b9 100644 --- a/types/defines/images.d.ts +++ b/types/defines/images.d.ts @@ -137,11 +137,31 @@ interface ImageUpdateOptions { creator?: string; } +type ImageMetadataFilterOperators = { + eq?: string | number | boolean; + in?: string[] | number[]; + gt?: number; + gte?: number; + lt?: number; + lte?: number; +}; + +type ImageMetadataFilterValue = + | string + | number + | boolean + | ImageMetadataFilterOperators; + +interface ImageListFilter { + metadata?: Record; +} + interface ImageListOptions { limit?: number; cursor?: string; sortOrder?: 'asc' | 'desc'; creator?: string; + filter?: ImageListFilter; } interface ImageList { diff --git a/types/generated-snapshot/experimental/index.d.ts b/types/generated-snapshot/experimental/index.d.ts index 05c9f61bea5..a0ae6620476 100755 --- a/types/generated-snapshot/experimental/index.d.ts +++ b/types/generated-snapshot/experimental/index.d.ts @@ -14724,11 +14724,28 @@ interface ImageUpdateOptions { metadata?: Record; creator?: string; } +type ImageMetadataFilterOperators = { + eq?: string | number | boolean; + in?: string[] | number[]; + gt?: number; + gte?: number; + lt?: number; + lte?: number; +}; +type ImageMetadataFilterValue = + | string + | number + | boolean + | ImageMetadataFilterOperators; +interface ImageListFilter { + metadata?: Record; +} interface ImageListOptions { limit?: number; cursor?: string; sortOrder?: "asc" | "desc"; creator?: string; + filter?: ImageListFilter; } interface ImageList { images: ImageMetadata[]; diff --git a/types/generated-snapshot/experimental/index.ts b/types/generated-snapshot/experimental/index.ts index 92867d33f75..94099c8b64f 100755 --- a/types/generated-snapshot/experimental/index.ts +++ b/types/generated-snapshot/experimental/index.ts @@ -14751,11 +14751,28 @@ export interface ImageUpdateOptions { metadata?: Record; creator?: string; } +export type ImageMetadataFilterOperators = { + eq?: string | number | boolean; + in?: string[] | number[]; + gt?: number; + gte?: number; + lt?: number; + lte?: number; +}; +export type ImageMetadataFilterValue = + | string + | number + | boolean + | ImageMetadataFilterOperators; +export interface ImageListFilter { + metadata?: Record; +} export interface ImageListOptions { limit?: number; cursor?: string; sortOrder?: "asc" | "desc"; creator?: string; + filter?: ImageListFilter; } export interface ImageList { images: ImageMetadata[]; diff --git a/types/generated-snapshot/index.d.ts b/types/generated-snapshot/index.d.ts index 12246afaf8d..4bf8342070e 100755 --- a/types/generated-snapshot/index.d.ts +++ b/types/generated-snapshot/index.d.ts @@ -14076,11 +14076,28 @@ interface ImageUpdateOptions { metadata?: Record; creator?: string; } +type ImageMetadataFilterOperators = { + eq?: string | number | boolean; + in?: string[] | number[]; + gt?: number; + gte?: number; + lt?: number; + lte?: number; +}; +type ImageMetadataFilterValue = + | string + | number + | boolean + | ImageMetadataFilterOperators; +interface ImageListFilter { + metadata?: Record; +} interface ImageListOptions { limit?: number; cursor?: string; sortOrder?: "asc" | "desc"; creator?: string; + filter?: ImageListFilter; } interface ImageList { images: ImageMetadata[]; diff --git a/types/generated-snapshot/index.ts b/types/generated-snapshot/index.ts index 39357652538..c19972b94eb 100755 --- a/types/generated-snapshot/index.ts +++ b/types/generated-snapshot/index.ts @@ -14103,11 +14103,28 @@ export interface ImageUpdateOptions { metadata?: Record; creator?: string; } +export type ImageMetadataFilterOperators = { + eq?: string | number | boolean; + in?: string[] | number[]; + gt?: number; + gte?: number; + lt?: number; + lte?: number; +}; +export type ImageMetadataFilterValue = + | string + | number + | boolean + | ImageMetadataFilterOperators; +export interface ImageListFilter { + metadata?: Record; +} export interface ImageListOptions { limit?: number; cursor?: string; sortOrder?: "asc" | "desc"; creator?: string; + filter?: ImageListFilter; } export interface ImageList { images: ImageMetadata[]; From 2f6c6cec4763ac534f2777dcc4adcf53db9ead71 Mon Sep 17 00:00:00 2001 From: Arka Mondal Date: Mon, 13 Jul 2026 13:42:17 +0100 Subject: [PATCH 2/3] Add signedUrl to Images binding types --- src/cloudflare/internal/images.d.ts | 14 ++++++++++++++ .../internal/test/images/images-api-test.js | 17 +++++++++++++++++ .../test/images/images-upstream-mock.js | 4 ++++ types/defines/images.d.ts | 14 ++++++++++++++ .../generated-snapshot/experimental/index.d.ts | 12 ++++++++++++ types/generated-snapshot/experimental/index.ts | 12 ++++++++++++ types/generated-snapshot/index.d.ts | 12 ++++++++++++ types/generated-snapshot/index.ts | 12 ++++++++++++ 8 files changed, 97 insertions(+) diff --git a/src/cloudflare/internal/images.d.ts b/src/cloudflare/internal/images.d.ts index 60bd4570a81..4a492a7e4bf 100644 --- a/src/cloudflare/internal/images.d.ts +++ b/src/cloudflare/internal/images.d.ts @@ -167,6 +167,12 @@ interface ImageListOptions { filter?: ImageListFilter; } +interface ImageSignedUrlOptions { + variant: string; + expiresIn?: number; + keyName?: string; +} + interface ImageList { images: ImageMetadata[]; cursor?: string; @@ -186,6 +192,14 @@ interface ImageHandle { */ bytes(): Promise | null>; + /** + * Generate a signed delivery URL for this hosted image. + * @param options Signing configuration + * @returns A signed image delivery URL + * @throws {@link ImagesError} if signing fails + */ + signedUrl(options: ImageSignedUrlOptions): Promise; + /** * Update hosted image metadata * @param options Properties to update diff --git a/src/cloudflare/internal/test/images/images-api-test.js b/src/cloudflare/internal/test/images/images-api-test.js index 37fe736fcd6..eb751e78075 100644 --- a/src/cloudflare/internal/test/images/images-api-test.js +++ b/src/cloudflare/internal/test/images/images-api-test.js @@ -511,6 +511,23 @@ export const test_images_getImage_not_found = { }, }; +export const test_images_signed_url = { + /** + * @param {unknown} _ + * @param {Env} env + */ + async test(_, env) { + const url = await env.images.hosted + .image('test-image-id') + .signedUrl({ variant: 'private' }); + + assert.equal( + url, + 'https://imagedelivery.example/test-image-id/private?sig=mock-signature' + ); + }, +}; + // UPLOAD export const test_images_upload_with_options = { /** diff --git a/src/cloudflare/internal/test/images/images-upstream-mock.js b/src/cloudflare/internal/test/images/images-upstream-mock.js index c08388909a0..2895fdd2725 100644 --- a/src/cloudflare/internal/test/images/images-upstream-mock.js +++ b/src/cloudflare/internal/test/images/images-upstream-mock.js @@ -107,6 +107,10 @@ class ImageHandleMock extends RpcTarget { return new Blob([mockData]).stream(); } + async signedUrl(options) { + return `https://imagedelivery.example/${this.#imageId}/${options.variant}?sig=mock-signature`; + } + /** * @param {ImageUpdateOptions} body * @returns {Promise} diff --git a/types/defines/images.d.ts b/types/defines/images.d.ts index eb46d6622b9..c47ea4773ac 100644 --- a/types/defines/images.d.ts +++ b/types/defines/images.d.ts @@ -164,6 +164,12 @@ interface ImageListOptions { filter?: ImageListFilter; } +interface ImageSignedUrlOptions { + variant: string; + expiresIn?: number; + keyName?: string; +} + interface ImageList { images: ImageMetadata[]; cursor?: string; @@ -183,6 +189,14 @@ interface ImageHandle { */ bytes(): Promise | null>; + /** + * Generate a signed delivery URL for this hosted image. + * @param options Signing configuration + * @returns A signed image delivery URL + * @throws {@link ImagesError} if signing fails + */ + signedUrl(options: ImageSignedUrlOptions): Promise; + /** * Update hosted image metadata * @param options Properties to update diff --git a/types/generated-snapshot/experimental/index.d.ts b/types/generated-snapshot/experimental/index.d.ts index a0ae6620476..d9552da2778 100755 --- a/types/generated-snapshot/experimental/index.d.ts +++ b/types/generated-snapshot/experimental/index.d.ts @@ -14747,6 +14747,11 @@ interface ImageListOptions { creator?: string; filter?: ImageListFilter; } +interface ImageSignedUrlOptions { + variant: string; + expiresIn?: number; + keyName?: string; +} interface ImageList { images: ImageMetadata[]; cursor?: string; @@ -14763,6 +14768,13 @@ interface ImageHandle { * @returns ReadableStream of image bytes, or null if not found */ bytes(): Promise | null>; + /** + * Generate a signed delivery URL for this hosted image. + * @param options Signing configuration + * @returns A signed image delivery URL + * @throws {@link ImagesError} if signing fails + */ + signedUrl(options: ImageSignedUrlOptions): Promise; /** * Update hosted image metadata * @param options Properties to update diff --git a/types/generated-snapshot/experimental/index.ts b/types/generated-snapshot/experimental/index.ts index 94099c8b64f..5d073152a18 100755 --- a/types/generated-snapshot/experimental/index.ts +++ b/types/generated-snapshot/experimental/index.ts @@ -14774,6 +14774,11 @@ export interface ImageListOptions { creator?: string; filter?: ImageListFilter; } +export interface ImageSignedUrlOptions { + variant: string; + expiresIn?: number; + keyName?: string; +} export interface ImageList { images: ImageMetadata[]; cursor?: string; @@ -14790,6 +14795,13 @@ export interface ImageHandle { * @returns ReadableStream of image bytes, or null if not found */ bytes(): Promise | null>; + /** + * Generate a signed delivery URL for this hosted image. + * @param options Signing configuration + * @returns A signed image delivery URL + * @throws {@link ImagesError} if signing fails + */ + signedUrl(options: ImageSignedUrlOptions): Promise; /** * Update hosted image metadata * @param options Properties to update diff --git a/types/generated-snapshot/index.d.ts b/types/generated-snapshot/index.d.ts index 4bf8342070e..e45e5c0dd09 100755 --- a/types/generated-snapshot/index.d.ts +++ b/types/generated-snapshot/index.d.ts @@ -14099,6 +14099,11 @@ interface ImageListOptions { creator?: string; filter?: ImageListFilter; } +interface ImageSignedUrlOptions { + variant: string; + expiresIn?: number; + keyName?: string; +} interface ImageList { images: ImageMetadata[]; cursor?: string; @@ -14115,6 +14120,13 @@ interface ImageHandle { * @returns ReadableStream of image bytes, or null if not found */ bytes(): Promise | null>; + /** + * Generate a signed delivery URL for this hosted image. + * @param options Signing configuration + * @returns A signed image delivery URL + * @throws {@link ImagesError} if signing fails + */ + signedUrl(options: ImageSignedUrlOptions): Promise; /** * Update hosted image metadata * @param options Properties to update diff --git a/types/generated-snapshot/index.ts b/types/generated-snapshot/index.ts index c19972b94eb..535cfb02965 100755 --- a/types/generated-snapshot/index.ts +++ b/types/generated-snapshot/index.ts @@ -14126,6 +14126,11 @@ export interface ImageListOptions { creator?: string; filter?: ImageListFilter; } +export interface ImageSignedUrlOptions { + variant: string; + expiresIn?: number; + keyName?: string; +} export interface ImageList { images: ImageMetadata[]; cursor?: string; @@ -14142,6 +14147,13 @@ export interface ImageHandle { * @returns ReadableStream of image bytes, or null if not found */ bytes(): Promise | null>; + /** + * Generate a signed delivery URL for this hosted image. + * @param options Signing configuration + * @returns A signed image delivery URL + * @throws {@link ImagesError} if signing fails + */ + signedUrl(options: ImageSignedUrlOptions): Promise; /** * Update hosted image metadata * @param options Properties to update From a6977ddcd87eca12d4306f7b4e79bef04da959ce Mon Sep 17 00:00:00 2001 From: Arka Mondal Date: Mon, 13 Jul 2026 13:42:17 +0100 Subject: [PATCH 3/3] Add createDirectUpload() to Images binding types --- src/cloudflare/internal/images-api.ts | 9 +++++ src/cloudflare/internal/images.d.ts | 24 ++++++++++++++ .../internal/test/images/images-api-test.js | 33 +++++++++++++++++++ .../test/images/images-upstream-mock.js | 12 +++++++ types/defines/images.d.ts | 24 ++++++++++++++ .../experimental/index.d.ts | 21 ++++++++++++ .../generated-snapshot/experimental/index.ts | 21 ++++++++++++ types/generated-snapshot/index.d.ts | 21 ++++++++++++ types/generated-snapshot/index.ts | 21 ++++++++++++ 9 files changed, 186 insertions(+) diff --git a/src/cloudflare/internal/images-api.ts b/src/cloudflare/internal/images-api.ts index efe33b99174..42b36db2517 100644 --- a/src/cloudflare/internal/images-api.ts +++ b/src/cloudflare/internal/images-api.ts @@ -251,6 +251,9 @@ interface ServiceEntrypointStub { options?: ImageUploadOptions ): Promise; list(options?: ImageListOptions): Promise; + createDirectUpload( + options?: ImageDirectUploadOptions + ): Promise; } class HostedImagesBindingImpl implements HostedImagesBinding { @@ -274,6 +277,12 @@ class HostedImagesBindingImpl implements HostedImagesBinding { async list(options?: ImageListOptions): Promise { return this.#fetcher.list(options); } + + async createDirectUpload( + options?: ImageDirectUploadOptions + ): Promise { + return this.#fetcher.createDirectUpload(options); + } } class ImagesBindingImpl implements ImagesBinding { diff --git a/src/cloudflare/internal/images.d.ts b/src/cloudflare/internal/images.d.ts index 4a492a7e4bf..0c1930cad29 100644 --- a/src/cloudflare/internal/images.d.ts +++ b/src/cloudflare/internal/images.d.ts @@ -173,6 +173,19 @@ interface ImageSignedUrlOptions { keyName?: string; } +interface ImageDirectUploadOptions { + id?: string; + requireSignedURLs?: boolean; + metadata?: Record; + creator?: string; + expiresIn?: number; +} + +interface ImageDirectUploadResult { + id: string; + uploadURL: string; +} + interface ImageList { images: ImageMetadata[]; cursor?: string; @@ -242,6 +255,17 @@ interface HostedImagesBinding { * @throws {@link ImagesError} if list fails */ list(options?: ImageListOptions): Promise; + + /** + * Create a Direct Creator Upload link, letting an end user upload an + * image straight to Cloudflare without exposing an API token + * @param options Upload link configuration + * @returns The new image ID and the upload URL to hand to the end user + * @throws {@link ImagesError} if creation fails + */ + createDirectUpload( + options?: ImageDirectUploadOptions + ): Promise; } interface ImagesBinding { diff --git a/src/cloudflare/internal/test/images/images-api-test.js b/src/cloudflare/internal/test/images/images-api-test.js index eb751e78075..9216269b9a7 100644 --- a/src/cloudflare/internal/test/images/images-api-test.js +++ b/src/cloudflare/internal/test/images/images-api-test.js @@ -725,3 +725,36 @@ export const test_images_upload_base64_arraybuffer = { assert.notEqual(metadata.id, null); }, }; + +// CREATE DIRECT UPLOAD +export const test_images_create_direct_upload_default = { + /** + * @param {unknown} _ + * @param {Env} env + */ + async test(_, env) { + const result = await env.images.hosted.createDirectUpload(); + + assert.notEqual(result.id, null); + assert.equal(result.uploadURL.includes(result.id), true); + }, +}; + +export const test_images_create_direct_upload_with_options = { + /** + * @param {unknown} _ + * @param {Env} env + */ + async test(_, env) { + const result = await env.images.hosted.createDirectUpload({ + id: 'custom-upload-id', + requireSignedURLs: true, + metadata: { userId: 'abc123' }, + creator: 'direct-upload-creator', + expiresIn: 600, + }); + + assert.equal(result.id, 'custom-upload-id'); + assert.equal(result.uploadURL.includes('custom-upload-id'), true); + }, +}; diff --git a/src/cloudflare/internal/test/images/images-upstream-mock.js b/src/cloudflare/internal/test/images/images-upstream-mock.js index 2895fdd2725..2c4b3a0db04 100644 --- a/src/cloudflare/internal/test/images/images-upstream-mock.js +++ b/src/cloudflare/internal/test/images/images-upstream-mock.js @@ -219,6 +219,18 @@ export class ServiceEntrypoint extends WorkerEntrypoint { }; } + /** + * @param {ImageDirectUploadOptions} [options] + * @returns {Promise} + */ + async createDirectUpload(options) { + const id = options?.id || 'generated-upload-id'; + return { + id, + uploadURL: `https://upload.imagedelivery.example/${id}`, + }; + } + /** * Handle HTTP requests for info and transform operations. * In production these go to a separate transformation service, diff --git a/types/defines/images.d.ts b/types/defines/images.d.ts index c47ea4773ac..bdeb00b8142 100644 --- a/types/defines/images.d.ts +++ b/types/defines/images.d.ts @@ -170,6 +170,19 @@ interface ImageSignedUrlOptions { keyName?: string; } +interface ImageDirectUploadOptions { + id?: string; + requireSignedURLs?: boolean; + metadata?: Record; + creator?: string; + expiresIn?: number; +} + +interface ImageDirectUploadResult { + id: string; + uploadURL: string; +} + interface ImageList { images: ImageMetadata[]; cursor?: string; @@ -239,6 +252,17 @@ interface HostedImagesBinding { * @throws {@link ImagesError} if list fails */ list(options?: ImageListOptions): Promise; + + /** + * Create a Direct Creator Upload link, letting an end user upload an + * image straight to Cloudflare without exposing an API token + * @param options Upload link configuration + * @returns The new image ID and the upload URL to hand to the end user + * @throws {@link ImagesError} if creation fails + */ + createDirectUpload( + options?: ImageDirectUploadOptions + ): Promise; } interface ImagesBinding { diff --git a/types/generated-snapshot/experimental/index.d.ts b/types/generated-snapshot/experimental/index.d.ts index d9552da2778..95f83867411 100755 --- a/types/generated-snapshot/experimental/index.d.ts +++ b/types/generated-snapshot/experimental/index.d.ts @@ -14752,6 +14752,17 @@ interface ImageSignedUrlOptions { expiresIn?: number; keyName?: string; } +interface ImageDirectUploadOptions { + id?: string; + requireSignedURLs?: boolean; + metadata?: Record; + creator?: string; + expiresIn?: number; +} +interface ImageDirectUploadResult { + id: string; + uploadURL: string; +} interface ImageList { images: ImageMetadata[]; cursor?: string; @@ -14813,6 +14824,16 @@ interface HostedImagesBinding { * @throws {@link ImagesError} if list fails */ list(options?: ImageListOptions): Promise; + /** + * Create a Direct Creator Upload link, letting an end user upload an + * image straight to Cloudflare without exposing an API token + * @param options Upload link configuration + * @returns The new image ID and the upload URL to hand to the end user + * @throws {@link ImagesError} if creation fails + */ + createDirectUpload( + options?: ImageDirectUploadOptions, + ): Promise; } interface ImagesBinding { /** diff --git a/types/generated-snapshot/experimental/index.ts b/types/generated-snapshot/experimental/index.ts index 5d073152a18..50d338f863d 100755 --- a/types/generated-snapshot/experimental/index.ts +++ b/types/generated-snapshot/experimental/index.ts @@ -14779,6 +14779,17 @@ export interface ImageSignedUrlOptions { expiresIn?: number; keyName?: string; } +export interface ImageDirectUploadOptions { + id?: string; + requireSignedURLs?: boolean; + metadata?: Record; + creator?: string; + expiresIn?: number; +} +export interface ImageDirectUploadResult { + id: string; + uploadURL: string; +} export interface ImageList { images: ImageMetadata[]; cursor?: string; @@ -14840,6 +14851,16 @@ export interface HostedImagesBinding { * @throws {@link ImagesError} if list fails */ list(options?: ImageListOptions): Promise; + /** + * Create a Direct Creator Upload link, letting an end user upload an + * image straight to Cloudflare without exposing an API token + * @param options Upload link configuration + * @returns The new image ID and the upload URL to hand to the end user + * @throws {@link ImagesError} if creation fails + */ + createDirectUpload( + options?: ImageDirectUploadOptions, + ): Promise; } export interface ImagesBinding { /** diff --git a/types/generated-snapshot/index.d.ts b/types/generated-snapshot/index.d.ts index e45e5c0dd09..cedfde89a69 100755 --- a/types/generated-snapshot/index.d.ts +++ b/types/generated-snapshot/index.d.ts @@ -14104,6 +14104,17 @@ interface ImageSignedUrlOptions { expiresIn?: number; keyName?: string; } +interface ImageDirectUploadOptions { + id?: string; + requireSignedURLs?: boolean; + metadata?: Record; + creator?: string; + expiresIn?: number; +} +interface ImageDirectUploadResult { + id: string; + uploadURL: string; +} interface ImageList { images: ImageMetadata[]; cursor?: string; @@ -14165,6 +14176,16 @@ interface HostedImagesBinding { * @throws {@link ImagesError} if list fails */ list(options?: ImageListOptions): Promise; + /** + * Create a Direct Creator Upload link, letting an end user upload an + * image straight to Cloudflare without exposing an API token + * @param options Upload link configuration + * @returns The new image ID and the upload URL to hand to the end user + * @throws {@link ImagesError} if creation fails + */ + createDirectUpload( + options?: ImageDirectUploadOptions, + ): Promise; } interface ImagesBinding { /** diff --git a/types/generated-snapshot/index.ts b/types/generated-snapshot/index.ts index 535cfb02965..7543f09e8ef 100755 --- a/types/generated-snapshot/index.ts +++ b/types/generated-snapshot/index.ts @@ -14131,6 +14131,17 @@ export interface ImageSignedUrlOptions { expiresIn?: number; keyName?: string; } +export interface ImageDirectUploadOptions { + id?: string; + requireSignedURLs?: boolean; + metadata?: Record; + creator?: string; + expiresIn?: number; +} +export interface ImageDirectUploadResult { + id: string; + uploadURL: string; +} export interface ImageList { images: ImageMetadata[]; cursor?: string; @@ -14192,6 +14203,16 @@ export interface HostedImagesBinding { * @throws {@link ImagesError} if list fails */ list(options?: ImageListOptions): Promise; + /** + * Create a Direct Creator Upload link, letting an end user upload an + * image straight to Cloudflare without exposing an API token + * @param options Upload link configuration + * @returns The new image ID and the upload URL to hand to the end user + * @throws {@link ImagesError} if creation fails + */ + createDirectUpload( + options?: ImageDirectUploadOptions, + ): Promise; } export interface ImagesBinding { /**