@steedos/service-package-registry 3.0.0-beta.8 → 3.0.0-beta.80

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.
Files changed (26) hide show
  1. package/main/default/manager/loader.js +3 -3
  2. package/main/default/manager/packages.js +4 -2
  3. package/main/default/manager/registry.js +8 -1
  4. package/main/default/objects/steedos_packages/buttons/disable.button.js +51 -0
  5. package/main/default/objects/steedos_packages/buttons/disable.button.yml +4 -0
  6. package/main/default/objects/steedos_packages/buttons/edit_npmrc.button.js +8 -0
  7. package/main/default/objects/steedos_packages/buttons/edit_npmrc.button.yml +86 -0
  8. package/main/default/objects/steedos_packages/buttons/enable.button.js +52 -0
  9. package/main/default/objects/steedos_packages/buttons/enable.button.yml +4 -0
  10. package/main/default/objects/steedos_packages/buttons/installPackageFromUrl.button.js +8 -0
  11. package/main/default/objects/steedos_packages/buttons/installPackageFromUrl.button.yml +135 -0
  12. package/main/default/objects/steedos_packages/buttons/reload.button.js +34 -0
  13. package/main/default/objects/steedos_packages/buttons/reload.button.yml +4 -0
  14. package/main/default/objects/steedos_packages/buttons/uninstall.button.js +57 -0
  15. package/main/default/objects/steedos_packages/buttons/uninstall.button.yml +4 -0
  16. package/main/default/objects/steedos_packages/buttons/upgradePackage.button.js +22 -0
  17. package/main/default/objects/steedos_packages/buttons/upgradePackage.button.yml +147 -0
  18. package/main/default/objects/steedos_packages/fields/isUnmanaged.field.yml +4 -0
  19. package/main/default/objects/steedos_packages/listviews/all.listview.yml +1 -0
  20. package/main/default/pages/steedos_package_detail.page.amis.json +1 -30
  21. package/main/default/pages/steedos_packages_list.page.amis.json +3 -9
  22. package/main/default/routes/nodes.router.js +292 -0
  23. package/main/default/routes/registry.router.js +21 -0
  24. package/main/default/triggers/steedos_packages.trigger.js +7 -13
  25. package/package.json +6 -6
  26. package/project.package.service.js +35 -12
@@ -114,7 +114,7 @@ const loadPackages = async ()=>{
114
114
  }
115
115
  }
116
116
  } catch (error) {
117
- console.error(`start package ${packageName} error: ${error.message}`)
117
+ console.error(`start package ${packageName} error[117]: ${error.message}`)
118
118
  }
119
119
 
120
120
  }else if(package.local !== true){
@@ -132,7 +132,7 @@ const loadPackages = async ()=>{
132
132
  const packageInfo = await loadPackage(packageName);
133
133
  appendToPackagesConfig(packageInfo.name, {version: packageInfo.version, description: packageInfo.description, local: false});
134
134
  } catch (error) {
135
- console.error(`start package ${packageName} error: ${error.message}`)
135
+ console.error(`start package ${packageName} error[135]: ${error.message}`)
136
136
  }
137
137
  }
138
138
  }else if(package.local === true && package.static != true){
@@ -147,7 +147,7 @@ const loadPackages = async ()=>{
147
147
  appendToPackagesConfig(packageInfo.name, {version: packageInfo.version, description: packageInfo.description, local: true});
148
148
  }
149
149
  } catch (error) {
150
- console.error(`start package ${packageName} error: ${error.message}`)
150
+ console.error(`start package ${packageName} error[150]: ${error.message}`)
151
151
  }
152
152
  }
153
153
  }
@@ -71,6 +71,7 @@ const getAllPackages = async ()=>{
71
71
  _package.instance_id = packageInfo.instanceID
72
72
  _package.version = packageInfo.version
73
73
  _package.homepage = packageInfo.homepage
74
+ _package.isUnmanaged = packageInfo.isUnmanaged
74
75
  }else{
75
76
  packages.push({
76
77
  label: packageInfo.label || packageName,
@@ -84,7 +85,8 @@ const getAllPackages = async ()=>{
84
85
  instance_id: packageInfo.instanceID,
85
86
  status : 'enable',
86
87
  version : packageInfo.version,
87
- local: false
88
+ local: false,
89
+ isUnmanaged: packageInfo.isUnmanaged
88
90
  })
89
91
  }
90
92
  })
@@ -129,7 +131,7 @@ const maintainSystemFiles = ()=>{
129
131
  const getPackageVersions = async (packageName, options)=>{
130
132
  //TODO 处理 registry_url
131
133
 
132
- let registry_url = registryUrl(packageName.toLowerCase().split('/')[0]);
134
+ let registry_url = process.env.NPM_REGISTRY_URL || registryUrl(packageName.toLowerCase().split('/')[0]);
133
135
 
134
136
  const result = await packageJson(packageName.toLowerCase(), {
135
137
  allVersions: true,
@@ -282,10 +282,17 @@ async function yarnAddPackage(yarnPackage){
282
282
  paths: [path.join(installDir, 'node_modules')]
283
283
  }))
284
284
  if(fs.existsSync(path.join(packagePath, 'package.service.js'))){
285
+ // eslint-disable-next-line @typescript-eslint/no-require-imports, no-undef
286
+ const schema = require(path.join(packagePath, 'package.service.js'));
287
+ schema.settings.packageInfo = {
288
+ ...schema.settings?.packageInfo,
289
+ ...(schema.metadata && schema.metadata.$package ? schema.metadata.$package : {}),
290
+ }
285
291
  steedosPackages.push({
286
292
  name: parsed.name,
287
293
  version: parsed.rawSpec,
288
- path: packagePath
294
+ path: packagePath,
295
+ isUnmanaged: schema.settings.packageInfo.isUnmanaged
289
296
  })
290
297
  }
291
298
  })
