@fozy-labs/rx-toolkit 0.4.18 → 0.5.0-rc.1
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/README.md +20 -19
- package/dist/common/devtools/reduxDevtools.d.ts +17 -0
- package/dist/common/devtools/reduxDevtools.js +98 -17
- package/dist/common/devtools/types.d.ts +1 -0
- package/dist/common/options/DefaultOptions.d.ts +0 -2
- package/dist/common/options/DefaultOptions.js +0 -2
- package/dist/common/options/SharedOptions.d.ts +0 -2
- package/dist/common/options/SharedOptions.js +0 -1
- package/dist/query/api/resetAllQueriesCache.d.ts +1 -0
- package/dist/query/api/resetAllQueriesCache.js +4 -0
- package/dist/query/core/Opertation/Operation.js +10 -7
- package/dist/query/core/Opertation/OperationAgent.d.ts +0 -2
- package/dist/query/core/Opertation/OperationAgent.js +4 -21
- package/dist/query/core/QueriesCache.d.ts +1 -1
- package/dist/query/core/QueriesCache.js +2 -6
- package/dist/query/core/{CleanAllQueriesSignal.d.ts → ResetAllQueriesSignal.d.ts} +1 -1
- package/dist/query/core/ResetAllQueriesSignal.js +11 -0
- package/dist/query/core/Resource/Resource.js +7 -3
- package/dist/query/core/Resource/ResourceAgent.d.ts +2 -3
- package/dist/query/core/Resource/ResourceAgent.js +62 -29
- package/dist/query/index.d.ts +1 -1
- package/dist/query/index.js +1 -1
- package/dist/query/lib/IndirectMap.d.ts +1 -1
- package/dist/query/lib/IndirectMap.js +1 -1
- package/dist/query/lib/ReactiveCache.d.ts +1 -1
- package/dist/query/lib/ReactiveCache.js +2 -2
- package/dist/query/react/useOperationAgent.js +2 -5
- package/dist/query/react/useResourceAgent.js +1 -4
- package/dist/query/types/Operation.types.d.ts +1 -3
- package/dist/query/types/Resource.types.d.ts +1 -3
- package/dist/signals/base/Batcher.d.ts +1 -1
- package/dist/signals/base/Batcher.js +1 -1
- package/dist/signals/base/DependencyTracker.d.ts +18 -0
- package/dist/signals/base/DependencyTracker.js +13 -0
- package/dist/signals/base/Devtools.d.ts +1 -1
- package/dist/signals/base/Devtools.js +13 -1
- package/dist/signals/base/ReadonlySignal.d.ts +5 -7
- package/dist/signals/base/ReadonlySignal.js +20 -12
- package/dist/signals/base/index.d.ts +1 -2
- package/dist/signals/base/index.js +1 -2
- package/dist/signals/operators/index.d.ts +0 -2
- package/dist/signals/operators/index.js +0 -2
- package/dist/signals/operators/signalize.d.ts +2 -2
- package/dist/signals/operators/signalize.js +1 -1
- package/dist/signals/react/useSignal.d.ts +6 -2
- package/dist/signals/react/useSignal.js +2 -21
- package/dist/signals/signals/Computed.d.ts +13 -11
- package/dist/signals/signals/Computed.js +79 -26
- package/dist/signals/signals/Effect.d.ts +11 -7
- package/dist/signals/signals/Effect.js +60 -58
- package/dist/signals/signals/LocalSignal.d.ts +14 -7
- package/dist/signals/signals/LocalSignal.js +53 -36
- package/dist/signals/signals/Signal.d.ts +13 -37
- package/dist/signals/signals/Signal.js +44 -58
- package/dist/signals/types/index.d.ts +1 -0
- package/dist/signals/types/index.js +1 -0
- package/dist/signals/types/signals.types.d.ts +16 -0
- package/docs/CHANGELOG.md +32 -0
- package/docs/devtools/README.md +162 -29
- package/docs/migrations/0.5.0.md +73 -0
- package/docs/options/README.md +89 -0
- package/docs/query/README.md +425 -89
- package/docs/release/README.md +58 -6
- package/docs/signals/README.md +207 -34
- package/docs/usage/react/README.md +261 -49
- package/package.json +1 -1
- package/dist/query/api/cleanAllQueriesCache.d.ts +0 -1
- package/dist/query/api/cleanAllQueriesCache.js +0 -4
- package/dist/query/core/CleanAllQueriesSignal.js +0 -11
- package/dist/signals/base/Tracker.d.ts +0 -10
- package/dist/signals/base/Tracker.js +0 -7
- package/dist/signals/base/types.d.ts +0 -23
- package/dist/signals/operators/filterUpdates.d.ts +0 -5
- package/dist/signals/operators/filterUpdates.js +0 -18
- package/dist/signals/operators/mapSignals.d.ts +0 -3
- package/dist/signals/operators/mapSignals.js +0 -10
- /package/dist/signals/{base/types.js → types/signals.types.js} +0 -0
package/docs/devtools/README.md
CHANGED
|
@@ -1,70 +1,140 @@
|
|
|
1
1
|
# Devtools
|
|
2
2
|
|
|
3
|
-
RxToolkit предоставляет интеграцию с популярными инструментами разработчика для отладки реактивных приложений в реальном времени. Вы можете отслеживать изменения сигналов, выполнение операций и состояние
|
|
3
|
+
RxToolkit предоставляет интеграцию с популярными инструментами разработчика для отладки реактивных приложений в реальном времени. Вы можете отслеживать изменения сигналов, выполнение операций и состояние ресурсов.
|
|
4
4
|
|
|
5
|
-
**Отслеживает
|
|
6
|
-
- Сигналов (Signal/Computed)
|
|
7
|
-
- Ресурсов и операций (Resource/Operation)
|
|
5
|
+
**Отслеживает изменения:**
|
|
6
|
+
- Сигналов (Signal / Computed)
|
|
7
|
+
- Ресурсов и операций (Resource / Operation)
|
|
8
|
+
|
|
9
|
+
---
|
|
8
10
|
|
|
9
11
|
## Redux DevTools
|
|
10
12
|
|
|
11
13
|
Популярное браузерное расширение для отладки состояния приложений. **RxToolkit включает встроенный адаптер `reduxDevtools()`**.
|
|
12
14
|
|
|
13
|
-
|
|
14
|
-
|
|
15
|
+
### Установка
|
|
16
|
+
|
|
17
|
+
1. Установите [расширение Redux DevTools](https://github.com/reduxjs/redux-devtools) для браузера
|
|
15
18
|
2. Подключите в коде:
|
|
16
19
|
|
|
17
20
|
```typescript
|
|
18
21
|
import { DefaultOptions, reduxDevtools } from '@fozy-labs/rx-toolkit';
|
|
19
22
|
|
|
20
23
|
DefaultOptions.update({
|
|
21
|
-
|
|
24
|
+
DEVTOOLS: reduxDevtools()
|
|
22
25
|
});
|
|
23
26
|
```
|
|
24
27
|
|
|
28
|
+
### Опции reduxDevtools
|
|
29
|
+
|
|
30
|
+
```typescript
|
|
31
|
+
reduxDevtools({
|
|
32
|
+
// Имя приложения в DevTools
|
|
33
|
+
name: 'MyApp',
|
|
34
|
+
|
|
35
|
+
// Стратегия батчинга обновлений
|
|
36
|
+
batchStrategy: 'microtask', // 'sync' | 'microtask' | 'task'
|
|
37
|
+
|
|
38
|
+
// Задержка для стратегии 'task' (мс)
|
|
39
|
+
taskDelay: 0,
|
|
40
|
+
})
|
|
41
|
+
```
|
|
42
|
+
|
|
43
|
+
**Стратегии батчинга (batchStrategy):**
|
|
44
|
+
|
|
45
|
+
| Стратегия | Описание |
|
|
46
|
+
|---------------|-----------------------------------------------------------------------------------------------------------------|
|
|
47
|
+
| `'sync'` | Синхронное выполнение без батчинга. Каждое обновление отправляется немедленно. Интегрируется с Batcher сигналов |
|
|
48
|
+
| `'microtask'` | **(default)** Пакование в микротаске. Все обновления в текущем синхронном потоке объединяются |
|
|
49
|
+
| `'task'` | Пакование в макротаске (setTimeout) с настраиваемой задержкой |
|
|
50
|
+
|
|
51
|
+
---
|
|
52
|
+
|
|
25
53
|
## @reatom/devtools
|
|
26
54
|
|
|
27
|
-
Npm
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
которая открывает панель инструментов.
|
|
55
|
+
Npm пакет с встроенным отладчиком, работающим прямо в браузере. После подключения в углу страницы появляется кнопка, которая открывает панель инструментов.
|
|
56
|
+
|
|
57
|
+
### Установка
|
|
31
58
|
|
|
32
|
-
**Установка:**
|
|
33
59
|
```bash
|
|
34
60
|
npm install @reatom/devtools
|
|
35
61
|
```
|
|
36
62
|
|
|
37
|
-
|
|
63
|
+
### Подключение
|
|
64
|
+
|
|
38
65
|
```typescript
|
|
39
66
|
import { DefaultOptions } from '@fozy-labs/rx-toolkit';
|
|
40
67
|
import { createDevtools } from '@reatom/devtools';
|
|
41
68
|
|
|
42
69
|
DefaultOptions.update({
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
70
|
+
DEVTOOLS: createDevtools({
|
|
71
|
+
initVisibility: true // Показать панель при загрузке
|
|
72
|
+
})
|
|
46
73
|
});
|
|
47
74
|
```
|
|
48
75
|
|
|
49
76
|
**Может пригодиться:**
|
|
50
|
-
- Если в вашей среде
|
|
51
|
-
-
|
|
77
|
+
- Если в вашей среде неудобно или проблематично установить браузерное расширение
|
|
78
|
+
- Для мобильной отладки
|
|
79
|
+
|
|
80
|
+
---
|
|
81
|
+
|
|
82
|
+
## DefaultOptions
|
|
83
|
+
|
|
84
|
+
`DefaultOptions.update()` позволяет настроить глобальные опции RxToolkit:
|
|
85
|
+
|
|
86
|
+
```typescript
|
|
87
|
+
import { DefaultOptions, reduxDevtools } from '@fozy-labs/rx-toolkit';
|
|
88
|
+
import { Observable } from 'rxjs';
|
|
89
|
+
|
|
90
|
+
DefaultOptions.update({
|
|
91
|
+
// Devtools интеграция
|
|
92
|
+
DEVTOOLS: reduxDevtools(),
|
|
93
|
+
|
|
94
|
+
// Глобальный обработчик ошибок запросов
|
|
95
|
+
onQueryError: (error) => {
|
|
96
|
+
console.error('Query error:', error);
|
|
97
|
+
// Можно отправить в систему мониторинга
|
|
98
|
+
errorTracker.capture(error);
|
|
99
|
+
},
|
|
100
|
+
|
|
101
|
+
// Функция для получения имени текущего scope (полезно для SSR)
|
|
102
|
+
getScopeName: () => {
|
|
103
|
+
return currentRequestId ?? null;
|
|
104
|
+
},
|
|
105
|
+
});
|
|
106
|
+
```
|
|
107
|
+
|
|
108
|
+
### Параметры DefaultOptions
|
|
109
|
+
|
|
110
|
+
| Параметр | Тип | Описание |
|
|
111
|
+
|----------|-----|----------|
|
|
112
|
+
| `DEVTOOLS` | `DevtoolsLike \| null` | Интеграция с devtools |
|
|
113
|
+
| `onQueryError` | `(error: unknown) => void` | Глобальный обработчик ошибок запросов |
|
|
114
|
+
| `getScopeName` | `() => string \| null` | Получение имени текущего scope |
|
|
115
|
+
|
|
116
|
+
---
|
|
52
117
|
|
|
53
118
|
## Практики
|
|
54
119
|
|
|
55
120
|
### Development-режим
|
|
56
121
|
|
|
57
|
-
Подключайте devtools только в
|
|
122
|
+
Подключайте devtools только в режиме разработки:
|
|
58
123
|
|
|
59
124
|
```typescript
|
|
60
|
-
// Node.js/Webpack
|
|
125
|
+
// Node.js / Webpack
|
|
61
126
|
if (process.env.NODE_ENV !== 'production') {
|
|
62
|
-
|
|
127
|
+
DefaultOptions.update({ DEVTOOLS: reduxDevtools() });
|
|
63
128
|
}
|
|
64
129
|
|
|
65
130
|
// Vite
|
|
66
131
|
if (import.meta.env.DEV) {
|
|
67
|
-
|
|
132
|
+
DefaultOptions.update({ DEVTOOLS: reduxDevtools() });
|
|
133
|
+
}
|
|
134
|
+
|
|
135
|
+
// Next.js
|
|
136
|
+
if (process.env.NODE_ENV === 'development') {
|
|
137
|
+
DefaultOptions.update({ DEVTOOLS: reduxDevtools() });
|
|
68
138
|
}
|
|
69
139
|
```
|
|
70
140
|
|
|
@@ -74,22 +144,85 @@ if (import.meta.env.DEV) {
|
|
|
74
144
|
|
|
75
145
|
```typescript
|
|
76
146
|
if (typeof window !== 'undefined' && process.env.NODE_ENV !== 'production') {
|
|
77
|
-
|
|
147
|
+
DefaultOptions.update({ DEVTOOLS: reduxDevtools() });
|
|
78
148
|
}
|
|
79
149
|
```
|
|
80
150
|
|
|
81
151
|
### Несколько инструментов
|
|
82
152
|
|
|
83
|
-
Можно комбинировать несколько devtools
|
|
153
|
+
Можно комбинировать несколько devtools с помощью `combineDevtools`:
|
|
84
154
|
|
|
85
155
|
```typescript
|
|
86
|
-
import { combineDevtools, reduxDevtools } from '@fozy-labs/rx-toolkit';
|
|
156
|
+
import { combineDevtools, reduxDevtools, DefaultOptions } from '@fozy-labs/rx-toolkit';
|
|
87
157
|
import { createDevtools } from '@reatom/devtools';
|
|
88
158
|
|
|
89
159
|
DefaultOptions.update({
|
|
90
|
-
|
|
91
|
-
|
|
92
|
-
|
|
93
|
-
|
|
160
|
+
DEVTOOLS: combineDevtools(
|
|
161
|
+
reduxDevtools({ name: 'MyApp' }),
|
|
162
|
+
createDevtools({ initVisibility: true })
|
|
163
|
+
)
|
|
94
164
|
});
|
|
95
165
|
```
|
|
166
|
+
|
|
167
|
+
### Именование для devtools
|
|
168
|
+
|
|
169
|
+
При создании сигналов и запросов можно указывать имена для удобной отладки:
|
|
170
|
+
|
|
171
|
+
```typescript
|
|
172
|
+
// Сигналы
|
|
173
|
+
const count$ = new Signal(0, 'counter');
|
|
174
|
+
const user$ = new Signal(null, { name: 'currentUser' });
|
|
175
|
+
|
|
176
|
+
// Ресурсы и операции
|
|
177
|
+
const userResource = createResource({
|
|
178
|
+
queryFn: fetchUser,
|
|
179
|
+
devtoolsName: 'user-resource', // Имя в devtools
|
|
180
|
+
});
|
|
181
|
+
|
|
182
|
+
const updateUser = createOperation({
|
|
183
|
+
queryFn: updateUserApi,
|
|
184
|
+
devtoolsName: 'update-user',
|
|
185
|
+
});
|
|
186
|
+
|
|
187
|
+
// Отключение devtools для конкретного сигнала
|
|
188
|
+
const internalSignal = new Signal(0, { isDisabled: true });
|
|
189
|
+
|
|
190
|
+
// Отключение devtools для ресурса
|
|
191
|
+
const internalResource = createResource({
|
|
192
|
+
queryFn: fetchInternal,
|
|
193
|
+
devtoolsName: false, // Не отслеживать
|
|
194
|
+
});
|
|
195
|
+
```
|
|
196
|
+
|
|
197
|
+
---
|
|
198
|
+
|
|
199
|
+
## DevtoolsLike интерфейс
|
|
200
|
+
|
|
201
|
+
Если вам нужно создать кастомную интеграцию с devtools:
|
|
202
|
+
|
|
203
|
+
```typescript
|
|
204
|
+
interface DevtoolsLike {
|
|
205
|
+
state<T>(name: string, initState: T): DevtoolsStateLike<T>;
|
|
206
|
+
}
|
|
207
|
+
|
|
208
|
+
interface DevtoolsStateLike<T = any> {
|
|
209
|
+
(newState: T): void;
|
|
210
|
+
}
|
|
211
|
+
```
|
|
212
|
+
|
|
213
|
+
**Пример кастомного devtools:**
|
|
214
|
+
|
|
215
|
+
```typescript
|
|
216
|
+
const customDevtools: DevtoolsLike = {
|
|
217
|
+
state(name, initState) {
|
|
218
|
+
console.log(`[INIT] ${name}:`, initState);
|
|
219
|
+
|
|
220
|
+
return (newState) => {
|
|
221
|
+
console.log(`[UPDATE] ${name}:`, newState);
|
|
222
|
+
};
|
|
223
|
+
}
|
|
224
|
+
};
|
|
225
|
+
|
|
226
|
+
DefaultOptions.update({ DEVTOOLS: customDevtools });
|
|
227
|
+
```
|
|
228
|
+
|
|
@@ -0,0 +1,73 @@
|
|
|
1
|
+
# Миграция с версии 0.4.x на 0.5.0
|
|
2
|
+
|
|
3
|
+
### Сигналы больше не наследуются от Observable
|
|
4
|
+
|
|
5
|
+
```typescript
|
|
6
|
+
// Было
|
|
7
|
+
signal.subscribe(fn); // ❌
|
|
8
|
+
signal.pipe() // ❌
|
|
9
|
+
|
|
10
|
+
// Стало
|
|
11
|
+
signal.obs.subscribe(fn); // ✅
|
|
12
|
+
signal.obs.pipe() // ✅
|
|
13
|
+
```
|
|
14
|
+
|
|
15
|
+
### Сигналы больше не поддерживают `value`, `getValue()` и `next()`
|
|
16
|
+
|
|
17
|
+
```typescript
|
|
18
|
+
// Было
|
|
19
|
+
signal.value; // ❌
|
|
20
|
+
signal.getValue(); // ❌
|
|
21
|
+
signal.next(val); // ❌
|
|
22
|
+
singal.value += 1; // ❌
|
|
23
|
+
|
|
24
|
+
// Стало
|
|
25
|
+
signal() // ✅
|
|
26
|
+
signal.get(); // ✅
|
|
27
|
+
signal.set(val); // ✅
|
|
28
|
+
```
|
|
29
|
+
|
|
30
|
+
### Computed, на который нет подписок, пересчитывается при каждом обращении.
|
|
31
|
+
|
|
32
|
+
```typescripttypescript
|
|
33
|
+
// Было
|
|
34
|
+
const comp$ = new Computed(() => myHeavyCalc(singal.value)); // ✅ пересчитывается
|
|
35
|
+
comp$.get(); // ✅ берется из кеша
|
|
36
|
+
comp.subscribe(() => {}); // ✅ берется из кеша
|
|
37
|
+
comp$.get(); // ✅ берется из кеша
|
|
38
|
+
|
|
39
|
+
// Стало
|
|
40
|
+
const comp$ = Signal.compute(() => myHeavyCalc(singal())); // ✅ ждет
|
|
41
|
+
comp$.get(); // ✅ пересчитывается
|
|
42
|
+
comp$.subscribe(() => {}); // ✅ пересчитывается
|
|
43
|
+
comp$.get(); // ✅ берется из кеша
|
|
44
|
+
```
|
|
45
|
+
|
|
46
|
+
### Нет необходимости вызывать `complete()` для Signal и Computed
|
|
47
|
+
|
|
48
|
+
```typescript
|
|
49
|
+
// Было
|
|
50
|
+
const signal = new Signal(0);
|
|
51
|
+
// Что-то делаем
|
|
52
|
+
signal.complete(); // ❌
|
|
53
|
+
|
|
54
|
+
// Стало
|
|
55
|
+
const signal = Signal.create(0);
|
|
56
|
+
// Что-то делаем
|
|
57
|
+
// Ничего не нужно вызывать ✅
|
|
58
|
+
```
|
|
59
|
+
|
|
60
|
+
### Новый функциональный API для создания сигналов (рекомендуется)
|
|
61
|
+
|
|
62
|
+
```typescript
|
|
63
|
+
// Было
|
|
64
|
+
const signal = new Signal(0);
|
|
65
|
+
const computed = new Computed(() => signal.value * 2);
|
|
66
|
+
signal.value += 1; // ❌
|
|
67
|
+
|
|
68
|
+
|
|
69
|
+
// Стало
|
|
70
|
+
const signal = Signal.create(0);
|
|
71
|
+
const computed = Signal.compute(() => signal() * 2);
|
|
72
|
+
signal.set(signal.peek() + 1); // ✅
|
|
73
|
+
```
|
|
@@ -0,0 +1,89 @@
|
|
|
1
|
+
# Глобальные настройки
|
|
2
|
+
|
|
3
|
+
RxToolkit предоставляет `DefaultOptions` для настройки глобального поведения библиотеки. Все настройки опциональны и применяются ко всему приложению.
|
|
4
|
+
|
|
5
|
+
## API
|
|
6
|
+
|
|
7
|
+
### DefaultOptions.update()
|
|
8
|
+
|
|
9
|
+
Обновляет глобальные настройки библиотеки.
|
|
10
|
+
|
|
11
|
+
```typescript
|
|
12
|
+
import { DefaultOptions } from '@fozy-labs/rx-toolkit';
|
|
13
|
+
|
|
14
|
+
DefaultOptions.update({
|
|
15
|
+
DEVTOOLS: reduxDevtools(),
|
|
16
|
+
onQueryError: (error) => console.error(error),
|
|
17
|
+
getScopeName: () => MyScopeLibarary.getCurrentScopeName(),
|
|
18
|
+
});
|
|
19
|
+
```
|
|
20
|
+
|
|
21
|
+
## Параметры
|
|
22
|
+
|
|
23
|
+
### DEVTOOLS
|
|
24
|
+
|
|
25
|
+
**См.** [Документация Devtools](../devtools/README.md)
|
|
26
|
+
|
|
27
|
+
---
|
|
28
|
+
|
|
29
|
+
### onQueryError
|
|
30
|
+
|
|
31
|
+
**Тип:** `(error: unknown) => void | null`
|
|
32
|
+
**По умолчанию:** `null`
|
|
33
|
+
|
|
34
|
+
Глобальный обработчик ошибок для всех запросов (Resources и Operations). Вызывается при каждой ошибке запроса.
|
|
35
|
+
|
|
36
|
+
```typescript
|
|
37
|
+
import { DefaultOptions } from '@fozy-labs/rx-toolkit';
|
|
38
|
+
import * as Sentry from '@sentry/browser';
|
|
39
|
+
|
|
40
|
+
DefaultOptions.update({
|
|
41
|
+
onQueryError: (error) => {
|
|
42
|
+
// Логирование
|
|
43
|
+
console.error('[RxToolkit Query Error]', error);
|
|
44
|
+
|
|
45
|
+
// Отправка в систему мониторинга
|
|
46
|
+
Sentry.captureException(error, {
|
|
47
|
+
tags: { source: 'rx-toolkit-query' }
|
|
48
|
+
});
|
|
49
|
+
|
|
50
|
+
// Уведомление пользователя
|
|
51
|
+
if (error instanceof NetworkError) {
|
|
52
|
+
toast.error('Проблема с сетью. Попробуйте позже.');
|
|
53
|
+
} else if (error instanceof AuthError) {
|
|
54
|
+
redirectToLogin();
|
|
55
|
+
}
|
|
56
|
+
}
|
|
57
|
+
});
|
|
58
|
+
```
|
|
59
|
+
|
|
60
|
+
---
|
|
61
|
+
|
|
62
|
+
### getScopeName
|
|
63
|
+
|
|
64
|
+
**Тип:** `(() => string | null) | null`
|
|
65
|
+
**По умолчанию:** `null`
|
|
66
|
+
|
|
67
|
+
Функция для получения имени текущего scope. Полезно для SSR, изоляции данных между запросами или многопользовательских приложений.
|
|
68
|
+
|
|
69
|
+
```typescript
|
|
70
|
+
import { DefaultOptions } from '@fozy-labs/rx-toolkit';
|
|
71
|
+
|
|
72
|
+
// SSR: изоляция данных между запросами
|
|
73
|
+
let currentRequestId: string | null = null;
|
|
74
|
+
|
|
75
|
+
DefaultOptions.update({
|
|
76
|
+
getScopeName: () => currentRequestId
|
|
77
|
+
});
|
|
78
|
+
|
|
79
|
+
// В middleware сервера
|
|
80
|
+
app.use((req, res, next) => {
|
|
81
|
+
currentRequestId = req.id;
|
|
82
|
+
res.on('finish', () => {
|
|
83
|
+
currentRequestId = null;
|
|
84
|
+
});
|
|
85
|
+
next();
|
|
86
|
+
});
|
|
87
|
+
```
|
|
88
|
+
|
|
89
|
+
---
|