@sima-land/isomorph 11.0.0-alpha.50 → 11.0.0-alpha.51

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.
Files changed (54) hide show
  1. package/dist/cjs/http/utils.js +16 -4
  2. package/dist/cjs/http/utils.js.map +1 -1
  3. package/dist/cjs/log/handler/sentry.js +18 -22
  4. package/dist/cjs/log/handler/sentry.js.map +1 -1
  5. package/dist/cjs/log/index.js +14 -0
  6. package/dist/cjs/log/index.js.map +1 -1
  7. package/dist/cjs/package.json +14 -14
  8. package/dist/cjs/preset/bun/providers/log-handler-sentry.js +4 -2
  9. package/dist/cjs/preset/bun/providers/log-handler-sentry.js.map +1 -1
  10. package/dist/cjs/preset/bun/providers/serve-middleware.js +1 -1
  11. package/dist/cjs/preset/bun/providers/serve-middleware.js.map +1 -1
  12. package/dist/cjs/preset/node/providers/express-error-middleware.js +1 -1
  13. package/dist/cjs/preset/node/providers/express-error-middleware.js.map +1 -1
  14. package/dist/cjs/preset/node/providers/express-request-middleware.js +6 -1
  15. package/dist/cjs/preset/node/providers/express-request-middleware.js.map +1 -1
  16. package/dist/cjs/preset/node/providers/log-handler-sentry.js +11 -7
  17. package/dist/cjs/preset/node/providers/log-handler-sentry.js.map +1 -1
  18. package/dist/cjs/preset/node/providers/main-express-app.js +1 -3
  19. package/dist/cjs/preset/node/providers/main-express-app.js.map +1 -1
  20. package/dist/cjs/preset/web/providers/logger.js +9 -6
  21. package/dist/cjs/preset/web/providers/logger.js.map +1 -1
  22. package/dist/esm/http/utils.js +16 -4
  23. package/dist/esm/http/utils.js.map +1 -1
  24. package/dist/esm/log/handler/sentry.js +18 -22
  25. package/dist/esm/log/handler/sentry.js.map +1 -1
  26. package/dist/esm/log/index.js +2 -0
  27. package/dist/esm/log/index.js.map +1 -1
  28. package/dist/esm/package.json +14 -14
  29. package/dist/esm/preset/bun/providers/log-handler-sentry.js +5 -3
  30. package/dist/esm/preset/bun/providers/log-handler-sentry.js.map +1 -1
  31. package/dist/esm/preset/bun/providers/serve-middleware.js +2 -2
  32. package/dist/esm/preset/bun/providers/serve-middleware.js.map +1 -1
  33. package/dist/esm/preset/node/providers/express-error-middleware.js +2 -3
  34. package/dist/esm/preset/node/providers/express-error-middleware.js.map +1 -1
  35. package/dist/esm/preset/node/providers/express-request-middleware.js +7 -3
  36. package/dist/esm/preset/node/providers/express-request-middleware.js.map +1 -1
  37. package/dist/esm/preset/node/providers/log-handler-sentry.js +11 -5
  38. package/dist/esm/preset/node/providers/log-handler-sentry.js.map +1 -1
  39. package/dist/esm/preset/node/providers/main-express-app.js +1 -3
  40. package/dist/esm/preset/node/providers/main-express-app.js.map +1 -1
  41. package/dist/esm/preset/web/providers/logger.js +10 -7
  42. package/dist/esm/preset/web/providers/logger.js.map +1 -1
  43. package/dist/types/http/utils.d.ts.map +1 -1
  44. package/dist/types/log/handler/sentry.d.ts +3 -3
  45. package/dist/types/log/handler/sentry.d.ts.map +1 -1
  46. package/dist/types/log/index.d.ts +2 -0
  47. package/dist/types/log/index.d.ts.map +1 -1
  48. package/dist/types/preset/bun/providers/log-handler-sentry.d.ts.map +1 -1
  49. package/dist/types/preset/node/providers/express-error-middleware.d.ts.map +1 -1
  50. package/dist/types/preset/node/providers/express-request-middleware.d.ts.map +1 -1
  51. package/dist/types/preset/node/providers/log-handler-sentry.d.ts.map +1 -1
  52. package/dist/types/preset/node/providers/main-express-app.d.ts.map +1 -1
  53. package/dist/types/preset/web/providers/logger.d.ts.map +1 -1
  54. package/package.json +14 -14
