@blocklet/cli 1.17.4-beta-20251203-225234-75da41dd → 1.17.4-beta-20251204-152224-243ff54f

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.
@@ -1,3 +1,4 @@
1
+ /* eslint-disable no-await-in-loop */
1
2
  const chalk = require('chalk');
2
3
  const capitalize = require('lodash/capitalize');
3
4
 
@@ -34,6 +35,60 @@ const { checkRunning } = require('../../manager');
34
35
  const { wrapSpinner } = require('../../ui');
35
36
  const clearAllCache = require('../../util/clear-all-cache');
36
37
 
38
+ /**
39
+ * Update all running/starting blocklets status to waiting
40
+ * @param {Object} node - The node instance
41
+ */
42
+ const updateRunningBlockletsToWaiting = async (node) => {
43
+ try {
44
+ const blocklets = await node.getBlocklets({ includeRuntimeInfo: false });
45
+
46
+ for (const blocklet of blocklets) {
47
+ const { did } = blocklet.meta;
48
+ const componentDids = [];
49
+
50
+ const needChangeToWaiting = [
51
+ BlockletStatus.running,
52
+ BlockletStatus.waiting,
53
+ BlockletStatus.starting,
54
+ BlockletStatus.restarting,
55
+ BlockletStatus.downloading,
56
+ BlockletStatus.starting,
57
+ ];
58
+ // Check children components
59
+ if (blocklet.children && blocklet.children.length > 0) {
60
+ for (const child of blocklet.children) {
61
+ if (needChangeToWaiting.includes(child.status) || needChangeToWaiting.includes(child.greenStatus)) {
62
+ componentDids.push(child.meta.did);
63
+ }
64
+ }
65
+ }
66
+
67
+ // Update status to waiting if needed
68
+ if (componentDids.length > 0) {
69
+ try {
70
+ await node.setBlockletStatus(did, BlockletStatus.waiting, {
71
+ componentDids,
72
+ operator: 'daemon',
73
+ });
74
+ await node.setBlockletStatus(did, BlockletStatus.stopped, {
75
+ componentDids,
76
+ operator: 'daemon',
77
+ isGreen: true,
78
+ });
79
+ } catch (err) {
80
+ printError(`Failed to update blocklet status to waiting for ${did}:`, err.message);
81
+ // 错误被忽略,不阻止其他 blocklet 的处理
82
+ }
83
+ }
84
+ }
85
+ } catch (err) {
86
+ // 即使获取 blocklets 失败,也不应该阻止 stop 流程
87
+ // 错误被忽略,让 stop 流程继续
88
+ printError('Failed to update blocklet statuses to waiting:', err.message);
89
+ }
90
+ };
91
+
37
92
  const forceStopServer = async () => {
38
93
  const stop = async () => {
39
94
  try {
@@ -48,6 +103,14 @@ const forceStopServer = async () => {
48
103
  printSuccess(`${capitalize(clearedProvider)} router is stopped successfully`);
49
104
  }
50
105
 
106
+ try {
107
+ const { node } = await getNode({ dir: process.cwd() });
108
+ await updateRunningBlockletsToWaiting(node);
109
+ printSuccess('All blocklet processes stopped successfully');
110
+ } catch (error) {
111
+ printError(`Failed to update blocklet statuses to waiting: ${error.message}`);
112
+ }
113
+
51
114
  // Kill all blocklet processes
52
115
  try {
53
116
  const list = await pm2.listAsync();
@@ -58,7 +121,6 @@ const forceStopServer = async () => {
58
121
  blockletProcesses.map((process) => () => pm2.deleteAsync(process.name)),
59
122
  { concurrency: 6 }
60
123
  );
61
- printSuccess('All blocklet processes stopped successfully');
62
124
  } catch (error) {
63
125
  printError(`Failed to stop blocklet processes: ${error.message}`);
64
126
  }
@@ -157,6 +219,14 @@ exports.run = async ({ force = false }) => {
157
219
  }
158
220
  }
159
221
 
222
+ // Update all running/starting blocklets status to waiting
223
+ // Re-fetch blocklets to get current state after stopping
224
+ try {
225
+ await updateRunningBlockletsToWaiting(node);
226
+ } catch (err) {
227
+ printError('Failed to update blocklet statuses to waiting:', err.message);
228
+ }
229
+
160
230
  const actions = [
161
231
  { action: 'kill', processName: PROCESS_NAME_DAEMON },
162
232
  { action: 'kill', processName: PROCESS_NAME_SERVICE },
package/lib/constant.js CHANGED
@@ -1,11 +1,17 @@
1
1
  const os = require('os');
2
2
  const path = require('path');
3
3
 
4
+ // Support custom data directory via ABT_NODE_CUSTOM_DATA_DIR environment variable
5
+ // Default to ~/.arcblock if not specified
6
+ const ABT_NODE_HOME = process.env.ABT_NODE_CUSTOM_DATA_DIR
7
+ ? path.resolve(process.env.ABT_NODE_CUSTOM_DATA_DIR)
8
+ : path.join(os.homedir(), '.arcblock');
9
+
4
10
  const ABT_NODE_MAX_CLUSTER_SIZE = Math.min(Math.max(Number(process.env.ABT_NODE_MAX_CLUSTER_SIZE) || 1, 1), 32);
5
11
 
6
12
  const CLI_MODE = 'blocklet';
7
13
  const NODE_ENV = process.env.NODE_ENV || 'production';
8
- const ABT_NODE_HOME = path.join(os.homedir(), '.arcblock');
14
+
9
15
  const PM2_HOME = path.join(ABT_NODE_HOME, 'abtnode');
10
16
  const ABT_NODE_CONFIG_FILE = path.join(ABT_NODE_HOME, 'blocklet.ini');
11
17
  const INSTALL_FILE_PATH = path.join(ABT_NODE_HOME, '.is-new-server-install');
@@ -34,7 +34,7 @@ const { SERVER_STATUS } = require('@abtnode/constant');
34
34
  const createServer = require('@abtnode/webapp/blocklet'); // eslint-disable-line
35
35
 
36
36
  const { setupGracefulShutdown } = require('@abtnode/util/lib/pm2/setup-graceful-shutdown');
37
- const ensureBlockletRunning = require('@abtnode/core/lib/blocklet/manager/ensure-blocklet-running');
37
+ const { ensureBlockletRunning } = require('@abtnode/core/lib/blocklet/manager/ensure-blocklet-running');
38
38
 
39
39
  const wallet = getNodeWallet(process.env.ABT_NODE_SK);
40
40
  const dataDir = process.env.ABT_NODE_DATA_DIR;
package/lib/util/index.js CHANGED
@@ -333,8 +333,6 @@ const getDevUrl = async ({
333
333
  return url || '';
334
334
  };
335
335
 
336
- const getDataDir = () => path.join(os.homedir(), '.arcblock');
337
-
338
336
  const readInitInfoFromEc2 = () => {
339
337
  try {
340
338
  const info = fs.readFileSync(path.join(os.homedir(), '.arcblock/abtnode/user-data')).toString().trim();
@@ -639,7 +637,6 @@ const lib = {
639
637
  getUserName,
640
638
  fixFiles,
641
639
  getDevUrl,
642
- getDataDir,
643
640
  getWallet: getNodeWallet,
644
641
  readInitInfoFromEc2,
645
642
  getVersionInfo,
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@blocklet/cli",
3
- "version": "1.17.4-beta-20251203-225234-75da41dd",
3
+ "version": "1.17.4-beta-20251204-152224-243ff54f",
4
4
  "description": "Command line tools to manage Blocklet Server",
5
5
  "homepage": "https://www.arcblock.io/docs/blocklet-cli",
6
6
  "bin": {
@@ -33,28 +33,28 @@
33
33
  "url": "https://github.com/ArcBlock/blocklet-server/issues"
34
34
  },
35
35
  "dependencies": {
36
- "@abtnode/blocklet-services": "1.17.4-beta-20251203-225234-75da41dd",
37
- "@abtnode/constant": "1.17.4-beta-20251203-225234-75da41dd",
38
- "@abtnode/core": "1.17.4-beta-20251203-225234-75da41dd",
39
- "@abtnode/db-cache": "1.17.4-beta-20251203-225234-75da41dd",
40
- "@abtnode/logger": "1.17.4-beta-20251203-225234-75da41dd",
41
- "@abtnode/models": "1.17.4-beta-20251203-225234-75da41dd",
42
- "@abtnode/router-provider": "1.17.4-beta-20251203-225234-75da41dd",
43
- "@abtnode/util": "1.17.4-beta-20251203-225234-75da41dd",
44
- "@abtnode/webapp": "1.17.4-beta-20251203-225234-75da41dd",
36
+ "@abtnode/blocklet-services": "1.17.4-beta-20251204-152224-243ff54f",
37
+ "@abtnode/constant": "1.17.4-beta-20251204-152224-243ff54f",
38
+ "@abtnode/core": "1.17.4-beta-20251204-152224-243ff54f",
39
+ "@abtnode/db-cache": "1.17.4-beta-20251204-152224-243ff54f",
40
+ "@abtnode/logger": "1.17.4-beta-20251204-152224-243ff54f",
41
+ "@abtnode/models": "1.17.4-beta-20251204-152224-243ff54f",
42
+ "@abtnode/router-provider": "1.17.4-beta-20251204-152224-243ff54f",
43
+ "@abtnode/util": "1.17.4-beta-20251204-152224-243ff54f",
44
+ "@abtnode/webapp": "1.17.4-beta-20251204-152224-243ff54f",
45
45
  "@arcblock/did": "^1.27.12",
46
46
  "@arcblock/event-hub": "^1.27.12",
47
47
  "@arcblock/ipfs-only-hash": "^0.0.2",
48
48
  "@arcblock/jwt": "^1.27.12",
49
49
  "@arcblock/ws": "^1.27.12",
50
- "@blocklet/constant": "1.17.4-beta-20251203-225234-75da41dd",
50
+ "@blocklet/constant": "1.17.4-beta-20251204-152224-243ff54f",
51
51
  "@blocklet/error": "^0.3.3",
52
52
  "@blocklet/form-collector": "^0.1.8",
53
- "@blocklet/images": "1.17.4-beta-20251203-225234-75da41dd",
54
- "@blocklet/meta": "1.17.4-beta-20251203-225234-75da41dd",
55
- "@blocklet/resolver": "1.17.4-beta-20251203-225234-75da41dd",
56
- "@blocklet/server-js": "1.17.4-beta-20251203-225234-75da41dd",
57
- "@blocklet/store": "1.17.4-beta-20251203-225234-75da41dd",
53
+ "@blocklet/images": "1.17.4-beta-20251204-152224-243ff54f",
54
+ "@blocklet/meta": "1.17.4-beta-20251204-152224-243ff54f",
55
+ "@blocklet/resolver": "1.17.4-beta-20251204-152224-243ff54f",
56
+ "@blocklet/server-js": "1.17.4-beta-20251204-152224-243ff54f",
57
+ "@blocklet/store": "1.17.4-beta-20251204-152224-243ff54f",
58
58
  "@blocklet/theme-builder": "^0.4.8",
59
59
  "@ocap/client": "^1.27.12",
60
60
  "@ocap/mcrypto": "^1.27.12",
@@ -153,7 +153,7 @@
153
153
  "engines": {
154
154
  "node": ">=14"
155
155
  },
156
- "gitHead": "d9c14c9b2763e632d2cc8d818dcd288ab08046e7",
156
+ "gitHead": "090b2f960b834168dfa12b2a559b9256a98be312",
157
157
  "devDependencies": {
158
158
  "@types/fs-extra": "^11.0.4"
159
159
  }