@abtnode/core 1.16.19-beta-e93c5bf3 → 1.16.19-beta-e6aac665

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.
@@ -27,6 +27,8 @@ const {
27
27
  MONITOR_RECORD_INTERVAL_SEC,
28
28
  INSTALL_ACTIONS,
29
29
  BACKUPS,
30
+ DEFAULT_DID_DOMAIN,
31
+ FEDERATED,
30
32
  } = require('@abtnode/constant');
31
33
 
32
34
  const getBlockletEngine = require('@blocklet/meta/lib/engine');
@@ -91,6 +93,7 @@ const pLimit = require('p-limit');
91
93
  const pRetry = require('p-retry');
92
94
 
93
95
  const isFunction = require('lodash/isFunction');
96
+ const { encode } = require('@abtnode/util/lib/base32');
94
97
  const { consumeServerlessNFT, consumeLauncherSession } = require('../../util/launcher');
95
98
  const util = require('../../util');
96
99
  const {
@@ -191,7 +194,6 @@ const { callFederated } = require('../../util/federated');
191
194
  const { formatEnvironments, getBlockletMeta, validateOwner, isCLI } = util;
192
195
 
193
196
  const statusLock = new Lock('blocklet-status-lock');
194
- const limitSync = pLimit(1);
195
197
 
196
198
  const getHooksOutputFiles = (blocklet) => ({
197
199
  output: blocklet.mode === BLOCKLET_MODES.DEVELOPMENT ? '' : path.join(blocklet.env.logsDir, 'output.log'),
@@ -2330,10 +2332,23 @@ class DiskBlockletManager extends BaseBlockletManager {
2330
2332
  */
2331
2333
  async _onBackupToSpaces({ did, context, backupState }) {
2332
2334
  const {
2333
- referrer,
2334
2335
  user: { did: userDid, locale },
2335
2336
  } = context;
2336
2337
 
2338
+ let { referrer } = context;
2339
+ if (isEmpty(referrer)) {
2340
+ // fixes: https://github.com/ArcBlock/did-spaces/issues/908, referrer 在某些情况下会不存在
2341
+ /**
2342
+ * @type {import('@abtnode/client').NodeState}
2343
+ */
2344
+ const node = await states.node.read();
2345
+ referrer = joinUrl(
2346
+ `https://${encode(node.did)}.${DEFAULT_DID_DOMAIN}`,
2347
+ node.routing.adminPath,
2348
+ `/blocklets/${did}/storage`
2349
+ );
2350
+ }
2351
+
2337
2352
  const blocklet = await states.blocklet.getBlocklet(did);
2338
2353
  const {
2339
2354
  appDid,
@@ -3403,9 +3418,8 @@ class DiskBlockletManager extends BaseBlockletManager {
3403
3418
  const { did } = data;
3404
3419
  const assetState = await util.getNFTState(data.controller.chainHost, data.controller.nftId);
3405
3420
  const isExpired = isNFTExpired(assetState);
3406
- const blocklet = await states.blocklet.getBlocklet(did);
3407
3421
 
3408
- if (isExpired && blocklet.status !== BlockletStatus.stopped) {
3422
+ if (isExpired) {
3409
3423
  const expiredAt = getNftExpirationDate(assetState);
3410
3424
  logger.info('the blocklet already expired and will be stopped', {
3411
3425
  blockletDid: did,
@@ -3413,7 +3427,13 @@ class DiskBlockletManager extends BaseBlockletManager {
3413
3427
  expiredAt,
3414
3428
  });
3415
3429
 
3416
- await this.stop({ did });
3430
+ // 如果 Blocklet 没停止, 先停止
3431
+ const blocklet = await states.blocklet.getBlocklet(did);
3432
+ if (blocklet.status !== BlockletStatus.stopped) {
3433
+ await this.stop({ did });
3434
+ logger.info('the expired blocklet is stopped', { did, blockletDid: did });
3435
+ }
3436
+
3417
3437
  await states.blockletExtras.updateByDid(did, {
3418
3438
  controller: {
3419
3439
  ...data.controller,
@@ -3424,11 +3444,6 @@ class DiskBlockletManager extends BaseBlockletManager {
3424
3444
  },
3425
3445
  });
3426
3446
  logger.info('the expired blocklet is stopped', { did });
3427
-
3428
- // 为了减小服务器压力,每次删除一个 blocklet 后,休息 10s
3429
- if (process.env.NODE_ENV !== 'test') {
3430
- await sleep(10 * 1000);
3431
- }
3432
3447
  }
3433
3448
  } catch (error) {
3434
3449
  logger.error('stop expired blocklet failed', {
@@ -3893,6 +3908,7 @@ class FederatedBlockletManager extends DiskBlockletManager {
3893
3908
  },
3894
3909
  masterAppUrl: masterSite.appUrl,
3895
3910
  });
3911
+ const limitSync = pLimit(FEDERATED.SYNC_LIMIT);
3896
3912
 
3897
3913
  const disbandQueue = federated.sites
3898
3914
  .filter((item) => item.appPid !== did)
@@ -4101,6 +4117,7 @@ class FederatedBlockletManager extends DiskBlockletManager {
4101
4117
 
4102
4118
  const nodeInfo = await states.node.read();
4103
4119
  const { permanentWallet } = getBlockletInfo(blocklet, nodeInfo.sk);
4120
+ const limitSync = pLimit(FEDERATED.SYNC_LIMIT);
4104
4121
 
4105
4122
  const waitingList = federated.sites
4106
4123
  .filter((item) => {
@@ -4115,22 +4132,34 @@ class FederatedBlockletManager extends DiskBlockletManager {
4115
4132
  }
4116
4133
  return false;
4117
4134
  })
4118
- .map((item) => {
4119
- return limitSync(async () => {
4135
+ .map(async (item) => {
4136
+ const resultItem = await limitSync(async () => {
4120
4137
  try {
4121
4138
  // NOTICE: 即使通知某个站点失败了,也不影响其他站点接收同步结果
4122
- await callFederated({
4139
+ const result = await callFederated({
4123
4140
  action: 'sync',
4124
4141
  permanentWallet,
4125
4142
  site: item,
4126
4143
  data: safeData,
4127
4144
  });
4145
+ return result;
4128
4146
  } catch (error) {
4129
- logger.warn('Failed to sync federated sites', { error, did, action: 'sync' });
4147
+ logger.warn('Failed to sync federated sites', {
4148
+ error,
4149
+ action: 'sync',
4150
+ site: item,
4151
+ data: safeData,
4152
+ });
4153
+ return null;
4130
4154
  }
4131
4155
  });
4156
+ return {
4157
+ site: item,
4158
+ result: resultItem,
4159
+ };
4132
4160
  });
4133
- await Promise.all(waitingList);
4161
+ const resultList = await Promise.all(waitingList);
4162
+ return resultList;
4134
4163
  }
4135
4164
 
4136
4165
  async loginFederated({ did, site, data }) {
@@ -40,6 +40,12 @@ const { RoutingRuleBackup } = require('./routing-rule');
40
40
  const { translate } = require('../../../locales');
41
41
  const { getFolderSize } = require('../utils/disk');
42
42
 
43
+ /**
44
+ * @param {{ appDid: string, appPid: string }} params
45
+ * @returns {{ appDid: string, meta: { did: string } }}
46
+ */
47
+ const getAppId = (params) => ({ appDid: params.appDid, meta: { did: params.appPid } });
48
+
43
49
  class SpacesBackup extends BaseBackup {
44
50
  /**
45
51
  *
@@ -168,8 +174,7 @@ class SpacesBackup extends BaseBackup {
168
174
 
169
175
  async export() {
170
176
  this.input.event.emit(BlockletEvents.backupProgress, {
171
- appDid: this.input.appDid,
172
- meta: { did: this.input.appPid },
177
+ ...getAppId(this.input),
173
178
  message: 'Preparing data for backup...',
174
179
  progress: 15,
175
180
  completed: false,
@@ -182,8 +187,7 @@ class SpacesBackup extends BaseBackup {
182
187
  this.syncObjects = await this.collectSyncObjects(this.dataBackup, this.storages);
183
188
 
184
189
  this.input.event.emit(BlockletEvents.backupProgress, {
185
- appDid: this.input.appDid,
186
- meta: { did: this.input.appPid },
190
+ ...getAppId(this.input),
187
191
  message: 'Data ready, start backup...',
188
192
  progress: 20,
189
193
  completed: false,
@@ -272,8 +276,7 @@ class SpacesBackup extends BaseBackup {
272
276
  message: progressMessage,
273
277
  });
274
278
  this.input.event.emit(BlockletEvents.backupProgress, {
275
- appDid: this.input.appDid,
276
- meta: { did: this.input.appDid },
279
+ ...getAppId(this.input),
277
280
  message: progressMessage,
278
281
  // 0.8 是因为上传文件到 spaces 占进度的 80%,+ 20 是因为需要累加之前的进度
279
282
  progress,
@@ -36,7 +36,8 @@ const debouncedFuncs = {};
36
36
  */
37
37
  function autoBackupHandlerFactory(id, fn) {
38
38
  if (!debouncedFuncs[id]) {
39
- debouncedFuncs[id] = debounce(fn, 3000);
39
+ // 自动备份立即执行的间隔时间暂定为 1 min
40
+ debouncedFuncs[id] = debounce(fn, 1000 * 60);
40
41
  }
41
42
  return debouncedFuncs[id];
42
43
  }
@@ -10,7 +10,7 @@ const {
10
10
  BlockletEvents,
11
11
  BlockletInternalEvents,
12
12
  } = require('@blocklet/constant');
13
- const { EVENTS } = require('@abtnode/constant');
13
+ const { EVENTS, BACKUPS } = require('@abtnode/constant');
14
14
  const { NodeMonitSender } = require('../monitor/node-monit-sender');
15
15
  const handleInstanceInStore = require('../util/public-to-store');
16
16
  const { isCLI } = require('../util');
@@ -27,7 +27,8 @@ const routingSnapshotPrefix = (blocklet) => (blocklet.mode === BLOCKLET_MODES.DE
27
27
  /**
28
28
  *
29
29
  * @param {{
30
- * blockletManager: import('../blocklet/manager/disk')
30
+ * blockletManager: import('../blocklet/manager/disk'),
31
+ * node: import('../index')
31
32
  * }} param0
32
33
  * @returns
33
34
  */
@@ -107,6 +108,10 @@ module.exports = ({
107
108
  safeData = wipeSensitiveData(cloneDeep(data));
108
109
  }
109
110
 
111
+ if (get(safeData, 'blocklet.meta.did', '')) {
112
+ safeData.blocklet = wipeSensitiveData(cloneDeep(safeData.blocklet));
113
+ }
114
+
110
115
  logger.debug('proxy event to event hub', { name });
111
116
  eventHub.broadcast(name, safeData);
112
117
  events.emit(name, safeData);
@@ -317,12 +322,13 @@ module.exports = ({
317
322
  strategy: payload.backup.strategy,
318
323
  };
319
324
 
320
- await node.createAuditLog({
321
- action: 'backupToSpaces',
322
- args,
323
- context: payload?.context ?? {},
324
- result: cloneDeep(blocklet),
325
- });
325
+ if (payload.backup.strategy === BACKUPS.STRATEGY.MANUAL) {
326
+ await node.createAuditLog({
327
+ action: 'backupToSpaces',
328
+ args,
329
+ context: payload?.context ?? {},
330
+ });
331
+ }
326
332
 
327
333
  if (payload?.progress !== 100) {
328
334
  await node.createNotification({
@@ -5,7 +5,7 @@ const get = require('lodash/get');
5
5
  const uniq = require('lodash/uniq');
6
6
  const joinUrl = require('url-join');
7
7
  const { getDisplayName } = require('@blocklet/meta/lib/util');
8
- const { BLOCKLET_SITE_GROUP_SUFFIX, NODE_SERVICES, BACKUPS } = require('@abtnode/constant');
8
+ const { BLOCKLET_SITE_GROUP_SUFFIX, NODE_SERVICES } = require('@abtnode/constant');
9
9
  const logger = require('@abtnode/logger')('@abtnode/core:states:audit-log');
10
10
 
11
11
  const BaseState = require('./base');
@@ -140,10 +140,8 @@ const getLogContent = async (action, args, context, result, info, node) => {
140
140
  // @see: core/state/lib/event.js#311
141
141
  case 'backupToSpaces':
142
142
  if (args?.success) {
143
- if (args.strategy === BACKUPS.STRATEGY.MANUAL) {
144
- return `Manual backup application to ${args.url} successfully:\n- Backup files have been stored [here](${args.backupUrl})`;
145
- }
146
- return `Automatic backup application to ${args.url} successfully:\n- Backup files have been stored [here](${args.backupUrl})`;
143
+ // @note: 目前只需要给出手动备份的审计日志,自动备份的审计日志不再显示出来
144
+ return `Manual backup application to ${args.url} successfully:\n- Backup files have been stored [here](${args.backupUrl})`;
147
145
  }
148
146
  return `Backup application to ${args.url} failed:\n- Reason: <span style='color:red'>${args.errorMessage}</span>`;
149
147
  case 'configPublicToStore':
@@ -200,6 +198,7 @@ const getLogContent = async (action, args, context, result, info, node) => {
200
198
  const syncData = {
201
199
  users: args.users,
202
200
  sites: args.sites,
201
+ userSessions: args.userSessions,
203
202
  };
204
203
  return `sync federated: site ${getSiteInfo(args.callerSite)} sync data:
205
204
  \`\`\`json
@@ -371,7 +371,7 @@ class User extends ExtendBase {
371
371
  }
372
372
  // update user, connectedAccount, passport
373
373
  updates.connectedAccounts = updateConnectedAccount(exist.connectedAccounts, user.connectedAccount);
374
- updated = await this.updateUser(user.did, updates);
374
+ updated = await this.updateUser(exist.did, updates);
375
375
  } else {
376
376
  // create user, connectedAccount, passport
377
377
  updates.did = user.did;
package/lib/util/log.js CHANGED
@@ -141,11 +141,12 @@ const getLogFiles = async ({ name, node }) => {
141
141
  if (name === 'blocklet-services') {
142
142
  const logDir = path.join(node.dataDirs.logs, '_abtnode');
143
143
  const info = path.join(logDir, 'service.log');
144
+ const error = path.join(logDir, 'service-error.log');
144
145
  const access = path.join(logDir, 'service.access.log');
145
146
  const stdout = path.join(logDir, 'service.stdout.log');
146
147
  const stderr = path.join(logDir, 'service.stderr.log');
147
- createFile({ info, access, stdout, stderr });
148
- return { info, access, stdout, stderr };
148
+ createFile({ error, info, access, stdout, stderr });
149
+ return { error, info, access, stdout, stderr };
149
150
  }
150
151
 
151
152
  if (name.indexOf('blocklet-') === 0) {
@@ -35,7 +35,7 @@ const loginSchema = Joi.object({
35
35
  remark: Joi.string().empty(''),
36
36
  lastLoginIp: Joi.string().empty(''),
37
37
  passport: passportSchema.optional(),
38
- sourceAppPid: Joi.string().empty(null),
38
+ sourceAppPid: Joi.DID().trim().empty(null),
39
39
  connectedAccount: Joi.alternatives()
40
40
  .try(connectedAccountSchema.required(), Joi.array().items(connectedAccountSchema).min(1).sparse(true))
41
41
  .required(),
package/package.json CHANGED
@@ -3,7 +3,7 @@
3
3
  "publishConfig": {
4
4
  "access": "public"
5
5
  },
6
- "version": "1.16.19-beta-e93c5bf3",
6
+ "version": "1.16.19-beta-e6aac665",
7
7
  "description": "",
8
8
  "main": "lib/index.js",
9
9
  "files": [
@@ -19,19 +19,19 @@
19
19
  "author": "wangshijun <wangshijun2010@gmail.com> (http://github.com/wangshijun)",
20
20
  "license": "Apache-2.0",
21
21
  "dependencies": {
22
- "@abtnode/analytics": "1.16.19-beta-e93c5bf3",
23
- "@abtnode/auth": "1.16.19-beta-e93c5bf3",
24
- "@abtnode/certificate-manager": "1.16.19-beta-e93c5bf3",
25
- "@abtnode/constant": "1.16.19-beta-e93c5bf3",
26
- "@abtnode/cron": "1.16.19-beta-e93c5bf3",
27
- "@abtnode/logger": "1.16.19-beta-e93c5bf3",
28
- "@abtnode/models": "1.16.19-beta-e93c5bf3",
29
- "@abtnode/queue": "1.16.19-beta-e93c5bf3",
30
- "@abtnode/rbac": "1.16.19-beta-e93c5bf3",
31
- "@abtnode/router-provider": "1.16.19-beta-e93c5bf3",
32
- "@abtnode/static-server": "1.16.19-beta-e93c5bf3",
33
- "@abtnode/timemachine": "1.16.19-beta-e93c5bf3",
34
- "@abtnode/util": "1.16.19-beta-e93c5bf3",
22
+ "@abtnode/analytics": "1.16.19-beta-e6aac665",
23
+ "@abtnode/auth": "1.16.19-beta-e6aac665",
24
+ "@abtnode/certificate-manager": "1.16.19-beta-e6aac665",
25
+ "@abtnode/constant": "1.16.19-beta-e6aac665",
26
+ "@abtnode/cron": "1.16.19-beta-e6aac665",
27
+ "@abtnode/logger": "1.16.19-beta-e6aac665",
28
+ "@abtnode/models": "1.16.19-beta-e6aac665",
29
+ "@abtnode/queue": "1.16.19-beta-e6aac665",
30
+ "@abtnode/rbac": "1.16.19-beta-e6aac665",
31
+ "@abtnode/router-provider": "1.16.19-beta-e6aac665",
32
+ "@abtnode/static-server": "1.16.19-beta-e6aac665",
33
+ "@abtnode/timemachine": "1.16.19-beta-e6aac665",
34
+ "@abtnode/util": "1.16.19-beta-e6aac665",
35
35
  "@arcblock/did": "1.18.95",
36
36
  "@arcblock/did-auth": "1.18.95",
37
37
  "@arcblock/did-ext": "^1.18.95",
@@ -42,12 +42,12 @@
42
42
  "@arcblock/pm2-events": "^0.0.5",
43
43
  "@arcblock/validator": "^1.18.95",
44
44
  "@arcblock/vc": "1.18.95",
45
- "@blocklet/constant": "1.16.19-beta-e93c5bf3",
46
- "@blocklet/env": "1.16.19-beta-e93c5bf3",
47
- "@blocklet/meta": "1.16.19-beta-e93c5bf3",
48
- "@blocklet/resolver": "1.16.19-beta-e93c5bf3",
49
- "@blocklet/sdk": "1.16.19-beta-e93c5bf3",
50
- "@did-space/client": "^0.3.25",
45
+ "@blocklet/constant": "1.16.19-beta-e6aac665",
46
+ "@blocklet/env": "1.16.19-beta-e6aac665",
47
+ "@blocklet/meta": "1.16.19-beta-e6aac665",
48
+ "@blocklet/resolver": "1.16.19-beta-e6aac665",
49
+ "@blocklet/sdk": "1.16.19-beta-e6aac665",
50
+ "@did-space/client": "^0.3.28",
51
51
  "@fidm/x509": "^1.2.1",
52
52
  "@ocap/mcrypto": "1.18.95",
53
53
  "@ocap/util": "1.18.95",
@@ -101,5 +101,5 @@
101
101
  "jest": "^27.5.1",
102
102
  "unzipper": "^0.10.11"
103
103
  },
104
- "gitHead": "c98ddc97776f05c267398b18010710afd7082409"
104
+ "gitHead": "09b0172831521ef73f7879940b977c2696b5b247"
105
105
  }