@sentry-internal/feedback
Advanced tools
Comparing version 0.0.1-alpha.12 to 0.0.1-alpha.13
{ | ||
"name": "@sentry-internal/feedback", | ||
"version": "0.0.1-alpha.12", | ||
"version": "0.0.1-alpha.13", | ||
"description": "Sentry SDK integration for user feedback", | ||
@@ -5,0 +5,0 @@ "repository": "git://github.com/getsentry/sentry-javascript.git", |
@@ -63,1 +63,4 @@ const LIGHT_BACKGROUND = '#ffffff'; | ||
export const SUCCESS_MESSAGE_TEXT = 'Thank you for your report!'; | ||
export const FEEDBACK_WIDGET_SOURCE = 'widget'; | ||
export const FEEDBACK_API_SOURCE = 'api'; |
@@ -5,2 +5,3 @@ import type { BrowserClient, Replay } from '@sentry/browser'; | ||
import { FEEDBACK_API_SOURCE } from './constants'; | ||
import type { SendFeedbackOptions } from './types'; | ||
@@ -21,3 +22,3 @@ import { sendFeedbackRequest } from './util/sendFeedbackRequest'; | ||
export function sendFeedback( | ||
{ name, email, message, source = 'api', url = getLocationHref() }: SendFeedbackParams, | ||
{ name, email, message, source = FEEDBACK_API_SOURCE, url = getLocationHref() }: SendFeedbackParams, | ||
{ includeReplay = true }: SendFeedbackOptions = {}, | ||
@@ -24,0 +25,0 @@ ): ReturnType<typeof sendFeedbackRequest> { |
import type { TransportMakeRequestResponse } from '@sentry/types'; | ||
import { logger } from '@sentry/utils'; | ||
import { FEEDBACK_WIDGET_SOURCE } from '../constants'; | ||
import { sendFeedback } from '../sendFeedback'; | ||
@@ -32,3 +33,3 @@ import type { FeedbackFormData, SendFeedbackOptions } from '../types'; | ||
try { | ||
const resp = await sendFeedback({ ...feedback, source: 'widget' }, options); | ||
const resp = await sendFeedback({ ...feedback, source: FEEDBACK_WIDGET_SOURCE }, options); | ||
@@ -35,0 +36,0 @@ // Success! |
@@ -30,3 +30,2 @@ import type { Scope } from '@sentry/core'; | ||
)) as FeedbackEvent | null; | ||
if (preparedEvent === null) { | ||
@@ -33,0 +32,0 @@ // Taken from baseclient's `_processEvent` method, where this is handled for errors/transactions |
import { createEventEnvelope, getCurrentHub } from '@sentry/core'; | ||
import type { FeedbackEvent, TransportMakeRequestResponse } from '@sentry/types'; | ||
import { FEEDBACK_API_SOURCE, FEEDBACK_WIDGET_SOURCE } from '../constants'; | ||
import type { SendFeedbackData } from '../types'; | ||
@@ -15,3 +16,2 @@ import { prepareFeedbackEvent } from './prepareFeedbackEvent'; | ||
const client = hub.getClient(); | ||
const scope = hub.getScope(); | ||
const transport = client && client.getTransport(); | ||
@@ -38,84 +38,102 @@ const dsn = client && client.getDsn(); | ||
const feedbackEvent = await prepareFeedbackEvent({ | ||
scope, | ||
client, | ||
event: baseEvent, | ||
}); | ||
return new Promise((resolve, reject) => { | ||
hub.withScope(async scope => { | ||
// No use for breadcrumbs in feedback | ||
scope.clearBreadcrumbs(); | ||
if (feedbackEvent === null) { | ||
return; | ||
} | ||
if ([FEEDBACK_API_SOURCE, FEEDBACK_WIDGET_SOURCE].includes(String(source))) { | ||
scope.setLevel('info'); | ||
} | ||
/* | ||
For reference, the fully built event looks something like this: | ||
{ | ||
"type": "feedback", | ||
"event_id": "d2132d31b39445f1938d7e21b6bf0ec4", | ||
"timestamp": 1597977777.6189718, | ||
"dist": "1.12", | ||
"platform": "javascript", | ||
"environment": "production", | ||
"release": 42, | ||
"tags": {"transaction": "/organizations/:orgId/performance/:eventSlug/"}, | ||
"sdk": {"name": "name", "version": "version"}, | ||
"user": { | ||
"id": "123", | ||
"username": "user", | ||
"email": "user@site.com", | ||
"ip_address": "192.168.11.12", | ||
}, | ||
"request": { | ||
"url": None, | ||
"headers": { | ||
"user-Agent": "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/605.1.15 (KHTML, like Gecko) Version/15.5 Safari/605.1.15" | ||
}, | ||
}, | ||
"contexts": { | ||
"feedback": { | ||
"message": "test message", | ||
"contact_email": "test@example.com", | ||
"type": "feedback", | ||
}, | ||
"trace": { | ||
"trace_id": "4C79F60C11214EB38604F4AE0781BFB2", | ||
"span_id": "FA90FDEAD5F74052", | ||
"type": "trace", | ||
}, | ||
"replay": { | ||
"replay_id": "e2d42047b1c5431c8cba85ee2a8ab25d", | ||
}, | ||
}, | ||
} | ||
*/ | ||
const feedbackEvent = await prepareFeedbackEvent({ | ||
scope, | ||
client, | ||
event: baseEvent, | ||
}); | ||
const envelope = createEventEnvelope(feedbackEvent, dsn, client.getOptions()._metadata, client.getOptions().tunnel); | ||
if (feedbackEvent === null) { | ||
resolve(); | ||
return; | ||
} | ||
let response: void | TransportMakeRequestResponse; | ||
const envelope = createEventEnvelope( | ||
feedbackEvent, | ||
dsn, | ||
client.getOptions()._metadata, | ||
client.getOptions().tunnel, | ||
); | ||
try { | ||
response = await transport.send(envelope); | ||
} catch (err) { | ||
const error = new Error('Unable to send Feedback'); | ||
let response: void | TransportMakeRequestResponse; | ||
try { | ||
// In case browsers don't allow this property to be writable | ||
// @ts-expect-error This needs lib es2022 and newer | ||
error.cause = err; | ||
} catch { | ||
// nothing to do | ||
} | ||
throw error; | ||
} | ||
try { | ||
response = await transport.send(envelope); | ||
} catch (err) { | ||
const error = new Error('Unable to send Feedback'); | ||
// TODO (v8): we can remove this guard once transport.send's type signature doesn't include void anymore | ||
if (!response) { | ||
return response; | ||
} | ||
try { | ||
// In case browsers don't allow this property to be writable | ||
// @ts-expect-error This needs lib es2022 and newer | ||
error.cause = err; | ||
} catch { | ||
// nothing to do | ||
} | ||
reject(error); | ||
} | ||
// Require valid status codes, otherwise can assume feedback was not sent successfully | ||
if (typeof response.statusCode === 'number' && (response.statusCode < 200 || response.statusCode >= 300)) { | ||
throw new Error('Unable to send Feedback'); | ||
} | ||
// TODO (v8): we can remove this guard once transport.send's type signature doesn't include void anymore | ||
if (!response) { | ||
resolve(response); | ||
return; | ||
} | ||
return response; | ||
// Require valid status codes, otherwise can assume feedback was not sent successfully | ||
if (typeof response.statusCode === 'number' && (response.statusCode < 200 || response.statusCode >= 300)) { | ||
reject(new Error('Unable to send Feedback')); | ||
} | ||
resolve(response); | ||
}); | ||
}); | ||
} | ||
/* | ||
* For reference, the fully built event looks something like this: | ||
* { | ||
* "type": "feedback", | ||
* "event_id": "d2132d31b39445f1938d7e21b6bf0ec4", | ||
* "timestamp": 1597977777.6189718, | ||
* "dist": "1.12", | ||
* "platform": "javascript", | ||
* "environment": "production", | ||
* "release": 42, | ||
* "tags": {"transaction": "/organizations/:orgId/performance/:eventSlug/"}, | ||
* "sdk": {"name": "name", "version": "version"}, | ||
* "user": { | ||
* "id": "123", | ||
* "username": "user", | ||
* "email": "user@site.com", | ||
* "ip_address": "192.168.11.12", | ||
* }, | ||
* "request": { | ||
* "url": None, | ||
* "headers": { | ||
* "user-Agent": "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/605.1.15 (KHTML, like Gecko) Version/15.5 Safari/605.1.15" | ||
* }, | ||
* }, | ||
* "contexts": { | ||
* "feedback": { | ||
* "message": "test message", | ||
* "contact_email": "test@example.com", | ||
* "type": "feedback", | ||
* }, | ||
* "trace": { | ||
* "trace_id": "4C79F60C11214EB38604F4AE0781BFB2", | ||
* "span_id": "FA90FDEAD5F74052", | ||
* "type": "trace", | ||
* }, | ||
* "replay": { | ||
* "replay_id": "e2d42047b1c5431c8cba85ee2a8ab25d", | ||
* }, | ||
* }, | ||
* } | ||
*/ |
@@ -33,2 +33,3 @@ import { getCurrentHub } from '@sentry/core'; | ||
}, | ||
level: 'info', | ||
environment: 'production', | ||
@@ -35,0 +36,0 @@ event_id: expect.any(String), |
License Policy Violation
LicenseThis package is not allowed per your license policy. Review the package's license to ensure compliance.
Found 1 instance in 1 package
License Policy Violation
LicenseThis package is not allowed per your license policy. Review the package's license to ensure compliance.
Found 1 instance in 1 package
455465
123
7878