@xezzon/zeroweb-sdk 0.8.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.
Files changed (65) hide show
  1. package/README.md +91 -0
  2. package/dist/cjs/admin/app.js +22 -0
  3. package/dist/cjs/admin/authn.js +25 -0
  4. package/dist/cjs/admin/authz.js +41 -0
  5. package/dist/cjs/admin/crypto.js +9 -0
  6. package/dist/cjs/admin/dict.js +36 -0
  7. package/dist/cjs/admin/index.js +55 -0
  8. package/dist/cjs/admin/role.js +21 -0
  9. package/dist/cjs/admin/setting.js +31 -0
  10. package/dist/cjs/admin/user.js +9 -0
  11. package/dist/cjs/dev/index.js +20 -0
  12. package/dist/cjs/dev/locale.js +58 -0
  13. package/dist/cjs/file/attachment.js +69 -0
  14. package/dist/cjs/file/index.js +37 -0
  15. package/dist/cjs/file/upload.js +111 -0
  16. package/dist/cjs/index.js +22 -0
  17. package/dist/cjs/metadata/index.js +80 -0
  18. package/dist/cjs/open/index.js +35 -0
  19. package/dist/cjs/open/openapi.js +38 -0
  20. package/dist/cjs/open/subscription.js +39 -0
  21. package/dist/cjs/open/third_party_app.js +49 -0
  22. package/dist/cjs/types.js +2 -0
  23. package/dist/esm/admin/app.js +20 -0
  24. package/dist/esm/admin/authn.js +23 -0
  25. package/dist/esm/admin/authz.js +39 -0
  26. package/dist/esm/admin/crypto.js +7 -0
  27. package/dist/esm/admin/dict.js +34 -0
  28. package/dist/esm/admin/index.js +50 -0
  29. package/dist/esm/admin/role.js +19 -0
  30. package/dist/esm/admin/setting.js +29 -0
  31. package/dist/esm/admin/user.js +7 -0
  32. package/dist/esm/dev/index.js +15 -0
  33. package/dist/esm/dev/locale.js +56 -0
  34. package/dist/esm/file/attachment.js +66 -0
  35. package/dist/esm/file/index.js +30 -0
  36. package/dist/esm/file/upload.js +104 -0
  37. package/dist/esm/index.js +5 -0
  38. package/dist/esm/metadata/index.js +74 -0
  39. package/dist/esm/open/index.js +27 -0
  40. package/dist/esm/open/openapi.js +35 -0
  41. package/dist/esm/open/subscription.js +36 -0
  42. package/dist/esm/open/third_party_app.js +46 -0
  43. package/dist/esm/types.js +1 -0
  44. package/dist/typings/admin/app.d.ts +50 -0
  45. package/dist/typings/admin/authn.d.ts +76 -0
  46. package/dist/typings/admin/authz.d.ts +79 -0
  47. package/dist/typings/admin/crypto.d.ts +26 -0
  48. package/dist/typings/admin/dict.d.ts +86 -0
  49. package/dist/typings/admin/index.d.ts +51 -0
  50. package/dist/typings/admin/role.d.ts +60 -0
  51. package/dist/typings/admin/setting.d.ts +66 -0
  52. package/dist/typings/admin/user.d.ts +29 -0
  53. package/dist/typings/dev/index.d.ts +16 -0
  54. package/dist/typings/dev/locale.d.ts +142 -0
  55. package/dist/typings/file/attachment.d.ts +149 -0
  56. package/dist/typings/file/index.d.ts +28 -0
  57. package/dist/typings/file/upload.d.ts +15 -0
  58. package/dist/typings/index.d.ts +10 -0
  59. package/dist/typings/metadata/index.d.ts +124 -0
  60. package/dist/typings/open/index.d.ts +28 -0
  61. package/dist/typings/open/openapi.d.ts +67 -0
  62. package/dist/typings/open/subscription.d.ts +63 -0
  63. package/dist/typings/open/third_party_app.d.ts +120 -0
  64. package/dist/typings/types.d.ts +52 -0
  65. package/package.json +34 -0
