@abtnode/core 1.16.17-beta-5d4664f8 → 1.16.17-beta-ce49fe0e
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 +118 -54
- package/lib/blocklet/storage/backup/blocklet.js +1 -0
- package/lib/event.js +42 -0
- package/lib/index.js +5 -0
- package/lib/states/audit-log.js +7 -3
- package/lib/states/index.js +8 -1
- package/package.json +20 -20
|
@@ -27,6 +27,7 @@ const {
|
|
|
27
27
|
BLOCKLET_CACHE_TTL,
|
|
28
28
|
MONITOR_RECORD_INTERVAL_SEC,
|
|
29
29
|
INSTALL_ACTIONS,
|
|
30
|
+
BACKUPS,
|
|
30
31
|
} = require('@abtnode/constant');
|
|
31
32
|
|
|
32
33
|
const getBlockletEngine = require('@blocklet/meta/lib/engine');
|
|
@@ -211,6 +212,9 @@ class DiskBlockletManager extends BaseBlockletManager {
|
|
|
211
212
|
this.installDir = dataDirs.blocklets;
|
|
212
213
|
this.startQueue = startQueue;
|
|
213
214
|
this.installQueue = installQueue;
|
|
215
|
+
/**
|
|
216
|
+
* @type {ReturnType<import('@abtnode/queue')>}
|
|
217
|
+
*/
|
|
214
218
|
this.backupQueue = backupQueue;
|
|
215
219
|
this.restoreQueue = restoreQueue;
|
|
216
220
|
this.teamManager = teamManager;
|
|
@@ -979,6 +983,7 @@ class DiskBlockletManager extends BaseBlockletManager {
|
|
|
979
983
|
this.emit(BlockletEvents.componentRemoved, {
|
|
980
984
|
...app,
|
|
981
985
|
componentDids: [child.meta.did],
|
|
986
|
+
context,
|
|
982
987
|
});
|
|
983
988
|
|
|
984
989
|
this.emit(BlockletInternalEvents.componentRemoved, {
|
|
@@ -1281,7 +1286,7 @@ class DiskBlockletManager extends BaseBlockletManager {
|
|
|
1281
1286
|
this.configSynchronizer.throttledSyncAppConfig(blocklet.meta.did);
|
|
1282
1287
|
}
|
|
1283
1288
|
|
|
1284
|
-
this.emit(BlockletEvents.updated, newState);
|
|
1289
|
+
this.emit(BlockletEvents.updated, { ...newState, context });
|
|
1285
1290
|
const serverSk = (await states.node.read()).sk;
|
|
1286
1291
|
if (childDid) {
|
|
1287
1292
|
const configs = JSON.stringify(newConfigs.map((x) => ({ key: x.key, value: x.value })));
|
|
@@ -1310,7 +1315,7 @@ class DiskBlockletManager extends BaseBlockletManager {
|
|
|
1310
1315
|
return newState;
|
|
1311
1316
|
}
|
|
1312
1317
|
|
|
1313
|
-
async configNavigations({ did, navigations = [] }) {
|
|
1318
|
+
async configNavigations({ did, navigations = [] }, context) {
|
|
1314
1319
|
if (!Array.isArray(navigations)) {
|
|
1315
1320
|
throw new Error('navigations is not an array');
|
|
1316
1321
|
}
|
|
@@ -1318,11 +1323,11 @@ class DiskBlockletManager extends BaseBlockletManager {
|
|
|
1318
1323
|
|
|
1319
1324
|
const newState = await this.getBlocklet(did);
|
|
1320
1325
|
this.emit(BlockletInternalEvents.appSettingChanged, { appDid: did });
|
|
1321
|
-
this.emit(BlockletEvents.updated, newState);
|
|
1326
|
+
this.emit(BlockletEvents.updated, { ...newState, context });
|
|
1322
1327
|
return newState;
|
|
1323
1328
|
}
|
|
1324
1329
|
|
|
1325
|
-
async updateWhoCanAccess({ did, whoCanAccess }) {
|
|
1330
|
+
async updateWhoCanAccess({ did, whoCanAccess }, context) {
|
|
1326
1331
|
const dids = Array.isArray(did) ? did : [did];
|
|
1327
1332
|
|
|
1328
1333
|
const [rootDid] = dids;
|
|
@@ -1371,22 +1376,22 @@ class DiskBlockletManager extends BaseBlockletManager {
|
|
|
1371
1376
|
|
|
1372
1377
|
const blocklet = await this.getBlocklet(rootDid);
|
|
1373
1378
|
this.emit(BlockletInternalEvents.appSettingChanged, { appDid: did });
|
|
1374
|
-
this.emit(BlockletEvents.updated, { meta: { did: blocklet.meta.did } });
|
|
1379
|
+
this.emit(BlockletEvents.updated, { meta: { did: blocklet.meta.did }, context });
|
|
1375
1380
|
|
|
1376
1381
|
return blocklet;
|
|
1377
1382
|
}
|
|
1378
1383
|
|
|
1379
|
-
async configOAuth({ did, oauth = {} }) {
|
|
1384
|
+
async configOAuth({ did, oauth = {} }, context) {
|
|
1380
1385
|
const oldOAuth = await states.blockletExtras.getSettings(did, 'oauth', {});
|
|
1381
1386
|
const mergeConfig = { ...oldOAuth, ...JSON.parse(oauth) };
|
|
1382
1387
|
await states.blockletExtras.setSettings(did, { oauth: mergeConfig });
|
|
1383
1388
|
const newState = await this.getBlocklet(did);
|
|
1384
1389
|
this.emit(BlockletInternalEvents.appSettingChanged, { appDid: did });
|
|
1385
|
-
this.emit(BlockletEvents.updated, newState);
|
|
1390
|
+
this.emit(BlockletEvents.updated, { ...newState, context });
|
|
1386
1391
|
return newState;
|
|
1387
1392
|
}
|
|
1388
1393
|
|
|
1389
|
-
async configNotification({ did, notification = {} }) {
|
|
1394
|
+
async configNotification({ did, notification = {} }, context) {
|
|
1390
1395
|
let newConfig = {};
|
|
1391
1396
|
try {
|
|
1392
1397
|
newConfig = JSON.parse(notification);
|
|
@@ -1410,14 +1415,14 @@ class DiskBlockletManager extends BaseBlockletManager {
|
|
|
1410
1415
|
await states.blockletExtras.setSettings(did, { notification: mergeConfig });
|
|
1411
1416
|
const newState = await this.getBlocklet(did);
|
|
1412
1417
|
this.emit(BlockletInternalEvents.appSettingChanged, { appDid: did });
|
|
1413
|
-
this.emit(BlockletEvents.updated, newState);
|
|
1418
|
+
this.emit(BlockletEvents.updated, { ...newState, context });
|
|
1414
1419
|
return newState;
|
|
1415
1420
|
}
|
|
1416
1421
|
|
|
1417
1422
|
// -------------------------------------
|
|
1418
1423
|
|
|
1419
1424
|
// TODO: this method can be removed if title is not changed anymore
|
|
1420
|
-
async updateComponentTitle({ did, rootDid: inputRootDid, title }) {
|
|
1425
|
+
async updateComponentTitle({ did, rootDid: inputRootDid, title }, context) {
|
|
1421
1426
|
await titleSchema.validateAsync(title);
|
|
1422
1427
|
|
|
1423
1428
|
const blocklet = await states.blocklet.getBlocklet(inputRootDid);
|
|
@@ -1440,7 +1445,7 @@ class DiskBlockletManager extends BaseBlockletManager {
|
|
|
1440
1445
|
|
|
1441
1446
|
// trigger meta.js refresh
|
|
1442
1447
|
// trigger dashboard frontend refresh
|
|
1443
|
-
this.emit(BlockletEvents.updated, blocklet);
|
|
1448
|
+
this.emit(BlockletEvents.updated, { ...blocklet, context });
|
|
1444
1449
|
|
|
1445
1450
|
return this.getBlocklet(rootDid);
|
|
1446
1451
|
}
|
|
@@ -1488,7 +1493,7 @@ class DiskBlockletManager extends BaseBlockletManager {
|
|
|
1488
1493
|
return this.getBlocklet(rootDid);
|
|
1489
1494
|
}
|
|
1490
1495
|
|
|
1491
|
-
async updateAppSessionConfig({ did, config }) {
|
|
1496
|
+
async updateAppSessionConfig({ did, config }, context) {
|
|
1492
1497
|
const validateConfig = await sessionConfigSchema.validateAsync(config);
|
|
1493
1498
|
|
|
1494
1499
|
const blocklet = await this.getBlocklet(did);
|
|
@@ -1512,7 +1517,7 @@ class DiskBlockletManager extends BaseBlockletManager {
|
|
|
1512
1517
|
this.emit(BlockletInternalEvents.appSettingChanged, { appDid: did });
|
|
1513
1518
|
|
|
1514
1519
|
const newState = await this.getBlocklet(did);
|
|
1515
|
-
this.emit(BlockletEvents.updated, newState);
|
|
1520
|
+
this.emit(BlockletEvents.updated, { ...newState, context });
|
|
1516
1521
|
|
|
1517
1522
|
return newState;
|
|
1518
1523
|
}
|
|
@@ -1548,7 +1553,7 @@ class DiskBlockletManager extends BaseBlockletManager {
|
|
|
1548
1553
|
return states.blocklet.hasBlocklet(did);
|
|
1549
1554
|
}
|
|
1550
1555
|
|
|
1551
|
-
async setInitialized({ did, owner }) {
|
|
1556
|
+
async setInitialized({ did, owner }, context) {
|
|
1552
1557
|
if (!validateOwner(owner)) {
|
|
1553
1558
|
throw new Error('Blocklet owner is invalid');
|
|
1554
1559
|
}
|
|
@@ -1557,12 +1562,12 @@ class DiskBlockletManager extends BaseBlockletManager {
|
|
|
1557
1562
|
await states.blockletExtras.setSettings(blocklet.meta.did, { initialized: true, owner });
|
|
1558
1563
|
logger.info('Blocklet initialized', { did, owner });
|
|
1559
1564
|
|
|
1560
|
-
this.emit(BlockletEvents.updated, { meta: { did: blocklet.meta.did } });
|
|
1565
|
+
this.emit(BlockletEvents.updated, { meta: { did: blocklet.meta.did }, context });
|
|
1561
1566
|
|
|
1562
1567
|
return this.getBlocklet(did);
|
|
1563
1568
|
}
|
|
1564
1569
|
|
|
1565
|
-
async updateOwner({ did, owner }) {
|
|
1570
|
+
async updateOwner({ did, owner }, context) {
|
|
1566
1571
|
if (!validateOwner(owner)) {
|
|
1567
1572
|
throw new Error('owner is invalid');
|
|
1568
1573
|
}
|
|
@@ -1571,7 +1576,7 @@ class DiskBlockletManager extends BaseBlockletManager {
|
|
|
1571
1576
|
await states.blockletExtras.setSettings(blocklet.meta.did, { owner });
|
|
1572
1577
|
logger.info('update blocklet owner', { did, owner });
|
|
1573
1578
|
|
|
1574
|
-
this.emit(BlockletEvents.updated, { meta: { did: blocklet.meta.did } });
|
|
1579
|
+
this.emit(BlockletEvents.updated, { meta: { did: blocklet.meta.did }, context });
|
|
1575
1580
|
|
|
1576
1581
|
return this.getBlocklet(did);
|
|
1577
1582
|
}
|
|
@@ -1866,6 +1871,51 @@ class DiskBlockletManager extends BaseBlockletManager {
|
|
|
1866
1871
|
return spaceGateways;
|
|
1867
1872
|
}
|
|
1868
1873
|
|
|
1874
|
+
/**
|
|
1875
|
+
* @description
|
|
1876
|
+
* @param {{
|
|
1877
|
+
* did: string,
|
|
1878
|
+
* autoBackup: import('@abtnode/client').AutoBackup
|
|
1879
|
+
* }} { did, autoBackup }
|
|
1880
|
+
* @param {{}} context
|
|
1881
|
+
* @memberof DiskBlockletManager
|
|
1882
|
+
*/
|
|
1883
|
+
async updateAutoBackup({ did, autoBackup }, context) {
|
|
1884
|
+
/** @type {import('@abtnode/client').AutoBackup} */
|
|
1885
|
+
const value = { ...autoBackup };
|
|
1886
|
+
await states.blockletExtras.setSettings(did, { autoBackup: value });
|
|
1887
|
+
|
|
1888
|
+
await this.backupQueue.delete(did);
|
|
1889
|
+
|
|
1890
|
+
if (value.enabled) {
|
|
1891
|
+
const blocklet = await states.blocklet.getBlocklet(did);
|
|
1892
|
+
this.backupQueue.push(
|
|
1893
|
+
{
|
|
1894
|
+
entity: 'blocklet',
|
|
1895
|
+
action: 'backupToSpaces',
|
|
1896
|
+
id: did,
|
|
1897
|
+
blocklet,
|
|
1898
|
+
context,
|
|
1899
|
+
},
|
|
1900
|
+
did,
|
|
1901
|
+
true,
|
|
1902
|
+
BACKUPS.JOB.INTERVAL
|
|
1903
|
+
);
|
|
1904
|
+
}
|
|
1905
|
+
}
|
|
1906
|
+
|
|
1907
|
+
/**
|
|
1908
|
+
* @description
|
|
1909
|
+
* @param {import('@abtnode/client').RequestGetAutoBackupInput} { did }
|
|
1910
|
+
* @return {Promise<import('@abtnode/client').AutoBackup>}
|
|
1911
|
+
* @memberof DiskBlockletManager
|
|
1912
|
+
*/
|
|
1913
|
+
async getAutoBackup({ did }) {
|
|
1914
|
+
const autoBackup = await states.blockletExtras.getSettings(did, 'autoBackup', { enabled: false });
|
|
1915
|
+
|
|
1916
|
+
return autoBackup;
|
|
1917
|
+
}
|
|
1918
|
+
|
|
1869
1919
|
/**
|
|
1870
1920
|
* @description
|
|
1871
1921
|
* @param {{ did: string }} { did }
|
|
@@ -2259,11 +2309,12 @@ class DiskBlockletManager extends BaseBlockletManager {
|
|
|
2259
2309
|
* user: {
|
|
2260
2310
|
* did: string;
|
|
2261
2311
|
* }
|
|
2262
|
-
* }
|
|
2312
|
+
* },
|
|
2313
|
+
* backupState: Pick<import('@abtnode/models').BackupState, 'strategy'>
|
|
2263
2314
|
* }} { blocklet, context }
|
|
2264
2315
|
* @memberof BlockletManager
|
|
2265
2316
|
*/
|
|
2266
|
-
async _onBackupToSpaces({ blocklet, context,
|
|
2317
|
+
async _onBackupToSpaces({ blocklet, context, backupState }) {
|
|
2267
2318
|
const {
|
|
2268
2319
|
referrer,
|
|
2269
2320
|
user: { did: userDid, locale },
|
|
@@ -2273,6 +2324,23 @@ class DiskBlockletManager extends BaseBlockletManager {
|
|
|
2273
2324
|
meta: { did: appPid },
|
|
2274
2325
|
} = blocklet;
|
|
2275
2326
|
|
|
2327
|
+
let backup = await states.backup.findOne({ appPid }, {}, { createdAt: -1 });
|
|
2328
|
+
if (backup?.status !== BACKUPS.STATUS.PROGRESS) {
|
|
2329
|
+
// 创建备份记录
|
|
2330
|
+
backup = await states.backup.start({
|
|
2331
|
+
appPid,
|
|
2332
|
+
userDid,
|
|
2333
|
+
strategy: backupState?.strategy,
|
|
2334
|
+
sourceUrl: path.join(this.dataDirs.tmp, 'backup', appDid),
|
|
2335
|
+
targetName: await getSpaceNameByEndpoint(getBackupEndpoint(blocklet.environments), 'DID Space'),
|
|
2336
|
+
});
|
|
2337
|
+
}
|
|
2338
|
+
|
|
2339
|
+
await states.backup.progress(backup.id, {
|
|
2340
|
+
message: 'Start backup...',
|
|
2341
|
+
progress: 10,
|
|
2342
|
+
});
|
|
2343
|
+
|
|
2276
2344
|
try {
|
|
2277
2345
|
const spacesBackup = new SpacesBackup({ appDid, appPid, event: this, userDid, referrer, locale, backup });
|
|
2278
2346
|
this.emit(BlockletEvents.backupProgress, {
|
|
@@ -2298,6 +2366,7 @@ class DiskBlockletManager extends BaseBlockletManager {
|
|
|
2298
2366
|
meta: { did: appPid },
|
|
2299
2367
|
completed: true,
|
|
2300
2368
|
progress: 100,
|
|
2369
|
+
backup,
|
|
2301
2370
|
context,
|
|
2302
2371
|
blocklet,
|
|
2303
2372
|
});
|
|
@@ -2311,10 +2380,27 @@ class DiskBlockletManager extends BaseBlockletManager {
|
|
|
2311
2380
|
completed: true,
|
|
2312
2381
|
progress: -1,
|
|
2313
2382
|
message: error?.message,
|
|
2383
|
+
backup,
|
|
2314
2384
|
context,
|
|
2315
2385
|
blocklet,
|
|
2316
2386
|
});
|
|
2317
2387
|
throw error;
|
|
2388
|
+
} finally {
|
|
2389
|
+
const autoBackup = await this.getAutoBackup({ did: appPid });
|
|
2390
|
+
if (autoBackup.enabled) {
|
|
2391
|
+
this.backupQueue.push(
|
|
2392
|
+
{
|
|
2393
|
+
entity: 'blocklet',
|
|
2394
|
+
action: 'backupToSpaces',
|
|
2395
|
+
id: appPid,
|
|
2396
|
+
blocklet,
|
|
2397
|
+
context,
|
|
2398
|
+
},
|
|
2399
|
+
appPid,
|
|
2400
|
+
true,
|
|
2401
|
+
BACKUPS.JOB.INTERVAL
|
|
2402
|
+
);
|
|
2403
|
+
}
|
|
2318
2404
|
}
|
|
2319
2405
|
}
|
|
2320
2406
|
|
|
@@ -2913,7 +2999,7 @@ class DiskBlockletManager extends BaseBlockletManager {
|
|
|
2913
2999
|
const b = await this._rollback(action, did, oldBlocklet);
|
|
2914
3000
|
logger.error('failed to upgrade blocklet', { did, version, name, error: err });
|
|
2915
3001
|
|
|
2916
|
-
this.emit(BlockletEvents.updated, b);
|
|
3002
|
+
this.emit(BlockletEvents.updated, { ...b, context });
|
|
2917
3003
|
|
|
2918
3004
|
const actionName = action === INSTALL_ACTIONS.INSTALL_COMPONENT ? 'install' : 'upgrade';
|
|
2919
3005
|
const notificationEvent =
|
|
@@ -3482,44 +3568,22 @@ class DiskBlockletManager extends BaseBlockletManager {
|
|
|
3482
3568
|
// eslint-disable-next-line no-unused-vars
|
|
3483
3569
|
async _backupToSpaces({ blocklet, context }) {
|
|
3484
3570
|
try {
|
|
3485
|
-
const {
|
|
3486
|
-
user: { did: userDid },
|
|
3487
|
-
} = context;
|
|
3488
|
-
const {
|
|
3489
|
-
appDid,
|
|
3490
|
-
meta: { did: appPid },
|
|
3491
|
-
} = blocklet;
|
|
3492
|
-
|
|
3493
|
-
const exist = await this.backupQueue.get(appDid);
|
|
3494
|
-
|
|
3495
|
-
if (exist) {
|
|
3496
|
-
throw new Error('A backup for this app is already in progress, abort!');
|
|
3497
|
-
}
|
|
3571
|
+
const { did } = blocklet.meta;
|
|
3498
3572
|
|
|
3499
|
-
|
|
3500
|
-
|
|
3501
|
-
const backup = await states.backup.start({
|
|
3502
|
-
appPid,
|
|
3503
|
-
userDid,
|
|
3504
|
-
strategy: 1,
|
|
3505
|
-
sourceUrl: path.join(this.dataDirs.tmp, 'backup', appDid),
|
|
3506
|
-
targetName: await getSpaceNameByEndpoint(endpoint, 'DID Space'),
|
|
3507
|
-
});
|
|
3508
|
-
await states.backup.progress(backup.id, {
|
|
3509
|
-
message: 'Start backup...',
|
|
3510
|
-
progress: 10,
|
|
3511
|
-
});
|
|
3573
|
+
await this.backupQueue.delete(did);
|
|
3512
3574
|
|
|
3513
3575
|
this.backupQueue.push(
|
|
3514
3576
|
{
|
|
3515
3577
|
entity: 'blocklet',
|
|
3516
3578
|
action: 'backupToSpaces',
|
|
3517
|
-
id:
|
|
3579
|
+
id: did,
|
|
3518
3580
|
blocklet,
|
|
3519
3581
|
context,
|
|
3520
|
-
|
|
3582
|
+
backupState: {
|
|
3583
|
+
strategy: BACKUPS.STRATEGY.MANUAL,
|
|
3584
|
+
},
|
|
3521
3585
|
},
|
|
3522
|
-
|
|
3586
|
+
did
|
|
3523
3587
|
);
|
|
3524
3588
|
|
|
3525
3589
|
return blocklet;
|
|
@@ -3747,7 +3811,7 @@ class FederatedBlockletManager extends DiskBlockletManager {
|
|
|
3747
3811
|
|
|
3748
3812
|
const newState = await this.getBlocklet(did);
|
|
3749
3813
|
this.emit(BlockletInternalEvents.appSettingChanged, { appDid: did });
|
|
3750
|
-
this.emit(BlockletEvents.updated, newState);
|
|
3814
|
+
this.emit(BlockletEvents.updated, { ...newState, context });
|
|
3751
3815
|
return newState;
|
|
3752
3816
|
}
|
|
3753
3817
|
|
|
@@ -3801,7 +3865,7 @@ class FederatedBlockletManager extends DiskBlockletManager {
|
|
|
3801
3865
|
});
|
|
3802
3866
|
const newState = await this.getBlocklet(did);
|
|
3803
3867
|
this.emit(BlockletInternalEvents.appSettingChanged, { appDid: did });
|
|
3804
|
-
this.emit(BlockletEvents.updated, newState);
|
|
3868
|
+
this.emit(BlockletEvents.updated, { ...newState, context });
|
|
3805
3869
|
return newState;
|
|
3806
3870
|
}
|
|
3807
3871
|
|
|
@@ -3865,7 +3929,7 @@ class FederatedBlockletManager extends DiskBlockletManager {
|
|
|
3865
3929
|
}
|
|
3866
3930
|
const newState = await this.getBlocklet(did);
|
|
3867
3931
|
this.emit(BlockletInternalEvents.appSettingChanged, { appDid: did });
|
|
3868
|
-
this.emit(BlockletEvents.updated, newState);
|
|
3932
|
+
this.emit(BlockletEvents.updated, { ...newState, context });
|
|
3869
3933
|
return newState;
|
|
3870
3934
|
}
|
|
3871
3935
|
|
|
@@ -3881,7 +3945,7 @@ class FederatedBlockletManager extends DiskBlockletManager {
|
|
|
3881
3945
|
|
|
3882
3946
|
const newState = await this.getBlocklet(did);
|
|
3883
3947
|
this.emit(BlockletInternalEvents.appSettingChanged, { appDid: did });
|
|
3884
|
-
this.emit(BlockletEvents.updated, newState);
|
|
3948
|
+
this.emit(BlockletEvents.updated, { ...newState, context });
|
|
3885
3949
|
return newState;
|
|
3886
3950
|
}
|
|
3887
3951
|
|
|
@@ -3900,7 +3964,7 @@ class FederatedBlockletManager extends DiskBlockletManager {
|
|
|
3900
3964
|
|
|
3901
3965
|
const newState = await this.getBlocklet(did);
|
|
3902
3966
|
this.emit(BlockletInternalEvents.appSettingChanged, { appDid: did });
|
|
3903
|
-
this.emit(BlockletEvents.updated, newState);
|
|
3967
|
+
this.emit(BlockletEvents.updated, { ...newState, context });
|
|
3904
3968
|
return newState;
|
|
3905
3969
|
}
|
|
3906
3970
|
|
|
@@ -23,6 +23,7 @@ class BlockletBackup extends BaseBackup {
|
|
|
23
23
|
const targetLogoPath = await this.writeLogoFile();
|
|
24
24
|
blocklet.meta.appLogo = basename(targetLogoPath);
|
|
25
25
|
|
|
26
|
+
await ensureDir(dirname(this.blockletExportPath));
|
|
26
27
|
await outputJson(this.blockletExportPath, blocklet);
|
|
27
28
|
|
|
28
29
|
return {
|
package/lib/event.js
CHANGED
|
@@ -23,6 +23,13 @@ const { getBackupEndpoint, getBackupFilesUrlFromEndpoint, getDIDSpacesUrlFromEnd
|
|
|
23
23
|
|
|
24
24
|
const routingSnapshotPrefix = (blocklet) => (blocklet.mode === BLOCKLET_MODES.DEVELOPMENT ? '[DEV] ' : '');
|
|
25
25
|
|
|
26
|
+
/**
|
|
27
|
+
*
|
|
28
|
+
* @param {{
|
|
29
|
+
* blockletManager: import('./blocklet/manager/disk')
|
|
30
|
+
* }} param0
|
|
31
|
+
* @returns
|
|
32
|
+
*/
|
|
26
33
|
// Initialize the event queue: this will make events across process
|
|
27
34
|
module.exports = ({
|
|
28
35
|
blockletManager,
|
|
@@ -309,6 +316,7 @@ module.exports = ({
|
|
|
309
316
|
backupUrl: getBackupFilesUrlFromEndpoint(backupEndpoint),
|
|
310
317
|
success: payload?.progress === 100,
|
|
311
318
|
errorMessage: payload?.message,
|
|
319
|
+
strategy: payload.backup.strategy,
|
|
312
320
|
},
|
|
313
321
|
context: payload?.context ?? {},
|
|
314
322
|
result: cloneDeep(blocklet),
|
|
@@ -392,6 +400,40 @@ module.exports = ({
|
|
|
392
400
|
listen(blockletManager, eventName, handleBlockletEvent);
|
|
393
401
|
});
|
|
394
402
|
|
|
403
|
+
/**
|
|
404
|
+
* @description
|
|
405
|
+
* @param {string} eventName
|
|
406
|
+
* @param {import('@abtnode/client').BlockletState & {context: {}} } payload
|
|
407
|
+
*/
|
|
408
|
+
async function autoBackupHandler(eventName, payload) {
|
|
409
|
+
const { did } = payload.meta;
|
|
410
|
+
const autoBackup = await blockletManager.getAutoBackup({ did });
|
|
411
|
+
|
|
412
|
+
if (autoBackup.enabled && payload.context) {
|
|
413
|
+
await blockletManager.backupQueue.delete(did);
|
|
414
|
+
|
|
415
|
+
blockletManager.backupQueue.push(
|
|
416
|
+
{
|
|
417
|
+
entity: 'blocklet',
|
|
418
|
+
action: 'backupToSpaces',
|
|
419
|
+
id: did,
|
|
420
|
+
blocklet: payload,
|
|
421
|
+
context: payload.context,
|
|
422
|
+
},
|
|
423
|
+
did
|
|
424
|
+
);
|
|
425
|
+
}
|
|
426
|
+
}
|
|
427
|
+
|
|
428
|
+
[
|
|
429
|
+
BlockletEvents.componentInstalled,
|
|
430
|
+
BlockletEvents.componentUpgraded,
|
|
431
|
+
BlockletEvents.componentRemoved,
|
|
432
|
+
BlockletEvents.updated,
|
|
433
|
+
].forEach((eventName) => {
|
|
434
|
+
listen(blockletManager, eventName, autoBackupHandler);
|
|
435
|
+
});
|
|
436
|
+
|
|
395
437
|
Object.keys(BlockletInternalEvents).forEach((key) => {
|
|
396
438
|
listen(blockletManager, BlockletInternalEvents[key], onEvent);
|
|
397
439
|
});
|
package/lib/index.js
CHANGED
|
@@ -131,6 +131,7 @@ function ABTNode(options) {
|
|
|
131
131
|
retryDelay: 10000, // retry after 10 seconds
|
|
132
132
|
maxTimeout: 60 * 1000 * 60, // throw timeout error after 60 minutes
|
|
133
133
|
id: (job) => (job ? md5(`${job.entity}-${job.action}-${job.id}`) : ''),
|
|
134
|
+
enableScheduledJob: true,
|
|
134
135
|
},
|
|
135
136
|
});
|
|
136
137
|
|
|
@@ -312,6 +313,10 @@ function ABTNode(options) {
|
|
|
312
313
|
updateBlockletSpaceGateway: blockletManager.updateBlockletSpaceGateway.bind(blockletManager),
|
|
313
314
|
getBlockletSpaceGateways: blockletManager.getBlockletSpaceGateways.bind(blockletManager),
|
|
314
315
|
|
|
316
|
+
// auto backup
|
|
317
|
+
updateAutoBackup: blockletManager.updateAutoBackup.bind(blockletManager),
|
|
318
|
+
getAutoBackup: blockletManager.getAutoBackup.bind(blockletManager),
|
|
319
|
+
|
|
315
320
|
// blocklet backup record
|
|
316
321
|
getBlockletBackups: blockletManager.getBlockletBackups.bind(blockletManager),
|
|
317
322
|
|
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 } = require('@abtnode/constant');
|
|
8
|
+
const { BLOCKLET_SITE_GROUP_SUFFIX, NODE_SERVICES, BACKUPS } = require('@abtnode/constant');
|
|
9
9
|
const logger = require('@abtnode/logger')('@abtnode/core:states:audit-log');
|
|
10
10
|
|
|
11
11
|
const BaseState = require('./base');
|
|
@@ -97,7 +97,7 @@ const expandUser = async (teamDid, userDid, passportId, info, node) => {
|
|
|
97
97
|
* @param {object} result - GraphQL resolve result
|
|
98
98
|
* @param {object} info - server info
|
|
99
99
|
* @param {object} node - server instance
|
|
100
|
-
* @return {string} the generated markdown source
|
|
100
|
+
* @return {Promise<string>} the generated markdown source
|
|
101
101
|
*/
|
|
102
102
|
const getLogContent = async (action, args, context, result, info, node) => {
|
|
103
103
|
const [site, [user, passport]] = await Promise.all([
|
|
@@ -137,9 +137,13 @@ const getLogContent = async (action, args, context, result, info, node) => {
|
|
|
137
137
|
return `removed ${result.deletedComponent.meta.title}@${result.deletedComponent.meta.version} ${args.keepData !== false ? 'but kept its data and config' : 'and its data and config'}`; // prettier-ignore
|
|
138
138
|
case 'configBlocklet':
|
|
139
139
|
return `updated following config for ${args.did?.length > 1 ? componentOrApplicationInfo(result, [args.did[1]]) : 'application'}: ${args.configs.map(x => `*${x.key}*`).join(', ')}`; // prettier-ignore
|
|
140
|
+
// @see: core/state/lib/event.js#311
|
|
140
141
|
case 'backupToSpaces':
|
|
141
142
|
if (args?.success) {
|
|
142
|
-
|
|
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
147
|
}
|
|
144
148
|
return `Backup application to ${args.url} failed:\n- The reason for the error is: <span style='color:red'>${args.errorMessage}</span>`;
|
|
145
149
|
case 'configPublicToStore':
|
package/lib/states/index.js
CHANGED
|
@@ -62,5 +62,12 @@ const init = (dataDirs, config = {}) => {
|
|
|
62
62
|
runtimeInsight,
|
|
63
63
|
};
|
|
64
64
|
};
|
|
65
|
-
|
|
65
|
+
/**
|
|
66
|
+
* @type {{
|
|
67
|
+
* backup: import('./backup'),
|
|
68
|
+
* blocklet: import('./blocklet'),
|
|
69
|
+
* blockletExtras: import('./blocklet-extras'),
|
|
70
|
+
* [key: string]: any
|
|
71
|
+
* }}
|
|
72
|
+
*/
|
|
66
73
|
module.exports = createStateFactory(init, models);
|
package/package.json
CHANGED
|
@@ -3,7 +3,7 @@
|
|
|
3
3
|
"publishConfig": {
|
|
4
4
|
"access": "public"
|
|
5
5
|
},
|
|
6
|
-
"version": "1.16.17-beta-
|
|
6
|
+
"version": "1.16.17-beta-ce49fe0e",
|
|
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.17-beta-
|
|
23
|
-
"@abtnode/auth": "1.16.17-beta-
|
|
24
|
-
"@abtnode/certificate-manager": "1.16.17-beta-
|
|
25
|
-
"@abtnode/constant": "1.16.17-beta-
|
|
26
|
-
"@abtnode/cron": "1.16.17-beta-
|
|
27
|
-
"@abtnode/logger": "1.16.17-beta-
|
|
28
|
-
"@abtnode/models": "1.16.17-beta-
|
|
29
|
-
"@abtnode/queue": "1.16.17-beta-
|
|
30
|
-
"@abtnode/rbac": "1.16.17-beta-
|
|
31
|
-
"@abtnode/router-provider": "1.16.17-beta-
|
|
32
|
-
"@abtnode/static-server": "1.16.17-beta-
|
|
33
|
-
"@abtnode/timemachine": "1.16.17-beta-
|
|
34
|
-
"@abtnode/util": "1.16.17-beta-
|
|
22
|
+
"@abtnode/analytics": "1.16.17-beta-ce49fe0e",
|
|
23
|
+
"@abtnode/auth": "1.16.17-beta-ce49fe0e",
|
|
24
|
+
"@abtnode/certificate-manager": "1.16.17-beta-ce49fe0e",
|
|
25
|
+
"@abtnode/constant": "1.16.17-beta-ce49fe0e",
|
|
26
|
+
"@abtnode/cron": "1.16.17-beta-ce49fe0e",
|
|
27
|
+
"@abtnode/logger": "1.16.17-beta-ce49fe0e",
|
|
28
|
+
"@abtnode/models": "1.16.17-beta-ce49fe0e",
|
|
29
|
+
"@abtnode/queue": "1.16.17-beta-ce49fe0e",
|
|
30
|
+
"@abtnode/rbac": "1.16.17-beta-ce49fe0e",
|
|
31
|
+
"@abtnode/router-provider": "1.16.17-beta-ce49fe0e",
|
|
32
|
+
"@abtnode/static-server": "1.16.17-beta-ce49fe0e",
|
|
33
|
+
"@abtnode/timemachine": "1.16.17-beta-ce49fe0e",
|
|
34
|
+
"@abtnode/util": "1.16.17-beta-ce49fe0e",
|
|
35
35
|
"@arcblock/did": "1.18.92",
|
|
36
36
|
"@arcblock/did-auth": "1.18.92",
|
|
37
37
|
"@arcblock/did-ext": "^1.18.92",
|
|
@@ -42,11 +42,11 @@
|
|
|
42
42
|
"@arcblock/pm2-events": "^0.0.5",
|
|
43
43
|
"@arcblock/validator": "^1.18.92",
|
|
44
44
|
"@arcblock/vc": "1.18.92",
|
|
45
|
-
"@blocklet/constant": "1.16.17-beta-
|
|
46
|
-
"@blocklet/env": "1.16.17-beta-
|
|
47
|
-
"@blocklet/meta": "1.16.17-beta-
|
|
48
|
-
"@blocklet/resolver": "1.16.17-beta-
|
|
49
|
-
"@blocklet/sdk": "1.16.17-beta-
|
|
45
|
+
"@blocklet/constant": "1.16.17-beta-ce49fe0e",
|
|
46
|
+
"@blocklet/env": "1.16.17-beta-ce49fe0e",
|
|
47
|
+
"@blocklet/meta": "1.16.17-beta-ce49fe0e",
|
|
48
|
+
"@blocklet/resolver": "1.16.17-beta-ce49fe0e",
|
|
49
|
+
"@blocklet/sdk": "1.16.17-beta-ce49fe0e",
|
|
50
50
|
"@did-space/client": "^0.3.11",
|
|
51
51
|
"@fidm/x509": "^1.2.1",
|
|
52
52
|
"@ocap/mcrypto": "1.18.92",
|
|
@@ -101,5 +101,5 @@
|
|
|
101
101
|
"jest": "^27.5.1",
|
|
102
102
|
"unzipper": "^0.10.11"
|
|
103
103
|
},
|
|
104
|
-
"gitHead": "
|
|
104
|
+
"gitHead": "d8a04ff2ef9cd52a02d019bc2c9a743785e869c3"
|
|
105
105
|
}
|