import * as Sentry from "@sentry/node" import type { CauseException } from "../errors.js" export function reportError>( makeError: (cause: Cause) => E2 ) { return (cause: Cause, context?: Record) => Effect.gen(function*($) { if (cause.isInterrupted()) { yield* $(Effect.logDebug("Interrupted: " + (context ? context.$$.pretty : ""))) return } const error = makeError(cause) const extras = { context, error: error.toJSON() } reportSentry(error, extras) yield* $( cause.logErrorCause.logAnnotate( "extras", JSON.stringify({ context, error: { _tag: error._tag, message: error.message } }) ) ) }) } function reportSentry(error: unknown, extras: Record) { const scope = new Sentry.Scope() scope.setExtras(extras) Sentry.captureException(error, scope) } export function logError>( makeError: (cause: Cause) => E2 ) { return (cause: Cause, context?: Record) => Effect.gen(function*($) { if (cause.isInterrupted()) { yield* $(Effect.logDebug("Interrupted: " + (context ? context.$$.pretty : ""))) return } const error = makeError(cause) yield* $( cause.logWarningCause.logAnnotate( "extras", JSON.stringify({ context, error: { _tag: error._tag, message: error.message } }) ) ) }) } export function captureException(error: unknown) { Sentry.captureException(error) console.error(error) } export function reportMessage(message: string) { Sentry.captureMessage(message) console.warn(message) } export function reportMessageM(message: string) { return Effect(reportMessage(message)) }