@zlooks.cn/images-server 1.1.1 → 1.1.2

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.
@@ -20,7 +20,7 @@ export function createImagesProvider(images) {
20
20
  title: '上传图片',
21
21
  inputSchema: uploadImageSchema,
22
22
  outputSchema: imageMetadataSchema,
23
- description: '通过 Base64(解码后至多 6 MiB)上传调用方持有的 JPEG、PNG、WebP、GIF 或 AVIF 原图;不接受 URL 导入或本地路径,不下载远程图片。对完整文件字节进行标准 Base64 编码,提交前按 base64 参数说明检查字符、填充、长度和大小,不要提交截断内容。总像素最多 40 MP(动画按全部帧计),不接受 SVG、不转换原始内容。只有持久化并提交 ready 后成功返回元数据与公开 URL。响应丢失时,同一调用方用原幂等键和完全相同输入重试,不会重复创建;IDEMPOTENCY_CONFLICT 表示同键输入不同。UPLOAD_NOT_READY 时先读取 images://image/{id} Resource 或调用 images.list-image 确认状态:uploading 不另建重复上传,确认 failed 后新上传使用新幂等键,deleted 不会复活。文件名仅用于搜索,不能指定存储路径。',
23
+ description: '通过 Base64(解码后至多 6 MiB)上传调用方持有的 JPEG、PNG、WebP、GIF 或 AVIF 图片;不接受 URL 导入或本地路径,不下载远程图片。compress=true 时保持格式、尺寸和最终文件名,以重新编码后的文件替换原始字节;小文件或已高度压缩的输入不保证变小。省略或 false 时原样保存。对完整文件字节进行标准 Base64 编码,提交前按 base64 参数说明检查字符、填充、长度和大小,不要提交截断内容。总像素最多 40 MP(动画按全部帧计),不接受 SVG。只有持久化并提交 ready 后成功返回最终文件元数据与公开 URL。响应丢失时,同一调用方用原幂等键和完全相同输入重试,不会重复创建;IDEMPOTENCY_CONFLICT 表示同键输入不同。UPLOAD_NOT_READY 时先读取 images://image/{id} Resource 或调用 images.list-image 确认状态:uploading 不另建重复上传,确认 failed 后新上传使用新幂等键,deleted 不会复活。文件名仅用于搜索,不能指定存储路径。',
24
24
  access: writeAccess,
25
25
  annotations: {
26
26
  readOnlyHint: false,
@@ -48,7 +48,7 @@ export function createImagesProvider(images) {
48
48
  title: '删除图片',
49
49
  inputSchema: deleteImageSchema,
50
50
  outputSchema: imageMetadataSchema,
51
- description: '永久删除本地原图并禁用新的源站读取。先读取 images://image/{id} Resource 核对目标并向用户确认,再提交 id 和 expectedSha256,无需删除幂等键。只允许 ready、deleting 或已 deleted 的记录;HASH_CONFLICT 或 STATE_CONFLICT 时重新读取,不能猜测摘要重试。清理失败或响应丢失后用原 ID 与摘要重试;并发和重复删除安全,成功返回 deleted 元数据且保留首次 deletedAt。此操作不能撤销,也无法清除浏览器或第三方已缓存的副本。',
51
+ description: '永久删除本地图片文件并禁用新的源站读取。先读取 images://image/{id} Resource 核对目标并向用户确认,再提交 id 和 expectedSha256,无需删除幂等键。只允许 ready、deleting 或已 deleted 的记录;HASH_CONFLICT 或 STATE_CONFLICT 时重新读取,不能猜测摘要重试。清理失败或响应丢失后用原 ID 与摘要重试;并发和重复删除安全,成功返回 deleted 元数据且保留首次 deletedAt。此操作不能撤销,也无法清除浏览器或第三方已缓存的副本。',
52
52
  access: writeAccess,
53
53
  annotations: {
54
54
  readOnlyHint: false,
@@ -1 +1 @@
1
- {"version":3,"file":"provider.js","sourceRoot":"","sources":["../../src/mcp/provider.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"provider.js","sourceRoot":"","sources":["../../src/mcp/provider.ts"],"names":[],"mappings":"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"}
@@ -36,6 +36,7 @@ declare const _default: import("@hile/micro").MicroContractMessage<{
36
36
  code: import("zod").ZodEnum<{
37
37
  HASH_CONFLICT: "HASH_CONFLICT";
38
38
  IDEMPOTENCY_CONFLICT: "IDEMPOTENCY_CONFLICT";
39
+ IMAGE_COMPRESSION_FAILED: "IMAGE_COMPRESSION_FAILED";
39
40
  IMAGE_TOO_LARGE: "IMAGE_TOO_LARGE";
40
41
  INVALID_BASE64: "INVALID_BASE64";
41
42
  INVALID_CURSOR: "INVALID_CURSOR";
@@ -6,6 +6,7 @@ declare const _default: import("@hile/micro").MicroContractMessage<{
6
6
  code: import("zod").ZodEnum<{
7
7
  HASH_CONFLICT: "HASH_CONFLICT";
8
8
  IDEMPOTENCY_CONFLICT: "IDEMPOTENCY_CONFLICT";
9
+ IMAGE_COMPRESSION_FAILED: "IMAGE_COMPRESSION_FAILED";
9
10
  IMAGE_TOO_LARGE: "IMAGE_TOO_LARGE";
10
11
  INVALID_BASE64: "INVALID_BASE64";
11
12
  INVALID_CURSOR: "INVALID_CURSOR";
@@ -69,6 +69,7 @@ declare const _default: import("@hile/micro").MicroContractMessage<{
69
69
  code: import("zod").ZodEnum<{
70
70
  HASH_CONFLICT: "HASH_CONFLICT";
71
71
  IDEMPOTENCY_CONFLICT: "IDEMPOTENCY_CONFLICT";
72
+ IMAGE_COMPRESSION_FAILED: "IMAGE_COMPRESSION_FAILED";
72
73
  IMAGE_TOO_LARGE: "IMAGE_TOO_LARGE";
73
74
  INVALID_BASE64: "INVALID_BASE64";
74
75
  INVALID_CURSOR: "INVALID_CURSOR";
@@ -35,6 +35,7 @@ declare const _default: import("@hile/micro").MicroContractMessage<{
35
35
  code: import("zod").ZodEnum<{
36
36
  HASH_CONFLICT: "HASH_CONFLICT";
37
37
  IDEMPOTENCY_CONFLICT: "IDEMPOTENCY_CONFLICT";
38
+ IMAGE_COMPRESSION_FAILED: "IMAGE_COMPRESSION_FAILED";
38
39
  IMAGE_TOO_LARGE: "IMAGE_TOO_LARGE";
39
40
  INVALID_BASE64: "INVALID_BASE64";
40
41
  INVALID_CURSOR: "INVALID_CURSOR";
@@ -7,6 +7,7 @@ declare const _default: import("@hile/micro").MicroContractMessage<{
7
7
  filename: import("zod").ZodOptional<import("zod").ZodString>;
8
8
  source: import("zod").ZodLiteral<"base64">;
9
9
  base64: import("zod").ZodString;
10
+ compress: import("zod").ZodOptional<import("zod").ZodBoolean>;
10
11
  }, import("zod/v4/core").$strict>;
11
12
  }, import("zod/v4/core").$strict>;
12
13
  readonly output: import("zod").ZodUnion<readonly [import("zod").ZodObject<{
@@ -41,6 +42,7 @@ declare const _default: import("@hile/micro").MicroContractMessage<{
41
42
  code: import("zod").ZodEnum<{
42
43
  HASH_CONFLICT: "HASH_CONFLICT";
43
44
  IDEMPOTENCY_CONFLICT: "IDEMPOTENCY_CONFLICT";
45
+ IMAGE_COMPRESSION_FAILED: "IMAGE_COMPRESSION_FAILED";
44
46
  IMAGE_TOO_LARGE: "IMAGE_TOO_LARGE";
45
47
  INVALID_BASE64: "INVALID_BASE64";
46
48
  INVALID_CURSOR: "INVALID_CURSOR";
@@ -2,7 +2,7 @@ import type { InvocationContext } from '@hile/context';
2
2
  import { type ModelDefinition } from '@hile/model';
3
3
  export declare function loadImageModel<TInput extends object, TOutput>(model: ModelDefinition<TInput, TOutput>, input: TInput, invocation: InvocationContext): Promise<TOutput | {
4
4
  outcome: "error";
5
- code: "HASH_CONFLICT" | "IDEMPOTENCY_CONFLICT" | "IMAGE_TOO_LARGE" | "INVALID_BASE64" | "INVALID_CURSOR" | "INVALID_IMAGE" | "INVALID_PATH" | "NOT_FOUND" | "STATE_CONFLICT" | "UPLOAD_NOT_READY";
5
+ code: "HASH_CONFLICT" | "IDEMPOTENCY_CONFLICT" | "IMAGE_COMPRESSION_FAILED" | "IMAGE_TOO_LARGE" | "INVALID_BASE64" | "INVALID_CURSOR" | "INVALID_IMAGE" | "INVALID_PATH" | "NOT_FOUND" | "STATE_CONFLICT" | "UPLOAD_NOT_READY";
6
6
  message: string;
7
7
  }>;
8
8
  //# sourceMappingURL=model-message.d.ts.map
@@ -5,6 +5,7 @@ declare const _default: import("@hile/model").ModelDefinition<{
5
5
  filename?: string | undefined;
6
6
  source: "base64";
7
7
  base64: string;
8
+ compress?: boolean | undefined;
8
9
  };
9
10
  }, {
10
11
  id: string;
@@ -3,6 +3,7 @@ import { loadService } from '@hile/core';
3
3
  import { defineModel } from '@hile/model';
4
4
  import { imageUploadCommandSchema } from '@zlooks.cn/images-shared';
5
5
  import { ImageError } from '../domain/image-error.js';
6
+ import { compressImage } from '../storage/compress-image.js';
6
7
  import { inspectImage } from '../storage/inspect-image.js';
7
8
  import { imageRelativePath } from '../storage/image-path.js';
8
9
  import { readUploadBytes } from '../storage/read-upload-bytes.js';
@@ -15,7 +16,9 @@ export default defineModel(async (input, invocation) => {
15
16
  const { store, storage, origin } = await loadService(imagesRuntimeService);
16
17
  const signal = AbortSignal.any([invocation.signal, AbortSignal.timeout(45_000)]);
17
18
  signal.throwIfAborted();
18
- const hash = createHash('sha256').update(JSON.stringify(upload)).digest('hex');
19
+ const { compress, ...legacyUpload } = upload;
20
+ const fingerprintInput = compress ? upload : legacyUpload;
21
+ const hash = createHash('sha256').update(JSON.stringify(fingerprintInput)).digest('hex');
19
22
  const reserved = await store.reserve(command.actor, upload.idempotencyKey, hash, upload.filename ?? null);
20
23
  if (!reserved.created) {
21
24
  if (reserved.row.status === 'ready')
@@ -24,9 +27,13 @@ export default defineModel(async (input, invocation) => {
24
27
  }
25
28
  const id = reserved.row.id;
26
29
  try {
27
- const bytes = await readUploadBytes(upload, signal);
30
+ const source = await readUploadBytes(upload, signal);
28
31
  signal.throwIfAborted();
29
- const metadata = await inspectImage(bytes);
32
+ const sourceMetadata = await inspectImage(source);
33
+ const bytes = compress
34
+ ? await compressImage(source, sourceMetadata.mediaType, signal)
35
+ : source;
36
+ const metadata = compress ? await inspectImage(bytes) : sourceMetadata;
30
37
  signal.throwIfAborted();
31
38
  const relativePath = imageRelativePath(id, metadata.extension, reserved.row.createdAt);
32
39
  await store.transition(id, 'uploading', { ...metadata, relativePath }, signal);
@@ -1 +1 @@
1
- {"version":3,"file":"upload-image.model.js","sourceRoot":"","sources":["../../src/models/upload-image.model.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"upload-image.model.js","sourceRoot":"","sources":["../../src/models/upload-image.model.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,MAAM,aAAa,CAAC;AACzC,OAAO,EAAE,WAAW,EAAE,MAAM,YAAY,CAAC;AACzC,OAAO,EAAE,WAAW,EAAE,MAAM,aAAa,CAAC;AAC1C,OAAO,EAAE,wBAAwB,EAA2B,MAAM,0BAA0B,CAAC;AAC7F,OAAO,EAAE,UAAU,EAAE,MAAM,0BAA0B,CAAC;AACtD,OAAO,EAAE,aAAa,EAAE,MAAM,8BAA8B,CAAC;AAC7D,OAAO,EAAE,YAAY,EAAE,MAAM,6BAA6B,CAAC;AAC3D,OAAO,EAAE,iBAAiB,EAAE,MAAM,0BAA0B,CAAC;AAC7D,OAAO,EAAE,eAAe,EAAE,MAAM,iCAAiC,CAAC;AAClE,OAAO,EAAE,eAAe,EAAsB,MAAM,qCAAqC,CAAC;AAC1F,OAAO,oBAAoB,MAAM,uCAAuC,CAAC;AAEzE,eAAe,WAAW,CACxB,KAAK,EAAE,KAAK,EAAE,UAAU,EAAE,EAAE;IAC1B,UAAU,CAAC,MAAM,CAAC,cAAc,EAAE,CAAC;IACnC,MAAM,OAAO,GAAG,wBAAwB,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC;IACtD,MAAM,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC;IAC9B,MAAM,EAAE,KAAK,EAAE,OAAO,EAAE,MAAM,EAAE,GAAG,MAAM,WAAW,CAAC,oBAAoB,CAAC,CAAC;IAC3E,MAAM,MAAM,GAAG,WAAW,CAAC,GAAG,CAAC,CAAC,UAAU,CAAC,MAAM,EAAE,WAAW,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC;IACjF,MAAM,CAAC,cAAc,EAAE,CAAC;IACxB,MAAM,EAAE,QAAQ,EAAE,GAAG,YAAY,EAAE,GAAG,MAAM,CAAC;IAC7C,MAAM,gBAAgB,GAAG,QAAQ,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,YAAY,CAAC;IAC1D,MAAM,IAAI,GAAG,UAAU,CAAC,QAAQ,CAAC,CAAC,MAAM,CAAC,IAAI,CAAC,SAAS,CAAC,gBAAgB,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;IACzF,MAAM,QAAQ,GAAG,MAAM,KAAK,CAAC,OAAO,CAClC,OAAO,CAAC,KAAK,EACb,MAAM,CAAC,cAAc,EACrB,IAAI,EACJ,MAAM,CAAC,QAAQ,IAAI,IAAI,CACxB,CAAC;IACF,IAAI,CAAC,QAAQ,CAAC,OAAO,EAAE,CAAC;QACtB,IAAI,QAAQ,CAAC,GAAG,CAAC,MAAM,KAAK,OAAO;YAAE,OAAO,eAAe,CAAC,QAAQ,CAAC,GAAG,EAAE,MAAM,EAAE,CAAC,CAAC;QACpF,MAAM,IAAI,UAAU,CAClB,kBAAkB,EAClB,gCAAgC,CACjC,CAAC;IACJ,CAAC;IACD,MAAM,EAAE,GAAG,QAAQ,CAAC,GAAG,CAAC,EAAE,CAAC;IAC3B,IAAI,CAAC;QACH,MAAM,MAAM,GAAG,MAAM,eAAe,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;QACrD,MAAM,CAAC,cAAc,EAAE,CAAC;QACxB,MAAM,cAAc,GAAG,MAAM,YAAY,CAAC,MAAM,CAAC,CAAC;QAClD,MAAM,KAAK,GAAG,QAAQ;YACpB,CAAC,CAAC,MAAM,aAAa,CAAC,MAAM,EAAE,cAAc,CAAC,SAAS,EAAE,MAAM,CAAC;YAC/D,CAAC,CAAC,MAAM,CAAC;QACX,MAAM,QAAQ,GAAG,QAAQ,CAAC,CAAC,CAAC,MAAM,YAAY,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,cAAc,CAAC;QACvE,MAAM,CAAC,cAAc,EAAE,CAAC;QACxB,MAAM,YAAY,GAAG,iBAAiB,CAAC,EAAE,EAAE,QAAQ,CAAC,SAAS,EAAE,QAAQ,CAAC,GAAG,CAAC,SAAS,CAAC,CAAC;QACvF,MAAM,KAAK,CAAC,UAAU,CAAC,EAAE,EAAE,WAAW,EAAE,EAAE,GAAG,QAAQ,EAAE,YAAY,EAAE,EAAE,MAAM,CAAC,CAAC;QAC/E,MAAM,OAAO,CAAC,OAAO,CAAC,YAAY,EAAE,KAAK,CAAC,CAAC;QAC3C,MAAM,CAAC,cAAc,EAAE,CAAC;QACxB,MAAM,KAAK,CAAC,UAAU,CACpB,EAAE,EACF,WAAW,EACX,EAAE,MAAM,EAAE,OAAO,EAAE,OAAO,EAAE,IAAI,IAAI,EAAE,EAAE,EACxC,MAAM,CACP,CAAC;QACF,OAAO,eAAe,CAAC,MAAM,KAAK,CAAC,IAAI,CAAC,EAAE,CAAC,EAAE,MAAM,EAAE,CAAC,CAAC;IACzD,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,MAAM,OAAO,GAAG,MAAM,KAAK,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;QACrC,IAAI,OAAO,CAAC,MAAM,KAAK,OAAO;YAAE,OAAO,eAAe,CAAC,OAAO,EAAE,MAAM,EAAE,CAAC,CAAC;QAC1E,IAAI,OAAO,CAAC,MAAM,KAAK,WAAW,EAAE,CAAC;YACnC,MAAM,KAAK,CAAC,UAAU,CAAC,EAAE,EAAE,WAAW,EAAE;gBACtC,MAAM,EAAE,QAAQ;gBAChB,WAAW,EAAE,KAAK,YAAY,UAAU,CAAC,CAAC,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,CAAC,eAAe;aACxE,CAAC,CAAC;QACL,CAAC;QACD,IAAI,OAAO,CAAC,YAAY;YAAE,MAAM,OAAO,CAAC,MAAM,CAAC,OAAO,CAAC,YAAY,CAAC,CAAC;QACrE,MAAM,KAAK,CAAC;IACd,CAAC;AACH,CAAC,CACF,CAAC"}
@@ -0,0 +1,3 @@
1
+ import type { ImageMetadata } from '@zlooks.cn/images-shared';
2
+ export declare function compressImage(bytes: Buffer, mediaType: NonNullable<ImageMetadata['mediaType']>, signal: AbortSignal): Promise<Buffer>;
3
+ //# sourceMappingURL=compress-image.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"compress-image.d.ts","sourceRoot":"","sources":["../../src/storage/compress-image.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,0BAA0B,CAAC;AAI9D,wBAAsB,aAAa,CACjC,KAAK,EAAE,MAAM,EACb,SAAS,EAAE,WAAW,CAAC,aAAa,CAAC,WAAW,CAAC,CAAC,EAClD,MAAM,EAAE,WAAW,GAClB,OAAO,CAAC,MAAM,CAAC,CAajB"}
@@ -0,0 +1,37 @@
1
+ import sharp from 'sharp';
2
+ import { ImageError } from '../domain/image-error.js';
3
+ import { imageInputOptions } from './inspect-image.js';
4
+ export async function compressImage(bytes, mediaType, signal) {
5
+ signal.throwIfAborted();
6
+ try {
7
+ const image = sharp(bytes, imageInputOptions)
8
+ .keepMetadata()
9
+ .timeout({ seconds: 10 });
10
+ const compressed = await encode(image, mediaType).toBuffer();
11
+ signal.throwIfAborted();
12
+ return compressed;
13
+ }
14
+ catch {
15
+ signal.throwIfAborted();
16
+ throw new ImageError('IMAGE_COMPRESSION_FAILED', '图片压缩失败');
17
+ }
18
+ }
19
+ function encode(image, mediaType) {
20
+ if (mediaType === 'image/jpeg')
21
+ return image.jpeg({ quality: 80, mozjpeg: true });
22
+ if (mediaType === 'image/png') {
23
+ return image.png({
24
+ compressionLevel: 9,
25
+ adaptiveFiltering: true,
26
+ palette: true,
27
+ quality: 80,
28
+ effort: 10,
29
+ });
30
+ }
31
+ if (mediaType === 'image/webp')
32
+ return image.webp({ quality: 80, effort: 6 });
33
+ if (mediaType === 'image/gif')
34
+ return image.gif({ colours: 128, effort: 10 });
35
+ return image.avif({ quality: 50, effort: 6 });
36
+ }
37
+ //# sourceMappingURL=compress-image.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"compress-image.js","sourceRoot":"","sources":["../../src/storage/compress-image.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,MAAM,OAAO,CAAC;AAE1B,OAAO,EAAE,UAAU,EAAE,MAAM,0BAA0B,CAAC;AACtD,OAAO,EAAE,iBAAiB,EAAE,MAAM,oBAAoB,CAAC;AAEvD,MAAM,CAAC,KAAK,UAAU,aAAa,CACjC,KAAa,EACb,SAAkD,EAClD,MAAmB;IAEnB,MAAM,CAAC,cAAc,EAAE,CAAC;IACxB,IAAI,CAAC;QACH,MAAM,KAAK,GAAG,KAAK,CAAC,KAAK,EAAE,iBAAiB,CAAC;aAC1C,YAAY,EAAE;aACd,OAAO,CAAC,EAAE,OAAO,EAAE,EAAE,EAAE,CAAC,CAAC;QAC5B,MAAM,UAAU,GAAG,MAAM,MAAM,CAAC,KAAK,EAAE,SAAS,CAAC,CAAC,QAAQ,EAAE,CAAC;QAC7D,MAAM,CAAC,cAAc,EAAE,CAAC;QACxB,OAAO,UAAU,CAAC;IACpB,CAAC;IAAC,MAAM,CAAC;QACP,MAAM,CAAC,cAAc,EAAE,CAAC;QACxB,MAAM,IAAI,UAAU,CAAC,0BAA0B,EAAE,QAAQ,CAAC,CAAC;IAC7D,CAAC;AACH,CAAC;AAED,SAAS,MAAM,CACb,KAA+B,EAC/B,SAAkD;IAElD,IAAI,SAAS,KAAK,YAAY;QAAE,OAAO,KAAK,CAAC,IAAI,CAAC,EAAE,OAAO,EAAE,EAAE,EAAE,OAAO,EAAE,IAAI,EAAE,CAAC,CAAC;IAClF,IAAI,SAAS,KAAK,WAAW,EAAE,CAAC;QAC9B,OAAO,KAAK,CAAC,GAAG,CAAC;YACf,gBAAgB,EAAE,CAAC;YACnB,iBAAiB,EAAE,IAAI;YACvB,OAAO,EAAE,IAAI;YACb,OAAO,EAAE,EAAE;YACX,MAAM,EAAE,EAAE;SACX,CAAC,CAAC;IACL,CAAC;IACD,IAAI,SAAS,KAAK,YAAY;QAAE,OAAO,KAAK,CAAC,IAAI,CAAC,EAAE,OAAO,EAAE,EAAE,EAAE,MAAM,EAAE,CAAC,EAAE,CAAC,CAAC;IAC9E,IAAI,SAAS,KAAK,WAAW;QAAE,OAAO,KAAK,CAAC,GAAG,CAAC,EAAE,OAAO,EAAE,GAAG,EAAE,MAAM,EAAE,EAAE,EAAE,CAAC,CAAC;IAC9E,OAAO,KAAK,CAAC,IAAI,CAAC,EAAE,OAAO,EAAE,EAAE,EAAE,MAAM,EAAE,CAAC,EAAE,CAAC,CAAC;AAChD,CAAC"}
@@ -1,3 +1,8 @@
1
+ export declare const imageInputOptions: {
2
+ animated: boolean;
3
+ limitInputPixels: number;
4
+ failOn: 'warning';
5
+ };
1
6
  export declare function inspectImage(bytes: Buffer): Promise<{
2
7
  mediaType: "image/avif" | "image/gif" | "image/jpeg" | "image/png" | "image/webp";
3
8
  extension: "avif" | "gif" | "jpg" | "png" | "webp";
@@ -1 +1 @@
1
- {"version":3,"file":"inspect-image.d.ts","sourceRoot":"","sources":["../../src/storage/inspect-image.ts"],"names":[],"mappings":"AAUA,wBAAsB,YAAY,CAAC,KAAK,EAAE,MAAM;;;;;;;GAuB/C"}
1
+ {"version":3,"file":"inspect-image.d.ts","sourceRoot":"","sources":["../../src/storage/inspect-image.ts"],"names":[],"mappings":"AASA,eAAO,MAAM,iBAAiB;IAC5B,QAAQ;IACR,gBAAgB;IAChB,MAAM,EAAE,SAAS;CAClB,CAAC;AAEF,wBAAsB,YAAY,CAAC,KAAK,EAAE,MAAM;;;;;;;GAsB/C"}
@@ -6,24 +6,28 @@ const formats = {
6
6
  jpeg: ['image/jpeg', 'jpg'], png: ['image/png', 'png'], webp: ['image/webp', 'webp'],
7
7
  gif: ['image/gif', 'gif'], heif: ['image/avif', 'avif'],
8
8
  };
9
+ export const imageInputOptions = {
10
+ animated: true,
11
+ limitInputPixels: 40_000_000,
12
+ failOn: 'warning',
13
+ };
9
14
  export async function inspectImage(bytes) {
10
15
  if (!bytes.length || bytes.length > IMAGE_MAX_BYTES) {
11
16
  throw new ImageError('IMAGE_TOO_LARGE', '图片为空或超过大小限制');
12
17
  }
13
18
  try {
14
- const options = { animated: true, limitInputPixels: 40_000_000, failOn: 'warning' };
15
- const metadata = await sharp(bytes, options).metadata();
19
+ const metadata = await sharp(bytes, imageInputOptions).metadata();
16
20
  if (!Object.hasOwn(formats, metadata.format))
17
21
  throw new Error('Unsupported format');
18
22
  const format = formats[metadata.format];
19
23
  const width = metadata.width;
20
24
  const height = metadata.pageHeight ?? metadata.height;
21
- if (!width || !height || width * height * (metadata.pages ?? 1) > 40_000_000) {
25
+ if (!width || !height || width * height * (metadata.pages ?? 1) > imageInputOptions.limitInputPixels) {
22
26
  throw new Error('Pixel limit exceeded');
23
27
  }
24
28
  if (metadata.format === 'heif' && metadata.compression !== 'av1')
25
29
  throw new Error('Not AVIF');
26
- await sharp(bytes, options).timeout({ seconds: 10 }).stats();
30
+ await sharp(bytes, imageInputOptions).timeout({ seconds: 10 }).stats();
27
31
  return {
28
32
  mediaType: format[0], extension: format[1], width, height, byteSize: bytes.length,
29
33
  sha256: createHash('sha256').update(bytes).digest('hex'),
@@ -1 +1 @@
1
- {"version":3,"file":"inspect-image.js","sourceRoot":"","sources":["../../src/storage/inspect-image.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,MAAM,aAAa,CAAC;AACzC,OAAO,KAAK,MAAM,OAAO,CAAC;AAC1B,OAAO,EAAE,eAAe,EAAE,MAAM,qBAAqB,CAAC;AACtD,OAAO,EAAE,UAAU,EAAE,MAAM,0BAA0B,CAAC;AAEtD,MAAM,OAAO,GAAG;IACd,IAAI,EAAE,CAAC,YAAY,EAAE,KAAK,CAAC,EAAE,GAAG,EAAE,CAAC,WAAW,EAAE,KAAK,CAAC,EAAE,IAAI,EAAE,CAAC,YAAY,EAAE,MAAM,CAAC;IACpF,GAAG,EAAE,CAAC,WAAW,EAAE,KAAK,CAAC,EAAE,IAAI,EAAE,CAAC,YAAY,EAAE,MAAM,CAAC;CAC/C,CAAC;AAEX,MAAM,CAAC,KAAK,UAAU,YAAY,CAAC,KAAa;IAC9C,IAAI,CAAC,KAAK,CAAC,MAAM,IAAI,KAAK,CAAC,MAAM,GAAG,eAAe,EAAE,CAAC;QACpD,MAAM,IAAI,UAAU,CAAC,iBAAiB,EAAE,aAAa,CAAC,CAAC;IACzD,CAAC;IACD,IAAI,CAAC;QACH,MAAM,OAAO,GAAG,EAAE,QAAQ,EAAE,IAAI,EAAE,gBAAgB,EAAE,UAAU,EAAE,MAAM,EAAE,SAAkB,EAAE,CAAC;QAC7F,MAAM,QAAQ,GAAG,MAAM,KAAK,CAAC,KAAK,EAAE,OAAO,CAAC,CAAC,QAAQ,EAAE,CAAC;QACxD,IAAI,CAAC,MAAM,CAAC,MAAM,CAAC,OAAO,EAAE,QAAQ,CAAC,MAAM,CAAC;YAAE,MAAM,IAAI,KAAK,CAAC,oBAAoB,CAAC,CAAC;QACpF,MAAM,MAAM,GAAG,OAAO,CAAC,QAAQ,CAAC,MAA8B,CAAC,CAAC;QAChE,MAAM,KAAK,GAAG,QAAQ,CAAC,KAAK,CAAC;QAC7B,MAAM,MAAM,GAAG,QAAQ,CAAC,UAAU,IAAI,QAAQ,CAAC,MAAM,CAAC;QACtD,IAAI,CAAC,KAAK,IAAI,CAAC,MAAM,IAAI,KAAK,GAAG,MAAM,GAAG,CAAC,QAAQ,CAAC,KAAK,IAAI,CAAC,CAAC,GAAG,UAAU,EAAE,CAAC;YAC7E,MAAM,IAAI,KAAK,CAAC,sBAAsB,CAAC,CAAC;QAC1C,CAAC;QACD,IAAI,QAAQ,CAAC,MAAM,KAAK,MAAM,IAAI,QAAQ,CAAC,WAAW,KAAK,KAAK;YAAE,MAAM,IAAI,KAAK,CAAC,UAAU,CAAC,CAAC;QAC9F,MAAM,KAAK,CAAC,KAAK,EAAE,OAAO,CAAC,CAAC,OAAO,CAAC,EAAE,OAAO,EAAE,EAAE,EAAE,CAAC,CAAC,KAAK,EAAE,CAAC;QAC7D,OAAO;YACL,SAAS,EAAE,MAAM,CAAC,CAAC,CAAC,EAAE,SAAS,EAAE,MAAM,CAAC,CAAC,CAAC,EAAE,KAAK,EAAE,MAAM,EAAE,QAAQ,EAAE,KAAK,CAAC,MAAM;YACjF,MAAM,EAAE,UAAU,CAAC,QAAQ,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC;SACzD,CAAC;IACJ,CAAC;IAAC,MAAM,CAAC;QACP,MAAM,IAAI,UAAU,CAAC,eAAe,EAAE,qBAAqB,CAAC,CAAC;IAC/D,CAAC;AACH,CAAC"}
1
+ {"version":3,"file":"inspect-image.js","sourceRoot":"","sources":["../../src/storage/inspect-image.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,MAAM,aAAa,CAAC;AACzC,OAAO,KAAK,MAAM,OAAO,CAAC;AAC1B,OAAO,EAAE,eAAe,EAAE,MAAM,qBAAqB,CAAC;AACtD,OAAO,EAAE,UAAU,EAAE,MAAM,0BAA0B,CAAC;AAEtD,MAAM,OAAO,GAAG;IACd,IAAI,EAAE,CAAC,YAAY,EAAE,KAAK,CAAC,EAAE,GAAG,EAAE,CAAC,WAAW,EAAE,KAAK,CAAC,EAAE,IAAI,EAAE,CAAC,YAAY,EAAE,MAAM,CAAC;IACpF,GAAG,EAAE,CAAC,WAAW,EAAE,KAAK,CAAC,EAAE,IAAI,EAAE,CAAC,YAAY,EAAE,MAAM,CAAC;CAC/C,CAAC;AACX,MAAM,CAAC,MAAM,iBAAiB,GAAG;IAC/B,QAAQ,EAAE,IAAI;IACd,gBAAgB,EAAE,UAAU;IAC5B,MAAM,EAAE,SAAkB;CAC3B,CAAC;AAEF,MAAM,CAAC,KAAK,UAAU,YAAY,CAAC,KAAa;IAC9C,IAAI,CAAC,KAAK,CAAC,MAAM,IAAI,KAAK,CAAC,MAAM,GAAG,eAAe,EAAE,CAAC;QACpD,MAAM,IAAI,UAAU,CAAC,iBAAiB,EAAE,aAAa,CAAC,CAAC;IACzD,CAAC;IACD,IAAI,CAAC;QACH,MAAM,QAAQ,GAAG,MAAM,KAAK,CAAC,KAAK,EAAE,iBAAiB,CAAC,CAAC,QAAQ,EAAE,CAAC;QAClE,IAAI,CAAC,MAAM,CAAC,MAAM,CAAC,OAAO,EAAE,QAAQ,CAAC,MAAM,CAAC;YAAE,MAAM,IAAI,KAAK,CAAC,oBAAoB,CAAC,CAAC;QACpF,MAAM,MAAM,GAAG,OAAO,CAAC,QAAQ,CAAC,MAA8B,CAAC,CAAC;QAChE,MAAM,KAAK,GAAG,QAAQ,CAAC,KAAK,CAAC;QAC7B,MAAM,MAAM,GAAG,QAAQ,CAAC,UAAU,IAAI,QAAQ,CAAC,MAAM,CAAC;QACtD,IAAI,CAAC,KAAK,IAAI,CAAC,MAAM,IAAI,KAAK,GAAG,MAAM,GAAG,CAAC,QAAQ,CAAC,KAAK,IAAI,CAAC,CAAC,GAAG,iBAAiB,CAAC,gBAAgB,EAAE,CAAC;YACrG,MAAM,IAAI,KAAK,CAAC,sBAAsB,CAAC,CAAC;QAC1C,CAAC;QACD,IAAI,QAAQ,CAAC,MAAM,KAAK,MAAM,IAAI,QAAQ,CAAC,WAAW,KAAK,KAAK;YAAE,MAAM,IAAI,KAAK,CAAC,UAAU,CAAC,CAAC;QAC9F,MAAM,KAAK,CAAC,KAAK,EAAE,iBAAiB,CAAC,CAAC,OAAO,CAAC,EAAE,OAAO,EAAE,EAAE,EAAE,CAAC,CAAC,KAAK,EAAE,CAAC;QACvE,OAAO;YACL,SAAS,EAAE,MAAM,CAAC,CAAC,CAAC,EAAE,SAAS,EAAE,MAAM,CAAC,CAAC,CAAC,EAAE,KAAK,EAAE,MAAM,EAAE,QAAQ,EAAE,KAAK,CAAC,MAAM;YACjF,MAAM,EAAE,UAAU,CAAC,QAAQ,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC;SACzD,CAAC;IACJ,CAAC;IAAC,MAAM,CAAC;QACP,MAAM,IAAI,UAAU,CAAC,eAAe,EAAE,qBAAqB,CAAC,CAAC;IAC/D,CAAC;AACH,CAAC"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@zlooks.cn/images-server",
3
- "version": "1.1.1",
3
+ "version": "1.1.2",
4
4
  "private": false,
5
5
  "type": "module",
6
6
  "engines": {
@@ -39,7 +39,7 @@
39
39
  "@zlooks.cn/database-command": "1.0.5",
40
40
  "@zlooks.cn/event-bus": "1.0.3",
41
41
  "@zlooks.cn/event-client": "1.1.0",
42
- "@zlooks.cn/images-shared": "1.1.0",
42
+ "@zlooks.cn/images-shared": "1.1.1",
43
43
  "@zlooks.cn/infrastructure": "1.0.0",
44
44
  "@zlooks.cn/public-asset": "1.0.3",
45
45
  "@zlooks.cn/public-host-contract": "1.0.0",
@@ -71,5 +71,5 @@
71
71
  "typescript": "7.0.2",
72
72
  "vitest": "4.1.11"
73
73
  },
74
- "gitHead": "5f1145d32518a984162fd8b12b726a4132f6207c"
74
+ "gitHead": "f2515fb0ac13702f7af0f7000ad8696f1c1c09a4"
75
75
  }