rwd-chainlisted
Install: claude install-skill InExSu/claude-skills
# RWD Chain Pattern (JavaScript)
## Core Idea
Линейный конвейер, где каждый шаг — декорируемая функция. Шаги разделяют один мутабельный контейнер `NS_Container`. Если любой шаг устанавливает `s_Error` — цепочка останавливается.
```
v_RWD(v_step_One_RWD, ns)
v_RWD(v_step_Two_RWD, ns) // пропускается, если step_One установил ns.s_Error
v_RWD(v_step_Three_RWD, ns) // пропускается
```
---
## 1. NS_Container
```javascript
class NS_Container {
constructor() {
this.s_Error = ''; // пусто = ОК, не пусто = стоп
this.f_RWD_Start_Time = 0.0;
this.a_Log = [];
this.a_Profile = [];
// + доменные поля проекта
}
}
```
---
## 2. v_RWD() — декоратор-исполнитель
```javascript
function v_RWD(c_Fn, ns) {
if (ns.s_Error !== '') return;
const s_Name = s_callable_Name_Get(c_Fn);
v_RWD_Start(s_Name, ns);
c_Fn(ns);
v_RWD_Finish(s_Name, ns);
}
```
---
## 3. Декораторы
```javascript
function v_RWD_Start(s_Name, ns) {
ns.f_RWD_Start_Time = performance.now();
const s_Msg = `[${new Date().toTimeString().slice(0, 8)}] START: ${s_Name}`;
console.log(s_Msg);
ns.a_Log.push(s_Msg);
}
function v_RWD_Finish(s_Name, ns) {
const f_Duration = (performance.now() - ns.f_RWD_Start_Time) / 1000;
const i_Memory = Math.round(process.memoryUsage().heapUsed / 1024 / 1024);
const i_Memory_Peak = Math.round(process.memoryUsage().heapTotal / 1024 / 1024);
let s_Msg = `[${new Date().toTimeString().slice(0, 8)}] FINISH: ${s_Name} (${f_Duration.toFixe