@@ -0,0 +1,51 @@
1
+ module.exports = {
2
+ disable: function (object_name, record_id) {
3
+ Steedos.sobject(object_name).retrieve(record_id).then((record)=>{
4
+ if(!record){
5
+ return SteedosUI.notification.error({message: '未找到软件包'})
6
+ }
7
+ SteedosUI.Modal.confirm({
8
+ title: t('steedos_packages.disable.title'),
9
+ content: t('steedos_packages.disable.text') + ` ${record.name}?`,
10
+ okText: t('steedos_packages.disable.title'),
11
+ cancelText: t('Cancel'),
12
+ onOk: function(){
13
+ Steedos.authRequest(Steedos.absoluteUrl('/api/nodes/disable'), {type: 'post', async: false, data: JSON.stringify({
14
+ module: record.name,
15
+ nodeID: window.$("#steedos_package_main_node").val()
16
+ }),
17
+ success: function(data){
18
+ if(data.status == 1){
19
+ SteedosUI.notification.error({message: data.msg});
20
+ return;
21
+ }
22
+ setTimeout(function(){
23
+ SteedosUI.notification.success({
24
+ message: t('steedos_packages.disable.toastr_success')
25
+ });
26
+ window.location.reload()
27
+ }, 1000 * 2)
28
+ },
29
+ error: function(XMLHttpRequest){
30
+ SteedosUI.notification.error({message: XMLHttpRequest.responseJSON.msg});
31
+ }
32
+ })
33
+ }
34
+ });
35
+ })
36
+
37
+ },
38
+ disableVisible: function (object_name, record_id, permission, data) {
39
+ if(Steedos.settings.public.enable_saas){
40
+ return false;
41
+ }
42
+ const record = data?.record || {};
43
+ if(record.isUnmanaged){
44
+ return false
45
+ }
46
+ if (record.status === 'enable') {
47
+ return true;
48
+ }
49
+ return false
50
+ }
51
+ }
@@ -0,0 +1,4 @@
1
+ name: disable
2
+ is_enable: true
3
+ label: 停用
4
+ 'on': record
@@ -0,0 +1,8 @@
1
+ module.exports = {
2
+ edit_npmrcVisible: function (object_name, record_id) {
3
+ if(Steedos.settings.public.enable_saas){
4
+ return false;
5
+ }
6
+ return Steedos.isSpaceAdmin();
7
+ }
8
+ }
@@ -0,0 +1,86 @@
1
+ name: edit_npmrc
2
+ amis_schema: |-
3
+ {
4
+ "type": "service",
5
+ "body": [
6
+ {
7
+ "type": "button",
8
+ "label": "验证信息",
9
+ "id": "u:edit_npmrc",
10
+ "editorState": "default",
11
+ "onEvent": {
12
+ "click": {
13
+ "weight": 0,
14
+ "actions": [
15
+ {
16
+ "actionType": "dialog",
17
+ "dialog": {
18
+ "type": "dialog",
19
+ "title": "验证信息",
20
+ "body": [
21
+ {
22
+ "type": "form",
23
+ "title": "表单",
24
+ "body": [
25
+ {
26
+ "type": "editor",
27
+ "label": false,
28
+ "name": "npmrc",
29
+ "id": "u:71b44f532def",
30
+ "language": "bat"
31
+ }
32
+ ],
33
+ "id": "u:c9b0e17d4ebd",
34
+ "initApi": {
35
+ "url": "/api/nodes/npmrc",
36
+ "method": "get"
37
+ },
38
+ "api": {
39
+ "url": "/api/nodes/npmrc",
40
+ "method": "post",
41
+ "requestAdaptor": "",
42
+ "adaptor": "",
43
+ "messages": {}
44
+ }
45
+ },
46
+ {
47
+ "type": "tpl",
48
+ "tpl": "<br/>"
49
+ },
50
+ {
51
+ "type": "markdown",
52
+ "value": "##### 验证信息说明(.npmrc):\r- `; 为范围包设置新的注册表`\r- `@myscope:registry=https://mycustomregistry.example.org`\r- `; 配置新注册表的认证信息(可选)`\r- `//mycustomregistry.example.org:_authToken=\"认证信息\"`"
53
+ }
54
+ ],
55
+ "showCloseButton": true,
56
+ "showErrorMsg": true,
57
+ "showLoading": true,
58
+ "className": "app-popover",
59
+ "id": "u:00682dd0eb74",
60
+ "closeOnEsc": false,
61
+ "size": "lg"
62
+ }
63
+ }
64
+ ]
65
+ }
66
+ }
67
+ }
68
+ ],
69
+ "regions": [
70
+ "body"
71
+ ],
72
+ "data": {
73
+ "context": {},
74
+ "dataComponentId": "",
75
+ "record_id": "",
76
+ "record": {},
77
+ "permissions": {}
78
+ },
79
+ "bodyClassName": "p-0",
80
+ "id": "u:743d34f49376"
81
+ }
82
+ is_enable: true
83
+ label: 验证信息
84
+ 'on': list
85
+ type: amis_button
86
+ visible: true
@@ -0,0 +1,52 @@
1
+ module.exports = {
2
+ enable: function (object_name, record_id) {
3
+ Steedos.sobject(object_name).retrieve(record_id).then((record)=>{
4
+ if(!record){
5
+ return SteedosUI.notification.error({message: '未找到软件包'})
6
+ }
7
+ console.log('record.....',record)
8
+
9
+ SteedosUI.Modal.confirm({
10
+ title: '启用',
11
+ content: `确定要启用${record.name}?`,
12
+ okText: '启用',
13
+ cancelText: '取消',
14
+ onOk: function(){
15
+ Steedos.authRequest(Steedos.absoluteUrl('/api/nodes/enable'), {type: 'post', async: false, data: JSON.stringify({
16
+ module: record.name,
17
+ nodeID: window.$("#steedos_package_main_node").val()
18
+ }),
19
+ success: function(data){
20
+ if(data.status == 1){
21
+ SteedosUI.notification.error({message: data.msg});
22
+ return;
23
+ }
24
+ setTimeout(function(){
25
+ SteedosUI.notification.success({
26
+ message: t('已启用')
27
+ });
28
+ window.location.reload()
29
+ }, 1000 * 2)
30
+ },
31
+ error: function(XMLHttpRequest){
32
+ SteedosUI.notification.error({message: XMLHttpRequest.responseJSON.msg});
33
+ }
34
+ })
35
+ }
36
+ });
37
+ })
38
+ },
39
+ enableVisible: function (object_name,record_id, permission, data) {
40
+ if(Steedos.settings.public.enable_saas){
41
+ return false;
42
+ }
43
+ const record = data?.record || {};
44
+ if(record.isUnmanaged){
45
+ return false
46
+ }
47
+ if(record.status !== 'enable'){
48
+ return true;
49
+ }
50
+ return false
51
+ }
52
+ }
@@ -0,0 +1,4 @@
1
+ name: enable
2
+ is_enable: true
3
+ label: 启用
4
+ 'on': record
@@ -0,0 +1,8 @@
1
+ module.exports = {
2
+ installPackageFromUrlVisible: function (object_name, record_id) {
3
+ if(Steedos.settings.public.enable_saas){
4
+ return false;
5
+ }
6
+ return Steedos.isSpaceAdmin();
7
+ }
8
+ }
@@ -0,0 +1,135 @@
1
+ name: installPackageFromUrl
2
+ label: 手动安装软件包
3
+ 'on': list
4
+ #TODO: ${'steedos_packages.install.initialization_failure' | t} ,${'steedos_packages.install.installation_success' | t},${'steedos_packages.install.installation_failure' | t},等待amis合并分支,可用该代码,用于form组件的message属性
5
+ amis_schema: |-
6
+ {
7
+ "type": "service",
8
+ "body": [
9
+ {
10
+ "type": "button",
11
+ "label": "${'steedos_packages.install.install_package_from_url' | t}",
12
+ "id": "u:install_package_from_url",
13
+ "onEvent": {
14
+ "click": {
15
+ "actions": [
16
+ {
17
+ "actionType": "dialog",
18
+ "dialog": {
19
+ "type": "dialog",
20
+ "title": "${'steedos_packages.install.install_package_from_url' | t}",
21
+ "body": [
22
+ {
23
+ "type": "form",
24
+ "id": "u:add9d810b386",
25
+ "title": "",
26
+ "body": [
27
+ {
28
+ "label": "${'steedos_packages.install.package_name' | t}",
29
+ "type": "input-text",
30
+ "name": "package",
31
+ "id": "u:524cb8f8d888",
32
+ "required": true
33
+ },
34
+ {
35
+ "label": "镜像源",
36
+ "type": "input-text",
37
+ "name": "registry",
38
+ "id": "u:524cb8f8d666",
39
+ "required": false,
40
+ "options": [
41
+ {
42
+ "label": "淘宝源",
43
+ "value": "https://registry.npmmirror.com"
44
+ },
45
+ {
46
+ "label": "cnpm",
47
+ "value": "https://r.cnpmjs.org"
48
+ },
49
+ {
50
+ "label": "官方源",
51
+ "value": "https://registry.npmjs.org"
52
+ }
53
+ ]
54
+ }
55
+ ],
56
+ "mode": "normal",
57
+ "api": {
58
+ "method": "post",
59
+ "url": "${context.rootUrl}/api/nodes/package/add",
60
+ "data": {
61
+ "&": "$$"
62
+ },
63
+ "dataType": "json",
64
+ "requestAdaptor": "api.data = {package: api.body.registry ? `${api.body.package} --registry ${api.body.registry}` : api.body.package};",
65
+ "headers": {
66
+ "Authorization": "Bearer ${context.tenantId},${context.authToken}"
67
+ }
68
+ },
69
+ "messages": {
70
+ "fetchFailed": "初始化失败",
71
+ "saveSuccess": "安装成功",
72
+ "saveFailed": "安装失败"
73
+ },
74
+ "onEvent": {
75
+ "submitSucc": {
76
+ "weight": 0,
77
+ "actions": [
78
+ {
79
+ "actionType": "wait",
80
+ "args": {
81
+ "time": 3000
82
+ }
83
+ },
84
+ {
85
+ "actionType": "broadcast",
86
+ "args": {
87
+ "eventName": "@data.changed.steedos_packages"
88
+ },
89
+ "data": {
90
+ "objectName": "steedos_packages",
91
+ "recordId": "install"
92
+ }
93
+ }
94
+ ]
95
+ }
96
+ }
97
+ },
98
+ {
99
+ "type": "tpl",
100
+ "tpl": "<br/>"
101
+ },
102
+ {
103
+ "type": "markdown",
104
+ "value": "##### 您可以使用以下选项之一指定版本: \r- `package-name`安装包的“最新”版本。 \r- `package-name@1.2.3`从以下位置安装包的特定版本 注册表。 \r- `package-name@tag`安装特定的“标签”。(例如)beta、next、latest"
105
+ },
106
+ {
107
+ "type": "markdown",
108
+ "value": "##### 您还可以指定来自不同位置的包:\r- `package-name` 从 npm 注册表安装包 \r- `file:/path/to/local/folder`安装一个位于本地文件系统的包。这对于测试您尚未发布到注册表的软件包很有用。 \r- `file:/path/to/local/tarball.tgz`从 gzip 压缩的 tarball,可用于在发布包之前共享包。 \r- `link:/path/to/local/folder`安装指向软件包的符号链接:在本地文件系统上。适用于monorepo环境。 \r- `<git remote url>`从远程 Git 存储库安装包。 \r- `<git remote url>#<branch/commit/tag>`从远程安装软件包特定 git 分支、git commit 或 git 标签处的 git 存储库。 \r- `https://my-project.org/package.tgz` 从远程gzip压缩压缩包。"
109
+ }
110
+ ],
111
+ "id": "u:efa30bace722",
112
+ "closeOnEsc": true,
113
+ "closeOnOutside": false,
114
+ "showCloseButton": true,
115
+ "size": "lg"
116
+ }
117
+ }
118
+ ],
119
+ "weight": 0
120
+ }
121
+ }
122
+ }
123
+ ],
124
+ "regions": [
125
+ "body"
126
+ ],
127
+ "data": {
128
+
129
+ },
130
+ "bodyClassName": "p-0",
131
+ "id": "u:43363bc48c62"
132
+ }
133
+ is_enable: true
134
+ type: amis_button
135
+ visible: true
@@ -0,0 +1,34 @@
1
+ module.exports = {
2
+ reload: function (object_name, record_id, permission, data) {
3
+ SteedosUI.notification.info({message: t('steedos_packages.reload.toastr_info')})
4
+ const record = data?.record || {};
5
+ //TODO nodeID
6
+ Steedos.authRequest(Steedos.absoluteUrl('/api/nodes/reload'), {type: 'post', async: false, data: JSON.stringify({
7
+ module: record.name,
8
+ nodeID: record.node_id
9
+ }),
10
+ success: function(){
11
+ setTimeout(function(){
12
+ SteedosUI.notification.success({message: t('steedos_packages.reload.toastr_success')})
13
+ window.location.reload()
14
+ }, 1000 * 5)
15
+ },
16
+ error: function(XMLHttpRequest){
17
+ SteedosUI.notification.error({message: XMLHttpRequest.responseJSON.error})
18
+ }
19
+ })
20
+ },
21
+ reloadVisible: function (object_name,record_id, permission, data) {
22
+ if(Steedos.settings.public.enable_saas){
23
+ return false;
24
+ }
25
+ const record = data?.record;
26
+ if(record.isUnmanaged){
27
+ return false
28
+ }
29
+ if(record.status === 'enable'){
30
+ return true;
31
+ }
32
+ return false
33
+ }
34
+ }
@@ -0,0 +1,4 @@
1
+ name: reload
2
+ is_enable: true
3
+ label: 重新加载
4
+ 'on': record
@@ -0,0 +1,57 @@
1
+ module.exports = {
2
+ uninstall: function (object_name, record_id) {
3
+ Steedos.sobject(object_name).retrieve(record_id).then((record)=>{
4
+ if(!record){
5
+ return SteedosUI.notification.error({message: '未找到软件包'})
6
+ }
7
+
8
+ SteedosUI.Modal.confirm({
9
+ title: t('steedos_packages.uninstall.text') + ` ${record.name} 吗?` ,
10
+ content: `卸载后,该软件包中的所有组件将被永久删除且无法恢复`,
11
+ okText: t('steedos_packages.uninstall.title'),
12
+ cancelText: t('Cancel'),
13
+ width: 480,
14
+ onOk: function(){
15
+ return new Promise((resolve, reject) => {
16
+ Steedos.authRequest(Steedos.absoluteUrl('/api/nodes/uninstall'), {type: 'post', async: false, data: JSON.stringify({
17
+ module: record.name,
18
+ nodeID: window.$("#steedos_package_main_node").val()
19
+ }),
20
+ success: function(data){
21
+ if(data.status == 1){
22
+ SteedosUI.notification.error({message: data.msg});
23
+ resolve(data);
24
+ return;
25
+ }
26
+ setTimeout(function(){
27
+ SteedosUI.notification.success({
28
+ message: t('steedos_packages.uninstall.toastr_success')
29
+ });
30
+ resolve(data);
31
+ navigate("/app/admin/steedos_packages")
32
+ }, 1000 * 2)
33
+ },
34
+ error: function(XMLHttpRequest){
35
+ SteedosUI.notification.error({message: XMLHttpRequest.responseJSON.msg});
36
+ reject()
37
+ }
38
+ })
39
+ })
40
+ }
41
+ });
42
+ })
43
+ },
44
+ uninstallVisible: function (object_name,record_id, permission, data) {
45
+ if(Steedos.settings.public.enable_saas){
46
+ return false;
47
+ }
48
+ const record = data?.record;
49
+ if(record.local || record.static){
50
+ return false;
51
+ }
52
+ if(record.status){
53
+ return true;
54
+ }
55
+ return false
56
+ }
57
+ }
@@ -0,0 +1,4 @@
1
+ name: uninstall
2
+ is_enable: true
3
+ label: 卸载
4
+ 'on': record
@@ -0,0 +1,22 @@
1
+ /*
2
+ * @Author: baozhoutao@steedos.com
3
+ * @Date: 2022-12-09 18:23:36
4
+ * @LastEditors: baozhoutao@steedos.com
5
+ * @LastEditTime: 2025-03-07 11:59:52
6
+ * @Description:
7
+ */
8
+ module.exports = {
9
+ upgradePackageVisible: function (object_name, record_id, permission, data) {
10
+ if(Steedos.settings.public.enable_saas){
11
+ return false;
12
+ }
13
+ const record = data?.record;
14
+ if(record.isUnmanaged){
15
+ return false
16
+ }
17
+ if (record.status === 'enable' && !record.local && !record.static) {
18
+ return true;
19
+ }
20
+ return false
21
+ }
22
+ }
@@ -0,0 +1,147 @@
1
+ name: upgradePackage
2
+ is_enable: true
3
+ label: 升级
4
+ 'on': record_only
5
+ amis_schema: |-
6
+ {
7
+ "type": "service",
8
+ "body": [
9
+ {
10
+ "type": "button",
11
+ "label": "${'steedos_packages.upgrade.upgrade_package' | t}",
12
+ "id": "u:upgrade_package",
13
+ "onEvent": {
14
+ "click": {
15
+ "actions": [
16
+ {
17
+ "actionType": "dialog",
18
+ "dialog": {
19
+ "type": "dialog",
20
+ "title": "${'steedos_packages.upgrade.select_version' | t}",
21
+ "body": [
22
+ {
23
+ "type": "form",
24
+ "body": [
25
+ {
26
+ "type": "picker",
27
+ "required": true,
28
+ "id": "u:ae8d73bea81b",
29
+ "label": false,
30
+ "name": "version",
31
+ "valueField": "version",
32
+ "options": [
33
+ ],
34
+ "modalMode": "dialog",
35
+ "multiple": false,
36
+ "embed": true,
37
+ "source": {
38
+ "method": "get",
39
+ "url": "${context.rootUrl}/api/nodes/versions?module=${record.name}",
40
+ "requestAdaptor": "api.data={}; return api;",
41
+ "headers": {
42
+ "Authorization": "Bearer ${context.tenantId},${context.authToken}"
43
+ }
44
+ },
45
+ "pickerSchema": {
46
+ "mode": "table",
47
+ "id": "u:34518bacaba7",
48
+ "perPageAvailable": [
49
+ 10
50
+ ],
51
+ "messages": {
52
+ },
53
+ "filter": null,
54
+ "columns": [
55
+ {
56
+ "label": "${'steedos_packages.upgrade.version_number' | t}",
57
+ "name": "version",
58
+ "id": "u:b0e787352cf4",
59
+ "placeholder": "-"
60
+ },
61
+ {
62
+ "label": "${'steedos_packages.upgrade.label' | t}",
63
+ "name": "tag",
64
+ "id": "u:f17df7e102a2",
65
+ "placeholder": "-"
66
+ }
67
+ ]
68
+ }
69
+ }
70
+ ],
71
+ "id": "u:14efe3589478",
72
+ "api": {
73
+ "method": "post",
74
+ "url": "${context.rootUrl}/api/nodes/upgrade",
75
+ "dataType": "json",
76
+ "requestAdaptor": "api.data = {module: api.body.record.name, version: api.body.version}",
77
+ "data": {
78
+ "&": "$$",
79
+ "context": "${context}",
80
+ "record": "${record}"
81
+ },
82
+ "headers": {
83
+ "Authorization": "Bearer ${context.tenantId},${context.authToken}"
84
+ }
85
+ },
86
+ "messages": {
87
+ "saveSuccess": "升级成功",
88
+ "saveFailed": "安装失败"
89
+ }
90
+ }
91
+ ],
92
+ "id": "u:c3960c3b1049",
93
+ "closeOnEsc": false,
94
+ "closeOnOutside": false,
95
+ "showCloseButton": true,
96
+ "data": {
97
+ "&": "$$",
98
+ "context": "${context}",
99
+ "record": "${record}"
100
+ },
101
+ "size": "md",
102
+ "actions": [
103
+ {
104
+ "type": "button",
105
+ "label": "${'steedos_packages.upgrade.cancel' | t}",
106
+ "onEvent": {
107
+ "click": {
108
+ "actions": [
109
+ {
110
+ "componentId": "",
111
+ "args": {
112
+ },
113
+ "actionType": "closeDialog"
114
+ }
115
+ ]
116
+ }
117
+ },
118
+ "id": "u:dbf7b7a9821c"
119
+ },
120
+ {
121
+ "type": "submit",
122
+ "label": "${'steedos_packages.upgrade.confirm' | t}",
123
+ "id": "u:0318127b7745",
124
+ "close": true,
125
+ "confirmText": "${'steedos_packages.upgrade.second_confirm' | t}",
126
+ "level": "primary"
127
+ }
128
+ ]
129
+ }
130
+ }
131
+ ],
132
+ "weight": 0
133
+ }
134
+ }
135
+ }
136
+ ],
137
+ "regions": [
138
+ "body"
139
+ ],
140
+ "data": {
141
+
142
+ },
143
+ "bodyClassName": "p-0",
144
+ "id": "u:721e4093f456"
145
+ }
146
+ type: amis_button
147
+ visible: true
@@ -0,0 +1,4 @@
1
+ name: isUnmanaged
2
+ type: boolean
3
+ label: 模板
4
+ visible_on: "{{false}}"
@@ -9,6 +9,7 @@ columns:
9
9
  - field: status
