Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
11 changes: 8 additions & 3 deletions src/cloudflare/internal/images-api.ts
Original file line number Diff line number Diff line change
Expand Up @@ -14,7 +14,12 @@ type Fetcher = {
};

function isTextSource(source: ImageSource): source is TextRasterize {
return !(source instanceof ReadableStream);
return (
typeof source === 'object' &&
source !== null &&
'content' in source &&
'options' in source
);
}

function serializeTextSource(source: TextRasterize): string {
Expand Down Expand Up @@ -153,7 +158,7 @@ class ImageTransformerImpl implements ImageTransformer {
formData.append('text_input', serializeTextSource(this.#source));
} else {
span.setAttribute('cloudflare.images.canvas.type', 'image');
formData.append('image', this.#source as ReadableStream<Uint8Array>, {
formData.append('image', this.#source, {
type: 'file',
});
}
Expand Down Expand Up @@ -221,7 +226,7 @@ class ImageTransformerImpl implements ImageTransformer {
formData.append('draw_text', serializeTextSource(source));
} else {
overlayStats.image++;
formData.append('draw_image', source as ReadableStream<Uint8Array>, {
formData.append('draw_image', source, {
type: 'file',
});
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -723,4 +723,61 @@ const expectedSpans = [
'cloudflare.binding.type': 'Images',
closed: true,
},
{
name: 'images_output',
'cloudflare.binding.type': 'Images',
'cloudflare.images.canvas.type': 'image',
'cloudflare.images.options.format': 'image/avif',
closed: true,
},
{
name: 'fetch',
'network.protocol.name': 'http',
'network.protocol.version': 'HTTP/1.1',
'http.request.method': 'POST',
'url.full': 'https://js.images.cloudflare.com/transform',
'http.request.header.content-type':
'multipart/form-data; boundary=<dynamic>',
'http.response.status_code': 200n,
'http.response.body.size': 22n,
closed: true,
},
{
name: 'images_output',
'cloudflare.binding.type': 'Images',
'cloudflare.images.canvas.type': 'image',
'cloudflare.images.options.format': 'image/avif',
closed: true,
},
{
name: 'fetch',
'network.protocol.name': 'http',
'network.protocol.version': 'HTTP/1.1',
'http.request.method': 'POST',
'url.full': 'https://js.images.cloudflare.com/transform',
'http.request.header.content-type':
'multipart/form-data; boundary=<dynamic>',
'http.response.status_code': 200n,
'http.response.body.size': 88n,
closed: true,
},
{
name: 'images_output',
'cloudflare.binding.type': 'Images',
'cloudflare.images.canvas.type': 'image',
'cloudflare.images.options.format': 'image/png',
closed: true,
},
{
name: 'fetch',
'network.protocol.name': 'http',
'network.protocol.version': 'HTTP/1.1',
'http.request.method': 'POST',
'url.full': 'https://js.images.cloudflare.com/transform',
'http.request.header.content-type':
'multipart/form-data; boundary=<dynamic>',
'http.response.status_code': 200n,
'http.response.body.size': 60n,
closed: true,
},
];
51 changes: 51 additions & 0 deletions src/cloudflare/internal/test/images/images-api-test.js
Original file line number Diff line number Diff line change
Expand Up @@ -1049,3 +1049,54 @@ export const test_images_create_direct_upload_with_options = {
assert.equal(result.uploadURL.includes('custom-upload-id'), true);
},
};

export const test_images_input_accepts_arraybuffer = {
/**
* @param {unknown} _
* @param {Env} env
*/
async test(_, env) {
const buffer = new TextEncoder().encode('test image data').buffer;
const result = await env.images
.input(buffer)
.output({ format: 'image/avif' });

const response = await result.response();
assert.equal(response.status, 200);
},
};

export const test_images_input_accepts_uint8array = {
/**
* @param {unknown} _
* @param {Env} env
*/
async test(_, env) {
const uint8 = new TextEncoder().encode('test image data');
const result = await env.images
.input(uint8)
.output({ format: 'image/avif' });

const response = await result.response();
assert.equal(response.status, 200);
},
};

export const test_images_draw_accepts_arraybuffer = {
/**
* @param {unknown} _
* @param {Env} env
*/
async test(_, env) {
const imageBuffer = new TextEncoder().encode('base image').buffer;
const overlayBuffer = new TextEncoder().encode('overlay image').buffer;

const result = await env.images
.input(imageBuffer)
.draw(env.images.input(overlayBuffer))
.output({ format: 'image/png' });

const response = await result.response();
assert.equal(response.status, 200);
},
};
Loading