@kevisual/oss 0.0.10 → 0.0.11

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.
@@ -140,10 +140,13 @@ declare class OssBase implements OssBaseOperation {
140
140
  * @param hash
141
141
  * @returns
142
142
  */
143
- checkObjectHash(objectName: string, hash: string): Promise<{
143
+ checkObjectHash(objectName: string, hash: string, meta?: ItemBucketMetadata): Promise<{
144
144
  success: boolean;
145
145
  metaData: ItemBucketMetadata | null;
146
+ obj: any;
147
+ equalMeta?: boolean;
146
148
  }>;
149
+ getMetadata(pathname: string, meta?: ItemBucketMetadata): ItemBucketMetadata;
147
150
  copyObject(sourceObject: any, targetObject: any): Promise<minio_dist_esm_internal_type_mjs.CopyObjectResult>;
148
151
  replaceObject(objectName: string, meta: {
149
152
  [key: string]: string;
package/dist/index.d.ts CHANGED
@@ -1,4 +1,4 @@
1
1
  import 'minio';
2
2
  import 'minio/dist/esm/internal/type.mjs';
3
3
  import 'stream';
4
- export { O as OssBase, a as OssBaseOptions } from './index-By4Dj6k_.js';
4
+ export { O as OssBase, a as OssBaseOptions } from './index-BGsBfWH-.js';
package/dist/index.js CHANGED
@@ -2007,11 +2007,11 @@ var require_baseGet = __commonJS({
2007
2007
  "../../node_modules/lodash/_baseGet.js"(exports, module) {
2008
2008
  var castPath = require_castPath();
2009
2009
  var toKey = require_toKey();
2010
- function baseGet(object, path) {
2011
- path = castPath(path, object);
2012
- var index = 0, length = path.length;
2010
+ function baseGet(object, path2) {
2011
+ path2 = castPath(path2, object);
2012
+ var index = 0, length = path2.length;
2013
2013
  while (object != null && index < length) {
2014
- object = object[toKey(path[index++])];
2014
+ object = object[toKey(path2[index++])];
2015
2015
  }
2016
2016
  return index && index == length ? object : void 0;
2017
2017
  }
@@ -2048,8 +2048,8 @@ var require_parent = __commonJS({
2048
2048
  "../../node_modules/lodash/_parent.js"(exports, module) {
2049
2049
  var baseGet = require_baseGet();
2050
2050
  var baseSlice = require_baseSlice();
2051
- function parent(object, path) {
2052
- return path.length < 2 ? object : baseGet(object, baseSlice(path, 0, -1));
2051
+ function parent(object, path2) {
2052
+ return path2.length < 2 ? object : baseGet(object, baseSlice(path2, 0, -1));
2053
2053
  }
2054
2054
  module.exports = parent;
2055
2055
  }
@@ -2062,10 +2062,10 @@ var require_baseUnset = __commonJS({
2062
2062
  var last = require_last();
2063
2063
  var parent = require_parent();
2064
2064
  var toKey = require_toKey();
2065
- function baseUnset(object, path) {
2066
- path = castPath(path, object);
2067
- object = parent(object, path);
2068
- return object == null || delete object[toKey(last(path))];
2065
+ function baseUnset(object, path2) {
2066
+ path2 = castPath(path2, object);
2067
+ object = parent(object, path2);
2068
+ return object == null || delete object[toKey(last(path2))];
2069
2069
  }
2070
2070
  module.exports = baseUnset;
2071
2071
  }
@@ -2315,10 +2315,10 @@ var require_omit = __commonJS({
2315
2315
  return result;
2316
2316
  }
2317
2317
  var isDeep = false;
2318
- paths = arrayMap(paths, function(path) {
2319
- path = castPath(path, object);
2320
- isDeep || (isDeep = path.length > 1);
2321
- return path;
2318
+ paths = arrayMap(paths, function(path2) {
2319
+ path2 = castPath(path2, object);
2320
+ isDeep || (isDeep = path2.length > 1);
2321
+ return path2;
2322
2322
  });
2323
2323
  copyObject2(object, getAllKeysIn(object), result);
2324
2324
  if (isDeep) {
@@ -2338,7 +2338,9 @@ var require_omit = __commonJS({
2338
2338
  import crypto from "node:crypto";
2339
2339
  var hash = (str) => {
2340
2340
  let hashStr;
2341
- if (typeof str === "object") {
2341
+ if (str instanceof Buffer) {
2342
+ hashStr = str;
2343
+ } else if (str instanceof Object) {
2342
2344
  hashStr = JSON.stringify(str, null, 2);
2343
2345
  } else {
2344
2346
  hashStr = str;
@@ -2364,6 +2366,87 @@ var copyObject = async ({ bucketName, newMetadata, objectName, client }) => {
2364
2366
 
2365
2367
  // src/index.ts
2366
2368
  var import_omit = __toESM(require_omit(), 1);
2369
+
2370
+ // src/util/get-content-type.ts
2371
+ import path from "node:path";
2372
+ var getContentType = (filePath) => {
2373
+ const extname = path.extname(filePath);
2374
+ const contentType = {
2375
+ ".html": "text/html; charset=utf-8",
2376
+ ".js": "text/javascript; charset=utf-8",
2377
+ ".css": "text/css; charset=utf-8",
2378
+ ".txt": "text/plain; charset=utf-8",
2379
+ ".json": "application/json; charset=utf-8",
2380
+ ".png": "image/png",
2381
+ ".jpg": "image/jpg",
2382
+ ".gif": "image/gif",
2383
+ ".svg": "image/svg+xml",
2384
+ ".wav": "audio/wav",
2385
+ ".mp4": "video/mp4",
2386
+ ".md": "text/markdown; charset=utf-8",
2387
+ // utf-8配置
2388
+ ".ico": "image/x-icon",
2389
+ // Favicon 图标
2390
+ ".webp": "image/webp",
2391
+ // WebP 图像格式
2392
+ ".webm": "video/webm",
2393
+ // WebM 视频格式
2394
+ ".ogg": "audio/ogg",
2395
+ // Ogg 音频格式
2396
+ ".mp3": "audio/mpeg",
2397
+ // MP3 音频格式
2398
+ ".m4a": "audio/mp4",
2399
+ // M4A 音频格式
2400
+ ".m3u8": "application/vnd.apple.mpegurl",
2401
+ // HLS 播放列表
2402
+ ".ts": "video/mp2t",
2403
+ // MPEG Transport Stream
2404
+ ".pdf": "application/pdf",
2405
+ // PDF 文档
2406
+ ".doc": "application/msword",
2407
+ // Word 文档
2408
+ ".docx": "application/vnd.openxmlformats-officedocument.wordprocessingml.document",
2409
+ // Word 文档 (新版)
2410
+ ".ppt": "application/vnd.ms-powerpoint",
2411
+ // PowerPoint 演示文稿
2412
+ ".pptx": "application/vnd.openxmlformats-officedocument.presentationml.presentation",
2413
+ // PowerPoint (新版)
2414
+ ".xls": "application/vnd.ms-excel",
2415
+ // Excel 表格
2416
+ ".xlsx": "application/vnd.openxmlformats-officedocument.spreadsheetml.sheet",
2417
+ // Excel 表格 (新版)
2418
+ ".csv": "text/csv; charset=utf-8",
2419
+ // CSV 文件
2420
+ ".xml": "application/xml; charset=utf-8",
2421
+ // XML 文件
2422
+ ".rtf": "application/rtf",
2423
+ // RTF 文本文件
2424
+ ".eot": "application/vnd.ms-fontobject",
2425
+ // Embedded OpenType 字体
2426
+ ".ttf": "font/ttf",
2427
+ // TrueType 字体
2428
+ ".woff": "font/woff",
2429
+ // Web Open Font Format 1.0
2430
+ ".woff2": "font/woff2",
2431
+ // Web Open Font Format 2.0
2432
+ ".otf": "font/otf",
2433
+ // OpenType 字体
2434
+ ".wasm": "application/wasm",
2435
+ // WebAssembly 文件
2436
+ ".pem": "application/x-pem-file",
2437
+ // PEM 证书文件
2438
+ ".crt": "application/x-x509-ca-cert",
2439
+ // CRT 证书文件
2440
+ ".yaml": "application/x-yaml; charset=utf-8",
2441
+ // YAML 文件
2442
+ ".yml": "application/x-yaml; charset=utf-8",
2443
+ // YAML 文件(别名)
2444
+ ".zip": "application/octet-stream"
2445
+ };
2446
+ return contentType[extname] || "application/octet-stream";
2447
+ };
2448
+
2449
+ // src/index.ts
2367
2450
  var OssBase = class {
2368
2451
  client;
2369
2452
  bucketName;
@@ -2502,19 +2585,39 @@ var OssBase = class {
2502
2585
  * @param hash
2503
2586
  * @returns
2504
2587
  */
2505
- async checkObjectHash(objectName, hash2) {
2588
+ async checkObjectHash(objectName, hash2, meta) {
2506
2589
  const obj = await this.statObject(`${this.prefix}${objectName}`, true);
2507
2590
  if (!obj) {
2508
- return { success: false, metaData: null };
2591
+ return { success: false, metaData: null, obj: null, equalMeta: false };
2509
2592
  }
2510
2593
  let metaData = {};
2511
- const omitMeda = ["size", "content-type", "cache-control", "app-source"];
2594
+ const omitMeda = ["content-type", "cache-control", "app-source"];
2512
2595
  const objMeta = (0, import_omit.default)(obj.metaData, omitMeda);
2513
2596
  metaData = {
2514
- ...objMeta,
2515
- ...metaData
2597
+ ...objMeta
2516
2598
  };
2517
- return { success: obj.etag === hash2, metaData };
2599
+ let equalMeta = false;
2600
+ if (meta) {
2601
+ equalMeta = JSON.stringify(metaData) === JSON.stringify(meta);
2602
+ }
2603
+ return { success: obj.etag === hash2, metaData, obj, equalMeta };
2604
+ }
2605
+ getMetadata(pathname, meta = { "app-source": "user-app" }) {
2606
+ const isHtml = pathname.endsWith(".html");
2607
+ if (isHtml) {
2608
+ meta = {
2609
+ ...meta,
2610
+ "content-type": "text/html; charset=utf-8",
2611
+ "cache-control": "no-cache"
2612
+ };
2613
+ } else {
2614
+ meta = {
2615
+ ...meta,
2616
+ "content-type": getContentType(pathname),
2617
+ "cache-control": "max-age=31536000, immutable"
2618
+ };
2619
+ }
2620
+ return meta;
2518
2621
  }
2519
2622
  async copyObject(sourceObject, targetObject) {
2520
2623
  const bucketName = this.bucketName;
@@ -1,5 +1,5 @@
1
1
  import * as minio_dist_esm_internal_type_mjs from 'minio/dist/esm/internal/type.mjs';
2
- import { O as OssBase, e as OssService, a as OssBaseOptions, L as ListFileObject, c as ListObjectResult } from '../index-By4Dj6k_.js';
2
+ import { O as OssBase, e as OssService, a as OssBaseOptions, L as ListFileObject, c as ListObjectResult } from '../index-BGsBfWH-.js';
3
3
  import 'minio';
4
4
  import 'stream';
5
5
 
@@ -2007,11 +2007,11 @@ var require_baseGet = __commonJS({
2007
2007
  "../../node_modules/lodash/_baseGet.js"(exports, module) {
2008
2008
  var castPath = require_castPath();
2009
2009
  var toKey = require_toKey();
2010
- function baseGet(object, path) {
2011
- path = castPath(path, object);
2012
- var index = 0, length = path.length;
2010
+ function baseGet(object, path2) {
2011
+ path2 = castPath(path2, object);
2012
+ var index = 0, length = path2.length;
2013
2013
  while (object != null && index < length) {
2014
- object = object[toKey(path[index++])];
2014
+ object = object[toKey(path2[index++])];
2015
2015
  }
2016
2016
  return index && index == length ? object : void 0;
2017
2017
  }
@@ -2048,8 +2048,8 @@ var require_parent = __commonJS({
2048
2048
  "../../node_modules/lodash/_parent.js"(exports, module) {
2049
2049
  var baseGet = require_baseGet();
2050
2050
  var baseSlice = require_baseSlice();
2051
- function parent(object, path) {
2052
- return path.length < 2 ? object : baseGet(object, baseSlice(path, 0, -1));
2051
+ function parent(object, path2) {
2052
+ return path2.length < 2 ? object : baseGet(object, baseSlice(path2, 0, -1));
2053
2053
  }
2054
2054
  module.exports = parent;
2055
2055
  }
@@ -2062,10 +2062,10 @@ var require_baseUnset = __commonJS({
2062
2062
  var last = require_last();
2063
2063
  var parent = require_parent();
2064
2064
  var toKey = require_toKey();
2065
- function baseUnset(object, path) {
2066
- path = castPath(path, object);
2067
- object = parent(object, path);
2068
- return object == null || delete object[toKey(last(path))];
2065
+ function baseUnset(object, path2) {
2066
+ path2 = castPath(path2, object);
2067
+ object = parent(object, path2);
2068
+ return object == null || delete object[toKey(last(path2))];
2069
2069
  }
2070
2070
  module.exports = baseUnset;
2071
2071
  }
@@ -2315,10 +2315,10 @@ var require_omit = __commonJS({
2315
2315
  return result;
2316
2316
  }
2317
2317
  var isDeep = false;
2318
- paths = arrayMap(paths, function(path) {
2319
- path = castPath(path, object);
2320
- isDeep || (isDeep = path.length > 1);
2321
- return path;
2318
+ paths = arrayMap(paths, function(path2) {
2319
+ path2 = castPath(path2, object);
2320
+ isDeep || (isDeep = path2.length > 1);
2321
+ return path2;
2322
2322
  });
2323
2323
  copyObject2(object, getAllKeysIn(object), result);
2324
2324
  if (isDeep) {
@@ -2338,7 +2338,9 @@ var require_omit = __commonJS({
2338
2338
  import crypto from "node:crypto";
2339
2339
  var hash = (str) => {
2340
2340
  let hashStr;
2341
- if (typeof str === "object") {
2341
+ if (str instanceof Buffer) {
2342
+ hashStr = str;
2343
+ } else if (str instanceof Object) {
2342
2344
  hashStr = JSON.stringify(str, null, 2);
2343
2345
  } else {
2344
2346
  hashStr = str;
@@ -2367,6 +2369,87 @@ var copyObject = async ({ bucketName, newMetadata, objectName, client }) => {
2367
2369
 
2368
2370
  // src/index.ts
2369
2371
  var import_omit = __toESM(require_omit(), 1);
2372
+
2373
+ // src/util/get-content-type.ts
2374
+ import path from "node:path";
2375
+ var getContentType = (filePath) => {
2376
+ const extname = path.extname(filePath);
2377
+ const contentType = {
2378
+ ".html": "text/html; charset=utf-8",
2379
+ ".js": "text/javascript; charset=utf-8",
2380
+ ".css": "text/css; charset=utf-8",
2381
+ ".txt": "text/plain; charset=utf-8",
2382
+ ".json": "application/json; charset=utf-8",
2383
+ ".png": "image/png",
2384
+ ".jpg": "image/jpg",
2385
+ ".gif": "image/gif",
2386
+ ".svg": "image/svg+xml",
2387
+ ".wav": "audio/wav",
2388
+ ".mp4": "video/mp4",
2389
+ ".md": "text/markdown; charset=utf-8",
2390
+ // utf-8配置
2391
+ ".ico": "image/x-icon",
2392
+ // Favicon 图标
2393
+ ".webp": "image/webp",
2394
+ // WebP 图像格式
2395
+ ".webm": "video/webm",
2396
+ // WebM 视频格式
2397
+ ".ogg": "audio/ogg",
2398
+ // Ogg 音频格式
2399
+ ".mp3": "audio/mpeg",
2400
+ // MP3 音频格式
2401
+ ".m4a": "audio/mp4",
2402
+ // M4A 音频格式
2403
+ ".m3u8": "application/vnd.apple.mpegurl",
2404
+ // HLS 播放列表
2405
+ ".ts": "video/mp2t",
2406
+ // MPEG Transport Stream
2407
+ ".pdf": "application/pdf",
2408
+ // PDF 文档
2409
+ ".doc": "application/msword",
2410
+ // Word 文档
2411
+ ".docx": "application/vnd.openxmlformats-officedocument.wordprocessingml.document",
2412
+ // Word 文档 (新版)
2413
+ ".ppt": "application/vnd.ms-powerpoint",
2414
+ // PowerPoint 演示文稿
2415
+ ".pptx": "application/vnd.openxmlformats-officedocument.presentationml.presentation",
2416
+ // PowerPoint (新版)
2417
+ ".xls": "application/vnd.ms-excel",
2418
+ // Excel 表格
2419
+ ".xlsx": "application/vnd.openxmlformats-officedocument.spreadsheetml.sheet",
2420
+ // Excel 表格 (新版)
2421
+ ".csv": "text/csv; charset=utf-8",
2422
+ // CSV 文件
2423
+ ".xml": "application/xml; charset=utf-8",
2424
+ // XML 文件
2425
+ ".rtf": "application/rtf",
2426
+ // RTF 文本文件
2427
+ ".eot": "application/vnd.ms-fontobject",
2428
+ // Embedded OpenType 字体
2429
+ ".ttf": "font/ttf",
2430
+ // TrueType 字体
2431
+ ".woff": "font/woff",
2432
+ // Web Open Font Format 1.0
2433
+ ".woff2": "font/woff2",
2434
+ // Web Open Font Format 2.0
2435
+ ".otf": "font/otf",
2436
+ // OpenType 字体
2437
+ ".wasm": "application/wasm",
2438
+ // WebAssembly 文件
2439
+ ".pem": "application/x-pem-file",
2440
+ // PEM 证书文件
2441
+ ".crt": "application/x-x509-ca-cert",
2442
+ // CRT 证书文件
2443
+ ".yaml": "application/x-yaml; charset=utf-8",
2444
+ // YAML 文件
2445
+ ".yml": "application/x-yaml; charset=utf-8",
2446
+ // YAML 文件(别名)
2447
+ ".zip": "application/octet-stream"
2448
+ };
2449
+ return contentType[extname] || "application/octet-stream";
2450
+ };
2451
+
2452
+ // src/index.ts
2370
2453
  var OssBase = class {
2371
2454
  client;
2372
2455
  bucketName;
@@ -2505,19 +2588,39 @@ var OssBase = class {
2505
2588
  * @param hash
2506
2589
  * @returns
2507
2590
  */
2508
- async checkObjectHash(objectName, hash2) {
2591
+ async checkObjectHash(objectName, hash2, meta) {
2509
2592
  const obj = await this.statObject(`${this.prefix}${objectName}`, true);
2510
2593
  if (!obj) {
2511
- return { success: false, metaData: null };
2594
+ return { success: false, metaData: null, obj: null, equalMeta: false };
2512
2595
  }
2513
2596
  let metaData = {};
2514
- const omitMeda = ["size", "content-type", "cache-control", "app-source"];
2597
+ const omitMeda = ["content-type", "cache-control", "app-source"];
2515
2598
  const objMeta = (0, import_omit.default)(obj.metaData, omitMeda);
2516
2599
  metaData = {
2517
- ...objMeta,
2518
- ...metaData
2600
+ ...objMeta
2519
2601
  };
2520
- return { success: obj.etag === hash2, metaData };
2602
+ let equalMeta = false;
2603
+ if (meta) {
2604
+ equalMeta = JSON.stringify(metaData) === JSON.stringify(meta);
2605
+ }
2606
+ return { success: obj.etag === hash2, metaData, obj, equalMeta };
2607
+ }
2608
+ getMetadata(pathname, meta = { "app-source": "user-app" }) {
2609
+ const isHtml = pathname.endsWith(".html");
2610
+ if (isHtml) {
2611
+ meta = {
2612
+ ...meta,
2613
+ "content-type": "text/html; charset=utf-8",
2614
+ "cache-control": "no-cache"
2615
+ };
2616
+ } else {
2617
+ meta = {
2618
+ ...meta,
2619
+ "content-type": getContentType(pathname),
2620
+ "cache-control": "max-age=31536000, immutable"
2621
+ };
2622
+ }
2623
+ return meta;
2521
2624
  }
2522
2625
  async copyObject(sourceObject, targetObject) {
2523
2626
  const bucketName = this.bucketName;
@@ -1,5 +1,5 @@
1
- import { O as OssBase } from '../index-By4Dj6k_.js';
2
- export { b as ListDirectoryObject, L as ListFileObject, c as ListObjectResult, d as OssBaseOperation, a as OssBaseOptions, e as OssService, S as StatObjectResult, U as UploadedObjectInfo } from '../index-By4Dj6k_.js';
1
+ import { O as OssBase } from '../index-BGsBfWH-.js';
2
+ export { b as ListDirectoryObject, L as ListFileObject, c as ListObjectResult, d as OssBaseOperation, a as OssBaseOptions, e as OssService, S as StatObjectResult, U as UploadedObjectInfo } from '../index-BGsBfWH-.js';
3
3
  export { ConfigOssService } from './config.js';
4
4
  import * as stream from 'stream';
5
5
  import { ServerResponse } from 'node:http';
@@ -33,4 +33,6 @@ declare const downloadObject: ({ objectName, client, filePath }: Pick<SendObject
33
33
  declare const hash: (str: string | Buffer | Object) => string;
34
34
  declare const hashSringify: (str: Object) => string;
35
35
 
36
- export { NotFoundFile, OssBase, downloadObject, filterMetaDataKeys, hash, hashSringify, sendObject };
36
+ declare const getContentType: (filePath: string) => any;
37
+
38
+ export { NotFoundFile, OssBase, downloadObject, filterMetaDataKeys, getContentType, hash, hashSringify, sendObject };
@@ -2007,11 +2007,11 @@ var require_baseGet = __commonJS({
2007
2007
  "../../node_modules/lodash/_baseGet.js"(exports, module) {
2008
2008
  var castPath = require_castPath();
2009
2009
  var toKey = require_toKey();
2010
- function baseGet(object, path2) {
2011
- path2 = castPath(path2, object);
2012
- var index = 0, length = path2.length;
2010
+ function baseGet(object, path3) {
2011
+ path3 = castPath(path3, object);
2012
+ var index = 0, length = path3.length;
2013
2013
  while (object != null && index < length) {
2014
- object = object[toKey(path2[index++])];
2014
+ object = object[toKey(path3[index++])];
2015
2015
  }
2016
2016
  return index && index == length ? object : void 0;
2017
2017
  }
@@ -2048,8 +2048,8 @@ var require_parent = __commonJS({
2048
2048
  "../../node_modules/lodash/_parent.js"(exports, module) {
2049
2049
  var baseGet = require_baseGet();
2050
2050
  var baseSlice = require_baseSlice();
2051
- function parent(object, path2) {
2052
- return path2.length < 2 ? object : baseGet(object, baseSlice(path2, 0, -1));
2051
+ function parent(object, path3) {
2052
+ return path3.length < 2 ? object : baseGet(object, baseSlice(path3, 0, -1));
2053
2053
  }
2054
2054
  module.exports = parent;
2055
2055
  }
@@ -2062,10 +2062,10 @@ var require_baseUnset = __commonJS({
2062
2062
  var last = require_last();
2063
2063
  var parent = require_parent();
2064
2064
  var toKey = require_toKey();
2065
- function baseUnset(object, path2) {
2066
- path2 = castPath(path2, object);
2067
- object = parent(object, path2);
2068
- return object == null || delete object[toKey(last(path2))];
2065
+ function baseUnset(object, path3) {
2066
+ path3 = castPath(path3, object);
2067
+ object = parent(object, path3);
2068
+ return object == null || delete object[toKey(last(path3))];
2069
2069
  }
2070
2070
  module.exports = baseUnset;
2071
2071
  }
@@ -2315,10 +2315,10 @@ var require_omit = __commonJS({
2315
2315
  return result;
2316
2316
  }
2317
2317
  var isDeep = false;
2318
- paths = arrayMap(paths, function(path2) {
2319
- path2 = castPath(path2, object);
2320
- isDeep || (isDeep = path2.length > 1);
2321
- return path2;
2318
+ paths = arrayMap(paths, function(path3) {
2319
+ path3 = castPath(path3, object);
2320
+ isDeep || (isDeep = path3.length > 1);
2321
+ return path3;
2322
2322
  });
2323
2323
  copyObject2(object, getAllKeysIn(object), result);
2324
2324
  if (isDeep) {
@@ -2338,7 +2338,9 @@ var require_omit = __commonJS({
2338
2338
  import crypto from "node:crypto";
2339
2339
  var hash = (str) => {
2340
2340
  let hashStr;
2341
- if (typeof str === "object") {
2341
+ if (str instanceof Buffer) {
2342
+ hashStr = str;
2343
+ } else if (str instanceof Object) {
2342
2344
  hashStr = JSON.stringify(str, null, 2);
2343
2345
  } else {
2344
2346
  hashStr = str;
@@ -2367,6 +2369,87 @@ var copyObject = async ({ bucketName, newMetadata, objectName, client }) => {
2367
2369
 
2368
2370
  // src/index.ts
2369
2371
  var import_omit = __toESM(require_omit(), 1);
2372
+
2373
+ // src/util/get-content-type.ts
2374
+ import path from "node:path";
2375
+ var getContentType = (filePath) => {
2376
+ const extname = path.extname(filePath);
2377
+ const contentType = {
2378
+ ".html": "text/html; charset=utf-8",
2379
+ ".js": "text/javascript; charset=utf-8",
2380
+ ".css": "text/css; charset=utf-8",
2381
+ ".txt": "text/plain; charset=utf-8",
2382
+ ".json": "application/json; charset=utf-8",
2383
+ ".png": "image/png",
2384
+ ".jpg": "image/jpg",
2385
+ ".gif": "image/gif",
2386
+ ".svg": "image/svg+xml",
2387
+ ".wav": "audio/wav",
2388
+ ".mp4": "video/mp4",
2389
+ ".md": "text/markdown; charset=utf-8",
2390
+ // utf-8配置
2391
+ ".ico": "image/x-icon",
2392
+ // Favicon 图标
2393
+ ".webp": "image/webp",
2394
+ // WebP 图像格式
2395
+ ".webm": "video/webm",
2396
+ // WebM 视频格式
2397
+ ".ogg": "audio/ogg",
2398
+ // Ogg 音频格式
2399
+ ".mp3": "audio/mpeg",
2400
+ // MP3 音频格式
2401
+ ".m4a": "audio/mp4",
2402
+ // M4A 音频格式
2403
+ ".m3u8": "application/vnd.apple.mpegurl",
2404
+ // HLS 播放列表
2405
+ ".ts": "video/mp2t",
2406
+ // MPEG Transport Stream
2407
+ ".pdf": "application/pdf",
2408
+ // PDF 文档
2409
+ ".doc": "application/msword",
2410
+ // Word 文档
2411
+ ".docx": "application/vnd.openxmlformats-officedocument.wordprocessingml.document",
2412
+ // Word 文档 (新版)
2413
+ ".ppt": "application/vnd.ms-powerpoint",
2414
+ // PowerPoint 演示文稿
2415
+ ".pptx": "application/vnd.openxmlformats-officedocument.presentationml.presentation",
2416
+ // PowerPoint (新版)
2417
+ ".xls": "application/vnd.ms-excel",
2418
+ // Excel 表格
2419
+ ".xlsx": "application/vnd.openxmlformats-officedocument.spreadsheetml.sheet",
2420
+ // Excel 表格 (新版)
2421
+ ".csv": "text/csv; charset=utf-8",
2422
+ // CSV 文件
2423
+ ".xml": "application/xml; charset=utf-8",
2424
+ // XML 文件
2425
+ ".rtf": "application/rtf",
2426
+ // RTF 文本文件
2427
+ ".eot": "application/vnd.ms-fontobject",
2428
+ // Embedded OpenType 字体
2429
+ ".ttf": "font/ttf",
2430
+ // TrueType 字体
2431
+ ".woff": "font/woff",
2432
+ // Web Open Font Format 1.0
2433
+ ".woff2": "font/woff2",
2434
+ // Web Open Font Format 2.0
2435
+ ".otf": "font/otf",
2436
+ // OpenType 字体
2437
+ ".wasm": "application/wasm",
2438
+ // WebAssembly 文件
2439
+ ".pem": "application/x-pem-file",
2440
+ // PEM 证书文件
2441
+ ".crt": "application/x-x509-ca-cert",
2442
+ // CRT 证书文件
2443
+ ".yaml": "application/x-yaml; charset=utf-8",
2444
+ // YAML 文件
2445
+ ".yml": "application/x-yaml; charset=utf-8",
2446
+ // YAML 文件(别名)
2447
+ ".zip": "application/octet-stream"
2448
+ };
2449
+ return contentType[extname] || "application/octet-stream";
2450
+ };
2451
+
2452
+ // src/index.ts
2370
2453
  var OssBase = class {
2371
2454
  client;
2372
2455
  bucketName;
@@ -2505,19 +2588,39 @@ var OssBase = class {
2505
2588
  * @param hash
2506
2589
  * @returns
2507
2590
  */
2508
- async checkObjectHash(objectName, hash2) {
2591
+ async checkObjectHash(objectName, hash2, meta) {
2509
2592
  const obj = await this.statObject(`${this.prefix}${objectName}`, true);
2510
2593
  if (!obj) {
2511
- return { success: false, metaData: null };
2594
+ return { success: false, metaData: null, obj: null, equalMeta: false };
2512
2595
  }
2513
2596
  let metaData = {};
2514
- const omitMeda = ["size", "content-type", "cache-control", "app-source"];
2597
+ const omitMeda = ["content-type", "cache-control", "app-source"];
2515
2598
  const objMeta = (0, import_omit.default)(obj.metaData, omitMeda);
2516
2599
  metaData = {
2517
- ...objMeta,
2518
- ...metaData
2600
+ ...objMeta
2519
2601
  };
2520
- return { success: obj.etag === hash2, metaData };
2602
+ let equalMeta = false;
2603
+ if (meta) {
2604
+ equalMeta = JSON.stringify(metaData) === JSON.stringify(meta);
2605
+ }
2606
+ return { success: obj.etag === hash2, metaData, obj, equalMeta };
2607
+ }
2608
+ getMetadata(pathname, meta = { "app-source": "user-app" }) {
2609
+ const isHtml = pathname.endsWith(".html");
2610
+ if (isHtml) {
2611
+ meta = {
2612
+ ...meta,
2613
+ "content-type": "text/html; charset=utf-8",
2614
+ "cache-control": "no-cache"
2615
+ };
2616
+ } else {
2617
+ meta = {
2618
+ ...meta,
2619
+ "content-type": getContentType(pathname),
2620
+ "cache-control": "max-age=31536000, immutable"
2621
+ };
2622
+ }
2623
+ return meta;
2521
2624
  }
2522
2625
  async copyObject(sourceObject, targetObject) {
2523
2626
  const bucketName = this.bucketName;
@@ -2605,7 +2708,7 @@ var ConfigOssService = class extends OssBase {
2605
2708
 
2606
2709
  // src/util/download.ts
2607
2710
  import fs from "node:fs";
2608
- import path from "node:path";
2711
+ import path2 from "node:path";
2609
2712
  var viewableExtensions = ["jpg", "jpeg", "png", "gif", "svg", "webp", "mp4", "webm", "mp3", "wav", "ogg", "pdf", "doc", "docx", "xls", "xlsx", "ppt", "pptx"];
2610
2713
  var filterMetaDataKeys = (metaData, clearKeys = []) => {
2611
2714
  const keys = Object.keys(metaData);
@@ -2651,7 +2754,7 @@ var sendObject = async ({ res, objectName, client, isDownload = false }) => {
2651
2754
  };
2652
2755
  var downloadObject = async ({ objectName, client, filePath }) => {
2653
2756
  const objectStream = await client.getObject(objectName);
2654
- const dir = path.dirname(filePath);
2757
+ const dir = path2.dirname(filePath);
2655
2758
  if (!fs.existsSync(dir)) {
2656
2759
  fs.mkdirSync(dir, { recursive: true });
2657
2760
  }
@@ -2664,6 +2767,7 @@ export {
2664
2767
  OssBase,
2665
2768
  downloadObject,
2666
2769
  filterMetaDataKeys,
2770
+ getContentType,
2667
2771
  hash,
2668
2772
  hashSringify,
2669
2773
  sendObject
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@kevisual/oss",
3
- "version": "0.0.10",
3
+ "version": "0.0.11",
4
4
  "main": "dist/index.js",
5
5
  "scripts": {
6
6
  "build": "tsup",