10
10
  - field: static
11
11
  - field: icon
12
+ - field: isUnmanaged
12
13
  filter_scope: space
13
14
  label: 所有软件包
14
15
  scrolling_mode: standard
@@ -14,7 +14,7 @@
14
14
  },
15
15
  {
16
16
  "type": "tabs",
17
- "className": "steedos-record-tabs bg-white p-4 mt-3 border-y",
17
+ "className": "steedos-record-tabs bg-white p-4 sm:m-4 sm:border sm:rounded",
18
18
  "tabs": [
19
19
  {
20
20
  "title": "简介",
@@ -75,35 +75,6 @@
75
75
  ],
76
76
  "className": "p-0",
77
77
  "id": "u:5d4e7e3f6ecc"
78
- },
79
- {
80
- "title": "依赖服务",
81
- "body": [
82
- {
83
- "type": "steedos-object-form",
84
- "label": "对象表单",
85
- "objectApiName": "${objectName}",
86
- "recordId": "${recordId}",
87
- "appId": "${appId}",
88
- "id": "u:fec578db3278",
89
- "mode": "read",
90
- "className": "mb-4",
91
- "fields": [
92
- "dependencies"
93
- ],
94
- "fieldsExtend": {
95
- "dependencies": {
96
- "label": false,
97
- "amis": {
98
- "type": "tpl",
99
- "tpl": "${dependencies | join:&nbsp;}"
100
- }
101
- }
102
- }
103
- }
104
- ],
105
- "className": "p-0",
106
- "id": "u:5d4e7e3f6ecc"
107
78
  }
108
79
  ],