@@ -57,11 +57,21 @@ const FetchUtil = exports.FetchUtil = {
57
57
  eitherResponse({
58
58
  parseBody = response => response.json()
59
59
  } = {}) {
60
- return [async response => {
60
+ /** @inheritdoc */
61
+ const parse = async response => {
62
+ try {
63
+ return await parseBody(response);
64
+ } catch {
65
+ return null;
66
+ }
67
+ };
68
+ return [
69
+ // then
70
+ async response => {
61
71
  if (!response.ok) {
62
72
  return {
63
73
  ok: false,
64
- data: await parseBody(response).catch(() => null),
74
+ data: await parse(response),
65
75
  error: new Error(`Request failed with status code ${response.status}`),
66
76
  status: response.status,
67
77
  statusText: response.statusText,
@@ -70,13 +80,15 @@ const FetchUtil = exports.FetchUtil = {
70
80
  }
71
81
  return {
72
82
  ok: true,
73
- data: await parseBody(response).catch(() => null),
83
+ data: await parse(response),
74
84
  error: null,
75
85
  status: response.status,
76
86
  statusText: response.statusText,
77
87
  headers: response.headers
78
88
  };
79
- }, async error => ({
89
+ },
90
+ // catch
91
+ async error => ({
80
92
  ok: false,
81
93
  error
82
94
  })];
@@ -1 +1 @@
1
- {"version":3,"file":"utils.js","names":["FetchUtil","exports","setParams","url","params","paramName","paramValue","Object","entries","searchParams","delete","undefined","set","String","withParams","resultUrl","URL","withoutParams","search","eitherResponse","parseBody","response","json","ok","data","catch","error","Error","status","statusText","headers"],"sources":["../../../src/http/utils.ts"],"sourcesContent":["import type { URLSearchParamsInit, ResponseDone, ResponseFail } from './types';\n\n/**\n * Утилиты для работы с URL, URLSearchParams, Headers, Request, Response.\n */\nexport const FetchUtil = {\n /**\n * Получив параметры применит их к переданному URL.\n * @param url URL.\n * @param params Параметры.\n */\n setParams(url: URL, params: URLSearchParamsInit): void {\n for (const [paramName, paramValue] of Object.entries(params)) {\n if (paramValue === null) {\n url.searchParams.delete(paramName);\n continue;\n }\n\n if (paramValue !== undefined) {\n url.searchParams.set(paramName, String(paramValue));\n continue;\n }\n }\n },\n\n // @todo resetPrams?\n\n /**\n * Получив URL и параметры вернет новый URL с примененными параметрами.\n * @param url URL.\n * @param params Параметры.\n * @return URL.\n */\n withParams(url: string | URL, params: URLSearchParamsInit): URL {\n const resultUrl = new URL(url);\n\n FetchUtil.setParams(resultUrl, params);\n\n return resultUrl;\n },\n\n /**\n * Получив URL вернет его копию но без параметров.\n * @param url URL.\n * @return URL.\n */\n withoutParams(url: string | URL): URL {\n const resultUrl = new URL(url);\n\n resultUrl.search = '';\n\n return resultUrl;\n },\n\n /**\n * Возвращает кортеж обработчиков для Promise из fetch.\n * Полученный Promise никогда не уйдет в состояние rejected.\n * @param options Опции.\n * @return Кортеж.\n */\n eitherResponse<T = unknown>({\n parseBody = response => response.json(),\n }: {\n /** Парсер body. */\n parseBody?: (response: Response) => Promise<T>;\n } = {}) {\n return [\n async (response: Response): Promise<ResponseDone<T> | ResponseFail<T>> => {\n if (!response.ok) {\n return {\n ok: false,\n data: (await parseBody(response).catch(() => null)) as T,\n error: new Error(`Request failed with status code ${response.status}`),\n status: response.status,\n statusText: response.statusText,\n headers: response.headers,\n };\n }\n\n return {\n ok: true,\n data: (await parseBody(response).catch(() => null)) as T,\n error: null,\n status: response.status,\n statusText: response.statusText,\n headers: response.headers,\n };\n },\n async (error: unknown): Promise<ResponseFail<T>> => ({\n ok: false,\n error,\n }),\n ] as const;\n },\n} as const;\n"],"mappings":";;;;;;AAEA;AACA;AACA;AACO,MAAMA,SAAS,GAAAC,OAAA,CAAAD,SAAA,GAAG;EACvB;AACF;AACA;AACA;AACA;EACEE,SAASA,CAACC,GAAQ,EAAEC,MAA2B,EAAQ;IACrD,KAAK,MAAM,CAACC,SAAS,EAAEC,UAAU,CAAC,IAAIC,MAAM,CAACC,OAAO,CAACJ,MAAM,CAAC,EAAE;MAC5D,IAAIE,UAAU,KAAK,IAAI,EAAE;QACvBH,GAAG,CAACM,YAAY,CAACC,MAAM,CAACL,SAAS,CAAC;QAClC;MACF;MAEA,IAAIC,UAAU,KAAKK,SAAS,EAAE;QAC5BR,GAAG,CAACM,YAAY,CAACG,GAAG,CAACP,SAAS,EAAEQ,MAAM,CAACP,UAAU,CAAC,CAAC;QACnD;MACF;IACF;EACF,CAAC;EAED;;EAEA;AACF;AACA;AACA;AACA;AACA;EACEQ,UAAUA,CAACX,GAAiB,EAAEC,MAA2B,EAAO;IAC9D,MAAMW,SAAS,GAAG,IAAIC,GAAG,CAACb,GAAG,CAAC;IAE9BH,SAAS,CAACE,SAAS,CAACa,SAAS,EAAEX,MAAM,CAAC;IAEtC,OAAOW,SAAS;EAClB,CAAC;EAED;AACF;AACA;AACA;AACA;EACEE,aAAaA,CAACd,GAAiB,EAAO;IACpC,MAAMY,SAAS,GAAG,IAAIC,GAAG,CAACb,GAAG,CAAC;IAE9BY,SAAS,CAACG,MAAM,GAAG,EAAE;IAErB,OAAOH,SAAS;EAClB,CAAC;EAED;AACF;AACA;AACA;AACA;AACA;EACEI,cAAcA,CAAc;IAC1BC,SAAS,GAAGC,QAAQ,IAAIA,QAAQ,CAACC,IAAI,CAAC;EAIxC,CAAC,GAAG,CAAC,CAAC,EAAE;IACN,OAAO,CACL,MAAOD,QAAkB,IAAiD;MACxE,IAAI,CAACA,QAAQ,CAACE,EAAE,EAAE;QAChB,OAAO;UACLA,EAAE,EAAE,KAAK;UACTC,IAAI,EAAG,MAAMJ,SAAS,CAACC,QAAQ,CAAC,CAACI,KAAK,CAAC,MAAM,IAAI,CAAO;UACxDC,KAAK,EAAE,IAAIC,KAAK,CAAE,mCAAkCN,QAAQ,CAACO,MAAO,EAAC,CAAC;UACtEA,MAAM,EAAEP,QAAQ,CAACO,MAAM;UACvBC,UAAU,EAAER,QAAQ,CAACQ,UAAU;UAC/BC,OAAO,EAAET,QAAQ,CAACS;QACpB,CAAC;MACH;MAEA,OAAO;QACLP,EAAE,EAAE,IAAI;QACRC,IAAI,EAAG,MAAMJ,SAAS,CAACC,QAAQ,CAAC,CAACI,KAAK,CAAC,MAAM,IAAI,CAAO;QACxDC,KAAK,EAAE,IAAI;QACXE,MAAM,EAAEP,QAAQ,CAACO,MAAM;QACvBC,UAAU,EAAER,QAAQ,CAACQ,UAAU;QAC/BC,OAAO,EAAET,QAAQ,CAACS;MACpB,CAAC;IACH,CAAC,EACD,MAAOJ,KAAc,KAAgC;MACnDH,EAAE,EAAE,KAAK;MACTG;IACF,CAAC,CAAC,CACH;EACH;AACF,CAAU"}
1
+ {"version":3,"file":"utils.js","names":["FetchUtil","exports","setParams","url","params","paramName","paramValue","Object","entries","searchParams","delete","undefined","set","String","withParams","resultUrl","URL","withoutParams","search","eitherResponse","parseBody","response","json","parse","ok","data","error","Error","status","statusText","headers"],"sources":["../../../src/http/utils.ts"],"sourcesContent":["import type { URLSearchParamsInit, ResponseDone, ResponseFail } from './types';\n\n/**\n * Утилиты для работы с URL, URLSearchParams, Headers, Request, Response.\n */\nexport const FetchUtil = {\n /**\n * Получив параметры применит их к переданному URL.\n * @param url URL.\n * @param params Параметры.\n */\n setParams(url: URL, params: URLSearchParamsInit): void {\n for (const [paramName, paramValue] of Object.entries(params)) {\n if (paramValue === null) {\n url.searchParams.delete(paramName);\n continue;\n }\n\n if (paramValue !== undefined) {\n url.searchParams.set(paramName, String(paramValue));\n continue;\n }\n }\n },\n\n // @todo resetPrams?\n\n /**\n * Получив URL и параметры вернет новый URL с примененными параметрами.\n * @param url URL.\n * @param params Параметры.\n * @return URL.\n */\n withParams(url: string | URL, params: URLSearchParamsInit): URL {\n const resultUrl = new URL(url);\n\n FetchUtil.setParams(resultUrl, params);\n\n return resultUrl;\n },\n\n /**\n * Получив URL вернет его копию но без параметров.\n * @param url URL.\n * @return URL.\n */\n withoutParams(url: string | URL): URL {\n const resultUrl = new URL(url);\n\n resultUrl.search = '';\n\n return resultUrl;\n },\n\n /**\n * Возвращает кортеж обработчиков для Promise из fetch.\n * Полученный Promise никогда не уйдет в состояние rejected.\n * @param options Опции.\n * @return Кортеж.\n */\n eitherResponse<T = unknown>({\n parseBody = response => response.json(),\n }: {\n /** Парсер body. */\n parseBody?: (response: Response) => Promise<T>;\n } = {}) {\n /** @inheritdoc */\n const parse = async (response: Response): Promise<T | null> => {\n try {\n return await parseBody(response);\n } catch {\n return null;\n }\n };\n\n return [\n // then\n async (response: Response): Promise<ResponseDone<T> | ResponseFail<T>> => {\n if (!response.ok) {\n return {\n ok: false,\n data: (await parse(response)) as T,\n error: new Error(`Request failed with status code ${response.status}`),\n status: response.status,\n statusText: response.statusText,\n headers: response.headers,\n };\n }\n\n return {\n ok: true,\n data: (await parse(response)) as T,\n error: null,\n status: response.status,\n statusText: response.statusText,\n headers: response.headers,\n };\n },\n\n // catch\n async (error: unknown): Promise<ResponseFail<T>> => ({\n ok: false,\n error,\n }),\n ] as const;\n },\n} as const;\n"],"mappings":";;;;;;AAEA;AACA;AACA;AACO,MAAMA,SAAS,GAAAC,OAAA,CAAAD,SAAA,GAAG;EACvB;AACF;AACA;AACA;AACA;EACEE,SAASA,CAACC,GAAQ,EAAEC,MAA2B,EAAQ;IACrD,KAAK,MAAM,CAACC,SAAS,EAAEC,UAAU,CAAC,IAAIC,MAAM,CAACC,OAAO,CAACJ,MAAM,CAAC,EAAE;MAC5D,IAAIE,UAAU,KAAK,IAAI,EAAE;QACvBH,GAAG,CAACM,YAAY,CAACC,MAAM,CAACL,SAAS,CAAC;QAClC;MACF;MAEA,IAAIC,UAAU,KAAKK,SAAS,EAAE;QAC5BR,GAAG,CAACM,YAAY,CAACG,GAAG,CAACP,SAAS,EAAEQ,MAAM,CAACP,UAAU,CAAC,CAAC;QACnD;MACF;IACF;EACF,CAAC;EAED;;EAEA;AACF;AACA;AACA;AACA;AACA;EACEQ,UAAUA,CAACX,GAAiB,EAAEC,MAA2B,EAAO;IAC9D,MAAMW,SAAS,GAAG,IAAIC,GAAG,CAACb,GAAG,CAAC;IAE9BH,SAAS,CAACE,SAAS,CAACa,SAAS,EAAEX,MAAM,CAAC;IAEtC,OAAOW,SAAS;EAClB,CAAC;EAED;AACF;AACA;AACA;AACA;EACEE,aAAaA,CAACd,GAAiB,EAAO;IACpC,MAAMY,SAAS,GAAG,IAAIC,GAAG,CAACb,GAAG,CAAC;IAE9BY,SAAS,CAACG,MAAM,GAAG,EAAE;IAErB,OAAOH,SAAS;EAClB,CAAC;EAED;AACF;AACA;AACA;AACA;AACA;EACEI,cAAcA,CAAc;IAC1BC,SAAS,GAAGC,QAAQ,IAAIA,QAAQ,CAACC,IAAI,CAAC;EAIxC,CAAC,GAAG,CAAC,CAAC,EAAE;IACN;IACA,MAAMC,KAAK,GAAG,MAAOF,QAAkB,IAAwB;MAC7D,IAAI;QACF,OAAO,MAAMD,SAAS,CAACC,QAAQ,CAAC;MAClC,CAAC,CAAC,MAAM;QACN,OAAO,IAAI;MACb;IACF,CAAC;IAED,OAAO;IACL;IACA,MAAOA,QAAkB,IAAiD;MACxE,IAAI,CAACA,QAAQ,CAACG,EAAE,EAAE;QAChB,OAAO;UACLA,EAAE,EAAE,KAAK;UACTC,IAAI,EAAG,MAAMF,KAAK,CAACF,QAAQ,CAAO;UAClCK,KAAK,EAAE,IAAIC,KAAK,CAAE,mCAAkCN,QAAQ,CAACO,MAAO,EAAC,CAAC;UACtEA,MAAM,EAAEP,QAAQ,CAACO,MAAM;UACvBC,UAAU,EAAER,QAAQ,CAACQ,UAAU;UAC/BC,OAAO,EAAET,QAAQ,CAACS;QACpB,CAAC;MACH;MAEA,OAAO;QACLN,EAAE,EAAE,IAAI;QACRC,IAAI,EAAG,MAAMF,KAAK,CAACF,QAAQ,CAAO;QAClCK,KAAK,EAAE,IAAI;QACXE,MAAM,EAAEP,QAAQ,CAACO,MAAM;QACvBC,UAAU,EAAER,QAAQ,CAACQ,UAAU;QAC/BC,OAAO,EAAET,QAAQ,CAACS;MACpB,CAAC;IACH,CAAC;IAED;IACA,MAAOJ,KAAc,KAAgC;MACnDF,EAAE,EAAE,KAAK;MACTE;IACF,CAAC,CAAC,CACH;EACH;AACF,CAAU"}
@@ -7,16 +7,16 @@ exports.createSentryHandler = createSentryHandler;
7
7
  var _log = require("../../log");
8
8
  /**
9
9
  * Возвращает новый handler для logger'а для отправки событий в Sentry.
10
- * @param hubInit Sentry Hub или функция которая его вернёт.
10
+ * @param scopeInit Sentry Hub или функция которая его вернёт.
11
11
  * @return Handler.
12
12
  */
13
- function createSentryHandler(hubInit) {
14
- const getHub = typeof hubInit === 'function' ? hubInit : () => hubInit;
13
+ function createSentryHandler(scopeInit) {
14
+ const getScope = typeof scopeInit === 'function' ? scopeInit : () => scopeInit;
15
15
  return event => {
16
- // ВАЖНО: каждый входящий http-запрос должен иметь свой собственный hub
16
+ // ВАЖНО: каждый входящий http-запрос должен иметь свой собственный hub (ныне scope)
17
17
  // подробности: https://github.com/getsentry/sentry-javascript/discussions/5648
18
18
  // поэтому если передана функция - вызываем каждый раз (внутри обработчика)
19
- const hub = getHub();
19
+ const scope = getScope();
20
20
 
21
21
  // error
22
22
  if (event.type === 'error') {
@@ -27,30 +27,26 @@ function createSentryHandler(hubInit) {
27
27
  context,
28
28
  extra
29
29
  } = error.data;
30
- hub.withScope(scope => {
31
- if (level) {
32
- scope.setLevel(level);
30
+ if (level) {
31
+ scope.setLevel(level);
32
+ }
33
+ if (context) {
34
+ const list = Array.isArray(context) ? context : [context];
35
+ for (const item of list) {
36
+ scope.setContext(item.key, item.data);
33
37
  }
34
- if (context) {
35
- const list = Array.isArray(context) ? context : [context];
36
- for (const item of list) {
37
- scope.setContext(item.key, item.data);
38
- }
39
- }
40
- if (extra) {
41
- scope.setExtra(extra.key, extra.data);
42
- }
43
- hub.captureException(error);
44
- });
45
- } else {
46
- hub.captureException(error);
38
+ }
39
+ if (extra) {
40
+ scope.setExtra(extra.key, extra.data);
41
+ }
47
42
  }
43
+ scope.captureException(error);
48
44
  }
49
45
 
50
46
  // breadcrumb
51
47
  if (event.data instanceof _log.Breadcrumb) {
52
48
  const breadcrumb = event.data.data;
53
- hub.addBreadcrumb(breadcrumb);
49
+ scope.addBreadcrumb(breadcrumb);
54
50
  }
55
51
  };
56
52
  }
@@ -1 +1 @@
1
- {"version":3,"file":"sentry.js","names":["_log","require","createSentryHandler","hubInit","getHub","event","hub","type","error","data","DetailedError","level","context","extra","withScope","scope","setLevel","list","Array","isArray","item","setContext","key","setExtra","captureException","Breadcrumb","breadcrumb","addBreadcrumb"],"sources":["../../../../src/log/handler/sentry.ts"],"sourcesContent":["import type { LogHandler } from '../types';\nimport type { Hub } from '@sentry/types';\nimport { Breadcrumb, DetailedError } from '../../log';\n\n/**\n * Возвращает новый handler для logger'а для отправки событий в Sentry.\n * @param hubInit Sentry Hub или функция которая его вернёт.\n * @return Handler.\n */\nexport function createSentryHandler(hubInit: Hub | (() => Hub)): LogHandler {\n const getHub = typeof hubInit === 'function' ? hubInit : () => hubInit;\n\n return event => {\n // ВАЖНО: каждый входящий http-запрос должен иметь свой собственный hub\n // подробности: https://github.com/getsentry/sentry-javascript/discussions/5648\n // поэтому если передана функция - вызываем каждый раз (внутри обработчика)\n const hub = getHub();\n\n // error\n if (event.type === 'error') {\n const error = event.data;\n\n if (error instanceof DetailedError) {\n const { level, context, extra } = error.data;\n\n hub.withScope(scope => {\n if (level) {\n scope.setLevel(level);\n }\n\n if (context) {\n const list = Array.isArray(context) ? context : [context];\n\n for (const item of list) {\n scope.setContext(item.key, item.data);\n }\n }\n\n if (extra) {\n scope.setExtra(extra.key, extra.data);\n }\n\n hub.captureException(error);\n });\n } else {\n hub.captureException(error);\n }\n }\n\n // breadcrumb\n if (event.data instanceof Breadcrumb) {\n const breadcrumb = event.data.data;\n\n hub.addBreadcrumb(breadcrumb);\n }\n };\n}\n"],"mappings":";;;;;;AAEA,IAAAA,IAAA,GAAAC,OAAA;AAEA;AACA;AACA;AACA;AACA;AACO,SAASC,mBAAmBA,CAACC,OAA0B,EAAc;EAC1E,MAAMC,MAAM,GAAG,OAAOD,OAAO,KAAK,UAAU,GAAGA,OAAO,GAAG,MAAMA,OAAO;EAEtE,OAAOE,KAAK,IAAI;IACd;IACA;IACA;IACA,MAAMC,GAAG,GAAGF,MAAM,CAAC,CAAC;;IAEpB;IACA,IAAIC,KAAK,CAACE,IAAI,KAAK,OAAO,EAAE;MAC1B,MAAMC,KAAK,GAAGH,KAAK,CAACI,IAAI;MAExB,IAAID,KAAK,YAAYE,kBAAa,EAAE;QAClC,MAAM;UAAEC,KAAK;UAAEC,OAAO;UAAEC;QAAM,CAAC,GAAGL,KAAK,CAACC,IAAI;QAE5CH,GAAG,CAACQ,SAAS,CAACC,KAAK,IAAI;UACrB,IAAIJ,KAAK,EAAE;YACTI,KAAK,CAACC,QAAQ,CAACL,KAAK,CAAC;UACvB;UAEA,IAAIC,OAAO,EAAE;YACX,MAAMK,IAAI,GAAGC,KAAK,CAACC,OAAO,CAACP,OAAO,CAAC,GAAGA,OAAO,GAAG,CAACA,OAAO,CAAC;YAEzD,KAAK,MAAMQ,IAAI,IAAIH,IAAI,EAAE;cACvBF,KAAK,CAACM,UAAU,CAACD,IAAI,CAACE,GAAG,EAAEF,IAAI,CAACX,IAAI,CAAC;YACvC;UACF;UAEA,IAAII,KAAK,EAAE;YACTE,KAAK,CAACQ,QAAQ,CAACV,KAAK,CAACS,GAAG,EAAET,KAAK,CAACJ,IAAI,CAAC;UACvC;UAEAH,GAAG,CAACkB,gBAAgB,CAAChB,KAAK,CAAC;QAC7B,CAAC,CAAC;MACJ,CAAC,MAAM;QACLF,GAAG,CAACkB,gBAAgB,CAAChB,KAAK,CAAC;MAC7B;IACF;;IAEA;IACA,IAAIH,KAAK,CAACI,IAAI,YAAYgB,eAAU,EAAE;MACpC,MAAMC,UAAU,GAAGrB,KAAK,CAACI,IAAI,CAACA,IAAI;MAElCH,GAAG,CAACqB,aAAa,CAACD,UAAU,CAAC;IAC/B;EACF,CAAC;AACH"}
1
+ {"version":3,"file":"sentry.js","names":["_log","require","createSentryHandler","scopeInit","getScope","event","scope","type","error","data","DetailedError","level","context","extra","setLevel","list","Array","isArray","item","setContext","key","setExtra","captureException","Breadcrumb","breadcrumb","addBreadcrumb"],"sources":["../../../../src/log/handler/sentry.ts"],"sourcesContent":["import type { LogHandler } from '../types';\nimport type { Scope } from '@sentry/types';\nimport { Breadcrumb, DetailedError } from '../../log';\n\n/**\n * Возвращает новый handler для logger'а для отправки событий в Sentry.\n * @param scopeInit Sentry Hub или функция которая его вернёт.\n * @return Handler.\n */\nexport function createSentryHandler(scopeInit: Scope | (() => Scope)): LogHandler {\n const getScope = typeof scopeInit === 'function' ? scopeInit : () => scopeInit;\n\n return event => {\n // ВАЖНО: каждый входящий http-запрос должен иметь свой собственный hub (ныне scope)\n // подробности: https://github.com/getsentry/sentry-javascript/discussions/5648\n // поэтому если передана функция - вызываем каждый раз (внутри обработчика)\n const scope = getScope();\n\n // error\n if (event.type === 'error') {\n const error = event.data;\n\n if (error instanceof DetailedError) {\n const { level, context, extra } = error.data;\n\n if (level) {\n scope.setLevel(level);\n }\n\n if (context) {\n const list = Array.isArray(context) ? context : [context];\n\n for (const item of list) {\n scope.setContext(item.key, item.data);\n }\n }\n\n if (extra) {\n scope.setExtra(extra.key, extra.data);\n }\n }\n\n scope.captureException(error);\n }\n\n // breadcrumb\n if (event.data instanceof Breadcrumb) {\n const breadcrumb = event.data.data;\n\n scope.addBreadcrumb(breadcrumb);\n }\n };\n}\n"],"mappings":";;;;;;AAEA,IAAAA,IAAA,GAAAC,OAAA;AAEA;AACA;AACA;AACA;AACA;AACO,SAASC,mBAAmBA,CAACC,SAAgC,EAAc;EAChF,MAAMC,QAAQ,GAAG,OAAOD,SAAS,KAAK,UAAU,GAAGA,SAAS,GAAG,MAAMA,SAAS;EAE9E,OAAOE,KAAK,IAAI;IACd;IACA;IACA;IACA,MAAMC,KAAK,GAAGF,QAAQ,CAAC,CAAC;;IAExB;IACA,IAAIC,KAAK,CAACE,IAAI,KAAK,OAAO,EAAE;MAC1B,MAAMC,KAAK,GAAGH,KAAK,CAACI,IAAI;MAExB,IAAID,KAAK,YAAYE,kBAAa,EAAE;QAClC,MAAM;UAAEC,KAAK;UAAEC,OAAO;UAAEC;QAAM,CAAC,GAAGL,KAAK,CAACC,IAAI;QAE5C,IAAIE,KAAK,EAAE;UACTL,KAAK,CAACQ,QAAQ,CAACH,KAAK,CAAC;QACvB;QAEA,IAAIC,OAAO,EAAE;UACX,MAAMG,IAAI,GAAGC,KAAK,CAACC,OAAO,CAACL,OAAO,CAAC,GAAGA,OAAO,GAAG,CAACA,OAAO,CAAC;UAEzD,KAAK,MAAMM,IAAI,IAAIH,IAAI,EAAE;YACvBT,KAAK,CAACa,UAAU,CAACD,IAAI,CAACE,GAAG,EAAEF,IAAI,CAACT,IAAI,CAAC;UACvC;QACF;QAEA,IAAII,KAAK,EAAE;UACTP,KAAK,CAACe,QAAQ,CAACR,KAAK,CAACO,GAAG,EAAEP,KAAK,CAACJ,IAAI,CAAC;QACvC;MACF;MAEAH,KAAK,CAACgB,gBAAgB,CAACd,KAAK,CAAC;IAC/B;;IAEA;IACA,IAAIH,KAAK,CAACI,IAAI,YAAYc,eAAU,EAAE;MACpC,MAAMC,UAAU,GAAGnB,KAAK,CAACI,IAAI,CAACA,IAAI;MAElCH,KAAK,CAACmB,aAAa,CAACD,UAAU,CAAC;IACjC;EACF,CAAC;AACH"}
@@ -21,6 +21,20 @@ Object.defineProperty(exports, "createLogger", {
21
21
  return _logger.createLogger;
22
22
  }
23
23
  });
24
+ Object.defineProperty(exports, "createPinoHandler", {
25
+ enumerable: true,
26
+ get: function () {
27
+ return _pino.createPinoHandler;
28
+ }
29
+ });
30
+ Object.defineProperty(exports, "createSentryHandler", {
31
+ enumerable: true,
32
+ get: function () {
33
+ return _sentry.createSentryHandler;
34
+ }
35
+ });
24
36
  var _logger = require("./logger");
25
37
  var _errors = require("./errors");
38
+ var _pino = require("./handler/pino");
39
+ var _sentry = require("./handler/sentry");
26
40
  //# sourceMappingURL=index.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","names":["_logger","require","_errors"],"sources":["../../../src/log/index.ts"],"sourcesContent":["export type {\n Logger,\n LogEvent,\n LogLevel,\n LogHandler,\n ErrorDetails,\n BreadcrumbDetails,\n ContextData,\n} from './types';\n\nexport { createLogger } from './logger';\nexport { DetailedError, Breadcrumb } from './errors';\n"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;AAUA,IAAAA,OAAA,GAAAC,OAAA;AACA,IAAAC,OAAA,GAAAD,OAAA"}
1
+ {"version":3,"file":"index.js","names":["_logger","require","_errors","_pino","_sentry"],"sources":["../../../src/log/index.ts"],"sourcesContent":["export type {\n Logger,\n LogEvent,\n LogLevel,\n LogHandler,\n ErrorDetails,\n BreadcrumbDetails,\n ContextData,\n} from './types';\n\nexport { createLogger } from './logger';\nexport { DetailedError, Breadcrumb } from './errors';\nexport { createPinoHandler } from './handler/pino';\nexport { createSentryHandler } from './handler/sentry';\n"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAUA,IAAAA,OAAA,GAAAC,OAAA;AACA,IAAAC,OAAA,GAAAD,OAAA;AACA,IAAAE,KAAA,GAAAF,OAAA;AACA,IAAAG,OAAA,GAAAH,OAAA"}
@@ -1,22 +1,22 @@
1
1
  {
2
2
  "type": "commonjs",
3
3
  "name": "@sima-land/isomorph",
4
- "version": "11.0.0-alpha.50",
4
+ "version": "11.0.0-alpha.51",
5
5
  "dependencies": {
6
6
  "@humanwhocodes/env": "^3.0.5",
7
7
  "@krutoo/fetch-tools": "^0.0.16",
8
- "@opentelemetry/api": "^1.4.1",
9
- "@opentelemetry/exporter-prometheus": "^0.38.0",
10
- "@opentelemetry/exporter-trace-otlp-http": "^0.39.1",
11
- "@opentelemetry/propagator-jaeger": "^1.12.0",
12
- "@opentelemetry/resources": "^1.12.0",
13
- "@opentelemetry/sdk-metrics": "^1.12.0",
14
- "@opentelemetry/sdk-trace-base": "^1.12.0",
15
- "@opentelemetry/sdk-trace-node": "^1.12.0",
16
- "@opentelemetry/semantic-conventions": "^1.12.0",
17
- "@sentry/browser": "^7.81.0",
18
- "@sentry/bun": "^7.81.0",
19
- "@sentry/node": "^7.81.0",
8
+ "@opentelemetry/api": "^1.9.0",
9
+ "@opentelemetry/exporter-prometheus": "^0.52.1",
10
+ "@opentelemetry/exporter-trace-otlp-http": "^0.52.1",
11
+ "@opentelemetry/propagator-jaeger": "^1.25.1",
12
+ "@opentelemetry/resources": "^1.25.1",
13
+ "@opentelemetry/sdk-metrics": "^1.25.1",
14
+ "@opentelemetry/sdk-trace-base": "^1.25.1",
15
+ "@opentelemetry/sdk-trace-node": "^1.25.1",
16
+ "@opentelemetry/semantic-conventions": "^1.25.1",
17
+ "@sentry/browser": "^8.13.0",
18
+ "@sentry/bun": "^8.13.0",
19
+ "@sentry/node": "^8.13.0",
20
20
  "accepts": "^1.3.8",
21
21
  "dotenv": "^16.3.1",
22
22
  "express": "^4.18.2",
@@ -30,7 +30,7 @@
30
30
  },
31
31
  "peerDependencies": {
32
32
  "@reduxjs/toolkit": "^1.9.5",
33
- "axios": "^1.6.7",
33
+ "axios": "^1.7.4",
34
34
  "react": "^17.0 || ^18.0",
35
35
  "react-dom": "^17.0 || ^18.0",
36
36
  "react-redux": "^8.0.5",
@@ -14,11 +14,13 @@ function provideLogHandlerSentry(resolve) {
14
14
  (0, _bun.init)({
15
15
  dsn: source.require('SENTRY_DSN'),
16
16
  release: source.require('SENTRY_RELEASE'),
17
- environment: source.require('SENTRY_ENVIRONMENT')
17
+ environment: source.require('SENTRY_ENVIRONMENT'),
18
+ tracesSampleRate: Number(source.get('SENTRY_TRACES_SAMPLE_RATE', 0)),
19
+ integrations: [...(0, _bun.getDefaultIntegrations)({})]
18
20
  });
19
21
 
20
22
  // ВАЖНО: передаем функцию чтобы брать текущий hub в момент вызова метода logger'а
21
23
  // это нужно чтобы хлебные крошки в ошибках Sentry группировались по запросам
22
- return (0, _sentry.createSentryHandler)(_bun.getCurrentHub);
24
+ return (0, _sentry.createSentryHandler)(_bun.getCurrentScope);
23
25
  }
24
26
  //# sourceMappingURL=log-handler-sentry.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"log-handler-sentry.js","names":["_tokens","require","_bun","_sentry","provideLogHandlerSentry","resolve","source","KnownToken","Config","init","dsn","release","environment","createSentryHandler","getCurrentHub"],"sources":["../../../../../src/preset/bun/providers/log-handler-sentry.ts"],"sourcesContent":["/* eslint-disable require-jsdoc, jsdoc/require-jsdoc */\nimport { Resolve } from '../../../di';\nimport { KnownToken } from '../../../tokens';\nimport { getCurrentHub, init } from '@sentry/bun';\nimport { createSentryHandler } from '../../../log/handler/sentry';\n\nexport function provideLogHandlerSentry(resolve: Resolve) {\n const source = resolve(KnownToken.Config.source);\n\n init({\n dsn: source.require('SENTRY_DSN'),\n release: source.require('SENTRY_RELEASE'),\n environment: source.require('SENTRY_ENVIRONMENT'),\n });\n\n // ВАЖНО: передаем функцию чтобы брать текущий hub в момент вызова метода logger'а\n // это нужно чтобы хлебные крошки в ошибках Sentry группировались по запросам\n return createSentryHandler(getCurrentHub);\n}\n"],"mappings":";;;;;;AAEA,IAAAA,OAAA,GAAAC,OAAA;AACA,IAAAC,IAAA,GAAAD,OAAA;AACA,IAAAE,OAAA,GAAAF,OAAA;AAJA;;AAMO,SAASG,uBAAuBA,CAACC,OAAgB,EAAE;EACxD,MAAMC,MAAM,GAAGD,OAAO,CAACE,kBAAU,CAACC,MAAM,CAACF,MAAM,CAAC;EAEhD,IAAAG,SAAI,EAAC;IACHC,GAAG,EAAEJ,MAAM,CAACL,OAAO,CAAC,YAAY,CAAC;IACjCU,OAAO,EAAEL,MAAM,CAACL,OAAO,CAAC,gBAAgB,CAAC;IACzCW,WAAW,EAAEN,MAAM,CAACL,OAAO,CAAC,oBAAoB;EAClD,CAAC,CAAC;;EAEF;EACA;EACA,OAAO,IAAAY,2BAAmB,EAACC,kBAAa,CAAC;AAC3C"}
1
+ {"version":3,"file":"log-handler-sentry.js","names":["_tokens","require","_bun","_sentry","provideLogHandlerSentry","resolve","source","KnownToken","Config","init","dsn","release","environment","tracesSampleRate","Number","get","integrations","getDefaultIntegrations","createSentryHandler","getCurrentScope"],"sources":["../../../../../src/preset/bun/providers/log-handler-sentry.ts"],"sourcesContent":["/* eslint-disable require-jsdoc, jsdoc/require-jsdoc */\nimport { Resolve } from '../../../di';\nimport { KnownToken } from '../../../tokens';\nimport { getCurrentScope, getDefaultIntegrations, init } from '@sentry/bun';\nimport { createSentryHandler } from '../../../log/handler/sentry';\n\nexport function provideLogHandlerSentry(resolve: Resolve) {\n const source = resolve(KnownToken.Config.source);\n\n init({\n dsn: source.require('SENTRY_DSN'),\n release: source.require('SENTRY_RELEASE'),\n environment: source.require('SENTRY_ENVIRONMENT'),\n tracesSampleRate: Number(source.get('SENTRY_TRACES_SAMPLE_RATE', 0)),\n integrations: [...getDefaultIntegrations({})],\n });\n\n // ВАЖНО: передаем функцию чтобы брать текущий hub в момент вызова метода logger'а\n // это нужно чтобы хлебные крошки в ошибках Sentry группировались по запросам\n return createSentryHandler(getCurrentScope);\n}\n"],"mappings":";;;;;;AAEA,IAAAA,OAAA,GAAAC,OAAA;AACA,IAAAC,IAAA,GAAAD,OAAA;AACA,IAAAE,OAAA,GAAAF,OAAA;AAJA;;AAMO,SAASG,uBAAuBA,CAACC,OAAgB,EAAE;EACxD,MAAMC,MAAM,GAAGD,OAAO,CAACE,kBAAU,CAACC,MAAM,CAACF,MAAM,CAAC;EAEhD,IAAAG,SAAI,EAAC;IACHC,GAAG,EAAEJ,MAAM,CAACL,OAAO,CAAC,YAAY,CAAC;IACjCU,OAAO,EAAEL,MAAM,CAACL,OAAO,CAAC,gBAAgB,CAAC;IACzCW,WAAW,EAAEN,MAAM,CAACL,OAAO,CAAC,oBAAoB,CAAC;IACjDY,gBAAgB,EAAEC,MAAM,CAACR,MAAM,CAACS,GAAG,CAAC,2BAA2B,EAAE,CAAC,CAAC,CAAC;IACpEC,YAAY,EAAE,CAAC,GAAG,IAAAC,2BAAsB,EAAC,CAAC,CAAC,CAAC;EAC9C,CAAC,CAAC;;EAEF;EACA;EACA,OAAO,IAAAC,2BAAmB,EAACC,oBAAe,CAAC;AAC7C"}
@@ -16,7 +16,7 @@ function provideServeMiddleware(resolve) {
16
16
  const logger = resolve(_tokens.KnownToken.logger);
17
17
  return [
18
18
  // ВАЖНО: изолируем хлебные крошки чтобы они группировались по входящим запросам
19
- (request, next) => (0, _bun.runWithAsyncContext)(async () => next(request)),
19
+ (request, next) => (0, _bun.withIsolationScope)(async () => next(request)),
20
20
  // ВАЖНО: слой логирования ошибки ПЕРЕД остальными слоями чтобы не упустить ошибки выше
21
21
  (0, _getServeErrorLogging.getServeErrorLogging)(logger),
22
22
  // @todo tracing
@@ -1 +1 @@
1
- {"version":3,"file":"serve-middleware.js","names":["_tokens","require","_bun","_getServeLogging","_getServeErrorLogging","_getServeMeasuring","provideServeMiddleware","resolve","config","KnownToken","Config","base","logger","request","next","runWithAsyncContext","getServeErrorLogging","getServeMeasuring","getServeLogging"],"sources":["../../../../../src/preset/bun/providers/serve-middleware.ts"],"sourcesContent":["/* eslint-disable require-jsdoc, jsdoc/require-jsdoc */\nimport { Resolve } from '../../../di';\nimport { KnownToken } from '../../../tokens';\nimport { runWithAsyncContext } from '@sentry/bun';\nimport { ServerMiddleware } from '../../server/types';\nimport { getServeLogging } from '../../server/utils/get-serve-logging';\nimport { getServeErrorLogging } from '../../server/utils/get-serve-error-logging';\nimport { getServeMeasuring } from '../../node/utils/get-serve-measuring';\n\nexport function provideServeMiddleware(resolve: Resolve): ServerMiddleware[] {\n const config = resolve(KnownToken.Config.base);\n const logger = resolve(KnownToken.logger);\n\n return [\n // ВАЖНО: изолируем хлебные крошки чтобы они группировались по входящим запросам\n (request, next) => runWithAsyncContext(async () => next(request)),\n\n // ВАЖНО: слой логирования ошибки ПЕРЕД остальными слоями чтобы не упустить ошибки выше\n getServeErrorLogging(logger),\n\n // @todo tracing\n\n // метрики\n getServeMeasuring(config),\n\n // ВАЖНО: слой логирования запроса и ответа ПОСЛЕ остальных слоев чтобы использовать актуальные данные\n getServeLogging(logger),\n ];\n}\n"],"mappings":";;;;;;AAEA,IAAAA,OAAA,GAAAC,OAAA;AACA,IAAAC,IAAA,GAAAD,OAAA;AAEA,IAAAE,gBAAA,GAAAF,OAAA;AACA,IAAAG,qBAAA,GAAAH,OAAA;AACA,IAAAI,kBAAA,GAAAJ,OAAA;AAPA;;AASO,SAASK,sBAAsBA,CAACC,OAAgB,EAAsB;EAC3E,MAAMC,MAAM,GAAGD,OAAO,CAACE,kBAAU,CAACC,MAAM,CAACC,IAAI,CAAC;EAC9C,MAAMC,MAAM,GAAGL,OAAO,CAACE,kBAAU,CAACG,MAAM,CAAC;EAEzC,OAAO;EACL;EACA,CAACC,OAAO,EAAEC,IAAI,KAAK,IAAAC,wBAAmB,EAAC,YAAYD,IAAI,CAACD,OAAO,CAAC,CAAC;EAEjE;EACA,IAAAG,0CAAoB,EAACJ,MAAM,CAAC;EAE5B;;EAEA;EACA,IAAAK,oCAAiB,EAACT,MAAM,CAAC;EAEzB;EACA,IAAAU,gCAAe,EAACN,MAAM,CAAC,CACxB;AACH"}
1
+ {"version":3,"file":"serve-middleware.js","names":["_tokens","require","_bun","_getServeLogging","_getServeErrorLogging","_getServeMeasuring","provideServeMiddleware","resolve","config","KnownToken","Config","base","logger","request","next","withIsolationScope","getServeErrorLogging","getServeMeasuring","getServeLogging"],"sources":["../../../../../src/preset/bun/providers/serve-middleware.ts"],"sourcesContent":["/* eslint-disable require-jsdoc, jsdoc/require-jsdoc */\nimport { Resolve } from '../../../di';\nimport { KnownToken } from '../../../tokens';\nimport { withIsolationScope } from '@sentry/bun';\nimport { ServerMiddleware } from '../../server/types';\nimport { getServeLogging } from '../../server/utils/get-serve-logging';\nimport { getServeErrorLogging } from '../../server/utils/get-serve-error-logging';\nimport { getServeMeasuring } from '../../node/utils/get-serve-measuring';\n\nexport function provideServeMiddleware(resolve: Resolve): ServerMiddleware[] {\n const config = resolve(KnownToken.Config.base);\n const logger = resolve(KnownToken.logger);\n\n return [\n // ВАЖНО: изолируем хлебные крошки чтобы они группировались по входящим запросам\n (request, next) => withIsolationScope(async () => next(request)),\n\n // ВАЖНО: слой логирования ошибки ПЕРЕД остальными слоями чтобы не упустить ошибки выше\n getServeErrorLogging(logger),\n\n // @todo tracing\n\n // метрики\n getServeMeasuring(config),\n\n // ВАЖНО: слой логирования запроса и ответа ПОСЛЕ остальных слоев чтобы использовать актуальные данные\n getServeLogging(logger),\n ];\n}\n"],"mappings":";;;;;;AAEA,IAAAA,OAAA,GAAAC,OAAA;AACA,IAAAC,IAAA,GAAAD,OAAA;AAEA,IAAAE,gBAAA,GAAAF,OAAA;AACA,IAAAG,qBAAA,GAAAH,OAAA;AACA,IAAAI,kBAAA,GAAAJ,OAAA;AAPA;;AASO,SAASK,sBAAsBA,CAACC,OAAgB,EAAsB;EAC3E,MAAMC,MAAM,GAAGD,OAAO,CAACE,kBAAU,CAACC,MAAM,CAACC,IAAI,CAAC;EAC9C,MAAMC,MAAM,GAAGL,OAAO,CAACE,kBAAU,CAACG,MAAM,CAAC;EAEzC,OAAO;EACL;EACA,CAACC,OAAO,EAAEC,IAAI,KAAK,IAAAC,uBAAkB,EAAC,YAAYD,IAAI,CAACD,OAAO,CAAC,CAAC;EAEhE;EACA,IAAAG,0CAAoB,EAACJ,MAAM,CAAC;EAE5B;;EAEA;EACA,IAAAK,oCAAiB,EAACT,MAAM,CAAC;EAEzB;EACA,IAAAU,gCAAe,EAACN,MAAM,CAAC,CACxB;AACH"}
@@ -10,6 +10,6 @@ var _node = require("@sentry/node");
10
10
  * @return Промежуточный слой.
11
11
  */
12
12
  function provideExpressErrorMiddleware() {
13
- return _node.Handlers.errorHandler();
13
+ return (0, _node.expressErrorHandler)();
14
14
  }
15
15
  //# sourceMappingURL=express-error-middleware.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"express-error-middleware.js","names":["_node","require","provideExpressErrorMiddleware","Handlers","errorHandler"],"sources":["../../../../../src/preset/node/providers/express-error-middleware.ts"],"sourcesContent":["import type express from 'express';\nimport { Handlers } from '@sentry/node';\n\n/**\n * Провайдер промежуточного слоя обработки ошибок в рамках ответ на http-запросы.\n * @return Промежуточный слой.\n */\nexport function provideExpressErrorMiddleware(): express.ErrorRequestHandler {\n return Handlers.errorHandler();\n}\n"],"mappings":";;;;;;AACA,IAAAA,KAAA,GAAAC,OAAA;AAEA;AACA;AACA;AACA;AACO,SAASC,6BAA6BA,CAAA,EAAgC;EAC3E,OAAOC,cAAQ,CAACC,YAAY,CAAC,CAAC;AAChC"}
1
+ {"version":3,"file":"express-error-middleware.js","names":["_node","require","provideExpressErrorMiddleware","expressErrorHandler"],"sources":["../../../../../src/preset/node/providers/express-error-middleware.ts"],"sourcesContent":["import { expressErrorHandler } from '@sentry/node';\nimport type express from 'express';\n\n/**\n * Провайдер промежуточного слоя обработки ошибок в рамках ответ на http-запросы.\n * @return Промежуточный слой.\n */\nexport function provideExpressErrorMiddleware(): express.ErrorRequestHandler {\n return expressErrorHandler();\n}\n"],"mappings":";;;;;;AAAA,IAAAA,KAAA,GAAAC,OAAA;AAGA;AACA;AACA;AACA;AACO,SAASC,6BAA6BA,CAAA,EAAgC;EAC3E,OAAO,IAAAC,yBAAmB,EAAC,CAAC;AAC9B"}
@@ -10,6 +10,11 @@ var _node = require("@sentry/node");
10
10
  * @return Промежуточный слой.
11
11
  */
12
12
  function provideExpressRequestMiddleware() {
13
- return _node.Handlers.requestHandler();
13
+ // https://github.com/getsentry/sentry-javascript/discussions/9618#discussioncomment-9950984
14
+ return (req, res, next) => {
15
+ (0, _node.withIsolationScope)(() => {
16
+ next();
17
+ });
18
+ };
14
19
  }
15
20
  //# sourceMappingURL=express-request-middleware.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"express-request-middleware.js","names":["_node","require","provideExpressRequestMiddleware","Handlers","requestHandler"],"sources":["../../../../../src/preset/node/providers/express-request-middleware.ts"],"sourcesContent":["import type express from 'express';\nimport { Handlers } from '@sentry/node';\n\n/**\n * Провайдер промежуточного слоя учета входящих http-запросов.\n * @return Промежуточный слой.\n */\nexport function provideExpressRequestMiddleware(): express.Handler {\n return Handlers.requestHandler();\n}\n"],"mappings":";;;;;;AACA,IAAAA,KAAA,GAAAC,OAAA;AAEA;AACA;AACA;AACA;AACO,SAASC,+BAA+BA,CAAA,EAAoB;EACjE,OAAOC,cAAQ,CAACC,cAAc,CAAC,CAAC;AAClC"}
1
+ {"version":3,"file":"express-request-middleware.js","names":["_node","require","provideExpressRequestMiddleware","req","res","next","withIsolationScope"],"sources":["../../../../../src/preset/node/providers/express-request-middleware.ts"],"sourcesContent":["import { withIsolationScope } from '@sentry/node';\nimport type express from 'express';\n\n/**\n * Провайдер промежуточного слоя учета входящих http-запросов.\n * @return Промежуточный слой.\n */\nexport function provideExpressRequestMiddleware(): express.Handler {\n // https://github.com/getsentry/sentry-javascript/discussions/9618#discussioncomment-9950984\n return (req, res, next) => {\n withIsolationScope(() => {\n next();\n });\n };\n}\n"],"mappings":";;;;;;AAAA,IAAAA,KAAA,GAAAC,OAAA;AAGA;AACA;AACA;AACA;AACO,SAASC,+BAA+BA,CAAA,EAAoB;EACjE;EACA,OAAO,CAACC,GAAG,EAAEC,GAAG,EAAEC,IAAI,KAAK;IACzB,IAAAC,wBAAkB,EAAC,MAAM;MACvBD,IAAI,CAAC,CAAC;IACR,CAAC,CAAC;EACJ,CAAC;AACH"}
@@ -4,11 +4,9 @@ Object.defineProperty(exports, "__esModule", {
4
4
  value: true
5
5
  });
6
6
  exports.provideLogHandlerSentry = provideLogHandlerSentry;
7
- var Sentry = _interopRequireWildcard(require("@sentry/node"));
7
+ var _node = require("@sentry/node");
8
8
  var _sentry = require("../../../log/handler/sentry");
9
9
  var _tokens = require("../../../tokens");
10
- function _getRequireWildcardCache(nodeInterop) { if (typeof WeakMap !== "function") return null; var cacheBabelInterop = new WeakMap(); var cacheNodeInterop = new WeakMap(); return (_getRequireWildcardCache = function (nodeInterop) { return nodeInterop ? cacheNodeInterop : cacheBabelInterop; })(nodeInterop); }
11
- function _interopRequireWildcard(obj, nodeInterop) { if (!nodeInterop && obj && obj.__esModule) { return obj; } if (obj === null || typeof obj !== "object" && typeof obj !== "function") { return { default: obj }; } var cache = _getRequireWildcardCache(nodeInterop); if (cache && cache.has(obj)) { return cache.get(obj); } var newObj = {}; var hasPropertyDescriptor = Object.defineProperty && Object.getOwnPropertyDescriptor; for (var key in obj) { if (key !== "default" && Object.prototype.hasOwnProperty.call(obj, key)) { var desc = hasPropertyDescriptor ? Object.getOwnPropertyDescriptor(obj, key) : null; if (desc && (desc.get || desc.set)) { Object.defineProperty(newObj, key, desc); } else { newObj[key] = obj[key]; } } } newObj.default = obj; if (cache) { cache.set(obj, newObj); } return newObj; }
12
10
  /**
13
11
  * Провайдер обработчика логирования для Sentry.
14
12
  * @param resolve Функция для получения зависимости по токену.
@@ -18,14 +16,20 @@ function provideLogHandlerSentry(resolve) {
18
16
  const source = resolve(_tokens.KnownToken.Config.source);
19
17
 
20
18
  // экспериментально пробуем не использовать вручную созданный клиент
21
- Sentry.init({
19
+ (0, _node.init)({
22
20
  dsn: source.require('SENTRY_DSN'),
23
21
  release: source.require('SENTRY_RELEASE'),
24
- environment: source.require('SENTRY_ENVIRONMENT')
22
+ environment: source.require('SENTRY_ENVIRONMENT'),
23
+ tracesSampleRate: Number(source.get('SENTRY_TRACES_SAMPLE_RATE', 0)),
24
+ profilesSampleRate: Number(source.get('SENTRY_TRACES_SAMPLE_RATE', 0)),
25
+ integrations: [...(0, _node.getDefaultIntegrations)({})]
26
+
27
+ // ВАЖНО: данная опция ломает группировку ошибок, активировать при необэодимости связать компоненты OTEL с Sentry
28
+ // skipOpenTelemetrySetup: true,
25
29
  });
26
30
 
27
- // ВАЖНО: передаем функцию чтобы брать текущий hub в момент вызова метода logger'а
31
+ // ВАЖНО: передаем функцию чтобы брать текущий scope в момент вызова метода logger'а
28
32
  // это нужно чтобы хлебные крошки в ошибках Sentry группировались по запросам
29
- return (0, _sentry.createSentryHandler)(Sentry.getCurrentHub);
33
+ return (0, _sentry.createSentryHandler)(_node.getCurrentScope);
30
34
  }
31
35
  //# sourceMappingURL=log-handler-sentry.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"log-handler-sentry.js","names":["Sentry","_interopRequireWildcard","require","_sentry","_tokens","_getRequireWildcardCache","nodeInterop","WeakMap","cacheBabelInterop","cacheNodeInterop","obj","__esModule","default","cache","has","get","newObj","hasPropertyDescriptor","Object","defineProperty","getOwnPropertyDescriptor","key","prototype","hasOwnProperty","call","desc","set","provideLogHandlerSentry","resolve","source","KnownToken","Config","init","dsn","release","environment","createSentryHandler","getCurrentHub"],"sources":["../../../../../src/preset/node/providers/log-handler-sentry.ts"],"sourcesContent":["import * as Sentry from '@sentry/node';\nimport { Resolve } from '../../../di';\nimport { LogHandler } from '../../../log';\nimport { createSentryHandler } from '../../../log/handler/sentry';\nimport { KnownToken } from '../../../tokens';\n\n/**\n * Провайдер обработчика логирования для Sentry.\n * @param resolve Функция для получения зависимости по токену.\n * @return Обработчик.\n */\nexport function provideLogHandlerSentry(resolve: Resolve): LogHandler {\n const source = resolve(KnownToken.Config.source);\n\n // экспериментально пробуем не использовать вручную созданный клиент\n Sentry.init({\n dsn: source.require('SENTRY_DSN'),\n release: source.require('SENTRY_RELEASE'),\n environment: source.require('SENTRY_ENVIRONMENT'),\n });\n\n // ВАЖНО: передаем функцию чтобы брать текущий hub в момент вызова метода logger'а\n // это нужно чтобы хлебные крошки в ошибках Sentry группировались по запросам\n return createSentryHandler(Sentry.getCurrentHub);\n}\n"],"mappings":";;;;;;AAAA,IAAAA,MAAA,GAAAC,uBAAA,CAAAC,OAAA;AAGA,IAAAC,OAAA,GAAAD,OAAA;AACA,IAAAE,OAAA,GAAAF,OAAA;AAA6C,SAAAG,yBAAAC,WAAA,eAAAC,OAAA,kCAAAC,iBAAA,OAAAD,OAAA,QAAAE,gBAAA,OAAAF,OAAA,YAAAF,wBAAA,YAAAA,CAAAC,WAAA,WAAAA,WAAA,GAAAG,gBAAA,GAAAD,iBAAA,KAAAF,WAAA;AAAA,SAAAL,wBAAAS,GAAA,EAAAJ,WAAA,SAAAA,WAAA,IAAAI,GAAA,IAAAA,GAAA,CAAAC,UAAA,WAAAD,GAAA,QAAAA,GAAA,oBAAAA,GAAA,wBAAAA,GAAA,4BAAAE,OAAA,EAAAF,GAAA,UAAAG,KAAA,GAAAR,wBAAA,CAAAC,WAAA,OAAAO,KAAA,IAAAA,KAAA,CAAAC,GAAA,CAAAJ,GAAA,YAAAG,KAAA,CAAAE,GAAA,CAAAL,GAAA,SAAAM,MAAA,WAAAC,qBAAA,GAAAC,MAAA,CAAAC,cAAA,IAAAD,MAAA,CAAAE,wBAAA,WAAAC,GAAA,IAAAX,GAAA,QAAAW,GAAA,kBAAAH,MAAA,CAAAI,SAAA,CAAAC,cAAA,CAAAC,IAAA,CAAAd,GAAA,EAAAW,GAAA,SAAAI,IAAA,GAAAR,qBAAA,GAAAC,MAAA,CAAAE,wBAAA,CAAAV,GAAA,EAAAW,GAAA,cAAAI,IAAA,KAAAA,IAAA,CAAAV,GAAA,IAAAU,IAAA,CAAAC,GAAA,KAAAR,MAAA,CAAAC,cAAA,CAAAH,MAAA,EAAAK,GAAA,EAAAI,IAAA,YAAAT,MAAA,CAAAK,GAAA,IAAAX,GAAA,CAAAW,GAAA,SAAAL,MAAA,CAAAJ,OAAA,GAAAF,GAAA,MAAAG,KAAA,IAAAA,KAAA,CAAAa,GAAA,CAAAhB,GAAA,EAAAM,MAAA,YAAAA,MAAA;AAE7C;AACA;AACA;AACA;AACA;AACO,SAASW,uBAAuBA,CAACC,OAAgB,EAAc;EACpE,MAAMC,MAAM,GAAGD,OAAO,CAACE,kBAAU,CAACC,MAAM,CAACF,MAAM,CAAC;;EAEhD;EACA7B,MAAM,CAACgC,IAAI,CAAC;IACVC,GAAG,EAAEJ,MAAM,CAAC3B,OAAO,CAAC,YAAY,CAAC;IACjCgC,OAAO,EAAEL,MAAM,CAAC3B,OAAO,CAAC,gBAAgB,CAAC;IACzCiC,WAAW,EAAEN,MAAM,CAAC3B,OAAO,CAAC,oBAAoB;EAClD,CAAC,CAAC;;EAEF;EACA;EACA,OAAO,IAAAkC,2BAAmB,EAACpC,MAAM,CAACqC,aAAa,CAAC;AAClD"}
1
+ {"version":3,"file":"log-handler-sentry.js","names":["_node","require","_sentry","_tokens","provideLogHandlerSentry","resolve","source","KnownToken","Config","init","dsn","release","environment","tracesSampleRate","Number","get","profilesSampleRate","integrations","getDefaultIntegrations","createSentryHandler","getCurrentScope"],"sources":["../../../../../src/preset/node/providers/log-handler-sentry.ts"],"sourcesContent":["import { init, getDefaultIntegrations, getCurrentScope } from '@sentry/node';\nimport { Resolve } from '../../../di';\nimport { LogHandler } from '../../../log';\nimport { createSentryHandler } from '../../../log/handler/sentry';\nimport { KnownToken } from '../../../tokens';\n\n/**\n * Провайдер обработчика логирования для Sentry.\n * @param resolve Функция для получения зависимости по токену.\n * @return Обработчик.\n */\nexport function provideLogHandlerSentry(resolve: Resolve): LogHandler {\n const source = resolve(KnownToken.Config.source);\n\n // экспериментально пробуем не использовать вручную созданный клиент\n init({\n dsn: source.require('SENTRY_DSN'),\n release: source.require('SENTRY_RELEASE'),\n environment: source.require('SENTRY_ENVIRONMENT'),\n tracesSampleRate: Number(source.get('SENTRY_TRACES_SAMPLE_RATE', 0)),\n profilesSampleRate: Number(source.get('SENTRY_TRACES_SAMPLE_RATE', 0)),\n integrations: [...getDefaultIntegrations({})],\n\n // ВАЖНО: данная опция ломает группировку ошибок, активировать при необэодимости связать компоненты OTEL с Sentry\n // skipOpenTelemetrySetup: true,\n });\n\n // ВАЖНО: передаем функцию чтобы брать текущий scope в момент вызова метода logger'а\n // это нужно чтобы хлебные крошки в ошибках Sentry группировались по запросам\n return createSentryHandler(getCurrentScope);\n}\n"],"mappings":";;;;;;AAAA,IAAAA,KAAA,GAAAC,OAAA;AAGA,IAAAC,OAAA,GAAAD,OAAA;AACA,IAAAE,OAAA,GAAAF,OAAA;AAEA;AACA;AACA;AACA;AACA;AACO,SAASG,uBAAuBA,CAACC,OAAgB,EAAc;EACpE,MAAMC,MAAM,GAAGD,OAAO,CAACE,kBAAU,CAACC,MAAM,CAACF,MAAM,CAAC;;EAEhD;EACA,IAAAG,UAAI,EAAC;IACHC,GAAG,EAAEJ,MAAM,CAACL,OAAO,CAAC,YAAY,CAAC;IACjCU,OAAO,EAAEL,MAAM,CAACL,OAAO,CAAC,gBAAgB,CAAC;IACzCW,WAAW,EAAEN,MAAM,CAACL,OAAO,CAAC,oBAAoB,CAAC;IACjDY,gBAAgB,EAAEC,MAAM,CAACR,MAAM,CAACS,GAAG,CAAC,2BAA2B,EAAE,CAAC,CAAC,CAAC;IACpEC,kBAAkB,EAAEF,MAAM,CAACR,MAAM,CAACS,GAAG,CAAC,2BAA2B,EAAE,CAAC,CAAC,CAAC;IACtEE,YAAY,EAAE,CAAC,GAAG,IAAAC,4BAAsB,EAAC,CAAC,CAAC,CAAC;;IAE5C;IACA;EACF,CAAC,CAAC;;EAEF;EACA;EACA,OAAO,IAAAC,2BAAmB,EAACC,qBAAe,CAAC;AAC7C"}
@@ -58,9 +58,7 @@ function provideMainExpressApp(resolve) {
58
58
  for (const [routePath, routeHandler] of pageRoutes) {
59
59
  const path = typeof routePath === 'string' ? routePath : routePath.path;
60
60
  const method = typeof routePath === 'string' ? 'get' : routePath.method;
61
- app.use(path, middleware);
62
- app[method](path, routeHandler);
63
- app.use(path, endMiddleware);
61
+ app[method](path, middleware, routeHandler, endMiddleware);
64
62
  }
65
63
 
66
64
  // служебные маршруты (к ним не применяются промежуточные слои)
@@ -1 +1 @@
1
- {"version":3,"file":"main-express-app.js","names":["_tokens","require","_express","_interopRequireDefault","_httpProxyMiddleware","obj","__esModule","default","provideMainExpressApp","resolve","config","KnownToken","Config","base","pageRoutes","Express","serviceRoutes","middleware","endMiddleware","proxyConfig","Http","Serve","Proxy","app","express","env","proxyConfigs","Array","isArray","target","filter","pathRewrite","Error","proxyPaths","proxyMiddleware","createProxyMiddleware","changeOrigin","use","req","res","next","some","proxyPath","path","startsWith","routePath","routeHandler","method"],"sources":["../../../../../src/preset/node/providers/main-express-app.ts"],"sourcesContent":["import type { Resolve } from '../../../di';\nimport { KnownToken } from '../../../tokens';\nimport express from 'express';\nimport { createProxyMiddleware } from 'http-proxy-middleware';\n\n/**\n * Провайдер основного express-приложения.\n * @param resolve Функция для получения зависимости по токену.\n * @return Основное express-приложение.\n */\nexport function provideMainExpressApp(resolve: Resolve): express.Application {\n const config = resolve(KnownToken.Config.base);\n const pageRoutes = resolve(KnownToken.Express.pageRoutes);\n const serviceRoutes = resolve(KnownToken.Express.serviceRoutes);\n const middleware = resolve(KnownToken.Express.middleware);\n const endMiddleware = resolve(KnownToken.Express.endMiddleware);\n const proxyConfig = resolve(KnownToken.Http.Serve.Proxy.config);\n\n const app = express();\n\n if (config.env === 'development' && proxyConfig) {\n const proxyConfigs = Array.isArray(proxyConfig) ? proxyConfig : [proxyConfig];\n\n for (const { target, filter, pathRewrite } of proxyConfigs) {\n // ВАЖНО: так как не можем предоставить web-интерфейс Request бросаем ошибку\n if (typeof filter === 'function') {\n throw new Error('Currently function is not supported for proxy \"filter\"');\n }\n\n const proxyPaths = Array.isArray(filter) ? filter : [filter];\n\n const proxyMiddleware = createProxyMiddleware({\n target,\n changeOrigin: true,\n pathRewrite,\n\n // ВАЖНО: не используем pathFilter тк если в проекте есть webpack-dev-server,\n // он тащит за собой http-proxy-middleware@2 который не поддерживает pathFilter\n // pathFilter: inputPath => proxyPaths.some(proxyPath => inputPath.startsWith(proxyPath)),\n });\n\n app.use((req, res, next) => {\n // ВАЖНО: поскольку не используем pathFilter - фильтруем запросы проверкой\n if (proxyPaths.some(proxyPath => req.path.startsWith(proxyPath))) {\n proxyMiddleware(req, res, next);\n } else {\n next();\n }\n });\n }\n }\n\n // маршруты страниц\n for (const [routePath, routeHandler] of pageRoutes) {\n const path = typeof routePath === 'string' ? routePath : routePath.path;\n const method = typeof routePath === 'string' ? 'get' : routePath.method;\n\n app.use(path, middleware);\n app[method](path, routeHandler);\n app.use(path, endMiddleware);\n }\n\n // служебные маршруты (к ним не применяются промежуточные слои)\n for (const [routePath, routeHandler] of serviceRoutes) {\n const path = typeof routePath === 'string' ? routePath : routePath.path;\n const method = typeof routePath === 'string' ? 'get' : routePath.method;\n\n app[method](path, routeHandler);\n }\n\n // @todo также добавить apiRoutes?\n return app;\n}\n"],"mappings":"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"}
1
+ {"version":3,"file":"main-express-app.js","names":["_tokens","require","_express","_interopRequireDefault","_httpProxyMiddleware","obj","__esModule","default","provideMainExpressApp","resolve","config","KnownToken","Config","base","pageRoutes","Express","serviceRoutes","middleware","endMiddleware","proxyConfig","Http","Serve","Proxy","app","express","env","proxyConfigs","Array","isArray","target","filter","pathRewrite","Error","proxyPaths","proxyMiddleware","createProxyMiddleware","changeOrigin","use","req","res","next","some","proxyPath","path","startsWith","routePath","routeHandler","method"],"sources":["../../../../../src/preset/node/providers/main-express-app.ts"],"sourcesContent":["import type { Resolve } from '../../../di';\nimport { KnownToken } from '../../../tokens';\nimport express from 'express';\nimport { createProxyMiddleware } from 'http-proxy-middleware';\n\n/**\n * Провайдер основного express-приложения.\n * @param resolve Функция для получения зависимости по токену.\n * @return Основное express-приложение.\n */\nexport function provideMainExpressApp(resolve: Resolve): express.Application {\n const config = resolve(KnownToken.Config.base);\n const pageRoutes = resolve(KnownToken.Express.pageRoutes);\n const serviceRoutes = resolve(KnownToken.Express.serviceRoutes);\n const middleware = resolve(KnownToken.Express.middleware);\n const endMiddleware = resolve(KnownToken.Express.endMiddleware);\n const proxyConfig = resolve(KnownToken.Http.Serve.Proxy.config);\n\n const app = express();\n\n if (config.env === 'development' && proxyConfig) {\n const proxyConfigs = Array.isArray(proxyConfig) ? proxyConfig : [proxyConfig];\n\n for (const { target, filter, pathRewrite } of proxyConfigs) {\n // ВАЖНО: так как не можем предоставить web-интерфейс Request бросаем ошибку\n if (typeof filter === 'function') {\n throw new Error('Currently function is not supported for proxy \"filter\"');\n }\n\n const proxyPaths = Array.isArray(filter) ? filter : [filter];\n\n const proxyMiddleware = createProxyMiddleware({\n target,\n changeOrigin: true,\n pathRewrite,\n\n // ВАЖНО: не используем pathFilter тк если в проекте есть webpack-dev-server,\n // он тащит за собой http-proxy-middleware@2 который не поддерживает pathFilter\n // pathFilter: inputPath => proxyPaths.some(proxyPath => inputPath.startsWith(proxyPath)),\n });\n\n app.use((req, res, next) => {\n // ВАЖНО: поскольку не используем pathFilter - фильтруем запросы проверкой\n if (proxyPaths.some(proxyPath => req.path.startsWith(proxyPath))) {\n proxyMiddleware(req, res, next);\n } else {\n next();\n }\n });\n }\n }\n\n // маршруты страниц\n for (const [routePath, routeHandler] of pageRoutes) {\n const path = typeof routePath === 'string' ? routePath : routePath.path;\n const method = typeof routePath === 'string' ? 'get' : routePath.method;\n\n app[method](path, middleware, routeHandler, endMiddleware);\n }\n\n // служебные маршруты (к ним не применяются промежуточные слои)\n for (const [routePath, routeHandler] of serviceRoutes) {\n const path = typeof routePath === 'string' ? routePath : routePath.path;\n const method = typeof routePath === 'string' ? 'get' : routePath.method;\n\n app[method](path, routeHandler);\n }\n\n // @todo также добавить apiRoutes?\n return app;\n}\n"],"mappings":"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"}
@@ -17,17 +17,20 @@ function provideLogger(resolve) {
17
17
  const source = resolve(_tokens.KnownToken.Config.source);
18
18
  const config = resolve(_tokens.KnownToken.Config.base);
19
19
  const client = new _browser.BrowserClient({
20
- transport: _browser.makeFetchTransport,
21
- stackParser: _browser.defaultStackParser,
22
20
  dsn: source.require('PUBLIC_SENTRY_DSN'),
23
21
  release: source.require('SENTRY_RELEASE'),
24
22
  environment: source.require('PUBLIC_SENTRY_ENVIRONMENT'),
25
- integrations: [..._browser.defaultIntegrations]
23
+ tracesSampleRate: Number(source.get('SENTRY_TRACES_SAMPLE_RATE', 0)),
24
+ profilesSampleRate: Number(source.get('SENTRY_TRACES_SAMPLE_RATE', 0)),
25
+ transport: _browser.makeFetchTransport,
26
+ stackParser: _browser.defaultStackParser,
27
+ integrations: [...(0, _browser.getDefaultIntegrations)({})]
26
28
  });
27
- const hub = new _browser.Hub(client);
28
- hub.setTag('url', window.location.href);
29
+ const scope = new _browser.Scope();
30
+ scope.setTag('url', window.location.href);
31
+ scope.setClient(client);
29
32
  const logger = (0, _log.createLogger)();
30
- logger.subscribe((0, _sentry.createSentryHandler)(hub));
33
+ logger.subscribe((0, _sentry.createSentryHandler)(scope));
31
34
  if (config.env === 'development') {
32
35
  logger.subscribe(event => {
33
36
  switch (event.type) {
@@ -1 +1 @@
1
- {"version":3,"file":"logger.js","names":["_browser","require","_log","_tokens","_sentry","provideLogger","resolve","source","KnownToken","Config","config","base","client","BrowserClient","transport","makeFetchTransport","stackParser","defaultStackParser","dsn","release","environment","integrations","defaultIntegrations","hub","Hub","setTag","window","location","href","logger","createLogger","subscribe","createSentryHandler","env","event","type","console","debug","data","error"],"sources":["../../../../../src/preset/web/providers/logger.ts"],"sourcesContent":["import {\n BrowserClient,\n Hub,\n defaultIntegrations,\n defaultStackParser,\n makeFetchTransport,\n} from '@sentry/browser';\nimport { Resolve } from '../../../di';\nimport { Logger, createLogger } from '../../../log';\nimport { KnownToken } from '../../../tokens';\nimport { createSentryHandler } from '../../../log/handler/sentry';\n\n/**\n * Провайдер Logger'а.\n * @param resolve Функция для получения зависимости по токену.\n * @return Logger.\n */\nexport function provideLogger(resolve: Resolve): Logger {\n const source = resolve(KnownToken.Config.source);\n const config = resolve(KnownToken.Config.base);\n\n const client = new BrowserClient({\n transport: makeFetchTransport,\n stackParser: defaultStackParser,\n dsn: source.require('PUBLIC_SENTRY_DSN'),\n release: source.require('SENTRY_RELEASE'),\n environment: source.require('PUBLIC_SENTRY_ENVIRONMENT'),\n integrations: [...defaultIntegrations],\n });\n\n const hub = new Hub(client);\n\n hub.setTag('url', window.location.href);\n\n const logger = createLogger();\n\n logger.subscribe(createSentryHandler(hub));\n\n if (config.env === 'development') {\n logger.subscribe(event => {\n switch (event.type) {\n case 'debug':\n // eslint-disable-next-line no-console\n console.debug(event.data);\n break;\n case 'error':\n // eslint-disable-next-line no-console\n console.error(event.data);\n break;\n }\n });\n }\n\n return logger;\n}\n"],"mappings":";;;;;;AAAA,IAAAA,QAAA,GAAAC,OAAA;AAQA,IAAAC,IAAA,GAAAD,OAAA;AACA,IAAAE,OAAA,GAAAF,OAAA;AACA,IAAAG,OAAA,GAAAH,OAAA;AAEA;AACA;AACA;AACA;AACA;AACO,SAASI,aAAaA,CAACC,OAAgB,EAAU;EACtD,MAAMC,MAAM,GAAGD,OAAO,CAACE,kBAAU,CAACC,MAAM,CAACF,MAAM,CAAC;EAChD,MAAMG,MAAM,GAAGJ,OAAO,CAACE,kBAAU,CAACC,MAAM,CAACE,IAAI,CAAC;EAE9C,MAAMC,MAAM,GAAG,IAAIC,sBAAa,CAAC;IAC/BC,SAAS,EAAEC,2BAAkB;IAC7BC,WAAW,EAAEC,2BAAkB;IAC/BC,GAAG,EAAEX,MAAM,CAACN,OAAO,CAAC,mBAAmB,CAAC;IACxCkB,OAAO,EAAEZ,MAAM,CAACN,OAAO,CAAC,gBAAgB,CAAC;IACzCmB,WAAW,EAAEb,MAAM,CAACN,OAAO,CAAC,2BAA2B,CAAC;IACxDoB,YAAY,EAAE,CAAC,GAAGC,4BAAmB;EACvC,CAAC,CAAC;EAEF,MAAMC,GAAG,GAAG,IAAIC,YAAG,CAACZ,MAAM,CAAC;EAE3BW,GAAG,CAACE,MAAM,CAAC,KAAK,EAAEC,MAAM,CAACC,QAAQ,CAACC,IAAI,CAAC;EAEvC,MAAMC,MAAM,GAAG,IAAAC,iBAAY,EAAC,CAAC;EAE7BD,MAAM,CAACE,SAAS,CAAC,IAAAC,2BAAmB,EAACT,GAAG,CAAC,CAAC;EAE1C,IAAIb,MAAM,CAACuB,GAAG,KAAK,aAAa,EAAE;IAChCJ,MAAM,CAACE,SAAS,CAACG,KAAK,IAAI;MACxB,QAAQA,KAAK,CAACC,IAAI;QAChB,KAAK,OAAO;UACV;UACAC,OAAO,CAACC,KAAK,CAACH,KAAK,CAACI,IAAI,CAAC;UACzB;QACF,KAAK,OAAO;UACV;UACAF,OAAO,CAACG,KAAK,CAACL,KAAK,CAACI,IAAI,CAAC;UACzB;MACJ;IACF,CAAC,CAAC;EACJ;EAEA,OAAOT,MAAM;AACf"}
1
+ {"version":3,"file":"logger.js","names":["_browser","require","_log","_tokens","_sentry","provideLogger","resolve","source","KnownToken","Config","config","base","client","BrowserClient","dsn","release","environment","tracesSampleRate","Number","get","profilesSampleRate","transport","makeFetchTransport","stackParser","defaultStackParser","integrations","getDefaultIntegrations","scope","Scope","setTag","window","location","href","setClient","logger","createLogger","subscribe","createSentryHandler","env","event","type","console","debug","data","error"],"sources":["../../../../../src/preset/web/providers/logger.ts"],"sourcesContent":["import {\n Scope,\n BrowserClient,\n getDefaultIntegrations,\n defaultStackParser,\n makeFetchTransport,\n} from '@sentry/browser';\nimport { Resolve } from '../../../di';\nimport { Logger, createLogger } from '../../../log';\nimport { KnownToken } from '../../../tokens';\nimport { createSentryHandler } from '../../../log/handler/sentry';\n\n/**\n * Провайдер Logger'а.\n * @param resolve Функция для получения зависимости по токену.\n * @return Logger.\n */\nexport function provideLogger(resolve: Resolve): Logger {\n const source = resolve(KnownToken.Config.source);\n const config = resolve(KnownToken.Config.base);\n\n const client = new BrowserClient({\n dsn: source.require('PUBLIC_SENTRY_DSN'),\n release: source.require('SENTRY_RELEASE'),\n environment: source.require('PUBLIC_SENTRY_ENVIRONMENT'),\n tracesSampleRate: Number(source.get('SENTRY_TRACES_SAMPLE_RATE', 0)),\n profilesSampleRate: Number(source.get('SENTRY_TRACES_SAMPLE_RATE', 0)),\n transport: makeFetchTransport,\n stackParser: defaultStackParser,\n integrations: [...getDefaultIntegrations({})],\n });\n\n const scope = new Scope();\n\n scope.setTag('url', window.location.href);\n scope.setClient(client);\n\n const logger = createLogger();\n\n logger.subscribe(createSentryHandler(scope));\n\n if (config.env === 'development') {\n logger.subscribe(event => {\n switch (event.type) {\n case 'debug':\n // eslint-disable-next-line no-console\n console.debug(event.data);\n break;\n case 'error':\n // eslint-disable-next-line no-console\n console.error(event.data);\n break;\n }\n });\n }\n\n return logger;\n}\n"],"mappings":";;;;;;AAAA,IAAAA,QAAA,GAAAC,OAAA;AAQA,IAAAC,IAAA,GAAAD,OAAA;AACA,IAAAE,OAAA,GAAAF,OAAA;AACA,IAAAG,OAAA,GAAAH,OAAA;AAEA;AACA;AACA;AACA;AACA;AACO,SAASI,aAAaA,CAACC,OAAgB,EAAU;EACtD,MAAMC,MAAM,GAAGD,OAAO,CAACE,kBAAU,CAACC,MAAM,CAACF,MAAM,CAAC;EAChD,MAAMG,MAAM,GAAGJ,OAAO,CAACE,kBAAU,CAACC,MAAM,CAACE,IAAI,CAAC;EAE9C,MAAMC,MAAM,GAAG,IAAIC,sBAAa,CAAC;IAC/BC,GAAG,EAAEP,MAAM,CAACN,OAAO,CAAC,mBAAmB,CAAC;IACxCc,OAAO,EAAER,MAAM,CAACN,OAAO,CAAC,gBAAgB,CAAC;IACzCe,WAAW,EAAET,MAAM,CAACN,OAAO,CAAC,2BAA2B,CAAC;IACxDgB,gBAAgB,EAAEC,MAAM,CAACX,MAAM,CAACY,GAAG,CAAC,2BAA2B,EAAE,CAAC,CAAC,CAAC;IACpEC,kBAAkB,EAAEF,MAAM,CAACX,MAAM,CAACY,GAAG,CAAC,2BAA2B,EAAE,CAAC,CAAC,CAAC;IACtEE,SAAS,EAAEC,2BAAkB;IAC7BC,WAAW,EAAEC,2BAAkB;IAC/BC,YAAY,EAAE,CAAC,GAAG,IAAAC,+BAAsB,EAAC,CAAC,CAAC,CAAC;EAC9C,CAAC,CAAC;EAEF,MAAMC,KAAK,GAAG,IAAIC,cAAK,CAAC,CAAC;EAEzBD,KAAK,CAACE,MAAM,CAAC,KAAK,EAAEC,MAAM,CAACC,QAAQ,CAACC,IAAI,CAAC;EACzCL,KAAK,CAACM,SAAS,CAACrB,MAAM,CAAC;EAEvB,MAAMsB,MAAM,GAAG,IAAAC,iBAAY,EAAC,CAAC;EAE7BD,MAAM,CAACE,SAAS,CAAC,IAAAC,2BAAmB,EAACV,KAAK,CAAC,CAAC;EAE5C,IAAIjB,MAAM,CAAC4B,GAAG,KAAK,aAAa,EAAE;IAChCJ,MAAM,CAACE,SAAS,CAACG,KAAK,IAAI;MACxB,QAAQA,KAAK,CAACC,IAAI;QAChB,KAAK,OAAO;UACV;UACAC,OAAO,CAACC,KAAK,CAACH,KAAK,CAACI,IAAI,CAAC;UACzB;QACF,KAAK,OAAO;UACV;UACAF,OAAO,CAACG,KAAK,CAACL,KAAK,CAACI,IAAI,CAAC;UACzB;MACJ;IACF,CAAC,CAAC;EACJ;EAEA,OAAOT,MAAM;AACf"}
@@ -51,11 +51,21 @@ export const FetchUtil = {
51
51
  eitherResponse({
52
52
  parseBody = response => response.json()
53
53
  } = {}) {
54
- return [async response => {
54
+ /** @inheritdoc */
55
+ const parse = async response => {
56
+ try {
57
+ return await parseBody(response);
58
+ } catch {
59
+ return null;
60
+ }
61
+ };
62
+ return [
63
+ // then
64
+ async response => {
55
65
  if (!response.ok) {
56
66
  return {
57
67
  ok: false,
58
- data: await parseBody(response).catch(() => null),
68
+ data: await parse(response),
59
69
  error: new Error(`Request failed with status code ${response.status}`),
60
70
  status: response.status,
61
71
  statusText: response.statusText,
@@ -64,13 +74,15 @@ export const FetchUtil = {
64
74
  }
65
75
  return {
66
76
  ok: true,
67
- data: await parseBody(response).catch(() => null),
77
+ data: await parse(response),
68
78
  error: null,
69
79
  status: response.status,
70
80
  statusText: response.statusText,
71
81
  headers: response.headers
72
82
  };
73
- }, async error => ({
83
+ },
84
+ // catch
85
+ async error => ({
74
86
  ok: false,
75
87
  error
76
88
  })];
@@ -1 +1 @@
1
- {"version":3,"file":"utils.js","names":["FetchUtil","setParams","url","params","paramName","paramValue","Object","entries","searchParams","delete","undefined","set","String","withParams","resultUrl","URL","withoutParams","search","eitherResponse","parseBody","response","json","ok","data","catch","error","Error","status","statusText","headers"],"sources":["../../../src/http/utils.ts"],"sourcesContent":["import type { URLSearchParamsInit, ResponseDone, ResponseFail } from './types';\n\n/**\n * Утилиты для работы с URL, URLSearchParams, Headers, Request, Response.\n */\nexport const FetchUtil = {\n /**\n * Получив параметры применит их к переданному URL.\n * @param url URL.\n * @param params Параметры.\n */\n setParams(url: URL, params: URLSearchParamsInit): void {\n for (const [paramName, paramValue] of Object.entries(params)) {\n if (paramValue === null) {\n url.searchParams.delete(paramName);\n continue;\n }\n\n if (paramValue !== undefined) {\n url.searchParams.set(paramName, String(paramValue));\n continue;\n }\n }\n },\n\n // @todo resetPrams?\n\n /**\n * Получив URL и параметры вернет новый URL с примененными параметрами.\n * @param url URL.\n * @param params Параметры.\n * @return URL.\n */\n withParams(url: string | URL, params: URLSearchParamsInit): URL {\n const resultUrl = new URL(url);\n\n FetchUtil.setParams(resultUrl, params);\n\n return resultUrl;\n },\n\n /**\n * Получив URL вернет его копию но без параметров.\n * @param url URL.\n * @return URL.\n */\n withoutParams(url: string | URL): URL {\n const resultUrl = new URL(url);\n\n resultUrl.search = '';\n\n return resultUrl;\n },\n\n /**\n * Возвращает кортеж обработчиков для Promise из fetch.\n * Полученный Promise никогда не уйдет в состояние rejected.\n * @param options Опции.\n * @return Кортеж.\n */\n eitherResponse<T = unknown>({\n parseBody = response => response.json(),\n }: {\n /** Парсер body. */\n parseBody?: (response: Response) => Promise<T>;\n } = {}) {\n return [\n async (response: Response): Promise<ResponseDone<T> | ResponseFail<T>> => {\n if (!response.ok) {\n return {\n ok: false,\n data: (await parseBody(response).catch(() => null)) as T,\n error: new Error(`Request failed with status code ${response.status}`),\n status: response.status,\n statusText: response.statusText,\n headers: response.headers,\n };\n }\n\n return {\n ok: true,\n data: (await parseBody(response).catch(() => null)) as T,\n error: null,\n status: response.status,\n statusText: response.statusText,\n headers: response.headers,\n };\n },\n async (error: unknown): Promise<ResponseFail<T>> => ({\n ok: false,\n error,\n }),\n ] as const;\n },\n} as const;\n"],"mappings":"AAEA;AACA;AACA;AACA,OAAO,MAAMA,SAAS,GAAG;EACvB;AACF;AACA;AACA;AACA;EACEC,SAASA,CAACC,GAAQ,EAAEC,MAA2B,EAAQ;IACrD,KAAK,MAAM,CAACC,SAAS,EAAEC,UAAU,CAAC,IAAIC,MAAM,CAACC,OAAO,CAACJ,MAAM,CAAC,EAAE;MAC5D,IAAIE,UAAU,KAAK,IAAI,EAAE;QACvBH,GAAG,CAACM,YAAY,CAACC,MAAM,CAACL,SAAS,CAAC;QAClC;MACF;MAEA,IAAIC,UAAU,KAAKK,SAAS,EAAE;QAC5BR,GAAG,CAACM,YAAY,CAACG,GAAG,CAACP,SAAS,EAAEQ,MAAM,CAACP,UAAU,CAAC,CAAC;QACnD;MACF;IACF;EACF,CAAC;EAED;;EAEA;AACF;AACA;AACA;AACA;AACA;EACEQ,UAAUA,CAACX,GAAiB,EAAEC,MAA2B,EAAO;IAC9D,MAAMW,SAAS,GAAG,IAAIC,GAAG,CAACb,GAAG,CAAC;IAE9BF,SAAS,CAACC,SAAS,CAACa,SAAS,EAAEX,MAAM,CAAC;IAEtC,OAAOW,SAAS;EAClB,CAAC;EAED;AACF;AACA;AACA;AACA;EACEE,aAAaA,CAACd,GAAiB,EAAO;IACpC,MAAMY,SAAS,GAAG,IAAIC,GAAG,CAACb,GAAG,CAAC;IAE9BY,SAAS,CAACG,MAAM,GAAG,EAAE;IAErB,OAAOH,SAAS;EAClB,CAAC;EAED;AACF;AACA;AACA;AACA;AACA;EACEI,cAAcA,CAAc;IAC1BC,SAAS,GAAGC,QAAQ,IAAIA,QAAQ,CAACC,IAAI,CAAC;EAIxC,CAAC,GAAG,CAAC,CAAC,EAAE;IACN,OAAO,CACL,MAAOD,QAAkB,IAAiD;MACxE,IAAI,CAACA,QAAQ,CAACE,EAAE,EAAE;QAChB,OAAO;UACLA,EAAE,EAAE,KAAK;UACTC,IAAI,EAAG,MAAMJ,SAAS,CAACC,QAAQ,CAAC,CAACI,KAAK,CAAC,MAAM,IAAI,CAAO;UACxDC,KAAK,EAAE,IAAIC,KAAK,CAAE,mCAAkCN,QAAQ,CAACO,MAAO,EAAC,CAAC;UACtEA,MAAM,EAAEP,QAAQ,CAACO,MAAM;UACvBC,UAAU,EAAER,QAAQ,CAACQ,UAAU;UAC/BC,OAAO,EAAET,QAAQ,CAACS;QACpB,CAAC;MACH;MAEA,OAAO;QACLP,EAAE,EAAE,IAAI;QACRC,IAAI,EAAG,MAAMJ,SAAS,CAACC,QAAQ,CAAC,CAACI,KAAK,CAAC,MAAM,IAAI,CAAO;QACxDC,KAAK,EAAE,IAAI;QACXE,MAAM,EAAEP,QAAQ,CAACO,MAAM;QACvBC,UAAU,EAAER,QAAQ,CAACQ,UAAU;QAC/BC,OAAO,EAAET,QAAQ,CAACS;MACpB,CAAC;IACH,CAAC,EACD,MAAOJ,KAAc,KAAgC;MACnDH,EAAE,EAAE,KAAK;MACTG;IACF,CAAC,CAAC,CACH;EACH;AACF,CAAU"}
1
+ {"version":3,"file":"utils.js","names":["FetchUtil","setParams","url","params","paramName","paramValue","Object","entries","searchParams","delete","undefined","set","String","withParams","resultUrl","URL","withoutParams","search","eitherResponse","parseBody","response","json","parse","ok","data","error","Error","status","statusText","headers"],"sources":["../../../src/http/utils.ts"],"sourcesContent":["import type { URLSearchParamsInit, ResponseDone, ResponseFail } from './types';\n\n/**\n * Утилиты для работы с URL, URLSearchParams, Headers, Request, Response.\n */\nexport const FetchUtil = {\n /**\n * Получив параметры применит их к переданному URL.\n * @param url URL.\n * @param params Параметры.\n */\n setParams(url: URL, params: URLSearchParamsInit): void {\n for (const [paramName, paramValue] of Object.entries(params)) {\n if (paramValue === null) {\n url.searchParams.delete(paramName);\n continue;\n }\n\n if (paramValue !== undefined) {\n url.searchParams.set(paramName, String(paramValue));\n continue;\n }\n }\n },\n\n // @todo resetPrams?\n\n /**\n * Получив URL и параметры вернет новый URL с примененными параметрами.\n * @param url URL.\n * @param params Параметры.\n * @return URL.\n */\n withParams(url: string | URL, params: URLSearchParamsInit): URL {\n const resultUrl = new URL(url);\n\n FetchUtil.setParams(resultUrl, params);\n\n return resultUrl;\n },\n\n /**\n * Получив URL вернет его копию но без параметров.\n * @param url URL.\n * @return URL.\n */\n withoutParams(url: string | URL): URL {\n const resultUrl = new URL(url);\n\n resultUrl.search = '';\n\n return resultUrl;\n },\n\n /**\n * Возвращает кортеж обработчиков для Promise из fetch.\n * Полученный Promise никогда не уйдет в состояние rejected.\n * @param options Опции.\n * @return Кортеж.\n */\n eitherResponse<T = unknown>({\n parseBody = response => response.json(),\n }: {\n /** Парсер body. */\n parseBody?: (response: Response) => Promise<T>;\n } = {}) {\n /** @inheritdoc */\n const parse = async (response: Response): Promise<T | null> => {\n try {\n return await parseBody(response);\n } catch {\n return null;\n }\n };\n\n return [\n // then\n async (response: Response): Promise<ResponseDone<T> | ResponseFail<T>> => {\n if (!response.ok) {\n return {\n ok: false,\n data: (await parse(response)) as T,\n error: new Error(`Request failed with status code ${response.status}`),\n status: response.status,\n statusText: response.statusText,\n headers: response.headers,\n };\n }\n\n return {\n ok: true,\n data: (await parse(response)) as T,\n error: null,\n status: response.status,\n statusText: response.statusText,\n headers: response.headers,\n };\n },\n\n // catch\n async (error: unknown): Promise<ResponseFail<T>> => ({\n ok: false,\n error,\n }),\n ] as const;\n },\n} as const;\n"],"mappings":"AAEA;AACA;AACA;AACA,OAAO,MAAMA,SAAS,GAAG;EACvB;AACF;AACA;AACA;AACA;EACEC,SAASA,CAACC,GAAQ,EAAEC,MAA2B,EAAQ;IACrD,KAAK,MAAM,CAACC,SAAS,EAAEC,UAAU,CAAC,IAAIC,MAAM,CAACC,OAAO,CAACJ,MAAM,CAAC,EAAE;MAC5D,IAAIE,UAAU,KAAK,IAAI,EAAE;QACvBH,GAAG,CAACM,YAAY,CAACC,MAAM,CAACL,SAAS,CAAC;QAClC;MACF;MAEA,IAAIC,UAAU,KAAKK,SAAS,EAAE;QAC5BR,GAAG,CAACM,YAAY,CAACG,GAAG,CAACP,SAAS,EAAEQ,MAAM,CAACP,UAAU,CAAC,CAAC;QACnD;MACF;IACF;EACF,CAAC;EAED;;EAEA;AACF;AACA;AACA;AACA;AACA;EACEQ,UAAUA,CAACX,GAAiB,EAAEC,MAA2B,EAAO;IAC9D,MAAMW,SAAS,GAAG,IAAIC,GAAG,CAACb,GAAG,CAAC;IAE9BF,SAAS,CAACC,SAAS,CAACa,SAAS,EAAEX,MAAM,CAAC;IAEtC,OAAOW,SAAS;EAClB,CAAC;EAED;AACF;AACA;AACA;AACA;EACEE,aAAaA,CAACd,GAAiB,EAAO;IACpC,MAAMY,SAAS,GAAG,IAAIC,GAAG,CAACb,GAAG,CAAC;IAE9BY,SAAS,CAACG,MAAM,GAAG,EAAE;IAErB,OAAOH,SAAS;EAClB,CAAC;EAED;AACF;AACA;AACA;AACA;AACA;EACEI,cAAcA,CAAc;IAC1BC,SAAS,GAAGC,QAAQ,IAAIA,QAAQ,CAACC,IAAI,CAAC;EAIxC,CAAC,GAAG,CAAC,CAAC,EAAE;IACN;IACA,MAAMC,KAAK,GAAG,MAAOF,QAAkB,IAAwB;MAC7D,IAAI;QACF,OAAO,MAAMD,SAAS,CAACC,QAAQ,CAAC;MAClC,CAAC,CAAC,MAAM;QACN,OAAO,IAAI;MACb;IACF,CAAC;IAED,OAAO;IACL;IACA,MAAOA,QAAkB,IAAiD;MACxE,IAAI,CAACA,QAAQ,CAACG,EAAE,EAAE;QAChB,OAAO;UACLA,EAAE,EAAE,KAAK;UACTC,IAAI,EAAG,MAAMF,KAAK,CAACF,QAAQ,CAAO;UAClCK,KAAK,EAAE,IAAIC,KAAK,CAAE,mCAAkCN,QAAQ,CAACO,MAAO,EAAC,CAAC;UACtEA,MAAM,EAAEP,QAAQ,CAACO,MAAM;UACvBC,UAAU,EAAER,QAAQ,CAACQ,UAAU;UAC/BC,OAAO,EAAET,QAAQ,CAACS;QACpB,CAAC;MACH;MAEA,OAAO;QACLN,EAAE,EAAE,IAAI;QACRC,IAAI,EAAG,MAAMF,KAAK,CAACF,QAAQ,CAAO;QAClCK,KAAK,EAAE,IAAI;QACXE,MAAM,EAAEP,QAAQ,CAACO,MAAM;QACvBC,UAAU,EAAER,QAAQ,CAACQ,UAAU;QAC/BC,OAAO,EAAET,QAAQ,CAACS;MACpB,CAAC;IACH,CAAC;IAED;IACA,MAAOJ,KAAc,KAAgC;MACnDF,EAAE,EAAE,KAAK;MACTE;IACF,CAAC,CAAC,CACH;EACH;AACF,CAAU"}