@gadmin2n/schematics 0.0.136 → 0.0.138
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/dist/lib/application/files/gadmin2-game-angle-demo/Dockerfile.server +2 -2
- package/dist/lib/application/files/gadmin2-game-angle-demo/compose-ctl.sh +1 -1
- package/dist/lib/application/files/gadmin2-game-angle-demo/config/prisma/canvas.prisma +1 -0
- package/dist/lib/application/files/gadmin2-game-angle-demo/config/prisma/workflow.prisma +14 -3
- package/dist/lib/application/files/gadmin2-game-angle-demo/config/ui/User.ts +4 -4
- package/dist/lib/application/files/gadmin2-game-angle-demo/docker-compose.md +2 -2
- package/dist/lib/application/files/gadmin2-game-angle-demo/docker-compose.yml +13 -92
- package/dist/lib/application/files/gadmin2-game-angle-demo/readme.md +105 -7
- package/dist/lib/application/files/gadmin2-game-angle-demo/server/ensure-database.js +1 -1
- package/dist/lib/application/files/gadmin2-game-angle-demo/server/package.json +5 -5
- package/dist/lib/application/files/gadmin2-game-angle-demo/server/prisma.config.ts +9 -1
- package/dist/lib/application/files/gadmin2-game-angle-demo/server/scripts/notify-dev-servers.js +9 -8
- package/dist/lib/application/files/gadmin2-game-angle-demo/server/scripts/wait-for-nest-ready.js +5 -5
- package/dist/lib/application/files/gadmin2-game-angle-demo/server/seed/workflow-node-types.ts +43 -2
- package/dist/lib/application/files/gadmin2-game-angle-demo/server/seed/workflow.seed.ts +9 -1
- package/dist/lib/application/files/gadmin2-game-angle-demo/server/seed/workflows.ts +24 -0
- package/dist/lib/application/files/gadmin2-game-angle-demo/server/src/modules/canvas/canvas-export.dto.ts +27 -0
- package/dist/lib/application/files/gadmin2-game-angle-demo/server/src/modules/canvas/canvas-export.service.spec.ts +430 -0
- package/dist/lib/application/files/gadmin2-game-angle-demo/server/src/modules/canvas/canvas-export.service.ts +203 -0
- package/dist/lib/application/files/gadmin2-game-angle-demo/server/src/modules/canvas/canvas.controller.ts +36 -3
- package/dist/lib/application/files/gadmin2-game-angle-demo/server/src/modules/canvas/canvas.module.ts +2 -1
- package/dist/lib/application/files/gadmin2-game-angle-demo/server/src/modules/temporalTenantConfig/temporalTenantConfig.controller.spec.ts +54 -0
- package/dist/lib/application/files/gadmin2-game-angle-demo/server/src/modules/temporalTenantConfig/temporalTenantConfig.controller.ts +245 -0
- package/dist/lib/application/files/gadmin2-game-angle-demo/server/src/modules/temporalTenantConfig/temporalTenantConfig.module.ts +10 -0
- package/dist/lib/application/files/gadmin2-game-angle-demo/server/src/modules/temporalTenantConfig/temporalTenantConfig.service.spec.ts +366 -0
- package/dist/lib/application/files/gadmin2-game-angle-demo/server/src/modules/temporalTenantConfig/temporalTenantConfig.service.ts +110 -0
- package/dist/lib/application/files/gadmin2-game-angle-demo/server/src/modules/workflow/workflow-execution.dto.ts +19 -1
- package/dist/lib/application/files/gadmin2-game-angle-demo/server/src/modules/workflow/workflow.controller.ts +15 -0
- package/dist/lib/application/files/gadmin2-game-angle-demo/server/src/modules/workflow/workflow.service.spec.ts +79 -0
- package/dist/lib/application/files/gadmin2-game-angle-demo/server/src/modules/workflow/workflow.service.ts +41 -19
- package/dist/lib/application/files/gadmin2-game-angle-demo/server/start-prod.sh +5 -5
- package/dist/lib/application/files/gadmin2-game-angle-demo/temporal/README.md +37 -573
- package/dist/lib/application/files/gadmin2-game-angle-demo/web/ecosystem.dev.config.cjs +12 -1
- package/dist/lib/application/files/gadmin2-game-angle-demo/web/package.json +2 -1
- package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/components/layout/header.tsx +3 -2
- package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/config/routeRegistry.tsx +39 -26
- package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/i18n.ts +3 -1
- package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/locales/en/common.json +3 -0
- package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/locales/zh_CN/common.json +3 -0
- package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/routes/canvas/CanvasEditPage.tsx +23 -5
- package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/routes/canvas/CanvasListPage.tsx +66 -10
- package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/routes/canvas/CanvasPage.tsx +16 -7
- package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/routes/canvas/CanvasToolbar.tsx +21 -0
- package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/routes/canvas/canvasApi.ts +30 -0
- package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/routes/canvas/components/ExportModal.tsx +84 -0
- package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/routes/canvas/components/ImportModal.tsx +166 -0
- package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/routes/canvas/hooks/useCanvasHistory.ts +52 -13
- package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/routes/workflow/components/DslView.tsx +6 -0
- package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/routes/workflow/components/NodePropertyPanel.tsx +6 -1
- package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/routes/workflow/editor.tsx +17 -0
- package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/routes/workflow/instance-detail.tsx +18 -6
- package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/routes/workflow/temporal-tenant/index.tsx +225 -0
- package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/utilities/lazy-with-reload.ts +31 -0
- package/package.json +1 -1
- package/dist/lib/application/files/gadmin2-game-angle-demo/server/src/modules/workflow/workflow-dsl-validate.spec.ts +0 -220
- package/dist/lib/application/files/gadmin2-game-angle-demo/server/src/modules/workflow/workflow-dsl-validate.ts +0 -132
- package/dist/lib/application/files/gadmin2-game-angle-demo/temporal/TODO.md +0 -152
- package/dist/lib/application/files/gadmin2-game-angle-demo/temporal/config/development-sql.yaml +0 -5
- package/dist/lib/application/files/gadmin2-game-angle-demo/temporal/docker-compose.yml +0 -25
- package/dist/lib/application/files/gadmin2-game-angle-demo/temporal/package.json +0 -13
- package/dist/lib/application/files/gadmin2-game-angle-demo/temporal/worker/.dockerignore +0 -12
- package/dist/lib/application/files/gadmin2-game-angle-demo/temporal/worker/.env +0 -7
- package/dist/lib/application/files/gadmin2-game-angle-demo/temporal/worker/Dockerfile +0 -79
- package/dist/lib/application/files/gadmin2-game-angle-demo/temporal/worker/GRACEFUL-DEPLOYMENT.md +0 -270
- package/dist/lib/application/files/gadmin2-game-angle-demo/temporal/worker/SANDBOX.md +0 -122
- package/dist/lib/application/files/gadmin2-game-angle-demo/temporal/worker/package-lock.json +0 -4285
- package/dist/lib/application/files/gadmin2-game-angle-demo/temporal/worker/package.json +0 -28
- package/dist/lib/application/files/gadmin2-game-angle-demo/temporal/worker/src/activities/code-execute.ts +0 -51
- package/dist/lib/application/files/gadmin2-game-angle-demo/temporal/worker/src/activities/db-execute.ts +0 -85
- package/dist/lib/application/files/gadmin2-game-angle-demo/temporal/worker/src/activities/db-query.ts +0 -35
- package/dist/lib/application/files/gadmin2-game-angle-demo/temporal/worker/src/activities/http-request.ts +0 -54
- package/dist/lib/application/files/gadmin2-game-angle-demo/temporal/worker/src/activities/index.ts +0 -6
- package/dist/lib/application/files/gadmin2-game-angle-demo/temporal/worker/src/activities/reporting.ts +0 -85
- package/dist/lib/application/files/gadmin2-game-angle-demo/temporal/worker/src/activities/send-notification.ts +0 -47
- package/dist/lib/application/files/gadmin2-game-angle-demo/temporal/worker/src/config.ts +0 -13
- package/dist/lib/application/files/gadmin2-game-angle-demo/temporal/worker/src/dsl/condition.ts +0 -101
- package/dist/lib/application/files/gadmin2-game-angle-demo/temporal/worker/src/dsl/context.ts +0 -58
- package/dist/lib/application/files/gadmin2-game-angle-demo/temporal/worker/src/dsl/graph.ts +0 -184
- package/dist/lib/application/files/gadmin2-game-angle-demo/temporal/worker/src/dsl/helpers.ts +0 -133
- package/dist/lib/application/files/gadmin2-game-angle-demo/temporal/worker/src/dsl/node-types.ts +0 -96
- package/dist/lib/application/files/gadmin2-game-angle-demo/temporal/worker/src/dsl/types.ts +0 -77
- package/dist/lib/application/files/gadmin2-game-angle-demo/temporal/worker/src/dsl/validate.ts +0 -109
- package/dist/lib/application/files/gadmin2-game-angle-demo/temporal/worker/src/index.ts +0 -101
- package/dist/lib/application/files/gadmin2-game-angle-demo/temporal/worker/src/outbox-poller.ts +0 -382
- package/dist/lib/application/files/gadmin2-game-angle-demo/temporal/worker/src/tests/activities/code-execute.test.ts +0 -44
- package/dist/lib/application/files/gadmin2-game-angle-demo/temporal/worker/src/tests/activities/http-request.test.ts +0 -87
- package/dist/lib/application/files/gadmin2-game-angle-demo/temporal/worker/src/tests/cron-trigger-workflow.test.ts +0 -20
- package/dist/lib/application/files/gadmin2-game-angle-demo/temporal/worker/src/tests/helpers.test.ts +0 -225
- package/dist/lib/application/files/gadmin2-game-angle-demo/temporal/worker/src/tests/node-type-consistency.test.ts +0 -101
- package/dist/lib/application/files/gadmin2-game-angle-demo/temporal/worker/src/tests/validate.test.ts +0 -205
- package/dist/lib/application/files/gadmin2-game-angle-demo/temporal/worker/src/workflows/dsl-workflow.ts +0 -499
- package/dist/lib/application/files/gadmin2-game-angle-demo/temporal/worker/tsconfig.json +0 -19
- package/dist/lib/application/files/gadmin2-game-angle-demo/temporal/worker/vitest.config.ts +0 -8
- package/dist/lib/application/files/gadmin2-game-angle-demo/temporal/worker/yarn.lock +0 -1905
|
@@ -1,122 +0,0 @@
|
|
|
1
|
-
# Code 节点沙箱方案
|
|
2
|
-
|
|
3
|
-
## 当前方案:Node.js `vm` 模块
|
|
4
|
-
|
|
5
|
-
```typescript
|
|
6
|
-
// activities/code-execute.ts
|
|
7
|
-
const vm = await import('vm');
|
|
8
|
-
const sandbox = { data, items, result: undefined };
|
|
9
|
-
const context = vm.createContext(sandbox);
|
|
10
|
-
new vm.Script(`result = (function() { ${script} })()`).runInContext(context, { timeout });
|
|
11
|
-
```
|
|
12
|
-
|
|
13
|
-
**优点:** 零依赖,零开销,简单直接
|
|
14
|
-
**缺点:** 隔离性有限,恶意代码可通过原型链逃逸访问 Node.js API
|
|
15
|
-
**适用:** 内部管理后台,脚本由可信管理员编写
|
|
16
|
-
|
|
17
|
-
---
|
|
18
|
-
|
|
19
|
-
## 备选方案:isolated-vm(强隔离)
|
|
20
|
-
|
|
21
|
-
当需要执行**不可信用户代码**时,切换到 `isolated-vm`。
|
|
22
|
-
|
|
23
|
-
### 什么是 isolated-vm
|
|
24
|
-
|
|
25
|
-
- V8 引擎 Isolate 接口的 Node.js 封装
|
|
26
|
-
- 在独立 V8 实例中执行代码,和主进程**零共享内存**
|
|
27
|
-
- 无法访问 Node.js API(fs、net、process 等全部不可用)
|
|
28
|
-
- 周下载量 100万+,生产级稳定
|
|
29
|
-
- `vm2` 已停止维护(不可修复的逃逸漏洞),`isolated-vm` 是社区推荐替代
|
|
30
|
-
|
|
31
|
-
### 层级结构
|
|
32
|
-
|
|
33
|
-
```
|
|
34
|
-
Isolate (V8 引擎实例) ← 创建开销 ~5ms,可复用
|
|
35
|
-
└── Context (执行上下文) ← 创建开销 <1ms,每次新建保证隔离
|
|
36
|
-
└── Script (编译后代码) ← 可缓存
|
|
37
|
-
```
|
|
38
|
-
|
|
39
|
-
### 推荐实现:复用 Isolate + 每次新 Context
|
|
40
|
-
|
|
41
|
-
```typescript
|
|
42
|
-
// activities/code-execute.ts(isolated-vm 版本)
|
|
43
|
-
import ivm from 'isolated-vm';
|
|
44
|
-
|
|
45
|
-
// Worker 启动时创建一个 Isolate(复用,不用每次新建)
|
|
46
|
-
const isolate = new ivm.Isolate({ memoryLimit: 128 }); // 128MB 内存上限
|
|
47
|
-
|
|
48
|
-
export async function codeExecute(input: CodeExecuteInput): Promise<CodeExecuteOutput> {
|
|
49
|
-
const { script, mode = 'runOnceForAll', timeout = 5000, data, items } = input;
|
|
50
|
-
|
|
51
|
-
if (mode === 'runOnceForEach' && Array.isArray(items)) {
|
|
52
|
-
const results: any[] = [];
|
|
53
|
-
for (const item of items) {
|
|
54
|
-
const result = await runInSandbox(script, { item, data }, timeout);
|
|
55
|
-
results.push(result);
|
|
56
|
-
}
|
|
57
|
-
return { result: results };
|
|
58
|
-
}
|
|
59
|
-
|
|
60
|
-
const result = await runInSandbox(script, { data, items: items || [] }, timeout);
|
|
61
|
-
return { result };
|
|
62
|
-
}
|
|
63
|
-
|
|
64
|
-
async function runInSandbox(
|
|
65
|
-
script: string,
|
|
66
|
-
globals: Record<string, any>,
|
|
67
|
-
timeout: number,
|
|
68
|
-
): Promise<any> {
|
|
69
|
-
// 每次执行创建新 Context(<1ms),保证执行间完全隔离
|
|
70
|
-
const context = await isolate.createContext();
|
|
71
|
-
|
|
72
|
-
try {
|
|
73
|
-
const jail = context.global;
|
|
74
|
-
|
|
75
|
-
// 注入变量(深拷贝进 Isolate,主进程对象不可直接访问)
|
|
76
|
-
for (const [key, value] of Object.entries(globals)) {
|
|
77
|
-
await jail.set(key, new ivm.ExternalCopy(value).copyInto());
|
|
78
|
-
}
|
|
79
|
-
|
|
80
|
-
// 执行脚本
|
|
81
|
-
const wrapped = `(function() { ${script} })()`;
|
|
82
|
-
const result = await context.eval(wrapped, { timeout });
|
|
83
|
-
|
|
84
|
-
return result;
|
|
85
|
-
} finally {
|
|
86
|
-
context.release(); // 释放 Context 内存,Isolate 继续复用
|
|
87
|
-
}
|
|
88
|
-
}
|
|
89
|
-
```
|
|
90
|
-
|
|
91
|
-
### 性能对比
|
|
92
|
-
|
|
93
|
-
| 策略 | 每次执行开销 | 内存 |
|
|
94
|
-
|------|------------|------|
|
|
95
|
-
| 每次新建 Isolate | ~5ms | 每次分配独立堆 |
|
|
96
|
-
| **复用 Isolate + 每次新 Context** | **<1ms** | 共享 Isolate 堆 |
|
|
97
|
-
| 复用 Isolate + 复用 Context | ~0 | ⚠️ 执行间状态泄漏 |
|
|
98
|
-
|
|
99
|
-
推荐第二种:性能和隔离性的最佳平衡。
|
|
100
|
-
|
|
101
|
-
### 安全保障
|
|
102
|
-
|
|
103
|
-
| 防护 | 说明 |
|
|
104
|
-
|------|------|
|
|
105
|
-
| 内存限制 | `memoryLimit: 128` → 超限直接 kill |
|
|
106
|
-
| CPU 限制 | `timeout` 参数 → 超时抛异常 |
|
|
107
|
-
| 网络隔离 | 无 `require`/`import`,无法访问 `net`/`http` |
|
|
108
|
-
| 文件系统隔离 | 无 `fs` 模块 |
|
|
109
|
-
| 进程隔离 | 无 `process`/`child_process` |
|
|
110
|
-
| 原型链隔离 | 独立 V8 堆,原型链攻击无效 |
|
|
111
|
-
|
|
112
|
-
### 何时切换
|
|
113
|
-
|
|
114
|
-
- ✅ 当前 `vm` 方案:适用于内部可信用户(管理员自己写脚本)
|
|
115
|
-
- 🔄 切换到 `isolated-vm`:当开放给外部用户或非技术人员编写脚本时
|
|
116
|
-
|
|
117
|
-
### 切换步骤
|
|
118
|
-
|
|
119
|
-
1. 依赖已在 `package.json` 中(`"isolated-vm": "^5.x"`)
|
|
120
|
-
2. 替换 `activities/code-execute.ts` 的实现(如上)
|
|
121
|
-
3. 接口不变,调用方无需修改
|
|
122
|
-
4. 测试:验证 `runOnceForAll` 和 `runOnceForEach` 两种模式
|