@sima-land/isomorph 11.0.0-alpha.30 → 11.0.0-alpha.31
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/error-tracking/index.d.ts +1 -0
- package/error-tracking/index.js +2 -0
- package/error-tracking/index.js.map +1 -1
- package/http-client/middleware/cookie.js +1 -1
- package/http-client/middleware/cookie.js.map +1 -1
- package/http-client/middleware/headers.js +2 -1
- package/http-client/middleware/headers.js.map +1 -1
- package/http-server/middleware/log.js +14 -3
- package/http-server/middleware/log.js.map +1 -1
- package/package.json +1 -1
- package/tracing/index.d.ts +1 -0
- package/tracing/index.js +1 -0
- package/tracing/index.js.map +1 -1
- package/utils/redux-saga/middleware.js +93 -34
- package/utils/redux-saga/middleware.js.map +1 -1
- package/utils/redux-saga/types.d.ts +22 -1
|
@@ -16,6 +16,7 @@ export declare class SentryError extends Error {
|
|
|
16
16
|
* @todo Этот класс должен называться либо SentryReadyBreadcrumb либо в названии вообще не должен фигурировать Sentry.
|
|
17
17
|
*/
|
|
18
18
|
export declare class SentryBreadcrumb {
|
|
19
|
+
type: string;
|
|
19
20
|
data: SentryBreadcrumbData;
|
|
20
21
|
/**
|
|
21
22
|
* @param data Данные.
|
package/error-tracking/index.js
CHANGED
|
@@ -25,8 +25,10 @@ class SentryBreadcrumb {
|
|
|
25
25
|
* @param data Данные.
|
|
26
26
|
*/
|
|
27
27
|
constructor(data) {
|
|
28
|
+
this.type = 'breadcrumb';
|
|
28
29
|
this.data = data;
|
|
29
30
|
}
|
|
30
31
|
}
|
|
31
32
|
exports.SentryBreadcrumb = SentryBreadcrumb;
|
|
33
|
+
// @todo переименовать error-tracking в events и добавить сюда остальные классы ошибок и событий?
|
|
32
34
|
//# sourceMappingURL=index.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/error-tracking/index.ts"],"names":[],"mappings":";;;AAEA;;;GAGG;AACH,MAAa,WAAY,SAAQ,KAAK;IAGpC;;;OAGG;IACH,YAAY,OAAe,EAAE,OAAwB,EAAE;QACrD,KAAK,CAAC,OAAO,CAAC,CAAC;QACf,IAAI,CAAC,IAAI,GAAG,IAAI,CAAC;IACnB,CAAC;CACF;AAXD,kCAWC;AAED;;;GAGG;AACH,MAAa,gBAAgB;
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/error-tracking/index.ts"],"names":[],"mappings":";;;AAEA;;;GAGG;AACH,MAAa,WAAY,SAAQ,KAAK;IAGpC;;;OAGG;IACH,YAAY,OAAe,EAAE,OAAwB,EAAE;QACrD,KAAK,CAAC,OAAO,CAAC,CAAC;QACf,IAAI,CAAC,IAAI,GAAG,IAAI,CAAC;IACnB,CAAC;CACF;AAXD,kCAWC;AAED;;;GAGG;AACH,MAAa,gBAAgB;IAI3B;;OAEG;IACH,YAAY,IAA0B;QACpC,IAAI,CAAC,IAAI,GAAG,YAAY,CAAC;QACzB,IAAI,CAAC,IAAI,GAAG,IAAI,CAAC;IACnB,CAAC;CACF;AAXD,4CAWC;AAED,iGAAiG"}
|
|
@@ -17,7 +17,7 @@ function collectCookieMiddleware(request, response) {
|
|
|
17
17
|
Cookie: store.asHeader(),
|
|
18
18
|
},
|
|
19
19
|
});
|
|
20
|
-
if (result.headers['set-cookie']) {
|
|
20
|
+
if (result.headers['set-cookie'] && !response.writableEnded) {
|
|
21
21
|
store.set(result.headers['set-cookie']);
|
|
22
22
|
response.setHeader('cookie', store.asHeader());
|
|
23
23
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"cookie.js","sourceRoot":"","sources":["../../../src/http-client/middleware/cookie.ts"],"names":[],"mappings":";;;AAQA;;;;;GAKG;AACH,SAAgB,uBAAuB,CAAC,OAAgB,EAAE,QAAkB;IAC1E,MAAM,KAAK,GAAG,iBAAiB,CAAC,OAAO,CAAC,GAAG,CAAC,QAAQ,CAAC,CAAC,CAAC;IAEvD,OAAO,KAAK,UAAU,aAAa,CAAC,MAAM,EAAE,IAAI;QAC9C,MAAM,MAAM,GAAG,MAAM,IAAI,CAAC;YACxB,GAAG,MAAM;YACT,OAAO,EAAE;gBACP,GAAG,MAAM,CAAC,OAAO;gBACjB,MAAM,EAAE,KAAK,CAAC,QAAQ,EAAE;aACzB;SACF,CAAC,CAAC;QAEH,IAAI,MAAM,CAAC,OAAO,CAAC,YAAY,CAAC,EAAE;
|
|
1
|
+
{"version":3,"file":"cookie.js","sourceRoot":"","sources":["../../../src/http-client/middleware/cookie.ts"],"names":[],"mappings":";;;AAQA;;;;;GAKG;AACH,SAAgB,uBAAuB,CAAC,OAAgB,EAAE,QAAkB;IAC1E,MAAM,KAAK,GAAG,iBAAiB,CAAC,OAAO,CAAC,GAAG,CAAC,QAAQ,CAAC,CAAC,CAAC;IAEvD,OAAO,KAAK,UAAU,aAAa,CAAC,MAAM,EAAE,IAAI;QAC9C,MAAM,MAAM,GAAG,MAAM,IAAI,CAAC;YACxB,GAAG,MAAM;YACT,OAAO,EAAE;gBACP,GAAG,MAAM,CAAC,OAAO;gBACjB,MAAM,EAAE,KAAK,CAAC,QAAQ,EAAE;aACzB;SACF,CAAC,CAAC;QAEH,IAAI,MAAM,CAAC,OAAO,CAAC,YAAY,CAAC,IAAI,CAAC,QAAQ,CAAC,aAAa,EAAE;YAC3D,KAAK,CAAC,GAAG,CAAC,MAAM,CAAC,OAAO,CAAC,YAAY,CAAC,CAAC,CAAC;YACxC,QAAQ,CAAC,SAAS,CAAC,QAAQ,EAAE,KAAK,CAAC,QAAQ,EAAE,CAAC,CAAC;SAChD;IACH,CAAC,CAAC;AACJ,CAAC;AAjBD,0DAiBC;AAED;;;;;GAKG;AACH,SAAgB,iBAAiB,CAAC,aAAsB;IACtD,MAAM,IAAI,GAAoD,EAAE,CAAC;IAEjE,8DAA8D;IAC9D,SAAS,OAAO,CAAC,UAAkB;QACjC,MAAM,CAAC,UAAU,EAAE,WAAW,CAAC,GAAG,UAAU,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,GAAG,CAAC,IAAI,CAAC,EAAE,CAAC,IAAI,CAAC,IAAI,EAAE,CAAC,CAAC;QAEjF,IAAI,UAAU,IAAI,WAAW,EAAE;YAC7B,IAAI,CAAC,UAAU,CAAC,GAAG,EAAE,IAAI,EAAE,UAAU,EAAE,KAAK,EAAE,WAAW,EAAE,CAAC;SAC7D;IACH,CAAC;IAED,IAAI,aAAa,IAAI,aAAa,CAAC,MAAM,EAAE;QACzC,KAAK,MAAM,IAAI,IAAI,aAAa,CAAC,KAAK,CAAC,GAAG,CAAC,EAAE;YAC3C,OAAO,CAAC,IAAI,CAAC,CAAC;SACf;KACF;IAED,8DAA8D;IAC9D,SAAS,GAAG,CAAC,qBAA+B;QAC1C,KAAK,MAAM,IAAI,IAAI,qBAAqB,EAAE;YACxC,gCAAgC;YAChC,MAAM,CAAC,MAAM,CAAC,GAAG,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC;YACjC,OAAO,CAAC,MAAM,CAAC,CAAC;SACjB;IACH,CAAC;IAED,8DAA8D;IAC9D,SAAS,QAAQ;QACf,OAAO,MAAM,CAAC,MAAM,CAAC,IAAI,CAAC;aACvB,GAAG,CAAC,MAAM,CAAC,EAAE,CAAC,GAAG,MAAM,CAAC,IAAI,IAAI,MAAM,CAAC,KAAK,EAAE,CAAC;aAC/C,IAAI,CAAC,IAAI,CAAC,CAAC;IAChB,CAAC;IAED,OAAO,EAAE,GAAG,EAAE,QAAQ,EAAE,CAAC;AAC3B,CAAC;AAnCD,8CAmCC"}
|
|
@@ -17,7 +17,8 @@ function passHeadersMiddleware(req, { predicate } = { predicate: () => true }) {
|
|
|
17
17
|
headers[headerName] = headerValue;
|
|
18
18
|
}
|
|
19
19
|
}
|
|
20
|
-
|
|
20
|
+
// ВАЖНО: не ждем ответа тк он может упасть + нам не важен результат
|
|
21
|
+
next({ ...config, headers });
|
|
21
22
|
};
|
|
22
23
|
}
|
|
23
24
|
exports.passHeadersMiddleware = passHeadersMiddleware;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"headers.js","sourceRoot":"","sources":["../../../src/http-client/middleware/headers.ts"],"names":[],"mappings":";;;AAQA;;;;;;GAMG;AACH,SAAgB,qBAAqB,CACnC,GAAY,EACZ,EAAE,SAAS,KAAyB,EAAE,SAAS,EAAE,GAAG,EAAE,CAAC,IAAI,EAAE;IAE7D,OAAO,KAAK,UAAU,WAAW,CAAC,MAAM,EAAE,IAAI;QAC5C,MAAM,OAAO,GAA2B,EAAE,GAAG,MAAM,CAAC,OAAO,EAAE,CAAC;QAE9D,KAAK,MAAM,UAAU,IAAI,GAAG,CAAC,OAAO,EAAE;YACpC,MAAM,WAAW,GAAG,GAAG,CAAC,OAAO,CAAC,UAAU,CAAC,CAAC;YAE5C,IAAI,OAAO,WAAW,KAAK,QAAQ,IAAI,SAAS,CAAC,UAAU,EAAE,WAAW,CAAC,EAAE;gBACzE,OAAO,CAAC,UAAU,CAAC,GAAG,WAAW,CAAC;aACnC;SACF;QAED,
|
|
1
|
+
{"version":3,"file":"headers.js","sourceRoot":"","sources":["../../../src/http-client/middleware/headers.ts"],"names":[],"mappings":";;;AAQA;;;;;;GAMG;AACH,SAAgB,qBAAqB,CACnC,GAAY,EACZ,EAAE,SAAS,KAAyB,EAAE,SAAS,EAAE,GAAG,EAAE,CAAC,IAAI,EAAE;IAE7D,OAAO,KAAK,UAAU,WAAW,CAAC,MAAM,EAAE,IAAI;QAC5C,MAAM,OAAO,GAA2B,EAAE,GAAG,MAAM,CAAC,OAAO,EAAE,CAAC;QAE9D,KAAK,MAAM,UAAU,IAAI,GAAG,CAAC,OAAO,EAAE;YACpC,MAAM,WAAW,GAAG,GAAG,CAAC,OAAO,CAAC,UAAU,CAAC,CAAC;YAE5C,IAAI,OAAO,WAAW,KAAK,QAAQ,IAAI,SAAS,CAAC,UAAU,EAAE,WAAW,CAAC,EAAE;gBACzE,OAAO,CAAC,UAAU,CAAC,GAAG,WAAW,CAAC;aACnC;SACF;QAED,oEAAoE;QACpE,IAAI,CAAC,EAAE,GAAG,MAAM,EAAE,OAAO,EAAE,CAAC,CAAC;IAC/B,CAAC,CAAC;AACJ,CAAC;AAlBD,sDAkBC"}
|
|
@@ -12,18 +12,29 @@ const number_1 = require("../../utils/number");
|
|
|
12
12
|
function logMiddleware(config, logger) {
|
|
13
13
|
return function log(req, res, next) {
|
|
14
14
|
const start = process.hrtime.bigint();
|
|
15
|
+
const remoteIp = (0, utils_1.getXClientIp)(req);
|
|
16
|
+
// @todo перенести в пресеты?
|
|
17
|
+
const startMsg = {
|
|
18
|
+
type: 'http.request[incoming]',
|
|
19
|
+
version: config.appVersion,
|
|
20
|
+
route: req.originalUrl,
|
|
21
|
+
method: req.method,
|
|
22
|
+
remote_ip: remoteIp,
|
|
23
|
+
};
|
|
24
|
+
logger.info(startMsg);
|
|
15
25
|
res.once('finish', () => {
|
|
16
26
|
const finish = process.hrtime.bigint();
|
|
17
27
|
// @todo перенести в пресеты?
|
|
18
|
-
const
|
|
28
|
+
const finishMsg = {
|
|
29
|
+
type: 'http.response[outgoing]',
|
|
19
30
|
version: config.appVersion,
|
|
20
31
|
route: req.originalUrl,
|
|
21
32
|
method: req.method,
|
|
22
33
|
status: res.statusCode,
|
|
23
|
-
remote_ip:
|
|
34
|
+
remote_ip: remoteIp,
|
|
24
35
|
latency: (0, number_1.toMilliseconds)(finish - start),
|
|
25
36
|
};
|
|
26
|
-
logger.info(
|
|
37
|
+
logger.info(finishMsg);
|
|
27
38
|
});
|
|
28
39
|
next();
|
|
29
40
|
};
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"log.js","sourceRoot":"","sources":["../../../src/http-server/middleware/log.ts"],"names":[],"mappings":";;;AAGA,oCAAwC;AACxC,+CAAoD;AAEpD;;;;;GAKG;AACH,SAAgB,aAAa,CAAC,MAAkB,EAAE,MAAc;IAC9D,OAAO,SAAS,GAAG,CAAC,GAAG,EAAE,GAAG,EAAE,IAAI;QAChC,MAAM,KAAK,GAAG,OAAO,CAAC,MAAM,CAAC,MAAM,EAAE,CAAC;
|
|
1
|
+
{"version":3,"file":"log.js","sourceRoot":"","sources":["../../../src/http-server/middleware/log.ts"],"names":[],"mappings":";;;AAGA,oCAAwC;AACxC,+CAAoD;AAEpD;;;;;GAKG;AACH,SAAgB,aAAa,CAAC,MAAkB,EAAE,MAAc;IAC9D,OAAO,SAAS,GAAG,CAAC,GAAG,EAAE,GAAG,EAAE,IAAI;QAChC,MAAM,KAAK,GAAG,OAAO,CAAC,MAAM,CAAC,MAAM,EAAE,CAAC;QACtC,MAAM,QAAQ,GAAG,IAAA,oBAAY,EAAC,GAAG,CAAC,CAAC;QAEnC,6BAA6B;QAC7B,MAAM,QAAQ,GAA0E;YACtF,IAAI,EAAE,wBAAwB;YAC9B,OAAO,EAAE,MAAM,CAAC,UAAU;YAC1B,KAAK,EAAE,GAAG,CAAC,WAAW;YACtB,MAAM,EAAE,GAAG,CAAC,MAAM;YAClB,SAAS,EAAE,QAAQ;SACpB,CAAC;QAEF,MAAM,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC;QAEtB,GAAG,CAAC,IAAI,CAAC,QAAQ,EAAE,GAAG,EAAE;YACtB,MAAM,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC,MAAM,EAAE,CAAC;YAEvC,6BAA6B;YAC7B,MAAM,SAAS,GAA8C;gBAC3D,IAAI,EAAE,yBAAyB;gBAC/B,OAAO,EAAE,MAAM,CAAC,UAAU;gBAC1B,KAAK,EAAE,GAAG,CAAC,WAAW;gBACtB,MAAM,EAAE,GAAG,CAAC,MAAM;gBAClB,MAAM,EAAE,GAAG,CAAC,UAAU;gBACtB,SAAS,EAAE,QAAQ;gBACnB,OAAO,EAAE,IAAA,uBAAc,EAAC,MAAM,GAAG,KAAK,CAAC;aACxC,CAAC;YAEF,MAAM,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC;QACzB,CAAC,CAAC,CAAC;QAEH,IAAI,EAAE,CAAC;IACT,CAAC,CAAC;AACJ,CAAC;AAnCD,sCAmCC"}
|
package/package.json
CHANGED
package/tracing/index.d.ts
CHANGED
|
@@ -5,5 +5,6 @@ import { Resource } from '@opentelemetry/resources';
|
|
|
5
5
|
* Может быть дополнен с помощью метода merge.
|
|
6
6
|
* @param config Конфиг.
|
|
7
7
|
* @return Ресурс для провайдера.
|
|
8
|
+
* @todo Перенести в пресеты?
|
|
8
9
|
*/
|
|
9
10
|
export declare function getConventionalResource(config: BaseConfig): Resource;
|
package/tracing/index.js
CHANGED
|
@@ -8,6 +8,7 @@ const semantic_conventions_1 = require("@opentelemetry/semantic-conventions");
|
|
|
8
8
|
* Может быть дополнен с помощью метода merge.
|
|
9
9
|
* @param config Конфиг.
|
|
10
10
|
* @return Ресурс для провайдера.
|
|
11
|
+
* @todo Перенести в пресеты?
|
|
11
12
|
*/
|
|
12
13
|
function getConventionalResource(config) {
|
|
13
14
|
return new resources_1.Resource({
|
package/tracing/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/tracing/index.ts"],"names":[],"mappings":";;;AACA,wDAAoD;AACpD,8EAAiF;AAEjF
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/tracing/index.ts"],"names":[],"mappings":";;;AACA,wDAAoD;AACpD,8EAAiF;AAEjF;;;;;;GAMG;AACH,SAAgB,uBAAuB,CAAC,MAAkB;IACxD,OAAO,IAAI,oBAAQ,CAAC;QAClB,CAAC,iDAA0B,CAAC,YAAY,CAAC,EAAE,MAAM,CAAC,OAAO;QACzD,CAAC,iDAA0B,CAAC,eAAe,CAAC,EAAE,MAAM,CAAC,UAAU;QAC/D,CAAC,iDAA0B,CAAC,sBAAsB,CAAC,EAAE,MAAM,CAAC,GAAG;KAChE,CAAC,CAAC;AACL,CAAC;AAND,0DAMC"}
|
|
@@ -25,37 +25,82 @@ var __importStar = (this && this.__importStar) || function (mod) {
|
|
|
25
25
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
26
26
|
exports.createSagaMiddleware = void 0;
|
|
27
27
|
const redux_saga_1 = __importStar(require("redux-saga"));
|
|
28
|
+
const effects_1 = require("redux-saga/effects");
|
|
28
29
|
/**
|
|
29
30
|
* Возвращает расширенную версию SagaMiddleware.
|
|
30
31
|
* @param handler Обработчик событий.
|
|
31
32
|
* @return Middleware.
|
|
32
33
|
*/
|
|
33
34
|
function createSagaExtendedMiddleware(handler) {
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
35
|
+
return new MiddlewareControl(handler).toMiddleware();
|
|
36
|
+
}
|
|
37
|
+
exports.createSagaMiddleware = createSagaExtendedMiddleware;
|
|
38
|
+
class MiddlewareControl {
|
|
39
|
+
constructor(handler) {
|
|
40
|
+
this.handler = handler;
|
|
41
|
+
this.sagaMiddleware = (0, redux_saga_1.default)({
|
|
42
|
+
onError: (error, info) => {
|
|
43
|
+
handler.onSagaError(error, info);
|
|
44
|
+
},
|
|
45
|
+
});
|
|
46
|
+
}
|
|
47
|
+
toMiddleware() {
|
|
48
|
+
const middleware = api => {
|
|
49
|
+
this.api = api;
|
|
50
|
+
return this.sagaMiddleware(api);
|
|
51
|
+
};
|
|
52
|
+
middleware.timeout = (milliseconds, config) => {
|
|
53
|
+
this.configInterrupt(milliseconds, config);
|
|
54
|
+
return middleware;
|
|
55
|
+
};
|
|
56
|
+
middleware.run = async (saga, ...args) => {
|
|
57
|
+
await this.run(saga, ...args);
|
|
58
|
+
};
|
|
46
59
|
return middleware;
|
|
47
|
-
}
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
|
|
60
|
+
}
|
|
61
|
+
configInterrupt(milliseconds, config) {
|
|
62
|
+
this.interruptTimeout = milliseconds;
|
|
63
|
+
this.interruptStrategy = config?.strategy ?? 'cancel-task';
|
|
64
|
+
}
|
|
65
|
+
async run(saga, ...args) {
|
|
66
|
+
const { interruptTimeout } = this;
|
|
67
|
+
if (typeof interruptTimeout === 'number' && Number.isFinite(interruptTimeout)) {
|
|
68
|
+
switch (this.interruptStrategy) {
|
|
69
|
+
case 'cancel-task':
|
|
70
|
+
await this.runWithBreakTask({ saga, args, timeout: interruptTimeout });
|
|
71
|
+
return;
|
|
72
|
+
case 'dispatch-end':
|
|
73
|
+
await this.runWithBreakMiddleware({ saga, args, timeout: interruptTimeout });
|
|
74
|
+
return;
|
|
75
|
+
}
|
|
76
|
+
}
|
|
77
|
+
await this.sagaMiddleware.run(saga, ...args).toPromise();
|
|
78
|
+
}
|
|
79
|
+
async runWithBreakTask(data) {
|
|
80
|
+
try {
|
|
81
|
+
await this.sagaMiddleware.run(runWithTimeLimit, data).toPromise();
|
|
82
|
+
}
|
|
83
|
+
catch (error) {
|
|
84
|
+
if (error instanceof TimeoutInterruptError) {
|
|
85
|
+
this.handler.onTimeoutInterrupt({ timeout: data.timeout });
|
|
86
|
+
}
|
|
87
|
+
else {
|
|
88
|
+
throw error;
|
|
89
|
+
}
|
|
90
|
+
}
|
|
91
|
+
}
|
|
92
|
+
async runWithBreakMiddleware(data) {
|
|
93
|
+
const { saga, args, timeout } = data;
|
|
94
|
+
const { api } = this;
|
|
53
95
|
if (!api) {
|
|
54
96
|
const error = new Error('Middleware is not applied to the store');
|
|
55
|
-
handler.onConfigError(error);
|
|
97
|
+
this.handler.onConfigError(error);
|
|
56
98
|
throw error;
|
|
57
99
|
}
|
|
58
|
-
promises
|
|
100
|
+
const promises = [];
|
|
101
|
+
let ready = false;
|
|
102
|
+
let timerId;
|
|
103
|
+
promises.push(this.sagaMiddleware
|
|
59
104
|
.run(saga, ...args)
|
|
60
105
|
.toPromise()
|
|
61
106
|
.then(() => {
|
|
@@ -65,20 +110,34 @@ function createSagaExtendedMiddleware(handler) {
|
|
|
65
110
|
// вне зависимости от результата отключаем таймер если он есть
|
|
66
111
|
timerId !== undefined && clearTimeout(timerId);
|
|
67
112
|
}));
|
|
68
|
-
|
|
69
|
-
|
|
70
|
-
|
|
71
|
-
|
|
72
|
-
|
|
73
|
-
|
|
74
|
-
|
|
75
|
-
|
|
76
|
-
|
|
77
|
-
}));
|
|
78
|
-
}
|
|
113
|
+
promises.push(new Promise(resolve => {
|
|
114
|
+
timerId = setTimeout(() => {
|
|
115
|
+
if (!ready) {
|
|
116
|
+
this.handler.onTimeoutInterrupt({ timeout });
|
|
117
|
+
api.dispatch(redux_saga_1.END);
|
|
118
|
+
}
|
|
119
|
+
resolve();
|
|
120
|
+
}, timeout);
|
|
121
|
+
}));
|
|
79
122
|
await Promise.race(promises);
|
|
80
|
-
}
|
|
81
|
-
|
|
123
|
+
}
|
|
124
|
+
}
|
|
125
|
+
function* runWithTimeLimit(data) {
|
|
126
|
+
const { saga, args, timeout } = data;
|
|
127
|
+
const task = yield (0, effects_1.fork)(saga, ...args);
|
|
128
|
+
const [isTimeout, taskResult] = yield (0, effects_1.race)([
|
|
129
|
+
(0, effects_1.delay)(timeout, true),
|
|
130
|
+
(0, effects_1.call)(() => task.toPromise()),
|
|
131
|
+
]);
|
|
132
|
+
if (isTimeout) {
|
|
133
|
+
yield (0, effects_1.cancel)(task);
|
|
134
|
+
throw new TimeoutInterruptError();
|
|
135
|
+
}
|
|
136
|
+
return taskResult;
|
|
137
|
+
}
|
|
138
|
+
class TimeoutInterruptError extends Error {
|
|
139
|
+
constructor() {
|
|
140
|
+
super('Saga was cancelled by timeout');
|
|
141
|
+
}
|
|
82
142
|
}
|
|
83
|
-
exports.createSagaMiddleware = createSagaExtendedMiddleware;
|
|
84
143
|
//# sourceMappingURL=middleware.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"middleware.js","sourceRoot":"","sources":["../../../src/utils/redux-saga/middleware.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;
|
|
1
|
+
{"version":3,"file":"middleware.js","sourceRoot":"","sources":["../../../src/utils/redux-saga/middleware.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,13 +1,34 @@
|
|
|
1
1
|
import type { Middleware } from '@reduxjs/toolkit';
|
|
2
2
|
import type { Saga, SagaMiddlewareOptions } from 'redux-saga';
|
|
3
|
+
/** Опции остановки redux-saga. */
|
|
4
|
+
export interface SagaInterruptConfig {
|
|
5
|
+
strategy?: 'dispatch-end' | 'cancel-task';
|
|
6
|
+
}
|
|
7
|
+
/** Информация, которая приходит вторым аргументом в обработчик ошибки SagaMiddleware. */
|
|
3
8
|
export type SagaErrorInfo = Parameters<Required<SagaMiddlewareOptions>['onError']>[1];
|
|
9
|
+
/** Информация об остановке redux-saga. */
|
|
4
10
|
export interface SagaInterruptInfo {
|
|
5
11
|
timeout: number;
|
|
6
12
|
}
|
|
13
|
+
/** Опции запуска redux-saga с остановкой по таймауту. */
|
|
14
|
+
export interface SagaTimeoutRunData<S extends Saga> {
|
|
15
|
+
saga: S;
|
|
16
|
+
args: Parameters<S>;
|
|
17
|
+
timeout: number;
|
|
18
|
+
}
|
|
19
|
+
/** Кастомная версия SagaMiddleware. */
|
|
7
20
|
export interface SagaExtendedMiddleware extends Middleware {
|
|
8
|
-
|
|
21
|
+
/**
|
|
22
|
+
* Установить временное ограничение работы саги.
|
|
23
|
+
* Если сага не успела выполнится до истечения этого ограничения она будет принудительно завершена.
|
|
24
|
+
*/
|
|
25
|
+
timeout(milliseconds: number, config?: SagaInterruptConfig): this;
|
|
26
|
+
/**
|
|
27
|
+
* Запускает сагу.
|
|
28
|
+
*/
|
|
9
29
|
run: <S extends Saga>(saga: S, ...args: Parameters<S>) => Promise<void>;
|
|
10
30
|
}
|
|
31
|
+
/** Обработчик событий SagaExtendedMiddleware. */
|
|
11
32
|
export interface SagaMiddlewareHandler {
|
|
12
33
|
onSagaError(error: Error, errorInfo: SagaErrorInfo): Promise<void> | void;
|
|
13
34
|
onConfigError(error: Error): Promise<void> | void;
|