@lens-image/core 0.1.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/LICENSE +21 -0
- package/README.md +244 -0
- package/dist/cjs/adapters/memory.d.ts +55 -0
- package/dist/cjs/adapters/memory.d.ts.map +1 -0
- package/dist/cjs/adapters/memory.js +84 -0
- package/dist/cjs/adapters/memory.js.map +1 -0
- package/dist/cjs/browser.d.ts +46 -0
- package/dist/cjs/browser.d.ts.map +1 -0
- package/dist/cjs/browser.js +79 -0
- package/dist/cjs/browser.js.map +1 -0
- package/dist/cjs/bytes.d.ts +18 -0
- package/dist/cjs/bytes.d.ts.map +1 -0
- package/dist/cjs/bytes.js +31 -0
- package/dist/cjs/bytes.js.map +1 -0
- package/dist/cjs/cache.d.ts +43 -0
- package/dist/cjs/cache.d.ts.map +1 -0
- package/dist/cjs/cache.js +77 -0
- package/dist/cjs/cache.js.map +1 -0
- package/dist/cjs/concurrency.d.ts +35 -0
- package/dist/cjs/concurrency.d.ts.map +1 -0
- package/dist/cjs/concurrency.js +82 -0
- package/dist/cjs/concurrency.js.map +1 -0
- package/dist/cjs/engines/index.d.ts +20 -0
- package/dist/cjs/engines/index.d.ts.map +1 -0
- package/dist/cjs/engines/index.js +38 -0
- package/dist/cjs/engines/index.js.map +1 -0
- package/dist/cjs/engines/passthrough.d.ts +41 -0
- package/dist/cjs/engines/passthrough.d.ts.map +1 -0
- package/dist/cjs/engines/passthrough.js +66 -0
- package/dist/cjs/engines/passthrough.js.map +1 -0
- package/dist/cjs/engines/sharp.d.ts +58 -0
- package/dist/cjs/engines/sharp.d.ts.map +1 -0
- package/dist/cjs/engines/sharp.js +243 -0
- package/dist/cjs/engines/sharp.js.map +1 -0
- package/dist/cjs/errors.d.ts +90 -0
- package/dist/cjs/errors.d.ts.map +1 -0
- package/dist/cjs/errors.js +97 -0
- package/dist/cjs/errors.js.map +1 -0
- package/dist/cjs/format.d.ts +33 -0
- package/dist/cjs/format.d.ts.map +1 -0
- package/dist/cjs/format.js +102 -0
- package/dist/cjs/format.js.map +1 -0
- package/dist/cjs/hash.d.ts +19 -0
- package/dist/cjs/hash.d.ts.map +1 -0
- package/dist/cjs/hash.js +43 -0
- package/dist/cjs/hash.js.map +1 -0
- package/dist/cjs/index.d.ts +56 -0
- package/dist/cjs/index.d.ts.map +1 -0
- package/dist/cjs/index.js +110 -0
- package/dist/cjs/index.js.map +1 -0
- package/dist/cjs/naming.d.ts +48 -0
- package/dist/cjs/naming.d.ts.map +1 -0
- package/dist/cjs/naming.js +95 -0
- package/dist/cjs/naming.js.map +1 -0
- package/dist/cjs/optimizer.d.ts +89 -0
- package/dist/cjs/optimizer.d.ts.map +1 -0
- package/dist/cjs/optimizer.js +667 -0
- package/dist/cjs/optimizer.js.map +1 -0
- package/dist/cjs/package.json +3 -0
- package/dist/cjs/retry.d.ts +55 -0
- package/dist/cjs/retry.d.ts.map +1 -0
- package/dist/cjs/retry.js +129 -0
- package/dist/cjs/retry.js.map +1 -0
- package/dist/cjs/server/handler.d.ts +80 -0
- package/dist/cjs/server/handler.d.ts.map +1 -0
- package/dist/cjs/server/handler.js +155 -0
- package/dist/cjs/server/handler.js.map +1 -0
- package/dist/cjs/sniff.d.ts +37 -0
- package/dist/cjs/sniff.d.ts.map +1 -0
- package/dist/cjs/sniff.js +442 -0
- package/dist/cjs/sniff.js.map +1 -0
- package/dist/cjs/source.d.ts +45 -0
- package/dist/cjs/source.d.ts.map +1 -0
- package/dist/cjs/source.js +221 -0
- package/dist/cjs/source.js.map +1 -0
- package/dist/cjs/srcset.d.ts +66 -0
- package/dist/cjs/srcset.d.ts.map +1 -0
- package/dist/cjs/srcset.js +81 -0
- package/dist/cjs/srcset.js.map +1 -0
- package/dist/cjs/types.d.ts +441 -0
- package/dist/cjs/types.d.ts.map +1 -0
- package/dist/cjs/types.js +12 -0
- package/dist/cjs/types.js.map +1 -0
- package/dist/cjs/validation.d.ts +38 -0
- package/dist/cjs/validation.d.ts.map +1 -0
- package/dist/cjs/validation.js +79 -0
- package/dist/cjs/validation.js.map +1 -0
- package/dist/esm/adapters/memory.d.ts +55 -0
- package/dist/esm/adapters/memory.d.ts.map +1 -0
- package/dist/esm/adapters/memory.js +80 -0
- package/dist/esm/adapters/memory.js.map +1 -0
- package/dist/esm/browser.d.ts +46 -0
- package/dist/esm/browser.d.ts.map +1 -0
- package/dist/esm/browser.js +49 -0
- package/dist/esm/browser.js.map +1 -0
- package/dist/esm/bytes.d.ts +18 -0
- package/dist/esm/bytes.d.ts.map +1 -0
- package/dist/esm/bytes.js +28 -0
- package/dist/esm/bytes.js.map +1 -0
- package/dist/esm/cache.d.ts +43 -0
- package/dist/esm/cache.d.ts.map +1 -0
- package/dist/esm/cache.js +73 -0
- package/dist/esm/cache.js.map +1 -0
- package/dist/esm/concurrency.d.ts +35 -0
- package/dist/esm/concurrency.d.ts.map +1 -0
- package/dist/esm/concurrency.js +78 -0
- package/dist/esm/concurrency.js.map +1 -0
- package/dist/esm/engines/index.d.ts +20 -0
- package/dist/esm/engines/index.d.ts.map +1 -0
- package/dist/esm/engines/index.js +30 -0
- package/dist/esm/engines/index.js.map +1 -0
- package/dist/esm/engines/passthrough.d.ts +41 -0
- package/dist/esm/engines/passthrough.d.ts.map +1 -0
- package/dist/esm/engines/passthrough.js +63 -0
- package/dist/esm/engines/passthrough.js.map +1 -0
- package/dist/esm/engines/sharp.d.ts +58 -0
- package/dist/esm/engines/sharp.d.ts.map +1 -0
- package/dist/esm/engines/sharp.js +206 -0
- package/dist/esm/engines/sharp.js.map +1 -0
- package/dist/esm/errors.d.ts +90 -0
- package/dist/esm/errors.d.ts.map +1 -0
- package/dist/esm/errors.js +91 -0
- package/dist/esm/errors.js.map +1 -0
- package/dist/esm/format.d.ts +33 -0
- package/dist/esm/format.d.ts.map +1 -0
- package/dist/esm/format.js +93 -0
- package/dist/esm/format.js.map +1 -0
- package/dist/esm/hash.d.ts +19 -0
- package/dist/esm/hash.d.ts.map +1 -0
- package/dist/esm/hash.js +38 -0
- package/dist/esm/hash.js.map +1 -0
- package/dist/esm/index.d.ts +56 -0
- package/dist/esm/index.d.ts.map +1 -0
- package/dist/esm/index.js +54 -0
- package/dist/esm/index.js.map +1 -0
- package/dist/esm/naming.d.ts +48 -0
- package/dist/esm/naming.d.ts.map +1 -0
- package/dist/esm/naming.js +88 -0
- package/dist/esm/naming.js.map +1 -0
- package/dist/esm/optimizer.d.ts +89 -0
- package/dist/esm/optimizer.d.ts.map +1 -0
- package/dist/esm/optimizer.js +663 -0
- package/dist/esm/optimizer.js.map +1 -0
- package/dist/esm/package.json +3 -0
- package/dist/esm/retry.d.ts +55 -0
- package/dist/esm/retry.d.ts.map +1 -0
- package/dist/esm/retry.js +123 -0
- package/dist/esm/retry.js.map +1 -0
- package/dist/esm/server/handler.d.ts +80 -0
- package/dist/esm/server/handler.d.ts.map +1 -0
- package/dist/esm/server/handler.js +151 -0
- package/dist/esm/server/handler.js.map +1 -0
- package/dist/esm/sniff.d.ts +37 -0
- package/dist/esm/sniff.d.ts.map +1 -0
- package/dist/esm/sniff.js +435 -0
- package/dist/esm/sniff.js.map +1 -0
- package/dist/esm/source.d.ts +45 -0
- package/dist/esm/source.d.ts.map +1 -0
- package/dist/esm/source.js +183 -0
- package/dist/esm/source.js.map +1 -0
- package/dist/esm/srcset.d.ts +66 -0
- package/dist/esm/srcset.d.ts.map +1 -0
- package/dist/esm/srcset.js +76 -0
- package/dist/esm/srcset.js.map +1 -0
- package/dist/esm/types.d.ts +441 -0
- package/dist/esm/types.d.ts.map +1 -0
- package/dist/esm/types.js +11 -0
- package/dist/esm/types.js.map +1 -0
- package/dist/esm/validation.d.ts +38 -0
- package/dist/esm/validation.d.ts.map +1 -0
- package/dist/esm/validation.js +74 -0
- package/dist/esm/validation.js.map +1 -0
- package/package.json +77 -0
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"optimizer.js","sourceRoot":"","sources":["../../src/optimizer.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,55 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Retry with exponential backoff and full jitter.
|
|
3
|
+
*
|
|
4
|
+
* Applied to adapter writes only. Encoding is deterministic - if sharp fails
|
|
5
|
+
* to encode a buffer once it will fail identically the second time, and
|
|
6
|
+
* retrying just burns CPU before the same error.
|
|
7
|
+
*/
|
|
8
|
+
import type { RetryOptions } from './types.js';
|
|
9
|
+
/** Fully-resolved retry policy. */
|
|
10
|
+
export interface ResolvedRetry {
|
|
11
|
+
readonly attempts: number;
|
|
12
|
+
readonly baseDelayMs: number;
|
|
13
|
+
readonly maxDelayMs: number;
|
|
14
|
+
readonly isRetryable: (error: unknown) => boolean;
|
|
15
|
+
readonly onRetry: ((info: {
|
|
16
|
+
attempt: number;
|
|
17
|
+
delayMs: number;
|
|
18
|
+
error: unknown;
|
|
19
|
+
}) => void) | undefined;
|
|
20
|
+
}
|
|
21
|
+
/**
|
|
22
|
+
* The default retry predicate.
|
|
23
|
+
*
|
|
24
|
+
* Retries transient network errors, HTTP 408/429 and 5xx. Never retries 4xx:
|
|
25
|
+
* a 403 from a misconfigured bucket policy will still be a 403 in 800ms, and
|
|
26
|
+
* hammering it just delays the error the developer needs to see.
|
|
27
|
+
*/
|
|
28
|
+
export declare function isRetryableError(error: unknown): boolean;
|
|
29
|
+
/** Fills in defaults for anything the caller left out. */
|
|
30
|
+
export declare function resolveRetry(options: RetryOptions | undefined): ResolvedRetry;
|
|
31
|
+
/**
|
|
32
|
+
* Computes the backoff for a given attempt using full jitter:
|
|
33
|
+
* `random(0, min(maxDelay, base * 2^(attempt-1)))`.
|
|
34
|
+
*
|
|
35
|
+
* The randomness is the point. Fixed backoff makes every worker that failed on
|
|
36
|
+
* the same S3 throttle retry at the same instant, reproducing the pile-up that
|
|
37
|
+
* caused the throttle.
|
|
38
|
+
*
|
|
39
|
+
* @param attempt - 1-based number of the attempt that just failed.
|
|
40
|
+
* @param random - Injectable for deterministic tests.
|
|
41
|
+
*/
|
|
42
|
+
export declare function backoffDelay(attempt: number, policy: Pick<ResolvedRetry, 'baseDelayMs' | 'maxDelayMs'>, random?: () => number): number;
|
|
43
|
+
/**
|
|
44
|
+
* Runs `task`, retrying per the policy.
|
|
45
|
+
*
|
|
46
|
+
* `task` receives the 1-based attempt number so adapters can log or vary
|
|
47
|
+
* behaviour (an idempotency key, say).
|
|
48
|
+
*
|
|
49
|
+
* @example
|
|
50
|
+
* ```ts
|
|
51
|
+
* await withRetry(resolveRetry({ attempts: 5 }), (attempt) => adapter.upload(file, { attempt, runId }));
|
|
52
|
+
* ```
|
|
53
|
+
*/
|
|
54
|
+
export declare function withRetry<T>(policy: ResolvedRetry, task: (attempt: number) => Promise<T>, signal?: AbortSignal, random?: () => number): Promise<T>;
|
|
55
|
+
//# sourceMappingURL=retry.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"retry.d.ts","sourceRoot":"","sources":["../../src/retry.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAIH,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,YAAY,CAAC;AAE/C,mCAAmC;AACnC,MAAM,WAAW,aAAa;IAC5B,QAAQ,CAAC,QAAQ,EAAE,MAAM,CAAC;IAC1B,QAAQ,CAAC,WAAW,EAAE,MAAM,CAAC;IAC7B,QAAQ,CAAC,UAAU,EAAE,MAAM,CAAC;IAC5B,QAAQ,CAAC,WAAW,EAAE,CAAC,KAAK,EAAE,OAAO,KAAK,OAAO,CAAC;IAClD,QAAQ,CAAC,OAAO,EAAE,CAAC,CAAC,IAAI,EAAE;QAAE,OAAO,EAAE,MAAM,CAAC;QAAC,OAAO,EAAE,MAAM,CAAC;QAAC,KAAK,EAAE,OAAO,CAAA;KAAE,KAAK,IAAI,CAAC,GAAG,SAAS,CAAC;CACtG;AAwBD;;;;;;GAMG;AACH,wBAAgB,gBAAgB,CAAC,KAAK,EAAE,OAAO,GAAG,OAAO,CAgCxD;AAED,0DAA0D;AAC1D,wBAAgB,YAAY,CAAC,OAAO,EAAE,YAAY,GAAG,SAAS,GAAG,aAAa,CAQ7E;AAED;;;;;;;;;;GAUG;AACH,wBAAgB,YAAY,CAC1B,OAAO,EAAE,MAAM,EACf,MAAM,EAAE,IAAI,CAAC,aAAa,EAAE,aAAa,GAAG,YAAY,CAAC,EACzD,MAAM,GAAE,MAAM,MAAoB,GACjC,MAAM,CAGR;AAED;;;;;;;;;;GAUG;AACH,wBAAsB,SAAS,CAAC,CAAC,EAC/B,MAAM,EAAE,aAAa,EACrB,IAAI,EAAE,CAAC,OAAO,EAAE,MAAM,KAAK,OAAO,CAAC,CAAC,CAAC,EACrC,MAAM,CAAC,EAAE,WAAW,EACpB,MAAM,GAAE,MAAM,MAAoB,GACjC,OAAO,CAAC,CAAC,CAAC,CAsBZ"}
|
|
@@ -0,0 +1,129 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
/**
|
|
3
|
+
* Retry with exponential backoff and full jitter.
|
|
4
|
+
*
|
|
5
|
+
* Applied to adapter writes only. Encoding is deterministic - if sharp fails
|
|
6
|
+
* to encode a buffer once it will fail identically the second time, and
|
|
7
|
+
* retrying just burns CPU before the same error.
|
|
8
|
+
*/
|
|
9
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
10
|
+
exports.isRetryableError = isRetryableError;
|
|
11
|
+
exports.resolveRetry = resolveRetry;
|
|
12
|
+
exports.backoffDelay = backoffDelay;
|
|
13
|
+
exports.withRetry = withRetry;
|
|
14
|
+
const concurrency_js_1 = require("./concurrency.js");
|
|
15
|
+
const errors_js_1 = require("./errors.js");
|
|
16
|
+
/** Transient network failures worth a second look. */
|
|
17
|
+
const RETRYABLE_CODES = new Set([
|
|
18
|
+
'ECONNRESET',
|
|
19
|
+
'ECONNREFUSED',
|
|
20
|
+
'ETIMEDOUT',
|
|
21
|
+
'EPIPE',
|
|
22
|
+
'EAI_AGAIN',
|
|
23
|
+
'ENOTFOUND',
|
|
24
|
+
'EHOSTUNREACH',
|
|
25
|
+
'ENETUNREACH',
|
|
26
|
+
'EBUSY',
|
|
27
|
+
'UND_ERR_CONNECT_TIMEOUT',
|
|
28
|
+
'UND_ERR_SOCKET',
|
|
29
|
+
'RequestTimeout',
|
|
30
|
+
'RequestTimeTooSkewed',
|
|
31
|
+
'ThrottlingException',
|
|
32
|
+
'TooManyRequestsException',
|
|
33
|
+
'SlowDown',
|
|
34
|
+
'InternalError',
|
|
35
|
+
'ServiceUnavailable',
|
|
36
|
+
]);
|
|
37
|
+
/**
|
|
38
|
+
* The default retry predicate.
|
|
39
|
+
*
|
|
40
|
+
* Retries transient network errors, HTTP 408/429 and 5xx. Never retries 4xx:
|
|
41
|
+
* a 403 from a misconfigured bucket policy will still be a 403 in 800ms, and
|
|
42
|
+
* hammering it just delays the error the developer needs to see.
|
|
43
|
+
*/
|
|
44
|
+
function isRetryableError(error) {
|
|
45
|
+
if (errors_js_1.LensError.is(error)) {
|
|
46
|
+
// Our own validation/config errors are never transient.
|
|
47
|
+
if (error.code !== 'UPLOAD_FAILED')
|
|
48
|
+
return false;
|
|
49
|
+
return isRetryableError(error.cause);
|
|
50
|
+
}
|
|
51
|
+
if (!error || typeof error !== 'object')
|
|
52
|
+
return false;
|
|
53
|
+
const err = error;
|
|
54
|
+
if (err.$retryable)
|
|
55
|
+
return true;
|
|
56
|
+
if (err.code && RETRYABLE_CODES.has(err.code))
|
|
57
|
+
return true;
|
|
58
|
+
if (err.name && RETRYABLE_CODES.has(err.name))
|
|
59
|
+
return true;
|
|
60
|
+
const status = err.status ?? err.statusCode ?? err.$metadata?.httpStatusCode;
|
|
61
|
+
if (typeof status === 'number') {
|
|
62
|
+
if (status === 408 || status === 429)
|
|
63
|
+
return true;
|
|
64
|
+
if (status >= 500 && status < 600)
|
|
65
|
+
return true;
|
|
66
|
+
return false;
|
|
67
|
+
}
|
|
68
|
+
// `fetch` wraps the real cause; unwrap one level before giving up.
|
|
69
|
+
if (err.cause && err.cause !== error)
|
|
70
|
+
return isRetryableError(err.cause);
|
|
71
|
+
return false;
|
|
72
|
+
}
|
|
73
|
+
/** Fills in defaults for anything the caller left out. */
|
|
74
|
+
function resolveRetry(options) {
|
|
75
|
+
return {
|
|
76
|
+
attempts: Math.max(1, Math.floor(options?.attempts ?? 3)),
|
|
77
|
+
baseDelayMs: Math.max(0, options?.baseDelayMs ?? 200),
|
|
78
|
+
maxDelayMs: Math.max(0, options?.maxDelayMs ?? 5_000),
|
|
79
|
+
isRetryable: options?.isRetryable ?? isRetryableError,
|
|
80
|
+
onRetry: options?.onRetry,
|
|
81
|
+
};
|
|
82
|
+
}
|
|
83
|
+
/**
|
|
84
|
+
* Computes the backoff for a given attempt using full jitter:
|
|
85
|
+
* `random(0, min(maxDelay, base * 2^(attempt-1)))`.
|
|
86
|
+
*
|
|
87
|
+
* The randomness is the point. Fixed backoff makes every worker that failed on
|
|
88
|
+
* the same S3 throttle retry at the same instant, reproducing the pile-up that
|
|
89
|
+
* caused the throttle.
|
|
90
|
+
*
|
|
91
|
+
* @param attempt - 1-based number of the attempt that just failed.
|
|
92
|
+
* @param random - Injectable for deterministic tests.
|
|
93
|
+
*/
|
|
94
|
+
function backoffDelay(attempt, policy, random = Math.random) {
|
|
95
|
+
const ceiling = Math.min(policy.maxDelayMs, policy.baseDelayMs * 2 ** (attempt - 1));
|
|
96
|
+
return Math.round(random() * ceiling);
|
|
97
|
+
}
|
|
98
|
+
/**
|
|
99
|
+
* Runs `task`, retrying per the policy.
|
|
100
|
+
*
|
|
101
|
+
* `task` receives the 1-based attempt number so adapters can log or vary
|
|
102
|
+
* behaviour (an idempotency key, say).
|
|
103
|
+
*
|
|
104
|
+
* @example
|
|
105
|
+
* ```ts
|
|
106
|
+
* await withRetry(resolveRetry({ attempts: 5 }), (attempt) => adapter.upload(file, { attempt, runId }));
|
|
107
|
+
* ```
|
|
108
|
+
*/
|
|
109
|
+
async function withRetry(policy, task, signal, random = Math.random) {
|
|
110
|
+
let lastError;
|
|
111
|
+
for (let attempt = 1; attempt <= policy.attempts; attempt++) {
|
|
112
|
+
try {
|
|
113
|
+
return await task(attempt);
|
|
114
|
+
}
|
|
115
|
+
catch (error) {
|
|
116
|
+
lastError = error;
|
|
117
|
+
const isLast = attempt === policy.attempts;
|
|
118
|
+
if (isLast || signal?.aborted || errors_js_1.LensError.is(error, 'ABORTED') || !policy.isRetryable(error)) {
|
|
119
|
+
throw error;
|
|
120
|
+
}
|
|
121
|
+
const delayMs = backoffDelay(attempt, policy, random);
|
|
122
|
+
policy.onRetry?.({ attempt, delayMs, error });
|
|
123
|
+
await (0, concurrency_js_1.delay)(delayMs, signal);
|
|
124
|
+
}
|
|
125
|
+
}
|
|
126
|
+
// Unreachable: the loop either returns or throws.
|
|
127
|
+
throw lastError;
|
|
128
|
+
}
|
|
129
|
+
//# sourceMappingURL=retry.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"retry.js","sourceRoot":"","sources":["../../src/retry.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,80 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* A `Request -> Response` upload handler.
|
|
3
|
+
*
|
|
4
|
+
* Built on the Web Fetch API types that Node 18+ provides natively, so the same
|
|
5
|
+
* function works as a Next.js Route Handler, a Remix action, a Hono/Elysia
|
|
6
|
+
* route, a Bun or Deno server, or a Cloudflare Worker proxy - with no framework
|
|
7
|
+
* adapter and no dependency.
|
|
8
|
+
*
|
|
9
|
+
* This is the server half of `@lens-image/react`'s `useImageUpload`: the hook POSTs
|
|
10
|
+
* multipart form data, this parses it, optimizes, and returns JSON.
|
|
11
|
+
*/
|
|
12
|
+
import type { ImageOptimizer } from './../optimizer.js';
|
|
13
|
+
import type { OptimizeOptions, OptimizeResult } from './../types.js';
|
|
14
|
+
/** Options for {@link createUploadHandler}. */
|
|
15
|
+
export interface UploadHandlerOptions {
|
|
16
|
+
/** The optimizer to run uploads through. */
|
|
17
|
+
readonly optimizer: ImageOptimizer;
|
|
18
|
+
/** Multipart field name to read files from. Default `'file'`. */
|
|
19
|
+
readonly fieldName?: string;
|
|
20
|
+
/** Files accepted per request. Default 1. */
|
|
21
|
+
readonly maxFiles?: number;
|
|
22
|
+
/**
|
|
23
|
+
* Per-request optimize options, or a function of the request.
|
|
24
|
+
*
|
|
25
|
+
* Use the function form for auth and tenancy - it is the right place to turn
|
|
26
|
+
* a session into a key prefix, and the wrong place to trust anything the
|
|
27
|
+
* client sent.
|
|
28
|
+
*/
|
|
29
|
+
readonly options?: Omit<OptimizeOptions, 'source'> | ((request: Request) => Omit<OptimizeOptions, 'source'> | Promise<Omit<OptimizeOptions, 'source'>>);
|
|
30
|
+
/**
|
|
31
|
+
* Reject the request before any work happens. Return a `Response` to
|
|
32
|
+
* short-circuit, or nothing to continue. This is your auth hook.
|
|
33
|
+
*/
|
|
34
|
+
readonly authorize?: (request: Request) => Response | undefined | Promise<Response | undefined>;
|
|
35
|
+
/** Shape the success payload. Default: {@link serializeResult} per file. */
|
|
36
|
+
readonly serialize?: (results: OptimizeResult[]) => unknown;
|
|
37
|
+
/** Observe failures. The response is generated either way. */
|
|
38
|
+
readonly onError?: (error: unknown, request: Request) => void;
|
|
39
|
+
}
|
|
40
|
+
/**
|
|
41
|
+
* Builds an upload route handler.
|
|
42
|
+
*
|
|
43
|
+
* Errors become JSON with the status from {@link LensError.status}, so a file
|
|
44
|
+
* that is too large is a 422 rather than a 500, without a try/catch in your route.
|
|
45
|
+
*
|
|
46
|
+
* @example Next.js App Router - `app/api/upload/route.ts`
|
|
47
|
+
* ```ts
|
|
48
|
+
* import { ImageOptimizer, createUploadHandler } from '@lens-image/core';
|
|
49
|
+
* import { S3Adapter } from '@lens-image/adapter-s3';
|
|
50
|
+
*
|
|
51
|
+
* const optimizer = new ImageOptimizer({
|
|
52
|
+
* adapter: new S3Adapter({ bucket: 'uploads', region: 'us-east-1' }),
|
|
53
|
+
* });
|
|
54
|
+
*
|
|
55
|
+
* export const POST = createUploadHandler({
|
|
56
|
+
* optimizer,
|
|
57
|
+
* maxFiles: 5,
|
|
58
|
+
* async authorize(req) {
|
|
59
|
+
* const session = await auth(req);
|
|
60
|
+
* if (!session) return Response.json({ error: 'Unauthorized' }, { status: 401 });
|
|
61
|
+
* return undefined;
|
|
62
|
+
* },
|
|
63
|
+
* options: async (req) => ({
|
|
64
|
+
* prefix: `users/${(await auth(req))!.userId}`,
|
|
65
|
+
* formats: ['webp', 'jpg'],
|
|
66
|
+
* sizes: [{ width: 1200 }, { width: 600 }],
|
|
67
|
+
* thumbnail: true,
|
|
68
|
+
* }),
|
|
69
|
+
* });
|
|
70
|
+
* ```
|
|
71
|
+
*/
|
|
72
|
+
export declare function createUploadHandler(options: UploadHandlerOptions): (request: Request) => Promise<Response>;
|
|
73
|
+
/**
|
|
74
|
+
* Trims a result down to what a browser actually needs.
|
|
75
|
+
*
|
|
76
|
+
* Notably drops `variant.data` - returning megabytes of base64 to a client that
|
|
77
|
+
* just uploaded those exact bytes is a common and expensive mistake.
|
|
78
|
+
*/
|
|
79
|
+
export declare function serializeResult(result: OptimizeResult): Record<string, unknown>;
|
|
80
|
+
//# sourceMappingURL=handler.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"handler.d.ts","sourceRoot":"","sources":["../../../src/server/handler.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;GAUG;AAGH,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,mBAAmB,CAAC;AACxD,OAAO,KAAK,EAAE,eAAe,EAAE,cAAc,EAAW,MAAM,eAAe,CAAC;AAgB9E,+CAA+C;AAC/C,MAAM,WAAW,oBAAoB;IACnC,4CAA4C;IAC5C,QAAQ,CAAC,SAAS,EAAE,cAAc,CAAC;IAEnC,iEAAiE;IACjE,QAAQ,CAAC,SAAS,CAAC,EAAE,MAAM,CAAC;IAE5B,6CAA6C;IAC7C,QAAQ,CAAC,QAAQ,CAAC,EAAE,MAAM,CAAC;IAE3B;;;;;;OAMG;IACH,QAAQ,CAAC,OAAO,CAAC,EACb,IAAI,CAAC,eAAe,EAAE,QAAQ,CAAC,GAC/B,CAAC,CAAC,OAAO,EAAE,OAAO,KAAK,IAAI,CAAC,eAAe,EAAE,QAAQ,CAAC,GAAG,OAAO,CAAC,IAAI,CAAC,eAAe,EAAE,QAAQ,CAAC,CAAC,CAAC,CAAC;IAEvG;;;OAGG;IACH,QAAQ,CAAC,SAAS,CAAC,EAAE,CAAC,OAAO,EAAE,OAAO,KAAK,QAAQ,GAAG,SAAS,GAAG,OAAO,CAAC,QAAQ,GAAG,SAAS,CAAC,CAAC;IAEhG,4EAA4E;IAC5E,QAAQ,CAAC,SAAS,CAAC,EAAE,CAAC,OAAO,EAAE,cAAc,EAAE,KAAK,OAAO,CAAC;IAE5D,8DAA8D;IAC9D,QAAQ,CAAC,OAAO,CAAC,EAAE,CAAC,KAAK,EAAE,OAAO,EAAE,OAAO,EAAE,OAAO,KAAK,IAAI,CAAC;CAC/D;AAED;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA+BG;AACH,wBAAgB,mBAAmB,CACjC,OAAO,EAAE,oBAAoB,GAC5B,CAAC,OAAO,EAAE,OAAO,KAAK,OAAO,CAAC,QAAQ,CAAC,CAyEzC;AAED;;;;;GAKG;AACH,wBAAgB,eAAe,CAAC,MAAM,EAAE,cAAc,GAAG,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAgC/E"}
|
|
@@ -0,0 +1,155 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
/**
|
|
3
|
+
* A `Request -> Response` upload handler.
|
|
4
|
+
*
|
|
5
|
+
* Built on the Web Fetch API types that Node 18+ provides natively, so the same
|
|
6
|
+
* function works as a Next.js Route Handler, a Remix action, a Hono/Elysia
|
|
7
|
+
* route, a Bun or Deno server, or a Cloudflare Worker proxy - with no framework
|
|
8
|
+
* adapter and no dependency.
|
|
9
|
+
*
|
|
10
|
+
* This is the server half of `@lens-image/react`'s `useImageUpload`: the hook POSTs
|
|
11
|
+
* multipart form data, this parses it, optimizes, and returns JSON.
|
|
12
|
+
*/
|
|
13
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
14
|
+
exports.createUploadHandler = createUploadHandler;
|
|
15
|
+
exports.serializeResult = serializeResult;
|
|
16
|
+
const errors_js_1 = require("./../errors.js");
|
|
17
|
+
/**
|
|
18
|
+
* Builds an upload route handler.
|
|
19
|
+
*
|
|
20
|
+
* Errors become JSON with the status from {@link LensError.status}, so a file
|
|
21
|
+
* that is too large is a 422 rather than a 500, without a try/catch in your route.
|
|
22
|
+
*
|
|
23
|
+
* @example Next.js App Router - `app/api/upload/route.ts`
|
|
24
|
+
* ```ts
|
|
25
|
+
* import { ImageOptimizer, createUploadHandler } from '@lens-image/core';
|
|
26
|
+
* import { S3Adapter } from '@lens-image/adapter-s3';
|
|
27
|
+
*
|
|
28
|
+
* const optimizer = new ImageOptimizer({
|
|
29
|
+
* adapter: new S3Adapter({ bucket: 'uploads', region: 'us-east-1' }),
|
|
30
|
+
* });
|
|
31
|
+
*
|
|
32
|
+
* export const POST = createUploadHandler({
|
|
33
|
+
* optimizer,
|
|
34
|
+
* maxFiles: 5,
|
|
35
|
+
* async authorize(req) {
|
|
36
|
+
* const session = await auth(req);
|
|
37
|
+
* if (!session) return Response.json({ error: 'Unauthorized' }, { status: 401 });
|
|
38
|
+
* return undefined;
|
|
39
|
+
* },
|
|
40
|
+
* options: async (req) => ({
|
|
41
|
+
* prefix: `users/${(await auth(req))!.userId}`,
|
|
42
|
+
* formats: ['webp', 'jpg'],
|
|
43
|
+
* sizes: [{ width: 1200 }, { width: 600 }],
|
|
44
|
+
* thumbnail: true,
|
|
45
|
+
* }),
|
|
46
|
+
* });
|
|
47
|
+
* ```
|
|
48
|
+
*/
|
|
49
|
+
function createUploadHandler(options) {
|
|
50
|
+
const { optimizer, fieldName = 'file', maxFiles = 1, authorize, serialize = (results) => ({ files: results.map(serializeResult) }), onError, } = options;
|
|
51
|
+
return async function handleUpload(request) {
|
|
52
|
+
if (request.method !== 'POST') {
|
|
53
|
+
return json({ error: 'Method not allowed', code: 'METHOD_NOT_ALLOWED' }, 405, {
|
|
54
|
+
Allow: 'POST',
|
|
55
|
+
});
|
|
56
|
+
}
|
|
57
|
+
try {
|
|
58
|
+
const rejection = await authorize?.(request);
|
|
59
|
+
if (rejection)
|
|
60
|
+
return rejection;
|
|
61
|
+
const form = await readForm(request);
|
|
62
|
+
const files = form.getAll(fieldName).filter(isFileLike);
|
|
63
|
+
if (files.length === 0) {
|
|
64
|
+
return json({
|
|
65
|
+
error: `No files found in the "${fieldName}" field.`,
|
|
66
|
+
code: 'VALIDATION_FAILED',
|
|
67
|
+
}, 400);
|
|
68
|
+
}
|
|
69
|
+
if (files.length > maxFiles) {
|
|
70
|
+
return json({
|
|
71
|
+
error: `Received ${files.length} files, the limit is ${maxFiles}.`,
|
|
72
|
+
code: 'VALIDATION_FAILED',
|
|
73
|
+
}, 413);
|
|
74
|
+
}
|
|
75
|
+
const perRequest = typeof options.options === 'function' ? await options.options(request) : (options.options ?? {});
|
|
76
|
+
// Sequential on purpose: each optimize call already fans out internally,
|
|
77
|
+
// and overlapping whole files multiplies peak memory.
|
|
78
|
+
const results = [];
|
|
79
|
+
for (const file of files) {
|
|
80
|
+
results.push(await optimizer.optimize({
|
|
81
|
+
...perRequest,
|
|
82
|
+
source: new Uint8Array(await file.arrayBuffer()),
|
|
83
|
+
filename: file.name || 'upload',
|
|
84
|
+
...(request.signal ? { signal: request.signal } : {}),
|
|
85
|
+
}));
|
|
86
|
+
}
|
|
87
|
+
return json(serialize(results), 200);
|
|
88
|
+
}
|
|
89
|
+
catch (error) {
|
|
90
|
+
onError?.(error, request);
|
|
91
|
+
if (errors_js_1.LensError.is(error)) {
|
|
92
|
+
return json({ error: error.message, code: error.code, details: error.details }, error.status);
|
|
93
|
+
}
|
|
94
|
+
return json({ error: 'Image processing failed.', code: 'INTERNAL_ERROR' }, 500);
|
|
95
|
+
}
|
|
96
|
+
};
|
|
97
|
+
}
|
|
98
|
+
/**
|
|
99
|
+
* Trims a result down to what a browser actually needs.
|
|
100
|
+
*
|
|
101
|
+
* Notably drops `variant.data` - returning megabytes of base64 to a client that
|
|
102
|
+
* just uploaded those exact bytes is a common and expensive mistake.
|
|
103
|
+
*/
|
|
104
|
+
function serializeResult(result) {
|
|
105
|
+
const strip = (variant) => {
|
|
106
|
+
const { data: _data, ...rest } = variant;
|
|
107
|
+
return rest;
|
|
108
|
+
};
|
|
109
|
+
return {
|
|
110
|
+
id: result.id,
|
|
111
|
+
source: {
|
|
112
|
+
filename: result.source.filename,
|
|
113
|
+
format: result.source.format,
|
|
114
|
+
width: result.source.width,
|
|
115
|
+
height: result.source.height,
|
|
116
|
+
size: result.source.size,
|
|
117
|
+
},
|
|
118
|
+
formats: Object.fromEntries(Object.entries(result.formats).map(([format, group]) => [
|
|
119
|
+
format,
|
|
120
|
+
{
|
|
121
|
+
urls: group.urls,
|
|
122
|
+
srcset: group.srcset,
|
|
123
|
+
size: group.size,
|
|
124
|
+
variants: group.variants.map(strip),
|
|
125
|
+
},
|
|
126
|
+
])),
|
|
127
|
+
...(result.thumbnail ? { thumbnail: strip(result.thumbnail) } : {}),
|
|
128
|
+
totalSize: result.totalSize,
|
|
129
|
+
savings: result.savings,
|
|
130
|
+
durationMs: result.durationMs,
|
|
131
|
+
warnings: result.warnings.map((w) => ({ code: w.code, message: w.message })),
|
|
132
|
+
};
|
|
133
|
+
}
|
|
134
|
+
async function readForm(request) {
|
|
135
|
+
try {
|
|
136
|
+
return await request.formData();
|
|
137
|
+
}
|
|
138
|
+
catch (error) {
|
|
139
|
+
throw new errors_js_1.LensError('INVALID_SOURCE', 'Request body is not valid multipart/form-data. Send the file with FormData, not as a raw body.', { cause: error });
|
|
140
|
+
}
|
|
141
|
+
}
|
|
142
|
+
/** Duck-typed so it works with Node's File, the DOM's File, Bun's and Deno's. */
|
|
143
|
+
function isFileLike(value) {
|
|
144
|
+
return (typeof value === 'object' &&
|
|
145
|
+
value !== null &&
|
|
146
|
+
typeof value.arrayBuffer === 'function' &&
|
|
147
|
+
'name' in value);
|
|
148
|
+
}
|
|
149
|
+
function json(body, status, headers = {}) {
|
|
150
|
+
return new Response(JSON.stringify(body), {
|
|
151
|
+
status,
|
|
152
|
+
headers: { 'content-type': 'application/json; charset=utf-8', ...headers },
|
|
153
|
+
});
|
|
154
|
+
}
|
|
155
|
+
//# sourceMappingURL=handler.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"handler.js","sourceRoot":"","sources":["../../../src/server/handler.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,37 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Container sniffing: format and dimensions straight from the file header.
|
|
3
|
+
*
|
|
4
|
+
* This is deliberately dependency-free and decode-free. It exists so Lens can
|
|
5
|
+
* reject a 40,000 x 40,000 PNG *before* handing 1.6 gigapixels to a codec -
|
|
6
|
+
* the classic decompression-bomb footgun. It also means validation works
|
|
7
|
+
* identically whether or not sharp is installed.
|
|
8
|
+
*
|
|
9
|
+
* Supported: JPEG, PNG, GIF, WebP, AVIF/HEIC, TIFF, BMP, ICO, SVG.
|
|
10
|
+
*/
|
|
11
|
+
import type { DetectedFormat, ImageMetadata } from './types.js';
|
|
12
|
+
/** Bytes we need before a decision can be made for any supported format. */
|
|
13
|
+
export declare const SNIFF_HEADER_BYTES = 4096;
|
|
14
|
+
/**
|
|
15
|
+
* Identifies an image and reads its intrinsic size from the header alone.
|
|
16
|
+
*
|
|
17
|
+
* Never throws: an unrecognised buffer comes back as
|
|
18
|
+
* `{ format: 'unknown', width: 0, height: 0 }` and the caller decides whether
|
|
19
|
+
* that is fatal.
|
|
20
|
+
*
|
|
21
|
+
* @param bytes - The full file, or at least the first {@link SNIFF_HEADER_BYTES}.
|
|
22
|
+
* @param totalSize - Real byte length, when `bytes` is only a prefix.
|
|
23
|
+
*
|
|
24
|
+
* @example
|
|
25
|
+
* ```ts
|
|
26
|
+
* const meta = sniff(await readFile('photo.jpg'));
|
|
27
|
+
* // { format: 'jpeg', width: 4032, height: 3024, size: 2118431, orientation: 6 }
|
|
28
|
+
* ```
|
|
29
|
+
*/
|
|
30
|
+
export declare function sniff(bytes: Uint8Array, totalSize?: number): ImageMetadata;
|
|
31
|
+
/** Just the format, when dimensions are not needed. */
|
|
32
|
+
export declare function sniffFormat(bytes: Uint8Array): DetectedFormat;
|
|
33
|
+
/** Canonical MIME type for a detected format. */
|
|
34
|
+
export declare function mimeTypeFor(format: DetectedFormat): string;
|
|
35
|
+
/** File extension (no dot) for a format. `jpeg` becomes `jpg`, as it should. */
|
|
36
|
+
export declare function extensionFor(format: DetectedFormat): string;
|
|
37
|
+
//# sourceMappingURL=sniff.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"sniff.d.ts","sourceRoot":"","sources":["../../src/sniff.ts"],"names":[],"mappings":"AAAA;;;;;;;;;GASG;AAEH,OAAO,KAAK,EAAE,cAAc,EAAE,aAAa,EAAE,MAAM,YAAY,CAAC;AAEhE,4EAA4E;AAC5E,eAAO,MAAM,kBAAkB,OAAO,CAAC;AA8BvC;;;;;;;;;;;;;;;GAeG;AACH,wBAAgB,KAAK,CAAC,KAAK,EAAE,UAAU,EAAE,SAAS,SAAmB,GAAG,aAAa,CAcpF;AAED,uDAAuD;AACvD,wBAAgB,WAAW,CAAC,KAAK,EAAE,UAAU,GAAG,cAAc,CAE7D;AAED,iDAAiD;AACjD,wBAAgB,WAAW,CAAC,MAAM,EAAE,cAAc,GAAG,MAAM,CAyB1D;AAED,gFAAgF;AAChF,wBAAgB,YAAY,CAAC,MAAM,EAAE,cAAc,GAAG,MAAM,CAW3D"}
|