package/README.md ADDED
@@ -0,0 +1,91 @@
1
+ # ZeroWeb SDK
2
+
3
+ ZeroWeb SDK 是一个用于与 ZeroWeb 微服务进行交互的 TypeScript 客户端库,提供了完整的 API 封装和类型支持。
4
+
5
+ ## 功能特性
6
+
7
+ - **🔧 模块化设计**: 支持按需使用不同功能模块
8
+ - **📝 完整类型支持**: 基于 TypeScript 的强类型定义
9
+ - **🔄 拦截器支持**: 提供请求/响应拦截器功能
10
+ - **📦 多种模块格式**: 支持 CommonJS 和 ES Module
11
+ - **🛡️ 类型安全**: 完整的类型定义和接口约束
12
+
13
+ ## 安装
14
+
15
+ ### npm
16
+
17
+ ```bash
18
+ npm install @xezzon/zeroweb-sdk
19
+ ```
20
+
21
+ ### pnpm
22
+
23
+ ```bash
24
+ pnpm add @xezzon/zeroweb-sdk
25
+ ```
26
+
27
+ ### yarn
28
+
29
+ ```bash
30
+ yarn add @xezzon/zeroweb-sdk
31
+ ```
32
+
33
+ ## 快速开始
34
+
35
+ ### 基础配置
36
+
37
+ ```typescript
38
+ import {
39
+ ZerowebAdminClient,
40
+ ZerowebMetadataClient,
41
+ ZerowebOpenClient,
42
+ ZerowebFileClient,
43
+ ZerowebDevClient
44
+ } from '@xezzon/zeroweb-sdk';
45
+
46
+ // 基础配置
47
+ const config = {
48
+ baseURL: 'https://your-api-domain.com',
49
+ timeout: 10000,
50
+ headers: {
51
+ 'Content-Type': 'application/json'
52
+ }
53
+ };
54
+
55
+ // 创建客户端实例
56
+ const adminClient = ZerowebAdminClient(config);
57
+ const metadataClient = ZerowebMetadataClient(config);
58
+ const openClient = ZerowebOpenClient(config);
59
+ const fileClient = ZerowebFileClient(config);
60
+ const devClient = ZerowebDevClient(config);
61
+ ```
62
+
63
+ ### 添加请求拦截器
64
+
65
+ ```typescript
66
+ // 添加请求拦截器
67
+ adminClient.interceptors.request.use((config) => {
68
+ // 添加认证 token
69
+ const token = localStorage.getItem('auth_token');
70
+ if (token) {
71
+ config.headers.Authorization = `Bearer ${token}`;
72
+ }
73
+ return config;
74
+ });
75
+
76
+ // 添加响应拦截器
77
+ adminClient.interceptors.response.use(
78
+ (response) => response,
79
+ (error) => {
80
+ if (error.response?.status === 401) {
81
+ // 处理未授权错误
82
+ window.location.href = '/login';
83
+ }
84
+ return Promise.reject(error);
85
+ }
86
+ );
87
+ ```
88
+
89
+ ## 许可证
90
+
91
+ SDK 部分采用 [LGPL-2.1 license](https://www.gnu.org/licenses/lgpl-3.0.html)。
@@ -0,0 +1,22 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.default = (client) => ({
4
+ addApp: (app) => client.request({
5
+ url: '/app',
6
+ method: 'POST',
7
+ data: app,
8
+ }),
9
+ listApp: () => client.request({
10
+ url: '/app',
11
+ method: 'GET',
12
+ }),
13
+ updateApp: (app) => client.request({
14
+ url: '/app',
15
+ method: 'PUT',
16
+ data: app,
17
+ }),
18
+ deleteApp: (id) => client.request({
19
+ url: `/app/${id}`,
20
+ method: 'DELETE',
21
+ }),
22
+ });
@@ -0,0 +1,25 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.default = (client) => ({
4
+ basicLogin: (user) => client.request({
5
+ url: '/auth/login/basic',
6
+ method: 'POST',
7
+ auth: {
8
+ username: user.username,
9
+ password: user.password,
10
+ },
11
+ data: user,
12
+ }),
13
+ self: () => client.request({
14
+ url: '/auth/self',
15
+ method: 'GET',
16
+ }),
17
+ token: () => client.request({
18
+ url: '/auth/token',
19
+ method: 'GET',
20
+ }),
21
+ logout: () => client.request({
22
+ url: '/auth/logout',
23
+ method: 'PUT',
24
+ }),
25
+ });
@@ -0,0 +1,41 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.default = (client) => ({
4
+ queryUserByRole: (roleId) => client.request({
5
+ url: `/auth/role/${roleId}/user`,
6
+ method: 'GET',
7
+ }),
8
+ bindUserToRole: (roleUsers) => client.request({
9
+ url: '/auth/role/-/user',
10
+ method: 'PUT',
11
+ data: roleUsers,
12
+ }),
13
+ releaseRoleUser: (roleUsers) => client.request({
14
+ url: '/auth/role/-/user',
15
+ method: 'DELETE',
16
+ data: roleUsers,
17
+ }),
18
+ queryPermissionByRole: (roleId) => client.request({
19
+ url: `/auth/role/${roleId}/permission`,
20
+ method: 'GET',
21
+ }),
22
+ bindPermissionToRole: (rolePermissions) => client.request({
23
+ url: '/auth/role/-/permission',
24
+ method: 'PUT',
25
+ data: rolePermissions,
26
+ }),
27
+ releaseRolePermission: (rolePermissions) => client.request({
28
+ url: '/auth/role/-/permission',
29
+ method: 'DELETE',
30
+ data: rolePermissions,
31
+ }),
32
+ queryRoleByUser: (userId) => client.request({
33
+ url: `/auth/user/${userId}/role`,
34
+ method: 'GET',
35
+ }),
36
+ queryRoleByPermission: (permission) => client.request({
37
+ url: '/auth/permission/-/role',
38
+ method: 'GET',
39
+ params: { permission },
40
+ }),
41
+ });
@@ -0,0 +1,9 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.default = ({ request }) => ({
4
+ passwordStrength: (password, { username }) => request({
5
+ url: '/password-strength',
6
+ method: 'GET',
7
+ params: { password, username, },
8
+ }),
9
+ });
@@ -0,0 +1,36 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.default = (client) => ({
4
+ addDict: (dict) => client.request({
5
+ url: '/dict',
6
+ method: 'POST',
7
+ data: dict,
8
+ }),
9
+ getDictTagList: (odata) => client.request({
10
+ url: '/dict',
11
+ method: 'GET',
12
+ params: odata,
13
+ }),
14
+ getDictTreeByTag: (tag) => client.request({
15
+ url: `/dict/tag/${tag}`,
16
+ method: 'GET',
17
+ }),
18
+ modifyDict: (dict) => client.request({
19
+ url: '/dict',
20
+ method: 'PUT',
21
+ data: dict,
22
+ }),
23
+ updateDictStatus: (ids, enabled) => client.request({
24
+ url: '/dict/update-status',
25
+ method: 'PUT',
26
+ params: {
27
+ enabled,
28
+ },
29
+ data: ids,
30
+ }),
31
+ removeDict: (ids) => client.request({
32
+ url: '/dict',
33
+ method: 'DELETE',
34
+ data: ids,
35
+ }),
36
+ });
@@ -0,0 +1,55 @@
1
+ "use strict";
2
+ var __importDefault = (this && this.__importDefault) || function (mod) {
3
+ return (mod && mod.__esModule) ? mod : { "default": mod };
4
+ };
5
+ Object.defineProperty(exports, "__esModule", { value: true });
6
+ const axios_1 = __importDefault(require("axios"));
7
+ const app_1 = __importDefault(require("./app"));
8
+ const authn_1 = __importDefault(require("./authn"));
9
+ const authz_1 = __importDefault(require("./authz"));
10
+ const crypto_1 = __importDefault(require("./crypto"));
11
+ const dict_1 = __importDefault(require("./dict"));
12
+ const role_1 = __importDefault(require("./role"));
13
+ const setting_1 = __importDefault(require("./setting"));
14
+ const user_1 = __importDefault(require("./user"));
15
+ exports.default = (config) => {
16
+ const instance = axios_1.default.create(config);
17
+ return {
18
+ /**
19
+ * 拦截器方法
20
+ */
21
+ interceptors: instance.interceptors,
22
+ /**
23
+ * 应用管理相关接口
24
+ */
25
+ app: (0, app_1.default)(instance),
26
+ /**
27
+ * 认证相关接口
28
+ */
29
+ authn: (0, authn_1.default)(instance),
30
+ /**
31
+ * 授权相关接口
32
+ */
33
+ authz: (0, authz_1.default)(instance),
34
+ /**
35
+ * 加密相关接口
36
+ */
37
+ crypto: (0, crypto_1.default)(instance),
38
+ /**
39
+ * 字典相关接口
40
+ */
41
+ dict: (0, dict_1.default)(instance),
42
+ /**
43
+ * 角色管理接口
44
+ */
45
+ role: (0, role_1.default)(instance),
46
+ /**
47
+ * 业务参数管理接口
48
+ */
49
+ setting: (0, setting_1.default)(instance),
50
+ /**
51
+ * 用户相关接口
52
+ */
53
+ user: (0, user_1.default)(instance),
54
+ };
55
+ };
@@ -0,0 +1,21 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.default = (client) => ({
4
+ addRole: (role) => client.request({
5
+ url: '/role',
6
+ method: 'POST',
7
+ data: role,
8
+ }),
9
+ listAllRole: () => client.request({
10
+ url: '/role',
11
+ method: 'GET',
12
+ }),
13
+ deleteRole: (id) => client.request({
14
+ url: `/role/${id}`,
15
+ method: 'DELETE',
16
+ }),
17
+ listMyRole: () => client.request({
18
+ url: '/role/mine',
19
+ method: 'GET',
20
+ }),
21
+ });
@@ -0,0 +1,31 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.default = (client) => ({
4
+ addSetting: (setting) => client.request({
5
+ url: '/setting',
6
+ method: 'POST',
7
+ data: setting,
8
+ }),
9
+ listSetting: () => client.request({
10
+ url: '/setting',
11
+ method: 'GET',
12
+ }),
13
+ querySettingByCode: (code) => client.request({
14
+ url: `/setting/${code}`,
15
+ method: 'GET',
16
+ }),
17
+ updateSchema: (setting) => client.request({
18
+ url: '/setting/schema',
19
+ method: 'PUT',
20
+ data: setting,
21
+ }),
22
+ updateValue: (setting) => client.request({
23
+ url: '/setting/value',
24
+ method: 'PUT',
25
+ data: setting,
26
+ }),
27
+ deleteSetting: (id) => client.request({
28
+ url: `/setting/${id}`,
29
+ method: 'DELETE',
30
+ }),
31
+ });
@@ -0,0 +1,9 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.default = ({ request }) => ({
4
+ register: (user) => request({
5
+ url: '/user/register',
6
+ method: 'POST',
7
+ data: user,
8
+ }),
9
+ });
@@ -0,0 +1,20 @@
1
+ "use strict";
2
+ var __importDefault = (this && this.__importDefault) || function (mod) {
3
+ return (mod && mod.__esModule) ? mod : { "default": mod };
4
+ };
5
+ Object.defineProperty(exports, "__esModule", { value: true });
6
+ const axios_1 = __importDefault(require("axios"));
7
+ const locale_1 = __importDefault(require("./locale"));
8
+ exports.default = (config) => {
9
+ const instance = axios_1.default.create(config);
10
+ return {
11
+ /**
12
+ * 拦截器方法
13
+ */
14
+ interceptors: instance.interceptors,
15
+ /**
16
+ * 国际化相关接口
17
+ */
18
+ locale: (0, locale_1.default)(instance),
19
+ };
20
+ };
@@ -0,0 +1,58 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.default = (client) => ({
4
+ addLanguage: (language) => client.request({
5
+ url: '/language',
6
+ method: 'POST',
7
+ data: language,
8
+ }),
9
+ queryLanguageList: () => client.request({
10
+ url: '/language',
11
+ method: 'GET',
12
+ }),
13
+ updateLanguage: (language) => client.request({
14
+ url: '/language',
15
+ method: 'PUT',
16
+ data: language,
17
+ }),
18
+ deleteLanguage: (id) => client.request({
19
+ url: `/language/${id}`,
20
+ method: 'DELETE',
21
+ }),
22
+ addI18nMessage: (i18nMessage) => client.request({
23
+ url: '/i18n',
24
+ method: 'POST',
25
+ data: i18nMessage,
26
+ }),
27
+ listI18nNamespace: () => client.request({
28
+ url: '/i18n',
29
+ method: 'GET',
30
+ }),
31
+ queryI18nMessageList: (namespace, odata) => client.request({
32
+ url: `/i18n/${namespace}`,
33
+ method: 'GET',
34
+ params: odata,
35
+ }),
36
+ updateI18nMessage: (i18nMessage) => client.request({
37
+ url: '/i18n',
38
+ method: 'PUT',
39
+ data: i18nMessage,
40
+ }),
41
+ deleteI18nMessage: (id) => client.request({
42
+ url: `/i18n/${id}`,
43
+ method: 'DELETE',
44
+ }),
45
+ queryTranslation: (namespace, messageKey) => client.request({
46
+ url: `/i18n/${namespace}/${messageKey}`,
47
+ method: 'GET',
48
+ }),
49
+ upsertTranslation: (translation) => client.request({
50
+ url: '/locale',
51
+ method: 'PUT',
52
+ data: translation,
53
+ }),
54
+ loadTranslation: (language, namespace) => client.request({
55
+ url: `/locale/${language}/${namespace}`,
56
+ method: 'GET',
57
+ })
58
+ });
@@ -0,0 +1,69 @@
1
+ "use strict";
2
+ var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {
3
+ function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }
4
+ return new (P || (P = Promise))(function (resolve, reject) {
5
+ function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
6
+ function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } }
7
+ function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }
8
+ step((generator = generator.apply(thisArg, _arguments || [])).next());
9
+ });
10
+ };
11
+ Object.defineProperty(exports, "__esModule", { value: true });
12
+ exports.AttachmentStatus = void 0;
13
+ const upload_1 = require("./upload");
14
+ var AttachmentStatus;
15
+ (function (AttachmentStatus) {
16
+ AttachmentStatus["UPLOADING"] = "UPLOADING";
17
+ AttachmentStatus["DONE"] = "DONE";
18
+ })(AttachmentStatus || (exports.AttachmentStatus = AttachmentStatus = {}));
19
+ exports.default = (client) => ({
20
+ addAttachment: (file, bizType, bizId) => __awaiter(void 0, void 0, void 0, function* () {
21
+ yield (0, upload_1.checksum)(file);
22
+ const req = {
23
+ name: file.name,
24
+ checksum: file.checksum,
25
+ size: file.size,
26
+ type: file.type,
27
+ bizType,
28
+ bizId,
29
+ };
30
+ return client.request({
31
+ url: '/attachment',
32
+ method: 'POST',
33
+ data: req,
34
+ params: { crc: file.crc },
35
+ });
36
+ }),
37
+ getUploadInfo: (id, checksum, fileSize) => client.request({
38
+ url: `/attachment/${id}/resume`,
39
+ method: 'GET',
40
+ params: { checksum, fileSize },
41
+ }),
42
+ getUploadEndpoint: (id) => client.request({
43
+ url: `/attachment/${id}/endpoint/upload`,
44
+ method: 'GET',
45
+ params: { partNumber: 0 },
46
+ }),
47
+ getMultipartUploadEndpoint: (id, partNumber, crc) => client.request({
48
+ url: `/attachment/${id}/endpoint/upload`,
49
+ method: 'GET',
50
+ params: { partNumber, crc },
51
+ }),
52
+ finishUpload: (id) => client.request({
53
+ url: `/attachment/${id}/status/done`,
54
+ method: 'PUT',
55
+ }),
56
+ queryAttachmentByBiz: (bizType, bizId) => client.request({
57
+ url: `/attachment/list`,
58
+ method: 'GET',
59
+ params: { bizType, bizId, },
60
+ }),
61
+ getDownloadEndpoint: (id) => client.request({
62
+ url: `/attachment/${id}/endpoint/download`,
63
+ method: 'GET',
64
+ }),
65
+ deleteAttachment: (id) => client.request({
66
+ url: `/attachment/${id}`,
67
+ method: 'DELETE',
68
+ }),
69
+ });
@@ -0,0 +1,37 @@
1
+ "use strict";
2
+ var __importDefault = (this && this.__importDefault) || function (mod) {
3
+ return (mod && mod.__esModule) ? mod : { "default": mod };
4
+ };
5
+ Object.defineProperty(exports, "__esModule", { value: true });
6
+ exports.AttachmentStatus = exports.FileProvider = void 0;
7
+ const axios_1 = __importDefault(require("axios"));
8
+ const attachment_1 = __importDefault(require("./attachment"));
9
+ const upload_1 = require("./upload");
10
+ exports.default = (config) => {
11
+ const instance = axios_1.default.create(config);
12
+ const attachmentApi = (0, attachment_1.default)(instance);
13
+ return {
14
+ /**
15
+ * 拦截器方法
16
+ */
17
+ interceptors: instance.interceptors,
18
+ /**
19
+ * 附件管理接口
20
+ */
21
+ attachment: attachmentApi,
22
+ /**
23
+ * 文件上传
24
+ * @param file 文件
25
+ * @param bizType 业务类型
26
+ * @param bizId 业务编码
27
+ */
28
+ upload: (0, upload_1.upload)(instance, attachmentApi),
29
+ };
30
+ };
31
+ var FileProvider;
32
+ (function (FileProvider) {
33
+ FileProvider["FS"] = "FS";
34
+ FileProvider["S3"] = "S3";
35
+ })(FileProvider || (exports.FileProvider = FileProvider = {}));
36
+ var attachment_2 = require("./attachment");
37
+ Object.defineProperty(exports, "AttachmentStatus", { enumerable: true, get: function () { return attachment_2.AttachmentStatus; } });
@@ -0,0 +1,111 @@
1
+ "use strict";
2
+ var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {
3
+ function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }
4
+ return new (P || (P = Promise))(function (resolve, reject) {
5
+ function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
6
+ function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } }
7
+ function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }
8
+ step((generator = generator.apply(thisArg, _arguments || [])).next());
9
+ });
10
+ };
11
+ var __importDefault = (this && this.__importDefault) || function (mod) {
12
+ return (mod && mod.__esModule) ? mod : { "default": mod };
13
+ };
14
+ Object.defineProperty(exports, "__esModule", { value: true });
15
+ exports.checksum = checksum;
16
+ exports.upload = upload;
17
+ const crypto_js_1 = __importDefault(require("crypto-js"));
18
+ const js_crc_1 = require("js-crc");
19
+ /**
20
+ * 计算文件的校验和
21
+ * @param file 文件
22
+ * @returns 文件的SHA256值
23
+ */
24
+ function checksum(file) {
25
+ return __awaiter(this, void 0, void 0, function* () {
26
+ if (file.checksum && file.crc) {
27
+ return file;
28
+ }
29
+ return file.arrayBuffer()
30
+ .then(arrayBuffer => Promise.all([
31
+ Promise.resolve()
32
+ .then(() => crypto_js_1.default
33
+ .SHA256(crypto_js_1.default.lib.WordArray.create(arrayBuffer))
34
+ .toString(crypto_js_1.default.enc.Base64))
35
+ .then(checksum => {
36
+ file.checksum = checksum;
37
+ }),
38
+ Promise.resolve()
39
+ .then(() => crypto_js_1.default.enc.Base64.stringify(crypto_js_1.default.enc.Hex.parse(js_crc_1.crc32.hex(arrayBuffer))))
40
+ .then(crc => {
41
+ file.crc = crc;
42
+ }),
43
+ ]))
44
+ .then(() => file);
45
+ });
46
+ }
47
+ function upload(client, attachmentApi) {
48
+ return (file, uploadInfo) => __awaiter(this, void 0, void 0, function* () {
49
+ return file.arrayBuffer()
50
+ .then(arrayBuffer => {
51
+ const partCount = uploadInfo.partCount;
52
+ const partSize = uploadInfo.partSize;
53
+ const parts = [];
54
+ for (let index = 0; index < partCount - 1; index++) {
55
+ const content = arrayBuffer.slice(index * partSize, (index + 1) * partSize);
56
+ const crc = crypto_js_1.default.enc.Base64.stringify(crypto_js_1.default.enc.Hex.parse(js_crc_1.crc32.hex(content)));
57
+ parts.push({ content, crc });
58
+ }
59
+ const content = arrayBuffer.slice((partCount - 1) * partSize, file.size);
60
+ const crc = crypto_js_1.default.enc.Base64.stringify(crypto_js_1.default.enc.Hex.parse(js_crc_1.crc32.hex(content)));
61
+ parts.push({ content, crc });
62
+ return parts;
63
+ })
64
+ .then(parts => Promise.all(parts
65
+ .map((part, index) => __awaiter(this, void 0, void 0, function* () {
66
+ return Promise.resolve()
67
+ .then(() => {
68
+ if (uploadInfo.partCount > 1) {
69
+ return attachmentApi.getMultipartUploadEndpoint(uploadInfo.id, index + 1, part.crc);
70
+ }
71
+ else {
72
+ return attachmentApi.getUploadEndpoint(uploadInfo.id);
73
+ }
74
+ })
75
+ .then(response => response.data)
76
+ .then((_a) => __awaiter(this, [_a], void 0, function* ({ endpoint }) {
77
+ if (!endpoint) {
78
+ return;
79
+ }
80
+ const partChecksum = crypto_js_1.default
81
+ .SHA256(crypto_js_1.default.lib.WordArray.create(part.content))
82
+ .toString(crypto_js_1.default.enc.Base64);
83
+ let headers;
84
+ if (uploadInfo.partCount > 1) {
85
+ // 分片上传的请求头
86
+ headers = {
87
+ 'x-amz-sdk-checksum-algorithm': 'CRC32',
88
+ 'x-amz-checksum-crc32': part.crc,
89
+ };
90
+ }
91
+ else {
92
+ headers = {
93
+ 'x-amz-sdk-checksum-algorithm': 'SHA256',
94
+ 'x-amz-checksum-sha256': partChecksum,
95
+ 'x-amz-meta-id': uploadInfo.id,
96
+ 'x-amz-meta-filename': file.name,
97
+ 'Content-Type': file.type,
98
+ };
99
+ }
100
+ return client
101
+ .request({
102
+ url: endpoint,
103
+ method: 'PUT',
104
+ data: part.content,
105
+ headers: headers,
106
+ });
107
+ }));
108
+ }))))
109
+ .then(() => attachmentApi.finishUpload(uploadInfo.id));
110
+ });
111
+ }
@@ -0,0 +1,22 @@
1
+ "use strict";
2
+ var __importDefault = (this && this.__importDefault) || function (mod) {
3
+ return (mod && mod.__esModule) ? mod : { "default": mod };
4
+ };
5
+ Object.defineProperty(exports, "__esModule", { value: true });
6
+ exports.ZerowebDevClient = exports.AttachmentStatus = exports.FileProvider = exports.ZerowebFileClient = exports.SubscriptionStatus = exports.OpenapiStatus = exports.ZerowebOpenClient = exports.ZerowebAdminClient = exports.ServiceType = exports.MenuType = exports.ZerowebMetadataClient = void 0;
7
+ var metadata_1 = require("./metadata");
8
+ Object.defineProperty(exports, "ZerowebMetadataClient", { enumerable: true, get: function () { return __importDefault(metadata_1).default; } });
9
+ Object.defineProperty(exports, "MenuType", { enumerable: true, get: function () { return metadata_1.MenuType; } });
10
+ Object.defineProperty(exports, "ServiceType", { enumerable: true, get: function () { return metadata_1.ServiceType; } });
11
+ var admin_1 = require("./admin");
12
+ Object.defineProperty(exports, "ZerowebAdminClient", { enumerable: true, get: function () { return __importDefault(admin_1).default; } });
13
+ var open_1 = require("./open");
14
+ Object.defineProperty(exports, "ZerowebOpenClient", { enumerable: true, get: function () { return __importDefault(open_1).default; } });
15
+ Object.defineProperty(exports, "OpenapiStatus", { enumerable: true, get: function () { return open_1.OpenapiStatus; } });
16
+ Object.defineProperty(exports, "SubscriptionStatus", { enumerable: true, get: function () { return open_1.SubscriptionStatus; } });
17
+ var file_1 = require("./file");
18
+ Object.defineProperty(exports, "ZerowebFileClient", { enumerable: true, get: function () { return __importDefault(file_1).default; } });
19
+ Object.defineProperty(exports, "FileProvider", { enumerable: true, get: function () { return file_1.FileProvider; } });
20
+ Object.defineProperty(exports, "AttachmentStatus", { enumerable: true, get: function () { return file_1.AttachmentStatus; } });
21
+ var dev_1 = require("./dev");
22
+ Object.defineProperty(exports, "ZerowebDevClient", { enumerable: true, get: function () { return __importDefault(dev_1).default; } });