@abtnode/core 1.16.53-beta-20251013-075536-64fcb94b → 1.16.53-beta-20251014-110009-8220e324

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.
@@ -4,6 +4,7 @@ const path = require('path');
4
4
  const get = require('lodash/get');
5
5
  const pick = require('lodash/pick');
6
6
  const { toBase58 } = require('@ocap/util');
7
+ const pAll = require('p-all');
7
8
 
8
9
  const defaultLogger = require('@abtnode/logger')('@abtnode/core:blocklet-downloader');
9
10
 
@@ -153,16 +154,19 @@ class BlockletDownloader extends EventEmitter {
153
154
  bundles: downloadList.map((x) => get(x, 'dist.tarball')),
154
155
  });
155
156
 
156
- await Promise.all(
157
+ await pAll(
157
158
  downloadList.map((meta) => {
158
- const url = meta.dist.tarball;
159
- return this.bundleDownloader.download(meta, did, url, {
160
- ...options,
161
- onProgress: (data) => {
162
- onProgress({ ...data, component: pick(meta, ['title', 'name', 'did', 'version']) });
163
- },
164
- });
165
- })
159
+ return () => {
160
+ const url = meta.dist.tarball;
161
+ return this.bundleDownloader.download(meta, did, url, {
162
+ ...options,
163
+ onProgress: (data) => {
164
+ onProgress({ ...data, component: pick(meta, ['title', 'name', 'did', 'version']) });
165
+ },
166
+ });
167
+ };
168
+ }),
169
+ 4
166
170
  );
167
171
 
168
172
  const isCancelled = await this.bundleDownloader.isCanceled(did);
@@ -189,7 +189,6 @@ const blueGreenStartBlocklet = async (
189
189
  isGreen: item.changeToGreen,
190
190
  });
191
191
 
192
- nextBlocklet.greenStatus = BlockletStatus.starting;
193
192
  manager.emit(BlockletEvents.statusChange, doc1);
194
193
 
195
194
  const nodeInfo = await states.node.read();
