@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.
@@ -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 Данные.
@@ -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;IAG3B;;OAEG;IACH,YAAY,IAA0B;QACpC,IAAI,CAAC,IAAI,GAAG,IAAI,CAAC;IACnB,CAAC;CACF;AATD,4CASC"}
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;YAChC,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"}
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
- await next({ ...config, headers });
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,MAAM,IAAI,CAAC,EAAE,GAAG,MAAM,EAAE,OAAO,EAAE,CAAC,CAAC;IACrC,CAAC,CAAC;AACJ,CAAC;AAjBD,sDAiBC"}
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 message = {
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: (0, utils_1.getXClientIp)(req),
34
+ remote_ip: remoteIp,
24
35
  latency: (0, number_1.toMilliseconds)(finish - start),
25
36
  };
26
- logger.info(message);
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;QAEtC,GAAG,CAAC,IAAI,CAAC,QAAQ,EAAE,GAAG,EAAE;YACtB,MAAM,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC,MAAM,EAAE,CAAC;YAEvC,6BAA6B;YAC7B,MAAM,OAAO,GAA2B;gBACtC,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,IAAA,oBAAY,EAAC,GAAG,CAAC;gBAC5B,OAAO,EAAE,IAAA,uBAAc,EAAC,MAAM,GAAG,KAAK,CAAC;aACxC,CAAC;YAEF,MAAM,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;QACvB,CAAC,CAAC,CAAC;QAEH,IAAI,EAAE,CAAC;IACT,CAAC,CAAC;AACJ,CAAC;AAtBD,sCAsBC"}
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
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@sima-land/isomorph",
3
- "version": "11.0.0-alpha.30",
3
+ "version": "11.0.0-alpha.31",
4
4
  "description": "Tiny framework for fast start frontend microservices",
5
5
  "author": "www.sima-land.ru team",
6
6
  "license": "Apache-2.0",
@@ -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({
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/tracing/index.ts"],"names":[],"mappings":";;;AACA,wDAAoD;AACpD,8EAAiF;AAEjF;;;;;GAKG;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"}
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
- const privates = {};
35
- const sagaMiddleware = (0, redux_saga_1.default)({
36
- onError: (error, info) => {
37
- handler.onSagaError(error, info);
38
- },
39
- });
40
- const middleware = api => {
41
- privates.api = api;
42
- return sagaMiddleware(api);
43
- };
44
- middleware.timeout = function timeout(milliseconds) {
45
- privates.timeout = milliseconds;
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
- middleware.run = async function run(saga, ...args) {
49
- const { api, timeout } = privates;
50
- const promises = [];
51
- let ready = false;
52
- let timerId;
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.push(sagaMiddleware
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
- if (typeof timeout === 'number' && Number.isFinite(timeout)) {
69
- promises.push(new Promise(resolve => {
70
- timerId = setTimeout(() => {
71
- if (!ready) {
72
- handler.onTimeoutInterrupt({ timeout });
73
- api.dispatch(redux_saga_1.END);
74
- }
75
- resolve();
76
- }, timeout);
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
- return middleware;
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":";;;;;;;;;;;;;;;;;;;;;;;;;;AAGA,yDAA6D;AAE7D;;;;GAIG;AACH,SAAS,4BAA4B,CAAC,OAA8B;IAClE,MAAM,QAAQ,GAGV,EAAE,CAAC;IAEP,MAAM,cAAc,GAAG,IAAA,oBAAoB,EAAC;QAC1C,OAAO,EAAE,CAAC,KAAK,EAAE,IAAI,EAAE,EAAE;YACvB,OAAO,CAAC,WAAW,CAAC,KAAK,EAAE,IAAI,CAAC,CAAC;QACnC,CAAC;KACF,CAAC,CAAC;IAEH,MAAM,UAAU,GAA2B,GAAG,CAAC,EAAE;QAC/C,QAAQ,CAAC,GAAG,GAAG,GAAG,CAAC;QACnB,OAAO,cAAc,CAAC,GAAG,CAAC,CAAC;IAC7B,CAAC,CAAC;IAEF,UAAU,CAAC,OAAO,GAAG,SAAS,OAAO,CAAC,YAAoB;QACxD,QAAQ,CAAC,OAAO,GAAG,YAAY,CAAC;QAChC,OAAO,UAAU,CAAC;IACpB,CAAC,CAAC;IAEF,UAAU,CAAC,GAAG,GAAG,KAAK,UAAU,GAAG,CACjC,IAAO,EACP,GAAG,IAAmB;QAEtB,MAAM,EAAE,GAAG,EAAE,OAAO,EAAE,GAAG,QAAQ,CAAC;QAClC,MAAM,QAAQ,GAAoB,EAAE,CAAC;QAErC,IAAI,KAAK,GAAG,KAAK,CAAC;QAClB,IAAI,OAAsC,CAAC;QAE3C,IAAI,CAAC,GAAG,EAAE;YACR,MAAM,KAAK,GAAG,IAAI,KAAK,CAAC,wCAAwC,CAAC,CAAC;YAElE,OAAO,CAAC,aAAa,CAAC,KAAK,CAAC,CAAC;YAE7B,MAAM,KAAK,CAAC;SACb;QAED,QAAQ,CAAC,IAAI,CACX,cAAc;aACX,GAAG,CAAC,IAAI,EAAE,GAAG,IAAI,CAAC;aAClB,SAAS,EAAE;aACX,IAAI,CAAC,GAAG,EAAE;YACT,KAAK,GAAG,IAAI,CAAC;QACf,CAAC,CAAC;aACD,OAAO,CAAC,GAAG,EAAE;YACZ,8DAA8D;YAC9D,OAAO,KAAK,SAAS,IAAI,YAAY,CAAC,OAAO,CAAC,CAAC;QACjD,CAAC,CAAC,CACL,CAAC;QAEF,IAAI,OAAO,OAAO,KAAK,QAAQ,IAAI,MAAM,CAAC,QAAQ,CAAC,OAAO,CAAC,EAAE;YAC3D,QAAQ,CAAC,IAAI,CACX,IAAI,OAAO,CAAO,OAAO,CAAC,EAAE;gBAC1B,OAAO,GAAG,UAAU,CAAC,GAAG,EAAE;oBACxB,IAAI,CAAC,KAAK,EAAE;wBACV,OAAO,CAAC,kBAAkB,CAAC,EAAE,OAAO,EAAE,CAAC,CAAC;wBACxC,GAAG,CAAC,QAAQ,CAAC,gBAAG,CAAC,CAAC;qBACnB;oBAED,OAAO,EAAE,CAAC;gBACZ,CAAC,EAAE,OAAO,CAAC,CAAC;YACd,CAAC,CAAC,CACH,CAAC;SACH;QAED,MAAM,OAAO,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC;IAC/B,CAAC,CAAC;IAEF,OAAO,UAAU,CAAC;AACpB,CAAC;AAEwC,4DAAoB"}
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
- timeout(milliseconds: number): this;
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;