@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.
- package/lib/blocklet/manager/disk.js +44 -15
- package/lib/blocklet/storage/backup/spaces.js +9 -6
- package/lib/event/auto-backup-handler.js +2 -1
- package/lib/event/index.js +14 -8
- package/lib/states/audit-log.js +4 -5
- package/lib/states/user.js +1 -1
- package/lib/util/log.js +3 -2
- package/lib/validators/user.js +1 -1
- package/package.json +21 -21
|
@@ -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
|
|
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
|
-
|
|
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
|
-
|
|
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', {
|
|
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
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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
|
-
|
|
39
|
+
// 自动备份立即执行的间隔时间暂定为 1 min
|
|
40
|
+
debouncedFuncs[id] = debounce(fn, 1000 * 60);
|
|
40
41
|
}
|
|
41
42
|
return debouncedFuncs[id];
|
|
42
43
|
}
|
package/lib/event/index.js
CHANGED
|
@@ -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
|
-
|
|
321
|
-
|
|
322
|
-
|
|
323
|
-
|
|
324
|
-
|
|
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({
|
package/lib/states/audit-log.js
CHANGED
|
@@ -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
|
|
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
|
-
|
|
144
|
-
|
|
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
|
package/lib/states/user.js
CHANGED
|
@@ -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(
|
|
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) {
|
package/lib/validators/user.js
CHANGED
|
@@ -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.
|
|
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-
|
|
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-
|
|
23
|
-
"@abtnode/auth": "1.16.19-beta-
|
|
24
|
-
"@abtnode/certificate-manager": "1.16.19-beta-
|
|
25
|
-
"@abtnode/constant": "1.16.19-beta-
|
|
26
|
-
"@abtnode/cron": "1.16.19-beta-
|
|
27
|
-
"@abtnode/logger": "1.16.19-beta-
|
|
28
|
-
"@abtnode/models": "1.16.19-beta-
|
|
29
|
-
"@abtnode/queue": "1.16.19-beta-
|
|
30
|
-
"@abtnode/rbac": "1.16.19-beta-
|
|
31
|
-
"@abtnode/router-provider": "1.16.19-beta-
|
|
32
|
-
"@abtnode/static-server": "1.16.19-beta-
|
|
33
|
-
"@abtnode/timemachine": "1.16.19-beta-
|
|
34
|
-
"@abtnode/util": "1.16.19-beta-
|
|
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-
|
|
46
|
-
"@blocklet/env": "1.16.19-beta-
|
|
47
|
-
"@blocklet/meta": "1.16.19-beta-
|
|
48
|
-
"@blocklet/resolver": "1.16.19-beta-
|
|
49
|
-
"@blocklet/sdk": "1.16.19-beta-
|
|
50
|
-
"@did-space/client": "^0.3.
|
|
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": "
|
|
104
|
+
"gitHead": "09b0172831521ef73f7879940b977c2696b5b247"
|
|
105
105
|
}
|