@@ -38954,7 +38954,7 @@ module.exports = require("zlib");
38954
38954
  /***/ ((module) => {
38955
38955
 
38956
38956
  "use strict";
38957
- module.exports = /*#__PURE__*/JSON.parse('{"name":"@abtnode/core","publishConfig":{"access":"public"},"version":"1.16.52","description":"","main":"lib/index.js","files":["lib"],"scripts":{"lint":"eslint tests lib --ignore-pattern \'tests/assets/*\'","lint:fix":"eslint --fix tests lib","test":"node tools/jest.js","test:disk":"CI=true npm run test tests/blocklet/manager/disk.spec.js","test:blue":"CI=true npm run test tests/blocklet/manager/disk-blue-green.spec.js","coverage":"npm run test -- --coverage"},"keywords":[],"author":"wangshijun <wangshijun2010@gmail.com> (http://github.com/wangshijun)","license":"Apache-2.0","dependencies":{"@abtnode/analytics":"1.16.52","@abtnode/auth":"1.16.52","@abtnode/certificate-manager":"1.16.52","@abtnode/constant":"1.16.52","@abtnode/cron":"1.16.52","@abtnode/db-cache":"1.16.52","@abtnode/docker-utils":"1.16.52","@abtnode/logger":"1.16.52","@abtnode/models":"1.16.52","@abtnode/queue":"1.16.52","@abtnode/rbac":"1.16.52","@abtnode/router-provider":"1.16.52","@abtnode/static-server":"1.16.52","@abtnode/timemachine":"1.16.52","@abtnode/util":"1.16.52","@aigne/aigne-hub":"^0.10.0","@arcblock/did":"1.25.6","@arcblock/did-connect-js":"1.25.6","@arcblock/did-ext":"1.25.6","@arcblock/did-motif":"^1.1.14","@arcblock/did-util":"1.25.6","@arcblock/event-hub":"1.25.6","@arcblock/jwt":"1.25.6","@arcblock/pm2-events":"^0.0.5","@arcblock/validator":"1.25.6","@arcblock/vc":"1.25.6","@blocklet/constant":"1.16.52","@blocklet/did-space-js":"^1.1.29","@blocklet/env":"1.16.52","@blocklet/error":"^0.2.5","@blocklet/meta":"1.16.52","@blocklet/resolver":"1.16.52","@blocklet/sdk":"1.16.52","@blocklet/server-js":"1.16.52","@blocklet/store":"1.16.52","@blocklet/theme":"^3.1.45","@fidm/x509":"^1.2.1","@ocap/mcrypto":"1.25.6","@ocap/util":"1.25.6","@ocap/wallet":"1.25.6","@slack/webhook":"^5.0.4","archiver":"^7.0.1","axios":"^1.7.9","axon":"^2.0.3","chalk":"^4.1.2","cross-spawn":"^7.0.3","dayjs":"^1.11.13","deep-diff":"^1.0.2","detect-port":"^1.5.1","envfile":"^7.1.0","escape-string-regexp":"^4.0.0","fast-glob":"^3.3.2","filesize":"^10.1.1","flat":"^5.0.2","fs-extra":"^11.2.0","get-port":"^5.1.1","hasha":"^5.2.2","is-base64":"^1.1.0","is-cidr":"4","is-ip":"3","is-url":"^1.2.4","joi":"17.12.2","joi-extension-semver":"^5.0.0","js-yaml":"^4.1.0","kill-port":"^2.0.1","lodash":"^4.17.21","node-stream-zip":"^1.15.0","p-all":"^3.0.0","p-limit":"^3.1.0","p-map":"^4.0.0","p-retry":"^4.6.2","p-wait-for":"^3.2.0","private-ip":"^2.3.4","rate-limiter-flexible":"^5.0.5","read-last-lines":"^1.8.0","semver":"^7.6.3","sequelize":"^6.35.0","shelljs":"^0.8.5","slugify":"^1.6.6","ssri":"^8.0.1","stream-throttle":"^0.1.3","stream-to-promise":"^3.0.0","systeminformation":"^5.23.3","tail":"^2.2.4","tar":"^6.1.11","transliteration":"^2.3.5","ua-parser-js":"^1.0.2","ufo":"^1.5.3","uuid":"^11.1.0","valid-url":"^1.0.9","which":"^2.0.2","xbytes":"^1.8.0"},"devDependencies":{"expand-tilde":"^2.0.2","express":"^4.18.2","jest":"^29.7.0","unzipper":"^0.10.11"},"gitHead":"e5764f753181ed6a7c615cd4fc6682aacf0cb7cd"}');
38957
+ module.exports = /*#__PURE__*/JSON.parse('{"name":"@abtnode/core","publishConfig":{"access":"public"},"version":"1.16.52","description":"","main":"lib/index.js","files":["lib"],"scripts":{"lint":"eslint tests lib --ignore-pattern \'tests/assets/*\'","lint:fix":"eslint --fix tests lib","test":"node tools/jest.js","test:disk":"CI=true npm run test tests/blocklet/manager/disk.spec.js","test:blue":"CI=true npm run test tests/blocklet/manager/disk-blue-green.spec.js","coverage":"npm run test -- --coverage"},"keywords":[],"author":"wangshijun <wangshijun2010@gmail.com> (http://github.com/wangshijun)","license":"Apache-2.0","dependencies":{"@abtnode/analytics":"1.16.52","@abtnode/auth":"1.16.52","@abtnode/certificate-manager":"1.16.52","@abtnode/constant":"1.16.52","@abtnode/cron":"1.16.52","@abtnode/db-cache":"1.16.52","@abtnode/docker-utils":"1.16.52","@abtnode/logger":"1.16.52","@abtnode/models":"1.16.52","@abtnode/queue":"1.16.52","@abtnode/rbac":"1.16.52","@abtnode/router-provider":"1.16.52","@abtnode/static-server":"1.16.52","@abtnode/timemachine":"1.16.52","@abtnode/util":"1.16.52","@aigne/aigne-hub":"^0.10.1","@arcblock/did":"1.25.6","@arcblock/did-connect-js":"1.25.6","@arcblock/did-ext":"1.25.6","@arcblock/did-motif":"^1.1.14","@arcblock/did-util":"1.25.6","@arcblock/event-hub":"1.25.6","@arcblock/jwt":"1.25.6","@arcblock/pm2-events":"^0.0.5","@arcblock/validator":"1.25.6","@arcblock/vc":"1.25.6","@blocklet/constant":"1.16.52","@blocklet/did-space-js":"^1.1.33","@blocklet/env":"1.16.52","@blocklet/error":"^0.2.5","@blocklet/meta":"1.16.52","@blocklet/resolver":"1.16.52","@blocklet/sdk":"1.16.52","@blocklet/server-js":"1.16.52","@blocklet/store":"1.16.52","@blocklet/theme":"^3.1.49","@fidm/x509":"^1.2.1","@ocap/mcrypto":"1.25.6","@ocap/util":"1.25.6","@ocap/wallet":"1.25.6","@slack/webhook":"^5.0.4","archiver":"^7.0.1","axios":"^1.7.9","axon":"^2.0.3","chalk":"^4.1.2","cross-spawn":"^7.0.3","dayjs":"^1.11.13","deep-diff":"^1.0.2","detect-port":"^1.5.1","envfile":"^7.1.0","escape-string-regexp":"^4.0.0","fast-glob":"^3.3.2","filesize":"^10.1.1","flat":"^5.0.2","fs-extra":"^11.2.0","get-port":"^5.1.1","hasha":"^5.2.2","is-base64":"^1.1.0","is-cidr":"4","is-ip":"3","is-url":"^1.2.4","joi":"17.12.2","joi-extension-semver":"^5.0.0","js-yaml":"^4.1.0","kill-port":"^2.0.1","lodash":"^4.17.21","node-stream-zip":"^1.15.0","p-all":"^3.0.0","p-limit":"^3.1.0","p-map":"^4.0.0","p-retry":"^4.6.2","p-wait-for":"^3.2.0","private-ip":"^2.3.4","rate-limiter-flexible":"^5.0.5","read-last-lines":"^1.8.0","semver":"^7.6.3","sequelize":"^6.35.0","shelljs":"^0.8.5","slugify":"^1.6.6","ssri":"^8.0.1","stream-throttle":"^0.1.3","stream-to-promise":"^3.0.0","systeminformation":"^5.23.3","tail":"^2.2.4","tar":"^6.1.11","transliteration":"^2.3.5","ua-parser-js":"^1.0.2","ufo":"^1.5.3","uuid":"^11.1.0","valid-url":"^1.0.9","which":"^2.0.2","xbytes":"^1.8.0"},"devDependencies":{"expand-tilde":"^2.0.2","express":"^4.18.2","jest":"^29.7.0","unzipper":"^0.10.11"},"gitHead":"e5764f753181ed6a7c615cd4fc6682aacf0cb7cd"}');
38958
38958
 
38959
38959
  /***/ }),
