@lunora/bindings 1.0.0-alpha.5 → 1.0.0-alpha.50
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/analytics/index.d.mts +81 -85
- package/dist/analytics/index.d.ts +81 -85
- package/dist/analytics/index.mjs +1 -2
- package/dist/images/index.d.mts +160 -174
- package/dist/images/index.d.ts +160 -174
- package/dist/images/index.mjs +1 -3
- package/dist/kv/index.d.mts +74 -151
- package/dist/kv/index.d.ts +74 -151
- package/dist/kv/index.mjs +1 -2
- package/dist/packem_shared/AnalyticsSqlError-CeQ3A5Eb.mjs +1 -0
- package/dist/packem_shared/R2SqlError-ZHgOWClB.mjs +1 -0
- package/dist/packem_shared/SelectBuilder-DJXNSdqC.mjs +1 -0
- package/dist/packem_shared/SetOperation-kiI5Wnlm.mjs +1 -0
- package/dist/packem_shared/Sql-BfnxRway.mjs +1 -0
- package/dist/packem_shared/WindowExpression-VX7EEV3h.mjs +1 -0
- package/dist/packem_shared/WindowFunction-CL4jYy2l.mjs +1 -0
- package/dist/packem_shared/asc-DP_WFiAE.mjs +1 -0
- package/dist/packem_shared/buildImageDeliveryUrl-Brqs-dcZ.mjs +1 -0
- package/dist/packem_shared/buildSignedImageUrl-BV-iSJKA.mjs +4 -0
- package/dist/packem_shared/cap-error-body-YBKO32BF.mjs +1 -0
- package/dist/packem_shared/concurrent-vRmSvRpF.mjs +1 -0
- package/dist/packem_shared/createAnalytics-BXTNc57d.mjs +1 -0
- package/dist/packem_shared/createContextVectors-Bk6ZVCqQ.mjs +6 -0
- package/dist/packem_shared/createImages-D7JExfqF.mjs +1 -0
- package/dist/packem_shared/createKv-BfCuX4Hl.mjs +1 -0
- package/dist/packem_shared/createKvIntrospector-CxMeB6tv.mjs +1 -0
- package/dist/packem_shared/createPipelines-CIvqrc7E.mjs +1 -0
- package/dist/packem_shared/createVectorAdminIntrospector-1CS6sIlR.mjs +1 -0
- package/dist/packem_shared/createVectors-DirhBYpw.mjs +1 -0
- package/dist/pipelines/index.d.mts +24 -24
- package/dist/pipelines/index.d.ts +24 -24
- package/dist/pipelines/index.mjs +1 -1
- package/dist/r2sql/index.d.mts +153 -125
- package/dist/r2sql/index.d.ts +153 -125
- package/dist/r2sql/index.mjs +1 -7
- package/dist/vectors/index.d.mts +185 -134
- package/dist/vectors/index.d.ts +185 -134
- package/dist/vectors/index.mjs +1 -3
- package/package.json +3 -2
- package/dist/packem_shared/AnalyticsSqlError-C2nz3jpH.mjs +0 -41
- package/dist/packem_shared/R2SqlError-Boygg3S0.mjs +0 -65
- package/dist/packem_shared/SelectBuilder-DHaXZwn_.mjs +0 -167
- package/dist/packem_shared/SetOperation-RDHcxccj.mjs +0 -80
- package/dist/packem_shared/Sql-DceGtcUd.mjs +0 -68
- package/dist/packem_shared/WindowExpression-Cg9s2xcr.mjs +0 -44
- package/dist/packem_shared/WindowFunction-DA3pGC3N.mjs +0 -82
- package/dist/packem_shared/asc-Cur-xO8v.mjs +0 -16
- package/dist/packem_shared/buildImageDeliveryUrl-B6_QU91n.mjs +0 -33
- package/dist/packem_shared/buildSignedImageUrl-6iibA9v1.mjs +0 -113
- package/dist/packem_shared/concurrent-Dj5sOibv.mjs +0 -23
- package/dist/packem_shared/createAnalytics-CEEI69o9.mjs +0 -57
- package/dist/packem_shared/createContextVectors-BSizpmu5.mjs +0 -140
- package/dist/packem_shared/createImages-BzRnsz3H.mjs +0 -85
- package/dist/packem_shared/createKv-7lNrS1W2.mjs +0 -143
- package/dist/packem_shared/createKvIntrospector-CrAgQp1w.mjs +0 -77
- package/dist/packem_shared/createPipelines-CfyJ6VGu.mjs +0 -10
- package/dist/packem_shared/createVectorAdminIntrospector-C-qTDWA1.mjs +0 -53
- package/dist/packem_shared/createVectors-DqxgEPQb.mjs +0 -95
package/dist/images/index.d.mts
CHANGED
|
@@ -1,69 +1,38 @@
|
|
|
1
1
|
/**
|
|
2
|
-
* Structural projections of the Cloudflare **Images** binding (`env.IMAGES`).
|
|
3
|
-
*
|
|
4
|
-
* Declared structurally — the same pattern `@lunora/storage` uses for
|
|
5
|
-
* `R2BucketLike` — so a unit test can pass a plain object double and the real
|
|
6
|
-
* `ImagesBinding` from `@cloudflare/workers-types` satisfies the same shape. We
|
|
7
|
-
* project only the slice of the chain we actually call
|
|
8
|
-
* (`input(stream).transform(opts).output(opts)` + `info(stream)`), not the full
|
|
9
|
-
* hosted-images CRUD surface.
|
|
10
|
-
*
|
|
11
|
-
* TODO(workers-types): the 2026-06-16 optimization features — the `aspect-crop`
|
|
12
|
-
* / `scale-up` fit modes and the `upscale` param — are modeled here by hand
|
|
13
|
-
* because `@cloudflare/workers-types` (through 4.20260616.1) does not type them
|
|
14
|
-
* yet. Re-check on the next `@cloudflare/workers-types` bump: once `ImageTransform`
|
|
15
|
-
* carries `fit: "aspect-crop" | "scale-up"` and `upscale`, drop our hand-rolled
|
|
16
|
-
* additions and lean on the upstream type.
|
|
17
|
-
*/
|
|
2
|
+
* Structural projections of the Cloudflare **Images** binding (`env.IMAGES`).
|
|
3
|
+
*
|
|
4
|
+
* Declared structurally — the same pattern `@lunora/storage` uses for
|
|
5
|
+
* `R2BucketLike` — so a unit test can pass a plain object double and the real
|
|
6
|
+
* `ImagesBinding` from `@cloudflare/workers-types` satisfies the same shape. We
|
|
7
|
+
* project only the slice of the chain we actually call
|
|
8
|
+
* (`input(stream).transform(opts).output(opts)` + `info(stream)`), not the full
|
|
9
|
+
* hosted-images CRUD surface.
|
|
10
|
+
*
|
|
11
|
+
* TODO(workers-types): the 2026-06-16 optimization features — the `aspect-crop`
|
|
12
|
+
* / `scale-up` fit modes and the `upscale` param — are modeled here by hand
|
|
13
|
+
* because `@cloudflare/workers-types` (through 4.20260616.1) does not type them
|
|
14
|
+
* yet. Re-check on the next `@cloudflare/workers-types` bump: once `ImageTransform`
|
|
15
|
+
* carries `fit: "aspect-crop" | "scale-up"` and `upscale`, drop our hand-rolled
|
|
16
|
+
* additions and lean on the upstream type.
|
|
17
|
+
*/
|
|
18
18
|
/**
|
|
19
|
-
* Porter-Duff compositing operation controlling how an overlay is blended onto
|
|
20
|
-
* the image beneath it. Mirrors the binding's `ImageCompositeMode`.
|
|
21
|
-
*
|
|
22
|
-
* - `over` — foreground drawn on top of the backdrop (default).
|
|
23
|
-
* - `in` — foreground shown only where the backdrop is opaque.
|
|
24
|
-
* - `atop` — foreground drawn on top, clipped to the backdrop's shape.
|
|
25
|
-
* - `out` — foreground shown only where the backdrop is transparent.
|
|
26
|
-
* - `xor` — foreground and backdrop visible only where the other is not.
|
|
27
|
-
* - `lighter` — foreground and backdrop channels added (brightening).
|
|
28
|
-
*/
|
|
19
|
+
* Porter-Duff compositing operation controlling how an overlay is blended onto
|
|
20
|
+
* the image beneath it. Mirrors the binding's `ImageCompositeMode`.
|
|
21
|
+
*
|
|
22
|
+
* - `over` — foreground drawn on top of the backdrop (default).
|
|
23
|
+
* - `in` — foreground shown only where the backdrop is opaque.
|
|
24
|
+
* - `atop` — foreground drawn on top, clipped to the backdrop's shape.
|
|
25
|
+
* - `out` — foreground shown only where the backdrop is transparent.
|
|
26
|
+
* - `xor` — foreground and backdrop visible only where the other is not.
|
|
27
|
+
* - `lighter` — foreground and backdrop channels added (brightening).
|
|
28
|
+
*/
|
|
29
29
|
type ImageCompositeMode = "atop" | "in" | "lighter" | "out" | "over" | "xor";
|
|
30
30
|
/**
|
|
31
|
-
*
|
|
32
|
-
*
|
|
33
|
-
*
|
|
34
|
-
*
|
|
35
|
-
|
|
36
|
-
* `width`/`height` accept either an integer (pixels) or a decimal in `(0, 1]`
|
|
37
|
-
* interpreted as a fraction of the base image's corresponding dimension.
|
|
38
|
-
*/
|
|
39
|
-
interface DrawOverlay {
|
|
40
|
-
/** Offset, in pixels, from the bottom edge. */
|
|
41
|
-
bottom?: number;
|
|
42
|
-
/** Blend mode for compositing this overlay onto the image. Default `over`. */
|
|
43
|
-
composite?: ImageCompositeMode;
|
|
44
|
-
/** Overlay height — pixels (integer) or a `0–1` fraction of the base height. */
|
|
45
|
-
height?: number;
|
|
46
|
-
/** Offset, in pixels, from the left edge. */
|
|
47
|
-
left?: number;
|
|
48
|
-
/** Overlay opacity, `0.0` (transparent) – `1.0` (opaque). */
|
|
49
|
-
opacity?: number;
|
|
50
|
-
/** Tile the overlay across the base image: `true`, or a single axis `"x"`/`"y"`. */
|
|
51
|
-
repeat?: "x" | "y" | boolean;
|
|
52
|
-
/** Offset, in pixels, from the right edge. */
|
|
53
|
-
right?: number;
|
|
54
|
-
/** Offset, in pixels, from the top edge. */
|
|
55
|
-
top?: number;
|
|
56
|
-
/** Absolute URL of the overlay image. */
|
|
57
|
-
url: string;
|
|
58
|
-
/** Overlay width — pixels (integer) or a `0–1` fraction of the base width. */
|
|
59
|
-
width?: number;
|
|
60
|
-
}
|
|
61
|
-
/**
|
|
62
|
-
* Transform parameters threaded into `binding.input(stream).transform(...)`.
|
|
63
|
-
* A structural subset of the real `ImageTransform`; the keys here are the
|
|
64
|
-
* resize/format/optimize knobs apps reach for. Unknown extra keys on the real
|
|
65
|
-
* binding are still accepted because the binding owns the authoritative type.
|
|
66
|
-
*/
|
|
31
|
+
* Transform parameters threaded into `binding.input(stream).transform(...)`.
|
|
32
|
+
* A structural subset of the real `ImageTransform`; the keys here are the
|
|
33
|
+
* resize/format/optimize knobs apps reach for. Unknown extra keys on the real
|
|
34
|
+
* binding are still accepted because the binding owns the authoritative type.
|
|
35
|
+
*/
|
|
67
36
|
interface TransformOptions {
|
|
68
37
|
/** Background color (CSS color) painted under transparent images. */
|
|
69
38
|
background?: string;
|
|
@@ -74,24 +43,17 @@ interface TransformOptions {
|
|
|
74
43
|
/** Contrast multiplier (1 = unchanged). */
|
|
75
44
|
contrast?: number;
|
|
76
45
|
/**
|
|
77
|
-
|
|
78
|
-
|
|
79
|
-
|
|
80
|
-
|
|
81
|
-
|
|
82
|
-
|
|
83
|
-
|
|
84
|
-
|
|
85
|
-
|
|
86
|
-
|
|
87
|
-
|
|
88
|
-
* - `cover` — fill the box, cropping overflow.
|
|
89
|
-
* - `crop` — shrink-and-crop to fit, but never enlarges.
|
|
90
|
-
* - `aspect-crop` — crop to the target aspect ratio, but never enlarges.
|
|
91
|
-
* - `pad` — fit within the box, padding the remainder with `background`.
|
|
92
|
-
* - `squeeze` — stretch to the exact box, distorting aspect ratio.
|
|
93
|
-
* - `scale-up` — enlarge to show the whole image, but never downscales.
|
|
94
|
-
*/
|
|
46
|
+
* Resize mode. Affects how `width`/`height` are interpreted.
|
|
47
|
+
*
|
|
48
|
+
* - `scale-down` — contain, but never enlarges.
|
|
49
|
+
* - `contain` — fit within the box, preserving aspect ratio.
|
|
50
|
+
* - `cover` — fill the box, cropping overflow.
|
|
51
|
+
* - `crop` — shrink-and-crop to fit, but never enlarges.
|
|
52
|
+
* - `aspect-crop` — crop to the target aspect ratio, but never enlarges.
|
|
53
|
+
* - `pad` — fit within the box, padding the remainder with `background`.
|
|
54
|
+
* - `squeeze` — stretch to the exact box, distorting aspect ratio.
|
|
55
|
+
* - `scale-up` — enlarge to show the whole image, but never downscales.
|
|
56
|
+
*/
|
|
95
57
|
fit?: "aspect-crop" | "contain" | "cover" | "crop" | "pad" | "scale-down" | "scale-up" | "squeeze";
|
|
96
58
|
/** Mirror the image horizontally, vertically, or both. */
|
|
97
59
|
flip?: "h" | "hv" | "v";
|
|
@@ -114,11 +76,11 @@ interface TransformOptions {
|
|
|
114
76
|
/** Sharpen strength (0–10). */
|
|
115
77
|
sharpen?: number;
|
|
116
78
|
/**
|
|
117
|
-
|
|
118
|
-
|
|
119
|
-
|
|
120
|
-
|
|
121
|
-
|
|
79
|
+
* Algorithm used when a transform enlarges the image (e.g. `fit: "scale-up"`).
|
|
80
|
+
*
|
|
81
|
+
* - `interpolate` — bicubic interpolation (default), may soften detail.
|
|
82
|
+
* - `generate` — AI upscaling for sharper, more detailed enlargements.
|
|
83
|
+
*/
|
|
122
84
|
upscale?: "generate" | "interpolate";
|
|
123
85
|
/** Target width in pixels (integer). Clamped to the configured ceiling. */
|
|
124
86
|
width?: number;
|
|
@@ -137,10 +99,10 @@ interface OutputOptions {
|
|
|
137
99
|
quality?: number;
|
|
138
100
|
}
|
|
139
101
|
/**
|
|
140
|
-
* The result of `binding.input(...).transform(...).output(...)`. Mirrors the
|
|
141
|
-
* real `ImageTransformationResult` — a `Response`, the content type, and the
|
|
142
|
-
* raw byte stream.
|
|
143
|
-
*/
|
|
102
|
+
* The result of `binding.input(...).transform(...).output(...)`. Mirrors the
|
|
103
|
+
* real `ImageTransformationResult` — a `Response`, the content type, and the
|
|
104
|
+
* raw byte stream.
|
|
105
|
+
*/
|
|
144
106
|
interface ImageTransformationResultLike {
|
|
145
107
|
contentType: () => string;
|
|
146
108
|
image: () => ReadableStream<Uint8Array>;
|
|
@@ -156,11 +118,11 @@ type ImageInfoLike = {
|
|
|
156
118
|
format: string;
|
|
157
119
|
};
|
|
158
120
|
/**
|
|
159
|
-
* Binding-side overlay options for `transformer.draw(image, options)` — the
|
|
160
|
-
* blend/position/opacity knobs.
|
|
161
|
-
*
|
|
162
|
-
*
|
|
163
|
-
*/
|
|
121
|
+
* Binding-side overlay options for `transformer.draw(image, options)` — the
|
|
122
|
+
* blend/position/opacity knobs. There is no `url` (the overlay bytes are passed
|
|
123
|
+
* as the stream) and no `width`/`height` (the overlay is pre-sized via its own
|
|
124
|
+
* transform); mirrors `ImageDrawOptions`.
|
|
125
|
+
*/
|
|
164
126
|
interface ImageDrawOptions {
|
|
165
127
|
/** Offset, in pixels, from the bottom edge. */
|
|
166
128
|
bottom?: number;
|
|
@@ -178,10 +140,10 @@ interface ImageDrawOptions {
|
|
|
178
140
|
top?: number;
|
|
179
141
|
}
|
|
180
142
|
/**
|
|
181
|
-
* One overlay applied through the **binding** path (`Images.transform`'s
|
|
182
|
-
* `overlays` argument). The overlay bytes come from `image` (any {@link ImageInput});
|
|
183
|
-
* an optional `transform` pre-sizes/reformats the overlay before it is drawn.
|
|
184
|
-
*/
|
|
143
|
+
* One overlay applied through the **binding** path (`Images.transform`'s
|
|
144
|
+
* `overlays` argument). The overlay bytes come from `image` (any {@link ImageInput});
|
|
145
|
+
* an optional `transform` pre-sizes/reformats the overlay before it is drawn.
|
|
146
|
+
*/
|
|
185
147
|
interface ImageOverlay extends ImageDrawOptions {
|
|
186
148
|
/** The overlay image bytes — a stream, buffer, `Blob`, or R2 object body. */
|
|
187
149
|
image: ImageInput;
|
|
@@ -195,19 +157,19 @@ interface ImageTransformerLike {
|
|
|
195
157
|
transform: (transform: TransformOptions) => ImageTransformerLike;
|
|
196
158
|
}
|
|
197
159
|
/**
|
|
198
|
-
* Minimal projection of `ImagesBinding`. Declared structurally so unit tests can
|
|
199
|
-
* pass a plain object double; the real `env.IMAGES` binding satisfies the same
|
|
200
|
-
* shape. Only the input/transform/output chain and `info` are projected — the
|
|
201
|
-
* hosted-images CRUD surface is out of scope.
|
|
202
|
-
*/
|
|
160
|
+
* Minimal projection of `ImagesBinding`. Declared structurally so unit tests can
|
|
161
|
+
* pass a plain object double; the real `env.IMAGES` binding satisfies the same
|
|
162
|
+
* shape. Only the input/transform/output chain and `info` are projected — the
|
|
163
|
+
* hosted-images CRUD surface is out of scope.
|
|
164
|
+
*/
|
|
203
165
|
interface ImagesBindingLike {
|
|
204
166
|
info: (stream: ReadableStream<Uint8Array>) => Promise<ImageInfoLike>;
|
|
205
167
|
input: (stream: ReadableStream<Uint8Array>) => ImageTransformerLike;
|
|
206
168
|
}
|
|
207
169
|
/**
|
|
208
|
-
* An R2 object body (as returned by `ctx.storage.download(key)`) — first-class
|
|
209
|
-
* transform input. Only `.body` is read, so a structural projection is enough.
|
|
210
|
-
*/
|
|
170
|
+
* An R2 object body (as returned by `ctx.storage.download(key)`) — first-class
|
|
171
|
+
* transform input. Only `.body` is read, so a structural projection is enough.
|
|
172
|
+
*/
|
|
211
173
|
interface R2ObjectBodyLike {
|
|
212
174
|
body: ReadableStream | null;
|
|
213
175
|
}
|
|
@@ -220,74 +182,89 @@ interface LunoraImagesOptions {
|
|
|
220
182
|
maxDimension?: number;
|
|
221
183
|
}
|
|
222
184
|
/**
|
|
223
|
-
* The action-only Images client wired onto `ctx.images`.
|
|
224
|
-
*
|
|
225
|
-
* The binding-backed `transform`/`info` calls are non-deterministic network /
|
|
226
|
-
* compute I/O, so this lives on **ActionCtx only** — the same seam as `ctx.ai`.
|
|
227
|
-
* The pure URL/signed-URL builders are exported as free functions (see
|
|
228
|
-
* `index.ts`) and are safe to call from any handler.
|
|
229
|
-
*/
|
|
185
|
+
* The action-only Images client wired onto `ctx.images`.
|
|
186
|
+
*
|
|
187
|
+
* The binding-backed `transform`/`info` calls are non-deterministic network /
|
|
188
|
+
* compute I/O, so this lives on **ActionCtx only** — the same seam as `ctx.ai`.
|
|
189
|
+
* The pure URL/signed-URL builders are exported as free functions (see
|
|
190
|
+
* `index.ts`) and are safe to call from any handler.
|
|
191
|
+
*/
|
|
230
192
|
interface Images {
|
|
231
193
|
/**
|
|
232
|
-
|
|
233
|
-
|
|
234
|
-
|
|
194
|
+
* Probe an image for its format and (for raster formats) dimensions + byte
|
|
195
|
+
* size, without running a transform. Wraps `binding.info(...)`.
|
|
196
|
+
*/
|
|
235
197
|
info: (input: ImageInput) => Promise<ImageInfoLike>;
|
|
236
198
|
/**
|
|
237
|
-
|
|
238
|
-
|
|
239
|
-
|
|
240
|
-
|
|
241
|
-
|
|
242
|
-
|
|
243
|
-
|
|
244
|
-
|
|
245
|
-
|
|
246
|
-
|
|
247
|
-
|
|
248
|
-
|
|
199
|
+
* Resize / reformat / optimize `input`, returning the transformed result
|
|
200
|
+
* (a `Response`, content type, and byte stream). Accepts a raw stream/buffer,
|
|
201
|
+
* a `Blob`, or an R2 object body straight from `ctx.storage.download(key)`.
|
|
202
|
+
*
|
|
203
|
+
* `transform` dimensions are clamped to the configured ceiling and the output
|
|
204
|
+
* `format` is validated against the allowlist, so a hostile request can't
|
|
205
|
+
* mint a multi-gigapixel canvas or an unexpected content type.
|
|
206
|
+
*
|
|
207
|
+
* `overlays` are composited over the result in order (last on top) via the
|
|
208
|
+
* binding's `draw` step — each overlay's bytes come from its own `image`, with
|
|
209
|
+
* optional per-overlay `transform` (resize/reformat) and blend/position options.
|
|
210
|
+
*/
|
|
249
211
|
transform: (input: ImageInput, transform?: TransformOptions, output?: OutputOptions, overlays?: ImageOverlay[]) => Promise<ImageTransformationResultLike>;
|
|
250
212
|
}
|
|
251
213
|
/**
|
|
252
|
-
* Build the action-only {@link Images} client over a Cloudflare Images binding.
|
|
253
|
-
*
|
|
254
|
-
* ```ts
|
|
255
|
-
* const images = createImages({ binding: env.IMAGES });
|
|
256
|
-
* const result = await images.transform(
|
|
257
|
-
* await ctx.storage.download("uploads/avatar.png"),
|
|
258
|
-
* { width: 256, height: 256, fit: "cover" },
|
|
259
|
-
* { format: "image/webp", quality: 82 },
|
|
260
|
-
* );
|
|
261
|
-
* ```
|
|
262
|
-
*/
|
|
214
|
+
* Build the action-only {@link Images} client over a Cloudflare Images binding.
|
|
215
|
+
*
|
|
216
|
+
* ```ts
|
|
217
|
+
* const images = createImages({ binding: env.IMAGES });
|
|
218
|
+
* const result = await images.transform(
|
|
219
|
+
* await ctx.storage.download("uploads/avatar.png"),
|
|
220
|
+
* { width: 256, height: 256, fit: "cover" },
|
|
221
|
+
* { format: "image/webp", quality: 82 },
|
|
222
|
+
* );
|
|
223
|
+
* ```
|
|
224
|
+
*/
|
|
263
225
|
declare const createImages: (options: LunoraImagesOptions) => Images;
|
|
264
226
|
interface ImageDeliveryUrlOptions {
|
|
265
227
|
/** Delivery / transform origin, e.g. `https://cdn.acme.test`. */
|
|
266
228
|
baseUrl: string;
|
|
267
229
|
/**
|
|
268
|
-
|
|
269
|
-
|
|
270
|
-
|
|
230
|
+
* Hosted-Images image id. When set, the **delivery-variant** form is built
|
|
231
|
+
* (`<baseUrl>/<imageId>/<variant>`) and `transform`/`key` are ignored.
|
|
232
|
+
*/
|
|
271
233
|
imageId?: string;
|
|
272
234
|
/**
|
|
273
|
-
|
|
274
|
-
|
|
275
|
-
|
|
235
|
+
* Source image — an absolute URL or an origin-relative key. Used by the
|
|
236
|
+
* `/cdn-cgi/image/...` transform form. Ignored when `imageId` is set.
|
|
237
|
+
*/
|
|
276
238
|
key?: string;
|
|
277
|
-
/** Transform options for the `/cdn-cgi/image
|
|
239
|
+
/** Transform options for the `/cdn-cgi/image/<options>/<source>` form. */
|
|
278
240
|
transform?: TransformOptions;
|
|
279
241
|
/** Named delivery variant (e.g. `public`, `thumbnail`). Used with `imageId`; default `public`. */
|
|
280
242
|
variant?: string;
|
|
281
243
|
}
|
|
282
244
|
/**
|
|
283
|
-
* Build a Cloudflare Images delivery / transform URL.
|
|
284
|
-
*
|
|
285
|
-
* - With `imageId`:
|
|
286
|
-
* - With `key`:
|
|
287
|
-
*
|
|
288
|
-
* Pure and deterministic — usable from any handler.
|
|
289
|
-
*/
|
|
245
|
+
* Build a Cloudflare Images delivery / transform URL.
|
|
246
|
+
*
|
|
247
|
+
* - With `imageId`: `<baseUrl>/<imageId>/<variant>` (hosted delivery variant).
|
|
248
|
+
* - With `key`: `<baseUrl>/cdn-cgi/image/<options>/<source>` (URL-based transform).
|
|
249
|
+
*
|
|
250
|
+
* Pure and deterministic — usable from any handler.
|
|
251
|
+
*/
|
|
290
252
|
declare const buildImageDeliveryUrl: (options: ImageDeliveryUrlOptions) => string;
|
|
253
|
+
/**
|
|
254
|
+
* Parse a verified transform string (the `t` query value handed back by
|
|
255
|
+
* {@link verifySignedImageUrl}) back into the {@link TransformOptions} it was
|
|
256
|
+
* serialized from, so the Worker can apply exactly the signed transform via
|
|
257
|
+
* `ctx.images.transform(...)` without hand-writing the inverse encoding.
|
|
258
|
+
*
|
|
259
|
+
* The exact inverse of `serializeTransform` above — the two MUST evolve
|
|
260
|
+
* together (the round-trip test in
|
|
261
|
+
* `__tests__/images/signed-delivery-url.test.ts` pins the pairing). Throws a
|
|
262
|
+
* `TypeError` on an unknown key or an uncoercible value: the input is meant to
|
|
263
|
+
* be a string whose HMAC already verified, so a parse failure means
|
|
264
|
+
* encoder/decoder drift in the library, never user input — fail loud rather
|
|
265
|
+
* than silently un-binding the transform the signature protects.
|
|
266
|
+
*/
|
|
267
|
+
declare const parseSignedTransform: (t: string) => TransformOptions;
|
|
291
268
|
interface SignedImageUrlOptions {
|
|
292
269
|
/** Delivery / Worker origin the signed URL points at (e.g. `https://cdn.acme.test`). */
|
|
293
270
|
baseUrl: string;
|
|
@@ -298,41 +275,50 @@ interface SignedImageUrlOptions {
|
|
|
298
275
|
/** HMAC secret. MUST NOT be shared across tenants. */
|
|
299
276
|
secret: string;
|
|
300
277
|
/**
|
|
301
|
-
|
|
302
|
-
|
|
303
|
-
|
|
304
|
-
|
|
278
|
+
* Transform requested by this URL. Bound into the signature, so a client
|
|
279
|
+
* can't alter the render without invalidating it. The Worker should apply
|
|
280
|
+
* exactly this (verified) transform via `ctx.images.transform(...)`.
|
|
281
|
+
*/
|
|
305
282
|
transform?: TransformOptions;
|
|
306
283
|
}
|
|
307
284
|
/**
|
|
308
|
-
* Mint a Worker-signed image URL: `baseUrl` joined to `key`, plus `exp` (unix
|
|
309
|
-
* seconds), the serialized `t` (transform), and `sig` (base64url HMAC). The
|
|
310
|
-
* canonical binds host + key + expiry + transform.
|
|
311
|
-
*
|
|
312
|
-
* The Worker handling the route should call {@link verifySignedImageUrl} to
|
|
313
|
-
* validate before serving / transforming.
|
|
314
|
-
*/
|
|
285
|
+
* Mint a Worker-signed image URL: `baseUrl` joined to `key`, plus `exp` (unix
|
|
286
|
+
* seconds), the serialized `t` (transform), and `sig` (base64url HMAC). The
|
|
287
|
+
* canonical binds host + key + expiry + transform.
|
|
288
|
+
*
|
|
289
|
+
* The Worker handling the route should call {@link verifySignedImageUrl} to
|
|
290
|
+
* validate before serving / transforming.
|
|
291
|
+
*/
|
|
315
292
|
declare const buildSignedImageUrl: (options: SignedImageUrlOptions) => Promise<string>;
|
|
316
293
|
interface VerifyImageResult {
|
|
317
294
|
/** The verified image key (route pathname). */
|
|
318
295
|
key?: string;
|
|
319
296
|
/**
|
|
320
|
-
|
|
321
|
-
|
|
322
|
-
|
|
323
|
-
|
|
297
|
+
* Internal-only failure reason for server logs/diagnostics. **Do not echo to
|
|
298
|
+
* clients** — a precise reason ("expired" vs "bad_signature") is a signing
|
|
299
|
+
* oracle. Public responses should expose only `valid`.
|
|
300
|
+
*/
|
|
324
301
|
reason?: "bad_signature" | "expired" | "malformed";
|
|
325
302
|
/** The raw, verified transform string (the `t` query value), when present. */
|
|
326
303
|
transform?: string;
|
|
304
|
+
/**
|
|
305
|
+
* The verified transform decoded back into the options object to pass to
|
|
306
|
+
* `ctx.images.transform(...)` — {@link parseSignedTransform} applied to
|
|
307
|
+
* `transform`. Left `undefined` when `transform` is absent, and also when a
|
|
308
|
+
* genuinely signed transform carries a key this build does not know (an
|
|
309
|
+
* old URL minted before a key was renamed): the request stays `valid`, the
|
|
310
|
+
* raw `transform` is still returned, and the caller decides.
|
|
311
|
+
*/
|
|
312
|
+
transformOptions?: TransformOptions;
|
|
327
313
|
valid: boolean;
|
|
328
314
|
}
|
|
329
315
|
/**
|
|
330
|
-
* Verify a {@link buildSignedImageUrl} output. By default the signature is
|
|
331
|
-
* canonicalized against the inbound `url.host`; pass `expectedHost` for a
|
|
332
|
-
* CDN/host-rewrite topology where the Worker sees a different host than the one
|
|
333
|
-
* the URL was minted for.
|
|
334
|
-
*/
|
|
316
|
+
* Verify a {@link buildSignedImageUrl} output. By default the signature is
|
|
317
|
+
* canonicalized against the inbound `url.host`; pass `expectedHost` for a
|
|
318
|
+
* CDN/host-rewrite topology where the Worker sees a different host than the one
|
|
319
|
+
* the URL was minted for.
|
|
320
|
+
*/
|
|
335
321
|
declare const verifySignedImageUrl: (input: string | URL, secret: string, options?: {
|
|
336
322
|
expectedHost?: string;
|
|
337
323
|
}) => Promise<VerifyImageResult>;
|
|
338
|
-
export { type
|
|
324
|
+
export { type ImageCompositeMode, type ImageDeliveryUrlOptions, type ImageDrawOptions, type ImageInfoLike, type ImageInput, type ImageOutputFormat, type ImageOverlay, type ImageTransformationResultLike, type ImageTransformerLike, type Images, type ImagesBindingLike, type LunoraImagesOptions, type OutputOptions, type R2ObjectBodyLike, type SignedImageUrlOptions, type TransformOptions, type VerifyImageResult, buildImageDeliveryUrl, buildSignedImageUrl, createImages, parseSignedTransform, verifySignedImageUrl };
|