maoda-commander-tt 0.0.72 → 0.0.73

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/README.md CHANGED
@@ -270,8 +270,15 @@ tt assets upload './封面 图片.webp' --key 'yoyo/images/封面 图片.webp'
270
270
  分块恢复能力;这不等于按内容去重。上传期间不要修改源文件。
271
271
 
272
272
  Content-Type 按本地文件扩展名确定,未知类型为 `application/octet-stream`,简单与
273
- 分块上传都显式设置。对象使用 `Cache-Control: no-cache`,让同 key 更新后重新验证
274
- 缓存;不设置长期 `immutable`,不改变桶 ACL 或公开读配置。
273
+ 分块上传都显式设置。缓存按**目标 key 最后一个扩展名**选择,不区分大小写,不依据本地
274
+ 文件名或 MIME:常见脚本、样式、图片、音视频、字体、PDF 和压缩包统一设置
275
+ `Cache-Control: public, max-age=2592000, immutable`(30 天);HTML、JSON、无扩展名
276
+ 及其他类型使用 `no-cache`。完整扩展表见
277
+ [缓存策略](src/modules/assets/asset-cache-policy.ts),并与 Nginx 资源规则保持一致。
278
+ 桶 ACL 或公开读配置不变。
279
+
280
+ 同 key 覆盖仍会更新 COS 对象,**但不会刷新客户端已有的 30 天强缓存**。发布新内容
281
+ 请使用新 key,例如 `yoyo/audio/story-v2.mp3`;命令不会强制改名或自动生成哈希。
275
282
 
276
283
  ### 资源配置
277
284
 
@@ -298,7 +305,10 @@ writer 写入。它的 `value` 是包含以下五个字段的 JSON 字符串,
298
305
  Nginx 将 `/assets/<编码后的key>` 302 到固定 COS 桶的 `/tt/<编码后的key>`,配置见
299
306
  [资源入口路由](ops/nginx/tt-assets-location.conf)。302 保留原始 URL 编码,避免中文、
300
307
  空格及保留字符被二次解释。入口省略 `tt/`,但跳转的 Location 和浏览器网络记录仍能
301
- 看到 COS 对象路径。入口和对象都可更新,所以不得长期缓存 302 跳转规则。
308
+ 看到 COS 对象路径。常见静态资源的 Nginx 响应采用相同的 30 天强缓存策略,其他类型
309
+ 不强缓存,统一规则见 [静态缓存配置](ops/nginx/static-cache.conf) 与
310
+ [普通静态文件路由](ops/nginx/static-files-location.conf)。更新内容或资源入口映射时,
311
+ 要考虑已经缓存的响应,使用新 key 发布新内容。
302
312
 
303
313
  ### 资源上传结果
304
314
 
