@blocklet/cli 1.16.53 → 1.16.54-beta-20251017-133309-7d40faa6

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 CHANGED
@@ -28,7 +28,7 @@ Powered By
28
28
  / ___ \| | | (__| |_) | | (_) | (__| <
29
29
  /_/ \_\_| \___|____/|_|\___/ \___|_|\_\
30
30
 
31
- Blocklet CLI v1.16.52
31
+ Blocklet CLI v1.16.53
32
32
 
33
33
  Usage: blocklet server [options] [command]
34
34
 
@@ -1,7 +1,32 @@
1
- const { printSuccess, printError } = require('../../util');
1
+ const { checkAndKillOrphanProcesses } = require('@abtnode/util/lib/pm2/check-orphan-processes');
2
+ const { DAEMON_SCRIPT_PATH, SERVICE_SCRIPT_PATH } = require('@abtnode/constant');
3
+
4
+ const { printSuccess, printError, printInfo, printWarning } = require('../../util');
2
5
  const { getNode } = require('../../node');
3
6
 
4
7
  exports.run = async ({ target }) => {
8
+ // Handle orphan-process cleanup without requiring node instance
9
+ if (target === 'orphan-process') {
10
+ printInfo('Checking for orphan daemon/service processes...');
11
+
12
+ const logger = {
13
+ info: (msg) => printInfo(msg),
14
+ warn: (msg) => printWarning(msg),
15
+ error: (msg) => printError(msg),
16
+ };
17
+
18
+ try {
19
+ await checkAndKillOrphanProcesses({ scriptName: DAEMON_SCRIPT_PATH, logger, force: true });
20
+ await checkAndKillOrphanProcesses({ scriptName: SERVICE_SCRIPT_PATH, logger, force: true });
21
+ printSuccess('Orphan process cleanup completed');
22
+ } catch (err) {
23
+ printError(`Failed to cleanup orphan processes: ${err.message}`);
24
+ process.exit(1);
25
+ }
26
+
27
+ process.exit(0);
28
+ }
29
+
5
30
  const { node } = await getNode({ dir: process.cwd() });
6
31
 
7
32
  node.onReady(async () => {
@@ -117,7 +117,7 @@ module.exports = (parentCommand = '') => {
117
117
  .command('cleanup')
118
118
  .option(
119
119
  '--target <target>',
120
- 'Which target to cleanup, available options: cache, maintenance-status, blacklist, blacklist-expired'
120
+ 'Which target to cleanup, available options: cache, maintenance-status, blacklist, blacklist-expired, orphan-process'
121
121
  )
122
122
  .description('Do some server level cleanup work')
123
123
  .action(parseOptions(cleanup.run));
@@ -35,6 +35,8 @@ const {
35
35
  NODE_MODES,
36
36
  MAX_NGINX_WORKER_CONNECTIONS,
37
37
  SERVER_STATUS,
38
+ ORPHAN_CHECK_DELAY,
39
+ PROCESS_NAME_ORPHAN_CLEANUP,
38
40
  } = require('@abtnode/constant');
39
41
 
40
42
  const { canUseFileSystemIsolateApi, SAFE_NODE_VERSION } = require('@abtnode/util/lib/security');
@@ -694,6 +696,41 @@ const exec = async ({ workingDir, config, dataDir, mode, updateDb, forceIntranet
694
696
 
695
697
  printAccessUrls(accessUrls);
696
698
 
699
+ // Schedule orphan process cleanup via PM2 (non-blocking)
700
+ try {
701
+ await pm2.connectAsync();
702
+
703
+ // Remove any existing cleanup process first
704
+ try {
705
+ await pm2.deleteAsync(PROCESS_NAME_ORPHAN_CLEANUP);
706
+ debug('Removed existing orphan cleanup process');
707
+ } catch (err) {
708
+ // Ignore if not exists
709
+ }
710
+
711
+ await pm2.startAsync({
712
+ name: PROCESS_NAME_ORPHAN_CLEANUP,
713
+ script: './lib/process/orphan-cleanup-worker.js',
714
+ cwd: getCliCwd(),
715
+ autorestart: false, // Don't restart after exit
716
+ max_restarts: 0, // Never restart
717
+ instances: 1,
718
+ env: {
719
+ ...process.env,
720
+ ORPHAN_CHECK_DELAY: ORPHAN_CHECK_DELAY.toString(),
721
+ ABT_NODE_LOG_DIR: logDir,
722
+ },
723
+ });
724
+
725
+ pm2.disconnect();
726
+ printInfo('Orphan cleanup worker started');
727
+ } catch (err) {
728
+ // Cleanup failure should not block server start
729
+ pm2.disconnect();
730
+ debug('Failed to start orphan cleanup worker:', err);
731
+ printWarning('Failed to start orphan cleanup worker');
732
+ }
733
+
697
734
  return resolve(0);
698
735
  } catch (err) {
699
736
  debug('start error', err);
@@ -125,5 +125,8 @@ node.onReady(async () => {
125
125
  } catch {
126
126
  // Do nothing
127
127
  }
128
+ if (process.env.NODE_ENV !== 'test') {
129
+ node.migrateAuditLog(dataDir);
130
+ }
128
131
  });
129
132
  });
@@ -0,0 +1,71 @@
1
+ #!/usr/bin/env node
2
+ /* eslint-disable no-console */
3
+
4
+ /**
5
+ * Orphan process cleanup worker (PM2 managed)
6
+ *
7
+ * This script runs as a PM2 process after server starts to clean up orphan daemon/service processes.
8
+ * It will automatically remove itself from PM2 after completion.
9
+ */
10
+
11
+ const { checkAndKillOrphanProcesses } = require('@abtnode/util/lib/pm2/check-orphan-processes');
12
+ const pm2 = require('@abtnode/util/lib/pm2/async-pm2');
13
+ const Logger = require('@abtnode/logger');
14
+ const {
15
+ PROCESS_NAME_ORPHAN_CLEANUP,
16
+ DAEMON_SCRIPT_PATH,
17
+ SERVICE_SCRIPT_PATH,
18
+ ORPHAN_CHECK_DELAY: DEFAULT_ORPHAN_CHECK_DELAY,
19
+ } = require('@abtnode/constant');
20
+
21
+ const logger = Logger('orphan-cleanup-worker', { filename: 'orphan-cleanup-worker' });
22
+
23
+ const ORPHAN_CHECK_DELAY = parseInt(process.env.ORPHAN_CHECK_DELAY || DEFAULT_ORPHAN_CHECK_DELAY, 10);
24
+
25
+ logger.info(`Orphan cleanup worker started, will check after ${ORPHAN_CHECK_DELAY}ms`);
26
+
27
+ setTimeout(async () => {
28
+ try {
29
+ // Cleanup daemon.js orphans
30
+ await checkAndKillOrphanProcesses({
31
+ scriptName: DAEMON_SCRIPT_PATH,
32
+ logger,
33
+ force: true, // Force mode to work from any PM2 context
34
+ });
35
+
36
+ // Cleanup service.js orphans
37
+ await checkAndKillOrphanProcesses({
38
+ scriptName: SERVICE_SCRIPT_PATH,
39
+ logger,
40
+ force: true,
41
+ });
42
+
43
+ logger.info('Orphan cleanup completed successfully');
44
+ } catch (error) {
45
+ logger.error(`Orphan cleanup failed: ${error.message}`);
46
+ } finally {
47
+ // Remove self from PM2 after cleanup to avoid record clutter
48
+ try {
49
+ await pm2.connectAsync();
50
+ logger.info('Removing cleanup process from PM2...');
51
+ await pm2.deleteAsync(PROCESS_NAME_ORPHAN_CLEANUP);
52
+ logger.info('Cleanup process removed from PM2 successfully');
53
+ } catch (err) {
54
+ logger.warn(`Failed to remove cleanup process from PM2: ${err.message}`);
55
+ } finally {
56
+ pm2.disconnect();
57
+ process.exit(0);
58
+ }
59
+ }
60
+ }, ORPHAN_CHECK_DELAY);
61
+
62
+ // Handle termination signals gracefully
63
+ process.on('SIGINT', () => {
64
+ logger.info('Orphan cleanup worker received SIGINT, exiting');
65
+ process.exit(0);
66
+ });
67
+
68
+ process.on('SIGTERM', () => {
69
+ logger.info('Orphan cleanup worker received SIGTERM, exiting');
70
+ process.exit(0);
71
+ });
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@blocklet/cli",
3
- "version": "1.16.53",
3
+ "version": "1.16.54-beta-20251017-133309-7d40faa6",
4
4
  "description": "Command line tools to manage Blocklet Server",
5
5
  "homepage": "https://www.arcblock.io/docs/blocklet-cli",
6
6
  "bin": {
@@ -35,28 +35,28 @@
35
35
  "url": "https://github.com/ArcBlock/blocklet-server/issues"
36
36
  },
37
37
  "dependencies": {
38
- "@abtnode/blocklet-services": "1.16.53",
39
- "@abtnode/constant": "1.16.53",
40
- "@abtnode/core": "1.16.53",
41
- "@abtnode/db-cache": "1.16.53",
42
- "@abtnode/logger": "1.16.53",
43
- "@abtnode/models": "1.16.53",
44
- "@abtnode/router-provider": "1.16.53",
45
- "@abtnode/util": "1.16.53",
46
- "@abtnode/webapp": "1.16.53",
38
+ "@abtnode/blocklet-services": "1.16.54-beta-20251017-133309-7d40faa6",
39
+ "@abtnode/constant": "1.16.54-beta-20251017-133309-7d40faa6",
40
+ "@abtnode/core": "1.16.54-beta-20251017-133309-7d40faa6",
41
+ "@abtnode/db-cache": "1.16.54-beta-20251017-133309-7d40faa6",
42
+ "@abtnode/logger": "1.16.54-beta-20251017-133309-7d40faa6",
43
+ "@abtnode/models": "1.16.54-beta-20251017-133309-7d40faa6",
44
+ "@abtnode/router-provider": "1.16.54-beta-20251017-133309-7d40faa6",
45
+ "@abtnode/util": "1.16.54-beta-20251017-133309-7d40faa6",
46
+ "@abtnode/webapp": "1.16.54-beta-20251017-133309-7d40faa6",
47
47
  "@arcblock/did": "1.25.6",
48
48
  "@arcblock/event-hub": "1.25.6",
49
49
  "@arcblock/ipfs-only-hash": "^0.0.2",
50
50
  "@arcblock/jwt": "1.25.6",
51
51
  "@arcblock/ws": "1.25.6",
52
- "@blocklet/constant": "1.16.53",
52
+ "@blocklet/constant": "1.16.54-beta-20251017-133309-7d40faa6",
53
53
  "@blocklet/error": "^0.2.5",
54
54
  "@blocklet/form-collector": "^0.1.8",
55
- "@blocklet/images": "1.16.53",
56
- "@blocklet/meta": "1.16.53",
57
- "@blocklet/resolver": "1.16.53",
58
- "@blocklet/server-js": "1.16.53",
59
- "@blocklet/store": "1.16.53",
55
+ "@blocklet/images": "1.16.54-beta-20251017-133309-7d40faa6",
56
+ "@blocklet/meta": "1.16.54-beta-20251017-133309-7d40faa6",
57
+ "@blocklet/resolver": "1.16.54-beta-20251017-133309-7d40faa6",
58
+ "@blocklet/server-js": "1.16.54-beta-20251017-133309-7d40faa6",
59
+ "@blocklet/store": "1.16.54-beta-20251017-133309-7d40faa6",
60
60
  "@blocklet/theme-builder": "^0.4.7",
61
61
  "@ocap/client": "1.25.6",
62
62
  "@ocap/mcrypto": "1.25.6",
@@ -154,7 +154,7 @@
154
154
  "engines": {
155
155
  "node": ">=14"
156
156
  },
157
- "gitHead": "7c37a9bd063192fb0a14921b9d0317de953016ff",
157
+ "gitHead": "78c11632ed47a75502a20c257568fc9e1655ca05",
158
158
  "devDependencies": {
159
159
  "@types/fs-extra": "^11.0.4",
160
160
  "@types/jest": "^29.5.13"