@nifrajs/image 3.3.0 → 4.0.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/backend.d.ts +3 -0
- package/dist/backend.d.ts.map +1 -1
- package/dist/backend.js +54 -4
- package/dist/backend.js.map +1 -1
- package/dist/dimensions.d.ts +7 -1
- package/dist/dimensions.d.ts.map +1 -1
- package/dist/dimensions.js +83 -4
- package/dist/dimensions.js.map +1 -1
- package/dist/og.d.ts +3 -1
- package/dist/og.d.ts.map +1 -1
- package/dist/og.js +57 -19
- package/dist/og.js.map +1 -1
- package/dist/resolve.d.ts +2 -2
- package/dist/server.js +14 -3
- package/dist/server.js.map +1 -1
- package/dist/sign.d.ts.map +1 -1
- package/dist/sign.js +3 -2
- package/dist/sign.js.map +1 -1
- package/package.json +4 -1
- package/src/backend.ts +56 -5
- package/src/dimensions.ts +86 -5
- package/src/og.ts +64 -19
- package/src/resolve.ts +2 -2
- package/src/server.ts +16 -3
- package/src/sign.ts +2 -1
package/dist/backend.d.ts
CHANGED
|
@@ -66,7 +66,10 @@ interface SharpInstance {
|
|
|
66
66
|
width?: number;
|
|
67
67
|
height?: number;
|
|
68
68
|
format?: string;
|
|
69
|
+
orientation?: number;
|
|
69
70
|
}>;
|
|
71
|
+
/** With no angle: turn the pixels upright by the EXIF orientation, which the output then drops. */
|
|
72
|
+
rotate(): SharpInstance;
|
|
70
73
|
resize(options: {
|
|
71
74
|
width: number;
|
|
72
75
|
withoutEnlargement?: boolean;
|
package/dist/backend.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"backend.d.ts","sourceRoot":"","sources":["../src/backend.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;GAWG;AAIH;mGACmG;AACnG,MAAM,MAAM,YAAY,GAAG,MAAM,GAAG,MAAM,GAAG,KAAK,CAAA;AAElD,eAAO,MAAM,YAAY,EAAE,MAAM,CAAC,YAAY,EAAE,MAAM,CAIrD,CAAA;AAED;kGACkG;AAClG,MAAM,WAAW,UAAU;IACzB,QAAQ,CAAC,KAAK,EAAE,MAAM,CAAA;IACtB,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAA;IACvB,+FAA+F;IAC/F,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAA;CACxB;AAED,MAAM,WAAW,WAAW;IAC1B,QAAQ,CAAC,KAAK,EAAE,UAAU,CAAA;IAC1B;mFAC+E;IAC/E,QAAQ,CAAC,KAAK,EAAE,MAAM,CAAA;IACtB,6DAA6D;IAC7D,QAAQ,CAAC,OAAO,EAAE,MAAM,CAAA;IACxB,QAAQ,CAAC,MAAM,EAAE,YAAY,CAAA;CAC9B;AAED,MAAM,WAAW,YAAY;IAC3B,QAAQ,CAAC,KAAK,EAAE,UAAU,CAAA;IAC1B,QAAQ,CAAC,WAAW,EAAE,MAAM,CAAA;IAC5B,QAAQ,CAAC,MAAM,EAAE,YAAY,CAAA;CAC9B;AAED;;;;GAIG;AACH,MAAM,WAAW,YAAY;IAC3B,sGAAsG;IACtG,KAAK,CAAC,KAAK,EAAE,UAAU,GAAG,OAAO,CAAC,UAAU,CAAC,CAAA;IAC7C,uFAAuF;IACvF,SAAS,CAAC,KAAK,EAAE,WAAW,GAAG,OAAO,CAAC,YAAY,CAAC,CAAA;CACrD;AAED;sDACsD;AACtD,qBAAa,oBAAqB,SAAQ,KAAK;IAE3C,QAAQ,CAAC,IAAI,EAAE,QAAQ,GAAG,WAAW,GAAG,aAAa;gBAA5C,IAAI,EAAE,QAAQ,GAAG,WAAW,GAAG,aAAa,EACrD,OAAO,EAAE,MAAM;CAKlB;AAmBD;;;GAGG;AACH,wBAAgB,eAAe,IAAI,YAAY,CA8B9C;AAiBD;iGACiG;AACjG,MAAM,MAAM,SAAS,GAAG,CAAC,KAAK,EAAE,UAAU,KAAK,aAAa,CAAA;AAC5D,UAAU,aAAa;IACrB,QAAQ,IAAI,OAAO,CAAC;QAAE,KAAK,CAAC,EAAE,MAAM,CAAC;QAAC,MAAM,CAAC,EAAE,MAAM,CAAC;QAAC,MAAM,CAAC,EAAE,MAAM,CAAA;KAAE,CAAC,CAAA;
|
|
1
|
+
{"version":3,"file":"backend.d.ts","sourceRoot":"","sources":["../src/backend.ts"],"names":[],"mappings":"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"}
|
package/dist/backend.js
CHANGED
|
@@ -10,7 +10,7 @@
|
|
|
10
10
|
* - {@link sharpImageBackend} - pass your `sharp` import. Node servers.
|
|
11
11
|
* - {@link wasmImageBackend} - pass WASM codecs (e.g. jSquash). Any runtime, including the edge.
|
|
12
12
|
*/
|
|
13
|
-
import { imageDimensions } from "./dimensions.js";
|
|
13
|
+
import { imageDimensions, jpegOrientation } from "./dimensions.js";
|
|
14
14
|
export const CONTENT_TYPE = {
|
|
15
15
|
webp: "image/webp",
|
|
16
16
|
jpeg: "image/jpeg",
|
|
@@ -93,7 +93,13 @@ export function sharpImageBackend(sharp) {
|
|
|
93
93
|
if (md.width === undefined || md.height === undefined) {
|
|
94
94
|
throw new ImageProcessingError("decode", "sharp could not read image dimensions");
|
|
95
95
|
}
|
|
96
|
-
|
|
96
|
+
// sharp reports the stored size; orientations 5-8 display it a quarter turn round.
|
|
97
|
+
const turned = (md.orientation ?? 1) >= 5;
|
|
98
|
+
return {
|
|
99
|
+
width: turned ? md.height : md.width,
|
|
100
|
+
height: turned ? md.width : md.height,
|
|
101
|
+
format: String(md.format ?? "").toLowerCase(),
|
|
102
|
+
};
|
|
97
103
|
}
|
|
98
104
|
catch (err) {
|
|
99
105
|
throw toSharpError(err);
|
|
@@ -101,8 +107,9 @@ export function sharpImageBackend(sharp) {
|
|
|
101
107
|
},
|
|
102
108
|
async transform({ bytes, width, quality, format }) {
|
|
103
109
|
try {
|
|
110
|
+
// Upright first: the encoder drops the EXIF orientation that told a viewer to turn it.
|
|
104
111
|
// `withoutEnlargement` is belt-and-braces: the handler already clamps width ≤ intrinsic.
|
|
105
|
-
const pipeline = sharp(bytes).resize({ width, withoutEnlargement: true });
|
|
112
|
+
const pipeline = sharp(bytes).rotate().resize({ width, withoutEnlargement: true });
|
|
106
113
|
const encoded = format === "webp"
|
|
107
114
|
? pipeline.webp({ quality })
|
|
108
115
|
: format === "jpeg"
|
|
@@ -129,6 +136,49 @@ function toSharpError(err) {
|
|
|
129
136
|
}
|
|
130
137
|
return new ImageProcessingError("decode", "sharp failed to process the image");
|
|
131
138
|
}
|
|
139
|
+
// --- WASM backend (edge-portable) --------------------------------------------------------------------
|
|
140
|
+
/**
|
|
141
|
+
* For EXIF orientations 2-8, the stored pixel each displayed pixel `(x, y)` comes from, as
|
|
142
|
+
* `sx = a*x + b*y + c*(w-1)` and `sy = d*x + e*y + f*(h-1)`: `[a, b, c, d, e, f]`.
|
|
143
|
+
*/
|
|
144
|
+
const ORIENTATION_MAP = {
|
|
145
|
+
2: [-1, 0, 1, 0, 1, 0],
|
|
146
|
+
3: [-1, 0, 1, 0, -1, 1],
|
|
147
|
+
4: [1, 0, 0, 0, -1, 1],
|
|
148
|
+
5: [0, 1, 0, 1, 0, 0],
|
|
149
|
+
6: [0, 1, 0, -1, 0, 1],
|
|
150
|
+
7: [0, -1, 1, -1, 0, 1],
|
|
151
|
+
8: [0, -1, 1, 1, 0, 0],
|
|
152
|
+
};
|
|
153
|
+
/**
|
|
154
|
+
* `image` turned upright by the EXIF orientation of the JPEG it was decoded from. The encoders write no
|
|
155
|
+
* EXIF, so pixels left as stored would display turned. A codec that already turned a quarter-turn image
|
|
156
|
+
* (it decoded to the displayed size) is left as it is.
|
|
157
|
+
*/
|
|
158
|
+
function upright(image, source) {
|
|
159
|
+
const map = ORIENTATION_MAP[jpegOrientation(source)];
|
|
160
|
+
if (map === undefined)
|
|
161
|
+
return image;
|
|
162
|
+
const [a = 0, b = 0, c = 0, d = 0, e = 0, f = 0] = map;
|
|
163
|
+
const { width: w, height: h, data } = image;
|
|
164
|
+
const quarter = a === 0;
|
|
165
|
+
const shown = imageDimensions(source);
|
|
166
|
+
if (quarter && shown !== null && shown.width === w && shown.height === h)
|
|
167
|
+
return image;
|
|
168
|
+
const outWidth = quarter ? h : w;
|
|
169
|
+
const outHeight = quarter ? w : h;
|
|
170
|
+
const out = new Uint8Array(data.length);
|
|
171
|
+
for (let y = 0, o = 0; y < outHeight; y++) {
|
|
172
|
+
for (let x = 0; x < outWidth; x++, o += 4) {
|
|
173
|
+
const i = ((d * x + e * y + f * (h - 1)) * w + (a * x + b * y + c * (w - 1))) * 4;
|
|
174
|
+
out[o] = data[i] ?? 0;
|
|
175
|
+
out[o + 1] = data[i + 1] ?? 0;
|
|
176
|
+
out[o + 2] = data[i + 2] ?? 0;
|
|
177
|
+
out[o + 3] = data[i + 3] ?? 0;
|
|
178
|
+
}
|
|
179
|
+
}
|
|
180
|
+
return { data: out, width: outWidth, height: outHeight };
|
|
181
|
+
}
|
|
132
182
|
/**
|
|
133
183
|
* {@link ImageBackend} backed by injected WASM codecs - the only backend that runs on the **edge**
|
|
134
184
|
* (Workers / Vercel-Edge / Deno-Deploy), where neither `Bun.Image` nor sharp exists. `probe` reads the
|
|
@@ -152,7 +202,7 @@ export function wasmImageBackend(codecs) {
|
|
|
152
202
|
},
|
|
153
203
|
async transform({ bytes, width, quality, format }) {
|
|
154
204
|
try {
|
|
155
|
-
const decoded = await codecs.decode(bytes);
|
|
205
|
+
const decoded = upright(await codecs.decode(bytes), bytes);
|
|
156
206
|
// Aspect-preserving: the handler hands a width already clamped to the intrinsic width.
|
|
157
207
|
const height = Math.max(1, Math.round((decoded.height * width) / decoded.width));
|
|
158
208
|
const resized = width === decoded.width ? decoded : await codecs.resize(decoded, width, height);
|
package/dist/backend.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"backend.js","sourceRoot":"","sources":["../src/backend.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;GAWG;AAEH,OAAO,EAAE,eAAe,EAAE,MAAM,iBAAiB,CAAA;
|
|
1
|
+
{"version":3,"file":"backend.js","sourceRoot":"","sources":["../src/backend.ts"],"names":[],"mappings":"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"}
|
package/dist/dimensions.d.ts
CHANGED
|
@@ -1,7 +1,8 @@
|
|
|
1
1
|
/**
|
|
2
2
|
* Read an image's intrinsic dimensions from its file **header**, in pure JS - no decode, no codec, no
|
|
3
3
|
* dependency. Supports PNG, JPEG, GIF, and WebP (VP8/VP8L/VP8X). Used to give `<Image>` CLS-safe
|
|
4
|
-
* `width`/`height` (build-time tooling can pre-read them into a manifest).
|
|
4
|
+
* `width`/`height` (build-time tooling can pre-read them into a manifest). A JPEG's are the size it is
|
|
5
|
+
* displayed at: its EXIF orientation applied, as a browser applies it.
|
|
5
6
|
*/
|
|
6
7
|
export type ImageFormat = "png" | "jpeg" | "gif" | "webp";
|
|
7
8
|
export interface ImageInfo {
|
|
@@ -9,6 +10,11 @@ export interface ImageInfo {
|
|
|
9
10
|
readonly height: number;
|
|
10
11
|
readonly format: ImageFormat;
|
|
11
12
|
}
|
|
13
|
+
/**
|
|
14
|
+
* The EXIF orientation (1-8) a JPEG declares - how its stored pixels are turned for display - or `1`
|
|
15
|
+
* for upright, for another format, or for an unreadable header.
|
|
16
|
+
*/
|
|
17
|
+
export declare function jpegOrientation(bytes: Uint8Array): number;
|
|
12
18
|
/** Parse intrinsic dimensions + format from image header bytes, or `null` if unrecognized/too short. */
|
|
13
19
|
export declare function imageDimensions(bytes: Uint8Array): ImageInfo | null;
|
|
14
20
|
/**
|
package/dist/dimensions.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"dimensions.d.ts","sourceRoot":"","sources":["../src/dimensions.ts"],"names":[],"mappings":"AAAA
|
|
1
|
+
{"version":3,"file":"dimensions.d.ts","sourceRoot":"","sources":["../src/dimensions.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AACH,MAAM,MAAM,WAAW,GAAG,KAAK,GAAG,MAAM,GAAG,KAAK,GAAG,MAAM,CAAA;AAEzD,MAAM,WAAW,SAAS;IACxB,QAAQ,CAAC,KAAK,EAAE,MAAM,CAAA;IACtB,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAA;IACvB,QAAQ,CAAC,MAAM,EAAE,WAAW,CAAA;CAC7B;AAiGD;;;GAGG;AACH,wBAAgB,eAAe,CAAC,KAAK,EAAE,UAAU,GAAG,MAAM,CAMzD;AAkCD,wGAAwG;AACxG,wBAAgB,eAAe,CAAC,KAAK,EAAE,UAAU,GAAG,SAAS,GAAG,IAAI,CAInE;AAED;;;;GAIG;AACH,wBAAsB,mBAAmB,CACvC,MAAM,EAAE;IAAE,WAAW,IAAI,OAAO,CAAC,WAAW,CAAC,CAAC;IAAC,MAAM,CAAC,EAAE,MAAM,cAAc,CAAC,UAAU,CAAC,CAAA;CAAE,EAC1F,QAAQ,SAAS,GAChB,OAAO,CAAC,SAAS,GAAG,IAAI,CAAC,CAyC3B"}
|
package/dist/dimensions.js
CHANGED
|
@@ -4,28 +4,107 @@ const png = (b, dv) => {
|
|
|
4
4
|
return null;
|
|
5
5
|
return { width: dv.getUint32(16), height: dv.getUint32(20), format: "png" };
|
|
6
6
|
};
|
|
7
|
+
/** The first image descriptor's width/height, past the global color table and any extensions. */
|
|
8
|
+
const gifFirstFrame = (b, dv) => {
|
|
9
|
+
const packed = b[10] ?? 0;
|
|
10
|
+
let offset = 13 + (packed & 0x80 ? 3 * 2 ** ((packed & 0x07) + 1) : 0);
|
|
11
|
+
while (offset < b.length) {
|
|
12
|
+
const block = b[offset];
|
|
13
|
+
if (block === 0x2c) {
|
|
14
|
+
if (offset + 9 > b.length)
|
|
15
|
+
return undefined;
|
|
16
|
+
return { width: dv.getUint16(offset + 5, true), height: dv.getUint16(offset + 7, true) };
|
|
17
|
+
}
|
|
18
|
+
if (block !== 0x21)
|
|
19
|
+
return undefined;
|
|
20
|
+
// An extension: label, then data sub-blocks (a length byte each) to a zero-length terminator.
|
|
21
|
+
offset += 2;
|
|
22
|
+
while (offset < b.length && b[offset] !== 0)
|
|
23
|
+
offset += (b[offset] ?? 0) + 1;
|
|
24
|
+
offset += 1;
|
|
25
|
+
}
|
|
26
|
+
return undefined;
|
|
27
|
+
};
|
|
7
28
|
const gif = (b, dv) => {
|
|
8
29
|
// 'GIF', then the logical-screen width/height as little-endian uint16 @6/@8.
|
|
9
30
|
if (b.length < 10 || b[0] !== 0x47 || b[1] !== 0x49 || b[2] !== 0x46)
|
|
10
31
|
return null;
|
|
11
|
-
|
|
32
|
+
// A browser draws a GIF at the larger of its logical screen and its first frame, per side - a
|
|
33
|
+
// 1x1 (or 0x0) screen holding a 10x20 frame displays 10x20.
|
|
34
|
+
const frame = gifFirstFrame(b, dv);
|
|
35
|
+
return {
|
|
36
|
+
width: Math.max(dv.getUint16(6, true), frame?.width ?? 0),
|
|
37
|
+
height: Math.max(dv.getUint16(8, true), frame?.height ?? 0),
|
|
38
|
+
format: "gif",
|
|
39
|
+
};
|
|
12
40
|
};
|
|
13
|
-
|
|
41
|
+
/** The EXIF orientation (1-8) an APP1 segment's TIFF block declares, read within `[start, end)`. */
|
|
42
|
+
const exifOrientation = (b, dv, start, end) => {
|
|
43
|
+
// "Exif\0\0", then a TIFF header: byte order ("II" little / "MM" big), 42, IFD0's offset.
|
|
44
|
+
const exif = [0x45, 0x78, 0x69, 0x66, 0, 0];
|
|
45
|
+
if (start + 14 > end || exif.some((byte, i) => b[start + i] !== byte))
|
|
46
|
+
return 1;
|
|
47
|
+
const tiff = start + 6;
|
|
48
|
+
const little = b[tiff] === 0x49 && b[tiff + 1] === 0x49;
|
|
49
|
+
if (!little && !(b[tiff] === 0x4d && b[tiff + 1] === 0x4d))
|
|
50
|
+
return 1;
|
|
51
|
+
if (dv.getUint16(tiff + 2, little) !== 42)
|
|
52
|
+
return 1;
|
|
53
|
+
const ifd = tiff + dv.getUint32(tiff + 4, little);
|
|
54
|
+
if (ifd + 2 > end)
|
|
55
|
+
return 1;
|
|
56
|
+
for (let i = 0, count = dv.getUint16(ifd, little); i < count; i++) {
|
|
57
|
+
const entry = ifd + 2 + i * 12;
|
|
58
|
+
if (entry + 12 > end)
|
|
59
|
+
return 1;
|
|
60
|
+
if (dv.getUint16(entry, little) !== 0x0112)
|
|
61
|
+
continue;
|
|
62
|
+
const orientation = dv.getUint16(entry + 8, little);
|
|
63
|
+
return orientation >= 1 && orientation <= 8 ? orientation : 1;
|
|
64
|
+
}
|
|
65
|
+
return 1;
|
|
66
|
+
};
|
|
67
|
+
/** A JPEG's stored frame size and its EXIF orientation, from the segments before the frame. */
|
|
68
|
+
const jpegFrame = (b, dv) => {
|
|
14
69
|
if (b.length < 4 || b[0] !== 0xff || b[1] !== 0xd8)
|
|
15
70
|
return null;
|
|
16
71
|
let offset = 2;
|
|
72
|
+
let orientation = 1;
|
|
17
73
|
while (offset + 9 < b.length) {
|
|
18
74
|
if (dv.getUint8(offset) !== 0xff)
|
|
19
75
|
return null; // not aligned on a marker → malformed
|
|
20
76
|
const marker = dv.getUint8(offset + 1);
|
|
21
77
|
// SOF0..SOF15 carry the frame's height/width - except DHT(c4)/DNL(c8)/DAC(cc).
|
|
22
78
|
if (marker >= 0xc0 && marker <= 0xcf && marker !== 0xc4 && marker !== 0xc8 && marker !== 0xcc) {
|
|
23
|
-
return { height: dv.getUint16(offset + 5), width: dv.getUint16(offset + 7),
|
|
79
|
+
return { height: dv.getUint16(offset + 5), width: dv.getUint16(offset + 7), orientation };
|
|
80
|
+
}
|
|
81
|
+
const next = offset + 2 + dv.getUint16(offset + 2); // skip this segment (2-byte marker + length)
|
|
82
|
+
if (marker === 0xe1 && orientation === 1) {
|
|
83
|
+
orientation = exifOrientation(b, dv, offset + 4, Math.min(next, b.length));
|
|
24
84
|
}
|
|
25
|
-
offset
|
|
85
|
+
offset = next;
|
|
26
86
|
}
|
|
27
87
|
return null;
|
|
28
88
|
};
|
|
89
|
+
const jpeg = (b, dv) => {
|
|
90
|
+
const frame = jpegFrame(b, dv);
|
|
91
|
+
if (frame === null)
|
|
92
|
+
return null;
|
|
93
|
+
// A browser draws a JPEG turned by its EXIF orientation, and 5-8 turn it a quarter: the sides swap.
|
|
94
|
+
return frame.orientation >= 5
|
|
95
|
+
? { width: frame.height, height: frame.width, format: "jpeg" }
|
|
96
|
+
: { width: frame.width, height: frame.height, format: "jpeg" };
|
|
97
|
+
};
|
|
98
|
+
/**
|
|
99
|
+
* The EXIF orientation (1-8) a JPEG declares - how its stored pixels are turned for display - or `1`
|
|
100
|
+
* for upright, for another format, or for an unreadable header.
|
|
101
|
+
*/
|
|
102
|
+
export function jpegOrientation(bytes) {
|
|
103
|
+
if (bytes.length < 4)
|
|
104
|
+
return 1;
|
|
105
|
+
return (jpegFrame(bytes, new DataView(bytes.buffer, bytes.byteOffset, bytes.byteLength))?.orientation ??
|
|
106
|
+
1);
|
|
107
|
+
}
|
|
29
108
|
const webp = (b, dv) => {
|
|
30
109
|
// 'RIFF' .... 'WEBP' then a VP8 / VP8L / VP8X chunk.
|
|
31
110
|
if (b.length < 30 || b[0] !== 0x52 || b[1] !== 0x49 || b[8] !== 0x57 || b[9] !== 0x45)
|
package/dist/dimensions.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"dimensions.js","sourceRoot":"","sources":["../src/dimensions.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"dimensions.js","sourceRoot":"","sources":["../src/dimensions.ts"],"names":[],"mappings":"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"}
|
package/dist/og.d.ts
CHANGED
|
@@ -45,7 +45,9 @@ export interface OgImageOptions {
|
|
|
45
45
|
export declare function renderOgImage(options: OgImageOptions): string;
|
|
46
46
|
/**
|
|
47
47
|
* Build a cacheable OG image response. GET and HEAD are supported; conditional requests short-circuit
|
|
48
|
-
* rasterization, so a crawler revalidation never repeats expensive codec work.
|
|
48
|
+
* rasterization, so a crawler revalidation never repeats expensive codec work. The ETag still names the
|
|
49
|
+
* bytes a rasterizer produced: a revalidation is answered from the tag this process last sent for the
|
|
50
|
+
* same SVG and rasterizer, and rasterizes only when it has none.
|
|
49
51
|
*/
|
|
50
52
|
export declare function ogImageResponse(options: OgImageOptions, request?: Request): Promise<Response>;
|
|
51
53
|
//# sourceMappingURL=og.d.ts.map
|
package/dist/og.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"og.d.ts","sourceRoot":"","sources":["../src/og.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;GAqBG;AAEH,MAAM,WAAW,iBAAiB;IAChC,QAAQ,CAAC,KAAK,EAAE,UAAU,CAAA;IAC1B,QAAQ,CAAC,WAAW,EAAE,MAAM,CAAA;CAC7B;AAED,MAAM,MAAM,iBAAiB,GAAG,CAAC,GAAG,EAAE,MAAM,KAAK,iBAAiB,GAAG,OAAO,CAAC,iBAAiB,CAAC,CAAA;AAE/F,MAAM,WAAW,cAAc;IAC7B,QAAQ,CAAC,KAAK,EAAE,MAAM,CAAA;IACtB,QAAQ,CAAC,WAAW,CAAC,EAAE,MAAM,CAAA;IAC7B,QAAQ,CAAC,OAAO,CAAC,EAAE,MAAM,CAAA;IACzB,QAAQ,CAAC,KAAK,CAAC,EAAE,MAAM,CAAA;IACvB,QAAQ,CAAC,MAAM,CAAC,EAAE,MAAM,CAAA;IACxB,QAAQ,CAAC,UAAU,CAAC,EAAE,MAAM,CAAA;IAC5B,QAAQ,CAAC,UAAU,CAAC,EAAE,MAAM,CAAA;IAC5B,QAAQ,CAAC,MAAM,CAAC,EAAE,MAAM,CAAA;IACxB,uEAAuE;IACvE,QAAQ,CAAC,UAAU,CAAC,EAAE,iBAAiB,CAAA;IACvC,4DAA4D;IAC5D,QAAQ,CAAC,WAAW,CAAC,EAAE,MAAM,CAAA;IAC7B,0EAA0E;IAC1E,QAAQ,CAAC,QAAQ,CAAC,EAAE,MAAM,CAAA;CAC3B;
|
|
1
|
+
{"version":3,"file":"og.d.ts","sourceRoot":"","sources":["../src/og.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;GAqBG;AAEH,MAAM,WAAW,iBAAiB;IAChC,QAAQ,CAAC,KAAK,EAAE,UAAU,CAAA;IAC1B,QAAQ,CAAC,WAAW,EAAE,MAAM,CAAA;CAC7B;AAED,MAAM,MAAM,iBAAiB,GAAG,CAAC,GAAG,EAAE,MAAM,KAAK,iBAAiB,GAAG,OAAO,CAAC,iBAAiB,CAAC,CAAA;AAE/F,MAAM,WAAW,cAAc;IAC7B,QAAQ,CAAC,KAAK,EAAE,MAAM,CAAA;IACtB,QAAQ,CAAC,WAAW,CAAC,EAAE,MAAM,CAAA;IAC7B,QAAQ,CAAC,OAAO,CAAC,EAAE,MAAM,CAAA;IACzB,QAAQ,CAAC,KAAK,CAAC,EAAE,MAAM,CAAA;IACvB,QAAQ,CAAC,MAAM,CAAC,EAAE,MAAM,CAAA;IACxB,QAAQ,CAAC,UAAU,CAAC,EAAE,MAAM,CAAA;IAC5B,QAAQ,CAAC,UAAU,CAAC,EAAE,MAAM,CAAA;IAC5B,QAAQ,CAAC,MAAM,CAAC,EAAE,MAAM,CAAA;IACxB,uEAAuE;IACvE,QAAQ,CAAC,UAAU,CAAC,EAAE,iBAAiB,CAAA;IACvC,4DAA4D;IAC5D,QAAQ,CAAC,WAAW,CAAC,EAAE,MAAM,CAAA;IAC7B,0EAA0E;IAC1E,QAAQ,CAAC,QAAQ,CAAC,EAAE,MAAM,CAAA;CAC3B;AA8GD,+EAA+E;AAC/E,wBAAgB,aAAa,CAAC,OAAO,EAAE,cAAc,GAAG,MAAM,CAmB7D;AAiDD;;;;;GAKG;AACH,wBAAsB,eAAe,CACnC,OAAO,EAAE,cAAc,EACvB,OAAO,CAAC,EAAE,OAAO,GAChB,OAAO,CAAC,QAAQ,CAAC,CAgDnB"}
|
package/dist/og.js
CHANGED
|
@@ -25,18 +25,31 @@ const DEFAULT_HEIGHT = 630;
|
|
|
25
25
|
const DEFAULT_MAX_AGE = 31_536_000;
|
|
26
26
|
const DEFAULT_MAX_BYTES = 10 * 1024 * 1024;
|
|
27
27
|
const COLOR = /^(?:#[0-9a-fA-F]{3,8}|[A-Za-z]{1,32})$/;
|
|
28
|
+
/**
|
|
29
|
+
* CMS-shaped text as the card draws it: line breaks and tabs as spaces, an empty optional field as
|
|
30
|
+
* absent, and text past `max` characters cut with an ellipsis (the card shows a few lines anyway).
|
|
31
|
+
* Only a missing title and a control character an SVG cannot hold are errors.
|
|
32
|
+
*/
|
|
28
33
|
function boundedText(value, name, max, required = false) {
|
|
29
|
-
if (value
|
|
34
|
+
if (typeof value !== "string" && (value !== undefined || required)) {
|
|
35
|
+
throw new TypeError(`og image: ${name} must be a string`);
|
|
36
|
+
}
|
|
37
|
+
const text = (value ?? "").replace(/[\t\n\r]+/g, " ").trim();
|
|
38
|
+
if (text === "") {
|
|
39
|
+
if (required)
|
|
40
|
+
throw new TypeError(`og image: ${name} must not be empty`);
|
|
30
41
|
return "";
|
|
31
|
-
if (typeof value !== "string" || value.length === 0 || value.length > max) {
|
|
32
|
-
throw new TypeError(`og image: ${name} must be a non-empty string of at most ${max} characters`);
|
|
33
42
|
}
|
|
34
|
-
for (let index = 0; index <
|
|
35
|
-
const code =
|
|
43
|
+
for (let index = 0; index < text.length; index++) {
|
|
44
|
+
const code = text.charCodeAt(index);
|
|
36
45
|
if (code <= 31 || code === 127)
|
|
37
46
|
throw new TypeError(`og image: ${name} contains a control character`);
|
|
38
47
|
}
|
|
39
|
-
|
|
48
|
+
if (text.length <= max)
|
|
49
|
+
return text;
|
|
50
|
+
// Never cut a surrogate pair in half.
|
|
51
|
+
const cut = /[\uD800-\uDBFF]$/.test(text.slice(0, max - 1)) ? max - 2 : max - 1;
|
|
52
|
+
return `${text.slice(0, cut).trimEnd()}\u2026`;
|
|
40
53
|
}
|
|
41
54
|
function dimension(value, name, fallback) {
|
|
42
55
|
const resolved = value ?? fallback;
|
|
@@ -143,9 +156,22 @@ function contentType(value) {
|
|
|
143
156
|
}
|
|
144
157
|
return value;
|
|
145
158
|
}
|
|
159
|
+
const RASTERIZED_TAGS_MAX = 512;
|
|
160
|
+
const rasterizedTags = new WeakMap();
|
|
161
|
+
/** Remember a card's tag, oldest out first past {@link RASTERIZED_TAGS_MAX} per rasterizer. */
|
|
162
|
+
function rememberTag(rasterizer, svgHash, tag) {
|
|
163
|
+
const tags = rasterizedTags.get(rasterizer) ?? new Map();
|
|
164
|
+
rasterizedTags.set(rasterizer, tags);
|
|
165
|
+
tags.delete(svgHash);
|
|
166
|
+
tags.set(svgHash, tag);
|
|
167
|
+
if (tags.size > RASTERIZED_TAGS_MAX)
|
|
168
|
+
tags.delete(tags.keys().next().value ?? svgHash);
|
|
169
|
+
}
|
|
146
170
|
/**
|
|
147
171
|
* Build a cacheable OG image response. GET and HEAD are supported; conditional requests short-circuit
|
|
148
|
-
* rasterization, so a crawler revalidation never repeats expensive codec work.
|
|
172
|
+
* rasterization, so a crawler revalidation never repeats expensive codec work. The ETag still names the
|
|
173
|
+
* bytes a rasterizer produced: a revalidation is answered from the tag this process last sent for the
|
|
174
|
+
* same SVG and rasterizer, and rasterizes only when it has none.
|
|
149
175
|
*/
|
|
150
176
|
export async function ogImageResponse(options, request) {
|
|
151
177
|
if (request !== undefined && request.method !== "GET" && request.method !== "HEAD") {
|
|
@@ -154,13 +180,29 @@ export async function ogImageResponse(options, request) {
|
|
|
154
180
|
const cacheMaxAge = nonNegativeInteger(options.cacheMaxAge, "cacheMaxAge", DEFAULT_MAX_AGE);
|
|
155
181
|
const maxBytes = nonNegativeInteger(options.maxBytes, "maxBytes", DEFAULT_MAX_BYTES);
|
|
156
182
|
const svg = renderOgImage(options);
|
|
183
|
+
const responseHeaders = (tag) => new Headers({
|
|
184
|
+
"cache-control": `public, max-age=${cacheMaxAge}, immutable`,
|
|
185
|
+
"content-type": `${tag.contentType}${tag.contentType === "image/svg+xml" ? "; charset=utf-8" : ""}`,
|
|
186
|
+
etag: tag.etag,
|
|
187
|
+
"content-length": String(tag.length),
|
|
188
|
+
"x-content-type-options": "nosniff",
|
|
189
|
+
});
|
|
190
|
+
const { rasterizer } = options;
|
|
191
|
+
let svgHash;
|
|
192
|
+
if (rasterizer !== undefined) {
|
|
193
|
+
svgHash = await sha256(new TextEncoder().encode(svg));
|
|
194
|
+
const known = rasterizedTags.get(rasterizer)?.get(svgHash);
|
|
195
|
+
if (known !== undefined && ifNoneMatch(request, known.etag)) {
|
|
196
|
+
return new Response(null, { status: 304, headers: responseHeaders(known) });
|
|
197
|
+
}
|
|
198
|
+
}
|
|
157
199
|
let bytes;
|
|
158
200
|
let mediaType = "image/svg+xml";
|
|
159
201
|
try {
|
|
160
|
-
if (
|
|
202
|
+
if (rasterizer === undefined)
|
|
161
203
|
bytes = new TextEncoder().encode(svg);
|
|
162
204
|
else {
|
|
163
|
-
const rasterized = await
|
|
205
|
+
const rasterized = await rasterizer(svg);
|
|
164
206
|
if (!(rasterized.bytes instanceof Uint8Array) || rasterized.bytes.byteLength > maxBytes) {
|
|
165
207
|
throw new TypeError("og image: rasterizer output exceeds maxBytes");
|
|
166
208
|
}
|
|
@@ -174,18 +216,14 @@ export async function ogImageResponse(options, request) {
|
|
|
174
216
|
// Hash the bytes actually sent. A rasterizer may produce different pixels for the same SVG
|
|
175
217
|
// (for example after a backend/font update), so hashing only the source would make a conditional
|
|
176
218
|
// request incorrectly return 304 for a changed representation.
|
|
177
|
-
const
|
|
178
|
-
|
|
179
|
-
|
|
180
|
-
|
|
181
|
-
|
|
182
|
-
"content-length": String(bytes.byteLength),
|
|
183
|
-
"x-content-type-options": "nosniff",
|
|
184
|
-
});
|
|
185
|
-
if (ifNoneMatch(request, etag))
|
|
219
|
+
const tag = { etag: `"${await sha256(bytes)}"`, contentType: mediaType, length: bytes.byteLength };
|
|
220
|
+
if (rasterizer !== undefined && svgHash !== undefined)
|
|
221
|
+
rememberTag(rasterizer, svgHash, tag);
|
|
222
|
+
const headers = responseHeaders(tag);
|
|
223
|
+
if (ifNoneMatch(request, tag.etag))
|
|
186
224
|
return new Response(null, { status: 304, headers });
|
|
187
225
|
if (request?.method === "HEAD")
|
|
188
226
|
return new Response(null, { status: 200, headers });
|
|
189
|
-
return new Response(bytes, { status: 200, headers });
|
|
227
|
+
return new Response(bytes.slice(), { status: 200, headers });
|
|
190
228
|
}
|
|
191
229
|
//# sourceMappingURL=og.js.map
|
package/dist/og.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"og.js","sourceRoot":"","sources":["../src/og.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;GAqBG;AA0BH,MAAM,aAAa,GAAG,IAAI,CAAA;AAC1B,MAAM,cAAc,GAAG,GAAG,CAAA;AAC1B,MAAM,eAAe,GAAG,UAAU,CAAA;AAClC,MAAM,iBAAiB,GAAG,EAAE,GAAG,IAAI,GAAG,IAAI,CAAA;AAC1C,MAAM,KAAK,GAAG,wCAAwC,CAAA;AAEtD,SAAS,WAAW,CAClB,KAAyB,EACzB,IAAY,EACZ,GAAW,EACX,QAAQ,GAAG,KAAK;IAEhB,IAAI,KAAK,KAAK,
|
|
1
|
+
{"version":3,"file":"og.js","sourceRoot":"","sources":["../src/og.ts"],"names":[],"mappings":"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"}
|
package/dist/resolve.d.ts
CHANGED
|
@@ -30,8 +30,8 @@ export interface SelfHostedLoaderOptions {
|
|
|
30
30
|
* HMAC secret for **signed URLs**. When set, each URL gets a stable `&s=` signature and the handler
|
|
31
31
|
* must be configured with the SAME `signing.secret` - it then rejects any unsigned/forged `(src, w, q)`,
|
|
32
32
|
* shutting down resize-bombing. ⚠️ The signer holds the secret, so a loader created with it is
|
|
33
|
-
* **server-only** - inject it like a session secret (from `env`), never
|
|
34
|
-
*
|
|
33
|
+
* **server-only** - inject it like a session secret (from `env`) in backend code, never a page or
|
|
34
|
+
* `frontend/` module. Signatures are stable (no expiry), so SSR-signed URLs hydrate + cache identically.
|
|
35
35
|
*/
|
|
36
36
|
readonly secret?: string;
|
|
37
37
|
}
|
package/dist/server.js
CHANGED
|
@@ -116,17 +116,27 @@ async function handle(req, cfg) {
|
|
|
116
116
|
// 2b. Signed-URL enforcement (when configured): reject any request we didn't mint. Verifies the
|
|
117
117
|
// `&s=` HMAC over the raw (src, w, q[, exp]) - exactly what the loader/`signImageUrl` signed -
|
|
118
118
|
// and the expiry. Done before the ETag/fetch so unsigned/forged requests cost nothing.
|
|
119
|
+
let signedCacheControl;
|
|
119
120
|
if (cfg.signing !== null) {
|
|
120
121
|
const sig = url.searchParams.get("s");
|
|
122
|
+
const exp = url.searchParams.get("exp");
|
|
121
123
|
const ok = sig !== null &&
|
|
122
124
|
verifyImageParams(cfg.signing.secret, {
|
|
123
125
|
src,
|
|
124
126
|
w: url.searchParams.get("w") ?? "",
|
|
125
127
|
q: qParam ?? undefined,
|
|
126
|
-
exp:
|
|
128
|
+
exp: exp ?? undefined,
|
|
127
129
|
}, sig, Math.floor(Date.now() / 1000));
|
|
128
130
|
if (!ok)
|
|
129
131
|
return errorResponse(403, "invalid_signature");
|
|
132
|
+
// An expiring bearer URL must never become a longer-lived shared-cache entry than its
|
|
133
|
+
// authorization. Keep it private as well: an intermediary must not replay the transformed bytes
|
|
134
|
+
// after the signature expires without re-running this check.
|
|
135
|
+
if (exp !== null) {
|
|
136
|
+
const expiresAt = Number(exp);
|
|
137
|
+
const remaining = Math.max(0, expiresAt - Math.floor(Date.now() / 1000));
|
|
138
|
+
signedCacheControl = `private, max-age=${Math.min(cfg.cacheMaxAge, remaining)}`;
|
|
139
|
+
}
|
|
130
140
|
}
|
|
131
141
|
// 3/4. Admission precedes source reads so queued requests do not retain large buffers. It is a
|
|
132
142
|
// separate, wider lane from the codec one below: a remote source is a network wait, and letting
|
|
@@ -174,7 +184,8 @@ async function handle(req, cfg) {
|
|
|
174
184
|
// falsely return 304 when a mutable local/remote source changes at the same URL.
|
|
175
185
|
const etag = `"${await sha256(out.bytes)}"`;
|
|
176
186
|
const headers = new Headers({
|
|
177
|
-
"Cache-Control":
|
|
187
|
+
"Cache-Control": signedCacheControl ??
|
|
188
|
+
`public, max-age=${cfg.cacheMaxAge}${cfg.immutable ? ", immutable" : ""}`,
|
|
178
189
|
ETag: etag,
|
|
179
190
|
Vary: "Accept",
|
|
180
191
|
});
|
|
@@ -186,7 +197,7 @@ async function handle(req, cfg) {
|
|
|
186
197
|
// HEAD: identical headers, no body.
|
|
187
198
|
if (req.method === "HEAD")
|
|
188
199
|
return new Response(null, { status: 200, headers });
|
|
189
|
-
return new Response(out.bytes, { status: 200, headers });
|
|
200
|
+
return new Response(out.bytes.slice(), { status: 200, headers });
|
|
190
201
|
}
|
|
191
202
|
catch (err) {
|
|
192
203
|
if (err instanceof ImageProcessingError) {
|
package/dist/server.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"server.js","sourceRoot":"","sources":["../src/server.ts"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"server.js","sourceRoot":"","sources":["../src/server.ts"],"names":[],"mappings":"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"}
|
package/dist/sign.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"sign.d.ts","sourceRoot":"","sources":["../src/sign.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AAgHH;sEACsE;AACtE,wBAAgB,aAAa,CAAC,GAAG,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,GAAG,MAAM,CAElE;AAiBD;;gCAEgC;AAChC,MAAM,WAAW,mBAAmB;IAClC,QAAQ,CAAC,GAAG,EAAE,MAAM,CAAA;IACpB,QAAQ,CAAC,CAAC,EAAE,MAAM,CAAA;IAGlB,QAAQ,CAAC,CAAC,CAAC,EAAE,MAAM,GAAG,SAAS,CAAA;IAC/B,QAAQ,CAAC,GAAG,CAAC,EAAE,MAAM,GAAG,SAAS,CAAA;CAClC;AASD;8EAC8E;AAC9E,wBAAgB,eAAe,CAAC,MAAM,EAAE,MAAM,EAAE,KAAK,EAAE,mBAAmB,GAAG,MAAM,CAOlF;AAED;;;GAGG;AACH,wBAAgB,iBAAiB,CAC/B,MAAM,EAAE,MAAM,EACd,KAAK,EAAE,mBAAmB,EAC1B,SAAS,EAAE,MAAM,EACjB,UAAU,EAAE,MAAM,GACjB,OAAO,
|
|
1
|
+
{"version":3,"file":"sign.d.ts","sourceRoot":"","sources":["../src/sign.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AAgHH;sEACsE;AACtE,wBAAgB,aAAa,CAAC,GAAG,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,GAAG,MAAM,CAElE;AAiBD;;gCAEgC;AAChC,MAAM,WAAW,mBAAmB;IAClC,QAAQ,CAAC,GAAG,EAAE,MAAM,CAAA;IACpB,QAAQ,CAAC,CAAC,EAAE,MAAM,CAAA;IAGlB,QAAQ,CAAC,CAAC,CAAC,EAAE,MAAM,GAAG,SAAS,CAAA;IAC/B,QAAQ,CAAC,GAAG,CAAC,EAAE,MAAM,GAAG,SAAS,CAAA;CAClC;AASD;8EAC8E;AAC9E,wBAAgB,eAAe,CAAC,MAAM,EAAE,MAAM,EAAE,KAAK,EAAE,mBAAmB,GAAG,MAAM,CAOlF;AAED;;;GAGG;AACH,wBAAgB,iBAAiB,CAC/B,MAAM,EAAE,MAAM,EACd,KAAK,EAAE,mBAAmB,EAC1B,SAAS,EAAE,MAAM,EACjB,UAAU,EAAE,MAAM,GACjB,OAAO,CAOT"}
|
package/dist/sign.js
CHANGED
|
@@ -153,8 +153,9 @@ export function verifyImageParams(secret, parts, signature, nowSeconds) {
|
|
|
153
153
|
if (parts.exp !== undefined) {
|
|
154
154
|
if (!/^\d+$/.test(parts.exp))
|
|
155
155
|
return false;
|
|
156
|
-
|
|
157
|
-
|
|
156
|
+
const expiresAt = Number(parts.exp);
|
|
157
|
+
if (!Number.isSafeInteger(expiresAt) || expiresAt < nowSeconds)
|
|
158
|
+
return false; // expired/invalid
|
|
158
159
|
}
|
|
159
160
|
return safeEqual(signImageParams(secret, parts), signature);
|
|
160
161
|
}
|
package/dist/sign.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"sign.js","sourceRoot":"","sources":["../src/sign.ts"],"names":[],"mappings":"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
|
|
1
|
+
{"version":3,"file":"sign.js","sourceRoot":"","sources":["../src/sign.ts"],"names":[],"mappings":"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"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@nifrajs/image",
|
|
3
|
-
"version": "
|
|
3
|
+
"version": "4.0.0",
|
|
4
4
|
"description": "Image optimization for nifra - a CLS-safe responsive <Image> + pluggable loaders (CDN or self-hosted) + pure-JS dimension reading. Zero-dependency core; optional Bun.Image-backed resize endpoint at @nifrajs/image/server.",
|
|
5
5
|
"keywords": [
|
|
6
6
|
"bun",
|
|
@@ -14,6 +14,9 @@
|
|
|
14
14
|
"cls"
|
|
15
15
|
],
|
|
16
16
|
"type": "module",
|
|
17
|
+
"nifra": {
|
|
18
|
+
"environment": "library"
|
|
19
|
+
},
|
|
17
20
|
"main": "./dist/index.js",
|
|
18
21
|
"module": "./dist/index.js",
|
|
19
22
|
"types": "./dist/index.d.ts",
|
package/src/backend.ts
CHANGED
|
@@ -11,7 +11,7 @@
|
|
|
11
11
|
* - {@link wasmImageBackend} - pass WASM codecs (e.g. jSquash). Any runtime, including the edge.
|
|
12
12
|
*/
|
|
13
13
|
|
|
14
|
-
import { imageDimensions } from "./dimensions.ts"
|
|
14
|
+
import { imageDimensions, jpegOrientation } from "./dimensions.ts"
|
|
15
15
|
|
|
16
16
|
/** Output formats nifra's endpoint can emit. AVIF is intentionally excluded - `Bun.Image` reports
|
|
17
17
|
* `ERR_IMAGE_FORMAT_UNSUPPORTED` for AVIF encode on common platforms, so offering it would 500. */
|
|
@@ -144,7 +144,9 @@ function toBunError(err: unknown): ImageProcessingError {
|
|
|
144
144
|
* structurally so `@nifrajs/image` has no dependency on sharp - pass your own `sharp` import. */
|
|
145
145
|
export type SharpLike = (input: Uint8Array) => SharpInstance
|
|
146
146
|
interface SharpInstance {
|
|
147
|
-
metadata(): Promise<{ width?: number; height?: number; format?: string }>
|
|
147
|
+
metadata(): Promise<{ width?: number; height?: number; format?: string; orientation?: number }>
|
|
148
|
+
/** With no angle: turn the pixels upright by the EXIF orientation, which the output then drops. */
|
|
149
|
+
rotate(): SharpInstance
|
|
148
150
|
resize(options: { width: number; withoutEnlargement?: boolean }): SharpInstance
|
|
149
151
|
webp(options: { quality: number }): SharpInstance
|
|
150
152
|
jpeg(options: { quality: number }): SharpInstance
|
|
@@ -170,15 +172,22 @@ export function sharpImageBackend(sharp: SharpLike): ImageBackend {
|
|
|
170
172
|
if (md.width === undefined || md.height === undefined) {
|
|
171
173
|
throw new ImageProcessingError("decode", "sharp could not read image dimensions")
|
|
172
174
|
}
|
|
173
|
-
|
|
175
|
+
// sharp reports the stored size; orientations 5-8 display it a quarter turn round.
|
|
176
|
+
const turned = (md.orientation ?? 1) >= 5
|
|
177
|
+
return {
|
|
178
|
+
width: turned ? md.height : md.width,
|
|
179
|
+
height: turned ? md.width : md.height,
|
|
180
|
+
format: String(md.format ?? "").toLowerCase(),
|
|
181
|
+
}
|
|
174
182
|
} catch (err) {
|
|
175
183
|
throw toSharpError(err)
|
|
176
184
|
}
|
|
177
185
|
},
|
|
178
186
|
async transform({ bytes, width, quality, format }) {
|
|
179
187
|
try {
|
|
188
|
+
// Upright first: the encoder drops the EXIF orientation that told a viewer to turn it.
|
|
180
189
|
// `withoutEnlargement` is belt-and-braces: the handler already clamps width ≤ intrinsic.
|
|
181
|
-
const pipeline = sharp(bytes).resize({ width, withoutEnlargement: true })
|
|
190
|
+
const pipeline = sharp(bytes).rotate().resize({ width, withoutEnlargement: true })
|
|
182
191
|
const encoded =
|
|
183
192
|
format === "webp"
|
|
184
193
|
? pipeline.webp({ quality })
|
|
@@ -208,6 +217,48 @@ function toSharpError(err: unknown): ImageProcessingError {
|
|
|
208
217
|
|
|
209
218
|
// --- WASM backend (edge-portable) --------------------------------------------------------------------
|
|
210
219
|
|
|
220
|
+
/**
|
|
221
|
+
* For EXIF orientations 2-8, the stored pixel each displayed pixel `(x, y)` comes from, as
|
|
222
|
+
* `sx = a*x + b*y + c*(w-1)` and `sy = d*x + e*y + f*(h-1)`: `[a, b, c, d, e, f]`.
|
|
223
|
+
*/
|
|
224
|
+
const ORIENTATION_MAP: Readonly<Record<number, readonly number[]>> = {
|
|
225
|
+
2: [-1, 0, 1, 0, 1, 0],
|
|
226
|
+
3: [-1, 0, 1, 0, -1, 1],
|
|
227
|
+
4: [1, 0, 0, 0, -1, 1],
|
|
228
|
+
5: [0, 1, 0, 1, 0, 0],
|
|
229
|
+
6: [0, 1, 0, -1, 0, 1],
|
|
230
|
+
7: [0, -1, 1, -1, 0, 1],
|
|
231
|
+
8: [0, -1, 1, 1, 0, 0],
|
|
232
|
+
}
|
|
233
|
+
|
|
234
|
+
/**
|
|
235
|
+
* `image` turned upright by the EXIF orientation of the JPEG it was decoded from. The encoders write no
|
|
236
|
+
* EXIF, so pixels left as stored would display turned. A codec that already turned a quarter-turn image
|
|
237
|
+
* (it decoded to the displayed size) is left as it is.
|
|
238
|
+
*/
|
|
239
|
+
function upright(image: DecodedImage, source: Uint8Array): DecodedImage {
|
|
240
|
+
const map = ORIENTATION_MAP[jpegOrientation(source)]
|
|
241
|
+
if (map === undefined) return image
|
|
242
|
+
const [a = 0, b = 0, c = 0, d = 0, e = 0, f = 0] = map
|
|
243
|
+
const { width: w, height: h, data } = image
|
|
244
|
+
const quarter = a === 0
|
|
245
|
+
const shown = imageDimensions(source)
|
|
246
|
+
if (quarter && shown !== null && shown.width === w && shown.height === h) return image
|
|
247
|
+
const outWidth = quarter ? h : w
|
|
248
|
+
const outHeight = quarter ? w : h
|
|
249
|
+
const out = new Uint8Array(data.length)
|
|
250
|
+
for (let y = 0, o = 0; y < outHeight; y++) {
|
|
251
|
+
for (let x = 0; x < outWidth; x++, o += 4) {
|
|
252
|
+
const i = ((d * x + e * y + f * (h - 1)) * w + (a * x + b * y + c * (w - 1))) * 4
|
|
253
|
+
out[o] = data[i] ?? 0
|
|
254
|
+
out[o + 1] = data[i + 1] ?? 0
|
|
255
|
+
out[o + 2] = data[i + 2] ?? 0
|
|
256
|
+
out[o + 3] = data[i + 3] ?? 0
|
|
257
|
+
}
|
|
258
|
+
}
|
|
259
|
+
return { data: out, width: outWidth, height: outHeight }
|
|
260
|
+
}
|
|
261
|
+
|
|
211
262
|
/** A decoded image: RGBA pixels + dimensions - the lingua franca of WASM codecs (jSquash, Photon, …). */
|
|
212
263
|
export interface DecodedImage {
|
|
213
264
|
/** RGBA bytes, length `width * height * 4`. */
|
|
@@ -257,7 +308,7 @@ export function wasmImageBackend(codecs: WasmImageCodecs): ImageBackend {
|
|
|
257
308
|
},
|
|
258
309
|
async transform({ bytes, width, quality, format }) {
|
|
259
310
|
try {
|
|
260
|
-
const decoded = await codecs.decode(bytes)
|
|
311
|
+
const decoded = upright(await codecs.decode(bytes), bytes)
|
|
261
312
|
// Aspect-preserving: the handler hands a width already clamped to the intrinsic width.
|
|
262
313
|
const height = Math.max(1, Math.round((decoded.height * width) / decoded.width))
|
|
263
314
|
const resized =
|
package/src/dimensions.ts
CHANGED
|
@@ -1,7 +1,8 @@
|
|
|
1
1
|
/**
|
|
2
2
|
* Read an image's intrinsic dimensions from its file **header**, in pure JS - no decode, no codec, no
|
|
3
3
|
* dependency. Supports PNG, JPEG, GIF, and WebP (VP8/VP8L/VP8X). Used to give `<Image>` CLS-safe
|
|
4
|
-
* `width`/`height` (build-time tooling can pre-read them into a manifest).
|
|
4
|
+
* `width`/`height` (build-time tooling can pre-read them into a manifest). A JPEG's are the size it is
|
|
5
|
+
* displayed at: its EXIF orientation applied, as a browser applies it.
|
|
5
6
|
*/
|
|
6
7
|
export type ImageFormat = "png" | "jpeg" | "gif" | "webp"
|
|
7
8
|
|
|
@@ -17,27 +18,107 @@ const png = (b: Uint8Array, dv: DataView): ImageInfo | null => {
|
|
|
17
18
|
return { width: dv.getUint32(16), height: dv.getUint32(20), format: "png" }
|
|
18
19
|
}
|
|
19
20
|
|
|
21
|
+
/** The first image descriptor's width/height, past the global color table and any extensions. */
|
|
22
|
+
const gifFirstFrame = (
|
|
23
|
+
b: Uint8Array,
|
|
24
|
+
dv: DataView,
|
|
25
|
+
): { width: number; height: number } | undefined => {
|
|
26
|
+
const packed = b[10] ?? 0
|
|
27
|
+
let offset = 13 + (packed & 0x80 ? 3 * 2 ** ((packed & 0x07) + 1) : 0)
|
|
28
|
+
while (offset < b.length) {
|
|
29
|
+
const block = b[offset]
|
|
30
|
+
if (block === 0x2c) {
|
|
31
|
+
if (offset + 9 > b.length) return undefined
|
|
32
|
+
return { width: dv.getUint16(offset + 5, true), height: dv.getUint16(offset + 7, true) }
|
|
33
|
+
}
|
|
34
|
+
if (block !== 0x21) return undefined
|
|
35
|
+
// An extension: label, then data sub-blocks (a length byte each) to a zero-length terminator.
|
|
36
|
+
offset += 2
|
|
37
|
+
while (offset < b.length && b[offset] !== 0) offset += (b[offset] ?? 0) + 1
|
|
38
|
+
offset += 1
|
|
39
|
+
}
|
|
40
|
+
return undefined
|
|
41
|
+
}
|
|
42
|
+
|
|
20
43
|
const gif = (b: Uint8Array, dv: DataView): ImageInfo | null => {
|
|
21
44
|
// 'GIF', then the logical-screen width/height as little-endian uint16 @6/@8.
|
|
22
45
|
if (b.length < 10 || b[0] !== 0x47 || b[1] !== 0x49 || b[2] !== 0x46) return null
|
|
23
|
-
|
|
46
|
+
// A browser draws a GIF at the larger of its logical screen and its first frame, per side - a
|
|
47
|
+
// 1x1 (or 0x0) screen holding a 10x20 frame displays 10x20.
|
|
48
|
+
const frame = gifFirstFrame(b, dv)
|
|
49
|
+
return {
|
|
50
|
+
width: Math.max(dv.getUint16(6, true), frame?.width ?? 0),
|
|
51
|
+
height: Math.max(dv.getUint16(8, true), frame?.height ?? 0),
|
|
52
|
+
format: "gif",
|
|
53
|
+
}
|
|
24
54
|
}
|
|
25
55
|
|
|
26
|
-
|
|
56
|
+
/** The EXIF orientation (1-8) an APP1 segment's TIFF block declares, read within `[start, end)`. */
|
|
57
|
+
const exifOrientation = (b: Uint8Array, dv: DataView, start: number, end: number): number => {
|
|
58
|
+
// "Exif\0\0", then a TIFF header: byte order ("II" little / "MM" big), 42, IFD0's offset.
|
|
59
|
+
const exif = [0x45, 0x78, 0x69, 0x66, 0, 0]
|
|
60
|
+
if (start + 14 > end || exif.some((byte, i) => b[start + i] !== byte)) return 1
|
|
61
|
+
const tiff = start + 6
|
|
62
|
+
const little = b[tiff] === 0x49 && b[tiff + 1] === 0x49
|
|
63
|
+
if (!little && !(b[tiff] === 0x4d && b[tiff + 1] === 0x4d)) return 1
|
|
64
|
+
if (dv.getUint16(tiff + 2, little) !== 42) return 1
|
|
65
|
+
const ifd = tiff + dv.getUint32(tiff + 4, little)
|
|
66
|
+
if (ifd + 2 > end) return 1
|
|
67
|
+
for (let i = 0, count = dv.getUint16(ifd, little); i < count; i++) {
|
|
68
|
+
const entry = ifd + 2 + i * 12
|
|
69
|
+
if (entry + 12 > end) return 1
|
|
70
|
+
if (dv.getUint16(entry, little) !== 0x0112) continue
|
|
71
|
+
const orientation = dv.getUint16(entry + 8, little)
|
|
72
|
+
return orientation >= 1 && orientation <= 8 ? orientation : 1
|
|
73
|
+
}
|
|
74
|
+
return 1
|
|
75
|
+
}
|
|
76
|
+
|
|
77
|
+
/** A JPEG's stored frame size and its EXIF orientation, from the segments before the frame. */
|
|
78
|
+
const jpegFrame = (
|
|
79
|
+
b: Uint8Array,
|
|
80
|
+
dv: DataView,
|
|
81
|
+
): { width: number; height: number; orientation: number } | null => {
|
|
27
82
|
if (b.length < 4 || b[0] !== 0xff || b[1] !== 0xd8) return null
|
|
28
83
|
let offset = 2
|
|
84
|
+
let orientation = 1
|
|
29
85
|
while (offset + 9 < b.length) {
|
|
30
86
|
if (dv.getUint8(offset) !== 0xff) return null // not aligned on a marker → malformed
|
|
31
87
|
const marker = dv.getUint8(offset + 1)
|
|
32
88
|
// SOF0..SOF15 carry the frame's height/width - except DHT(c4)/DNL(c8)/DAC(cc).
|
|
33
89
|
if (marker >= 0xc0 && marker <= 0xcf && marker !== 0xc4 && marker !== 0xc8 && marker !== 0xcc) {
|
|
34
|
-
return { height: dv.getUint16(offset + 5), width: dv.getUint16(offset + 7),
|
|
90
|
+
return { height: dv.getUint16(offset + 5), width: dv.getUint16(offset + 7), orientation }
|
|
35
91
|
}
|
|
36
|
-
offset
|
|
92
|
+
const next = offset + 2 + dv.getUint16(offset + 2) // skip this segment (2-byte marker + length)
|
|
93
|
+
if (marker === 0xe1 && orientation === 1) {
|
|
94
|
+
orientation = exifOrientation(b, dv, offset + 4, Math.min(next, b.length))
|
|
95
|
+
}
|
|
96
|
+
offset = next
|
|
37
97
|
}
|
|
38
98
|
return null
|
|
39
99
|
}
|
|
40
100
|
|
|
101
|
+
const jpeg = (b: Uint8Array, dv: DataView): ImageInfo | null => {
|
|
102
|
+
const frame = jpegFrame(b, dv)
|
|
103
|
+
if (frame === null) return null
|
|
104
|
+
// A browser draws a JPEG turned by its EXIF orientation, and 5-8 turn it a quarter: the sides swap.
|
|
105
|
+
return frame.orientation >= 5
|
|
106
|
+
? { width: frame.height, height: frame.width, format: "jpeg" }
|
|
107
|
+
: { width: frame.width, height: frame.height, format: "jpeg" }
|
|
108
|
+
}
|
|
109
|
+
|
|
110
|
+
/**
|
|
111
|
+
* The EXIF orientation (1-8) a JPEG declares - how its stored pixels are turned for display - or `1`
|
|
112
|
+
* for upright, for another format, or for an unreadable header.
|
|
113
|
+
*/
|
|
114
|
+
export function jpegOrientation(bytes: Uint8Array): number {
|
|
115
|
+
if (bytes.length < 4) return 1
|
|
116
|
+
return (
|
|
117
|
+
jpegFrame(bytes, new DataView(bytes.buffer, bytes.byteOffset, bytes.byteLength))?.orientation ??
|
|
118
|
+
1
|
|
119
|
+
)
|
|
120
|
+
}
|
|
121
|
+
|
|
41
122
|
const webp = (b: Uint8Array, dv: DataView): ImageInfo | null => {
|
|
42
123
|
// 'RIFF' .... 'WEBP' then a VP8 / VP8L / VP8X chunk.
|
|
43
124
|
if (b.length < 30 || b[0] !== 0x52 || b[1] !== 0x49 || b[8] !== 0x57 || b[9] !== 0x45) return null
|
package/src/og.ts
CHANGED
|
@@ -51,22 +51,34 @@ const DEFAULT_MAX_AGE = 31_536_000
|
|
|
51
51
|
const DEFAULT_MAX_BYTES = 10 * 1024 * 1024
|
|
52
52
|
const COLOR = /^(?:#[0-9a-fA-F]{3,8}|[A-Za-z]{1,32})$/
|
|
53
53
|
|
|
54
|
+
/**
|
|
55
|
+
* CMS-shaped text as the card draws it: line breaks and tabs as spaces, an empty optional field as
|
|
56
|
+
* absent, and text past `max` characters cut with an ellipsis (the card shows a few lines anyway).
|
|
57
|
+
* Only a missing title and a control character an SVG cannot hold are errors.
|
|
58
|
+
*/
|
|
54
59
|
function boundedText(
|
|
55
60
|
value: string | undefined,
|
|
56
61
|
name: string,
|
|
57
62
|
max: number,
|
|
58
63
|
required = false,
|
|
59
64
|
): string {
|
|
60
|
-
if (value
|
|
61
|
-
|
|
62
|
-
|
|
65
|
+
if (typeof value !== "string" && (value !== undefined || required)) {
|
|
66
|
+
throw new TypeError(`og image: ${name} must be a string`)
|
|
67
|
+
}
|
|
68
|
+
const text = (value ?? "").replace(/[\t\n\r]+/g, " ").trim()
|
|
69
|
+
if (text === "") {
|
|
70
|
+
if (required) throw new TypeError(`og image: ${name} must not be empty`)
|
|
71
|
+
return ""
|
|
63
72
|
}
|
|
64
|
-
for (let index = 0; index <
|
|
65
|
-
const code =
|
|
73
|
+
for (let index = 0; index < text.length; index++) {
|
|
74
|
+
const code = text.charCodeAt(index)
|
|
66
75
|
if (code <= 31 || code === 127)
|
|
67
76
|
throw new TypeError(`og image: ${name} contains a control character`)
|
|
68
77
|
}
|
|
69
|
-
return
|
|
78
|
+
if (text.length <= max) return text
|
|
79
|
+
// Never cut a surrogate pair in half.
|
|
80
|
+
const cut = /[\uD800-\uDBFF]$/.test(text.slice(0, max - 1)) ? max - 2 : max - 1
|
|
81
|
+
return `${text.slice(0, cut).trimEnd()}\u2026`
|
|
70
82
|
}
|
|
71
83
|
|
|
72
84
|
function dimension(value: number | undefined, name: string, fallback: number): number {
|
|
@@ -191,9 +203,30 @@ function contentType(value: string): string {
|
|
|
191
203
|
return value
|
|
192
204
|
}
|
|
193
205
|
|
|
206
|
+
/** What a rasterized card's response said, by its SVG: enough to answer a revalidation alone. */
|
|
207
|
+
interface RasterizedTag {
|
|
208
|
+
readonly etag: string
|
|
209
|
+
readonly contentType: string
|
|
210
|
+
readonly length: number
|
|
211
|
+
}
|
|
212
|
+
|
|
213
|
+
const RASTERIZED_TAGS_MAX = 512
|
|
214
|
+
const rasterizedTags = new WeakMap<OgImageRasterizer, Map<string, RasterizedTag>>()
|
|
215
|
+
|
|
216
|
+
/** Remember a card's tag, oldest out first past {@link RASTERIZED_TAGS_MAX} per rasterizer. */
|
|
217
|
+
function rememberTag(rasterizer: OgImageRasterizer, svgHash: string, tag: RasterizedTag): void {
|
|
218
|
+
const tags = rasterizedTags.get(rasterizer) ?? new Map<string, RasterizedTag>()
|
|
219
|
+
rasterizedTags.set(rasterizer, tags)
|
|
220
|
+
tags.delete(svgHash)
|
|
221
|
+
tags.set(svgHash, tag)
|
|
222
|
+
if (tags.size > RASTERIZED_TAGS_MAX) tags.delete(tags.keys().next().value ?? svgHash)
|
|
223
|
+
}
|
|
224
|
+
|
|
194
225
|
/**
|
|
195
226
|
* Build a cacheable OG image response. GET and HEAD are supported; conditional requests short-circuit
|
|
196
|
-
* rasterization, so a crawler revalidation never repeats expensive codec work.
|
|
227
|
+
* rasterization, so a crawler revalidation never repeats expensive codec work. The ETag still names the
|
|
228
|
+
* bytes a rasterizer produced: a revalidation is answered from the tag this process last sent for the
|
|
229
|
+
* same SVG and rasterizer, and rasterizes only when it has none.
|
|
197
230
|
*/
|
|
198
231
|
export async function ogImageResponse(
|
|
199
232
|
options: OgImageOptions,
|
|
@@ -205,12 +238,29 @@ export async function ogImageResponse(
|
|
|
205
238
|
const cacheMaxAge = nonNegativeInteger(options.cacheMaxAge, "cacheMaxAge", DEFAULT_MAX_AGE)
|
|
206
239
|
const maxBytes = nonNegativeInteger(options.maxBytes, "maxBytes", DEFAULT_MAX_BYTES)
|
|
207
240
|
const svg = renderOgImage(options)
|
|
241
|
+
const responseHeaders = (tag: RasterizedTag): Headers =>
|
|
242
|
+
new Headers({
|
|
243
|
+
"cache-control": `public, max-age=${cacheMaxAge}, immutable`,
|
|
244
|
+
"content-type": `${tag.contentType}${tag.contentType === "image/svg+xml" ? "; charset=utf-8" : ""}`,
|
|
245
|
+
etag: tag.etag,
|
|
246
|
+
"content-length": String(tag.length),
|
|
247
|
+
"x-content-type-options": "nosniff",
|
|
248
|
+
})
|
|
249
|
+
const { rasterizer } = options
|
|
250
|
+
let svgHash: string | undefined
|
|
251
|
+
if (rasterizer !== undefined) {
|
|
252
|
+
svgHash = await sha256(new TextEncoder().encode(svg))
|
|
253
|
+
const known = rasterizedTags.get(rasterizer)?.get(svgHash)
|
|
254
|
+
if (known !== undefined && ifNoneMatch(request, known.etag)) {
|
|
255
|
+
return new Response(null, { status: 304, headers: responseHeaders(known) })
|
|
256
|
+
}
|
|
257
|
+
}
|
|
208
258
|
let bytes: Uint8Array
|
|
209
259
|
let mediaType = "image/svg+xml"
|
|
210
260
|
try {
|
|
211
|
-
if (
|
|
261
|
+
if (rasterizer === undefined) bytes = new TextEncoder().encode(svg)
|
|
212
262
|
else {
|
|
213
|
-
const rasterized = await
|
|
263
|
+
const rasterized = await rasterizer(svg)
|
|
214
264
|
if (!(rasterized.bytes instanceof Uint8Array) || rasterized.bytes.byteLength > maxBytes) {
|
|
215
265
|
throw new TypeError("og image: rasterizer output exceeds maxBytes")
|
|
216
266
|
}
|
|
@@ -223,15 +273,10 @@ export async function ogImageResponse(
|
|
|
223
273
|
// Hash the bytes actually sent. A rasterizer may produce different pixels for the same SVG
|
|
224
274
|
// (for example after a backend/font update), so hashing only the source would make a conditional
|
|
225
275
|
// request incorrectly return 304 for a changed representation.
|
|
226
|
-
const
|
|
227
|
-
|
|
228
|
-
|
|
229
|
-
|
|
230
|
-
etag,
|
|
231
|
-
"content-length": String(bytes.byteLength),
|
|
232
|
-
"x-content-type-options": "nosniff",
|
|
233
|
-
})
|
|
234
|
-
if (ifNoneMatch(request, etag)) return new Response(null, { status: 304, headers })
|
|
276
|
+
const tag = { etag: `"${await sha256(bytes)}"`, contentType: mediaType, length: bytes.byteLength }
|
|
277
|
+
if (rasterizer !== undefined && svgHash !== undefined) rememberTag(rasterizer, svgHash, tag)
|
|
278
|
+
const headers = responseHeaders(tag)
|
|
279
|
+
if (ifNoneMatch(request, tag.etag)) return new Response(null, { status: 304, headers })
|
|
235
280
|
if (request?.method === "HEAD") return new Response(null, { status: 200, headers })
|
|
236
|
-
return new Response(bytes, { status: 200, headers })
|
|
281
|
+
return new Response(bytes.slice(), { status: 200, headers })
|
|
237
282
|
}
|
package/src/resolve.ts
CHANGED
|
@@ -40,8 +40,8 @@ export interface SelfHostedLoaderOptions {
|
|
|
40
40
|
* HMAC secret for **signed URLs**. When set, each URL gets a stable `&s=` signature and the handler
|
|
41
41
|
* must be configured with the SAME `signing.secret` - it then rejects any unsigned/forged `(src, w, q)`,
|
|
42
42
|
* shutting down resize-bombing. ⚠️ The signer holds the secret, so a loader created with it is
|
|
43
|
-
* **server-only** - inject it like a session secret (from `env`), never
|
|
44
|
-
*
|
|
43
|
+
* **server-only** - inject it like a session secret (from `env`) in backend code, never a page or
|
|
44
|
+
* `frontend/` module. Signatures are stable (no expiry), so SSR-signed URLs hydrate + cache identically.
|
|
45
45
|
*/
|
|
46
46
|
readonly secret?: string
|
|
47
47
|
}
|
package/src/server.ts
CHANGED
|
@@ -198,8 +198,10 @@ async function handle(req: Request, cfg: ResolvedConfig): Promise<Response> {
|
|
|
198
198
|
// 2b. Signed-URL enforcement (when configured): reject any request we didn't mint. Verifies the
|
|
199
199
|
// `&s=` HMAC over the raw (src, w, q[, exp]) - exactly what the loader/`signImageUrl` signed -
|
|
200
200
|
// and the expiry. Done before the ETag/fetch so unsigned/forged requests cost nothing.
|
|
201
|
+
let signedCacheControl: string | undefined
|
|
201
202
|
if (cfg.signing !== null) {
|
|
202
203
|
const sig = url.searchParams.get("s")
|
|
204
|
+
const exp = url.searchParams.get("exp")
|
|
203
205
|
const ok =
|
|
204
206
|
sig !== null &&
|
|
205
207
|
verifyImageParams(
|
|
@@ -208,12 +210,21 @@ async function handle(req: Request, cfg: ResolvedConfig): Promise<Response> {
|
|
|
208
210
|
src,
|
|
209
211
|
w: url.searchParams.get("w") ?? "",
|
|
210
212
|
q: qParam ?? undefined,
|
|
211
|
-
exp:
|
|
213
|
+
exp: exp ?? undefined,
|
|
212
214
|
},
|
|
213
215
|
sig,
|
|
214
216
|
Math.floor(Date.now() / 1000),
|
|
215
217
|
)
|
|
216
218
|
if (!ok) return errorResponse(403, "invalid_signature")
|
|
219
|
+
|
|
220
|
+
// An expiring bearer URL must never become a longer-lived shared-cache entry than its
|
|
221
|
+
// authorization. Keep it private as well: an intermediary must not replay the transformed bytes
|
|
222
|
+
// after the signature expires without re-running this check.
|
|
223
|
+
if (exp !== null) {
|
|
224
|
+
const expiresAt = Number(exp)
|
|
225
|
+
const remaining = Math.max(0, expiresAt - Math.floor(Date.now() / 1000))
|
|
226
|
+
signedCacheControl = `private, max-age=${Math.min(cfg.cacheMaxAge, remaining)}`
|
|
227
|
+
}
|
|
217
228
|
}
|
|
218
229
|
|
|
219
230
|
// 3/4. Admission precedes source reads so queued requests do not retain large buffers. It is a
|
|
@@ -255,7 +266,9 @@ async function handle(req: Request, cfg: ResolvedConfig): Promise<Response> {
|
|
|
255
266
|
// falsely return 304 when a mutable local/remote source changes at the same URL.
|
|
256
267
|
const etag = `"${await sha256(out.bytes)}"`
|
|
257
268
|
const headers = new Headers({
|
|
258
|
-
"Cache-Control":
|
|
269
|
+
"Cache-Control":
|
|
270
|
+
signedCacheControl ??
|
|
271
|
+
`public, max-age=${cfg.cacheMaxAge}${cfg.immutable ? ", immutable" : ""}`,
|
|
259
272
|
ETag: etag,
|
|
260
273
|
Vary: "Accept",
|
|
261
274
|
})
|
|
@@ -265,7 +278,7 @@ async function handle(req: Request, cfg: ResolvedConfig): Promise<Response> {
|
|
|
265
278
|
if (ifNoneMatch(req, etag)) return new Response(null, { status: 304, headers })
|
|
266
279
|
// HEAD: identical headers, no body.
|
|
267
280
|
if (req.method === "HEAD") return new Response(null, { status: 200, headers })
|
|
268
|
-
return new Response(out.bytes, { status: 200, headers })
|
|
281
|
+
return new Response(out.bytes.slice(), { status: 200, headers })
|
|
269
282
|
} catch (err) {
|
|
270
283
|
if (err instanceof ImageProcessingError) {
|
|
271
284
|
if (err.kind === "too_large") return errorResponse(413, "source_too_large")
|
package/src/sign.ts
CHANGED
|
@@ -181,7 +181,8 @@ export function verifyImageParams(
|
|
|
181
181
|
): boolean {
|
|
182
182
|
if (parts.exp !== undefined) {
|
|
183
183
|
if (!/^\d+$/.test(parts.exp)) return false
|
|
184
|
-
|
|
184
|
+
const expiresAt = Number(parts.exp)
|
|
185
|
+
if (!Number.isSafeInteger(expiresAt) || expiresAt < nowSeconds) return false // expired/invalid
|
|
185
186
|
}
|
|
186
187
|
return safeEqual(signImageParams(secret, parts), signature)
|
|
187
188
|
}
|