@@ -7584,6 +7584,85 @@ function inputError(message) {
7584
7584
  // src/modules/assets/cos-asset-uploader.ts
7585
7585
  import COS from "cos-nodejs-sdk-v5";
7586
7586
  import { Disposable as Disposable15 } from "rockbed/dispose";
7587
+
7588
+ // src/modules/assets/asset-cache-policy.ts
7589
+ var ASSET_STRONG_CACHE_EXTENSIONS = [
7590
+ "js",
7591
+ "mjs",
7592
+ "cjs",
7593
+ "css",
7594
+ "wasm",
7595
+ "map",
7596
+ "apng",
7597
+ "avif",
7598
+ "bmp",
7599
+ "gif",
7600
+ "heic",
7601
+ "heif",
7602
+ "ico",
7603
+ "jpeg",
7604
+ "jpg",
7605
+ "jxl",
7606
+ "png",
7607
+ "svg",
7608
+ "svgz",
7609
+ "tif",
7610
+ "tiff",
7611
+ "webp",
7612
+ "aac",
7613
+ "aif",
7614
+ "aiff",
7615
+ "flac",
7616
+ "m4a",
7617
+ "mid",
7618
+ "midi",
7619
+ "mp3",
7620
+ "oga",
7621
+ "ogg",
7622
+ "opus",
7623
+ "wav",
7624
+ "weba",
7625
+ "3gp",
7626
+ "3g2",
7627
+ "avi",
7628
+ "flv",
7629
+ "m4v",
7630
+ "mkv",
7631
+ "mov",
7632
+ "mp4",
7633
+ "mpeg",
7634
+ "mpg",
7635
+ "ogv",
7636
+ "webm",
7637
+ "wmv",
7638
+ "m4s",
7639
+ "ts",
7640
+ "eot",
7641
+ "otf",
7642
+ "ttf",
7643
+ "woff",
7644
+ "woff2",
7645
+ "pdf",
7646
+ "zip",
7647
+ "7z",
7648
+ "rar",
7649
+ "tar",
7650
+ "gz",
7651
+ "tgz",
7652
+ "bz2",
7653
+ "xz",
7654
+ "br",
7655
+ "swf"
7656
+ ];
7657
+ var ASSET_STRONG_CACHE_CONTROL = "public, max-age=2592000, immutable";
7658
+ var ASSET_DEFAULT_CACHE_CONTROL = "no-cache";
7659
+ var strongCacheExtensions = new Set(ASSET_STRONG_CACHE_EXTENSIONS);
7660
+ function getAssetCacheControl(objectKey) {
7661
+ const extension = /\.([a-z0-9]+)$/i.exec(objectKey)?.[1].toLowerCase();
7662
+ return extension && strongCacheExtensions.has(extension) ? ASSET_STRONG_CACHE_CONTROL : ASSET_DEFAULT_CACHE_CONTROL;
7663
+ }
7664
+
7665
+ // src/modules/assets/cos-asset-uploader.ts
7587
7666
  var CosAssetUploader = class extends Disposable15 {
7588
7667
  constructor(_config) {
7589
7668
  super();
@@ -7604,7 +7683,7 @@ var CosAssetUploader = class extends Disposable15 {
7604
7683
  Key: input.objectKey,
7605
7684
  FilePath: input.filePath,
7606
7685
  ContentType: input.contentType,
7607
- CacheControl: "no-cache"
7686
+ CacheControl: getAssetCacheControl(input.objectKey)
7608
7687
  });
7609
7688
  return {
7610
7689
  ...result.ETag ? { etag: result.ETag } : {},
@@ -7717,7 +7796,10 @@ var AssetsUploadCommand = class extends BaseCommand {
7717
7796
  \u4E0D\u5141\u8BB8\u524D\u5BFC/\u5C3E\u968F /\u3001\u7A7A\u8DEF\u5F84\u6BB5\u3001.\u3001..\u3001\u53CD\u659C\u6760\u6216\u63A7\u5236\u5B57\u7B26\uFF1B\u4E2D\u6587\u3001\u7A7A\u683C\u548C\u5B57\u9762 % \u53EF\u7528\u3002
7718
7797
  \u540C key \u9ED8\u8BA4\u66F4\u65B0\u5BF9\u8C61\uFF1B\u82E5\u6876\u542F\u7528\u7248\u672C\u63A7\u5236\uFF0C\u5386\u53F2\u7248\u672C\u7531 COS \u7BA1\u7406\u3002\u4E0D\u4F1A\u81EA\u52A8\u6539\u540D\u6216\u8DF3\u8FC7\u76F8\u540C\u5185\u5BB9\u3002
7719
7798
  \u4E0A\u4F20\u4F7F\u7528\u5B98\u65B9 SDK\uFF0C\u6309\u6587\u4EF6\u5927\u5C0F\u81EA\u52A8\u9009\u62E9\u7B80\u5355\u6216\u5206\u5757\u4E0A\u4F20\uFF1B\u4E0A\u4F20\u671F\u95F4\u4E0D\u8981\u4FEE\u6539\u6E90\u6587\u4EF6\u3002
7720
- Content-Type \u6309\u672C\u5730\u6587\u4EF6\u6269\u5C55\u540D\u8BC6\u522B\uFF0C\u672A\u77E5\u7C7B\u578B\u4E3A application/octet-stream\uFF1B\u7F13\u5B58\u8981\u6C42\u91CD\u65B0\u9A8C\u8BC1\u3002
7799
+ Content-Type \u6309\u672C\u5730\u6587\u4EF6\u6269\u5C55\u540D\u8BC6\u522B\uFF0C\u672A\u77E5\u7C7B\u578B\u4E3A application/octet-stream\u3002
7800
+ \u6309 key \u6700\u540E\u6269\u5C55\u540D\uFF08\u4E0D\u533A\u5206\u5927\u5C0F\u5199\uFF09\u9009\u62E9\u7F13\u5B58\uFF1B\u5E38\u89C1\u811A\u672C\u3001\u6837\u5F0F\u3001\u56FE\u7247\u3001\u97F3\u89C6\u9891\u3001\u5B57\u4F53\u3001PDF \u548C\u538B\u7F29\u5305\u5F3A\u7F13\u5B58 30 \u5929\u3002
7801
+ HTML/JSON \u53CA\u5176\u4ED6\u7C7B\u578B\u4E3A no-cache\uFF1B\u5B8C\u6574\u6269\u5C55\u8868\u89C1 README \u7684 COS \u8D44\u6E90\u4E0A\u4F20\u8BF4\u660E\u3002
7802
+ \u540C key \u8986\u76D6\u4E0D\u4F1A\u5237\u65B0\u5BA2\u6237\u7AEF\u5DF2\u6709\u5F3A\u7F13\u5B58\uFF1B\u53D1\u5E03\u65B0\u5185\u5BB9\u8BF7\u4F7F\u7528\u65B0 key\u3002
7721
7803
  \u4E0D\u6267\u884C\u7F51\u9875\u6784\u5EFA\u3001\u76EE\u5F55\u589E\u91CF\u540C\u6B65\u6216\u5220\u9664\u5176\u4ED6\u5BF9\u8C61\u3002
7722
7804
  `);
7723
7805
  }
@@ -9400,4 +9482,4 @@ export {
9400
9482
  TraexCommand,
9401
9483
  createRootCommands
9402
9484
  };
9403
- //# sourceMappingURL=chunk-UC2UEABF.js.map
9485
+ //# sourceMappingURL=chunk-HJSXXJQA.js.map