@abtnode/core 1.15.17 → 1.16.0-beta-8ee536d7

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 (119) hide show
  1. package/lib/api/node.js +67 -69
  2. package/lib/api/team.js +386 -55
  3. package/lib/blocklet/downloader/blocklet-downloader.js +226 -0
  4. package/lib/blocklet/downloader/bundle-downloader.js +272 -0
  5. package/lib/blocklet/downloader/constants.js +3 -0
  6. package/lib/blocklet/downloader/resolve-download.js +199 -0
  7. package/lib/blocklet/extras.js +83 -26
  8. package/lib/blocklet/hooks.js +18 -65
  9. package/lib/blocklet/manager/base.js +10 -16
  10. package/lib/blocklet/manager/disk.js +1680 -1566
  11. package/lib/blocklet/manager/helper/install-application-from-backup.js +177 -0
  12. package/lib/blocklet/manager/helper/install-application-from-dev.js +94 -0
  13. package/lib/blocklet/manager/helper/install-application-from-general.js +188 -0
  14. package/lib/blocklet/manager/helper/install-component-from-dev.js +84 -0
  15. package/lib/blocklet/manager/helper/install-component-from-upload.js +181 -0
  16. package/lib/blocklet/manager/helper/install-component-from-url.js +173 -0
  17. package/lib/blocklet/manager/helper/migrate-application-to-struct-v2.js +450 -0
  18. package/lib/blocklet/manager/helper/rollback-cache.js +41 -0
  19. package/lib/blocklet/manager/helper/upgrade-components.js +152 -0
  20. package/lib/blocklet/migration.js +30 -52
  21. package/lib/blocklet/storage/backup/audit-log.js +27 -0
  22. package/lib/blocklet/storage/backup/base.js +62 -0
  23. package/lib/blocklet/storage/backup/blocklet-extras.js +92 -0
  24. package/lib/blocklet/storage/backup/blocklet.js +70 -0
  25. package/lib/blocklet/storage/backup/blocklets.js +74 -0
  26. package/lib/blocklet/storage/backup/data.js +19 -0
  27. package/lib/blocklet/storage/backup/logs.js +24 -0
  28. package/lib/blocklet/storage/backup/routing-rule.js +19 -0
  29. package/lib/blocklet/storage/backup/spaces.js +240 -0
  30. package/lib/blocklet/storage/restore/base.js +67 -0
  31. package/lib/blocklet/storage/restore/blocklet-extras.js +86 -0
  32. package/lib/blocklet/storage/restore/blocklet.js +56 -0
  33. package/lib/blocklet/storage/restore/blocklets.js +43 -0
  34. package/lib/blocklet/storage/restore/logs.js +21 -0
  35. package/lib/blocklet/storage/restore/spaces.js +156 -0
  36. package/lib/blocklet/storage/utils/hash.js +51 -0
  37. package/lib/blocklet/storage/utils/zip.js +43 -0
  38. package/lib/cert.js +206 -0
  39. package/lib/event.js +237 -64
  40. package/lib/index.js +191 -83
  41. package/lib/migrations/1.0.21-update-config.js +1 -1
  42. package/lib/migrations/1.0.22-max-memory.js +1 -1
  43. package/lib/migrations/1.0.25.js +1 -1
  44. package/lib/migrations/1.0.32-update-config.js +1 -1
  45. package/lib/migrations/1.0.33-blocklets.js +1 -1
  46. package/lib/migrations/1.5.20-registry.js +15 -0
  47. package/lib/migrations/1.6.17-blocklet-children.js +48 -0
  48. package/lib/migrations/1.6.21-rename-ip-echo-domain.js +35 -0
  49. package/lib/migrations/1.6.4-security.js +59 -0
  50. package/lib/migrations/1.6.5-security.js +60 -0
  51. package/lib/migrations/1.6.9-update-node-info-and-certificate.js +38 -0
  52. package/lib/migrations/1.7.1-blocklet-setup.js +18 -0
  53. package/lib/migrations/1.7.12-blocklet-meta.js +51 -0
  54. package/lib/migrations/1.7.15-blocklet-bundle-source.js +42 -0
  55. package/lib/migrations/1.7.20-blocklet-component.js +41 -0
  56. package/lib/migrations/1.8.33-blocklet-mem-limit.js +20 -0
  57. package/lib/migrations/README.md +1 -1
  58. package/lib/migrations/index.js +6 -2
  59. package/lib/monitor/blocklet-runtime-monitor.js +200 -0
  60. package/lib/monitor/get-history-list.js +37 -0
  61. package/lib/monitor/node-runtime-monitor.js +228 -0
  62. package/lib/router/helper.js +576 -500
  63. package/lib/router/index.js +85 -21
  64. package/lib/router/manager.js +146 -187
  65. package/lib/states/README.md +36 -1
  66. package/lib/states/access-key.js +39 -17
  67. package/lib/states/audit-log.js +462 -0
  68. package/lib/states/base.js +4 -213
  69. package/lib/states/blocklet-extras.js +195 -138
  70. package/lib/states/blocklet.js +371 -110
  71. package/lib/states/cache.js +8 -6
  72. package/lib/states/challenge.js +5 -5
  73. package/lib/states/index.js +19 -36
  74. package/lib/states/migration.js +4 -4
  75. package/lib/states/node.js +135 -46
  76. package/lib/states/notification.js +22 -35
  77. package/lib/states/session.js +17 -9
  78. package/lib/states/site.js +50 -25
  79. package/lib/states/user.js +74 -20
  80. package/lib/states/webhook.js +10 -6
  81. package/lib/team/manager.js +124 -7
  82. package/lib/util/blocklet.js +1223 -246
  83. package/lib/util/chain.js +1 -1
  84. package/lib/util/default-node-config.js +5 -23
  85. package/lib/util/disk-monitor.js +13 -10
  86. package/lib/util/domain-status.js +84 -15
  87. package/lib/util/get-accessible-external-node-ip.js +2 -2
  88. package/lib/util/get-domain-for-blocklet.js +13 -0
  89. package/lib/util/get-meta-from-url.js +33 -0
  90. package/lib/util/index.js +207 -272
  91. package/lib/util/ip.js +6 -0
  92. package/lib/util/maintain.js +233 -0
  93. package/lib/util/public-to-store.js +85 -0
  94. package/lib/util/ready.js +1 -1
  95. package/lib/util/requirement.js +28 -9
  96. package/lib/util/reset-node.js +22 -7
  97. package/lib/util/router.js +13 -0
  98. package/lib/util/rpc.js +16 -0
  99. package/lib/util/store.js +179 -0
  100. package/lib/util/sysinfo.js +44 -0
  101. package/lib/util/ua.js +54 -0
  102. package/lib/validators/blocklet-extra.js +24 -0
  103. package/lib/validators/node.js +25 -12
  104. package/lib/validators/permission.js +16 -1
  105. package/lib/validators/role.js +17 -3
  106. package/lib/validators/router.js +40 -20
  107. package/lib/validators/trusted-passport.js +1 -0
  108. package/lib/validators/util.js +22 -5
  109. package/lib/webhook/index.js +45 -35
  110. package/lib/webhook/sender/index.js +5 -0
  111. package/lib/webhook/sender/slack/index.js +1 -1
  112. package/lib/webhook/sender/wallet/index.js +48 -0
  113. package/package.json +54 -36
  114. package/lib/blocklet/registry.js +0 -205
  115. package/lib/states/https-cert.js +0 -67
  116. package/lib/util/get-ip-dns-domain-for-blocklet.js +0 -19
  117. package/lib/util/service.js +0 -66
  118. package/lib/util/upgrade.js +0 -178
  119. /package/lib/{queue.js → util/queue.js} +0 -0
