@bnfe/obs-upload 0.0.0-stage → 1.0.1
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 +157 -2
- package/dist/obs-upload.cjs.js +3 -0
- package/dist/obs-upload.esm.js +3 -0
- package/dist/obs-upload.umd.js +3 -0
- package/dist/types/index.d.ts +1 -0
- package/dist/types/utils/index.d.ts +103 -0
- package/package.json +24 -3
package/README.md
CHANGED
|
@@ -1,3 +1,158 @@
|
|
|
1
|
-
#
|
|
1
|
+
# @bnfe/obs-upload
|
|
2
2
|
|
|
3
|
-
|
|
3
|
+
华为云 OBS 浏览器上传包,使用方式参照 `@bnfe/oss-upload`。
|
|
4
|
+
|
|
5
|
+
## 安装
|
|
6
|
+
|
|
7
|
+
```sh
|
|
8
|
+
pnpm add @bnfe/obs-upload
|
|
9
|
+
```
|
|
10
|
+
|
|
11
|
+
## 使用
|
|
12
|
+
|
|
13
|
+
```ts
|
|
14
|
+
import { HwOss } from "@bnfe/obs-upload";
|
|
15
|
+
|
|
16
|
+
const hwOss = new HwOss({
|
|
17
|
+
dir: "/test-upload",
|
|
18
|
+
reqUrl: "/api/obs/token"
|
|
19
|
+
});
|
|
20
|
+
|
|
21
|
+
export const OssUpload = async (file: File, childDir = "") => {
|
|
22
|
+
const result = await hwOss.upload(file, childDir);
|
|
23
|
+
return result.cdnUrl;
|
|
24
|
+
};
|
|
25
|
+
```
|
|
26
|
+
|
|
27
|
+
## 临时凭证接口
|
|
28
|
+
|
|
29
|
+
`reqUrl` 支持绝对地址和浏览器中的相对地址。请求使用 GET,添加 `expire` 查询参数(单位秒,默认 3600),保留已有查询参数。
|
|
30
|
+
服务端返回以下 JSON;AK、SK 和 token 应为同一组临时凭证。
|
|
31
|
+
|
|
32
|
+
```json
|
|
33
|
+
{
|
|
34
|
+
"data": {
|
|
35
|
+
"host": "https://cdn.example.com",
|
|
36
|
+
"endpoint": "https://obs.xxx.myhuaweicloud.com",
|
|
37
|
+
"region": "xxx",
|
|
38
|
+
"bucket": "example-bucket",
|
|
39
|
+
"accessKeyId": "临时 AK",
|
|
40
|
+
"accessKeySecret": "临时 SK",
|
|
41
|
+
"stsToken": "临时 securitytoken",
|
|
42
|
+
"expiration": "2026-10-15T10:00:00Z"
|
|
43
|
+
}
|
|
44
|
+
}
|
|
45
|
+
```
|
|
46
|
+
|
|
47
|
+
`host` 为文件访问域名,可以是 CDN 域名或 OBS 桶域名。`endpoint` 为必填的区域 OBS Endpoint(包含协议,不包含桶名)。
|
|
48
|
+
临时 token 支持 `stsToken` 和 `securityToken`,两者同时存在时优先使用 `securityToken`。`region` 为可选区域信息。
|
|
49
|
+
`expiration` 可选,为 ISO8601 过期时间;省略时按获取时间加 `expire` 计算。
|
|
50
|
+
每次上传前检查凭证有效期,临近过期时重新获取;同时发起的凭证请求合并为一次。
|
|
51
|
+
长时间上传期间如果凭证失效,可以获取新凭证后使用 checkpoint 重试分片上传。
|
|
52
|
+
|
|
53
|
+
## 构造参数
|
|
54
|
+
|
|
55
|
+
| 参数 | 说明 | 默认值 |
|
|
56
|
+
| ----------------------- | ---------------------------- | ------------------- |
|
|
57
|
+
| `reqUrl` | 临时凭证接口,必填 | — |
|
|
58
|
+
| `dir` | 文件目录,可带首尾斜杠 | `public` |
|
|
59
|
+
| `expire` | 请求临时凭证的有效期,单位秒 | `3600` |
|
|
60
|
+
| `multipartUploadSize` | 自动分片阈值,单位字节 | `100 * 1024 * 1024` |
|
|
61
|
+
| `multipartUploadParams` | 默认分片参数 | `{}` |
|
|
62
|
+
|
|
63
|
+
## 上传方法
|
|
64
|
+
|
|
65
|
+
```ts
|
|
66
|
+
hwOss.upload(file, childDir?, multipartUploadParams?);
|
|
67
|
+
hwOss.directUpload(file, childDir?);
|
|
68
|
+
hwOss.multipartUpload(file, childDir?, multipartUploadParams?);
|
|
69
|
+
hwOss.getToken(init?);
|
|
70
|
+
```
|
|
71
|
+
|
|
72
|
+
`upload` 对超过阈值、超过直接上传的 5GB 上限或带 checkpoint 的请求使用分片上传,其余使用直接上传。
|
|
73
|
+
直接上传最大 5GB;小于 100KB 且无 checkpoint 的分片请求使用直接上传。
|
|
74
|
+
分片上传由 SDK 的 `uploadFile` 完成初始化、分段上传和合并;最多 10000 段,每段最大 5GB,SDK 会按文件大小调整分段大小。
|
|
75
|
+
直接调用 `directUpload` 或 `multipartUpload` 也会获取临时凭证。
|
|
76
|
+
|
|
77
|
+
文件名格式为 `hw-oss-web/{dir}/{childDir}/YYYYMMDDHHMMSS_随机ID.扩展名`,扩展名保留字母和数字并转换为小写。
|
|
78
|
+
目录以 `/` 连接,对象 Key 不带开头的 `/`,返回的访问 URL 对路径段进行编码。
|
|
79
|
+
|
|
80
|
+
### 分片参数和断点续传
|
|
81
|
+
|
|
82
|
+
| 参数 | 说明 | 默认值 |
|
|
83
|
+
| ---------------- | --------------------------------------------------------------------- | ------------- |
|
|
84
|
+
| `parallel` | 最大并发数,正整数,对应 `TaskNum` | `5` |
|
|
85
|
+
| `partSize` | 分片大小,100KB~5GB,单位字节,对应 `PartSize` | `1024 * 1024` |
|
|
86
|
+
| `checkpoint` | 华为云 SDK 原始断点对象,对应 `UploadCheckpoint` | — |
|
|
87
|
+
| `progress` | `(p, fileUrl, checkpoint, res)`,p 为 0~1 比例,fileUrl 为 CDN URL | — |
|
|
88
|
+
| `resumeCallback` | `(hook, checkpoint)`,hook.cancel() 暂停,hook.abort() 取消并删除分段 | — |
|
|
89
|
+
| `eventCallback` | `(eventType, eventParams, result)`,华为云原始上传事件 | — |
|
|
90
|
+
|
|
91
|
+
方法参数会覆盖构造函数中的同名分片参数。断点仅可用于相同文件、相同 OBS 桶;重试保持原对象 Key。
|
|
92
|
+
`progress` 会在获得断点、传输进度变化、分段成功以及合并成功时调用,`res` 为最近的分段/合并响应,首次可能为 undefined。
|
|
93
|
+
续传开始时,初始进度按断点中已完成分片的总字节数计算;未完成分片的传输进度不计入初始值。
|
|
94
|
+
传输比例达到 1 时可能仍在合并分段,请以 `upload` Promise 成功返回为准。
|
|
95
|
+
|
|
96
|
+
```ts
|
|
97
|
+
import {
|
|
98
|
+
HwOss,
|
|
99
|
+
type UploadCheckpointTypes,
|
|
100
|
+
type ResumeHookTypes
|
|
101
|
+
} from "@bnfe/obs-upload";
|
|
102
|
+
|
|
103
|
+
const hwOss = new HwOss({ reqUrl: "/api/obs/token" });
|
|
104
|
+
let checkpoint: UploadCheckpointTypes | undefined;
|
|
105
|
+
let hook: ResumeHookTypes | undefined;
|
|
106
|
+
|
|
107
|
+
const upload = (file: File) =>
|
|
108
|
+
hwOss.multipartUpload(file, "", {
|
|
109
|
+
checkpoint,
|
|
110
|
+
resumeCallback: (resumeHook, cp) => {
|
|
111
|
+
hook = resumeHook;
|
|
112
|
+
checkpoint = cp;
|
|
113
|
+
},
|
|
114
|
+
progress: (p, fileUrl, cp) => {
|
|
115
|
+
checkpoint = cp;
|
|
116
|
+
console.log(p, fileUrl);
|
|
117
|
+
}
|
|
118
|
+
});
|
|
119
|
+
|
|
120
|
+
// await upload(file);
|
|
121
|
+
// hook?.cancel(); // 暂停时 upload 的 Promise 会 reject,调用方需要捕获。
|
|
122
|
+
// await upload(file); // 使用同一文件和保存的断点继续。
|
|
123
|
+
// checkpoint = undefined; // 上传成功后清理断点,再开始下一次上传。
|
|
124
|
+
```
|
|
125
|
+
|
|
126
|
+
断点对象包含 File 引用及 SDK 校验字段,建议在当前页面内保存原始对象,不要用阿里云的 checkpoint,也不要自行修改字段。
|
|
127
|
+
|
|
128
|
+
## 返回值
|
|
129
|
+
|
|
130
|
+
```ts
|
|
131
|
+
type ResParamsTypes = {
|
|
132
|
+
cdnUrl: string; // CDN 文件访问 URL
|
|
133
|
+
ossUrl: string; // OBS Location;直接上传无 Location 时使用桶 Endpoint URL
|
|
134
|
+
fileName: string; // 完整对象 Key
|
|
135
|
+
ossResParams: any; // 华为云 SDK 原始响应
|
|
136
|
+
};
|
|
137
|
+
```
|
|
138
|
+
|
|
139
|
+
凭证请求失败、SDK 网络错误和非 2xx OBS 响应均会 reject。OBS 状态错误的 Error 对象包含 `ossResParams` 原始响应。
|
|
140
|
+
|
|
141
|
+
## 构建
|
|
142
|
+
|
|
143
|
+
```sh
|
|
144
|
+
pnpm --filter @bnfe/obs-upload build
|
|
145
|
+
```
|
|
146
|
+
|
|
147
|
+
输出 CJS、ESM、UMD 和 TypeScript 声明。与参考包一致,SDK 和 nanoid 为外部依赖;通过 script 使用 UMD 时需先提供全局 `ObsClient` 和 `nanoid`,然后访问 `HwOss.HwOss`。
|
|
148
|
+
|
|
149
|
+
## OBS 配置与参考文档
|
|
150
|
+
|
|
151
|
+
浏览器跨域上传需要桶配置对应来源的 CORS 规则,并将 `ETag` 添加到暴露的响应头,使 SDK 可以读取分段 ETag 完成合并。
|
|
152
|
+
|
|
153
|
+
客户端固定使用 OBS 签名,关闭签名版本协商,不发起 `?apiversion` 探测。桶的 CORS 仍需允许实际页面来源(本地示例为 `http://localhost:8080`)、`PUT`、`GET`、`POST`、`DELETE`、`HEAD` 方法及上传请求头;允许的请求头可设置为 `*`。
|
|
154
|
+
|
|
155
|
+
- [文件上传](https://support.huaweicloud.com/sdk-browserjs-devg-obs/obs_24_0503.html)
|
|
156
|
+
- [分段上传](https://support.huaweicloud.com/sdk-browserjs-devg-obs/obs_24_0507.html)
|
|
157
|
+
- [断点续传上传](https://support.huaweicloud.com/sdk-browserjs-devg-obs/obs_24_0511.html)
|
|
158
|
+
- [OBS BrowserJS SDK 源码](https://github.com/huaweicloud/huaweicloud-sdk-browserjs-obs)
|
|
@@ -0,0 +1,3 @@
|
|
|
1
|
+
"use strict";var e=require("esdk-obs-browserjs"),t=require("nanoid");function r(e){return r="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(e){return typeof e}:function(e){return e&&"function"==typeof Symbol&&e.constructor===Symbol&&e!==Symbol.prototype?"symbol":typeof e},r(e)}function n(e){var t=function(e,t){if("object"!=r(e)||!e)return e;var n=e[Symbol.toPrimitive];if(void 0!==n){var o=n.call(e,t);if("object"!=r(o))return o;throw new TypeError("@@toPrimitive must return a primitive value.")}return String(e)}(e,"string");return"symbol"==r(t)?t:t+""}function o(e,t,r){return t&&function(e,t){for(var r=0;r<t.length;r++){var o=t[r];o.enumerable=o.enumerable||!1,o.configurable=!0,"value"in o&&(o.writable=!0),Object.defineProperty(e,n(o.key),o)}}(e.prototype,t),Object.defineProperty(e,"prototype",{writable:!1}),e}function i(e){return e&&e.__esModule&&Object.prototype.hasOwnProperty.call(e,"default")?e.default:e}var a,u={exports:{}},s={exports:{}};(a=s).exports=function(e,t){this.v=e,this.k=t},a.exports.__esModule=!0,a.exports.default=a.exports;var c=s.exports,l={exports:{}},p={exports:{}};!function(e){function t(r,n,o,i){var a=Object.defineProperty;try{a({},"",{})}catch(r){a=0}e.exports=t=function(e,r,n,o){function i(r,n){t(e,r,function(e){return this._invoke(r,n,e)})}r?a?a(e,r,{value:n,enumerable:!o,configurable:!o,writable:!o}):e[r]=n:(i("next",0),i("throw",1),i("return",2))},e.exports.__esModule=!0,e.exports.default=e.exports,t(r,n,o,i)}e.exports=t,e.exports.__esModule=!0,e.exports.default=e.exports}(p);var f=p.exports;!function(e){var t=f;function r(){
|
|
2
|
+
/*! regenerator-runtime -- Copyright (c) 2014-present, Facebook, Inc. -- license (MIT): https://github.com/babel/babel/blob/main/packages/babel-helpers/LICENSE */
|
|
3
|
+
var n,o,i="function"==typeof Symbol?Symbol:{},a=i.iterator||"@@iterator",u=i.toStringTag||"@@toStringTag";function s(e,r,i,a){var u=r&&r.prototype instanceof l?r:l,s=Object.create(u.prototype);return t(s,"_invoke",function(e,t,r){var i,a,u,s=0,l=r||[],p=!1,f={p:0,n:0,v:n,a:d,f:d.bind(n,4),d:function(e,t){return i=e,a=0,u=n,f.n=t,c}};function d(e,t){for(a=e,u=t,o=0;!p&&s&&!r&&o<l.length;o++){var r,i=l[o],d=f.p,v=i[2];e>3?(r=v===t)&&(u=i[(a=i[4])?5:(a=3,3)],i[4]=i[5]=n):i[0]<=d&&((r=e<2&&d<i[1])?(a=0,f.v=t,f.n=i[1]):d<v&&(r=e<3||i[0]>t||t>v)&&(i[4]=e,i[5]=t,f.n=v,a=0))}if(r||e>1)return c;throw p=!0,t}return function(r,l,v){if(s>1)throw TypeError("Generator is already running");for(p&&1===l&&d(l,v),a=l,u=v;(o=a<2?n:u)||!p;){i||(a?a<3?(a>1&&(f.n=-1),d(a,u)):f.n=u:f.v=u);try{if(s=2,i){if(a||(r="next"),o=i[r]){if(!(o=o.call(i,u)))throw TypeError("iterator result is not an object");if(!o.done)return o;u=o.value,a<2&&(a=0)}else 1===a&&(o=i.return)&&o.call(i),a<2&&(u=TypeError("The iterator does not provide a '"+r+"' method"),a=1);i=n}else if((o=(p=f.n<0)?u:e.call(t,f))!==c)break}catch(e){i=n,a=1,u=e}finally{s=1}}return{value:o,done:p}}}(e,i,a),!0),s}var c={};function l(){}function p(){}function f(){}o=Object.getPrototypeOf;var d=[][a]?o(o([][a]())):(t(o={},a,function(){return this}),o),v=f.prototype=l.prototype=Object.create(d);function h(e){return Object.setPrototypeOf?Object.setPrototypeOf(e,f):(e.__proto__=f,t(e,u,"GeneratorFunction")),e.prototype=Object.create(v),e}return p.prototype=f,t(v,"constructor",f),t(f,"constructor",p),p.displayName="GeneratorFunction",t(f,u,"GeneratorFunction"),t(v),t(v,u,"Generator"),t(v,a,function(){return this}),t(v,"toString",function(){return"[object Generator]"}),(e.exports=r=function(){return{w:s,m:h}},e.exports.__esModule=!0,e.exports.default=e.exports)()}e.exports=r,e.exports.__esModule=!0,e.exports.default=e.exports}(l);var d=l.exports,v={exports:{}},h={exports:{}},x={exports:{}};!function(e){var t=c,r=f;e.exports=function e(n,o){function i(e,r,a,u){try{var s=n[e](r),c=s.value;return c instanceof t?o.resolve(c.v).then(function(e){i("next",e,a,u)},function(e){i("throw",e,a,u)}):o.resolve(c).then(function(e){s.value=e,a(s)},function(e){return i("throw",e,a,u)})}catch(e){u(e)}}var a;this.next||(r(e.prototype),r(e.prototype,"function"==typeof Symbol&&Symbol.asyncIterator||"@asyncIterator",function(){return this})),r(this,"_invoke",function(e,t,r){function n(){return new o(function(t,n){i(e,r,t,n)})}return a=a?a.then(n,n):n()},!0)},e.exports.__esModule=!0,e.exports.default=e.exports}(x);var y=x.exports;!function(e){var t=d,r=y;e.exports=function(e,n,o,i,a){return new r(t().w(e,n,o,i),a||Promise)},e.exports.__esModule=!0,e.exports.default=e.exports}(h);var b=h.exports;!function(e){var t=b;e.exports=function(e,r,n,o,i){var a=t(e,r,n,o,i);return a.next().then(function(e){return e.done?e.value:a.next()})},e.exports.__esModule=!0,e.exports.default=e.exports}(v);var m=v.exports,w={exports:{}};!function(e){e.exports=function(e){var t=Object(e),r=[];for(var n in t)r.unshift(n);return function e(){for(;r.length;)if((n=r.pop())in t)return e.value=n,e.done=!1,e;return e.done=!0,e}},e.exports.__esModule=!0,e.exports.default=e.exports}(w);var g=w.exports,k={exports:{}},S={exports:{}};!function(e){function t(r){return e.exports=t="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(e){return typeof e}:function(e){return e&&"function"==typeof Symbol&&e.constructor===Symbol&&e!==Symbol.prototype?"symbol":typeof e},e.exports.__esModule=!0,e.exports.default=e.exports,t(r)}e.exports=t,e.exports.__esModule=!0,e.exports.default=e.exports}(S);var _=S.exports;!function(e){var t=_.default;e.exports=function(e){if(null!=e){var r=e["function"==typeof Symbol&&Symbol.iterator||"@@iterator"],n=0;if(r)return r.call(e);if("function"==typeof e.next)return e;if(!isNaN(e.length))return{next:function(){return e&&n>=e.length&&(e=void 0),{value:e&&e[n++],done:!e}}}}throw new TypeError(t(e)+" is not iterable")},e.exports.__esModule=!0,e.exports.default=e.exports}(k);var M=k.exports;!function(e){var t=c,r=d,n=m,o=b,i=y,a=g,u=M;function s(){var c=r(),l=c.m(s),p=(Object.getPrototypeOf?Object.getPrototypeOf(l):l.__proto__).constructor;function f(e){var t="function"==typeof e&&e.constructor;return!!t&&(t===p||"GeneratorFunction"===(t.displayName||t.name))}var d={throw:1,return:2,break:3,continue:3};function v(e){var t,r;return function(n){t||(t={stop:function(){return r(n.a,2)},catch:function(){return n.v},abrupt:function(e,t){return r(n.a,d[e],t)},delegateYield:function(e,o,i){return t.resultName=o,r(n.d,u(e),i)},finish:function(e){return r(n.f,e)}},r=function(e,r,o){n.p=t.prev,n.n=t.next;try{return e(r,o)}finally{t.next=n.n}}),t.resultName&&(t[t.resultName]=n.v,t.resultName=void 0),t.sent=n.v,t.next=n.n;try{return e.call(this,t)}finally{n.p=t.prev,n.n=t.next}}}return(e.exports=s=function(){return{wrap:function(e,t,r,n){return c.w(v(e),t,r,n&&n.reverse())},isGeneratorFunction:f,mark:c.m,awrap:function(e,r){return new t(e,r)},AsyncIterator:i,async:function(e,t,r,i,a){return(f(t)?o:n)(v(e),t,r,i,a)},keys:a,values:u}},e.exports.__esModule=!0,e.exports.default=e.exports)()}e.exports=s,e.exports.__esModule=!0,e.exports.default=e.exports}(u);var O=(0,u.exports)(),j=O;try{regeneratorRuntime=O}catch(e){"object"===("undefined"==typeof globalThis?"undefined":r(globalThis))?globalThis.regeneratorRuntime=O:Function("r","regeneratorRuntime = r")(O)}var P=i(j);function U(e,t,r,n){return new(r||(r=Promise))(function(o,i){function a(e){try{s(n.next(e))}catch(e){i(e)}}function u(e){try{s(n.throw(e))}catch(e){i(e)}}function s(e){var t;e.done?o(e.value):(t=e.value,t instanceof r?t:new r(function(e){e(t)})).then(a,u)}s((n=n.apply(e,t||[])).next())})}"function"==typeof SuppressedError&&SuppressedError;var E=5368709120,T=102400,C=function(){return o(function e(t){var r,n,o,i;if(function(e,t){if(!(e instanceof t))throw new TypeError("Cannot call a class as a function")}(this,e),this.ossParams=null,this.expiresAt=0,this.tokenRequest=null,this.reqUrl=t.reqUrl,this.expire=null!==(r=t.expire)&&void 0!==r?r:3600,this.dir=null!==(n=t.dir)&&void 0!==n?n:"public",this.multipartUploadSize=null!==(o=t.multipartUploadSize)&&void 0!==o?o:104857600,this.multipartUploadParams=null!==(i=t.multipartUploadParams)&&void 0!==i?i:{},!Number.isFinite(this.expire)||this.expire<=0)throw new Error("expire 必须为大于 0 的秒数");if(!Number.isFinite(this.multipartUploadSize)||this.multipartUploadSize<0)throw new Error("multipartUploadSize 必须为非负字节数")},[{key:"getToken",value:function(){return U(this,arguments,void 0,function(){var t=this,r=arguments.length>0&&void 0!==arguments[0]&&arguments[0];return P.mark(function n(){return P.wrap(function(n){for(;;)switch(n.prev=n.next){case 0:if(t.reqUrl){n.next=1;break}throw new Error("请求token的地址不存在");case 1:if(!t.tokenRequest){n.next=2;break}return n.abrupt("return",t.tokenRequest);case 2:return t.tokenRequest=function(){return U(t,void 0,void 0,P.mark(function t(){var n,o,i,a,u,s,c,l,p,f,d,v;return P.wrap(function(t){for(;;)switch(t.prev=t.next){case 0:return(u=new URL(this.reqUrl,null===(n=globalThis.location)||void 0===n?void 0:n.href)).searchParams.set("expire",String(this.expire)),t.next=1,fetch(u.toString());case 1:if((s=t.sent).ok){t.next=2;break}throw new Error("获取 OBS 临时凭证失败:HTTP ".concat(s.status));case 2:return t.next=3,s.json();case 3:if(c=t.sent,l=c.data,p=null!==(o=null==l?void 0:l.securityToken)&&void 0!==o?o:null==l?void 0:l.stsToken,(null==l?void 0:l.host)&&l.endpoint&&l.bucket&&l.accessKeyId&&l.accessKeySecret&&p){t.next=4;break}throw new Error("OBS 临时凭证缺少必要字段");case 4:if(f=new URL(l.endpoint),/^https?:$/.test(f.protocol)){t.next=5;break}throw new Error("OBS endpoint 必须为 HTTP 或 HTTPS Endpoint");case 5:if(d=Date.now(),v=l.expiration?Date.parse(l.expiration):d+1e3*this.expire,Number.isFinite(v)&&!(v<=d)){t.next=6;break}throw new Error("OBS 临时凭证过期时间无效或已过期");case 6:return r||!this.client||(null===(i=this.ossParams)||void 0===i?void 0:i.endpoint)!==l.endpoint||(null===(a=this.ossParams)||void 0===a?void 0:a.bucket)!==l.bucket?this.client=new e({access_key_id:l.accessKeyId,secret_access_key:l.accessKeySecret,security_token:p,server:l.endpoint,signature:"obs",is_signature_negotiation:!1}):this.client.refresh(l.accessKeyId,l.accessKeySecret,p),this.ossParams=l,this.expiresAt=v-Math.min(6e4,.1*(v-d)),t.abrupt("return",l);case 7:case"end":return t.stop()}},t,this)}))}(),n.prev=3,n.next=4,t.tokenRequest;case 4:return n.abrupt("return",n.sent);case 5:return n.prev=5,t.tokenRequest=null,n.finish(5);case 6:case"end":return n.stop()}},n,null,[[3,,5,6]])})()})}},{key:"getContext",value:function(e){return U(this,void 0,void 0,P.mark(function t(){return P.wrap(function(t){for(;;)switch(t.prev=t.next){case 0:if(e){t.next=1;break}throw new Error("文件不存在");case 1:if(this.reqUrl){t.next=2;break}throw new Error("请求token的地址不存在");case 2:if(this.client&&!(Date.now()>=this.expiresAt)){t.next=3;break}return t.next=3,this.getToken();case 3:return t.abrupt("return",{client:this.client,token:this.ossParams});case 4:case"end":return t.stop()}},t,this)}))}},{key:"upload",value:function(e){return U(this,arguments,void 0,function(e){var t=this,r=arguments.length>1&&void 0!==arguments[1]?arguments[1]:"",n=arguments.length>2?arguments[2]:void 0;return P.mark(function o(){var i;return P.wrap(function(o){for(;;)switch(o.prev=o.next){case 0:if(e){o.next=1;break}throw new Error("文件不存在");case 1:if(!((i=Object.assign(Object.assign({},t.multipartUploadParams),n)).checkpoint||e.size>t.multipartUploadSize||e.size>E)){o.next=2;break}return o.abrupt("return",t.multipartUpload(e,r,i));case 2:return o.abrupt("return",t.directUpload(e,r));case 3:case"end":return o.stop()}},o)})()})}},{key:"directUpload",value:function(e){return U(this,arguments,void 0,function(e){var t=this,r=arguments.length>1&&void 0!==arguments[1]?arguments[1]:"";return P.mark(function n(){var o,i,a,u,s;return P.wrap(function(n){for(;;)switch(n.prev=n.next){case 0:if(e){n.next=1;break}throw new Error("文件不存在");case 1:if(!(e.size>E)){n.next=2;break}throw new Error("文件大小不能超过5GB");case 2:return n.next=3,t.getContext(e);case 3:return o=n.sent,i=o.client,a=o.token,u=t.getName(r,e),n.next=4,i.putObject(Object.assign({Bucket:a.bucket,Key:u,SourceFile:e},e.type?{ContentType:e.type}:{}));case 4:return s=n.sent,n.abrupt("return",t.getResult(s,u,a));case 5:case"end":return n.stop()}},n)})()})}},{key:"multipartUpload",value:function(e){return U(this,arguments,void 0,function(e){var t=this,r=arguments.length>1&&void 0!==arguments[1]?arguments[1]:"",n=arguments.length>2?arguments[2]:void 0;return P.mark(function o(){var i,a,u,s,c,l,p,f,d,v,h,x,y,b,m,w,g,k,S,_;return P.wrap(function(o){for(;;)switch(o.prev=o.next){case 0:if(e){o.next=1;break}throw new Error("文件不存在");case 1:if(!(e.size>536870912e5)){o.next=2;break}throw new Error("文件超过 OBS 分段上传上限");case 2:if((f=Object.assign(Object.assign({},t.multipartUploadParams),n)).checkpoint||!(e.size<T)){o.next=3;break}return o.abrupt("return",t.directUpload(e,r));case 3:if(d=null!==(i=f.parallel)&&void 0!==i?i:5,v=null!==(a=f.partSize)&&void 0!==a?a:1048576,Number.isInteger(d)&&!(d<1)){o.next=4;break}throw new Error("parallel 必须为大于 0 的整数");case 4:if(!(!Number.isInteger(v)||v<T||v>E)){o.next=5;break}throw new Error("partSize 必须为 100KB~5GB 的整数字节数");case 5:return o.next=6,t.getContext(e);case 6:if(h=o.sent,x=h.client,y=h.token,!(b=f.checkpoint)||b.key&&b.bucket===y.bucket&&(null===(u=b.sourceFile)||void 0===u?void 0:u.name)===e.name&&(null===(s=b.fileStat)||void 0===s?void 0:s.fileSize)===e.size&&(null===(c=b.fileStat)||void 0===c?void 0:c.lastModified)===e.lastModified){o.next=7;break}throw new Error("checkpoint 与当前文件或 OBS 桶不匹配");case 7:return m=null!==(l=null==b?void 0:b.key)&&void 0!==l?l:t.getName(r,e),w=t.getCdnUrl(y.host,m),g=0,o.next=8,x.uploadFile(Object.assign(Object.assign({Bucket:y.bucket,Key:m,SourceFile:e,TaskNum:d,PartSize:v},e.type?{ContentType:e.type}:{}),{UploadCheckpoint:b,ResumeCallback:function(e,t){var r,n;b=t;var o=t.parts.reduce(function(e,t){return e+(t.isCompleted?t.partSize:0)},0);g=t.fileStat.fileSize>0?Math.min(1,Math.max(0,o/t.fileStat.fileSize)):0,null===(r=f.resumeCallback)||void 0===r||r.call(f,e,t),null===(n=f.progress)||void 0===n||n.call(f,g,w,t,k)},ProgressCallback:function(e,t){var r;g=t>0?Math.min(1,Math.max(0,e/t)):0,null===(r=f.progress)||void 0===r||r.call(f,g,w,b,k)},EventCallback:function(e,t,r){var n,o;k=r,null===(n=f.eventCallback)||void 0===n||n.call(f,e,t,r),"uploadPartSucceed"===e&&(null===(o=f.progress)||void 0===o||o.call(f,g,w,b,r))}}));case 8:return S=o.sent,_=t.getResult(S,m,y),null===(p=f.progress)||void 0===p||p.call(f,1,w,b,S),o.abrupt("return",_);case 9:case"end":return o.stop()}},o)})()})}},{key:"getResult",value:function(e,t,r){var n,o,i,a,u,s,c,l=null===(n=null==e?void 0:e.CommonMsg)||void 0===n?void 0:n.Status;if(!(l>=200&&l<300)){var p=new Error("OBS 上传失败:".concat(null!==(a=null!==(i=null===(o=null==e?void 0:e.CommonMsg)||void 0===o?void 0:o.Code)&&void 0!==i?i:l)&&void 0!==a?a:"未知状态"," ").concat(null!==(s=null===(u=null==e?void 0:e.CommonMsg)||void 0===u?void 0:u.Message)&&void 0!==s?s:""));throw Object.assign(p,{ossResParams:e}),p}var f=new URL(r.endpoint);return f.hostname="".concat(r.bucket,".").concat(f.hostname),f.pathname="/".concat(t.split("/").map(encodeURIComponent).join("/")),f.search="",f.hash="",{cdnUrl:this.getCdnUrl(r.host,t),ossUrl:(null===(c=e.InterfaceResult)||void 0===c?void 0:c.Location)||f.toString(),fileName:t,ossResParams:e}}},{key:"getCdnUrl",value:function(e,t){return"".concat(e.replace(/\/+$/,""),"/").concat(t.split("/").map(encodeURIComponent).join("/"))}},{key:"getYYYYMMDDHHMMSS",value:function(e){var t=e||new Date,r=t.getFullYear(),n=String(t.getMonth()+1).padStart(2,"0"),o=String(t.getDate()).padStart(2,"0"),i=String(t.getHours()).padStart(2,"0"),a=String(t.getMinutes()).padStart(2,"0"),u=String(t.getSeconds()).padStart(2,"0");return"".concat(r).concat(n).concat(o).concat(i).concat(a).concat(u)}},{key:"getSafeFileExtension",value:function(e){var t=e.match(/\.([a-zA-Z0-9]+)$/);return t?t[1].replace(/[^a-zA-Z0-9]/g,"").toLowerCase():""}},{key:"getName",value:function(e,r){var n="".concat(this.dir).concat(e).replace(/\/+$/,""),o=this.getYYYYMMDDHHMMSS(),i=this.getSafeFileExtension(r.name);return"hw-oss-web".concat(n,"/").concat(o,"_").concat(t.nanoid(16)).concat(i?"."+i:"")}}])}();exports.HwOss=C;
|
|
@@ -0,0 +1,3 @@
|
|
|
1
|
+
import e from"esdk-obs-browserjs";import{nanoid as t}from"nanoid";function r(e){return r="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(e){return typeof e}:function(e){return e&&"function"==typeof Symbol&&e.constructor===Symbol&&e!==Symbol.prototype?"symbol":typeof e},r(e)}function n(e){var t=function(e,t){if("object"!=r(e)||!e)return e;var n=e[Symbol.toPrimitive];if(void 0!==n){var o=n.call(e,t);if("object"!=r(o))return o;throw new TypeError("@@toPrimitive must return a primitive value.")}return String(e)}(e,"string");return"symbol"==r(t)?t:t+""}function o(e,t,r){return t&&function(e,t){for(var r=0;r<t.length;r++){var o=t[r];o.enumerable=o.enumerable||!1,o.configurable=!0,"value"in o&&(o.writable=!0),Object.defineProperty(e,n(o.key),o)}}(e.prototype,t),Object.defineProperty(e,"prototype",{writable:!1}),e}function i(e){return e&&e.__esModule&&Object.prototype.hasOwnProperty.call(e,"default")?e.default:e}var a,u={exports:{}},s={exports:{}};(a=s).exports=function(e,t){this.v=e,this.k=t},a.exports.__esModule=!0,a.exports.default=a.exports;var c=s.exports,l={exports:{}},p={exports:{}};!function(e){function t(r,n,o,i){var a=Object.defineProperty;try{a({},"",{})}catch(r){a=0}e.exports=t=function(e,r,n,o){function i(r,n){t(e,r,function(e){return this._invoke(r,n,e)})}r?a?a(e,r,{value:n,enumerable:!o,configurable:!o,writable:!o}):e[r]=n:(i("next",0),i("throw",1),i("return",2))},e.exports.__esModule=!0,e.exports.default=e.exports,t(r,n,o,i)}e.exports=t,e.exports.__esModule=!0,e.exports.default=e.exports}(p);var f=p.exports;!function(e){var t=f;function r(){
|
|
2
|
+
/*! regenerator-runtime -- Copyright (c) 2014-present, Facebook, Inc. -- license (MIT): https://github.com/babel/babel/blob/main/packages/babel-helpers/LICENSE */
|
|
3
|
+
var n,o,i="function"==typeof Symbol?Symbol:{},a=i.iterator||"@@iterator",u=i.toStringTag||"@@toStringTag";function s(e,r,i,a){var u=r&&r.prototype instanceof l?r:l,s=Object.create(u.prototype);return t(s,"_invoke",function(e,t,r){var i,a,u,s=0,l=r||[],p=!1,f={p:0,n:0,v:n,a:d,f:d.bind(n,4),d:function(e,t){return i=e,a=0,u=n,f.n=t,c}};function d(e,t){for(a=e,u=t,o=0;!p&&s&&!r&&o<l.length;o++){var r,i=l[o],d=f.p,v=i[2];e>3?(r=v===t)&&(u=i[(a=i[4])?5:(a=3,3)],i[4]=i[5]=n):i[0]<=d&&((r=e<2&&d<i[1])?(a=0,f.v=t,f.n=i[1]):d<v&&(r=e<3||i[0]>t||t>v)&&(i[4]=e,i[5]=t,f.n=v,a=0))}if(r||e>1)return c;throw p=!0,t}return function(r,l,v){if(s>1)throw TypeError("Generator is already running");for(p&&1===l&&d(l,v),a=l,u=v;(o=a<2?n:u)||!p;){i||(a?a<3?(a>1&&(f.n=-1),d(a,u)):f.n=u:f.v=u);try{if(s=2,i){if(a||(r="next"),o=i[r]){if(!(o=o.call(i,u)))throw TypeError("iterator result is not an object");if(!o.done)return o;u=o.value,a<2&&(a=0)}else 1===a&&(o=i.return)&&o.call(i),a<2&&(u=TypeError("The iterator does not provide a '"+r+"' method"),a=1);i=n}else if((o=(p=f.n<0)?u:e.call(t,f))!==c)break}catch(e){i=n,a=1,u=e}finally{s=1}}return{value:o,done:p}}}(e,i,a),!0),s}var c={};function l(){}function p(){}function f(){}o=Object.getPrototypeOf;var d=[][a]?o(o([][a]())):(t(o={},a,function(){return this}),o),v=f.prototype=l.prototype=Object.create(d);function h(e){return Object.setPrototypeOf?Object.setPrototypeOf(e,f):(e.__proto__=f,t(e,u,"GeneratorFunction")),e.prototype=Object.create(v),e}return p.prototype=f,t(v,"constructor",f),t(f,"constructor",p),p.displayName="GeneratorFunction",t(f,u,"GeneratorFunction"),t(v),t(v,u,"Generator"),t(v,a,function(){return this}),t(v,"toString",function(){return"[object Generator]"}),(e.exports=r=function(){return{w:s,m:h}},e.exports.__esModule=!0,e.exports.default=e.exports)()}e.exports=r,e.exports.__esModule=!0,e.exports.default=e.exports}(l);var d=l.exports,v={exports:{}},h={exports:{}},x={exports:{}};!function(e){var t=c,r=f;e.exports=function e(n,o){function i(e,r,a,u){try{var s=n[e](r),c=s.value;return c instanceof t?o.resolve(c.v).then(function(e){i("next",e,a,u)},function(e){i("throw",e,a,u)}):o.resolve(c).then(function(e){s.value=e,a(s)},function(e){return i("throw",e,a,u)})}catch(e){u(e)}}var a;this.next||(r(e.prototype),r(e.prototype,"function"==typeof Symbol&&Symbol.asyncIterator||"@asyncIterator",function(){return this})),r(this,"_invoke",function(e,t,r){function n(){return new o(function(t,n){i(e,r,t,n)})}return a=a?a.then(n,n):n()},!0)},e.exports.__esModule=!0,e.exports.default=e.exports}(x);var y=x.exports;!function(e){var t=d,r=y;e.exports=function(e,n,o,i,a){return new r(t().w(e,n,o,i),a||Promise)},e.exports.__esModule=!0,e.exports.default=e.exports}(h);var b=h.exports;!function(e){var t=b;e.exports=function(e,r,n,o,i){var a=t(e,r,n,o,i);return a.next().then(function(e){return e.done?e.value:a.next()})},e.exports.__esModule=!0,e.exports.default=e.exports}(v);var m=v.exports,g={exports:{}};!function(e){e.exports=function(e){var t=Object(e),r=[];for(var n in t)r.unshift(n);return function e(){for(;r.length;)if((n=r.pop())in t)return e.value=n,e.done=!1,e;return e.done=!0,e}},e.exports.__esModule=!0,e.exports.default=e.exports}(g);var k=g.exports,w={exports:{}},S={exports:{}};!function(e){function t(r){return e.exports=t="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(e){return typeof e}:function(e){return e&&"function"==typeof Symbol&&e.constructor===Symbol&&e!==Symbol.prototype?"symbol":typeof e},e.exports.__esModule=!0,e.exports.default=e.exports,t(r)}e.exports=t,e.exports.__esModule=!0,e.exports.default=e.exports}(S);var _=S.exports;!function(e){var t=_.default;e.exports=function(e){if(null!=e){var r=e["function"==typeof Symbol&&Symbol.iterator||"@@iterator"],n=0;if(r)return r.call(e);if("function"==typeof e.next)return e;if(!isNaN(e.length))return{next:function(){return e&&n>=e.length&&(e=void 0),{value:e&&e[n++],done:!e}}}}throw new TypeError(t(e)+" is not iterable")},e.exports.__esModule=!0,e.exports.default=e.exports}(w);var M=w.exports;!function(e){var t=c,r=d,n=m,o=b,i=y,a=k,u=M;function s(){var c=r(),l=c.m(s),p=(Object.getPrototypeOf?Object.getPrototypeOf(l):l.__proto__).constructor;function f(e){var t="function"==typeof e&&e.constructor;return!!t&&(t===p||"GeneratorFunction"===(t.displayName||t.name))}var d={throw:1,return:2,break:3,continue:3};function v(e){var t,r;return function(n){t||(t={stop:function(){return r(n.a,2)},catch:function(){return n.v},abrupt:function(e,t){return r(n.a,d[e],t)},delegateYield:function(e,o,i){return t.resultName=o,r(n.d,u(e),i)},finish:function(e){return r(n.f,e)}},r=function(e,r,o){n.p=t.prev,n.n=t.next;try{return e(r,o)}finally{t.next=n.n}}),t.resultName&&(t[t.resultName]=n.v,t.resultName=void 0),t.sent=n.v,t.next=n.n;try{return e.call(this,t)}finally{n.p=t.prev,n.n=t.next}}}return(e.exports=s=function(){return{wrap:function(e,t,r,n){return c.w(v(e),t,r,n&&n.reverse())},isGeneratorFunction:f,mark:c.m,awrap:function(e,r){return new t(e,r)},AsyncIterator:i,async:function(e,t,r,i,a){return(f(t)?o:n)(v(e),t,r,i,a)},keys:a,values:u}},e.exports.__esModule=!0,e.exports.default=e.exports)()}e.exports=s,e.exports.__esModule=!0,e.exports.default=e.exports}(u);var O=(0,u.exports)(),j=O;try{regeneratorRuntime=O}catch(e){"object"===("undefined"==typeof globalThis?"undefined":r(globalThis))?globalThis.regeneratorRuntime=O:Function("r","regeneratorRuntime = r")(O)}var P=i(j);function U(e,t,r,n){return new(r||(r=Promise))(function(o,i){function a(e){try{s(n.next(e))}catch(e){i(e)}}function u(e){try{s(n.throw(e))}catch(e){i(e)}}function s(e){var t;e.done?o(e.value):(t=e.value,t instanceof r?t:new r(function(e){e(t)})).then(a,u)}s((n=n.apply(e,t||[])).next())})}"function"==typeof SuppressedError&&SuppressedError;var E=5368709120,T=102400,C=function(){return o(function e(t){var r,n,o,i;if(function(e,t){if(!(e instanceof t))throw new TypeError("Cannot call a class as a function")}(this,e),this.ossParams=null,this.expiresAt=0,this.tokenRequest=null,this.reqUrl=t.reqUrl,this.expire=null!==(r=t.expire)&&void 0!==r?r:3600,this.dir=null!==(n=t.dir)&&void 0!==n?n:"public",this.multipartUploadSize=null!==(o=t.multipartUploadSize)&&void 0!==o?o:104857600,this.multipartUploadParams=null!==(i=t.multipartUploadParams)&&void 0!==i?i:{},!Number.isFinite(this.expire)||this.expire<=0)throw new Error("expire 必须为大于 0 的秒数");if(!Number.isFinite(this.multipartUploadSize)||this.multipartUploadSize<0)throw new Error("multipartUploadSize 必须为非负字节数")},[{key:"getToken",value:function(){return U(this,arguments,void 0,function(){var t=this,r=arguments.length>0&&void 0!==arguments[0]&&arguments[0];return P.mark(function n(){return P.wrap(function(n){for(;;)switch(n.prev=n.next){case 0:if(t.reqUrl){n.next=1;break}throw new Error("请求token的地址不存在");case 1:if(!t.tokenRequest){n.next=2;break}return n.abrupt("return",t.tokenRequest);case 2:return t.tokenRequest=function(){return U(t,void 0,void 0,P.mark(function t(){var n,o,i,a,u,s,c,l,p,f,d,v;return P.wrap(function(t){for(;;)switch(t.prev=t.next){case 0:return(u=new URL(this.reqUrl,null===(n=globalThis.location)||void 0===n?void 0:n.href)).searchParams.set("expire",String(this.expire)),t.next=1,fetch(u.toString());case 1:if((s=t.sent).ok){t.next=2;break}throw new Error("获取 OBS 临时凭证失败:HTTP ".concat(s.status));case 2:return t.next=3,s.json();case 3:if(c=t.sent,l=c.data,p=null!==(o=null==l?void 0:l.securityToken)&&void 0!==o?o:null==l?void 0:l.stsToken,(null==l?void 0:l.host)&&l.endpoint&&l.bucket&&l.accessKeyId&&l.accessKeySecret&&p){t.next=4;break}throw new Error("OBS 临时凭证缺少必要字段");case 4:if(f=new URL(l.endpoint),/^https?:$/.test(f.protocol)){t.next=5;break}throw new Error("OBS endpoint 必须为 HTTP 或 HTTPS Endpoint");case 5:if(d=Date.now(),v=l.expiration?Date.parse(l.expiration):d+1e3*this.expire,Number.isFinite(v)&&!(v<=d)){t.next=6;break}throw new Error("OBS 临时凭证过期时间无效或已过期");case 6:return r||!this.client||(null===(i=this.ossParams)||void 0===i?void 0:i.endpoint)!==l.endpoint||(null===(a=this.ossParams)||void 0===a?void 0:a.bucket)!==l.bucket?this.client=new e({access_key_id:l.accessKeyId,secret_access_key:l.accessKeySecret,security_token:p,server:l.endpoint,signature:"obs",is_signature_negotiation:!1}):this.client.refresh(l.accessKeyId,l.accessKeySecret,p),this.ossParams=l,this.expiresAt=v-Math.min(6e4,.1*(v-d)),t.abrupt("return",l);case 7:case"end":return t.stop()}},t,this)}))}(),n.prev=3,n.next=4,t.tokenRequest;case 4:return n.abrupt("return",n.sent);case 5:return n.prev=5,t.tokenRequest=null,n.finish(5);case 6:case"end":return n.stop()}},n,null,[[3,,5,6]])})()})}},{key:"getContext",value:function(e){return U(this,void 0,void 0,P.mark(function t(){return P.wrap(function(t){for(;;)switch(t.prev=t.next){case 0:if(e){t.next=1;break}throw new Error("文件不存在");case 1:if(this.reqUrl){t.next=2;break}throw new Error("请求token的地址不存在");case 2:if(this.client&&!(Date.now()>=this.expiresAt)){t.next=3;break}return t.next=3,this.getToken();case 3:return t.abrupt("return",{client:this.client,token:this.ossParams});case 4:case"end":return t.stop()}},t,this)}))}},{key:"upload",value:function(e){return U(this,arguments,void 0,function(e){var t=this,r=arguments.length>1&&void 0!==arguments[1]?arguments[1]:"",n=arguments.length>2?arguments[2]:void 0;return P.mark(function o(){var i;return P.wrap(function(o){for(;;)switch(o.prev=o.next){case 0:if(e){o.next=1;break}throw new Error("文件不存在");case 1:if(!((i=Object.assign(Object.assign({},t.multipartUploadParams),n)).checkpoint||e.size>t.multipartUploadSize||e.size>E)){o.next=2;break}return o.abrupt("return",t.multipartUpload(e,r,i));case 2:return o.abrupt("return",t.directUpload(e,r));case 3:case"end":return o.stop()}},o)})()})}},{key:"directUpload",value:function(e){return U(this,arguments,void 0,function(e){var t=this,r=arguments.length>1&&void 0!==arguments[1]?arguments[1]:"";return P.mark(function n(){var o,i,a,u,s;return P.wrap(function(n){for(;;)switch(n.prev=n.next){case 0:if(e){n.next=1;break}throw new Error("文件不存在");case 1:if(!(e.size>E)){n.next=2;break}throw new Error("文件大小不能超过5GB");case 2:return n.next=3,t.getContext(e);case 3:return o=n.sent,i=o.client,a=o.token,u=t.getName(r,e),n.next=4,i.putObject(Object.assign({Bucket:a.bucket,Key:u,SourceFile:e},e.type?{ContentType:e.type}:{}));case 4:return s=n.sent,n.abrupt("return",t.getResult(s,u,a));case 5:case"end":return n.stop()}},n)})()})}},{key:"multipartUpload",value:function(e){return U(this,arguments,void 0,function(e){var t=this,r=arguments.length>1&&void 0!==arguments[1]?arguments[1]:"",n=arguments.length>2?arguments[2]:void 0;return P.mark(function o(){var i,a,u,s,c,l,p,f,d,v,h,x,y,b,m,g,k,w,S,_;return P.wrap(function(o){for(;;)switch(o.prev=o.next){case 0:if(e){o.next=1;break}throw new Error("文件不存在");case 1:if(!(e.size>536870912e5)){o.next=2;break}throw new Error("文件超过 OBS 分段上传上限");case 2:if((f=Object.assign(Object.assign({},t.multipartUploadParams),n)).checkpoint||!(e.size<T)){o.next=3;break}return o.abrupt("return",t.directUpload(e,r));case 3:if(d=null!==(i=f.parallel)&&void 0!==i?i:5,v=null!==(a=f.partSize)&&void 0!==a?a:1048576,Number.isInteger(d)&&!(d<1)){o.next=4;break}throw new Error("parallel 必须为大于 0 的整数");case 4:if(!(!Number.isInteger(v)||v<T||v>E)){o.next=5;break}throw new Error("partSize 必须为 100KB~5GB 的整数字节数");case 5:return o.next=6,t.getContext(e);case 6:if(h=o.sent,x=h.client,y=h.token,!(b=f.checkpoint)||b.key&&b.bucket===y.bucket&&(null===(u=b.sourceFile)||void 0===u?void 0:u.name)===e.name&&(null===(s=b.fileStat)||void 0===s?void 0:s.fileSize)===e.size&&(null===(c=b.fileStat)||void 0===c?void 0:c.lastModified)===e.lastModified){o.next=7;break}throw new Error("checkpoint 与当前文件或 OBS 桶不匹配");case 7:return m=null!==(l=null==b?void 0:b.key)&&void 0!==l?l:t.getName(r,e),g=t.getCdnUrl(y.host,m),k=0,o.next=8,x.uploadFile(Object.assign(Object.assign({Bucket:y.bucket,Key:m,SourceFile:e,TaskNum:d,PartSize:v},e.type?{ContentType:e.type}:{}),{UploadCheckpoint:b,ResumeCallback:function(e,t){var r,n;b=t;var o=t.parts.reduce(function(e,t){return e+(t.isCompleted?t.partSize:0)},0);k=t.fileStat.fileSize>0?Math.min(1,Math.max(0,o/t.fileStat.fileSize)):0,null===(r=f.resumeCallback)||void 0===r||r.call(f,e,t),null===(n=f.progress)||void 0===n||n.call(f,k,g,t,w)},ProgressCallback:function(e,t){var r;k=t>0?Math.min(1,Math.max(0,e/t)):0,null===(r=f.progress)||void 0===r||r.call(f,k,g,b,w)},EventCallback:function(e,t,r){var n,o;w=r,null===(n=f.eventCallback)||void 0===n||n.call(f,e,t,r),"uploadPartSucceed"===e&&(null===(o=f.progress)||void 0===o||o.call(f,k,g,b,r))}}));case 8:return S=o.sent,_=t.getResult(S,m,y),null===(p=f.progress)||void 0===p||p.call(f,1,g,b,S),o.abrupt("return",_);case 9:case"end":return o.stop()}},o)})()})}},{key:"getResult",value:function(e,t,r){var n,o,i,a,u,s,c,l=null===(n=null==e?void 0:e.CommonMsg)||void 0===n?void 0:n.Status;if(!(l>=200&&l<300)){var p=new Error("OBS 上传失败:".concat(null!==(a=null!==(i=null===(o=null==e?void 0:e.CommonMsg)||void 0===o?void 0:o.Code)&&void 0!==i?i:l)&&void 0!==a?a:"未知状态"," ").concat(null!==(s=null===(u=null==e?void 0:e.CommonMsg)||void 0===u?void 0:u.Message)&&void 0!==s?s:""));throw Object.assign(p,{ossResParams:e}),p}var f=new URL(r.endpoint);return f.hostname="".concat(r.bucket,".").concat(f.hostname),f.pathname="/".concat(t.split("/").map(encodeURIComponent).join("/")),f.search="",f.hash="",{cdnUrl:this.getCdnUrl(r.host,t),ossUrl:(null===(c=e.InterfaceResult)||void 0===c?void 0:c.Location)||f.toString(),fileName:t,ossResParams:e}}},{key:"getCdnUrl",value:function(e,t){return"".concat(e.replace(/\/+$/,""),"/").concat(t.split("/").map(encodeURIComponent).join("/"))}},{key:"getYYYYMMDDHHMMSS",value:function(e){var t=e||new Date,r=t.getFullYear(),n=String(t.getMonth()+1).padStart(2,"0"),o=String(t.getDate()).padStart(2,"0"),i=String(t.getHours()).padStart(2,"0"),a=String(t.getMinutes()).padStart(2,"0"),u=String(t.getSeconds()).padStart(2,"0");return"".concat(r).concat(n).concat(o).concat(i).concat(a).concat(u)}},{key:"getSafeFileExtension",value:function(e){var t=e.match(/\.([a-zA-Z0-9]+)$/);return t?t[1].replace(/[^a-zA-Z0-9]/g,"").toLowerCase():""}},{key:"getName",value:function(e,r){var n="".concat(this.dir).concat(e).replace(/\/+$/,""),o=this.getYYYYMMDDHHMMSS(),i=this.getSafeFileExtension(r.name);return"hw-oss-web".concat(n,"/").concat(o,"_").concat(t(16)).concat(i?"."+i:"")}}])}();export{C as HwOss};
|
|
@@ -0,0 +1,3 @@
|
|
|
1
|
+
!function(e,t){"object"==typeof exports&&"undefined"!=typeof module?t(exports,require("esdk-obs-browserjs"),require("nanoid")):"function"==typeof define&&define.amd?define(["exports","esdk-obs-browserjs","nanoid"],t):t((e="undefined"!=typeof globalThis?globalThis:e||self).HwOss={},e.ObsClient,e.nanoid)}(this,function(e,t,r){"use strict";function n(e){return n="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(e){return typeof e}:function(e){return e&&"function"==typeof Symbol&&e.constructor===Symbol&&e!==Symbol.prototype?"symbol":typeof e},n(e)}function o(e){var t=function(e,t){if("object"!=n(e)||!e)return e;var r=e[Symbol.toPrimitive];if(void 0!==r){var o=r.call(e,t);if("object"!=n(o))return o;throw new TypeError("@@toPrimitive must return a primitive value.")}return String(e)}(e,"string");return"symbol"==n(t)?t:t+""}function i(e,t,r){return t&&function(e,t){for(var r=0;r<t.length;r++){var n=t[r];n.enumerable=n.enumerable||!1,n.configurable=!0,"value"in n&&(n.writable=!0),Object.defineProperty(e,o(n.key),n)}}(e.prototype,t),Object.defineProperty(e,"prototype",{writable:!1}),e}function a(e){return e&&e.__esModule&&Object.prototype.hasOwnProperty.call(e,"default")?e.default:e}var u={exports:{}},s={exports:{}};!function(e){e.exports=function(e,t){this.v=e,this.k=t},e.exports.__esModule=!0,e.exports.default=e.exports}(s);var c=s.exports,l={exports:{}},p={exports:{}};!function(e){function t(r,n,o,i){var a=Object.defineProperty;try{a({},"",{})}catch(r){a=0}e.exports=t=function(e,r,n,o){function i(r,n){t(e,r,function(e){return this._invoke(r,n,e)})}r?a?a(e,r,{value:n,enumerable:!o,configurable:!o,writable:!o}):e[r]=n:(i("next",0),i("throw",1),i("return",2))},e.exports.__esModule=!0,e.exports.default=e.exports,t(r,n,o,i)}e.exports=t,e.exports.__esModule=!0,e.exports.default=e.exports}(p);var f=p.exports;!function(e){var t=f;function r(){
|
|
2
|
+
/*! regenerator-runtime -- Copyright (c) 2014-present, Facebook, Inc. -- license (MIT): https://github.com/babel/babel/blob/main/packages/babel-helpers/LICENSE */
|
|
3
|
+
var n,o,i="function"==typeof Symbol?Symbol:{},a=i.iterator||"@@iterator",u=i.toStringTag||"@@toStringTag";function s(e,r,i,a){var u=r&&r.prototype instanceof l?r:l,s=Object.create(u.prototype);return t(s,"_invoke",function(e,t,r){var i,a,u,s=0,l=r||[],p=!1,f={p:0,n:0,v:n,a:d,f:d.bind(n,4),d:function(e,t){return i=e,a=0,u=n,f.n=t,c}};function d(e,t){for(a=e,u=t,o=0;!p&&s&&!r&&o<l.length;o++){var r,i=l[o],d=f.p,v=i[2];e>3?(r=v===t)&&(u=i[(a=i[4])?5:(a=3,3)],i[4]=i[5]=n):i[0]<=d&&((r=e<2&&d<i[1])?(a=0,f.v=t,f.n=i[1]):d<v&&(r=e<3||i[0]>t||t>v)&&(i[4]=e,i[5]=t,f.n=v,a=0))}if(r||e>1)return c;throw p=!0,t}return function(r,l,v){if(s>1)throw TypeError("Generator is already running");for(p&&1===l&&d(l,v),a=l,u=v;(o=a<2?n:u)||!p;){i||(a?a<3?(a>1&&(f.n=-1),d(a,u)):f.n=u:f.v=u);try{if(s=2,i){if(a||(r="next"),o=i[r]){if(!(o=o.call(i,u)))throw TypeError("iterator result is not an object");if(!o.done)return o;u=o.value,a<2&&(a=0)}else 1===a&&(o=i.return)&&o.call(i),a<2&&(u=TypeError("The iterator does not provide a '"+r+"' method"),a=1);i=n}else if((o=(p=f.n<0)?u:e.call(t,f))!==c)break}catch(e){i=n,a=1,u=e}finally{s=1}}return{value:o,done:p}}}(e,i,a),!0),s}var c={};function l(){}function p(){}function f(){}o=Object.getPrototypeOf;var d=[][a]?o(o([][a]())):(t(o={},a,function(){return this}),o),v=f.prototype=l.prototype=Object.create(d);function h(e){return Object.setPrototypeOf?Object.setPrototypeOf(e,f):(e.__proto__=f,t(e,u,"GeneratorFunction")),e.prototype=Object.create(v),e}return p.prototype=f,t(v,"constructor",f),t(f,"constructor",p),p.displayName="GeneratorFunction",t(f,u,"GeneratorFunction"),t(v),t(v,u,"Generator"),t(v,a,function(){return this}),t(v,"toString",function(){return"[object Generator]"}),(e.exports=r=function(){return{w:s,m:h}},e.exports.__esModule=!0,e.exports.default=e.exports)()}e.exports=r,e.exports.__esModule=!0,e.exports.default=e.exports}(l);var d=l.exports,v={exports:{}},h={exports:{}},x={exports:{}};!function(e){var t=c,r=f;e.exports=function e(n,o){function i(e,r,a,u){try{var s=n[e](r),c=s.value;return c instanceof t?o.resolve(c.v).then(function(e){i("next",e,a,u)},function(e){i("throw",e,a,u)}):o.resolve(c).then(function(e){s.value=e,a(s)},function(e){return i("throw",e,a,u)})}catch(e){u(e)}}var a;this.next||(r(e.prototype),r(e.prototype,"function"==typeof Symbol&&Symbol.asyncIterator||"@asyncIterator",function(){return this})),r(this,"_invoke",function(e,t,r){function n(){return new o(function(t,n){i(e,r,t,n)})}return a=a?a.then(n,n):n()},!0)},e.exports.__esModule=!0,e.exports.default=e.exports}(x);var b=x.exports;!function(e){var t=d,r=b;e.exports=function(e,n,o,i,a){return new r(t().w(e,n,o,i),a||Promise)},e.exports.__esModule=!0,e.exports.default=e.exports}(h);var y=h.exports;!function(e){var t=y;e.exports=function(e,r,n,o,i){var a=t(e,r,n,o,i);return a.next().then(function(e){return e.done?e.value:a.next()})},e.exports.__esModule=!0,e.exports.default=e.exports}(v);var m=v.exports,w={exports:{}};!function(e){e.exports=function(e){var t=Object(e),r=[];for(var n in t)r.unshift(n);return function e(){for(;r.length;)if((n=r.pop())in t)return e.value=n,e.done=!1,e;return e.done=!0,e}},e.exports.__esModule=!0,e.exports.default=e.exports}(w);var g=w.exports,k={exports:{}},S={exports:{}};!function(e){function t(r){return e.exports=t="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(e){return typeof e}:function(e){return e&&"function"==typeof Symbol&&e.constructor===Symbol&&e!==Symbol.prototype?"symbol":typeof e},e.exports.__esModule=!0,e.exports.default=e.exports,t(r)}e.exports=t,e.exports.__esModule=!0,e.exports.default=e.exports}(S);var _=S.exports;!function(e){var t=_.default;e.exports=function(e){if(null!=e){var r=e["function"==typeof Symbol&&Symbol.iterator||"@@iterator"],n=0;if(r)return r.call(e);if("function"==typeof e.next)return e;if(!isNaN(e.length))return{next:function(){return e&&n>=e.length&&(e=void 0),{value:e&&e[n++],done:!e}}}}throw new TypeError(t(e)+" is not iterable")},e.exports.__esModule=!0,e.exports.default=e.exports}(k);var O=k.exports;!function(e){var t=c,r=d,n=m,o=y,i=b,a=g,u=O;function s(){var c=r(),l=c.m(s),p=(Object.getPrototypeOf?Object.getPrototypeOf(l):l.__proto__).constructor;function f(e){var t="function"==typeof e&&e.constructor;return!!t&&(t===p||"GeneratorFunction"===(t.displayName||t.name))}var d={throw:1,return:2,break:3,continue:3};function v(e){var t,r;return function(n){t||(t={stop:function(){return r(n.a,2)},catch:function(){return n.v},abrupt:function(e,t){return r(n.a,d[e],t)},delegateYield:function(e,o,i){return t.resultName=o,r(n.d,u(e),i)},finish:function(e){return r(n.f,e)}},r=function(e,r,o){n.p=t.prev,n.n=t.next;try{return e(r,o)}finally{t.next=n.n}}),t.resultName&&(t[t.resultName]=n.v,t.resultName=void 0),t.sent=n.v,t.next=n.n;try{return e.call(this,t)}finally{n.p=t.prev,n.n=t.next}}}return(e.exports=s=function(){return{wrap:function(e,t,r,n){return c.w(v(e),t,r,n&&n.reverse())},isGeneratorFunction:f,mark:c.m,awrap:function(e,r){return new t(e,r)},AsyncIterator:i,async:function(e,t,r,i,a){return(f(t)?o:n)(v(e),t,r,i,a)},keys:a,values:u}},e.exports.__esModule=!0,e.exports.default=e.exports)()}e.exports=s,e.exports.__esModule=!0,e.exports.default=e.exports}(u);var M=(0,u.exports)(),j=M;try{regeneratorRuntime=M}catch(e){"object"===("undefined"==typeof globalThis?"undefined":n(globalThis))?globalThis.regeneratorRuntime=M:Function("r","regeneratorRuntime = r")(M)}var P=a(j);function U(e,t,r,n){return new(r||(r=Promise))(function(o,i){function a(e){try{s(n.next(e))}catch(e){i(e)}}function u(e){try{s(n.throw(e))}catch(e){i(e)}}function s(e){var t;e.done?o(e.value):(t=e.value,t instanceof r?t:new r(function(e){e(t)})).then(a,u)}s((n=n.apply(e,t||[])).next())})}"function"==typeof SuppressedError&&SuppressedError;var E=5368709120,T=102400,C=function(){return i(function e(t){var r,n,o,i;if(function(e,t){if(!(e instanceof t))throw new TypeError("Cannot call a class as a function")}(this,e),this.ossParams=null,this.expiresAt=0,this.tokenRequest=null,this.reqUrl=t.reqUrl,this.expire=null!==(r=t.expire)&&void 0!==r?r:3600,this.dir=null!==(n=t.dir)&&void 0!==n?n:"public",this.multipartUploadSize=null!==(o=t.multipartUploadSize)&&void 0!==o?o:104857600,this.multipartUploadParams=null!==(i=t.multipartUploadParams)&&void 0!==i?i:{},!Number.isFinite(this.expire)||this.expire<=0)throw new Error("expire 必须为大于 0 的秒数");if(!Number.isFinite(this.multipartUploadSize)||this.multipartUploadSize<0)throw new Error("multipartUploadSize 必须为非负字节数")},[{key:"getToken",value:function(){return U(this,arguments,void 0,function(){var e=this,r=arguments.length>0&&void 0!==arguments[0]&&arguments[0];return P.mark(function n(){return P.wrap(function(n){for(;;)switch(n.prev=n.next){case 0:if(e.reqUrl){n.next=1;break}throw new Error("请求token的地址不存在");case 1:if(!e.tokenRequest){n.next=2;break}return n.abrupt("return",e.tokenRequest);case 2:return e.tokenRequest=function(){return U(e,void 0,void 0,P.mark(function e(){var n,o,i,a,u,s,c,l,p,f,d,v;return P.wrap(function(e){for(;;)switch(e.prev=e.next){case 0:return(u=new URL(this.reqUrl,null===(n=globalThis.location)||void 0===n?void 0:n.href)).searchParams.set("expire",String(this.expire)),e.next=1,fetch(u.toString());case 1:if((s=e.sent).ok){e.next=2;break}throw new Error("获取 OBS 临时凭证失败:HTTP ".concat(s.status));case 2:return e.next=3,s.json();case 3:if(c=e.sent,l=c.data,p=null!==(o=null==l?void 0:l.securityToken)&&void 0!==o?o:null==l?void 0:l.stsToken,(null==l?void 0:l.host)&&l.endpoint&&l.bucket&&l.accessKeyId&&l.accessKeySecret&&p){e.next=4;break}throw new Error("OBS 临时凭证缺少必要字段");case 4:if(f=new URL(l.endpoint),/^https?:$/.test(f.protocol)){e.next=5;break}throw new Error("OBS endpoint 必须为 HTTP 或 HTTPS Endpoint");case 5:if(d=Date.now(),v=l.expiration?Date.parse(l.expiration):d+1e3*this.expire,Number.isFinite(v)&&!(v<=d)){e.next=6;break}throw new Error("OBS 临时凭证过期时间无效或已过期");case 6:return r||!this.client||(null===(i=this.ossParams)||void 0===i?void 0:i.endpoint)!==l.endpoint||(null===(a=this.ossParams)||void 0===a?void 0:a.bucket)!==l.bucket?this.client=new t({access_key_id:l.accessKeyId,secret_access_key:l.accessKeySecret,security_token:p,server:l.endpoint,signature:"obs",is_signature_negotiation:!1}):this.client.refresh(l.accessKeyId,l.accessKeySecret,p),this.ossParams=l,this.expiresAt=v-Math.min(6e4,.1*(v-d)),e.abrupt("return",l);case 7:case"end":return e.stop()}},e,this)}))}(),n.prev=3,n.next=4,e.tokenRequest;case 4:return n.abrupt("return",n.sent);case 5:return n.prev=5,e.tokenRequest=null,n.finish(5);case 6:case"end":return n.stop()}},n,null,[[3,,5,6]])})()})}},{key:"getContext",value:function(e){return U(this,void 0,void 0,P.mark(function t(){return P.wrap(function(t){for(;;)switch(t.prev=t.next){case 0:if(e){t.next=1;break}throw new Error("文件不存在");case 1:if(this.reqUrl){t.next=2;break}throw new Error("请求token的地址不存在");case 2:if(this.client&&!(Date.now()>=this.expiresAt)){t.next=3;break}return t.next=3,this.getToken();case 3:return t.abrupt("return",{client:this.client,token:this.ossParams});case 4:case"end":return t.stop()}},t,this)}))}},{key:"upload",value:function(e){return U(this,arguments,void 0,function(e){var t=this,r=arguments.length>1&&void 0!==arguments[1]?arguments[1]:"",n=arguments.length>2?arguments[2]:void 0;return P.mark(function o(){var i;return P.wrap(function(o){for(;;)switch(o.prev=o.next){case 0:if(e){o.next=1;break}throw new Error("文件不存在");case 1:if(!((i=Object.assign(Object.assign({},t.multipartUploadParams),n)).checkpoint||e.size>t.multipartUploadSize||e.size>E)){o.next=2;break}return o.abrupt("return",t.multipartUpload(e,r,i));case 2:return o.abrupt("return",t.directUpload(e,r));case 3:case"end":return o.stop()}},o)})()})}},{key:"directUpload",value:function(e){return U(this,arguments,void 0,function(e){var t=this,r=arguments.length>1&&void 0!==arguments[1]?arguments[1]:"";return P.mark(function n(){var o,i,a,u,s;return P.wrap(function(n){for(;;)switch(n.prev=n.next){case 0:if(e){n.next=1;break}throw new Error("文件不存在");case 1:if(!(e.size>E)){n.next=2;break}throw new Error("文件大小不能超过5GB");case 2:return n.next=3,t.getContext(e);case 3:return o=n.sent,i=o.client,a=o.token,u=t.getName(r,e),n.next=4,i.putObject(Object.assign({Bucket:a.bucket,Key:u,SourceFile:e},e.type?{ContentType:e.type}:{}));case 4:return s=n.sent,n.abrupt("return",t.getResult(s,u,a));case 5:case"end":return n.stop()}},n)})()})}},{key:"multipartUpload",value:function(e){return U(this,arguments,void 0,function(e){var t=this,r=arguments.length>1&&void 0!==arguments[1]?arguments[1]:"",n=arguments.length>2?arguments[2]:void 0;return P.mark(function o(){var i,a,u,s,c,l,p,f,d,v,h,x,b,y,m,w,g,k,S,_;return P.wrap(function(o){for(;;)switch(o.prev=o.next){case 0:if(e){o.next=1;break}throw new Error("文件不存在");case 1:if(!(e.size>536870912e5)){o.next=2;break}throw new Error("文件超过 OBS 分段上传上限");case 2:if((f=Object.assign(Object.assign({},t.multipartUploadParams),n)).checkpoint||!(e.size<T)){o.next=3;break}return o.abrupt("return",t.directUpload(e,r));case 3:if(d=null!==(i=f.parallel)&&void 0!==i?i:5,v=null!==(a=f.partSize)&&void 0!==a?a:1048576,Number.isInteger(d)&&!(d<1)){o.next=4;break}throw new Error("parallel 必须为大于 0 的整数");case 4:if(!(!Number.isInteger(v)||v<T||v>E)){o.next=5;break}throw new Error("partSize 必须为 100KB~5GB 的整数字节数");case 5:return o.next=6,t.getContext(e);case 6:if(h=o.sent,x=h.client,b=h.token,!(y=f.checkpoint)||y.key&&y.bucket===b.bucket&&(null===(u=y.sourceFile)||void 0===u?void 0:u.name)===e.name&&(null===(s=y.fileStat)||void 0===s?void 0:s.fileSize)===e.size&&(null===(c=y.fileStat)||void 0===c?void 0:c.lastModified)===e.lastModified){o.next=7;break}throw new Error("checkpoint 与当前文件或 OBS 桶不匹配");case 7:return m=null!==(l=null==y?void 0:y.key)&&void 0!==l?l:t.getName(r,e),w=t.getCdnUrl(b.host,m),g=0,o.next=8,x.uploadFile(Object.assign(Object.assign({Bucket:b.bucket,Key:m,SourceFile:e,TaskNum:d,PartSize:v},e.type?{ContentType:e.type}:{}),{UploadCheckpoint:y,ResumeCallback:function(e,t){var r,n;y=t;var o=t.parts.reduce(function(e,t){return e+(t.isCompleted?t.partSize:0)},0);g=t.fileStat.fileSize>0?Math.min(1,Math.max(0,o/t.fileStat.fileSize)):0,null===(r=f.resumeCallback)||void 0===r||r.call(f,e,t),null===(n=f.progress)||void 0===n||n.call(f,g,w,t,k)},ProgressCallback:function(e,t){var r;g=t>0?Math.min(1,Math.max(0,e/t)):0,null===(r=f.progress)||void 0===r||r.call(f,g,w,y,k)},EventCallback:function(e,t,r){var n,o;k=r,null===(n=f.eventCallback)||void 0===n||n.call(f,e,t,r),"uploadPartSucceed"===e&&(null===(o=f.progress)||void 0===o||o.call(f,g,w,y,r))}}));case 8:return S=o.sent,_=t.getResult(S,m,b),null===(p=f.progress)||void 0===p||p.call(f,1,w,y,S),o.abrupt("return",_);case 9:case"end":return o.stop()}},o)})()})}},{key:"getResult",value:function(e,t,r){var n,o,i,a,u,s,c,l=null===(n=null==e?void 0:e.CommonMsg)||void 0===n?void 0:n.Status;if(!(l>=200&&l<300)){var p=new Error("OBS 上传失败:".concat(null!==(a=null!==(i=null===(o=null==e?void 0:e.CommonMsg)||void 0===o?void 0:o.Code)&&void 0!==i?i:l)&&void 0!==a?a:"未知状态"," ").concat(null!==(s=null===(u=null==e?void 0:e.CommonMsg)||void 0===u?void 0:u.Message)&&void 0!==s?s:""));throw Object.assign(p,{ossResParams:e}),p}var f=new URL(r.endpoint);return f.hostname="".concat(r.bucket,".").concat(f.hostname),f.pathname="/".concat(t.split("/").map(encodeURIComponent).join("/")),f.search="",f.hash="",{cdnUrl:this.getCdnUrl(r.host,t),ossUrl:(null===(c=e.InterfaceResult)||void 0===c?void 0:c.Location)||f.toString(),fileName:t,ossResParams:e}}},{key:"getCdnUrl",value:function(e,t){return"".concat(e.replace(/\/+$/,""),"/").concat(t.split("/").map(encodeURIComponent).join("/"))}},{key:"getYYYYMMDDHHMMSS",value:function(e){var t=e||new Date,r=t.getFullYear(),n=String(t.getMonth()+1).padStart(2,"0"),o=String(t.getDate()).padStart(2,"0"),i=String(t.getHours()).padStart(2,"0"),a=String(t.getMinutes()).padStart(2,"0"),u=String(t.getSeconds()).padStart(2,"0");return"".concat(r).concat(n).concat(o).concat(i).concat(a).concat(u)}},{key:"getSafeFileExtension",value:function(e){var t=e.match(/\.([a-zA-Z0-9]+)$/);return t?t[1].replace(/[^a-zA-Z0-9]/g,"").toLowerCase():""}},{key:"getName",value:function(e,t){var n="".concat(this.dir).concat(e).replace(/\/+$/,""),o=this.getYYYYMMDDHHMMSS(),i=this.getSafeFileExtension(t.name);return"hw-oss-web".concat(n,"/").concat(o,"_").concat(r.nanoid(16)).concat(i?"."+i:"")}}])}();e.HwOss=C});
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export * from "./utils/index";
|
|
@@ -0,0 +1,103 @@
|
|
|
1
|
+
/** 华为云 SDK 的原始断点对象,不能使用阿里云的 checkpoint。 */
|
|
2
|
+
export type UploadCheckpointTypes = {
|
|
3
|
+
bucket: string;
|
|
4
|
+
key: string;
|
|
5
|
+
sourceFile: File;
|
|
6
|
+
fileStat: {
|
|
7
|
+
fileSize: number;
|
|
8
|
+
lastModified: number;
|
|
9
|
+
};
|
|
10
|
+
partSize: number;
|
|
11
|
+
partCount: number;
|
|
12
|
+
uploadId?: string;
|
|
13
|
+
md5: string;
|
|
14
|
+
parts: {
|
|
15
|
+
partNumber: number;
|
|
16
|
+
offset: number;
|
|
17
|
+
partSize: number;
|
|
18
|
+
isCompleted: boolean;
|
|
19
|
+
etag?: string;
|
|
20
|
+
}[];
|
|
21
|
+
};
|
|
22
|
+
export type ResumeHookTypes = {
|
|
23
|
+
/** 暂停上传,保留已上传分段。 */
|
|
24
|
+
cancel: () => void;
|
|
25
|
+
/** 取消上传并删除服务端分段。 */
|
|
26
|
+
abort: () => void;
|
|
27
|
+
};
|
|
28
|
+
export type MultipartUploadParamsTypes = {
|
|
29
|
+
/** 最大并发数,默认 5。 */
|
|
30
|
+
parallel?: number;
|
|
31
|
+
/** 分段大小,单位字节,默认 1MB,范围 100KB~5GB。 */
|
|
32
|
+
partSize?: number;
|
|
33
|
+
checkpoint?: UploadCheckpointTypes;
|
|
34
|
+
/** p 为 0~1 的比例,res 为最近一个分段或合并操作的响应。 */
|
|
35
|
+
progress?: (p: number, fileUrl: string, checkpoint?: UploadCheckpointTypes, res?: any) => void;
|
|
36
|
+
resumeCallback?: (hook: ResumeHookTypes, checkpoint: UploadCheckpointTypes) => void;
|
|
37
|
+
eventCallback?: (eventType: string, eventParams: any, result: any) => void;
|
|
38
|
+
};
|
|
39
|
+
export type OssPropsTypes = {
|
|
40
|
+
reqUrl: string;
|
|
41
|
+
/** 文件目录,默认 public。 */
|
|
42
|
+
dir?: string;
|
|
43
|
+
/** 请求临时凭证的有效期,单位秒,默认 3600。 */
|
|
44
|
+
expire?: number;
|
|
45
|
+
/** 自动分片阈值,单位字节,默认 100MB。 */
|
|
46
|
+
multipartUploadSize?: number;
|
|
47
|
+
multipartUploadParams?: MultipartUploadParamsTypes;
|
|
48
|
+
};
|
|
49
|
+
export type ResParamsTypes = {
|
|
50
|
+
cdnUrl: string;
|
|
51
|
+
ossUrl: string;
|
|
52
|
+
fileName: string;
|
|
53
|
+
ossResParams: any;
|
|
54
|
+
};
|
|
55
|
+
export type OssTokenData = {
|
|
56
|
+
data: {
|
|
57
|
+
host: string;
|
|
58
|
+
/** OBS Endpoint,例如 https://obs.cn-north-4.myhuaweicloud.com。 */
|
|
59
|
+
endpoint: string;
|
|
60
|
+
region?: string;
|
|
61
|
+
bucket: string;
|
|
62
|
+
accessKeyId: string;
|
|
63
|
+
accessKeySecret: string;
|
|
64
|
+
/** 临时凭证的 securitytoken;兼容原接口的 stsToken 字段。 */
|
|
65
|
+
securityToken?: string;
|
|
66
|
+
stsToken?: string;
|
|
67
|
+
/** ISO8601 格式的凭证过期时间;省略时使用 expire。 */
|
|
68
|
+
expiration?: string;
|
|
69
|
+
};
|
|
70
|
+
};
|
|
71
|
+
export declare class HwOss {
|
|
72
|
+
readonly reqUrl: string;
|
|
73
|
+
readonly expire: number;
|
|
74
|
+
readonly dir: string;
|
|
75
|
+
readonly multipartUploadSize: number;
|
|
76
|
+
readonly multipartUploadParams: MultipartUploadParamsTypes;
|
|
77
|
+
private ossParams;
|
|
78
|
+
private client;
|
|
79
|
+
private expiresAt;
|
|
80
|
+
private tokenRequest;
|
|
81
|
+
constructor(props: OssPropsTypes);
|
|
82
|
+
/** 获取临时凭证;init=true 时重新创建客户端。并发请求共享一次获取。 */
|
|
83
|
+
getToken(init?: boolean): Promise<OssTokenData["data"]>;
|
|
84
|
+
private getContext;
|
|
85
|
+
upload(file: File, childDir?: string, multipartUploadParams?: MultipartUploadParamsTypes): Promise<ResParamsTypes>;
|
|
86
|
+
directUpload(file: File, childDir?: string): Promise<ResParamsTypes>;
|
|
87
|
+
multipartUpload(file: File, childDir?: string, multipartUploadParams?: MultipartUploadParamsTypes): Promise<ResParamsTypes>;
|
|
88
|
+
private getResult;
|
|
89
|
+
private getCdnUrl;
|
|
90
|
+
/**
|
|
91
|
+
* 获取当前日期时间 YYYYMMDDHHMMSS
|
|
92
|
+
* @param date 可选 Date 对象,不传默认使用当前时间
|
|
93
|
+
* @returns 日期时间字符串 YYYYMMDDHHMMSS
|
|
94
|
+
*/
|
|
95
|
+
getYYYYMMDDHHMMSS(date?: Date): string;
|
|
96
|
+
/**
|
|
97
|
+
* 获取安全文件扩展名
|
|
98
|
+
* @param fileName 原始文件名
|
|
99
|
+
* @returns 安全小写扩展名,如果没有扩展名返回空字符串
|
|
100
|
+
*/
|
|
101
|
+
getSafeFileExtension(fileName: string): string;
|
|
102
|
+
getName(childDir: string, file: File): string;
|
|
103
|
+
}
|
package/package.json
CHANGED
|
@@ -1,6 +1,27 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@bnfe/obs-upload",
|
|
3
|
-
"version": "
|
|
4
|
-
"
|
|
5
|
-
"
|
|
3
|
+
"version": "1.0.1",
|
|
4
|
+
"description": "华为云 OBS 浏览器文件上传",
|
|
5
|
+
"main": "dist/obs-upload.cjs.js",
|
|
6
|
+
"module": "dist/obs-upload.esm.js",
|
|
7
|
+
"browser": "dist/obs-upload.umd.js",
|
|
8
|
+
"types": "dist/types/index.d.ts",
|
|
9
|
+
"files": [
|
|
10
|
+
"dist"
|
|
11
|
+
],
|
|
12
|
+
"keywords": [
|
|
13
|
+
"huawei",
|
|
14
|
+
"obs",
|
|
15
|
+
"upload"
|
|
16
|
+
],
|
|
17
|
+
"license": "MIT",
|
|
18
|
+
"dependencies": {
|
|
19
|
+
"esdk-obs-browserjs": "^3.25.6",
|
|
20
|
+
"nanoid": "^5.1.5"
|
|
21
|
+
},
|
|
22
|
+
"scripts": {
|
|
23
|
+
"dev": "cross-env NODE_ENV=development rollup -c -w --bundleConfigAsCjs",
|
|
24
|
+
"build": "cross-env NODE_ENV=production rollup -c --bundleConfigAsCjs",
|
|
25
|
+
"lint": "eslint src --ext .ts --fix"
|
|
26
|
+
}
|
|
6
27
|
}
|