@blocklet/did-space-js 0.5.58

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 (160) hide show
  1. package/README.md +77 -0
  2. package/dist/client/index.d.ts +40 -0
  3. package/dist/client/index.js +110 -0
  4. package/dist/commands/backup/backup-blocklet.d.ts +14 -0
  5. package/dist/commands/backup/backup-blocklet.js +83 -0
  6. package/dist/commands/backup/index.d.ts +3 -0
  7. package/dist/commands/backup/index.js +19 -0
  8. package/dist/commands/backup/post-app-backup.d.ts +9 -0
  9. package/dist/commands/backup/post-app-backup.js +49 -0
  10. package/dist/commands/backup/put-app-backup.d.ts +9 -0
  11. package/dist/commands/backup/put-app-backup.js +49 -0
  12. package/dist/commands/base.d.ts +21 -0
  13. package/dist/commands/base.js +47 -0
  14. package/dist/commands/incremental-backup/backup-blocklet.d.ts +14 -0
  15. package/dist/commands/incremental-backup/backup-blocklet.js +90 -0
  16. package/dist/commands/incremental-backup/index.d.ts +1 -0
  17. package/dist/commands/incremental-backup/index.js +17 -0
  18. package/dist/commands/incremental-sync/index.d.ts +2 -0
  19. package/dist/commands/incremental-sync/index.js +18 -0
  20. package/dist/commands/incremental-sync/sync-base.d.ts +76 -0
  21. package/dist/commands/incremental-sync/sync-base.js +236 -0
  22. package/dist/commands/incremental-sync/sync-push.d.ts +30 -0
  23. package/dist/commands/incremental-sync/sync-push.js +202 -0
  24. package/dist/commands/index.d.ts +9 -0
  25. package/dist/commands/index.js +25 -0
  26. package/dist/commands/nft/index.d.ts +1 -0
  27. package/dist/commands/nft/index.js +17 -0
  28. package/dist/commands/nft/put-nft-object.d.ts +20 -0
  29. package/dist/commands/nft/put-nft-object.js +143 -0
  30. package/dist/commands/object/delete-object.d.ts +7 -0
  31. package/dist/commands/object/delete-object.js +38 -0
  32. package/dist/commands/object/get-object.d.ts +7 -0
  33. package/dist/commands/object/get-object.js +43 -0
  34. package/dist/commands/object/index.d.ts +5 -0
  35. package/dist/commands/object/index.js +21 -0
  36. package/dist/commands/object/list-object.d.ts +7 -0
  37. package/dist/commands/object/list-object.js +31 -0
  38. package/dist/commands/object/list-objects.d.ts +7 -0
  39. package/dist/commands/object/list-objects.js +44 -0
  40. package/dist/commands/object/put-object.d.ts +7 -0
  41. package/dist/commands/object/put-object.js +61 -0
  42. package/dist/commands/restore/index.d.ts +3 -0
  43. package/dist/commands/restore/index.js +19 -0
  44. package/dist/commands/restore/post-app-restore.d.ts +7 -0
  45. package/dist/commands/restore/post-app-restore.js +45 -0
  46. package/dist/commands/restore/put-app-restore.d.ts +9 -0
  47. package/dist/commands/restore/put-app-restore.js +49 -0
  48. package/dist/commands/restore/restore-blocklet.d.ts +14 -0
  49. package/dist/commands/restore/restore-blocklet.js +80 -0
  50. package/dist/commands/space/head.d.ts +8 -0
  51. package/dist/commands/space/head.js +52 -0
  52. package/dist/commands/space/index.d.ts +1 -0
  53. package/dist/commands/space/index.js +17 -0
  54. package/dist/commands/sync/index.d.ts +3 -0
  55. package/dist/commands/sync/index.js +19 -0
  56. package/dist/commands/sync/sync-folder-base.d.ts +105 -0
  57. package/dist/commands/sync/sync-folder-base.js +319 -0
  58. package/dist/commands/sync/sync-folder-pull.d.ts +13 -0
  59. package/dist/commands/sync/sync-folder-pull.js +151 -0
  60. package/dist/commands/sync/sync-folder-push.d.ts +20 -0
  61. package/dist/commands/sync/sync-folder-push.js +166 -0
  62. package/dist/did-document/did-document.d.ts +29 -0
  63. package/dist/did-document/did-document.js +2 -0
  64. package/dist/did-document/index.d.ts +3 -0
  65. package/dist/did-document/index.js +19 -0
  66. package/dist/did-document/sign-document.d.ts +3 -0
  67. package/dist/did-document/sign-document.js +13 -0
  68. package/dist/did-document/verify-document.d.ts +10 -0
  69. package/dist/did-document/verify-document.js +35 -0
  70. package/dist/index.d.ts +7 -0
  71. package/dist/index.js +23 -0
  72. package/dist/libs/api.d.ts +3 -0
  73. package/dist/libs/api.js +65 -0
  74. package/dist/libs/did.d.ts +9 -0
  75. package/dist/libs/did.js +34 -0
  76. package/dist/libs/encoding.d.ts +7 -0
  77. package/dist/libs/encoding.js +17 -0
  78. package/dist/libs/error.d.ts +4 -0
  79. package/dist/libs/error.js +27 -0
  80. package/dist/libs/hash.d.ts +1 -0
  81. package/dist/libs/hash.js +5 -0
  82. package/dist/libs/index.d.ts +11 -0
  83. package/dist/libs/index.js +27 -0
  84. package/dist/libs/logger.d.ts +2 -0
  85. package/dist/libs/logger.js +12 -0
  86. package/dist/libs/object-integrality.d.ts +1 -0
  87. package/dist/libs/object-integrality.js +13 -0
  88. package/dist/libs/performance.d.ts +7 -0
  89. package/dist/libs/performance.js +13 -0
  90. package/dist/libs/sleep.d.ts +1 -0
  91. package/dist/libs/sleep.js +9 -0
  92. package/dist/libs/space.d.ts +16 -0
  93. package/dist/libs/space.js +56 -0
  94. package/dist/libs/stream.d.ts +3 -0
  95. package/dist/libs/stream.js +10 -0
  96. package/dist/meta/backup/backup-blocklet-command.d.ts +50 -0
  97. package/dist/meta/backup/backup-blocklet-command.js +2 -0
  98. package/dist/meta/backup/index.d.ts +3 -0
  99. package/dist/meta/backup/index.js +19 -0
  100. package/dist/meta/backup/post-app-backup-command.d.ts +8 -0
  101. package/dist/meta/backup/post-app-backup-command.js +16 -0
  102. package/dist/meta/backup/put-app-backup-command.d.ts +7 -0
  103. package/dist/meta/backup/put-app-backup-command.js +18 -0
  104. package/dist/meta/incremental-backup/backup-blocklet-command.d.ts +50 -0
  105. package/dist/meta/incremental-backup/backup-blocklet-command.js +2 -0
  106. package/dist/meta/incremental-backup/index.d.ts +1 -0
  107. package/dist/meta/incremental-backup/index.js +17 -0
  108. package/dist/meta/index.d.ts +7 -0
  109. package/dist/meta/index.js +23 -0
  110. package/dist/meta/nft/index.d.ts +1 -0
  111. package/dist/meta/nft/index.js +17 -0
  112. package/dist/meta/nft/put-nft-object-command.d.ts +51 -0
  113. package/dist/meta/nft/put-nft-object-command.js +2 -0
  114. package/dist/meta/object/delete-object-command.d.ts +6 -0
  115. package/dist/meta/object/delete-object-command.js +2 -0
  116. package/dist/meta/object/get-object-command.d.ts +10 -0
  117. package/dist/meta/object/get-object-command.js +2 -0
  118. package/dist/meta/object/head-object-command.d.ts +13 -0
  119. package/dist/meta/object/head-object-command.js +2 -0
  120. package/dist/meta/object/index.d.ts +5 -0
  121. package/dist/meta/object/index.js +21 -0
  122. package/dist/meta/object/list-object-command.d.ts +6 -0
  123. package/dist/meta/object/list-object-command.js +2 -0
  124. package/dist/meta/object/list-objects-command.d.ts +8 -0
  125. package/dist/meta/object/list-objects-command.js +2 -0
  126. package/dist/meta/object/put-object-command.d.ts +29 -0
  127. package/dist/meta/object/put-object-command.js +2 -0
  128. package/dist/meta/restore/index.d.ts +3 -0
  129. package/dist/meta/restore/index.js +19 -0
  130. package/dist/meta/restore/post-app-restore-command.d.ts +8 -0
  131. package/dist/meta/restore/post-app-restore-command.js +13 -0
  132. package/dist/meta/restore/put-app-restore-command.d.ts +7 -0
  133. package/dist/meta/restore/put-app-restore-command.js +18 -0
  134. package/dist/meta/restore/restore-blocklet-command.d.ts +28 -0
  135. package/dist/meta/restore/restore-blocklet-command.js +2 -0
  136. package/dist/meta/spaces-client-options.d.ts +5 -0
  137. package/dist/meta/spaces-client-options.js +2 -0
  138. package/dist/meta/sync/incremental-sync-base-command.d.ts +7 -0
  139. package/dist/meta/sync/incremental-sync-base-command.js +2 -0
  140. package/dist/meta/sync/incremental-sync-push-command.d.ts +8 -0
  141. package/dist/meta/sync/incremental-sync-push-command.js +2 -0
  142. package/dist/meta/sync/index.d.ts +6 -0
  143. package/dist/meta/sync/index.js +22 -0
  144. package/dist/meta/sync/sync-base-command.d.ts +121 -0
  145. package/dist/meta/sync/sync-base-command.js +2 -0
  146. package/dist/meta/sync/sync-folder-base-command.d.ts +12 -0
  147. package/dist/meta/sync/sync-folder-base-command.js +2 -0
  148. package/dist/meta/sync/sync-folder-pull-command.d.ts +5 -0
  149. package/dist/meta/sync/sync-folder-pull-command.js +2 -0
  150. package/dist/meta/sync/sync-folder-push-command.d.ts +7 -0
  151. package/dist/meta/sync/sync-folder-push-command.js +2 -0
  152. package/dist/protocol/command.protocol.d.ts +68 -0
  153. package/dist/protocol/command.protocol.js +2 -0
  154. package/dist/protocol/index.d.ts +1 -0
  155. package/dist/protocol/index.js +17 -0
  156. package/dist/security/index.d.ts +1 -0
  157. package/dist/security/index.js +17 -0
  158. package/dist/security/request-signature.d.ts +32 -0
  159. package/dist/security/request-signature.js +140 -0
  160. package/package.json +78 -0