109
80
  "id": "u:148cf8e840eb"
@@ -32,7 +32,7 @@
32
32
  "actions": [
33
33
  {
34
34
  "label": "${uiSchema.actions.enable.label}",
35
- "disabledOn": "${status === 'enable' || window:Steedos.settings.public.enable_saas}",
35
+ "disabledOn": "${status === 'enable' || window:Steedos.settings.public.enable_saas || isUnmanaged === true}",
36
36
  "className": "mr-4",
37
37
  "onEvent": {
38
38
  "click": {
@@ -48,7 +48,7 @@
48
48
  },
49
49
  {
50
50
  "label": "${uiSchema.actions.disable.label}",
51
- "disabledOn": "${status !== 'enable' || window:Steedos.settings.public.enable_saas}",
51
+ "disabledOn": "${status !== 'enable' || window:Steedos.settings.public.enable_saas || isUnmanaged === true}",
52
52
  "onEvent": {
53
53
  "click": {
54
54
  "actions": [
@@ -94,13 +94,7 @@
94
94
  "padding-top": "0.5rem",
95
95
  "padding-bottom": "0.5rem",
96
96
  "padding-left": "1rem",
97
- "padding-right": "1rem",
98
- "--tw-bg-opacity": "1",
99
- "background-color": "rgb(243 244 246 / var(--tw-bg-opacity))",
100
- "--tw-border-opacity": "1",
101
- "border-color": "rgb(209 213 219 / var(--tw-border-opacity))",
102
- "border-style": "solid",
103
- "border-bottom-width": "1px"
97
+ "padding-right": "1rem"
104
98
  },
105
99
  ".antd-Service.steedos-object-table .antd-Crud .antd-Cards .antd-Cards-body": {
106
100
  "margin": "0.25rem"
@@ -0,0 +1,292 @@
1
+ const express = require('express');
2
+ const router = express.Router();
3
+ const auth = require('@steedos/auth');
4
+ const objectql = require('@steedos/objectql');
5
+ let schema = objectql.getSteedosSchema();
6
+ const validator = require('validator');
7
+
8
+ const disabledChangePackageWithSaas = async (req, res, next) => {
9
+ if (validator.toBoolean(process.env.STEEDOS_TENANT_ENABLE_SAAS || 'false', true) != true) {
10
+ next();
11
+ }else {
12
+ // 禁止操作packages
13
+ res.status(500).send({ status: 'error', message: 'No permission' });
14
+ }
15
+ }
16
+
17
+ router.get('/api/nodes/install', disabledChangePackageWithSaas, auth.requireAuthentication, async function (req, res) {
18
+ const userSession = req.user;
19
+ const isSpaceAdmin = userSession.is_space_admin;
20
+ const body = JSON.parse(decodeURIComponent(Buffer.from(req.query.data, "base64").toString('utf8')));
21
+ if(!isSpaceAdmin){
22
+ return res.status(401).send({ message: 'No permission' });
23
+ }
24
+ try {
25
+ const { module, version, label, description, nodeID} = body || {};
26
+ let broker = schema.broker;
27
+ const result = await broker.call(`@steedos/service-project.installPackage`, {
28
+ module, version, label, description
29
+ },{
30
+ nodeID: nodeID
31
+ })
32
+ res.redirect(302, `/app/admin/steedos_packages/grid/all`);
33
+ // res.status(200).send(result); //TODO 完善返回信息
34
+ } catch (error) {
35
+ console.error(error);
36
+ res.status(500).send(error.message);
37
+ }
38
+ });
39
+
40
+ router.post('/api/nodes/uninstall', disabledChangePackageWithSaas, auth.requireAuthentication, async function (req, res) {
41
+ const userSession = req.user;
42
+ const isSpaceAdmin = userSession.is_space_admin;
43
+ const body = req.body;
44
+ if(!isSpaceAdmin){
45
+ return res.status(401).send({ message: 'No permission' });
46
+ }
47
+ try {
48
+ const { module, nodeID} = body || {};
49
+ let broker = schema.broker;
50
+ const result = await broker.call(`@steedos/service-project.uninstallPackage`, {
51
+ module
52
+ },{
53
+ nodeID: nodeID,
54
+ meta: {
55
+ user: userSession
56
+ }
57
+ })
58
+ res.status(200).send(result); //TODO 完善返回信息
59
+ } catch (error) {
60
+ console.error(error);
61
+ res.status(500).send(error.message);
62
+ }
63
+ });
64
+
65
+ router.post('/api/nodes/reload', disabledChangePackageWithSaas, auth.requireAuthentication, async function (req, res) {
66
+ const userSession = req.user;
67
+ const isSpaceAdmin = userSession.is_space_admin;
68
+ const body = req.body;
69
+ if(!isSpaceAdmin){
70
+ return res.status(401).send({ message: 'No permission' });
71
+ }
72
+ try {
73
+ const { module, nodeID} = body || {};
74
+ let broker = schema.broker;
75
+ const result = await broker.call(`@steedos/service-project.reloadPackage`, {
76
+ module
77
+ },{
78
+ nodeID: nodeID
79
+ })
80
+ res.status(200).send(result);
81
+ } catch (error) {
82
+ console.error(error);
83
+ res.status(500).send(error.message);
84
+ }
85
+ });
86
+
87
+ router.post('/api/nodes/disable', disabledChangePackageWithSaas, auth.requireAuthentication, async function (req, res) {
88
+ const userSession = req.user;
89
+ const isSpaceAdmin = userSession.is_space_admin;
90
+ const body = req.body;
91
+ if(!isSpaceAdmin){
92
+ return res.status(401).send({ message: 'No permission' });
93
+ }
94
+ try {
95
+ const { module, nodeID} = body || {};
96
+ let broker = schema.broker;
97
+ const result = await broker.call(`@steedos/service-project.disablePackage`, {
98
+ module
99
+ },{
100
+ nodeID: nodeID
101
+ })
102
+ res.status(200).send(result);
103
+ } catch (error) {
104
+ console.error(error);
105
+ res.status(500).send(error.message);
106
+ }
107
+ });
108
+
109
+ router.post('/api/nodes/enable', disabledChangePackageWithSaas, auth.requireAuthentication, async function (req, res) {
110
+ const userSession = req.user;
111
+ const isSpaceAdmin = userSession.is_space_admin;
112
+ const body = req.body;
113
+ if(!isSpaceAdmin){
114
+ return res.status(401).send({ message: 'No permission' });
115
+ }
116
+ try {
117
+ const { module, nodeID} = body || {};
118
+ let broker = schema.broker;
119
+ const result = await broker.call(`@steedos/service-project.enablePackage`, {
120
+ module
121
+ },{
122
+ nodeID: nodeID
123
+ })
124
+ res.status(200).send(result);
125
+ } catch (error) {
126
+ console.error(error);
127
+ res.status(200).send({
128
+ "status": 1,
129
+ "msg": error.message
130
+ }
131
+ );
132
+ // res.status(500).send(error.message);
133
+ }
134
+ });
135
+ router.get('/api/nodes/versions', disabledChangePackageWithSaas, auth.requireAuthentication, async function (req, res) {
136
+ const userSession = req.user;
137
+ const isSpaceAdmin = userSession.is_space_admin;
138
+ // console.log(`req.query`, req.query)
139
+ const body = req.query;
140
+ const { module } = body || {};
141
+ if(!module){
142
+ return res.status(500).send({ message: 'Not find module' });
143
+ }
144
+ if(!isSpaceAdmin){
145
+ return res.status(401).send({ message: 'No permission' });
146
+ }
147
+ try {
148
+
149
+ let broker = schema.broker;
150
+ const result = await broker.call(`@steedos/service-project.getPackageVersions`, {
151
+ module
152
+ })
153
+ res.status(200).send(result); //TODO 完善返回信息
154
+ } catch (error) {
155
+ console.error(error);
156
+ res.status(500).send(error.message);
157
+ }
158
+ });
159
+
160
+ router.post('/api/nodes/upgrade', disabledChangePackageWithSaas, auth.requireAuthentication, async function (req, res) {
161
+ const userSession = req.user;
162
+ const isSpaceAdmin = userSession.is_space_admin;
163
+ const body = req.body;
164
+ if(!isSpaceAdmin){
165
+ return res.status(401).send({ message: 'No permission' });
166
+ }
167
+ try {
168
+ const { module, version} = body || {};
169
+ let broker = schema.broker;
170
+ const result = await broker.call(`@steedos/service-project.upgradePackage`, {
171
+ module, version
172
+ })
173
+ res.status(200).send(result);
174
+ } catch (error) {
175
+ console.error(error);
176
+ res.status(500).send(error.message);
177
+ }
178
+ });
179
+
180
+ router.get('/api/nodes/cloud/saas/packages/purchased', disabledChangePackageWithSaas, auth.requireAuthentication, async function (req, res) {
181
+ const userSession = req.user;
182
+ try {
183
+ let broker = schema.broker;
184
+ const result = await broker.call(`@steedos/service-project.getCloudSaasPurchasedPackages`, {
185
+ }, {
186
+ meta: {
187
+ user: userSession
188
+ }
189
+ })
190
+ res.status(200).send(result);
191
+ } catch (error) {
192
+ console.error(error);
193
+ res.status(500).send(error.message);
194
+ }
195
+ });
196
+
197
+ router.post('/api/nodes/cloud/saas/packages/purchased', disabledChangePackageWithSaas, auth.requireAuthentication, async function(req, res){
198
+ const userSession = req.user;
199
+ try {
200
+ let broker = schema.broker;
201
+ const result = await broker.call(`@steedos/service-project.installPurchasedPackages`, {}, {
202
+ meta: {
203
+ user: userSession
204
+ }
205
+ })
206
+ res.status(200).send(result);
207
+ } catch (error) {
208
+ console.error(error);
209
+ res.status(500).send(error.message);
210
+ }
211
+ });
212
+
213
+ router.post('/api/nodes/cloud/saas/packages/url', disabledChangePackageWithSaas, auth.requireAuthentication, async function(req, res){
214
+ const userSession = req.user;
215
+ try {
216
+ let broker = schema.broker;
217
+ const { module, version, url, auth, registry_url } = req.body;
218
+ const result = await broker.call(`@steedos/service-project.installPackageFromUrl`, {module, version, url, auth, registry_url, fromClient: true}, {
219
+ meta: {
220
+ user: userSession
221
+ }
222
+ })
223
+ res.status(200).send(result);
224
+ } catch (error) {
225
+ console.error(error);
226
+ res.status(500).send(error.message);
227
+ }
228
+ })
229
+
230
+ router.get('/api/nodes/npmrc', disabledChangePackageWithSaas, auth.requireAuthentication, async function(req, res){
231
+ const userSession = req.user;
232
+ const isSpaceAdmin = userSession.is_space_admin;
233
+ if(!isSpaceAdmin){
234
+ return res.status(401).send({ message: 'No permission' });
235
+ }
236
+ try {
237
+ let broker = schema.broker;
238
+ const result = await broker.call(`@steedos/service-project.getNpmrc`, {}, {
239
+ meta: {
240
+ user: userSession
241
+ }
242
+ })
243
+ res.status(200).send({data: {npmrc: result}});
244
+ } catch (error) {
245
+ console.error(error);
246
+ res.status(500).send(error.message);
247
+ }
248
+ })
249
+
250
+ router.post('/api/nodes/npmrc', disabledChangePackageWithSaas, auth.requireAuthentication, async function(req, res){
251
+ const userSession = req.user;
252
+ const isSpaceAdmin = userSession.is_space_admin;
253
+ if(!isSpaceAdmin){
254
+ return res.status(401).send({ message: 'No permission' });
255
+ }
256
+ try {
257
+ let broker = schema.broker;
258
+ const { npmrc } = req.body;
259
+ const result = await broker.call(`@steedos/service-project.setNpmrc`, {npmrc}, {
260
+ meta: {
261
+ user: userSession
262
+ }
263
+ })
264
+ res.status(200).send(result);
265
+ } catch (error) {
266
+ console.error(error);
267
+ res.status(500).send(error.message);
268
+ }
269
+ });
270
+
271
+ router.post('/api/nodes/package/add', disabledChangePackageWithSaas, auth.requireAuthentication, async function(req, res){
272
+ const userSession = req.user;
273
+ const isSpaceAdmin = userSession.is_space_admin;
274
+ if(!isSpaceAdmin){
275
+ return res.status(401).send({ message: 'No permission' });
276
+ }
277
+ try {
278
+ let broker = schema.broker;
279
+ const { package: yarnPackage } = req.body;
280
+ const result = await broker.call(`@steedos/service-project.yarnAddPackage`, {yarnPackage, enable: true}, {
281
+ meta: {
282
+ user: userSession
283
+ }
284
+ })
285
+ res.status(200).send(result);
286
+ } catch (error) {
287
+ console.error(error.message);
288
+ res.status(500).send("安装软件包异常, 请检查参数或网络");
289
+ }
290
+ });
291
+
292
+ exports.default = router;
@@ -0,0 +1,21 @@
1
+ /*
2
+ * @Author: baozhoutao@steedos.com
3
+ * @Date: 2022-11-18 16:32:30
4
+ * @LastEditors: baozhoutao@steedos.com
5
+ * @LastEditTime: 2025-01-21 17:28:27
6
+ * @Description:
7
+ */
8
+ const express = require('express');
9
+ const router = express.Router();
10
+ const auth = require("@steedos/auth");
11
+
12
+ let STEEDOS_REGISTRY_URL = process.env.STEEDOS_REGISTRY_URL ? process.env.STEEDOS_REGISTRY_URL : 'https://registry.steedos.cn/';
13
+
14
+ router.get("/api/nodes/registry", auth.requireAuthentication, async function (req, res) {
15
+ res.status(200).send([
16
+ { label: "https://registry.npmjs.org/", value: "https://registry.npmjs.org/" },
17
+ { label: "https://registry.npm.taobao.org/", value: "https://registry.npm.taobao.org/" },
18
+ { label: STEEDOS_REGISTRY_URL, value: STEEDOS_REGISTRY_URL },
19
+ ]);
20
+ });
21
+ exports.default = router;
@@ -18,13 +18,9 @@ module.exports = {
18
18
  const { spaceId } = this;
19
19
  let dataList = await packages.getAllPackages();
20
20
  if (!_.isEmpty(dataList)) {
21
- const cloneValues = clone(this.data.values, false);
21
+ const cloneValues = [];
22
22
  dataList.forEach((doc) => {
23
- if (!_.find(this.data.values, (value) => {
24
- return value.name === doc.name
25
- })) {
26
- cloneValues.push(doc);
27
- }
23
+ cloneValues.push(doc)
28
24
  })
29
25
  const records = objectql.getSteedosSchema().metadataDriver.find(cloneValues, this.query, spaceId);
30
26
  if (records.length > 0) {
@@ -42,12 +38,10 @@ module.exports = {
42
38
  this.data.values = result.length;
43
39
  },
44
40
  afterFindOne: async function(){
45
- if(_.isEmpty(this.data.values)){
46
- const all = await packages.getAllPackages();
47
- const id = this.id;
48
- this.data.values = _.find(all, function(item){
49
- return item._id === id
50
- });
51
- }
41
+ const all = await packages.getAllPackages();
42
+ const id = this.id;
43
+ this.data.values = _.find(all, function(item){
44
+ return item._id === id
45
+ });
52
46
  }
53
47
  }
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@steedos/service-package-registry",
3
- "version": "3.0.0-beta.8",
3
+ "version": "3.0.0-beta.80",
4
4
  "description": "",
5
5
  "main": "package.service.js",
6
6
  "scripts": {
@@ -9,10 +9,10 @@
9
9
  "author": "",
10
10
  "license": "ISC",
11
11
  "dependencies": {
12
- "@steedos/auth": "3.0.0-beta.8",
13
- "@steedos/metadata-core": "3.0.0-beta.8",
14
- "@steedos/objectql": "3.0.0-beta.8",
15
- "@steedos/service-package-loader": "3.0.0-beta.8",
12
+ "@steedos/auth": "3.0.0-beta.80",
13
+ "@steedos/metadata-core": "3.0.0-beta.80",
14
+ "@steedos/objectql": "3.0.0-beta.80",
15
+ "@steedos/service-package-loader": "3.0.0-beta.80",
16
16
  "clone": "^2.1.2",
17
17
  "fs-extra": "8.1.0",
18
18
  "i18next": "20.3.2",
@@ -31,5 +31,5 @@
31
31
  "publishConfig": {
32
32
  "access": "public"
33
33
  },
34
- "gitHead": "723d92765db5342a374c7aacb5b835e69f77ca4b"
34
+ "gitHead": "32e451dcb9225c8968200081644d507bb67ebe17"
35
35
  }
@@ -76,6 +76,11 @@ module.exports = {
76
76
  uninstallPackage:{
77
77
  async handler(ctx) {
78
78
  const { module } = ctx.params
79
+ const packages = loader.loadPackagesConfig();
80
+ let packageConfig = _.find(packages, (_p, pname) => {
81
+ _p.name = pname;
82
+ return pname === module;
83
+ })
79
84
  await loader.removePackage(module);
80
85
  await registry.uninstallModule(module)
81
86
  await ctx.broker.call(`@steedos/service-packages.uninstall`, {
@@ -85,6 +90,17 @@ module.exports = {
85
90
  instanceID: ctx.broker.instanceID,
86
91
  }
87
92
  })
93
+ if(packageConfig?.isUnmanaged){
94
+ await ctx.broker.call(`~packages-@steedos/metadata-api.remove`, {
95
+ name: module
96
+ }, {
97
+ timeout: 0,
98
+ meta: {
99
+ user: ctx.meta.user
100
+ }
101
+ })
102
+ }
103
+
88
104
  return {};
89
105
  }
90
106
  },
@@ -250,8 +266,8 @@ module.exports = {
250
266
  },
251
267
  yarnAddPackage: {
252
268
  async handler(ctx) {
253
- const { yarnPackage } = ctx.params;
254
- return await this.yarnAddPackage(yarnPackage);
269
+ const { yarnPackage, enable = false } = ctx.params;
270
+ return await this.yarnAddPackage(yarnPackage, enable);
255
271
  }
256
272
  }
257
273
  },
@@ -460,11 +476,7 @@ module.exports = {
460
476
  throw new Error(`not support ${parsed.type}`);
461
477
  }
462
478
  if(parsed.type === 'file' || parsed.type === 'directory'){
463
- const pInfos = await this.yarnAddPackage(packageName)
464
- for(const pInfo of pInfos){
465
- await this.broker.call('@steedos/service-project.enablePackage', {module: pInfo.name})
466
- }
467
-
479
+ await this.yarnAddPackage(packageName, false, true)
468
480
  }else{
469
481
  if(installProps.url){
470
482
  //module, version, url, auth, enable, registry_url, broker
@@ -476,6 +488,7 @@ module.exports = {
476
488
  }
477
489
 
478
490
  } catch (error) {
491
+ console.error(error)
479
492
  this.broker.logger.error(`initialPackages: ${packageName}. ${error.message}`);
480
493
  }
481
494
  }
@@ -557,7 +570,8 @@ module.exports = {
557
570
  description: _packageInfo.description,
558
571
  metadata: metadata,
559
572
  static: _packageInfo.static,
560
- homepage: _packageInfo.homepage
573
+ homepage: _packageInfo.homepage,
574
+ isUnmanaged: _packageInfo.isUnmanaged
561
575
  }
562
576
  })
563
577
  }
@@ -565,28 +579,37 @@ module.exports = {
565
579
  }
566
580
  },
567
581
  yarnAddPackage: {
568
- async handler(yarnPackage) {
582
+ async handler(yarnPackage, enable=false, configEnable = false) {
569
583
  const packages = await registry.yarnAddPackage(yarnPackage);
570
584
  for (const packageInfo of packages) {
571
585
  const packagePath = packageInfo.path;
586
+ if(packageInfo.isUnmanaged){
587
+ enable = true;
588
+ }
572
589
  loader.appendToPackagesConfig(packageInfo.name, {
573
590
  version: packageInfo.version,
574
591
  path: util.getPackageRelativePath(process.cwd(), packagePath),
575
- enable: false
592
+ enable: configEnable || enable,
593
+ isUnmanaged: packageInfo.isUnmanaged || false
576
594
  });
595
+ if(enable){
596
+ await this.broker.call('@steedos/service-project.enablePackage', {module: packageInfo.name})
597
+ }
598
+
577
599
  const metadata = await loader.getPackageMetadata(util.getPackageRelativePath(process.cwd(), packagePath));
578
600
  const packageYmlData = loader.getPackageYmlData(packagePath);
579
601
  await this.broker.call(`@steedos/service-packages.install`, {
580
602
  serviceInfo: Object.assign({}, {
581
603
  version: packageInfo.version,
582
- path: packageInfo.path
604
+ path: packageInfo.path,
605
+ isUnmanaged: packageInfo.isUnmanaged || false
583
606
  }, {
584
607
  packageYmlData: packageYmlData,
585
608
  name: packageInfo.name,
586
609
  enable: false,
587
610
  nodeID: broker.nodeID,
588
611
  instanceID: broker.instanceID,
589
- metadata: metadata
612
+ metadata: metadata,
590
613
  })
591
614
  })
592
615
  }