@things-factory/attachment-base 10.0.0-beta.6 → 10.0.0-beta.67
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-server/service/attachment/attachment-mutation.d.ts +2 -0
- package/dist-server/service/attachment/attachment-mutation.js +20 -1
- package/dist-server/service/attachment/attachment-mutation.js.map +1 -1
- package/dist-server/service/attachment/attachment.d.ts +7 -0
- package/dist-server/service/attachment/attachment.js +13 -1
- package/dist-server/service/attachment/attachment.js.map +1 -1
- package/dist-server/service/attachment/gltf-thumbnail.d.ts +6 -0
- package/dist-server/service/attachment/gltf-thumbnail.js +188 -0
- package/dist-server/service/attachment/gltf-thumbnail.js.map +1 -0
- package/dist-server/service/attachment/thumbnail-backfill.d.ts +17 -0
- package/dist-server/service/attachment/thumbnail-backfill.js +115 -0
- package/dist-server/service/attachment/thumbnail-backfill.js.map +1 -0
- package/dist-server/service/attachment/thumbnail.d.ts +13 -0
- package/dist-server/service/attachment/thumbnail.js +47 -0
- package/dist-server/service/attachment/thumbnail.js.map +1 -0
- package/dist-server/tsconfig.tsbuildinfo +1 -1
- package/package.json +7 -6
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* 바이너리 컨텐츠로부터 썸네일 data URI 생성.
|
|
3
|
+
*
|
|
4
|
+
* mimetype 기반 dispatcher:
|
|
5
|
+
* - image/* → sharp 로 200x200 JPEG 썸네일
|
|
6
|
+
* - model/gltf-binary → headless Three.js 렌더로 적절한 뷰포인트 JPEG
|
|
7
|
+
* - model/gltf+json → 동일
|
|
8
|
+
* - 그 외 → undefined (클라이언트는 generic 아이콘 표시)
|
|
9
|
+
*
|
|
10
|
+
* 반환: `data:image/...;base64,...` 형태 — Attachment.thumbnail 컬럼에 저장 가능.
|
|
11
|
+
* 외부 URL 로 대체 저장하는 것도 스키마상 유효함.
|
|
12
|
+
*/
|
|
13
|
+
export declare function generateThumbnail(contents: Buffer | undefined | null, mimetype: string | undefined): Promise<string | undefined>;
|
|
@@ -0,0 +1,47 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.generateThumbnail = generateThumbnail;
|
|
4
|
+
const tslib_1 = require("tslib");
|
|
5
|
+
const sharp_1 = tslib_1.__importDefault(require("sharp"));
|
|
6
|
+
const env_1 = require("@things-factory/env");
|
|
7
|
+
const gltf_thumbnail_1 = require("./gltf-thumbnail");
|
|
8
|
+
const IMAGE_THUMB_MAX = 200;
|
|
9
|
+
const IMAGE_THUMB_QUALITY = 70;
|
|
10
|
+
/**
|
|
11
|
+
* 바이너리 컨텐츠로부터 썸네일 data URI 생성.
|
|
12
|
+
*
|
|
13
|
+
* mimetype 기반 dispatcher:
|
|
14
|
+
* - image/* → sharp 로 200x200 JPEG 썸네일
|
|
15
|
+
* - model/gltf-binary → headless Three.js 렌더로 적절한 뷰포인트 JPEG
|
|
16
|
+
* - model/gltf+json → 동일
|
|
17
|
+
* - 그 외 → undefined (클라이언트는 generic 아이콘 표시)
|
|
18
|
+
*
|
|
19
|
+
* 반환: `data:image/...;base64,...` 형태 — Attachment.thumbnail 컬럼에 저장 가능.
|
|
20
|
+
* 외부 URL 로 대체 저장하는 것도 스키마상 유효함.
|
|
21
|
+
*/
|
|
22
|
+
async function generateThumbnail(contents, mimetype) {
|
|
23
|
+
if (!contents || !mimetype)
|
|
24
|
+
return;
|
|
25
|
+
if (mimetype.startsWith('image/')) {
|
|
26
|
+
return generateImageThumbnail(contents);
|
|
27
|
+
}
|
|
28
|
+
if (mimetype === 'model/gltf-binary' || mimetype === 'model/gltf+json') {
|
|
29
|
+
return (0, gltf_thumbnail_1.generateGltfThumbnail)(contents, mimetype);
|
|
30
|
+
}
|
|
31
|
+
return;
|
|
32
|
+
}
|
|
33
|
+
async function generateImageThumbnail(contents) {
|
|
34
|
+
try {
|
|
35
|
+
const buffer = await (0, sharp_1.default)(contents)
|
|
36
|
+
.rotate() // EXIF 방향 자동 보정
|
|
37
|
+
.resize(IMAGE_THUMB_MAX, IMAGE_THUMB_MAX, { fit: 'inside', withoutEnlargement: true })
|
|
38
|
+
.jpeg({ quality: IMAGE_THUMB_QUALITY })
|
|
39
|
+
.toBuffer();
|
|
40
|
+
return `data:image/jpeg;base64,${buffer.toString('base64')}`;
|
|
41
|
+
}
|
|
42
|
+
catch (e) {
|
|
43
|
+
env_1.logger.warn(`[attachment] image thumbnail generation failed: ${e.message}`);
|
|
44
|
+
return;
|
|
45
|
+
}
|
|
46
|
+
}
|
|
47
|
+
//# sourceMappingURL=thumbnail.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"thumbnail.js","sourceRoot":"","sources":["../../../server/service/attachment/thumbnail.ts"],"names":[],"mappings":";;AAqBA,8CAeC;;AApCD,0DAAyB;AAEzB,6CAA4C;AAE5C,qDAAwD;AAExD,MAAM,eAAe,GAAG,GAAG,CAAA;AAC3B,MAAM,mBAAmB,GAAG,EAAE,CAAA;AAE9B;;;;;;;;;;;GAWG;AACI,KAAK,UAAU,iBAAiB,CACrC,QAAmC,EACnC,QAA4B;IAE5B,IAAI,CAAC,QAAQ,IAAI,CAAC,QAAQ;QAAE,OAAM;IAElC,IAAI,QAAQ,CAAC,UAAU,CAAC,QAAQ,CAAC,EAAE,CAAC;QAClC,OAAO,sBAAsB,CAAC,QAAQ,CAAC,CAAA;IACzC,CAAC;IAED,IAAI,QAAQ,KAAK,mBAAmB,IAAI,QAAQ,KAAK,iBAAiB,EAAE,CAAC;QACvE,OAAO,IAAA,sCAAqB,EAAC,QAAQ,EAAE,QAAQ,CAAC,CAAA;IAClD,CAAC;IAED,OAAM;AACR,CAAC;AAED,KAAK,UAAU,sBAAsB,CAAC,QAAgB;IACpD,IAAI,CAAC;QACH,MAAM,MAAM,GAAG,MAAM,IAAA,eAAK,EAAC,QAAQ,CAAC;aACjC,MAAM,EAAE,CAAC,gBAAgB;aACzB,MAAM,CAAC,eAAe,EAAE,eAAe,EAAE,EAAE,GAAG,EAAE,QAAQ,EAAE,kBAAkB,EAAE,IAAI,EAAE,CAAC;aACrF,IAAI,CAAC,EAAE,OAAO,EAAE,mBAAmB,EAAE,CAAC;aACtC,QAAQ,EAAE,CAAA;QAEb,OAAO,0BAA0B,MAAM,CAAC,QAAQ,CAAC,QAAQ,CAAC,EAAE,CAAA;IAC9D,CAAC;IAAC,OAAO,CAAC,EAAE,CAAC;QACX,YAAM,CAAC,IAAI,CAAC,mDAAoD,CAAW,CAAC,OAAO,EAAE,CAAC,CAAA;QACtF,OAAM;IACR,CAAC;AACH,CAAC","sourcesContent":["import sharp from 'sharp'\n\nimport { logger } from '@things-factory/env'\n\nimport { generateGltfThumbnail } from './gltf-thumbnail'\n\nconst IMAGE_THUMB_MAX = 200\nconst IMAGE_THUMB_QUALITY = 70\n\n/**\n * 바이너리 컨텐츠로부터 썸네일 data URI 생성.\n *\n * mimetype 기반 dispatcher:\n * - image/* → sharp 로 200x200 JPEG 썸네일\n * - model/gltf-binary → headless Three.js 렌더로 적절한 뷰포인트 JPEG\n * - model/gltf+json → 동일\n * - 그 외 → undefined (클라이언트는 generic 아이콘 표시)\n *\n * 반환: `data:image/...;base64,...` 형태 — Attachment.thumbnail 컬럼에 저장 가능.\n * 외부 URL 로 대체 저장하는 것도 스키마상 유효함.\n */\nexport async function generateThumbnail(\n contents: Buffer | undefined | null,\n mimetype: string | undefined\n): Promise<string | undefined> {\n if (!contents || !mimetype) return\n\n if (mimetype.startsWith('image/')) {\n return generateImageThumbnail(contents)\n }\n\n if (mimetype === 'model/gltf-binary' || mimetype === 'model/gltf+json') {\n return generateGltfThumbnail(contents, mimetype)\n }\n\n return\n}\n\nasync function generateImageThumbnail(contents: Buffer): Promise<string | undefined> {\n try {\n const buffer = await sharp(contents)\n .rotate() // EXIF 방향 자동 보정\n .resize(IMAGE_THUMB_MAX, IMAGE_THUMB_MAX, { fit: 'inside', withoutEnlargement: true })\n .jpeg({ quality: IMAGE_THUMB_QUALITY })\n .toBuffer()\n\n return `data:image/jpeg;base64,${buffer.toString('base64')}`\n } catch (e) {\n logger.warn(`[attachment] image thumbnail generation failed: ${(e as Error).message}`)\n return\n }\n}\n"]}
|