package/README.md ADDED
@@ -0,0 +1,77 @@
1
+ # @did-client
2
+
3
+ # Install
4
+
5
+ ```
6
+ npm install @blocklet/did-space-js
7
+ ```
8
+
9
+ # Usage
10
+
11
+ ## PutNftObjectCommand
12
+
13
+ You can persist NFTs to Spaces using `PutNftObjectCommand`
14
+
15
+ ```typescript
16
+ import { SpaceClient, PutNftObjectCommand } from '@blocklet/did-space-js';
17
+
18
+ const spaceClient = new SpaceClient({
19
+ endpoint:
20
+ 'https://cedcaa27-znkomkclejcfbjaxw9knzzebmzmqrxjnn9bb.did.abtnet.io/api/space/z3T6EHN7sLhH5cty1PshDeSipeG7JNxEVaRFS/app/zNKabhhwdvVmXjtRTtSHk2YQz4pdDPStV289/object/',
21
+ wallet,
22
+ });
23
+
24
+ await spaceClient.send(
25
+ new PutNftObjectCommand({
26
+ did: 'zjduEsT5qiQr72tVtevGG3GwKjV6J4yHR9fy',
27
+ controller: wallet,
28
+ chainHost: 'https://beta.abtnetwork.io/explorer',
29
+ display: {
30
+ key: 'logo.jpg',
31
+ data: fs.createReadStream('logo.jpg'),
32
+ },
33
+ })
34
+ );
35
+ ```
36
+
37
+ ## SyncFolderPushCommand
38
+
39
+ You can use `SyncFolderPushCommand` to sync a local folder to a folder on Spaces
40
+
41
+ ```typescript
42
+ import { SpaceClient, SyncFolderPushCommand } from '@blocklet/did-space-js';
43
+
44
+ const spaceClient = new SpaceClient({
45
+ endpoint:
46
+ 'https://cedcaa27-znkomkclejcfbjaxw9knzzebmzmqrxjnn9bb.did.abtnet.io/api/space/z3T6EHN7sLhH5cty1PshDeSipeG7JNxEVaRFS/app/zNKabhhwdvVmXjtRTtSHk2YQz4pdDPStV289/object/',
47
+ wallet,
48
+ });
49
+
50
+ await spaceClient.send(
51
+ new SyncFolderPushCommand({
52
+ source: 'local-folder/',
53
+ target: 'spaces-folder/',
54
+ })
55
+ );
56
+ ```
57
+
58
+ ## SyncFolderPullCommand
59
+
60
+ You can use `SyncFolderPullCommand` to sync folders on Spaces to local folders
61
+
62
+ ```typescript
63
+ import { SpaceClient, SyncFolderPullCommand } from '@blocklet/did-space-js';
64
+
65
+ const spaceClient = new SpaceClient({
66
+ endpoint:
67
+ 'https://cedcaa27-znkomkclejcfbjaxw9knzzebmzmqrxjnn9bb.did.abtnet.io/api/space/z3T6EHN7sLhH5cty1PshDeSipeG7JNxEVaRFS/app/zNKabhhwdvVmXjtRTtSHk2YQz4pdDPStV289/object/',
68
+ wallet,
69
+ });
70
+
71
+ await spaceClient.send(
72
+ new SyncFolderPullCommand({
73
+ source: 'spaces-folder/',
74
+ target: 'local-folder/',
75
+ })
76
+ );
77
+ ```
@@ -0,0 +1,40 @@
1
+ import { PutNftObjectCommand } from '../commands';
2
+ import { type PutNftObjectCommandOutput, type SpaceEndpointContext } from '../meta';
3
+ import { CommandProtocol, type CommandInput, type CommandOutput, type SpaceClientOptions } from '../protocol';
4
+ export declare class SpaceClient {
5
+ readonly options: SpaceClientOptions;
6
+ constructor(options: SpaceClientOptions);
7
+ /**
8
+ *
9
+ * @deprecated Please use `spaceClient.send(new PutNftObjectCommand(...))`
10
+ * @see https://github.com/blocklet/nft-maker/issues/110
11
+ * @description PUT 一个 nft object 到 did space
12
+ * @param {PutNftObjectCommand} command
13
+ * @return {*} {Promise<void>}
14
+ * @memberof SpaceClient
15
+ */
16
+ putNftObject(command: PutNftObjectCommand): Promise<PutNftObjectCommandOutput>;
17
+ send<Input extends CommandInput, Output extends CommandOutput>(command: CommandProtocol<Input, Output>): Promise<Output>;
18
+ /**
19
+ *
20
+ *
21
+ * @private
22
+ * @param {string} endpoint => https://73aa3e87-znkjt5vbgnezh4p6v4dsaye61e7pxxn3vk4j.did.abtnet.io/app/api/space/z3T6WZD3dBtaVUgwb3rtBey8BartrJDTLrmQr/app/zNKsSUmUVJntiVdAPpg8vYtEgnFvSppYLf4F/object/
23
+ * @return {*} {string} https://73aa3e87-znkjt5vbgnezh4p6v4dsaye61e7pxxn3vk4j.did.abtnet.io/app/api/space/z3T6WZD3dBtaVUgwb3rtBey8BartrJDTLrmQr/app/zNKsSUmUVJntiVdAPpg8vYtEgnFvSppYLf4F/
24
+ * @memberof SpaceClient
25
+ */
26
+ private normalizeEndpoint;
27
+ /**
28
+ *
29
+ * @description 获取 endpoint 的 base url
30
+ * @input (endpoint: https://73aa3e87-znkjt5vbgnezh4p6v4dsaye61e7pxxn3vk4j.did.abtnet.io/app/api/space/z3T6WZD3dBtaVUgwb3rtBey8BartrJDTLrmQr/app/zNKsSUmUVJntiVdAPpg8vYtEgnFvSppYLf4F/object/)
31
+ * @output https://73aa3e87-znkjt5vbgnezh4p6v4dsaye61e7pxxn3vk4j.did.abtnet.io/app/api/space/z3T6WZD3dBtaVUgwb3rtBey8BartrJDTLrmQr/app
32
+ * @static
33
+ * @param {string} endpoint
34
+ * @return {*} {Promise<string>}
35
+ * @memberof SpaceClient
36
+ */
37
+ static getBaseUrl(endpoint: string): Promise<string>;
38
+ static getDisplayUrl(endpoint: string, did?: string): Promise<string>;
39
+ static getSpaceEndpointContext(endpoint: string): Promise<SpaceEndpointContext>;
40
+ }
@@ -0,0 +1,110 @@
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.SpaceClient = void 0;
7
+ const is_url_1 = __importDefault(require("is-url"));
8
+ const ufo_1 = require("ufo");
9
+ const debug_1 = __importDefault(require("debug"));
10
+ const error_1 = require("../libs/error");
11
+ const space_1 = require("../libs/space");
12
+ const { name, version } = require('../../package.json');
13
+ const debug = (0, debug_1.default)(`${name}@${version}:SpaceClient`);
14
+ class SpaceClient {
15
+ options;
16
+ constructor(options) {
17
+ this.options = options;
18
+ this.options.endpoint = this.normalizeEndpoint(this.options.endpoint);
19
+ }
20
+ /**
21
+ *
22
+ * @deprecated Please use `spaceClient.send(new PutNftObjectCommand(...))`
23
+ * @see https://github.com/blocklet/nft-maker/issues/110
24
+ * @description PUT 一个 nft object 到 did space
25
+ * @param {PutNftObjectCommand} command
26
+ * @return {*} {Promise<void>}
27
+ * @memberof SpaceClient
28
+ */
29
+ async putNftObject(command) {
30
+ try {
31
+ command.context = this.options;
32
+ return await command.request();
33
+ }
34
+ catch (error) {
35
+ debug(error);
36
+ const message = (0, error_1.getErrorMessage)(error);
37
+ throw new Error(`SpaceClient has encountered an error: ${message}`);
38
+ }
39
+ }
40
+ async send(command) {
41
+ try {
42
+ command.context = {
43
+ ...command.context,
44
+ ...this.options,
45
+ };
46
+ return await command.request();
47
+ }
48
+ catch (err) {
49
+ debug(err);
50
+ const error = err;
51
+ const statusCode = (0, error_1.getErrorStatusCode)(error) || error.code || 500;
52
+ const statusMessage = (0, error_1.getErrorMessage)(error);
53
+ return {
54
+ statusCode,
55
+ statusMessage,
56
+ stack: error.stack,
57
+ data: undefined,
58
+ };
59
+ }
60
+ }
61
+ /**
62
+ *
63
+ *
64
+ * @private
65
+ * @param {string} endpoint => https://73aa3e87-znkjt5vbgnezh4p6v4dsaye61e7pxxn3vk4j.did.abtnet.io/app/api/space/z3T6WZD3dBtaVUgwb3rtBey8BartrJDTLrmQr/app/zNKsSUmUVJntiVdAPpg8vYtEgnFvSppYLf4F/object/
66
+ * @return {*} {string} https://73aa3e87-znkjt5vbgnezh4p6v4dsaye61e7pxxn3vk4j.did.abtnet.io/app/api/space/z3T6WZD3dBtaVUgwb3rtBey8BartrJDTLrmQr/app/zNKsSUmUVJntiVdAPpg8vYtEgnFvSppYLf4F/
67
+ * @memberof SpaceClient
68
+ */
69
+ normalizeEndpoint(endpoint) {
70
+ return (0, space_1.normalizeEndpoint)(endpoint);
71
+ }
72
+ /**
73
+ *
74
+ * @description 获取 endpoint 的 base url
75
+ * @input (endpoint: https://73aa3e87-znkjt5vbgnezh4p6v4dsaye61e7pxxn3vk4j.did.abtnet.io/app/api/space/z3T6WZD3dBtaVUgwb3rtBey8BartrJDTLrmQr/app/zNKsSUmUVJntiVdAPpg8vYtEgnFvSppYLf4F/object/)
76
+ * @output https://73aa3e87-znkjt5vbgnezh4p6v4dsaye61e7pxxn3vk4j.did.abtnet.io/app/api/space/z3T6WZD3dBtaVUgwb3rtBey8BartrJDTLrmQr/app
77
+ * @static
78
+ * @param {string} endpoint
79
+ * @return {*} {Promise<string>}
80
+ * @memberof SpaceClient
81
+ */
82
+ static getBaseUrl(endpoint) {
83
+ if (!(0, is_url_1.default)(endpoint)) {
84
+ throw new Error(`endpoint(${endpoint}) is not a valid http url or https url`);
85
+ }
86
+ // @ts-expect-error
87
+ return endpoint.replace(/\/api\/space.*/, '');
88
+ }
89
+ static async getDisplayUrl(endpoint, did = '') {
90
+ if (!(0, is_url_1.default)(endpoint)) {
91
+ throw new Error(`endpoint(${endpoint}) is not a valid http url or https url`);
92
+ }
93
+ return (0, ufo_1.joinURL)(await this.getBaseUrl(endpoint), 'resolve', did, 'display');
94
+ }
95
+ static async getSpaceEndpointContext(endpoint) {
96
+ if (!(0, is_url_1.default)(endpoint)) {
97
+ throw new Error(`endpoint(${endpoint}) is not a valid http url or https url`);
98
+ }
99
+ const baseUrl = await this.getBaseUrl(endpoint);
100
+ const strArray = endpoint.replace(/\/$/, '').split('/');
101
+ const spaceDid = strArray.at(-4);
102
+ const appDid = strArray.at(-2);
103
+ return {
104
+ baseUrl,
105
+ spaceDid,
106
+ appDid,
107
+ };
108
+ }
109
+ }
110
+ exports.SpaceClient = SpaceClient;
@@ -0,0 +1,14 @@
1
+ import { AxiosRequestConfig } from 'axios';
2
+ import { BackupBlockletCommandInput, BackupBlockletCommandOutput } from '../../meta';
3
+ import { BaseCommand } from '../base';
4
+ /**
5
+ *
6
+ * FIXME: @yejianchao 优化点,需要支持 joi 校验
7
+ * @export
8
+ * @class BackupBlockletCommand
9
+ * @extends {BaseCommand<BackupBlockletCommandInput, BackupBlockletCommandOutput>}
10
+ */
11
+ export declare class BackupBlockletCommand extends BaseCommand<BackupBlockletCommandInput, BackupBlockletCommandOutput> {
12
+ getAxiosRequestConfig(): Promise<AxiosRequestConfig<any>>;
13
+ resolveMiddleware(): Promise<BackupBlockletCommandOutput>;
14
+ }
@@ -0,0 +1,83 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.BackupBlockletCommand = void 0;
4
+ const path_1 = require("path");
5
+ const core_1 = require("@did-space/core");
6
+ const base_1 = require("../base");
7
+ const sync_1 = require("../sync");
8
+ const post_app_backup_1 = require("./post-app-backup");
9
+ const put_app_backup_1 = require("./put-app-backup");
10
+ const libs_1 = require("../../libs");
11
+ const space_1 = require("../../libs/space");
12
+ /**
13
+ *
14
+ * FIXME: @yejianchao 优化点,需要支持 joi 校验
15
+ * @export
16
+ * @class BackupBlockletCommand
17
+ * @extends {BaseCommand<BackupBlockletCommandInput, BackupBlockletCommandOutput>}
18
+ */
19
+ class BackupBlockletCommand extends base_1.BaseCommand {
20
+ getAxiosRequestConfig() {
21
+ return null;
22
+ }
23
+ async resolveMiddleware() {
24
+ let appBackup;
25
+ try {
26
+ // @note: 备份还原的时候我们希望使用 service url 来完成,不希望走 CDN
27
+ this.context.endpoint = await (0, space_1.getSpaceServiceEndpoint)(this.context.endpoint);
28
+ appBackup = (await new post_app_backup_1.PostAppBackupCommand({
29
+ userDid: this.input.userDid,
30
+ referrer: this.input.referrer,
31
+ appName: this.input.appName,
32
+ appDescription: this.input.appDescription,
33
+ serverDid: this.input.serverDid,
34
+ signerDid: this.input.signerDid,
35
+ }, this.context).request()).data;
36
+ const res = await new sync_1.SyncFolderPushCommand({
37
+ target: (0, path_1.join)('.did-objects', this.input.appDid, '/'),
38
+ ...this.input,
39
+ }, this.context).request();
40
+ if (res.data.errorCount !== 0) {
41
+ await new put_app_backup_1.PutAppBackupCommand({
42
+ id: appBackup.id,
43
+ status: core_1.APP_BACKUP_STATUS.FAILED,
44
+ message: res?.statusMessage,
45
+ }, this.context)
46
+ .request()
47
+ .catch(console.error);
48
+ return res;
49
+ }
50
+ // 仅仅是触发一下接口,更新一下 updateAt
51
+ await new put_app_backup_1.PutAppBackupCommand({
52
+ id: appBackup.id,
53
+ status: core_1.APP_BACKUP_STATUS.SUCCEEDED,
54
+ }, this.context).request();
55
+ return res;
56
+ }
57
+ catch (err) {
58
+ console.error(err);
59
+ const error = err;
60
+ const message = (0, libs_1.getErrorMessage)(error);
61
+ if (appBackup) {
62
+ await new put_app_backup_1.PutAppBackupCommand({
63
+ id: appBackup.id,
64
+ status: core_1.APP_BACKUP_STATUS.FAILED,
65
+ message,
66
+ }, this.context)
67
+ .request()
68
+ .catch(console.error);
69
+ }
70
+ return {
71
+ statusCode: (0, libs_1.getErrorStatusCode)(error),
72
+ statusMessage: message,
73
+ stack: error.stack,
74
+ data: {
75
+ errorCount: -1,
76
+ count: -1,
77
+ duration: -1,
78
+ },
79
+ };
80
+ }
81
+ }
82
+ }
83
+ exports.BackupBlockletCommand = BackupBlockletCommand;
@@ -0,0 +1,3 @@
1
+ export * from './backup-blocklet';
2
+ export * from './post-app-backup';
3
+ export * from './put-app-backup';
@@ -0,0 +1,19 @@
1
+ "use strict";
2
+ var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
3
+ if (k2 === undefined) k2 = k;
4
+ var desc = Object.getOwnPropertyDescriptor(m, k);
5
+ if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
6
+ desc = { enumerable: true, get: function() { return m[k]; } };
7
+ }
8
+ Object.defineProperty(o, k2, desc);
9
+ }) : (function(o, m, k, k2) {
10
+ if (k2 === undefined) k2 = k;
11
+ o[k2] = m[k];
12
+ }));
13
+ var __exportStar = (this && this.__exportStar) || function(m, exports) {
14
+ for (var p in m) if (p !== "default" && !Object.prototype.hasOwnProperty.call(exports, p)) __createBinding(exports, m, p);
15
+ };
16
+ Object.defineProperty(exports, "__esModule", { value: true });
17
+ __exportStar(require("./backup-blocklet"), exports);
18
+ __exportStar(require("./post-app-backup"), exports);
19
+ __exportStar(require("./put-app-backup"), exports);
@@ -0,0 +1,9 @@
1
+ import { AxiosRequestConfig } from 'axios';
2
+ import { PostAppBackupCommandInput, PostAppBackupCommandOutput } from '../../meta/backup';
3
+ import { BaseCommand } from '../base';
4
+ import type { SpaceClientOptions } from '../../protocol';
5
+ export declare class PostAppBackupCommand extends BaseCommand<PostAppBackupCommandInput, PostAppBackupCommandOutput> {
6
+ constructor(input: PostAppBackupCommandInput, context?: SpaceClientOptions);
7
+ getAxiosRequestConfig(): Promise<AxiosRequestConfig<any>>;
8
+ resolveMiddleware(): Promise<PostAppBackupCommandOutput>;
9
+ }
@@ -0,0 +1,49 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.PostAppBackupCommand = void 0;
4
+ const ufo_1 = require("ufo");
5
+ const libs_1 = require("../../libs");
6
+ const backup_1 = require("../../meta/backup");
7
+ const security_1 = require("../../security");
8
+ const base_1 = require("../base");
9
+ class PostAppBackupCommand extends base_1.BaseCommand {
10
+ constructor(input, context) {
11
+ super(input, context);
12
+ const { error, value } = backup_1.PostAppBackupCommandInputSchema.validate(input);
13
+ if (error) {
14
+ throw error;
15
+ }
16
+ this.input = value;
17
+ }
18
+ getAxiosRequestConfig() {
19
+ return null;
20
+ }
21
+ async resolveMiddleware() {
22
+ const url = (0, ufo_1.joinURL)(this.context.endpoint, 'backup');
23
+ const data = this.input;
24
+ const method = 'POST';
25
+ const { headers } = (0, security_1.signRequest)({
26
+ url,
27
+ method,
28
+ data,
29
+ headers: {},
30
+ wallet: this.context.wallet,
31
+ delegation: this.context.delegation,
32
+ });
33
+ const response = await (0, libs_1.gotApi)({
34
+ url,
35
+ method,
36
+ json: data,
37
+ responseType: 'json',
38
+ headers: {
39
+ ...headers,
40
+ },
41
+ });
42
+ return {
43
+ statusCode: response.statusCode,
44
+ statusMessage: response.statusMessage,
45
+ data: response.body,
46
+ };
47
+ }
48
+ }
49
+ exports.PostAppBackupCommand = PostAppBackupCommand;
@@ -0,0 +1,9 @@
1
+ import { AxiosRequestConfig } from 'axios';
2
+ import { PutAppBackupCommandInput, PutAppBackupCommandOutput } from '../../meta';
3
+ import { BaseCommand } from '../base';
4
+ import type { SpaceClientOptions } from '../../protocol';
5
+ export declare class PutAppBackupCommand extends BaseCommand<PutAppBackupCommandInput, PutAppBackupCommandOutput> {
6
+ constructor(input: PutAppBackupCommandInput, context?: SpaceClientOptions);
7
+ getAxiosRequestConfig(): Promise<AxiosRequestConfig<any>>;
8
+ resolveMiddleware(): Promise<PutAppBackupCommandOutput>;
9
+ }
@@ -0,0 +1,49 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.PutAppBackupCommand = void 0;
4
+ const ufo_1 = require("ufo");
5
+ const libs_1 = require("../../libs");
6
+ const meta_1 = require("../../meta");
7
+ const security_1 = require("../../security");
8
+ const base_1 = require("../base");
9
+ class PutAppBackupCommand extends base_1.BaseCommand {
10
+ constructor(input, context) {
11
+ super(input, context);
12
+ const { error, value } = meta_1.PutAppBackupCommandInputSchema.validate(input);
13
+ if (error) {
14
+ throw error;
15
+ }
16
+ this.input = value;
17
+ }
18
+ getAxiosRequestConfig() {
19
+ return null;
20
+ }
21
+ async resolveMiddleware() {
22
+ const url = (0, ufo_1.joinURL)(this.context.endpoint, 'backup');
23
+ const data = this.input;
24
+ const method = 'PUT';
25
+ const { headers } = (0, security_1.signRequest)({
26
+ url,
27
+ method,
28
+ data,
29
+ headers: {},
30
+ wallet: this.context.wallet,
31
+ delegation: this.context.delegation,
32
+ });
33
+ const response = await (0, libs_1.gotApi)({
34
+ url,
35
+ method,
36
+ json: data,
37
+ responseType: 'json',
38
+ headers: {
39
+ ...headers,
40
+ },
41
+ });
42
+ return {
43
+ statusCode: response.statusCode,
44
+ statusMessage: response.statusMessage,
45
+ data: response.body,
46
+ };
47
+ }
48
+ }
49
+ exports.PutAppBackupCommand = PutAppBackupCommand;
@@ -0,0 +1,21 @@
1
+ /// <reference types="node" />
2
+ import { AxiosRequestConfig, AxiosResponse } from 'axios';
3
+ import { EventEmitter } from 'stream';
4
+ import { CommandProtocol, type CommandInput, type CommandOutput, type SpaceClientOptions } from '../protocol';
5
+ export interface GetKeyOptions {
6
+ /**
7
+ * @description 当你使用一个文件的路径的时候,那么它通常需要设置 encode 为 true
8
+ * @type {(false | true)}
9
+ * @memberof GetUrlOptions
10
+ */
11
+ encode?: true | false;
12
+ }
13
+ export declare abstract class BaseCommand<BaseCommandInput extends CommandInput, BaseCommandOutput extends CommandOutput> extends EventEmitter implements CommandProtocol<BaseCommandInput, BaseCommandOutput> {
14
+ input: BaseCommandInput;
15
+ context: SpaceClientOptions;
16
+ constructor(input: BaseCommandInput, context?: SpaceClientOptions);
17
+ abstract getAxiosRequestConfig(): Promise<AxiosRequestConfig>;
18
+ getKey(key: string, options?: GetKeyOptions): string;
19
+ request(): Promise<BaseCommandOutput>;
20
+ resolveMiddleware(res?: AxiosResponse<BaseCommandOutput['data'], any>): Promise<BaseCommandOutput>;
21
+ }
@@ -0,0 +1,47 @@
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.BaseCommand = void 0;
7
+ const isEmpty_1 = __importDefault(require("lodash/isEmpty"));
8
+ const ufo_1 = require("ufo");
9
+ const did_1 = require("@arcblock/did");
10
+ const core_1 = require("@did-space/core");
11
+ const stream_1 = require("stream");
12
+ const libs_1 = require("../libs");
13
+ class BaseCommand extends stream_1.EventEmitter {
14
+ input;
15
+ context;
16
+ constructor(input, context = {}) {
17
+ super();
18
+ this.input = input;
19
+ this.context = context;
20
+ if ((0, did_1.isValid)(process.env.BLOCKLET_COMPONENT_DID)) {
21
+ this.context.componentDid = process.env.BLOCKLET_COMPONENT_DID;
22
+ }
23
+ }
24
+ getKey(key, options = { encode: true }) {
25
+ const path = (0, isEmpty_1.default)(this.context.componentDid)
26
+ ? key
27
+ : (0, ufo_1.joinURL)(core_1.APP.COMPONENT.FOLDER_PREFIX, this.context.componentDid, key);
28
+ return options.encode ? (0, libs_1.encode)(path) : path;
29
+ }
30
+ async request() {
31
+ const axiosRequestConfig = await this.getAxiosRequestConfig();
32
+ if (!axiosRequestConfig) {
33
+ return this.resolveMiddleware();
34
+ }
35
+ // TODO: axios 会导致严重的内存泄漏, 之后可以考虑切换到 got, @see: https://github.com/axios/axios/issues/4763#issuecomment-1334953446
36
+ const res = await (0, libs_1.api)(axiosRequestConfig);
37
+ return this.resolveMiddleware(res);
38
+ }
39
+ resolveMiddleware(res) {
40
+ // @ts-expect-error
41
+ return Promise.resolve({
42
+ statusCode: res.status,
43
+ data: res.data,
44
+ });
45
+ }
46
+ }
47
+ exports.BaseCommand = BaseCommand;
@@ -0,0 +1,14 @@
1
+ import { AxiosRequestConfig } from 'axios';
2
+ import { BackupBlockletCommandOutput, IncrementalBackupBlockletCommandInput, IncrementalBackupBlockletCommandOutput } from '../../meta';
3
+ import { BaseCommand } from '../base';
4
+ /**
5
+ *
6
+ * FIXME: @yejianchao 优化点,需要支持 joi 校验
7
+ * @export
8
+ * @class BackupBlockletCommand
9
+ * @extends {BaseCommand<BackupBlockletCommandInput, BackupBlockletCommandOutput>}
10
+ */
11
+ export declare class IncrementalBackupBlockletCommand extends BaseCommand<IncrementalBackupBlockletCommandInput, IncrementalBackupBlockletCommandOutput> {
12
+ getAxiosRequestConfig(): Promise<AxiosRequestConfig<any>>;
13
+ resolveMiddleware(): Promise<BackupBlockletCommandOutput>;
14
+ }
@@ -0,0 +1,90 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.IncrementalBackupBlockletCommand = void 0;
4
+ const path_1 = require("path");
5
+ const core_1 = require("@did-space/core");
6
+ const base_1 = require("../base");
7
+ const backup_1 = require("../backup");
8
+ const libs_1 = require("../../libs");
9
+ const space_1 = require("../../libs/space");
10
+ const incremental_sync_1 = require("../incremental-sync");
11
+ /**
12
+ *
13
+ * FIXME: @yejianchao 优化点,需要支持 joi 校验
14
+ * @export
15
+ * @class BackupBlockletCommand
16
+ * @extends {BaseCommand<BackupBlockletCommandInput, BackupBlockletCommandOutput>}
17
+ */
18
+ class IncrementalBackupBlockletCommand extends base_1.BaseCommand {
19
+ getAxiosRequestConfig() {
20
+ return null;
21
+ }
22
+ async resolveMiddleware() {
23
+ let appBackup;
24
+ let incrementalSyncPushInstance;
25
+ try {
26
+ // @note: 备份还原的时候我们希望使用 service url 来完成,不希望走 CDN
27
+ this.context.endpoint = await (0, space_1.getSpaceServiceEndpoint)(this.context.endpoint);
28
+ appBackup = (await new backup_1.PostAppBackupCommand({
29
+ userDid: this.input.userDid,
30
+ referrer: this.input.referrer,
31
+ appName: this.input.appName,
32
+ appDescription: this.input.appDescription,
33
+ serverDid: this.input.serverDid,
34
+ signerDid: this.input.signerDid,
35
+ }, this.context).request()).data;
36
+ incrementalSyncPushInstance = new incremental_sync_1.IncrementalSyncPushCommand({
37
+ target: (0, path_1.join)('.did-objects', this.input.appDid, '/'),
38
+ ...this.input,
39
+ }, this.context);
40
+ const res = await incrementalSyncPushInstance.request();
41
+ if (res.data.errorCount !== 0) {
42
+ await new backup_1.PutAppBackupCommand({
43
+ id: appBackup.id,
44
+ status: core_1.APP_BACKUP_STATUS.FAILED,
45
+ message: res?.statusMessage,
46
+ }, this.context)
47
+ .request()
48
+ .catch(console.error);
49
+ return res;
50
+ }
51
+ // 仅仅是触发一下接口,更新一下 updateAt
52
+ await new backup_1.PutAppBackupCommand({
53
+ id: appBackup.id,
54
+ status: core_1.APP_BACKUP_STATUS.SUCCEEDED,
55
+ }, this.context).request();
56
+ return res;
57
+ }
58
+ catch (err) {
59
+ console.error(err);
60
+ const error = err;
61
+ const message = (0, libs_1.getErrorMessage)(error);
62
+ if (appBackup) {
63
+ await new backup_1.PutAppBackupCommand({
64
+ id: appBackup.id,
65
+ status: core_1.APP_BACKUP_STATUS.FAILED,
66
+ message,
67
+ }, this.context)
68
+ .request()
69
+ .catch(console.error);
70
+ }
71
+ return {
72
+ statusMessage: message,
73
+ statusCode: (0, libs_1.getErrorStatusCode)(error),
74
+ stack: error.stack,
75
+ data: {
76
+ errorCount: -1,
77
+ count: -1,
78
+ duration: -1,
79
+ },
80
+ };
81
+ }
82
+ finally {
83
+ // @note: 清空备份所占据的临时空间
84
+ if (incrementalSyncPushInstance?.destroy) {
85
+ await incrementalSyncPushInstance.destroy();
86
+ }
87
+ }
88
+ }
89
+ }
90
+ exports.IncrementalBackupBlockletCommand = IncrementalBackupBlockletCommand;
@@ -0,0 +1 @@
1
+ export * from './backup-blocklet';
@@ -0,0 +1,17 @@
1
+ "use strict";
2
+ var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
3
+ if (k2 === undefined) k2 = k;
4
+ var desc = Object.getOwnPropertyDescriptor(m, k);
5
+ if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
6
+ desc = { enumerable: true, get: function() { return m[k]; } };
7
+ }
8
+ Object.defineProperty(o, k2, desc);
9
+ }) : (function(o, m, k, k2) {
10
+ if (k2 === undefined) k2 = k;
11
+ o[k2] = m[k];
12
+ }));
13
+ var __exportStar = (this && this.__exportStar) || function(m, exports) {
14
+ for (var p in m) if (p !== "default" && !Object.prototype.hasOwnProperty.call(exports, p)) __createBinding(exports, m, p);
15
+ };
16
+ Object.defineProperty(exports, "__esModule", { value: true });
17
+ __exportStar(require("./backup-blocklet"), exports);