@abtnode/core 1.16.52-beta-20251003-083412-fdfc4e36 → 1.16.52-beta-20251008-091027-c46c73e3
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/api/team.js +593 -47
- package/lib/blocklet/downloader/blocklet-downloader.js +2 -2
- package/lib/blocklet/downloader/bundle-downloader.js +13 -38
- package/lib/blocklet/manager/disk.js +219 -89
- package/lib/blocklet/manager/ensure-blocklet-running.js +3 -2
- package/lib/blocklet/manager/helper/blue-green-get-componentids.js +59 -0
- package/lib/blocklet/manager/helper/blue-green-start-blocklet.js +301 -0
- package/lib/blocklet/manager/helper/blue-green-update-blocklet-status.js +18 -0
- package/lib/blocklet/manager/helper/blue-green-upgrade-blocklet.js +191 -0
- package/lib/blocklet/manager/helper/upgrade-components.js +2 -9
- package/lib/blocklet/migration-dist/migration.cjs +4 -1
- package/lib/blocklet/passport/index.js +8 -2
- package/lib/index.js +18 -0
- package/lib/monitor/blocklet-runtime-monitor.js +12 -7
- package/lib/states/audit-log.js +54 -2
- package/lib/states/blocklet.js +22 -6
- package/lib/states/index.js +3 -0
- package/lib/states/org.js +663 -0
- package/lib/team/manager.js +10 -3
- package/lib/util/blocklet.js +217 -137
- package/lib/util/docker/is-docker-only-single-instances.js +17 -0
- package/lib/util/org.js +99 -0
- package/lib/validators/org.js +19 -0
- package/package.json +27 -26
package/lib/states/audit-log.js
CHANGED
|
@@ -10,6 +10,7 @@ const isArray = require('lodash/isArray');
|
|
|
10
10
|
const isString = require('lodash/isString');
|
|
11
11
|
const mapValues = require('lodash/mapValues');
|
|
12
12
|
const map = require('lodash/map');
|
|
13
|
+
const omit = require('lodash/omit');
|
|
13
14
|
const { joinURL } = require('ufo');
|
|
14
15
|
const { Op } = require('sequelize');
|
|
15
16
|
const { getDisplayName } = require('@blocklet/meta/lib/util');
|
|
@@ -273,13 +274,15 @@ const getLogContent = async (action, args, context, result, info, node) => {
|
|
|
273
274
|
expandSite(args.id, info, node),
|
|
274
275
|
expandUser(
|
|
275
276
|
args.teamDid,
|
|
276
|
-
args.userDid || get(args, 'user.did') || args.ownerDid || args.did,
|
|
277
|
+
args.userDid || get(args, 'user.did') || args.ownerDid || args.did || context.user.did,
|
|
277
278
|
args.passportId,
|
|
278
279
|
info,
|
|
279
280
|
node
|
|
280
281
|
),
|
|
281
282
|
]);
|
|
282
283
|
|
|
284
|
+
const prefix = process.env.NODE_ENV === 'production' ? info.routing.adminPath : '';
|
|
285
|
+
|
|
283
286
|
switch (action) {
|
|
284
287
|
// blocklets
|
|
285
288
|
case 'installBlocklet':
|
|
@@ -684,7 +687,6 @@ const getLogContent = async (action, args, context, result, info, node) => {
|
|
|
684
687
|
case 'followUser':
|
|
685
688
|
case 'unfollowUser':
|
|
686
689
|
const followerUser = await node.getUser({ teamDid: args.teamDid, user: { did: args.followerDid } });
|
|
687
|
-
const prefix = process.env.NODE_ENV === 'production' ? info.routing.adminPath : '';
|
|
688
690
|
return `[${followerUser.fullName}](${joinURL(prefix, '/team/members')}) ${action === 'followUser' ? 'followed' : 'unfollowed'} user ${user}`;
|
|
689
691
|
|
|
690
692
|
// connect to aigne
|
|
@@ -693,6 +695,49 @@ const getLogContent = async (action, args, context, result, info, node) => {
|
|
|
693
695
|
case 'disconnectToAigne':
|
|
694
696
|
return `Disconnect to Aigne(${args.url})`;
|
|
695
697
|
|
|
698
|
+
// org 相关
|
|
699
|
+
case 'createOrg':
|
|
700
|
+
return `${user} created an org(${args.name})`;
|
|
701
|
+
case 'deleteOrg':
|
|
702
|
+
return `${user} deleted the org(${args.id})`;
|
|
703
|
+
case 'updateOrg':
|
|
704
|
+
return `${user} updated the org(${args.org.name}): \n${Object.keys(omit(args.org, ['id']))
|
|
705
|
+
.map((x) => `- ${x}: ${args.org[x]}`)
|
|
706
|
+
.join('\n')}`;
|
|
707
|
+
case 'removeOrgMember': {
|
|
708
|
+
const [member, org, operator] = await Promise.all([
|
|
709
|
+
node.getUser({ teamDid: args.teamDid, user: { did: args.userDid } }),
|
|
710
|
+
node.getOrg({ teamDid: args.teamDid, id: args.orgId }, context),
|
|
711
|
+
node.getUser({ teamDid: args.teamDid, user: { did: context.user.did } }),
|
|
712
|
+
]);
|
|
713
|
+
return `[${operator.fullName}](${joinURL(prefix, '/team/members')}) removed a member([${member.fullName}](${joinURL(prefix, '/team/members')})) from the org(${org.name})`;
|
|
714
|
+
}
|
|
715
|
+
case 'inviteMembersToOrg': {
|
|
716
|
+
const [operator, joinedOrg] = await Promise.all([
|
|
717
|
+
node.getUser({ teamDid: args.teamDid, user: { did: context.user.did } }),
|
|
718
|
+
node.getOrg({ teamDid: args.teamDid, id: args.orgId }, context),
|
|
719
|
+
]);
|
|
720
|
+
if (args.inviteType === 'internal') {
|
|
721
|
+
const dids = args.userDids || [];
|
|
722
|
+
const { users } = await node.getUsers({ teamDid: args.teamDid, dids: dids.slice(0, 5) });
|
|
723
|
+
const invitedMembers = users.length < dids.length ? [...users, '...'] : users;
|
|
724
|
+
return `[${operator.fullName}](${joinURL(prefix, '/team/members')}) invited ${dids.length} ${dids.length > 1 ? 'members' : 'member'} to join the org(${joinedOrg.name}): \n${invitedMembers.map((x) => (x.fullName ? `- [${x.fullName}](${joinURL(prefix, '/team/members')})` : `- ${x}`)).join('\n')}`;
|
|
725
|
+
}
|
|
726
|
+
return `[${operator.fullName}](${joinURL(prefix, '/team/members')}) invited members to join the org(${joinedOrg.name})`;
|
|
727
|
+
}
|
|
728
|
+
case 'addOrgResource': {
|
|
729
|
+
const org = await node.getOrg({ teamDid: args.teamDid, id: args.orgId }, context);
|
|
730
|
+
const resourceIds = (args.resourceIds || []).slice(0, 5);
|
|
731
|
+
const displayResourceIds = resourceIds.length < args.resourceIds.length ? [...resourceIds, '...'] : resourceIds;
|
|
732
|
+
return `${user} added ${resourceIds.length} ${resourceIds.length > 1 ? 'resources' : 'resource'} to the org(${org.name}): \n${displayResourceIds.map((x) => `- ${x}`).join('\n')}`;
|
|
733
|
+
}
|
|
734
|
+
case 'migrateOrgResource': {
|
|
735
|
+
const org = await node.getOrg({ teamDid: args.teamDid, id: args.to }, context);
|
|
736
|
+
const resourceIds = (args.resourceIds || []).slice(0, 5);
|
|
737
|
+
const displayResourceIds = resourceIds.length < args.resourceIds.length ? [...resourceIds, '...'] : resourceIds;
|
|
738
|
+
return `${user} migrated ${resourceIds.length} ${resourceIds.length > 1 ? 'resources' : 'resource'} to the org(${org.name}): \n${displayResourceIds.map((x) => `- ${x}`).join('\n')}`;
|
|
739
|
+
}
|
|
740
|
+
|
|
696
741
|
default:
|
|
697
742
|
return action;
|
|
698
743
|
}
|
|
@@ -797,6 +842,13 @@ const getLogCategory = (action) => {
|
|
|
797
842
|
case 'updateUserInfo':
|
|
798
843
|
case 'followUser':
|
|
799
844
|
case 'unfollowUser':
|
|
845
|
+
case 'createOrg':
|
|
846
|
+
case 'updateOrg':
|
|
847
|
+
case 'deleteOrg':
|
|
848
|
+
case 'removeOrgMember':
|
|
849
|
+
case 'inviteMembersToOrg':
|
|
850
|
+
case 'addOrgResource':
|
|
851
|
+
case 'migrateOrgResource':
|
|
800
852
|
return 'team';
|
|
801
853
|
|
|
802
854
|
// accessKeys
|
package/lib/states/blocklet.js
CHANGED
|
@@ -198,7 +198,10 @@ class BlockletState extends BaseState {
|
|
|
198
198
|
|
|
199
199
|
async getBlockletStatus(did) {
|
|
200
200
|
const doc = await this.getBlocklet(did);
|
|
201
|
-
|
|
201
|
+
if (!doc) {
|
|
202
|
+
return null;
|
|
203
|
+
}
|
|
204
|
+
return doc.status;
|
|
202
205
|
}
|
|
203
206
|
|
|
204
207
|
async hasBlocklet(did) {
|
|
@@ -469,7 +472,7 @@ class BlockletState extends BaseState {
|
|
|
469
472
|
/**
|
|
470
473
|
* refresh ports for blocklet if occupied during starting workflow
|
|
471
474
|
*/
|
|
472
|
-
async refreshBlockletPorts(did, componentDids = []) {
|
|
475
|
+
async refreshBlockletPorts(did, componentDids = [], isGreen = false) {
|
|
473
476
|
const blocklet = await this.getBlocklet(did);
|
|
474
477
|
if (!blocklet) {
|
|
475
478
|
throw new CustomError(404, `Blocklet does not exist on refresh: ${did}`);
|
|
@@ -479,7 +482,11 @@ class BlockletState extends BaseState {
|
|
|
479
482
|
|
|
480
483
|
await forEachComponentV2(blocklet, async (component) => {
|
|
481
484
|
if (!shouldSkipComponent(component.meta.did, componentDids)) {
|
|
482
|
-
|
|
485
|
+
let oldPorts = component[isGreen ? 'greenPorts' : 'ports'];
|
|
486
|
+
if (!oldPorts || Object.keys(oldPorts).length === 0) {
|
|
487
|
+
oldPorts = component.ports;
|
|
488
|
+
}
|
|
489
|
+
component[isGreen ? 'greenPorts' : 'ports'] = await refreshPorts(oldPorts, {
|
|
483
490
|
blackList: [...occupiedExternalPorts.keys(), ...occupiedInternalPorts.keys()],
|
|
484
491
|
});
|
|
485
492
|
}
|
|
@@ -556,7 +563,11 @@ class BlockletState extends BaseState {
|
|
|
556
563
|
* componentDids?: Array<Did>
|
|
557
564
|
* }}
|
|
558
565
|
*/
|
|
559
|
-
async setBlockletStatus(
|
|
566
|
+
async setBlockletStatus(
|
|
567
|
+
did,
|
|
568
|
+
status,
|
|
569
|
+
{ componentDids, operator = 'daemon', isGreen = false, isGreenAndBlue = false } = {}
|
|
570
|
+
) {
|
|
560
571
|
logger.info('setBlockletStatus', { did, status, componentDids, operator });
|
|
561
572
|
if (typeof status === 'undefined') {
|
|
562
573
|
throw new Error('Unsupported blocklet status');
|
|
@@ -589,7 +600,11 @@ class BlockletState extends BaseState {
|
|
|
589
600
|
return;
|
|
590
601
|
}
|
|
591
602
|
|
|
592
|
-
component
|
|
603
|
+
component[isGreen ? 'greenStatus' : 'status'] = status;
|
|
604
|
+
if (isGreenAndBlue) {
|
|
605
|
+
component.greenStatus = status;
|
|
606
|
+
component.status = status;
|
|
607
|
+
}
|
|
593
608
|
if (status === BlockletStatus.running) {
|
|
594
609
|
component.startedAt = new Date();
|
|
595
610
|
component.stoppedAt = null;
|
|
@@ -602,7 +617,8 @@ class BlockletState extends BaseState {
|
|
|
602
617
|
component.inProgressStart = Date.now();
|
|
603
618
|
});
|
|
604
619
|
|
|
605
|
-
const
|
|
620
|
+
const isSetStatus = status === BlockletStatus.downloading || status === BlockletStatus.waiting;
|
|
621
|
+
const updateData = isSetStatus ? pick(doc, ['status', 'children']) : pick(doc, ['children']);
|
|
606
622
|
updateData.operator = operator;
|
|
607
623
|
|
|
608
624
|
const res = await this.updateBlocklet(did, updateData);
|
package/lib/states/index.js
CHANGED
|
@@ -18,6 +18,7 @@ const BackupState = require('./backup');
|
|
|
18
18
|
const TrafficInsightState = require('./traffic-insight');
|
|
19
19
|
const RuntimeInsightState = require('./runtime-insight');
|
|
20
20
|
const BlacklistState = require('./blacklist');
|
|
21
|
+
const OrgState = require('./org');
|
|
21
22
|
|
|
22
23
|
const { getDbFilePath } = require('../util');
|
|
23
24
|
|
|
@@ -46,6 +47,7 @@ const init = (dataDirs, config = {}) => {
|
|
|
46
47
|
const trafficInsight = new TrafficInsightState(models.TrafficInsight, config);
|
|
47
48
|
const runtimeInsight = new RuntimeInsightState(models.RuntimeInsight, { ...config, maxPageSize: 8640 });
|
|
48
49
|
const blacklistState = new BlacklistState(models.Blacklist, config);
|
|
50
|
+
const orgState = new OrgState(models.Org, config, models);
|
|
49
51
|
|
|
50
52
|
return {
|
|
51
53
|
node: nodeState,
|
|
@@ -64,6 +66,7 @@ const init = (dataDirs, config = {}) => {
|
|
|
64
66
|
trafficInsight,
|
|
65
67
|
runtimeInsight,
|
|
66
68
|
blacklist: blacklistState,
|
|
69
|
+
org: orgState,
|
|
67
70
|
};
|
|
68
71
|
};
|
|
69
72
|
|