@abtnode/core 1.16.23-beta-abdda301 → 1.16.23-beta-035db744

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.
@@ -575,6 +575,16 @@ class DiskBlockletManager extends BaseBlockletManager {
575
575
  ) {
576
576
  const blocklet = await this.ensureBlocklet(did, { e2eMode });
577
577
 
578
+ const componentDids = inputComponentDids?.length ? inputComponentDids : blocklet.children.map((x) => x.meta.did);
579
+
580
+ // sync component config before at first to ensure resource component config is ready
581
+ const serverSk = (await states.node.read()).sk;
582
+ await Promise.all(
583
+ componentDids.map((componentDid) =>
584
+ this.configSynchronizer.syncComponentConfig(componentDid, blocklet.meta.did, { serverSk })
585
+ )
586
+ );
587
+
578
588
  if (atomic || !blocklet.structVersion) {
579
589
  return this._start(
580
590
  { did, throwOnError, checkHealthImmediately, e2eMode, componentDids: inputComponentDids },
@@ -582,8 +592,6 @@ class DiskBlockletManager extends BaseBlockletManager {
582
592
  );
583
593
  }
584
594
 
585
- const componentDids = inputComponentDids?.length ? inputComponentDids : blocklet.children.map((x) => x.meta.did);
586
-
587
595
  const tasks = componentDids.map((componentDid) =>
588
596
  this._start({ blocklet, throwOnError, checkHealthImmediately, e2eMode, componentDids: [componentDid] }, context)
589
597
  );
@@ -72,7 +72,10 @@ const installComponentFromDev = async ({ folder, meta, rootDid, mountPoint, mana
72
72
 
73
73
  const componentDids = children.map((x) => x.meta.did);
74
74
 
75
- await states.blocklet.addChildren(rootDid, children);
75
+ const { BLOCKLET_PORT } = process.env;
76
+ await states.blocklet.addChildren(rootDid, children, {
77
+ manualPorts: BLOCKLET_PORT ? [{ did: component.meta.did, ports: { BLOCKLET_PORT } }] : null,
78
+ });
76
79
 
77
80
  const newBlocklet = await states.blocklet.getBlocklet(rootDid);
78
81
  await validateBlocklet(newBlocklet);
@@ -30,12 +30,9 @@ const check = async ({ did, states }) => {
30
30
  const bundleSource = getFixedBundleSource(child);
31
31
 
32
32
  if (bundleSource) {
33
- const {
34
- staticComponents: [newChild],
35
- dynamicComponents,
36
- } = await parseComponents({
33
+ const { dynamicComponents } = await parseComponents({
37
34
  meta: {
38
- staticComponents: [
35
+ components: [
39
36
  {
40
37
  source: bundleSource,
41
38
  name: child.meta.name,
@@ -45,7 +42,8 @@ const check = async ({ did, states }) => {
45
42
  ],
46
43
  },
47
44
  });
48
- newChild._dynamicComponents = dynamicComponents;
45
+ const newChild = dynamicComponents.find((x) => x.meta.name === child.meta.name);
46
+ newChild._dynamicComponents = dynamicComponents.filter((x) => x.meta.name !== child.meta.name);
49
47
  newChildren.push(newChild);
50
48
  } else {
51
49
  const { dynamicComponents } = await parseComponents(child);
@@ -17,8 +17,6 @@ const { createReleaseSchema } = require('../../validators/project');
17
17
 
18
18
  const { getLogoFile, exportBlockletResources, getResourceList, checkResourceExists } = require('./util');
19
19
 
20
- const createRandomStr = () => Math.random().toString(36).substring(2, 8);
21
-
22
20
  const createPackRelease = async ({
23
21
  did,
24
22
  projectId,
@@ -110,7 +108,6 @@ const createPackRelease = async ({
110
108
 
111
109
  const _releaseId = release.id;
112
110
 
113
- const tmpDir = path.join(manager.dataDirs.tmp, PROJECT.DIR, `${blockletDid}-${createRandomStr()}`);
114
111
  const releaseDir = path.join(projectDir, PROJECT.RELEASE_DIR, `${_releaseId}`);
115
112
  const resourceDir = path.join(releaseDir, PROJECT.RESOURCE_DIR);
116
113
  const tmpResourceDir = path.join(projectDir, PROJECT.RESOURCE_DIR);
@@ -130,14 +127,9 @@ const createPackRelease = async ({
130
127
  return release;
131
128
  }
132
129
 
133
- // create a release
134
- if (fs.existsSync(tmpDir)) {
135
- await fs.remove(tmpDir);
136
- }
137
-
138
- const tmpExportDir = path.join(tmpDir, 'export');
139
- const tmpBundleDir = path.join(tmpExportDir, 'bundle');
140
- const tmpReleaseDir = path.join(tmpExportDir, 'release');
130
+ const releaseExportDir = path.join(releaseDir, '.blocklet');
131
+ const releaseBundleDir = path.join(releaseExportDir, 'bundle');
132
+ const releaseReleaseDir = path.join(releaseExportDir, 'release');
141
133
 
142
134
  const moniker = (urlPathFriendly(slugify(release.blockletTitle)) || 'blocklet').toLowerCase();
143
135
  const releaseFileName = `${moniker}-${release.blockletVersion}.zip`;
@@ -148,14 +140,14 @@ const createPackRelease = async ({
148
140
  }
149
141
 
150
142
  try {
151
- await fs.ensureDir(tmpBundleDir);
143
+ await fs.ensureDir(releaseBundleDir);
152
144
 
153
145
  // create logo
154
146
  const { logoFile, logoFileName } = getLogoFile(blocklet, project);
155
- await fs.copy(logoFile, path.join(tmpBundleDir, logoFileName));
147
+ await fs.copy(logoFile, path.join(releaseBundleDir, logoFileName));
156
148
 
157
149
  // create screenshots
158
- const screenshotsDistDir = path.join(tmpBundleDir, 'screenshots');
150
+ const screenshotsDistDir = path.join(releaseBundleDir, 'screenshots');
159
151
  await fs.ensureDir(screenshotsDistDir);
160
152
  if (project.blockletScreenshots?.length) {
161
153
  await Promise.all(
@@ -168,11 +160,11 @@ const createPackRelease = async ({
168
160
 
169
161
  // create readme
170
162
  if (blockletIntroduction) {
171
- await fs.outputFile(path.join(tmpBundleDir, 'README.md'), blockletIntroduction);
163
+ await fs.outputFile(path.join(releaseBundleDir, 'README.md'), blockletIntroduction);
172
164
  }
173
165
 
174
166
  // changelog
175
- const changelogDistFile = path.join(tmpBundleDir, 'CHANGELOG.md');
167
+ const changelogDistFile = path.join(releaseBundleDir, 'CHANGELOG.md');
176
168
  const releases = await releaseState.getReleases({ projectId, status: PROJECT.RELEASE_STATUS.published });
177
169
  const changelog = releases.map((_release) => {
178
170
  const { blockletVersion: version, note: content } = _release;
@@ -185,11 +177,11 @@ const createPackRelease = async ({
185
177
  app: blocklet,
186
178
  projectId,
187
179
  releaseId: _releaseId,
188
- exportDir: tmpBundleDir,
180
+ exportDir: releaseBundleDir,
189
181
  blockletDid,
190
182
  isPack: true,
191
183
  });
192
- const resourceList = await getResourceList(tmpBundleDir, { isPublic: false });
184
+ const resourceList = await getResourceList(releaseBundleDir, { isPublic: false });
193
185
 
194
186
  const components = blocklet.children
195
187
  .filter((x) => x.bundleSource?.url || x.bundleSource?.store)
@@ -216,10 +208,10 @@ const createPackRelease = async ({
216
208
  files: project.blockletScreenshots?.length ? ['screenshots'] : [],
217
209
  screenshots: project.blockletScreenshots || [],
218
210
  };
219
- await updateMetaFile(path.join(tmpBundleDir, BLOCKLET_META_FILE), meta);
211
+ await updateMetaFile(path.join(releaseBundleDir, BLOCKLET_META_FILE), meta);
220
212
 
221
213
  // create release
222
- await createBlockletRelease(tmpExportDir, { printError: logger.error, printInfo: logger.info });
214
+ await createBlockletRelease(releaseExportDir, { printError: logger.error, printInfo: logger.info });
223
215
 
224
216
  // archive
225
217
  const archive = createArchive('zip', { zlib: { level: 9 } });
@@ -227,7 +219,7 @@ const createPackRelease = async ({
227
219
 
228
220
  await new Promise((resolve, reject) => {
229
221
  archive
230
- .directory(tmpReleaseDir, false)
222
+ .directory(releaseReleaseDir, false)
231
223
  .on('error', (err) => reject(err))
232
224
  .pipe(writeStream);
233
225
 
@@ -241,13 +233,11 @@ const createPackRelease = async ({
241
233
  files: [releaseFileName],
242
234
  });
243
235
 
244
- await fs.remove(tmpDir);
245
-
246
236
  logger.info('create release success', res2);
247
237
 
248
238
  return res2;
249
239
  } catch (error) {
250
- await fs.remove(tmpDir);
240
+ await fs.remove(releaseExportDir);
251
241
  await fs.remove(releaseFile);
252
242
  if (action === 'create') {
253
243
  await fs.remove(releaseDir);
@@ -16,8 +16,6 @@ const { createReleaseSchema } = require('../../validators/project');
16
16
  const { getLogoFile, exportBlockletResources, getResourceList, checkResourceExists } = require('./util');
17
17
  const createPackRelease = require('./create-pack-release');
18
18
 
19
- const createRandomStr = () => Math.random().toString(36).substring(2, 8);
20
-
21
19
  const COMPONENT_CONFIG_MAP_DIR = '.component_config';
22
20
 
23
21
  // project
@@ -200,7 +198,6 @@ const createRelease = async ({
200
198
 
201
199
  const _releaseId = release.id;
202
200
 
203
- const tmpDir = path.join(manager.dataDirs.tmp, PROJECT.DIR, `${blockletDid}-${createRandomStr()}`);
204
201
  const releaseDir = path.join(projectDir, PROJECT.RELEASE_DIR, `${_releaseId}`);
205
202
  const resourceDir = path.join(releaseDir, PROJECT.RESOURCE_DIR);
206
203
  const tmpResourceDir = path.join(projectDir, PROJECT.RESOURCE_DIR);
@@ -220,14 +217,9 @@ const createRelease = async ({
220
217
  return release;
221
218
  }
222
219
 
223
- // create a release
224
- if (fs.existsSync(tmpDir)) {
225
- await fs.remove(tmpDir);
226
- }
227
-
228
- const tmpExportDir = path.join(tmpDir, 'export');
229
- const tmpBundleDir = path.join(tmpExportDir, 'bundle');
230
- const tmpReleaseDir = path.join(tmpExportDir, 'release');
220
+ const releaseExportDir = path.join(releaseDir, '.blocklet');
221
+ const releaseBundleDir = path.join(releaseExportDir, 'bundle');
222
+ const releaseReleaseDir = path.join(releaseExportDir, 'release');
231
223
 
232
224
  const moniker = (urlPathFriendly(slugify(release.blockletTitle)) || 'blocklet').toLowerCase();
233
225
  const releaseFileName = `${moniker}-${release.blockletVersion}.zip`;
@@ -238,14 +230,14 @@ const createRelease = async ({
238
230
  }
239
231
 
240
232
  try {
241
- await fs.ensureDir(tmpBundleDir);
233
+ await fs.ensureDir(releaseBundleDir);
242
234
 
243
235
  // create logo
244
236
  const { logoFile, logoFileName } = getLogoFile(blocklet, project);
245
- await fs.copy(logoFile, path.join(tmpBundleDir, logoFileName));
237
+ await fs.copy(logoFile, path.join(releaseBundleDir, logoFileName));
246
238
 
247
239
  // create screenshots
248
- const screenshotsDistDir = path.join(tmpBundleDir, 'screenshots');
240
+ const screenshotsDistDir = path.join(releaseBundleDir, 'screenshots');
249
241
  await fs.ensureDir(screenshotsDistDir);
250
242
  if (project.blockletScreenshots?.length) {
251
243
  await Promise.all(
@@ -258,11 +250,11 @@ const createRelease = async ({
258
250
 
259
251
  // create readme
260
252
  if (blockletIntroduction) {
261
- await fs.outputFile(path.join(tmpBundleDir, 'README.md'), blockletIntroduction);
253
+ await fs.outputFile(path.join(releaseBundleDir, 'README.md'), blockletIntroduction);
262
254
  }
263
255
 
264
256
  // changelog
265
- const changelogDistFile = path.join(tmpBundleDir, 'CHANGELOG.md');
257
+ const changelogDistFile = path.join(releaseBundleDir, 'CHANGELOG.md');
266
258
  const releases = await releaseState.getReleases({ projectId, status: PROJECT.RELEASE_STATUS.published });
267
259
  const changelog = releases.map((_release) => {
268
260
  const { blockletVersion: version, note: content } = _release;
@@ -275,7 +267,7 @@ const createRelease = async ({
275
267
  app: blocklet,
276
268
  projectId,
277
269
  releaseId: _releaseId,
278
- exportDir: tmpBundleDir,
270
+ exportDir: releaseBundleDir,
279
271
  blockletDid,
280
272
  });
281
273
 
@@ -295,10 +287,10 @@ const createRelease = async ({
295
287
  files: project.blockletScreenshots?.length ? ['screenshots'] : [],
296
288
  screenshots: project.blockletScreenshots || [],
297
289
  };
298
- await updateMetaFile(path.join(tmpBundleDir, BLOCKLET_META_FILE), meta);
290
+ await updateMetaFile(path.join(releaseBundleDir, BLOCKLET_META_FILE), meta);
299
291
 
300
292
  // create release
301
- await createBlockletRelease(tmpExportDir, { printError: logger.error, printInfo: logger.info });
293
+ await createBlockletRelease(releaseExportDir, { printError: logger.error, printInfo: logger.info });
302
294
 
303
295
  // archive
304
296
  const archive = createArchive('zip', { zlib: { level: 9 } });
@@ -306,7 +298,7 @@ const createRelease = async ({
306
298
 
307
299
  await new Promise((resolve, reject) => {
308
300
  archive
309
- .directory(tmpReleaseDir, false)
301
+ .directory(releaseReleaseDir, false)
310
302
  .on('error', (err) => reject(err))
311
303
  .pipe(writeStream);
312
304
 
@@ -320,13 +312,11 @@ const createRelease = async ({
320
312
  files: [releaseFileName],
321
313
  });
322
314
 
323
- await fs.remove(tmpDir);
324
-
325
315
  logger.info('create release success', res2);
326
316
 
327
317
  return res2;
328
318
  } catch (error) {
329
- await fs.remove(tmpDir);
319
+ await fs.remove(releaseExportDir);
330
320
  await fs.remove(releaseFile);
331
321
  if (action === 'create') {
332
322
  await fs.remove(releaseDir);
@@ -306,7 +306,7 @@ class BlockletState extends BaseState {
306
306
  return updated;
307
307
  }
308
308
 
309
- async upgradeBlocklet({ meta, source, deployedFrom = '', children } = {}) {
309
+ async upgradeBlocklet({ meta, source, deployedFrom = '', children, manualChildPorts } = {}) {
310
310
  const doc = await this.getBlocklet(meta.did);
311
311
  if (!doc) {
312
312
  throw new Error(`Blocklet does not exist on upgrade: ${meta.did}`);
@@ -336,6 +336,20 @@ class BlockletState extends BaseState {
336
336
  logger.info('Fill children ports when when upgrading blocklet', { name: doc.meta.name, did: doc.meta.did });
337
337
  await this.fillChildrenPorts(children, { oldChildren: doc.children, defaultPort: getMaxPort(ports) });
338
338
 
339
+ if (manualChildPorts?.length) {
340
+ logger.info('Fill manual child ports when when upgrading blocklet', {
341
+ did: doc.meta.did,
342
+ manualChildPorts,
343
+ });
344
+ children.forEach((child) => {
345
+ manualChildPorts.forEach((x) => {
346
+ if (child.meta.did === x.did) {
347
+ child.ports = x.ports;
348
+ }
349
+ });
350
+ });
351
+ }
352
+
339
353
  fixChildren(children);
340
354
 
341
355
  // add to db
@@ -630,7 +644,19 @@ class BlockletState extends BaseState {
630
644
  return children;
631
645
  }
632
646
 
633
- async addChildren(did, children) {
647
+ /**
648
+ *
649
+ * @param {string} did
650
+ * @param {array} children
651
+ * @param {{
652
+ * manualChildPorts: Array<{
653
+ * did: string,
654
+ * ports: Record<string, number>,
655
+ * }>
656
+ * }} param2
657
+ * @returns
658
+ */
659
+ async addChildren(did, children, { manualPorts = [] } = {}) {
634
660
  const parent = await this.getBlocklet(did);
635
661
  if (!parent) {
636
662
  throw new Error(`Blocklet does not exist on addChildren: ${did}`);
@@ -669,6 +695,7 @@ class BlockletState extends BaseState {
669
695
  source: parent.source,
670
696
  deployedFrom: parent.deployedFrom,
671
697
  children: newChildren,
698
+ manualChildPorts: manualPorts,
672
699
  });
673
700
  }
674
701
 
@@ -9,6 +9,7 @@ const createQueue = require('../util/queue');
9
9
  const IP = require('../util/ip');
10
10
  const states = require('../states');
11
11
  const { getBaseUrls } = require('../util');
12
+ const reduceQueue = require('./reduce-queue');
12
13
 
13
14
  const getSlackUrlInfo = async ({ blockletUrl, path: actionPath = '/notifications', serverUrls: urls }) => {
14
15
  const info = [];
@@ -132,14 +133,13 @@ module.exports = ({ events, dataDirs, instance }) => {
132
133
  },
133
134
  });
134
135
 
135
- events.on(EVENTS.NOTIFICATION_CREATE, (data) => {
136
- const { title, description, severity, action, entityType, blockletUrl } = data;
137
- queue.push({ title, description, status: severity, action, entityType, blockletUrl });
138
- });
139
-
140
- events.on(EVENTS.NOTIFICATION_BLOCKLET_CREATE, (data) => {
141
- const { title, description, severity, action, entityType, blockletUrl } = data;
142
- queue.push({ title, description, status: severity, action, entityType, blockletUrl });
136
+ [EVENTS.NOTIFICATION_CREATE, EVENTS.NOTIFICATION_BLOCKLET_CREATE].forEach((event) => {
137
+ events.on(event, (data) => {
138
+ const { title, description, severity, action, entityType, blockletUrl, entityId } = data;
139
+ if (!reduceQueue({ title, description, entityType, entityId, severity })) {
140
+ queue.push({ title, description, status: severity, action, entityType, blockletUrl });
141
+ }
142
+ });
143
143
  });
144
144
 
145
145
  events.on(EVENTS.NODE_STARTED, async (message) => {
@@ -0,0 +1,12 @@
1
+ const LRU = require('lru-cache');
2
+
3
+ const reduceCache = new LRU({ max: 50, maxAge: 5 * 1000 });
4
+
5
+ const reduceQueue = (obj) => {
6
+ const key = JSON.stringify(obj);
7
+ const has = reduceCache.has(key);
8
+ reduceCache.set(key, true);
9
+ return has;
10
+ };
11
+
12
+ module.exports = reduceQueue;
package/package.json CHANGED
@@ -3,7 +3,7 @@
3
3
  "publishConfig": {
4
4
  "access": "public"
5
5
  },
6
- "version": "1.16.23-beta-abdda301",
6
+ "version": "1.16.23-beta-035db744",
7
7
  "description": "",
8
8
  "main": "lib/index.js",
9
9
  "files": [
@@ -12,46 +12,46 @@
12
12
  "scripts": {
13
13
  "lint": "eslint tests lib",
14
14
  "lint:fix": "eslint --fix tests lib",
15
- "test": "node tools/jest.js --maxWorkers=2",
15
+ "test": "node tools/jest.js",
16
16
  "coverage": "npm run test -- --coverage"
17
17
  },
18
18
  "keywords": [],
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.23-beta-abdda301",
23
- "@abtnode/auth": "1.16.23-beta-abdda301",
24
- "@abtnode/certificate-manager": "1.16.23-beta-abdda301",
25
- "@abtnode/constant": "1.16.23-beta-abdda301",
26
- "@abtnode/cron": "1.16.23-beta-abdda301",
27
- "@abtnode/logger": "1.16.23-beta-abdda301",
28
- "@abtnode/models": "1.16.23-beta-abdda301",
29
- "@abtnode/queue": "1.16.23-beta-abdda301",
30
- "@abtnode/rbac": "1.16.23-beta-abdda301",
31
- "@abtnode/router-provider": "1.16.23-beta-abdda301",
32
- "@abtnode/static-server": "1.16.23-beta-abdda301",
33
- "@abtnode/timemachine": "1.16.23-beta-abdda301",
34
- "@abtnode/util": "1.16.23-beta-abdda301",
35
- "@arcblock/did": "1.18.108",
36
- "@arcblock/did-auth": "1.18.108",
37
- "@arcblock/did-ext": "^1.18.108",
22
+ "@abtnode/analytics": "1.16.23-beta-035db744",
23
+ "@abtnode/auth": "1.16.23-beta-035db744",
24
+ "@abtnode/certificate-manager": "1.16.23-beta-035db744",
25
+ "@abtnode/constant": "1.16.23-beta-035db744",
26
+ "@abtnode/cron": "1.16.23-beta-035db744",
27
+ "@abtnode/logger": "1.16.23-beta-035db744",
28
+ "@abtnode/models": "1.16.23-beta-035db744",
29
+ "@abtnode/queue": "1.16.23-beta-035db744",
30
+ "@abtnode/rbac": "1.16.23-beta-035db744",
31
+ "@abtnode/router-provider": "1.16.23-beta-035db744",
32
+ "@abtnode/static-server": "1.16.23-beta-035db744",
33
+ "@abtnode/timemachine": "1.16.23-beta-035db744",
34
+ "@abtnode/util": "1.16.23-beta-035db744",
35
+ "@arcblock/did": "1.18.110",
36
+ "@arcblock/did-auth": "1.18.110",
37
+ "@arcblock/did-ext": "^1.18.110",
38
38
  "@arcblock/did-motif": "^1.1.13",
39
- "@arcblock/did-util": "1.18.108",
40
- "@arcblock/event-hub": "1.18.108",
41
- "@arcblock/jwt": "^1.18.108",
39
+ "@arcblock/did-util": "1.18.110",
40
+ "@arcblock/event-hub": "1.18.110",
41
+ "@arcblock/jwt": "^1.18.110",
42
42
  "@arcblock/pm2-events": "^0.0.5",
43
- "@arcblock/validator": "^1.18.108",
44
- "@arcblock/vc": "1.18.108",
45
- "@blocklet/constant": "1.16.23-beta-abdda301",
46
- "@blocklet/env": "1.16.23-beta-abdda301",
47
- "@blocklet/meta": "1.16.23-beta-abdda301",
48
- "@blocklet/resolver": "1.16.23-beta-abdda301",
49
- "@blocklet/sdk": "1.16.23-beta-abdda301",
50
- "@did-space/client": "^0.3.56",
43
+ "@arcblock/validator": "^1.18.110",
44
+ "@arcblock/vc": "1.18.110",
45
+ "@blocklet/constant": "1.16.23-beta-035db744",
46
+ "@blocklet/env": "1.16.23-beta-035db744",
47
+ "@blocklet/meta": "1.16.23-beta-035db744",
48
+ "@blocklet/resolver": "1.16.23-beta-035db744",
49
+ "@blocklet/sdk": "1.16.23-beta-035db744",
50
+ "@did-space/client": "^0.3.58",
51
51
  "@fidm/x509": "^1.2.1",
52
- "@ocap/mcrypto": "1.18.108",
53
- "@ocap/util": "1.18.108",
54
- "@ocap/wallet": "1.18.108",
52
+ "@ocap/mcrypto": "1.18.110",
53
+ "@ocap/util": "1.18.110",
54
+ "@ocap/wallet": "1.18.110",
55
55
  "@slack/webhook": "^5.0.4",
56
56
  "archiver": "^5.3.1",
57
57
  "axios": "^0.27.2",
@@ -102,5 +102,5 @@
102
102
  "jest": "^29.7.0",
103
103
  "unzipper": "^0.10.11"
104
104
  },
105
- "gitHead": "2b064df15b34007f6145170ee691ae9e91ff1528"
105
+ "gitHead": "43b1f85fa413b81be8b8015031ac271a9d9f3456"
106
106
  }