38960
38960
 
@@ -38,6 +38,7 @@ const createPackRelease = async ({
38
38
  blockletRepository,
39
39
  blockletVideos,
40
40
  blockletDocker,
41
+ blockletSingleton,
41
42
  contentType,
42
43
  manager,
43
44
  status,
@@ -66,6 +67,7 @@ const createPackRelease = async ({
66
67
  blockletVideos,
67
68
  blockletDocker,
68
69
  contentType,
70
+ blockletSingleton,
69
71
  };
70
72
 
71
73
  const releaseSchema = createReleaseSchema(status);
@@ -260,6 +262,9 @@ const createPackRelease = async ({
260
262
  files: project.blockletScreenshots?.length ? ['screenshots'] : [],
261
263
  screenshots: project.blockletScreenshots || [],
262
264
  videos: blockletVideos || [],
265
+ capabilities: {
266
+ singleton: !!blockletSingleton,
267
+ },
263
268
  };
264
269
 
265
270
  if (blockletDocker?.dockerImage && dockerYml) {
@@ -195,6 +195,7 @@ const createRelease = async ({
195
195
  blockletComponents,
196
196
  blockletResourceType,
197
197
  blockletDocker,
198
+ blockletSingleton,
198
199
  contentType,
199
200
  note,
200
201
  manager,
@@ -227,6 +228,7 @@ const createRelease = async ({
227
228
  uploadedResource,
228
229
  blockletResourceType,
229
230
  blockletDocker,
231
+ blockletSingleton,
230
232
  contentType,
231
233
  note,
232
234
  };
@@ -263,6 +265,7 @@ const createRelease = async ({
263
265
  blockletComponents,
264
266
  blockletResourceType,
265
267
  blockletDocker,
268
+ blockletSingleton,
266
269
  contentType,
267
270
  note,
268
271
  manager,
@@ -412,6 +415,9 @@ const createRelease = async ({
412
415
  files: project.blockletScreenshots?.length ? ['screenshots'] : [],
413
416
  screenshots: project.blockletScreenshots || [],
414
417
  videos: blockletVideos || [],
418
+ capabilities: {
419
+ singleton: !!blockletSingleton,
420
+ },
415
421
  };
416
422
 
417
423
  // create resource
@@ -3,6 +3,7 @@ const pickBy = require('lodash/pickBy');
3
3
  const get = require('lodash/get');
4
4
  const { EventEmitter } = require('events');
5
5
  const { EVENTS } = require('@abtnode/constant');
6
+ const { isAllowedReferer, isAllowedURL } = require('@abtnode/util/lib/ssrf-protector');
6
7
  const { API_VERSION, STATUS } = require('./util');
7
8
  const endpointQueueInit = require('./queues');
8
9
 
@@ -72,6 +73,17 @@ class WebhooksAPI extends EventEmitter {
72
73
  throw new Error('Missing required parameters');
73
74
  }
74
75
 
76
+ if (context?.referer) {
77
+ const { host = '' } = context || {};
78
+ if (!isAllowedReferer(context.referer, host)) {
79
+ throw new Error('Invalid request');
80
+ }
81
+ }
82
+
83
+ if (!(await isAllowedURL(input.url))) {
84
+ throw new Error('Invalid parameter: internal');
85
+ }
86
+
75
87
  const { webhookEndpointState } = await this.teamManager.getWebhookState(teamDid);
76
88
  const raw = pick(input, ALLOWED_UPDATE_FIELDS);
77
89
 
@@ -117,6 +129,19 @@ class WebhooksAPI extends EventEmitter {
117
129
  const updates = pick(data, ALLOWED_UPDATE_FIELDS);
118
130
  updates.updatedBy = getUserDid(context);
119
131
 
132
+ if (updates.url) {
133
+ if (context?.referer) {
134
+ const { host = '' } = context || {};
135
+ if (!isAllowedReferer(context.referer, host)) {
136
+ throw new Error('Invalid request');
137
+ }
138
+ }
139
+
140
+ if (!(await isAllowedURL(data.url))) {
141
+ throw new Error('Invalid parameter: internal');
142
+ }
143
+ }
144
+
120
145
  const result = await webhookEndpointState.updateWebhook(id, updates);
121
146
  return result;
122
147
  }
package/lib/locales/en.js CHANGED
@@ -7,12 +7,10 @@ module.exports = {
7
7
  space: {
8
8
  error: {
9
9
  title: 'Backup to DID Spaces Failed',
10
- forbidden:
11
- 'You don\'t have permission to back up. Try restoring the license on DID Spaces or reconnect.',
10
+ forbidden: "You don't have permission to back up. Try restoring the license on DID Spaces or reconnect.",
12
11
  },
13
12
  isFull: 'Your DID Spaces storage is full. Expand storage and try again.',
14
- lackOfSpace:
15
- 'Not enough storage space. Expand storage and try again.',
13
+ lackOfSpace: 'Not enough storage space. Expand storage and try again.',
16
14
  unableEnableAutoBackup: 'Connect to DID Spaces before enabling auto backup.',
17
15
  },
18
16
  },
@@ -0,0 +1,122 @@
1
+ {
2
+ "backup.space.error.title": {
3
+ "en": "Backup to DID Spaces Failed",
4
+ "value": {
5
+ "en": "Backup to DID Spaces Failed",
6
+ "es": "Copia de seguridad a DID Spaces falló",
7
+ "zh": "备份到 DID Spaces 失败",
8
+ "zh-TW": "備份到 DID Spaces 失敗",
9
+ "ja": "DID Spaces へのバックアップに失敗しました",
10
+ "ko": "DID Spaces 백업에 실패했습니다",
11
+ "de": "Backup nach DID Spaces fehlgeschlagen",
12
+ "hi": "DID Spaces पर बैकअप असफल",
13
+ "fr": "La sauvegarde vers DID Spaces a échoué",
14
+ "ar": "فشل النسخ الاحتياطي إلى DID Spaces",
15
+ "ru": "Резервное копирование в DID Spaces не выполнено",
16
+ "pt": "Backup para DID Spaces falhou",
17
+ "id": "Backup ke DID Spaces gagal",
18
+ "vi": "Sao lưu đến DID Spaces thất bại",
19
+ "th": "สำรองข้อมูลไปยัง DID Spaces ล้มเหลว"
20
+ }
21
+ },
22
+ "backup.space.error.forbidden": {
23
+ "en": "You don't have permission to back up. Try restoring the license on DID Spaces or reconnect.",
24
+ "value": {
25
+ "en": "You don't have permission to back up. Try restoring the license on DID Spaces or reconnect.",
26
+ "es": "No tienes permiso para hacer una copia de seguridad. Intenta restaurar la licencia en DID Spaces o volver a conectarte.",
27
+ "zh": "你没有权限备份。请在 DID Spaces 上尝试恢复授权或重新连接。",
28
+ "zh-TW": "你沒有權限備份。請在 DID Spaces 上嘗試恢復授權或重新連接。",
29
+ "ja": "バックアップする権限がありません。DID Spaces で ライセンスを復元するか、再接続してください。",
30
+ "ko": "백업 권한이 없습니다. DID Spaces 에서 라이선스를 복원하거나 다시 연결해 보십시오.",
31
+ "de": "Sie haben keine Berechtigung, eine Sicherung durchzuführen. Versuchen Sie, die Lizenz auf DID Spaces wiederherzustellen oder sich erneut zu verbinden.",
32
+ "hi": "आपके पास बैकअप बनाने की अनुमति नहीं है। DID Spaces पर लाइसेंस को पुनर्स्थापित करने की कोशिश करें या फिर से कनेक्ट करें।",
33
+ "fr": "Vous n'avez pas l'autorisation d'effectuer une sauvegarde. Essayez de restaurer la licence sur DID Spaces ou de vous reconnecter.",
34
+ "ar": "ليس لديك إذن لإجراء النسخ الاحتياطي. حاول استعادة الترخيص على DID Spaces أو أعد الاتصال.",
35
+ "ru": "У вас нет разрешения на создание резервной копии. Попробуйте восстановить лицензию на DID Spaces или переподключиться.",
36
+ "pt": "Você não tem permissão para fazer backup. Tente restaurar a licença em DID Spaces ou reconectar.",
37
+ "id": "Anda tidak memiliki izin untuk mencadangkan. Coba pulihkan lisensi di DID Spaces atau sambungkan kembali.",
38
+ "vi": "Bạn không có quyền sao lưu. Hãy thử khôi phục giấy phép trên DID Spaces hoặc kết nối lại.",
39
+ "th": "คุณไม่มีสิทธิ์ในการสำรองข้อมูล ลองกู้ใบอนุญาตบน DID Spaces หรือเชื่อมต่อใหม่อีกครั้ง."
40
+ }
41
+ },
42
+ "registry.getListError": {
43
+ "en": "Failed to get blocklet list from registry \"{registryUrl}\"",
44
+ "value": {
45
+ "en": "Failed to get blocklet list from registry \"{registryUrl}\"",
46
+ "es": "No se pudo obtener la lista de blocklet desde el registro “{registryUrl}”",
47
+ "zh": "无法从注册表获取 blocklet 列表“{registryUrl}”",
48
+ "zh-TW": "無法從註冊表取得 blocklet 列表“{registryUrl}”",
49
+ "ja": "レジストリから blocklet リストの取得に失敗しました「{registryUrl}」",
50
+ "ko": "레지스트리에서 blocklet 목록을 가져오지 못했습니다“{registryUrl}”",
51
+ "de": "Fehler beim Abrufen der blocklet-Liste aus dem Registry \"{registryUrl}\"",
52
+ "hi": "रेजिस्ट्री से blocklet सूची प्राप्त करने में विफल \"{registryUrl}\"",
53
+ "fr": "Échec de l'obtention de la liste de blocklet à partir du registre \"{registryUrl}\"",
54
+ "ar": "فشل في الحصول على قائمة blocklet من السجل \"{registryUrl}\"",
55
+ "ru": "Не удалось получить список blocklet из реестра \"{registryUrl}\"",
56
+ "pt": "Falhou ao obter a lista de blocklet do registro \"{registryUrl}\"",
57
+ "id": "Gagal mendapatkan daftar blocklet dari registry \"{registryUrl}\"",
58
+ "vi": "Không thể lấy danh sách blocklet từ registry \"{registryUrl}\"",
59
+ "th": "ไม่สามารถดึงรายการ blocklet จาก registry \"{registryUrl}\""
60
+ }
61
+ },
62
+ "backup.space.lackOfSpace": {
63
+ "en": "Not enough storage space. Expand storage and try again.",
64
+ "value": {
65
+ "en": "Not enough storage space. Expand storage and try again.",
66
+ "es": "No hay suficiente espacio de almacenamiento. Amplíe el almacenamiento y vuelva a intentarlo.",
67
+ "zh": "存储空间不足。请扩展存储后再试一次。",
68
+ "zh-TW": "儲存空間不足。請擴充儲存後再試一次。",
69
+ "ja": "ストレージの容量が不足しています。容量を拡張して、もう一度お試しください。",
70
+ "ko": "저장 공간이 부족합니다. 저장 공간을 확장하고 다시 시도하세요.",
71
+ "de": "Nicht genug Speicherplatz. Speicherplatz erweitern und erneut versuchen.",
72
+ "hi": "पर्याप्त स्टोरेज स्थान नहीं है. स्टोरेज बढ़ाएं और फिर से प्रयास करें.",
73
+ "fr": "Espace de stockage insuffisant. Élargissez le stockage et réessayez.",
74
+ "ar": "مساحة التخزين غير كافية. وسّع التخزين وحاول مرة أخرى.",
75
+ "ru": "Недостаточно свободного места. Расширьте место хранения и попробуйте снова.",
76
+ "pt": "Não há espaço de armazenamento suficiente. Expanda o armazenamento e tente novamente.",
77
+ "id": "Tidak cukup ruang penyimpanan. Perluas penyimpanan dan coba lagi.",
78
+ "vi": "Không còn đủ dung lượng lưu trữ. Mở rộng dung lượng và thử lại.",
79
+ "th": "ไม่มีพื้นที่เก็บข้อมูลเพียงพอ. ขยายพื้นที่จัดเก็บแล้วลองอีกครั้ง"
80
+ }
81
+ },
82
+ "backup.space.unableEnableAutoBackup": {
83
+ "en": "Connect to DID Spaces before enabling auto backup.",
84
+ "value": {
85
+ "en": "Connect to DID Spaces before enabling auto backup.",
86
+ "es": "Conéctese a DID Spaces antes de habilitar la copia de seguridad automática.",
87
+ "zh": "在启用自动备份之前 连接到 DID Spaces。",
88
+ "zh-TW": "在啟用自動備份之前 連接到 DID Spaces。",
89
+ "ja": "オートバックアップを有効にする前に DID Spaces に接続してください。",
90
+ "ko": "자동 백업을 활성화하기 전에 DID Spaces 에 연결하십시오.",
91
+ "de": "Verbinden Sie sich mit DID Spaces, bevor Sie die automatische Sicherung aktivieren",
92
+ "hi": "DID Spaces से कनेक्ट करें, ऑटो बैकअप सक्षम करने से पहले",
93
+ "fr": "Connectez-vous à DID Spaces avant d'activer la sauvegarde automatique",
94
+ "ar": "اتصل بـ DID Spaces قبل تمكين النسخ الاحتياطي التلقائي",
95
+ "ru": "Подключитесь к DID Spaces перед включением автоматического резервного копирования",
96
+ "pt": "Conecte-se a DID Spaces antes de ativar o backup automático.",
97
+ "id": "Hubungkan ke DID Spaces sebelum mengaktifkan backup otomatis.",
98
+ "vi": "Kết nối với DID Spaces trước khi kích hoạt sao lưu tự động.",
99
+ "th": "เชื่อมต่อกับ DID Spaces ก่อนเปิดใช้งานการสำรองข้อมูลอัตโนมัติ."
100
+ }
101
+ },
102
+ "backup.space.isFull": {
103
+ "en": "Your DID Spaces storage is full. Expand storage and try again.",
104
+ "value": {
105
+ "en": "Your DID Spaces storage is full. Expand storage and try again.",
106
+ "es": "El almacenamiento de DID Spaces está lleno. Expanda el almacenamiento y vuelva a intentarlo.",
107
+ "zh": "DID Spaces 存储已满。请扩展存储并重试。",
108
+ "zh-TW": "DID Spaces 存儲已滿。請擴充存儲空間並再試一次。",
109
+ "ja": "DID Spaces のストレージは満杯です。ストレージを拡張して、もう一度お試しください。",
110
+ "ko": "DID Spaces 저장 공간이 가득 찼습니다. 저장 공간을 확장하고 다시 시도하십시오.",
111
+ "de": "Ihr DID Spaces Speicherplatz ist voll. Speicherplatz erweitern und erneut versuchen.",
112
+ "hi": "आपका DID Spaces स्टोरेज भरा है। स्टोरेज बढ़ाएं और फिर से प्रयास करें।",
113
+ "fr": "Votre DID Spaces stockage est plein. Augmentez le stockage et réessayez.",
114
+ "ar": "سعة التخزين لـ DID Spaces ممتلئة. وسّع التخزين وحاول مرة أخرى.",
115
+ "ru": "Ваше хранилище DID Spaces заполнено. Расширьте хранилище и попробуйте снова.",
116
+ "pt": "O armazenamento do DID Spaces está cheio. Expanda o armazenamento e tente novamente.",
117
+ "id": "Penyimpanan DID Spaces Anda penuh. Perluas penyimpanan dan coba lagi.",
118
+ "vi": "Dung lượng DID Spaces của bạn đã đầy. Mở rộng dung lượng và thử lại.",
119
+ "th": "พื้นที่จัดเก็บ DID Spaces ของคุณเต็มแล้ว โปรดขยายพื้นที่และลองอีกครั้ง."
120
+ }
121
+ }
122
+ }
@@ -36,6 +36,7 @@ class Release extends BaseState {
36
36
  'blockletCommunity',
37
37
  'blockletRepository',
38
38
  'blockletDocker',
39
+ 'blockletSingleton',
39
40
  'contentType',
40
41
  'publishedStoreIds',
41
42
  'blockletComponents',
@@ -882,7 +882,7 @@ const startBlockletProcess = async (
882
882
  startLock.releaseLock(lockName);
883
883
  }
884
884
  },
885
- { parallel: true, concurrencyLimit: 4 }
885
+ { parallel: true, concurrencyLimit: 3 }
886
886
  );
887
887
  };
888
888
 
@@ -2357,6 +2357,7 @@ const ensureAppPortsNotOccupied = async ({ blocklet, componentDids: inputDids, s
2357
2357
  if (shouldSkipComponent(b.meta.did, inputDids)) return;
2358
2358
 
2359
2359
  if (!b.greenPorts) {
2360
+ occupiedDids.add(b.meta.did);
2360
2361
  b.greenPorts = {};
2361
2362
  }
2362
2363
  const { ports = {}, greenPorts } = b;
@@ -15,11 +15,11 @@ function isDockerOnlySingleInstance(meta = {}) {
15
15
  if (SINGLE_INSTANCE_COMPONENT_DIDS.has(meta.did)) {
16
16
  return true;
17
17
  }
18
- if (!meta.docker) {
19
- return false;
18
+ // 用于描述某个组件是否只能以单实例模式运行
19
+ if (meta.capabilities?.singleton) {
20
+ return true;
20
21
  }
21
- // 保留字段, 用于描述 docker 镜像支持多实例运行
22
- if (meta.docker.allowMultipleInstances) {
22
+ if (!meta.docker) {
23
23
  return false;
24
24
  }
25
25
  if (meta.docker.RunBaseScript && meta.docker.installNodeModules) {
@@ -99,6 +99,7 @@ const createReleaseSchema = (status) =>
99
99
  .default([]),
100
100
  }).optional(),
101
101
  uploadedResource,
102
+ blockletSingleton: Joi.boolean().optional().default(false),
102
103
  });
103
104
 
104
105
  module.exports = {
@@ -3,7 +3,7 @@ const { evaluateURLs } = require('@abtnode/util/lib/url-evaluation');
3
3
  const checkURLAccessible = require('@abtnode/util/lib/url-evaluation/check-accessible-node');
4
4
  const { EVENTS } = require('@abtnode/constant');
5
5
  const isEmpty = require('lodash/isEmpty');
6
- const { isAllowedReferer } = require('@abtnode/util/lib/ssrf-protector');
6
+ const { isAllowedReferer, isAllowedURL } = require('@abtnode/util/lib/ssrf-protector');
7
7
 
8
8
  const { joinURL } = require('ufo');
9
9
  const isUrl = require('is-url');
@@ -215,6 +215,14 @@ module.exports = ({ events, dataDirs, instance, teamManager }) => {
215
215
  try {
216
216
  const mockCreateRes = await webhookState.create(webhook, { mock: true });
217
217
  await sentTextMessage(mockCreateRes, `A ${mockCreateRes.type} integration is now *successfully added*`);
218
+ const urls = webhook.params.map((item) => item.value);
219
+
220
+ for (const url of urls) {
221
+ // eslint-disable-next-line no-await-in-loop
222
+ if (!(await isAllowedURL(url))) {
223
+ throw new Error('Invalid parameter: internal');
224
+ }
225
+ }
218
226
 
219
227
  const createRes = await webhookState.create(webhook);
220
228
  return createRes;
package/package.json CHANGED
@@ -3,7 +3,7 @@
3
3
  "publishConfig": {
4
4
  "access": "public"
5
5
  },
6
- "version": "1.16.53-beta-20251013-075536-64fcb94b",
6
+ "version": "1.16.53-beta-20251014-110009-8220e324",
7
7
  "description": "",
8
8
  "main": "lib/index.js",
9
9
  "files": [
@@ -21,22 +21,22 @@
21
21
  "author": "wangshijun <wangshijun2010@gmail.com> (http://github.com/wangshijun)",
22
22
  "license": "Apache-2.0",
23
23
  "dependencies": {
24
- "@abtnode/analytics": "1.16.53-beta-20251013-075536-64fcb94b",
25
- "@abtnode/auth": "1.16.53-beta-20251013-075536-64fcb94b",
26
- "@abtnode/certificate-manager": "1.16.53-beta-20251013-075536-64fcb94b",
27
- "@abtnode/constant": "1.16.53-beta-20251013-075536-64fcb94b",
28
- "@abtnode/cron": "1.16.53-beta-20251013-075536-64fcb94b",
29
- "@abtnode/db-cache": "1.16.53-beta-20251013-075536-64fcb94b",
30
- "@abtnode/docker-utils": "1.16.53-beta-20251013-075536-64fcb94b",
31
- "@abtnode/logger": "1.16.53-beta-20251013-075536-64fcb94b",
32
- "@abtnode/models": "1.16.53-beta-20251013-075536-64fcb94b",
33
- "@abtnode/queue": "1.16.53-beta-20251013-075536-64fcb94b",
34
- "@abtnode/rbac": "1.16.53-beta-20251013-075536-64fcb94b",
35
- "@abtnode/router-provider": "1.16.53-beta-20251013-075536-64fcb94b",
36
- "@abtnode/static-server": "1.16.53-beta-20251013-075536-64fcb94b",
37
- "@abtnode/timemachine": "1.16.53-beta-20251013-075536-64fcb94b",
38
- "@abtnode/util": "1.16.53-beta-20251013-075536-64fcb94b",
39
- "@aigne/aigne-hub": "^0.10.0",
24
+ "@abtnode/analytics": "1.16.53-beta-20251014-110009-8220e324",
25
+ "@abtnode/auth": "1.16.53-beta-20251014-110009-8220e324",
26
+ "@abtnode/certificate-manager": "1.16.53-beta-20251014-110009-8220e324",
27
+ "@abtnode/constant": "1.16.53-beta-20251014-110009-8220e324",
28
+ "@abtnode/cron": "1.16.53-beta-20251014-110009-8220e324",
29
+ "@abtnode/db-cache": "1.16.53-beta-20251014-110009-8220e324",
30
+ "@abtnode/docker-utils": "1.16.53-beta-20251014-110009-8220e324",
31
+ "@abtnode/logger": "1.16.53-beta-20251014-110009-8220e324",
32
+ "@abtnode/models": "1.16.53-beta-20251014-110009-8220e324",
33
+ "@abtnode/queue": "1.16.53-beta-20251014-110009-8220e324",
34
+ "@abtnode/rbac": "1.16.53-beta-20251014-110009-8220e324",
35
+ "@abtnode/router-provider": "1.16.53-beta-20251014-110009-8220e324",
36
+ "@abtnode/static-server": "1.16.53-beta-20251014-110009-8220e324",
37
+ "@abtnode/timemachine": "1.16.53-beta-20251014-110009-8220e324",
38
+ "@abtnode/util": "1.16.53-beta-20251014-110009-8220e324",
39
+ "@aigne/aigne-hub": "^0.10.1",
40
40
  "@arcblock/did": "1.25.6",
41
41
  "@arcblock/did-connect-js": "1.25.6",
42
42
  "@arcblock/did-ext": "1.25.6",
@@ -47,16 +47,16 @@
47
47
  "@arcblock/pm2-events": "^0.0.5",
48
48
  "@arcblock/validator": "1.25.6",
49
49
  "@arcblock/vc": "1.25.6",
50
- "@blocklet/constant": "1.16.53-beta-20251013-075536-64fcb94b",
51
- "@blocklet/did-space-js": "^1.1.29",
52
- "@blocklet/env": "1.16.53-beta-20251013-075536-64fcb94b",
50
+ "@blocklet/constant": "1.16.53-beta-20251014-110009-8220e324",
51
+ "@blocklet/did-space-js": "^1.1.33",
52
+ "@blocklet/env": "1.16.53-beta-20251014-110009-8220e324",
53
53
  "@blocklet/error": "^0.2.5",
54
- "@blocklet/meta": "1.16.53-beta-20251013-075536-64fcb94b",
55
- "@blocklet/resolver": "1.16.53-beta-20251013-075536-64fcb94b",
56
- "@blocklet/sdk": "1.16.53-beta-20251013-075536-64fcb94b",
57
- "@blocklet/server-js": "1.16.53-beta-20251013-075536-64fcb94b",
58
- "@blocklet/store": "1.16.53-beta-20251013-075536-64fcb94b",
59
- "@blocklet/theme": "^3.1.45",
54
+ "@blocklet/meta": "1.16.53-beta-20251014-110009-8220e324",
55
+ "@blocklet/resolver": "1.16.53-beta-20251014-110009-8220e324",
56
+ "@blocklet/sdk": "1.16.53-beta-20251014-110009-8220e324",
57
+ "@blocklet/server-js": "1.16.53-beta-20251014-110009-8220e324",
58
+ "@blocklet/store": "1.16.53-beta-20251014-110009-8220e324",
59
+ "@blocklet/theme": "^3.1.49",
60
60
  "@fidm/x509": "^1.2.1",
61
61
  "@ocap/mcrypto": "1.25.6",
62
62
  "@ocap/util": "1.25.6",
@@ -120,5 +120,5 @@
120
120
  "jest": "^29.7.0",
121
121
  "unzipper": "^0.10.11"
122
122
  },
123
- "gitHead": "0c9fd57c3ffd075ed9f0ed365f76167f91f11f5a"
123
+ "gitHead": "e3cc422d4f1fb565f74d77e02d847d4461e94436"
124
124
  }
Binary file