@be-link/cos 1.11.4 → 1.11.5-beta.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.
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sources":["../src/config.ts","../src/beLinkCos.ts"],"sourcesContent":["/**\n * 环境模式类型\n * - development: 开发环境\n * - testing: 测试环境\n * - production: 生产环境\n */\nexport type EnvMode = 'development' | 'testing' | 'production';\n\n/**\n * COS 存储桶配置接口\n */\nexport interface BucketConfig {\n /** 存储桶名称 */\n name: string;\n /** 存储桶访问域名 */\n host: string;\n /** 访问协议 */\n protocol: string;\n}\n\n/**\n * 各环境的 COS 存储桶配置\n * 根据环境自动切换到对应的存储桶\n */\nexport const BUCKETS_CONFIG: Record<EnvMode, BucketConfig> = {\n development: {\n name: 'dev-1304510571',\n host: 'dev-1304510571.cos.ap-nanjing.myqcloud.com',\n protocol: 'https',\n },\n testing: {\n name: 'dev-1304510571',\n host: 'dev-1304510571.cos.ap-nanjing.myqcloud.com',\n protocol: 'https',\n },\n production: {\n name: 'release-1304510571',\n host: 'release-1304510571.file.myqcloud.com',\n protocol: 'https',\n },\n};\n\n/** COS 存储桶所在地域(南京) */\nexport const REGION = 'ap-nanjing' as const;\n","import CryptoJS from 'crypto-js';\n// @ts-ignore\nimport COS from 'cos-js-sdk-v5';\nimport { BUCKETS_CONFIG, REGION, type EnvMode } from './config';\nimport type { InitConfig, UploadConfig, UploadResult } from './types';\n\n/**\n * BeLinkCOS 类 - 腾讯云 COS 文件上传工具\n *\n * 功能:文件上传、MD5 计算、临时密钥授权\n *\n * @example\n * import { BeLinkCOS } from '@be-link/cos';\n *\n * const uploader = new BeLinkCOS({ mode: 'production' });\n * await uploader.uploadFile(file);\n */\nexport class BeLinkCOS {\n /** COS SDK 实例 */\n private cos: any = null;\n /** COS 存储的基础路径 */\n private readonly basePath: string = '/beLinkAllSource/static/';\n /** 自定义请求头 */\n public headers: Record<string, any>;\n /** 当前环境模式 */\n public mode: EnvMode;\n /** 是否限制临时密钥的使用范围 */\n private scopeLimit: boolean;\n\n /**\n * 构造函数\n *\n * 注意:mode 参数必填,没有默认值\n * 设计理念:强制显式配置环境,避免误传到错误的环境\n *\n * @param config - 初始化配置\n * @param config.mode - **必填** 环境模式:'development' | 'testing' | 'production'\n * @param config.headers - 可选,自定义请求头\n * @param config.ScopeLimit - 可选,是否限制临时密钥的使用范围(默认 false)\n *\n * @example\n * // 基础使用\n * const uploader = new BeLinkCOS({ mode: 'production' });\n *\n * // 带自定义请求头\n * const uploader = new BeLinkCOS({\n * mode: 'production',\n * headers: { 'x-custom': 'value' }\n * });\n */\n constructor(config: InitConfig) {\n this.mode = config.mode;\n this.headers = config.headers || {};\n this.scopeLimit = config.ScopeLimit || false;\n }\n\n /**\n * 初始化 COS SDK 实例\n *\n * 内部方法,通过云函数获取临时密钥\n * 首次上传时会自动调用,也可以手动调用以重新初始化\n *\n * @returns Promise<void>\n */\n private async initCOS(): Promise<void> {\n if (this.cos) {\n return; // 已初始化,直接返回\n }\n\n const cos = new COS({\n getAuthorization: (_options: any, callback: (p: any) => void) => {\n const url =\n this.mode === 'production'\n ? 'https://shield-60660-10-1304510571.sh.run.tcloudbase.com/config/get-cos-temp-secret'\n : 'https://shield-74680-5-1304510571.sh.run.tcloudbase.com/config/get-cos-temp-secret';\n fetch(url, { method: 'POST' })\n .then((response) => response.json())\n .then((result) => {\n const data = result?.data || {};\n const credentials = data?.credentials;\n\n callback({\n TmpSecretId: credentials.tmpSecretId, // 临时密钥的 tmpSecretId\n TmpSecretKey: credentials.tmpSecretKey, // 临时密钥的 tmpSecretKey\n SecurityToken: credentials.sessionToken, // 临时密钥的 sessionToken\n // 建议返回服务器时间作为签名的开始时间,避免用户浏览器本地时间偏差过大导致签名错误\n StartTime: data.startTime, // 时间戳,单位秒,如:1580000000\n ExpiredTime: data.expiredTime, // 临时密钥失效时间戳,是申请临时密钥时,时间戳加 durationSeconds\n ScopeLimit: this.scopeLimit, // 细粒度控制权限需要设为 true,会限制密钥只在相同请求时重复使用\n });\n })\n .catch((error) => {\n console.error('Error fetching authorization:', error);\n callback(null);\n });\n },\n });\n this.cos = cos;\n }\n\n /**\n * 计算文件的 MD5 哈希值\n *\n * 性能优化:\n * - 小文件(< 10MB):一次性读取,速度更快\n * - 大文件:分片读取,避免内存溢出\n *\n * @param file - 要计算 MD5 的文件对象\n * @param chunkSize - 分片大小(字节),默认 2MB\n * @returns Promise<string> 文件的 MD5 哈希值\n *\n * @example\n * const md5 = await beLinkCOS.createFileMd5(file);\n * console.log('文件 MD5:', md5);\n */\n public createFileMd5(file: File, chunkSize: number = 2 * 1024 * 1024): Promise<string> {\n return new Promise((resolve, reject) => {\n // 对于小文件(< 10MB),使用简单方法\n if (file.size < 10 * 1024 * 1024) {\n const reader = new FileReader();\n\n reader.onload = (e: ProgressEvent<FileReader>) => {\n const arrayBuffer = e.target?.result as ArrayBuffer;\n if (arrayBuffer) {\n const wordArray = CryptoJS.lib.WordArray.create(arrayBuffer as any);\n const hash = CryptoJS.MD5(wordArray).toString();\n resolve(hash);\n } else {\n reject(new Error('Failed to read file'));\n }\n };\n\n reader.onerror = (error) => {\n reject(error);\n };\n\n reader.readAsArrayBuffer(file);\n return;\n }\n\n // 对于大文件,使用分片读取\n let currentChunk = 0;\n const chunks = Math.ceil(file.size / chunkSize);\n const spark = CryptoJS.algo.MD5.create();\n const reader = new FileReader();\n\n reader.onload = (e: ProgressEvent<FileReader>) => {\n const arrayBuffer = e.target?.result as ArrayBuffer;\n if (arrayBuffer) {\n const wordArray = CryptoJS.lib.WordArray.create(arrayBuffer as any);\n spark.update(wordArray);\n\n currentChunk++;\n\n if (currentChunk < chunks) {\n loadNext();\n } else {\n const hash = spark.finalize().toString();\n resolve(hash);\n }\n }\n };\n\n reader.onerror = (error) => {\n reject(error);\n };\n\n const loadNext = () => {\n const start = currentChunk * chunkSize;\n const end = Math.min(start + chunkSize, file.size);\n const blob = file.slice(start, end);\n reader.readAsArrayBuffer(blob);\n };\n\n loadNext();\n });\n }\n\n /**\n * 生成文件在 COS 中的存储路径\n *\n * 路径规则:/beLinkAllSource/static/{文件类型}/{文件名}_{时间戳}.{扩展名}\n * 例如:/beLinkAllSource/static/image/avatar_1699999999999.png\n *\n * @param file - 文件对象\n * @returns Promise<string> COS 存储路径\n */\n private async getFilePath(file: File): Promise<string> {\n const filename = file.name;\n const fileType = file?.type ? file.type.split('/')[0] : 'other';\n const fileExtension = filename.split('.').pop() || '';\n const filenameDateNow = `${filename.split('.')[0]}_${Date.now()}`;\n const newFileName = `${filenameDateNow}.${fileExtension}`;\n return `${this.basePath}${fileType}/${newFileName}`;\n }\n\n /**\n * 获取文件上传后的访问 URL(不执行实际上传)\n *\n * 用于在上传前预览文件的最终 URL\n *\n * @param file - 文件对象\n * @returns Promise<string> 文件的完整访问 URL\n *\n * @example\n * const url = await beLinkCOS.getSourceUrl(file);\n * console.log('文件将上传到:', url);\n */\n public async getSourceUrl(file: File): Promise<string> {\n const path = await this.getFilePath(file);\n return `https://${BUCKETS_CONFIG[this.mode].host}${path}`;\n }\n\n /**\n * 上传文件到腾讯云 COS\n *\n * 核心功能:将文件上传到对应环境的 COS 存储桶\n * 支持上传进度回调、自定义请求头等配置\n *\n * @param file - 要上传的文件对象\n * @param config - 上传配置(可选)\n * @param config.Headers - 自定义请求头\n * @param config.onProgressCallback - 上传进度回调函数\n * @returns Promise<UploadResult> 上传结果,包含文件 URL、ETag 等信息\n *\n * @example\n * const uploader = new BeLinkCOS({ mode: 'production' });\n * const result = await uploader.uploadFile(file, {\n * onProgressCallback: (progressData) => {\n * console.log('进度:', progressData.percent * 100 + '%');\n * }\n * });\n * console.log('文件 URL:', result.url);\n */\n public async uploadFile(file: File, config?: UploadConfig): Promise<UploadResult> {\n // 首次上传时自动初始化 COS SDK\n if (!this.cos) {\n await this.initCOS();\n }\n const key = await this.getFilePath(file);\n\n return new Promise((resolve, reject) => {\n this.cos?.putObject(\n {\n Bucket: BUCKETS_CONFIG[this.mode].name,\n Region: REGION,\n Key: key,\n Body: file,\n onProgress: config?.onProgressCallback,\n ...config,\n Headers: { ...this.headers, ...(config?.Headers || {}) },\n },\n (err: any, data: UploadResult) => {\n if (err) {\n reject(err);\n } else {\n const url = `https://${data.Location}`;\n resolve({ ...data, url });\n }\n },\n );\n });\n }\n}\n"],"names":[],"mappings":"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"}
@@ -0,0 +1,48 @@
1
+ import type { EnvMode } from './config';
2
+ /**
3
+ * COS 初始化配置
4
+ *
5
+ * 注意:mode 参数必填,设计上不提供默认值
6
+ * 原因:避免开发者忘记配置导致误传到错误环境
7
+ */
8
+ export interface InitConfig {
9
+ /**
10
+ * 环境模式(必填,无默认值)
11
+ *
12
+ * - development: 开发环境
13
+ * - testing: 测试环境
14
+ * - production: 生产环境
15
+ */
16
+ mode: EnvMode;
17
+ /** 自定义请求头(可选) */
18
+ headers?: Record<string, any>;
19
+ /** 是否限制临时密钥的使用范围(可选,默认 false) */
20
+ ScopeLimit?: boolean;
21
+ }
22
+ /**
23
+ * 文件上传配置
24
+ */
25
+ export interface UploadConfig {
26
+ /** 自定义请求头 */
27
+ Headers?: Record<string, any>;
28
+ /** 上传进度回调 */
29
+ onProgressCallback?: (progressData: any) => void;
30
+ /** 其他 COS SDK 支持的参数 */
31
+ [key: string]: any;
32
+ }
33
+ /**
34
+ * 文件上传结果
35
+ */
36
+ export interface UploadResult {
37
+ /** 文件的 ETag */
38
+ ETag: string;
39
+ /** 文件的访问地址 */
40
+ Location: string;
41
+ /** HTTP 状态码 */
42
+ statusCode: number;
43
+ /** 响应头 */
44
+ headers: Record<string, any>;
45
+ /** 完整的 URL 地址 */
46
+ url: string;
47
+ }
48
+ //# sourceMappingURL=types.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../src/types.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,UAAU,CAAC;AAExC;;;;;GAKG;AACH,MAAM,WAAW,UAAU;IACzB;;;;;;OAMG;IACH,IAAI,EAAE,OAAO,CAAC;IAEd,iBAAiB;IACjB,OAAO,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,CAAC;IAE9B,iCAAiC;IACjC,UAAU,CAAC,EAAE,OAAO,CAAC;CACtB;AAED;;GAEG;AACH,MAAM,WAAW,YAAY;IAC3B,aAAa;IACb,OAAO,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,CAAC;IAC9B,aAAa;IACb,kBAAkB,CAAC,EAAE,CAAC,YAAY,EAAE,GAAG,KAAK,IAAI,CAAC;IACjD,uBAAuB;IACvB,CAAC,GAAG,EAAE,MAAM,GAAG,GAAG,CAAC;CACpB;AAED;;GAEG;AACH,MAAM,WAAW,YAAY;IAC3B,eAAe;IACf,IAAI,EAAE,MAAM,CAAC;IACb,cAAc;IACd,QAAQ,EAAE,MAAM,CAAC;IACjB,eAAe;IACf,UAAU,EAAE,MAAM,CAAC;IACnB,UAAU;IACV,OAAO,EAAE,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,CAAC;IAC7B,iBAAiB;IACjB,GAAG,EAAE,MAAM,CAAC;CACb"}
package/package.json CHANGED
@@ -1,38 +1,44 @@
1
1
  {
2
- "name": "@be-link/cos",
3
- "version": "1.11.4",
4
- "description": "前端项目产物上传cos",
5
- "author": "zhuifeng <yangyiboys@163.com>",
6
- "homepage": "https://github.com/snowmountain-top/be-link#readme",
7
- "license": "ISC",
8
- "main": "lib/cos.js",
9
- "files": [
10
- "lib",
11
- "bin",
12
- "dist",
13
- "types",
14
- "package.json",
15
- "README.md"
16
- ],
17
- "bin": {
18
- "cos": "./bin/cos.js"
19
- },
20
- "repository": {
21
- "type": "git",
22
- "url": "git+https://github.com/snowmountain-top/be-link.git"
23
- },
24
- "scripts": {
25
- "build": "rm -rf ./dist && rollup --config rollup.config.ts --configPlugin typescript"
26
- },
27
- "bugs": {
28
- "url": "https://github.com/snowmountain-top/be-link/issues"
29
- },
30
- "dependencies": {
31
- "cos-nodejs-sdk-v5": "2.12.1",
32
- "crypto-js": "4.2.0"
33
- },
34
- "publishConfig": {
35
- "access": "public"
36
- },
37
- "gitHead": "76b71bb6850e5f57f1a1ba4bd17f2ae0f603b67e"
38
- }
2
+ "name": "@be-link/cos",
3
+ "version": "1.11.5-beta.0",
4
+ "description": "前端项目产物上传cos",
5
+ "author": "zhuifeng <yangyiboys@163.com>",
6
+ "homepage": "https://github.com/snowmountain-top/be-link#readme",
7
+ "license": "ISC",
8
+ "main": "dist/index.js",
9
+ "module": "dist/index.js",
10
+ "types": "dist/index.d.ts",
11
+ "files": [
12
+ "dist",
13
+ "package.json",
14
+ "README.md"
15
+ ],
16
+ "repository": {
17
+ "type": "git",
18
+ "url": "git+https://github.com/snowmountain-top/be-link.git"
19
+ },
20
+ "bugs": {
21
+ "url": "https://github.com/snowmountain-top/be-link/issues"
22
+ },
23
+ "peerDependencies": {
24
+ "cos-js-sdk-v5": "^1.8.6",
25
+ "crypto-js": "^4.2.0"
26
+ },
27
+ "dependencies": {
28
+ "cos-js-sdk-v5": "^1.8.6",
29
+ "crypto-js": "^4.2.0"
30
+ },
31
+ "devDependencies": {
32
+ "@types/crypto-js": "^4.2.2"
33
+ },
34
+ "publishConfig": {
35
+ "access": "public"
36
+ },
37
+ "gitHead": "76b71bb6850e5f57f1a1ba4bd17f2ae0f603b67e",
38
+ "scripts": {
39
+ "clean": "rimraf ./dist",
40
+ "build:js": "rollup --config rollup.config.ts --configPlugin typescript",
41
+ "build:types": "tsc --project tsconfig.json --emitDeclarationOnly --declarationDir dist",
42
+ "build": "pnpm clean && pnpm build:js && pnpm build:types"
43
+ }
44
+ }
package/bin/cos.js DELETED
@@ -1,9 +0,0 @@
1
- #!/usr/bin/env node
2
- 'use strict'
3
-
4
- const { staticUploadToCos } = require('../lib/upload')
5
- function main() {
6
- staticUploadToCos()
7
- }
8
-
9
- main()
package/lib/config.js DELETED
@@ -1,19 +0,0 @@
1
- const BUCKETS_CONFIG = {
2
- development: {
3
- name: 'dev-1304510571',
4
- host: 'dev-1304510571.cos.ap-nanjing.myqcloud.com',
5
- protocol: 'https',
6
- },
7
- trial: {
8
- name: 'dev-1304510571',
9
- host: 'dev-1304510571.cos.ap-nanjing.myqcloud.com',
10
- protocol: 'https',
11
- },
12
- production: {
13
- name: 'release-1304510571',
14
- host: 'release-1304510571.file.myqcloud.com',
15
- protocol: 'https',
16
- },
17
- }
18
-
19
- module.exports = BUCKETS_CONFIG
package/lib/upload.js DELETED
@@ -1,134 +0,0 @@
1
- 'use strict'
2
- const fs = require('fs')
3
- const path = require('path')
4
- const COS = require('cos-nodejs-sdk-v5')
5
- const BUCKETS_CONFIG = require('./config')
6
-
7
- const argv = process.argv.slice(2)
8
- const [mode] = argv
9
- console.log('mode', mode)
10
-
11
- // 获取项目名称
12
- const baseUrl = mode === 'production' ? 'project/prod/' : 'project/dev/'
13
- const packageUrl = path.resolve(process.cwd(), './package.json')
14
- const projectPackage = fs.readFileSync(packageUrl, { encoding: 'utf-8' })
15
- const projectName = JSON.parse(projectPackage).name
16
- const projectRemoteUrl = baseUrl + projectName
17
-
18
- // 构建参数输出的地址
19
- const distDirUrl = process.cwd() + '/dist'
20
-
21
- // 创建一个 cos
22
- const cos = new COS({
23
- SecretId: 'AKIDx3wfJo5e4FAqHSOJ5cu2y3zh9MK2Uhy6',
24
- SecretKey: '3sgW7V7W1PZWIqAKI8krpY3JL9j5C3e1',
25
- })
26
-
27
- function upload(url, filename) {
28
- if (!url) return
29
- if (!filename) return
30
- cos.putObject(
31
- {
32
- Bucket: BUCKETS_CONFIG[mode || 'development'].name,
33
- Region: 'ap-nanjing',
34
- Key: projectRemoteUrl + filename /* 必须 */,
35
- StorageClass: 'STANDARD',
36
- Body: fs.createReadStream(url), // 上传文件对象
37
- onProgress: function (progressData) {},
38
- },
39
- function (err, data) {
40
- if (err) {
41
- console.log('文件上传失败', err)
42
- }
43
- },
44
- )
45
- }
46
-
47
- function getAllFiles(directoryPath) {
48
- const files = fs.readdirSync(directoryPath, { withFileTypes: true })
49
- const fileNamesAndPaths = []
50
-
51
- files.forEach((file) => {
52
- const filePath = path.join(directoryPath, file.name)
53
-
54
- if (file.isFile()) {
55
- fileNamesAndPaths.push({
56
- fileName: file.name,
57
- filePath: filePath,
58
- })
59
- } else if (file.isDirectory()) {
60
- const subDirectoryFiles = getAllFiles(filePath)
61
- fileNamesAndPaths.push(...subDirectoryFiles)
62
- }
63
- })
64
-
65
- return fileNamesAndPaths
66
- }
67
-
68
- function getBucket() {
69
- return new Promise((resolve, reject) => {
70
- cos.getBucket(
71
- {
72
- Bucket: BUCKETS_CONFIG[mode || 'development'].name,
73
- Region: 'ap-nanjing',
74
- Prefix: 'project/dev/manager' /* 非必须 */,
75
- },
76
- function (err, data) {
77
- console.log(err || data.Contents)
78
- },
79
- )
80
- })
81
- }
82
-
83
- // 删除
84
- function deleteProject() {
85
- return new Promise((resolve, reject) => {
86
- cos.deleteObject(
87
- {
88
- Bucket: BUCKETS_CONFIG[mode || 'development'].name,
89
- Region: 'ap-nanjing',
90
- Key: projectRemoteUrl /* 必须 */,
91
- },
92
- function (err, data) {
93
- if (err) {
94
- console.log('删除失败')
95
- reject(err)
96
- }
97
- if (data) {
98
- console.log('删除成功')
99
- resolve(data)
100
- }
101
- },
102
- )
103
- })
104
- }
105
-
106
- // 全量
107
- // 获取文件列表
108
-
109
- // 删除cos中的文件
110
-
111
- // 上传文件列表
112
-
113
- // 增量
114
- // 获取远程的文件列表
115
- // 获取本地的文件列表
116
- // 将远程的文件列表和本地的文件列表进行对比获取 diff 的文件
117
- // 删除远程不再需要的文件
118
- // 上传新的文件
119
-
120
- function staticUploadToCos() {
121
- console.log('资源上传至:https://release-1304510571.file.myqcloud.com/' + projectRemoteUrl)
122
- const files = getAllFiles(distDirUrl)
123
- deleteProject().then(() => {
124
- files.forEach((file) => {
125
- // 获取文件名称
126
- const filename = file.filePath.replace(distDirUrl, '')
127
- upload(file.filePath, filename)
128
- })
129
- })
130
- }
131
-
132
- module.exports = {
133
- staticUploadToCos,
134
- }