Socket
Socket
Sign inDemoInstall

@sentry-internal/feedback

Package Overview
Dependencies
Maintainers
9
Versions
121
Alerts
File Explorer

Advanced tools

Socket logo

Install Socket

Detect and block malicious and high-risk dependencies

Install

@sentry-internal/feedback - npm Package Compare versions

Comparing version 0.0.1-alpha.12 to 0.0.1-alpha.13

2

package.json
{
"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),

SocketSocket SOC 2 Logo

Product

  • Package Alerts
  • Integrations
  • Docs
  • Pricing
  • FAQ
  • Roadmap
  • Changelog

Packages

npm

Stay in touch

Get open source security insights delivered straight into your inbox.


  • Terms
  • Privacy
  • Security

Made with ⚡️ by Socket Inc