@sentry/effect 10.73.0 → 10.75.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/README.md CHANGED
@@ -72,6 +72,34 @@ const HttpLive = HttpRouter.serve(Routes).pipe(
72
72
  NodeRuntime.runMain(Layer.launch(HttpLive));
73
73
  ```
74
74
 
75
+ ### Error reporting
76
+
77
+ On Effect v4, `Sentry.effectLayer` registers a Sentry `ErrorReporter`. Failures
78
+ that pass through `Effect.withErrorReporting`, `ErrorReporter.report` or the
79
+ built-in HTTP and RPC reporting boundaries are captured automatically. The
80
+ `ErrorReporter.ignore`, `ErrorReporter.severity` and `ErrorReporter.attributes`
81
+ annotations are respected: ignored errors are skipped, the severity becomes the
82
+ event level and the attributes are attached as extra data.
83
+
84
+ ```typescript
85
+ import { Data, Effect, ErrorReporter } from 'effect';
86
+
87
+ class RateLimitError extends Data.TaggedError('RateLimitError')<{ readonly retryAfter: number }> {
88
+ readonly [ErrorReporter.severity] = 'Warn' as const;
89
+ readonly [ErrorReporter.attributes] = { retryAfter: this.retryAfter };
90
+ }
91
+
92
+ const program = Effect.fail(new RateLimitError({ retryAfter: 60 })).pipe(Effect.withErrorReporting);
93
+ ```
94
+
95
+ Reporters registered with `ErrorReporter.layer` replace the current set, so add
96
+ your own reporters with `mergeWithExisting: true` or provide them below the
97
+ Sentry layer to keep the Sentry reporter:
98
+
99
+ ```typescript
100
+ const SentryLive = Sentry.effectLayer({ dsn: '__DSN__' }).pipe(Layer.provide(ErrorReporter.layer([consoleReporter])));
101
+ ```
102
+
75
103
  ## Links
76
104
 
77
105
  - [Official SDK Docs](https://docs.sentry.io/platforms/javascript/guides/effect/)
@@ -1,13 +1,17 @@
1
1
  Object.defineProperty(exports, Symbol.toStringTag, { value: 'Module' });
2
2
 
3
3
  const Layer = require('effect/Layer');
4
+ const errorReporter = require('../errorReporter.js');
4
5
  const sdk = require('./sdk.js');
5
6
 
6
7
  function effectLayer(options) {
7
- return Layer.suspend(() => {
8
- sdk.init(options);
9
- return Layer.empty;
10
- });
8
+ return Layer.merge(
9
+ Layer.suspend(() => {
10
+ sdk.init(options);
11
+ return Layer.empty;
12
+ }),
13
+ errorReporter.makeSentryErrorReporterLayer()
14
+ );
11
15
  }
12
16
 
13
17
  exports.init = sdk.init;
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sources":["../../../src/client/index.ts"],"sourcesContent":["import type { BrowserOptions } from '@sentry/browser';\nimport type * as EffectLayer from 'effect/Layer';\nimport { empty as emptyLayer, suspend as suspendLayer } from 'effect/Layer';\nimport { init } from './sdk';\n\nexport { init } from './sdk';\n\n/**\n * Options for the Sentry Effect client layer.\n */\nexport type EffectClientLayerOptions = BrowserOptions;\n\n/**\n * Creates an Effect Layer that initializes Sentry for browser clients.\n *\n * To enable Effect tracing, logs, or metrics, compose with the respective layers:\n * - `Layer.setTracer(Sentry.SentryEffectTracer)` for tracing\n * - `Logger.replace(Logger.defaultLogger, Sentry.SentryEffectLogger)` for logs\n * - `Sentry.SentryEffectMetricsLayer` for metrics\n *\n * @example\n * ```typescript\n * import * as Sentry from '@sentry/effect/client';\n * import { Layer, Logger, LogLevel } from 'effect';\n *\n * const SentryLive = Layer.mergeAll(\n * Sentry.effectLayer({\n * dsn: '__DSN__',\n * integrations: [Sentry.browserTracingIntegration()],\n * tracesSampleRate: 1.0,\n * }),\n * Layer.setTracer(Sentry.SentryEffectTracer),\n * Logger.replace(Logger.defaultLogger, Sentry.SentryEffectLogger),\n * );\n * ```\n */\nexport function effectLayer(options: EffectClientLayerOptions): EffectLayer.Layer<never, never, never> {\n return suspendLayer(() => {\n init(options);\n\n return emptyLayer;\n });\n}\n"],"names":["suspendLayer","init","emptyLayer"],"mappings":";;;;;AAoCO,SAAS,YAAY,OAAA,EAA2E;AACrG,EAAA,OAAOA,cAAa,MAAM;AACxB,IAAAC,QAAA,CAAK,OAAO,CAAA;AAEZ,IAAA,OAAOC,WAAA;AAAA,EACT,CAAC,CAAA;AACH;;;;;"}
1
+ {"version":3,"file":"index.js","sources":["../../../src/client/index.ts"],"sourcesContent":["import type { BrowserOptions } from '@sentry/browser';\nimport type * as EffectLayer from 'effect/Layer';\nimport { empty as emptyLayer, merge as mergeLayer, suspend as suspendLayer } from 'effect/Layer';\nimport { makeSentryErrorReporterLayer } from '../errorReporter';\nimport { init } from './sdk';\n\nexport { init } from './sdk';\n\n/**\n * Options for the Sentry Effect client layer.\n */\nexport type EffectClientLayerOptions = BrowserOptions;\n\n/**\n * Creates an Effect Layer that initializes Sentry for browser clients.\n *\n * On Effect v4 the layer also registers a Sentry `ErrorReporter`, so failures passing through\n * `Effect.withErrorReporting`, `ErrorReporter.report` or the built-in HTTP and RPC boundaries are captured.\n *\n * To enable Effect tracing, logs, or metrics, compose with the respective layers:\n * - `Layer.setTracer(Sentry.SentryEffectTracer)` for tracing\n * - `Logger.replace(Logger.defaultLogger, Sentry.SentryEffectLogger)` for logs\n * - `Sentry.SentryEffectMetricsLayer` for metrics\n *\n * @example\n * ```typescript\n * import * as Sentry from '@sentry/effect/client';\n * import { Layer, Logger, LogLevel } from 'effect';\n *\n * const SentryLive = Layer.mergeAll(\n * Sentry.effectLayer({\n * dsn: '__DSN__',\n * integrations: [Sentry.browserTracingIntegration()],\n * tracesSampleRate: 1.0,\n * }),\n * Layer.setTracer(Sentry.SentryEffectTracer),\n * Logger.replace(Logger.defaultLogger, Sentry.SentryEffectLogger),\n * );\n * ```\n */\nexport function effectLayer(options: EffectClientLayerOptions): EffectLayer.Layer<never, never, never> {\n return mergeLayer(\n suspendLayer(() => {\n init(options);\n\n return emptyLayer;\n }),\n makeSentryErrorReporterLayer(),\n );\n}\n"],"names":["mergeLayer","suspendLayer","init","emptyLayer","makeSentryErrorReporterLayer"],"mappings":";;;;;;AAwCO,SAAS,YAAY,OAAA,EAA2E;AACrG,EAAA,OAAOA,WAAA;AAAA,IACLC,cAAa,MAAM;AACjB,MAAAC,QAAA,CAAK,OAAO,CAAA;AAEZ,MAAA,OAAOC,WAAA;AAAA,IACT,CAAC,CAAA;AAAA,IACDC,0CAAA;AAA6B,GAC/B;AACF;;;;;"}
@@ -0,0 +1,65 @@
1
+ Object.defineProperty(exports, Symbol.toStringTag, { value: 'Module' });
2
+
3
+ const core = require('@sentry/core');
4
+ const Effect = require('effect');
5
+ const Layer = require('effect/Layer');
6
+
7
+ const effectExports = Effect;
8
+ const ErrorReporter = effectExports.ErrorReporter;
9
+ const SEVERITY_TO_LEVEL = {
10
+ Fatal: "fatal",
11
+ Error: "error",
12
+ Warn: "warning",
13
+ Info: "info",
14
+ Debug: "debug",
15
+ Trace: "debug"
16
+ };
17
+ function getLevel(errorReporter, error) {
18
+ if (core.isObjectLike(error) && errorReporter.severity in error) {
19
+ return SEVERITY_TO_LEVEL[errorReporter.getSeverity(error)];
20
+ }
21
+ return "error";
22
+ }
23
+ function makeSentryErrorReporter(errorReporter) {
24
+ const reported = /* @__PURE__ */ new WeakSet();
25
+ return {
26
+ [errorReporter.TypeId]: errorReporter.TypeId,
27
+ report({ cause }) {
28
+ if (reported.has(cause)) {
29
+ return;
30
+ }
31
+ reported.add(cause);
32
+ for (const reason of cause.reasons) {
33
+ if (reason._tag === "Interrupt") {
34
+ continue;
35
+ }
36
+ const error = reason._tag === "Fail" ? reason.error : reason.defect;
37
+ if (core.isObjectLike(error)) {
38
+ if (reported.has(error)) {
39
+ continue;
40
+ }
41
+ reported.add(error);
42
+ }
43
+ if (errorReporter.isIgnored(error)) {
44
+ continue;
45
+ }
46
+ core.captureException(error, {
47
+ mechanism: { type: "auto.function.effect.error_reporter", handled: false },
48
+ captureContext: {
49
+ level: getLevel(errorReporter, error),
50
+ extra: core.isObjectLike(error) ? { ...errorReporter.getAttributes(error) } : void 0
51
+ }
52
+ });
53
+ }
54
+ }
55
+ };
56
+ }
57
+ function makeSentryErrorReporterLayer() {
58
+ if (!ErrorReporter) {
59
+ return Layer.empty;
60
+ }
61
+ return ErrorReporter.layer([makeSentryErrorReporter(ErrorReporter)], { mergeWithExisting: true });
62
+ }
63
+
64
+ exports.makeSentryErrorReporterLayer = makeSentryErrorReporterLayer;
65
+ //# sourceMappingURL=errorReporter.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"errorReporter.js","sources":["../../src/errorReporter.ts"],"sourcesContent":["import type { SeverityLevel } from '@sentry/core';\nimport { captureException, isObjectLike } from '@sentry/core';\nimport * as Effect from 'effect';\nimport type * as Cause from 'effect/Cause';\nimport type * as EffectErrorReporter from 'effect/ErrorReporter';\nimport type * as EffectLayer from 'effect/Layer';\nimport { empty as emptyLayer } from 'effect/Layer';\nimport type * as LogLevel from 'effect/LogLevel';\n\n// `effect/ErrorReporter` only exists in Effect v4, so it is read off the main entry instead of being imported\n// as a subpath. On Effect v3 the lookup yields `undefined` and no reporter is registered. The property is read\n// through a separate binding because bundlers fail the build on `Effect.ErrorReporter` when the export is absent.\nconst effectExports = Effect as Record<string, unknown>;\nconst ErrorReporter = effectExports.ErrorReporter as typeof EffectErrorReporter | undefined;\n\nconst SEVERITY_TO_LEVEL: Record<LogLevel.Severity, SeverityLevel> = {\n Fatal: 'fatal',\n Error: 'error',\n Warn: 'warning',\n Info: 'info',\n Debug: 'debug',\n Trace: 'debug',\n};\n\nfunction getLevel(errorReporter: typeof EffectErrorReporter, error: unknown): SeverityLevel {\n // Effect's `getSeverity` falls back to `Info` for unannotated errors, which would file plain failures as\n // informational in Sentry. Only an explicit annotation changes the level.\n if (isObjectLike(error) && errorReporter.severity in error) {\n return SEVERITY_TO_LEVEL[errorReporter.getSeverity(error)];\n }\n return 'error';\n}\n\nfunction makeSentryErrorReporter(errorReporter: typeof EffectErrorReporter): EffectErrorReporter.ErrorReporter {\n const reported = new WeakSet<object>();\n\n return {\n [errorReporter.TypeId]: errorReporter.TypeId,\n report({ cause }: { readonly cause: Cause.Cause<unknown> }): void {\n if (reported.has(cause)) {\n return;\n }\n reported.add(cause);\n\n for (const reason of cause.reasons) {\n if (reason._tag === 'Interrupt') {\n continue;\n }\n\n // The raw error is captured rather than Effect's pretty-printed copy so Sentry sees the original stack,\n // `cause` chain and error class.\n const error = reason._tag === 'Fail' ? reason.error : reason.defect;\n\n if (isObjectLike(error)) {\n if (reported.has(error)) {\n continue;\n }\n reported.add(error);\n }\n\n if (errorReporter.isIgnored(error)) {\n continue;\n }\n\n captureException(error, {\n mechanism: { type: 'auto.function.effect.error_reporter', handled: false },\n captureContext: {\n level: getLevel(errorReporter, error),\n extra: isObjectLike(error) ? { ...errorReporter.getAttributes(error) } : undefined,\n },\n });\n }\n },\n };\n}\n\n/**\n * Registers a Sentry `ErrorReporter` for `Effect.withErrorReporting`, `ErrorReporter.report` and the\n * built-in HTTP and RPC reporting boundaries. Existing reporters are kept.\n *\n * Effect v3 has no `ErrorReporter` API, so the returned layer is empty there.\n */\nexport function makeSentryErrorReporterLayer(): EffectLayer.Layer<never, never, never> {\n if (!ErrorReporter) {\n return emptyLayer;\n }\n\n return ErrorReporter.layer([makeSentryErrorReporter(ErrorReporter)], { mergeWithExisting: true });\n}\n"],"names":["isObjectLike","captureException","emptyLayer"],"mappings":";;;;;;AAYA,MAAM,aAAA,GAAgB,MAAA;AACtB,MAAM,gBAAgB,aAAA,CAAc,aAAA;AAEpC,MAAM,iBAAA,GAA8D;AAAA,EAClE,KAAA,EAAO,OAAA;AAAA,EACP,KAAA,EAAO,OAAA;AAAA,EACP,IAAA,EAAM,SAAA;AAAA,EACN,IAAA,EAAM,MAAA;AAAA,EACN,KAAA,EAAO,OAAA;AAAA,EACP,KAAA,EAAO;AACT,CAAA;AAEA,SAAS,QAAA,CAAS,eAA2C,KAAA,EAA+B;AAG1F,EAAA,IAAIA,iBAAA,CAAa,KAAK,CAAA,IAAK,aAAA,CAAc,YAAY,KAAA,EAAO;AAC1D,IAAA,OAAO,iBAAA,CAAkB,aAAA,CAAc,WAAA,CAAY,KAAK,CAAC,CAAA;AAAA,EAC3D;AACA,EAAA,OAAO,OAAA;AACT;AAEA,SAAS,wBAAwB,aAAA,EAA8E;AAC7G,EAAA,MAAM,QAAA,uBAAe,OAAA,EAAgB;AAErC,EAAA,OAAO;AAAA,IACL,CAAC,aAAA,CAAc,MAAM,GAAG,aAAA,CAAc,MAAA;AAAA,IACtC,MAAA,CAAO,EAAE,KAAA,EAAM,EAAmD;AAChE,MAAA,IAAI,QAAA,CAAS,GAAA,CAAI,KAAK,CAAA,EAAG;AACvB,QAAA;AAAA,MACF;AACA,MAAA,QAAA,CAAS,IAAI,KAAK,CAAA;AAElB,MAAA,KAAA,MAAW,MAAA,IAAU,MAAM,OAAA,EAAS;AAClC,QAAA,IAAI,MAAA,CAAO,SAAS,WAAA,EAAa;AAC/B,UAAA;AAAA,QACF;AAIA,QAAA,MAAM,QAAQ,MAAA,CAAO,IAAA,KAAS,MAAA,GAAS,MAAA,CAAO,QAAQ,MAAA,CAAO,MAAA;AAE7D,QAAA,IAAIA,iBAAA,CAAa,KAAK,CAAA,EAAG;AACvB,UAAA,IAAI,QAAA,CAAS,GAAA,CAAI,KAAK,CAAA,EAAG;AACvB,YAAA;AAAA,UACF;AACA,UAAA,QAAA,CAAS,IAAI,KAAK,CAAA;AAAA,QACpB;AAEA,QAAA,IAAI,aAAA,CAAc,SAAA,CAAU,KAAK,CAAA,EAAG;AAClC,UAAA;AAAA,QACF;AAEA,QAAAC,qBAAA,CAAiB,KAAA,EAAO;AAAA,UACtB,SAAA,EAAW,EAAE,IAAA,EAAM,qCAAA,EAAuC,SAAS,KAAA,EAAM;AAAA,UACzE,cAAA,EAAgB;AAAA,YACd,KAAA,EAAO,QAAA,CAAS,aAAA,EAAe,KAAK,CAAA;AAAA,YACpC,KAAA,EAAOD,iBAAA,CAAa,KAAK,CAAA,GAAI,EAAE,GAAG,aAAA,CAAc,aAAA,CAAc,KAAK,CAAA,EAAE,GAAI;AAAA;AAC3E,SACD,CAAA;AAAA,MACH;AAAA,IACF;AAAA,GACF;AACF;AAQO,SAAS,4BAAA,GAAuE;AACrF,EAAA,IAAI,CAAC,aAAA,EAAe;AAClB,IAAA,OAAOE,WAAA;AAAA,EACT;AAEA,EAAA,OAAO,aAAA,CAAc,KAAA,CAAM,CAAC,uBAAA,CAAwB,aAAa,CAAC,CAAA,EAAG,EAAE,iBAAA,EAAmB,IAAA,EAAM,CAAA;AAClG;;;;"}
@@ -1,13 +1,17 @@
1
1
  Object.defineProperty(exports, Symbol.toStringTag, { value: 'Module' });
2
2
 
3
3
  const Layer = require('effect/Layer');
4
+ const errorReporter = require('../errorReporter.js');
4
5
  const sdk = require('./sdk.js');
5
6
 
6
7
  function effectLayer(options) {
7
- return Layer.suspend(() => {
8
- sdk.init(options);
9
- return Layer.empty;
10
- });
8
+ return Layer.merge(
9
+ Layer.suspend(() => {
10
+ sdk.init(options);
11
+ return Layer.empty;
12
+ }),
13
+ errorReporter.makeSentryErrorReporterLayer()
14
+ );
11
15
  }
12
16
 
13
17
  exports.init = sdk.init;
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sources":["../../../src/server/index.ts"],"sourcesContent":["import type { NodeOptions } from '@sentry/node-core/light';\nimport type * as EffectLayer from 'effect/Layer';\nimport { empty as emptyLayer, suspend as suspendLayer } from 'effect/Layer';\nimport { init } from './sdk';\n\nexport { init } from './sdk';\n\n/**\n * Options for the Sentry Effect server layer.\n */\nexport type EffectServerLayerOptions = NodeOptions;\n\n/**\n * Creates an Effect Layer that initializes Sentry for Node.js servers.\n *\n * To enable Effect tracing, logs, or metrics, compose with the respective layers:\n * - `Layer.setTracer(Sentry.SentryEffectTracer)` for tracing\n * - `Logger.replace(Logger.defaultLogger, Sentry.SentryEffectLogger)` for logs\n * - `Sentry.SentryEffectMetricsLayer` for metrics\n *\n * @example\n * ```typescript\n * import * as Sentry from '@sentry/effect/server';\n * import { NodeRuntime } from '@effect/platform-node';\n * import { Layer, Logger } from 'effect';\n * import { HttpLive } from './Http.js';\n *\n * const SentryLive = Layer.mergeAll(\n * Sentry.effectLayer({ dsn: '__DSN__' }),\n * Layer.setTracer(Sentry.SentryEffectTracer),\n * Logger.replace(Logger.defaultLogger, Sentry.SentryEffectLogger),\n * );\n *\n * const MainLive = HttpLive.pipe(Layer.provide(SentryLive));\n * MainLive.pipe(Layer.launch, NodeRuntime.runMain);\n * ```\n */\nexport function effectLayer(options: EffectServerLayerOptions): EffectLayer.Layer<never, never, never> {\n return suspendLayer(() => {\n init(options);\n return emptyLayer;\n });\n}\n"],"names":["suspendLayer","init","emptyLayer"],"mappings":";;;;;AAqCO,SAAS,YAAY,OAAA,EAA2E;AACrG,EAAA,OAAOA,cAAa,MAAM;AACxB,IAAAC,QAAA,CAAK,OAAO,CAAA;AACZ,IAAA,OAAOC,WAAA;AAAA,EACT,CAAC,CAAA;AACH;;;;;"}
1
+ {"version":3,"file":"index.js","sources":["../../../src/server/index.ts"],"sourcesContent":["import type { NodeOptions } from '@sentry/node-core/light';\nimport type * as EffectLayer from 'effect/Layer';\nimport { empty as emptyLayer, merge as mergeLayer, suspend as suspendLayer } from 'effect/Layer';\nimport { makeSentryErrorReporterLayer } from '../errorReporter';\nimport { init } from './sdk';\n\nexport { init } from './sdk';\n\n/**\n * Options for the Sentry Effect server layer.\n */\nexport type EffectServerLayerOptions = NodeOptions;\n\n/**\n * Creates an Effect Layer that initializes Sentry for Node.js servers.\n *\n * On Effect v4 the layer also registers a Sentry `ErrorReporter`, so failures passing through\n * `Effect.withErrorReporting`, `ErrorReporter.report` or the built-in HTTP and RPC boundaries are captured.\n *\n * To enable Effect tracing, logs, or metrics, compose with the respective layers:\n * - `Layer.setTracer(Sentry.SentryEffectTracer)` for tracing\n * - `Logger.replace(Logger.defaultLogger, Sentry.SentryEffectLogger)` for logs\n * - `Sentry.SentryEffectMetricsLayer` for metrics\n *\n * @example\n * ```typescript\n * import * as Sentry from '@sentry/effect/server';\n * import { NodeRuntime } from '@effect/platform-node';\n * import { Layer, Logger } from 'effect';\n * import { HttpLive } from './Http.js';\n *\n * const SentryLive = Layer.mergeAll(\n * Sentry.effectLayer({ dsn: '__DSN__' }),\n * Layer.setTracer(Sentry.SentryEffectTracer),\n * Logger.replace(Logger.defaultLogger, Sentry.SentryEffectLogger),\n * );\n *\n * const MainLive = HttpLive.pipe(Layer.provide(SentryLive));\n * MainLive.pipe(Layer.launch, NodeRuntime.runMain);\n * ```\n */\nexport function effectLayer(options: EffectServerLayerOptions): EffectLayer.Layer<never, never, never> {\n return mergeLayer(\n suspendLayer(() => {\n init(options);\n return emptyLayer;\n }),\n makeSentryErrorReporterLayer(),\n );\n}\n"],"names":["mergeLayer","suspendLayer","init","emptyLayer","makeSentryErrorReporterLayer"],"mappings":";;;;;;AAyCO,SAAS,YAAY,OAAA,EAA2E;AACrG,EAAA,OAAOA,WAAA;AAAA,IACLC,cAAa,MAAM;AACjB,MAAAC,QAAA,CAAK,OAAO,CAAA;AACZ,MAAA,OAAOC,WAAA;AAAA,IACT,CAAC,CAAA;AAAA,IACDC,0CAAA;AAA6B,GAC/B;AACF;;;;;"}
@@ -1,11 +1,15 @@
1
- import { suspend, empty } from 'effect/Layer';
1
+ import { merge, suspend, empty } from 'effect/Layer';
2
+ import { makeSentryErrorReporterLayer } from '../errorReporter.js';
2
3
  import { init } from './sdk.js';
3
4
 
4
5
  function effectLayer(options) {
5
- return suspend(() => {
6
- init(options);
7
- return empty;
8
- });
6
+ return merge(
7
+ suspend(() => {
8
+ init(options);
9
+ return empty;
10
+ }),
11
+ makeSentryErrorReporterLayer()
12
+ );
9
13
  }
10
14
 
11
15
  export { effectLayer, init };
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sources":["../../../src/client/index.ts"],"sourcesContent":["import type { BrowserOptions } from '@sentry/browser';\nimport type * as EffectLayer from 'effect/Layer';\nimport { empty as emptyLayer, suspend as suspendLayer } from 'effect/Layer';\nimport { init } from './sdk';\n\nexport { init } from './sdk';\n\n/**\n * Options for the Sentry Effect client layer.\n */\nexport type EffectClientLayerOptions = BrowserOptions;\n\n/**\n * Creates an Effect Layer that initializes Sentry for browser clients.\n *\n * To enable Effect tracing, logs, or metrics, compose with the respective layers:\n * - `Layer.setTracer(Sentry.SentryEffectTracer)` for tracing\n * - `Logger.replace(Logger.defaultLogger, Sentry.SentryEffectLogger)` for logs\n * - `Sentry.SentryEffectMetricsLayer` for metrics\n *\n * @example\n * ```typescript\n * import * as Sentry from '@sentry/effect/client';\n * import { Layer, Logger, LogLevel } from 'effect';\n *\n * const SentryLive = Layer.mergeAll(\n * Sentry.effectLayer({\n * dsn: '__DSN__',\n * integrations: [Sentry.browserTracingIntegration()],\n * tracesSampleRate: 1.0,\n * }),\n * Layer.setTracer(Sentry.SentryEffectTracer),\n * Logger.replace(Logger.defaultLogger, Sentry.SentryEffectLogger),\n * );\n * ```\n */\nexport function effectLayer(options: EffectClientLayerOptions): EffectLayer.Layer<never, never, never> {\n return suspendLayer(() => {\n init(options);\n\n return emptyLayer;\n });\n}\n"],"names":["suspendLayer","emptyLayer"],"mappings":";;;AAoCO,SAAS,YAAY,OAAA,EAA2E;AACrG,EAAA,OAAOA,QAAa,MAAM;AACxB,IAAA,IAAA,CAAK,OAAO,CAAA;AAEZ,IAAA,OAAOC,KAAA;AAAA,EACT,CAAC,CAAA;AACH;;;;"}
1
+ {"version":3,"file":"index.js","sources":["../../../src/client/index.ts"],"sourcesContent":["import type { BrowserOptions } from '@sentry/browser';\nimport type * as EffectLayer from 'effect/Layer';\nimport { empty as emptyLayer, merge as mergeLayer, suspend as suspendLayer } from 'effect/Layer';\nimport { makeSentryErrorReporterLayer } from '../errorReporter';\nimport { init } from './sdk';\n\nexport { init } from './sdk';\n\n/**\n * Options for the Sentry Effect client layer.\n */\nexport type EffectClientLayerOptions = BrowserOptions;\n\n/**\n * Creates an Effect Layer that initializes Sentry for browser clients.\n *\n * On Effect v4 the layer also registers a Sentry `ErrorReporter`, so failures passing through\n * `Effect.withErrorReporting`, `ErrorReporter.report` or the built-in HTTP and RPC boundaries are captured.\n *\n * To enable Effect tracing, logs, or metrics, compose with the respective layers:\n * - `Layer.setTracer(Sentry.SentryEffectTracer)` for tracing\n * - `Logger.replace(Logger.defaultLogger, Sentry.SentryEffectLogger)` for logs\n * - `Sentry.SentryEffectMetricsLayer` for metrics\n *\n * @example\n * ```typescript\n * import * as Sentry from '@sentry/effect/client';\n * import { Layer, Logger, LogLevel } from 'effect';\n *\n * const SentryLive = Layer.mergeAll(\n * Sentry.effectLayer({\n * dsn: '__DSN__',\n * integrations: [Sentry.browserTracingIntegration()],\n * tracesSampleRate: 1.0,\n * }),\n * Layer.setTracer(Sentry.SentryEffectTracer),\n * Logger.replace(Logger.defaultLogger, Sentry.SentryEffectLogger),\n * );\n * ```\n */\nexport function effectLayer(options: EffectClientLayerOptions): EffectLayer.Layer<never, never, never> {\n return mergeLayer(\n suspendLayer(() => {\n init(options);\n\n return emptyLayer;\n }),\n makeSentryErrorReporterLayer(),\n );\n}\n"],"names":["mergeLayer","suspendLayer","emptyLayer"],"mappings":";;;;AAwCO,SAAS,YAAY,OAAA,EAA2E;AACrG,EAAA,OAAOA,KAAA;AAAA,IACLC,QAAa,MAAM;AACjB,MAAA,IAAA,CAAK,OAAO,CAAA;AAEZ,MAAA,OAAOC,KAAA;AAAA,IACT,CAAC,CAAA;AAAA,IACD,4BAAA;AAA6B,GAC/B;AACF;;;;"}
@@ -0,0 +1,63 @@
1
+ import { isObjectLike, captureException } from '@sentry/core';
2
+ import * as Effect from 'effect';
3
+ import { empty } from 'effect/Layer';
4
+
5
+ const effectExports = Effect;
6
+ const ErrorReporter = effectExports.ErrorReporter;
7
+ const SEVERITY_TO_LEVEL = {
8
+ Fatal: "fatal",
9
+ Error: "error",
10
+ Warn: "warning",
11
+ Info: "info",
12
+ Debug: "debug",
13
+ Trace: "debug"
14
+ };
15
+ function getLevel(errorReporter, error) {
16
+ if (isObjectLike(error) && errorReporter.severity in error) {
17
+ return SEVERITY_TO_LEVEL[errorReporter.getSeverity(error)];
18
+ }
19
+ return "error";
20
+ }
21
+ function makeSentryErrorReporter(errorReporter) {
22
+ const reported = /* @__PURE__ */ new WeakSet();
23
+ return {
24
+ [errorReporter.TypeId]: errorReporter.TypeId,
25
+ report({ cause }) {
26
+ if (reported.has(cause)) {
27
+ return;
28
+ }
29
+ reported.add(cause);
30
+ for (const reason of cause.reasons) {
31
+ if (reason._tag === "Interrupt") {
32
+ continue;
33
+ }
34
+ const error = reason._tag === "Fail" ? reason.error : reason.defect;
35
+ if (isObjectLike(error)) {
36
+ if (reported.has(error)) {
37
+ continue;
38
+ }
39
+ reported.add(error);
40
+ }
41
+ if (errorReporter.isIgnored(error)) {
42
+ continue;
43
+ }
44
+ captureException(error, {
45
+ mechanism: { type: "auto.function.effect.error_reporter", handled: false },
46
+ captureContext: {
47
+ level: getLevel(errorReporter, error),
48
+ extra: isObjectLike(error) ? { ...errorReporter.getAttributes(error) } : void 0
49
+ }
50
+ });
51
+ }
52
+ }
53
+ };
54
+ }
55
+ function makeSentryErrorReporterLayer() {
56
+ if (!ErrorReporter) {
57
+ return empty;
58
+ }
59
+ return ErrorReporter.layer([makeSentryErrorReporter(ErrorReporter)], { mergeWithExisting: true });
60
+ }
61
+
62
+ export { makeSentryErrorReporterLayer };
63
+ //# sourceMappingURL=errorReporter.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"errorReporter.js","sources":["../../src/errorReporter.ts"],"sourcesContent":["import type { SeverityLevel } from '@sentry/core';\nimport { captureException, isObjectLike } from '@sentry/core';\nimport * as Effect from 'effect';\nimport type * as Cause from 'effect/Cause';\nimport type * as EffectErrorReporter from 'effect/ErrorReporter';\nimport type * as EffectLayer from 'effect/Layer';\nimport { empty as emptyLayer } from 'effect/Layer';\nimport type * as LogLevel from 'effect/LogLevel';\n\n// `effect/ErrorReporter` only exists in Effect v4, so it is read off the main entry instead of being imported\n// as a subpath. On Effect v3 the lookup yields `undefined` and no reporter is registered. The property is read\n// through a separate binding because bundlers fail the build on `Effect.ErrorReporter` when the export is absent.\nconst effectExports = Effect as Record<string, unknown>;\nconst ErrorReporter = effectExports.ErrorReporter as typeof EffectErrorReporter | undefined;\n\nconst SEVERITY_TO_LEVEL: Record<LogLevel.Severity, SeverityLevel> = {\n Fatal: 'fatal',\n Error: 'error',\n Warn: 'warning',\n Info: 'info',\n Debug: 'debug',\n Trace: 'debug',\n};\n\nfunction getLevel(errorReporter: typeof EffectErrorReporter, error: unknown): SeverityLevel {\n // Effect's `getSeverity` falls back to `Info` for unannotated errors, which would file plain failures as\n // informational in Sentry. Only an explicit annotation changes the level.\n if (isObjectLike(error) && errorReporter.severity in error) {\n return SEVERITY_TO_LEVEL[errorReporter.getSeverity(error)];\n }\n return 'error';\n}\n\nfunction makeSentryErrorReporter(errorReporter: typeof EffectErrorReporter): EffectErrorReporter.ErrorReporter {\n const reported = new WeakSet<object>();\n\n return {\n [errorReporter.TypeId]: errorReporter.TypeId,\n report({ cause }: { readonly cause: Cause.Cause<unknown> }): void {\n if (reported.has(cause)) {\n return;\n }\n reported.add(cause);\n\n for (const reason of cause.reasons) {\n if (reason._tag === 'Interrupt') {\n continue;\n }\n\n // The raw error is captured rather than Effect's pretty-printed copy so Sentry sees the original stack,\n // `cause` chain and error class.\n const error = reason._tag === 'Fail' ? reason.error : reason.defect;\n\n if (isObjectLike(error)) {\n if (reported.has(error)) {\n continue;\n }\n reported.add(error);\n }\n\n if (errorReporter.isIgnored(error)) {\n continue;\n }\n\n captureException(error, {\n mechanism: { type: 'auto.function.effect.error_reporter', handled: false },\n captureContext: {\n level: getLevel(errorReporter, error),\n extra: isObjectLike(error) ? { ...errorReporter.getAttributes(error) } : undefined,\n },\n });\n }\n },\n };\n}\n\n/**\n * Registers a Sentry `ErrorReporter` for `Effect.withErrorReporting`, `ErrorReporter.report` and the\n * built-in HTTP and RPC reporting boundaries. Existing reporters are kept.\n *\n * Effect v3 has no `ErrorReporter` API, so the returned layer is empty there.\n */\nexport function makeSentryErrorReporterLayer(): EffectLayer.Layer<never, never, never> {\n if (!ErrorReporter) {\n return emptyLayer;\n }\n\n return ErrorReporter.layer([makeSentryErrorReporter(ErrorReporter)], { mergeWithExisting: true });\n}\n"],"names":["emptyLayer"],"mappings":";;;;AAYA,MAAM,aAAA,GAAgB,MAAA;AACtB,MAAM,gBAAgB,aAAA,CAAc,aAAA;AAEpC,MAAM,iBAAA,GAA8D;AAAA,EAClE,KAAA,EAAO,OAAA;AAAA,EACP,KAAA,EAAO,OAAA;AAAA,EACP,IAAA,EAAM,SAAA;AAAA,EACN,IAAA,EAAM,MAAA;AAAA,EACN,KAAA,EAAO,OAAA;AAAA,EACP,KAAA,EAAO;AACT,CAAA;AAEA,SAAS,QAAA,CAAS,eAA2C,KAAA,EAA+B;AAG1F,EAAA,IAAI,YAAA,CAAa,KAAK,CAAA,IAAK,aAAA,CAAc,YAAY,KAAA,EAAO;AAC1D,IAAA,OAAO,iBAAA,CAAkB,aAAA,CAAc,WAAA,CAAY,KAAK,CAAC,CAAA;AAAA,EAC3D;AACA,EAAA,OAAO,OAAA;AACT;AAEA,SAAS,wBAAwB,aAAA,EAA8E;AAC7G,EAAA,MAAM,QAAA,uBAAe,OAAA,EAAgB;AAErC,EAAA,OAAO;AAAA,IACL,CAAC,aAAA,CAAc,MAAM,GAAG,aAAA,CAAc,MAAA;AAAA,IACtC,MAAA,CAAO,EAAE,KAAA,EAAM,EAAmD;AAChE,MAAA,IAAI,QAAA,CAAS,GAAA,CAAI,KAAK,CAAA,EAAG;AACvB,QAAA;AAAA,MACF;AACA,MAAA,QAAA,CAAS,IAAI,KAAK,CAAA;AAElB,MAAA,KAAA,MAAW,MAAA,IAAU,MAAM,OAAA,EAAS;AAClC,QAAA,IAAI,MAAA,CAAO,SAAS,WAAA,EAAa;AAC/B,UAAA;AAAA,QACF;AAIA,QAAA,MAAM,QAAQ,MAAA,CAAO,IAAA,KAAS,MAAA,GAAS,MAAA,CAAO,QAAQ,MAAA,CAAO,MAAA;AAE7D,QAAA,IAAI,YAAA,CAAa,KAAK,CAAA,EAAG;AACvB,UAAA,IAAI,QAAA,CAAS,GAAA,CAAI,KAAK,CAAA,EAAG;AACvB,YAAA;AAAA,UACF;AACA,UAAA,QAAA,CAAS,IAAI,KAAK,CAAA;AAAA,QACpB;AAEA,QAAA,IAAI,aAAA,CAAc,SAAA,CAAU,KAAK,CAAA,EAAG;AAClC,UAAA;AAAA,QACF;AAEA,QAAA,gBAAA,CAAiB,KAAA,EAAO;AAAA,UACtB,SAAA,EAAW,EAAE,IAAA,EAAM,qCAAA,EAAuC,SAAS,KAAA,EAAM;AAAA,UACzE,cAAA,EAAgB;AAAA,YACd,KAAA,EAAO,QAAA,CAAS,aAAA,EAAe,KAAK,CAAA;AAAA,YACpC,KAAA,EAAO,YAAA,CAAa,KAAK,CAAA,GAAI,EAAE,GAAG,aAAA,CAAc,aAAA,CAAc,KAAK,CAAA,EAAE,GAAI;AAAA;AAC3E,SACD,CAAA;AAAA,MACH;AAAA,IACF;AAAA,GACF;AACF;AAQO,SAAS,4BAAA,GAAuE;AACrF,EAAA,IAAI,CAAC,aAAA,EAAe;AAClB,IAAA,OAAOA,KAAA;AAAA,EACT;AAEA,EAAA,OAAO,aAAA,CAAc,KAAA,CAAM,CAAC,uBAAA,CAAwB,aAAa,CAAC,CAAA,EAAG,EAAE,iBAAA,EAAmB,IAAA,EAAM,CAAA;AAClG;;;;"}
@@ -1 +1 @@
1
- {"type":"module","version":"10.73.0","sideEffects":false}
1
+ {"type":"module","version":"10.75.0","sideEffects":false}
@@ -1,11 +1,15 @@
1
- import { suspend, empty } from 'effect/Layer';
1
+ import { merge, suspend, empty } from 'effect/Layer';
2
+ import { makeSentryErrorReporterLayer } from '../errorReporter.js';
2
3
  import { init } from './sdk.js';
3
4
 
4
5
  function effectLayer(options) {
5
- return suspend(() => {
6
- init(options);
7
- return empty;
8
- });
6
+ return merge(
7
+ suspend(() => {
8
+ init(options);
9
+ return empty;
10
+ }),
11
+ makeSentryErrorReporterLayer()
12
+ );
9
13
  }
10
14
 
11
15
  export { effectLayer, init };
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sources":["../../../src/server/index.ts"],"sourcesContent":["import type { NodeOptions } from '@sentry/node-core/light';\nimport type * as EffectLayer from 'effect/Layer';\nimport { empty as emptyLayer, suspend as suspendLayer } from 'effect/Layer';\nimport { init } from './sdk';\n\nexport { init } from './sdk';\n\n/**\n * Options for the Sentry Effect server layer.\n */\nexport type EffectServerLayerOptions = NodeOptions;\n\n/**\n * Creates an Effect Layer that initializes Sentry for Node.js servers.\n *\n * To enable Effect tracing, logs, or metrics, compose with the respective layers:\n * - `Layer.setTracer(Sentry.SentryEffectTracer)` for tracing\n * - `Logger.replace(Logger.defaultLogger, Sentry.SentryEffectLogger)` for logs\n * - `Sentry.SentryEffectMetricsLayer` for metrics\n *\n * @example\n * ```typescript\n * import * as Sentry from '@sentry/effect/server';\n * import { NodeRuntime } from '@effect/platform-node';\n * import { Layer, Logger } from 'effect';\n * import { HttpLive } from './Http.js';\n *\n * const SentryLive = Layer.mergeAll(\n * Sentry.effectLayer({ dsn: '__DSN__' }),\n * Layer.setTracer(Sentry.SentryEffectTracer),\n * Logger.replace(Logger.defaultLogger, Sentry.SentryEffectLogger),\n * );\n *\n * const MainLive = HttpLive.pipe(Layer.provide(SentryLive));\n * MainLive.pipe(Layer.launch, NodeRuntime.runMain);\n * ```\n */\nexport function effectLayer(options: EffectServerLayerOptions): EffectLayer.Layer<never, never, never> {\n return suspendLayer(() => {\n init(options);\n return emptyLayer;\n });\n}\n"],"names":["suspendLayer","emptyLayer"],"mappings":";;;AAqCO,SAAS,YAAY,OAAA,EAA2E;AACrG,EAAA,OAAOA,QAAa,MAAM;AACxB,IAAA,IAAA,CAAK,OAAO,CAAA;AACZ,IAAA,OAAOC,KAAA;AAAA,EACT,CAAC,CAAA;AACH;;;;"}
1
+ {"version":3,"file":"index.js","sources":["../../../src/server/index.ts"],"sourcesContent":["import type { NodeOptions } from '@sentry/node-core/light';\nimport type * as EffectLayer from 'effect/Layer';\nimport { empty as emptyLayer, merge as mergeLayer, suspend as suspendLayer } from 'effect/Layer';\nimport { makeSentryErrorReporterLayer } from '../errorReporter';\nimport { init } from './sdk';\n\nexport { init } from './sdk';\n\n/**\n * Options for the Sentry Effect server layer.\n */\nexport type EffectServerLayerOptions = NodeOptions;\n\n/**\n * Creates an Effect Layer that initializes Sentry for Node.js servers.\n *\n * On Effect v4 the layer also registers a Sentry `ErrorReporter`, so failures passing through\n * `Effect.withErrorReporting`, `ErrorReporter.report` or the built-in HTTP and RPC boundaries are captured.\n *\n * To enable Effect tracing, logs, or metrics, compose with the respective layers:\n * - `Layer.setTracer(Sentry.SentryEffectTracer)` for tracing\n * - `Logger.replace(Logger.defaultLogger, Sentry.SentryEffectLogger)` for logs\n * - `Sentry.SentryEffectMetricsLayer` for metrics\n *\n * @example\n * ```typescript\n * import * as Sentry from '@sentry/effect/server';\n * import { NodeRuntime } from '@effect/platform-node';\n * import { Layer, Logger } from 'effect';\n * import { HttpLive } from './Http.js';\n *\n * const SentryLive = Layer.mergeAll(\n * Sentry.effectLayer({ dsn: '__DSN__' }),\n * Layer.setTracer(Sentry.SentryEffectTracer),\n * Logger.replace(Logger.defaultLogger, Sentry.SentryEffectLogger),\n * );\n *\n * const MainLive = HttpLive.pipe(Layer.provide(SentryLive));\n * MainLive.pipe(Layer.launch, NodeRuntime.runMain);\n * ```\n */\nexport function effectLayer(options: EffectServerLayerOptions): EffectLayer.Layer<never, never, never> {\n return mergeLayer(\n suspendLayer(() => {\n init(options);\n return emptyLayer;\n }),\n makeSentryErrorReporterLayer(),\n );\n}\n"],"names":["mergeLayer","suspendLayer","emptyLayer"],"mappings":";;;;AAyCO,SAAS,YAAY,OAAA,EAA2E;AACrG,EAAA,OAAOA,KAAA;AAAA,IACLC,QAAa,MAAM;AACjB,MAAA,IAAA,CAAK,OAAO,CAAA;AACZ,MAAA,OAAOC,KAAA;AAAA,IACT,CAAC,CAAA;AAAA,IACD,4BAAA;AAA6B,GAC/B;AACF;;;;"}
@@ -8,6 +8,9 @@ export type EffectClientLayerOptions = BrowserOptions;
8
8
  /**
9
9
  * Creates an Effect Layer that initializes Sentry for browser clients.
10
10
  *
11
+ * On Effect v4 the layer also registers a Sentry `ErrorReporter`, so failures passing through
12
+ * `Effect.withErrorReporting`, `ErrorReporter.report` or the built-in HTTP and RPC boundaries are captured.
13
+ *
11
14
  * To enable Effect tracing, logs, or metrics, compose with the respective layers:
12
15
  * - `Layer.setTracer(Sentry.SentryEffectTracer)` for tracing
13
16
  * - `Logger.replace(Logger.defaultLogger, Sentry.SentryEffectLogger)` for logs
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/client/index.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,iBAAiB,CAAC;AACtD,OAAO,KAAK,KAAK,WAAW,MAAM,cAAc,CAAC;AAIjD,OAAO,EAAE,IAAI,EAAE,MAAM,OAAO,CAAC;AAE7B;;GAEG;AACH,MAAM,MAAM,wBAAwB,GAAG,cAAc,CAAC;AAEtD;;;;;;;;;;;;;;;;;;;;;;;GAuBG;AACH,wBAAgB,WAAW,CAAC,OAAO,EAAE,wBAAwB,GAAG,WAAW,CAAC,KAAK,CAAC,KAAK,EAAE,KAAK,EAAE,KAAK,CAAC,CAMrG"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/client/index.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,iBAAiB,CAAC;AACtD,OAAO,KAAK,KAAK,WAAW,MAAM,cAAc,CAAC;AAKjD,OAAO,EAAE,IAAI,EAAE,MAAM,OAAO,CAAC;AAE7B;;GAEG;AACH,MAAM,MAAM,wBAAwB,GAAG,cAAc,CAAC;AAEtD;;;;;;;;;;;;;;;;;;;;;;;;;;GA0BG;AACH,wBAAgB,WAAW,CAAC,OAAO,EAAE,wBAAwB,GAAG,WAAW,CAAC,KAAK,CAAC,KAAK,EAAE,KAAK,EAAE,KAAK,CAAC,CASrG"}
@@ -0,0 +1,9 @@
1
+ import type * as EffectLayer from 'effect/Layer';
2
+ /**
3
+ * Registers a Sentry `ErrorReporter` for `Effect.withErrorReporting`, `ErrorReporter.report` and the
4
+ * built-in HTTP and RPC reporting boundaries. Existing reporters are kept.
5
+ *
6
+ * Effect v3 has no `ErrorReporter` API, so the returned layer is empty there.
7
+ */
8
+ export declare function makeSentryErrorReporterLayer(): EffectLayer.Layer<never, never, never>;
9
+ //# sourceMappingURL=errorReporter.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"errorReporter.d.ts","sourceRoot":"","sources":["../../src/errorReporter.ts"],"names":[],"mappings":"AAKA,OAAO,KAAK,KAAK,WAAW,MAAM,cAAc,CAAC;AAuEjD;;;;;GAKG;AACH,wBAAgB,4BAA4B,IAAI,WAAW,CAAC,KAAK,CAAC,KAAK,EAAE,KAAK,EAAE,KAAK,CAAC,CAMrF"}
@@ -8,6 +8,9 @@ export type EffectServerLayerOptions = NodeOptions;
8
8
  /**
9
9
  * Creates an Effect Layer that initializes Sentry for Node.js servers.
10
10
  *
11
+ * On Effect v4 the layer also registers a Sentry `ErrorReporter`, so failures passing through
12
+ * `Effect.withErrorReporting`, `ErrorReporter.report` or the built-in HTTP and RPC boundaries are captured.
13
+ *
11
14
  * To enable Effect tracing, logs, or metrics, compose with the respective layers:
12
15
  * - `Layer.setTracer(Sentry.SentryEffectTracer)` for tracing
13
16
  * - `Logger.replace(Logger.defaultLogger, Sentry.SentryEffectLogger)` for logs
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/server/index.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,yBAAyB,CAAC;AAC3D,OAAO,KAAK,KAAK,WAAW,MAAM,cAAc,CAAC;AAIjD,OAAO,EAAE,IAAI,EAAE,MAAM,OAAO,CAAC;AAE7B;;GAEG;AACH,MAAM,MAAM,wBAAwB,GAAG,WAAW,CAAC;AAEnD;;;;;;;;;;;;;;;;;;;;;;;;GAwBG;AACH,wBAAgB,WAAW,CAAC,OAAO,EAAE,wBAAwB,GAAG,WAAW,CAAC,KAAK,CAAC,KAAK,EAAE,KAAK,EAAE,KAAK,CAAC,CAKrG"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/server/index.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,yBAAyB,CAAC;AAC3D,OAAO,KAAK,KAAK,WAAW,MAAM,cAAc,CAAC;AAKjD,OAAO,EAAE,IAAI,EAAE,MAAM,OAAO,CAAC;AAE7B;;GAEG;AACH,MAAM,MAAM,wBAAwB,GAAG,WAAW,CAAC;AAEnD;;;;;;;;;;;;;;;;;;;;;;;;;;;GA2BG;AACH,wBAAgB,WAAW,CAAC,OAAO,EAAE,wBAAwB,GAAG,WAAW,CAAC,KAAK,CAAC,KAAK,EAAE,KAAK,EAAE,KAAK,CAAC,CAQrG"}
@@ -8,6 +8,9 @@ export type EffectClientLayerOptions = BrowserOptions;
8
8
  /**
9
9
  * Creates an Effect Layer that initializes Sentry for browser clients.
10
10
  *
11
+ * On Effect v4 the layer also registers a Sentry `ErrorReporter`, so failures passing through
12
+ * `Effect.withErrorReporting`, `ErrorReporter.report` or the built-in HTTP and RPC boundaries are captured.
13
+ *
11
14
  * To enable Effect tracing, logs, or metrics, compose with the respective layers:
12
15
  * - `Layer.setTracer(Sentry.SentryEffectTracer)` for tracing
13
16
  * - `Logger.replace(Logger.defaultLogger, Sentry.SentryEffectLogger)` for logs
@@ -0,0 +1,9 @@
1
+ import * as EffectLayer from 'effect/Layer';
2
+ /**
3
+ * Registers a Sentry `ErrorReporter` for `Effect.withErrorReporting`, `ErrorReporter.report` and the
4
+ * built-in HTTP and RPC reporting boundaries. Existing reporters are kept.
5
+ *
6
+ * Effect v3 has no `ErrorReporter` API, so the returned layer is empty there.
7
+ */
8
+ export declare function makeSentryErrorReporterLayer(): EffectLayer.Layer<never, never, never>;
9
+ //# sourceMappingURL=errorReporter.d.ts.map
@@ -8,6 +8,9 @@ export type EffectServerLayerOptions = NodeOptions;
8
8
  /**
9
9
  * Creates an Effect Layer that initializes Sentry for Node.js servers.
10
10
  *
11
+ * On Effect v4 the layer also registers a Sentry `ErrorReporter`, so failures passing through
12
+ * `Effect.withErrorReporting`, `ErrorReporter.report` or the built-in HTTP and RPC boundaries are captured.
13
+ *
11
14
  * To enable Effect tracing, logs, or metrics, compose with the respective layers:
12
15
  * - `Layer.setTracer(Sentry.SentryEffectTracer)` for tracing
13
16
  * - `Logger.replace(Logger.defaultLogger, Sentry.SentryEffectLogger)` for logs
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@sentry/effect",
3
- "version": "10.73.0",
3
+ "version": "10.75.0",
4
4
  "description": "Official Sentry SDK for Effect",
5
5
  "repository": "git://github.com/getsentry/sentry-javascript.git",
6
6
  "homepage": "https://github.com/getsentry/sentry-javascript/tree/master/packages/effect",
@@ -57,9 +57,9 @@
57
57
  "access": "public"
58
58
  },
59
59
  "dependencies": {
60
- "@sentry/browser": "10.73.0",
61
- "@sentry/core": "10.73.0",
62
- "@sentry/node-core": "10.73.0"
60
+ "@sentry/browser": "10.75.0",
61
+ "@sentry/core": "10.75.0",
62
+ "@sentry/node-core": "10.75.0"
63
63
  },
64
64
  "peerDependencies": {
65
65
  "effect": "^3.0.0 || ^4.0.0-beta.50"