@@ -0,0 +1,228 @@
1
+ const EventEmitter = require('events');
2
+ const pick = require('lodash/pick');
3
+ const cloneDeep = require('lodash/cloneDeep');
4
+
5
+ const { PROCESS_NAME_DAEMON, PROCESS_NAME_PROXY, PROCESS_NAME_SERVICE, EVENTS } = require('@abtnode/constant');
6
+ const defaultLogger = require('@abtnode/logger')('@abtnode/util:node-runtime-info');
7
+ const pm2 = require('@abtnode/util/lib/async-pm2');
8
+
9
+ const { getSysInfo } = require('../util/sysinfo');
10
+
11
+ const getProcessInfo = (processId, { returnList } = {}) =>
12
+ new Promise((resolve, reject) => {
13
+ pm2.describe(processId, (err, infos) => {
14
+ if (err) {
15
+ return reject(err);
16
+ }
17
+
18
+ if (!infos || !infos[0]) {
19
+ return resolve(null);
20
+ }
21
+
22
+ if (returnList) {
23
+ return resolve(infos);
24
+ }
25
+
26
+ return resolve(infos[0]);
27
+ });
28
+ });
29
+
30
+ // type RuntimeInfo = {
31
+ // pid: number;
32
+ // uptime: number;
33
+ // memoryUsage: number;
34
+ // cpuUsage: number;
35
+ // status: string;
36
+ // };
37
+
38
+ // type ServiceRuntimeInfo = RuntimeInfo & {
39
+ // instanceCount: number;
40
+ // };
41
+
42
+ // type NodeHistoryItem = {
43
+ // date: number;
44
+ // cpu: number;
45
+ // mem: number;
46
+ // daemonMem: number;
47
+ // serviceMem: number;
48
+ // dbMem: number;
49
+ // };
50
+
51
+ // type History = Array<NodeHistoryItem>;
52
+
53
+ // type Realtime = {
54
+ // cpu: {};
55
+ // mem: {};
56
+ // os: {};
57
+ // disks: [];
58
+ // daemon: RuntimeInfo
59
+ // service: ServiceRuntimeInfo
60
+ // db: RuntimeInfo
61
+
62
+ // type MonitorData = {
63
+ // realtime: Realtime;
64
+ // history: History;
65
+ // }
66
+
67
+ const DEFAULT_DATA = {
68
+ realtime: {
69
+ cpu: {},
70
+ mem: {},
71
+ os: {},
72
+ disks: [],
73
+ daemon: {},
74
+ service: {},
75
+ db: {},
76
+ },
77
+ history: [],
78
+ };
79
+
80
+ class NodeRuntimeMonitor extends EventEmitter {
81
+ constructor({ historyLength = 100, logger = defaultLogger } = {}) {
82
+ super();
83
+
84
+ /**
85
+ * private
86
+ */
87
+ this.historyLength = historyLength;
88
+ this.logger = logger;
89
+ this.data = cloneDeep(DEFAULT_DATA);
90
+ this.inProgress = false;
91
+ }
92
+
93
+ emitRealtimeData() {
94
+ this.emit(EVENTS.NODE_RUNTIME_INFO, this.getRealtimeData());
95
+ }
96
+
97
+ getRealtimeData() {
98
+ return this.data.realtime;
99
+ }
100
+
101
+ getHistory() {
102
+ return this.data.history;
103
+ }
104
+
105
+ async monit() {
106
+ if (this.inProgress) {
107
+ this.logger.error('monitoring is in progress');
108
+ return;
109
+ }
110
+
111
+ this.inProgress = true;
112
+
113
+ const date = Date.now();
114
+ await Promise.allSettled([
115
+ getSysInfo().catch((error) => {
116
+ this.logger.error(`failed to getSysInfo: ${error.message}`);
117
+ }),
118
+ getProcessInfo(PROCESS_NAME_SERVICE, { returnList: true }).catch((error) => {
119
+ this.logger.error(`failed to get blocklet-service info: ${error.message}`);
120
+ }),
121
+ process.env.NODE_ENV !== 'development'
122
+ ? getProcessInfo(PROCESS_NAME_DAEMON).catch((error) => {
123
+ this.logger.error(`failed to get daemon info: ${error.message}`);
124
+ })
125
+ : Promise.resolve(),
126
+ process.env.NODE_ENV !== 'development'
127
+ ? getProcessInfo(PROCESS_NAME_PROXY).catch((error) => {
128
+ this.logger.error(`failed to get db info: ${error.message}`);
129
+ })
130
+ : Promise.resolve(),
131
+ ])
132
+ .then(([{ value: sysInfo }, { value: serviceInfos }, { value: daemonInfo }, { value: dbInfo }]) => {
133
+ this.inProgress = false;
134
+
135
+ const historyItem = {
136
+ date,
137
+ cpu: 0,
138
+ mem: 0,
139
+ daemonMem: 0,
140
+ serviceMem: 0,
141
+ dbMem: 0,
142
+ };
143
+
144
+ if (sysInfo) {
145
+ Object.assign(this.data.realtime, pick(sysInfo, ['cpu', 'mem', 'os', 'disks']));
146
+
147
+ historyItem.cpu = Number(sysInfo.cpu.currentLoad.toFixed(2));
148
+ historyItem.mem = sysInfo.mem.total - sysInfo.mem.available;
149
+ }
150
+
151
+ if (serviceInfos) {
152
+ const [proc] = serviceInfos;
153
+
154
+ const runtimeInfo = {
155
+ pid: proc.pid,
156
+ uptime: proc.pm2_env ? +new Date() - Number(proc.pm2_env.pm_uptime) : 0,
157
+ // FIXME: 将 services 进程聚合在一起不利于排查问题
158
+ memoryUsage: serviceInfos.reduce((total, info) => total + info.monit.memory, 0),
159
+ cpuUsage: serviceInfos.reduce((total, info) => total + info.monit.cpu, 0),
160
+ status: proc.pm2_env ? proc.pm2_env.status : null,
161
+ instanceCount: serviceInfos.length,
162
+ };
163
+
164
+ this.data.realtime.service = runtimeInfo;
165
+
166
+ historyItem.serviceMem = runtimeInfo.memoryUsage;
167
+ } else {
168
+ this.data.realtime.service = {};
169
+ }
170
+
171
+ if (daemonInfo) {
172
+ const proc = daemonInfo;
173
+
174
+ const runtimeInfo = {
175
+ pid: proc.pid,
176
+ uptime: proc.pm2_env ? +new Date() - Number(proc.pm2_env.pm_uptime) : 0,
177
+ memoryUsage: proc.monit.memory,
178
+ cpuUsage: proc.monit.cpu,
179
+ status: proc.pm2_env ? proc.pm2_env.status : null,
180
+ };
181
+
182
+ this.data.realtime.daemon = runtimeInfo;
183
+
184
+ historyItem.daemonMem = runtimeInfo.memoryUsage;
185
+ } else {
186
+ this.data.realtime.daemon = {};
187
+ }
188
+
189
+ if (dbInfo) {
190
+ const proc = dbInfo;
191
+
192
+ const runtimeInfo = {
193
+ pid: proc.pid,
194
+ uptime: proc.pm2_env ? +new Date() - Number(proc.pm2_env.pm_uptime) : 0,
195
+ memoryUsage: proc.monit.memory,
196
+ cpuUsage: proc.monit.cpu,
197
+ status: proc.pm2_env ? proc.pm2_env.status : null,
198
+ };
199
+
200
+ this.data.realtime.db = runtimeInfo;
201
+
202
+ historyItem.dbMem = runtimeInfo.memoryUsage;
203
+ } else {
204
+ this.data.realtime.db = {};
205
+ }
206
+
207
+ this.logger.info('server runtime info', historyItem);
208
+
209
+ this._push(historyItem);
210
+
211
+ this.emitRealtimeData();
212
+ })
213
+ .catch((err) => {
214
+ this.inProgress = false;
215
+ this.logger.error(err.message);
216
+ });
217
+ }
218
+
219
+ _push(value) {
220
+ const arr = this.data.history;
221
+ arr.push(value);
222
+ if (arr.length > this.historyLength) {
223
+ arr.shift();
224
+ }
225
+ }
226
+ }
227
+
228
+ module.exports.NodeRuntimeMonitor = NodeRuntimeMonitor;