рдлрд┐рд▓рд╣рд╛рд▓ рд╕рдВрддрд░реА рдкреНрд▓рдЧрдЗрди рдХреЛ рдирд┐рд╖реНрдХреНрд░рд┐рдп рдХрд░рдирд╛ рд╕рдВрднрд╡ рдирд╣реАрдВ рд╣реИ рдХреНрдпреЛрдВрдХрд┐ ngRaven рдореЙрдбреНрдпреВрд▓ рд▓реЛрдб рд╣реЛрдиреЗ рдореЗрдВ рд╡рд┐рдлрд▓ рд░рд╣рддрд╛ рд╣реИред
рд╡рд┐рдХрд╛рд╕ рдкрд░реНрдпрд╛рд╡рд░рдг рдкрд░ рдореИрдВ рдбреАрдПрд╕рдПрди рдкреНрд░рджрд╛рди рдХрд┐рдП рдмрд┐рдирд╛ рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддрд╛ рд╣реВрдВ:
рд░реЗрд╡реЗрдиред рдХреЙрдиреНрдлрд┐рдЧ ()ред рд╕реНрдерд╛рдкрд┐рдд рдХрд░реЗрдВ ()
рд░реЗрд╡реЗрди рдкреНрд░рджрд╛рддрд╛ рдХреЛ рдкрдВрдЬреАрдХреГрдд рдХрд░рдиреЗ рд╡рд╛рд▓реЗ рдХреЙрд▓рдмреИрдХ рдХреЛ рдирд╣реАрдВ рдХрд╣рд╛ рдЬрд╛рддрд╛ рд╣реИ
Raven.addPlugin(function () {
angular.module('ngRaven', [])
.provider('Raven', RavenProvider)
.config(['$provide', ExceptionHandlerProvider]);
});
рдХреНрдпреЛрдВрдХрд┐ рдЗрдВрд╕реНрдЯреЙрд▓ рдлрд╝рдВрдХреНрд╢рди рдореЙрдбреНрдпреВрд▓ рдХреЛ рд╕реНрдерд╛рдкрд┐рдд рдХрд░рдиреЗ рд╡рд╛рд▓реЗ рдкреНрд▓рдЧрдЗрди рдХреЛ рдХреЙрд▓ рдирд╣реАрдВ рдХрд░рддрд╛ рд╣реИ
isSetup () рд╡рд┐рдлрд▓ рд╣реБрдЖ рдХреНрдпреЛрдВрдХрд┐ рдЧреНрд▓реЛрдмрд▓рд╕рд░реНрд╡рд░ рд╢реВрдиреНрдп рд╣реИ
install: function() {
if (isSetup() && !isRavenInstalled) {
TraceKit.report.subscribe(handleStackInfo);
// Install all of the plugins
each(plugins, function(_, plugin) {
plugin();
});
isRavenInstalled = true;
}
return Raven;
},
#414 рдФрд░ #413 . рд╕реЗ рд╕рдВрдмрдВрдзрд┐рдд
@Sija @odedfos - рдХреНрдпрд╛ рдЖрдк #414 рдкрд░ рдЯрд┐рдкреНрдкрдгреА рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ? рдЬреИрд╕реЗ, рдХреНрдпрд╛ рд╡рд╣ рдЬрдирд╕рдВрдкрд░реНрдХ рдЗрд╕ рдореБрджреНрджреЗ рдХрд╛ рд╕рдорд╛рдзрд╛рди рдХрд░реЗрдЧрд╛?
@benvinegar рдореЗрд░реЗ рд▓рд┐рдП Raven
рдкреНрд░рджрд╛рддрд╛ рдЙрдкрд▓рдмреНрдз рд╣реЛрдирд╛ рдЪрд╛рд╣рддреЗ рд╣реИрдВ, рдпрд╣рд╛рдВ рддрдХ тАЛтАЛтАЛтАЛрдХрд┐ .config()
рдХреЙрд▓ рдХрд┐рдП рдмрд┐рдирд╛ рднреА - рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП Raven.debug
рдзреНрд╡рдЬ рд╕реЗрдЯ рдХрд░рдирд╛
рдореЗрд░рд╛ @benvinegar рд╕реЗ рднреА рдРрд╕рд╛ рд╣реА рдЕрдиреБрд░реЛрдз рдерд╛ рдФрд░ рдЙрдиреНрд╣реЛрдВрдиреЗ рдмрддрд╛рдпрд╛ рдХрд┐ рдЖрдк рдЗрд╕рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ:
Raven.config('your dsn', {
shouldSendCallback: function () {
return false;
}
}).install();
рдФрд░ рд╡рд╣ рд░реЗрд╡реЗрди рдХреЛ рд░рд┐рдкреЛрд░реНрдЯрд┐рдВрдЧ рдХрд░рдиреЗ рд╕реЗ рд░реЛрдХреЗрдЧрд╛ред return
рд╕реНрдерд┐рддрд┐ рдХреЛ TRUE рдкрд░ рд╕реНрд╡рд┐рдЪ рдХрд░реЗрдВ рдФрд░ рдпрд╣ рд░рд┐рдкреЛрд░реНрдЯ рдХрд░рдирд╛ рд╢реБрд░реВ рдХрд░ рджреЗрдЧрд╛ред рдХрдо рд╕реЗ рдХрдо рдореБрдЭреЗ рддреЛ рдпрд╣реА рдмрддрд╛рдпрд╛ рдЧрдпрд╛ рд╣реИред рд╣рдо рддреИрдирд╛рддреА рдХреЗ рд╕рдордп рдмреВрд▓рд┐рдпрди рдХреЛ рдлрд╝реНрд▓рд┐рдк рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдЗрд╕ рдкреНрд▓рд╕ рдПрдХ рдкрд░рд┐рдирд┐рдпреЛрдЬрди sed
рдХрдорд╛рдВрдб рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХреА рдпреЛрдЬрдирд╛ рдмрдирд╛ рд░рд╣реЗ рд╣реИрдВред
рдореИрдВрдиреЗ рдЙрдкрд░реЛрдХреНрдд рдХреЗ рд╕рдорд╛рди рдХреБрдЫ рдХрд┐рдпрд╛ рддрд╛рдХрд┐ рдЗрдВрд╕реНрдЯреЙрд▓() рдХреЛ рдЖрдЧреЗ рдмрдврд╝рдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рджреА рдЬрд╛ рд╕рдХреЗ, рдФрд░ рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рддреНрд░реБрдЯрд┐рдпреЛрдВ рдХреЛ рднреЗрдЬрдиреЗ рдХреЗ рд▓рд┐рдП рдХреЛрдИ http рдЕрдиреБрд░реЛрдз рдХрд░рдиреЗ рд╕реЗ рдмрдЪрдиреЗ рдХреЗ рд▓рд┐рдП ( window.SERVER_FLAGS
рдпрд╣ рд╣реИ рдХрд┐ рдореИрдВ рдЕрдкрдиреЗ рд╕рдВрддрд░реАрдпреВрдЖрд░рдПрд▓ рдХреЛ рдЕрдкрдиреЗ рдмреИрдХрдПрдВрдб рд╕реЗ рдлреНрд░рдВрдЯрдПрдВрдб рддрдХ рдХреИрд╕реЗ рдкрд╛рд╕ рдХрд░рддрд╛ рд╣реВрдВ)ред
if (!window.SERVER_FLAGS.sentryURL) {
// Never bother sending data to sentry
Raven.setShouldSendCallback(function() { return false });
// Allow Raven.install() to succeed
Raven.isSetup = function() {
return true;
}
}
Raven
.config(window.SERVER_FLAGS.sentryURL, {
release: window.SERVER_FLAGS.version,
debug: true,
})
.addPlugin(Raven.Plugins.Angular)
.install();
рдРрд╕рд╛ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдпрд╣ рдХрд╛рдлреА рдЕрдЪреНрдЫреА рддрд░рд╣ рд╕реЗ рдХрд╛рдо рдХрд░ рд░рд╣рд╛ рд╣реИ, рдФрд░ рдлрд┐рд░ рднреА рд░реЗрд╡реЗрди рдХреЛ рдЪрд▓рдиреЗ рджреЗрддрд╛ рд╣реИ, рд▓реЗрдХрд┐рди рдпрд╣ рдХреЗрд╡рд▓ рд░рд┐рдкреЛрд░реНрдЯ рдирд╣реАрдВ рдХрд░рддрд╛ рд╣реИред рдореИрдВ рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ isSetup
рдХреЛ рд╣реИрдХ рдХрд░рдирд╛ рдирд╛рдкрд╕рдВрдж рдХрд░рддрд╛ рд╣реВрдВ рд▓реЗрдХрд┐рди рдпрд╣ рдПрдХрдорд╛рддреНрд░ рддрд░реАрдХрд╛ рд╣реИ рдЬреЛ рдореБрдЭреЗ рдорд┐рд▓ рд╕рдХрддрд╛ рд╣реИ рдЬреЛ ngRaven
рд▓реЛрдб рд╣реЛрдиреЗ рдХреЗ рд▓рд┐рдП рдиреНрдпреВрдирддрдо рдЖрдХреНрд░рд╛рдордХ рдерд╛ред
рдЗрд╕ рдкрд░ рдареЛрдХрд░ рдЦрд╛рдиреЗ рд╡рд╛рд▓реЗ рдЕрдиреНрдп рд▓реЛрдЧреЛрдВ рдХреЗ рд▓рд┐рдП
рдпрджрд┐ рдЖрдк рдЕрдкрдирд╛ рдПрдкреНрд▓рд┐рдХреЗрд╢рди рдмрдирд╛рдиреЗ рдХреЗ рд▓рд┐рдП рд╡реЗрдмрдкреИрдХ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░ рд░рд╣реЗ рд╣реИрдВ, рддреЛ рдЖрдк рдкрд░реНрдпрд╛рд╡рд░рдг рдкреНрд▓рдЧрдЗрди рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рд░реЗрд╡реЗрди рдХреЛ рдХреЙрдиреНрдлрд╝рд┐рдЧрд░ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдкрд░реНрдпрд╛рд╡рд░рдг рдЪрд░ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╣реИрдВ
https://webpack.js.org/plugins/environment-plugin/
рдЬреИрд╕реЗ
if (process.env.NODE_ENV === 'dev') {
Raven.setShouldSendCallback(() => { return false; });
Raven.isSetup = () => { return true; };
}
Raven
.config(process.env.RAVEN_DSN, {
debug: process.env.RAVEN_DEBUG,
})
.addPlugin(require('raven-js/plugins/angular'), angular)
.install();
isSetup рдЕрдм рдХреЗрд╡рд▓-рдкрдврд╝рдиреЗ рдХреЗ рд▓рд┐рдП рд╣реИ, рдЗрд╕рд▓рд┐рдП рдЙрдкрд░реЛрдХреНрдд рд╡рд┐рдзрд┐ рдЕрдм рдХрд╛рдо рдирд╣реАрдВ рдХрд░рддреА рд╣реИред
рдореБрдЭреЗ рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд рд╡рд░реНрдХрдЕрд░рд╛рдЙрдВрдб рдорд┐рд▓рд╛, рдЬреЛ рдХрд╛рдо рдХрд░рдиреЗ рд▓рдЧрддрд╛ рд╣реИ, рд╣рд╛рд▓рд╛рдБрдХрд┐ рдореБрдЭреЗ рдирд╣реАрдВ рдкрддрд╛ рдХрд┐ рдХреНрдпреЛрдВред
let isProduction = process.env.ENV === 'build'; // variable provided by webpack
Raven
.config('https://<key>@sentry.io/<project>', {
shouldSendCallback: function () {
return isProduction;
}
})
.install();
if (!isProduction) {
Raven.uninstall(); // this is necessary! for some reason
}
export class RavenErrorHandler implements ErrorHandler {
handleError(err: any): void {
console.error(err); // this still fires after uninstalling!!! it's because it's already listed as Angular provider
Raven.captureException(err)
}
}
рдпрд╣ рдЕрднреА рднреА рдПрдХ рднрдпрд╛рдирдХ рд╕рдорд╛рдзрд╛рди рд╣реИ рдХреНрдпреЛрдВрдХрд┐ рдпрд╣ рдореЗрд░реА рд╕рднреА рддреНрд░реБрдЯрд┐рдпреЛрдВ рдХреЛ рд╣рд╛рдИрдЬреИрдХ рдХрд░ рд▓реЗрддрд╛ рд╣реИ рдЗрд╕рд▓рд┐рдП рдореБрдЭреЗ рдирд╣реАрдВ рдкрддрд╛ рдХрд┐ рдЙрдиреНрд╣реЗрдВ рдХрд┐рд╕ рд▓рд╛рдЗрди рд╕реЗ рдлреЗрдВрдХрд╛ рдЧрдпрд╛ рдерд╛ред рдХрдо рд╕реЗ рдХрдо рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдпрд╣ рдЙрддрдирд╛ рднрдпрд╛рдирдХ рдирд╣реАрдВ рд╣реИ рдЬрд┐рддрдирд╛ рдХрд┐ рдЙрдиреНрд╣реЗрдВ рдмрд┐рд▓реНрдХреБрд▓ рдирд╣реАрдВ рджреЗрдЦрдирд╛ред
рдореИрдВрдиреЗ рдЗрд╕ рддрд░рд╣ рдЗрд╕реНрддреЗрдорд╛рд▓ рдХрд┐рдпрд╛ рд╣реИред рдРрд╕рд╛ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдореЗрд░реЗ рд▓рд┐рдП рдХрд╛рдо рдХрд░ рд░рд╣рд╛ рд╣реИ
`рдЕрдЧрд░ (рдкрд░реНрдпрд╛рд╡рд░рдг.рдЙрддреНрдкрд╛рджрди) {
рд░реЗрд╡реЗрди.рдХреЙрдиреНрдлрд┐рдЧ ('https://
редрдЗрдВрд╕реНрдЯреЙрд▓();
}
рдФрд░ рдкреНрд░рджрд╛рддрд╛рдУрдВ рдореЗрдВ
рдкреНрд░рджрд╛рддрд╛: [environment.production? {рдкреНрд░рджрд╛рди рдХрд░реЗрдВ: рдПрд░рд░рд╣реИрдВрдбрд▓рд░, рдпреВрдЬрдХреНрд▓рд╛рд╕: рд░реЗрд╡реЗрдирдПрд░рд░рд╣реИрдВрдбрд▓рд░}: [], ...`
рдХреГрдкрдпрд╛ рдореБрдЭреЗ рдмрддрд╛рдПрдВ рдХрд┐ рдХреНрдпрд╛ рдореИрдВ рдпрд╣рд╛рдВ рдХреБрдЫ рдЧрд▓рдд рдХрд░ рд░рд╣рд╛ рд╣реВрдВред
рдореБрдЭреЗ рдареАрдХ рд▓рдЧ рд░рд╣рд╛ рд╣реИред рдЬрд╛рд╣рд┐рд░ рд╣реИ, рдореВрд▓ рдореБрджреНрджреЗ рдХрд╛ рдЙрддреНрддрд░ рдпрд╣рд╛рдВ рдкрд╣рд▓реЗ рд╣реА рджрд┐рдпрд╛ рдЬрд╛ рдЪреБрдХрд╛ рд╣реИ, рдЗрд╕рд▓рд┐рдП рдЗрд╕реЗ рдмрдВрдж рдХрд░рдирд╛ред рдЕрдЧрд░ рдпрд╣ рдЕрднреА рднреА рдХрд┐рд╕реА рднреА рддрд░рд╣ рд╕реЗ рдкреНрд░рд╛рд╕рдВрдЧрд┐рдХ рд╣реИ рддреЛ рдлрд┐рд░ рд╕реЗ рдЦреЛрд▓рдиреЗ рдХреЗ рд▓рд┐рдП рд╕реНрд╡рддрдВрддреНрд░ рдорд╣рд╕реВрд╕ рдХрд░реЗрдВред
'app.module.ts' рдкрд░ рдЕрдзрд┐рдХ рдЖрд╕рд╛рди
import {environment} from '../environments/environment';
...
providers: [
LocalStorageService,
EventLocalStorageService,
EventService,
ActionButtonService,
WeatherUndergroundWeatherService,
GeoLocationInfoService,
AppEventColorService,
// {provide: ErrorHandler, useClass: RavenErrorHandler}
{provide: ErrorHandler, useClass: environment.production ? RavenErrorHandler : ErrorHandler} // See here
],
рддрдерд╛
.config('key', {
shouldSendCallback: function () {
return environment.production;
}
})
.install();
рдЗрд╕ рддрд░рд╣ рдЖрдкрдХреЗ рдХрдВрд╕реЛрд▓ рдореЗрдВ рд╕реНрдерд╛рдиреАрдп рджреЗрд╡ рд╕рдВрджреЗрд╢ рд╣реИрдВ (рдЕрдиреНрдпрдерд╛ рд╕рдВрддрд░реА рдХреБрдЫ рдкрдХрдбрд╝ рд▓реЗрддрд╛ рд╣реИ) рдФрд░ рдЙрддреНрдкрд╛рджрди рдореЗрдВ рдЖрдкрдХреЛ рд╡рд╣ рдорд┐рд▓рддрд╛ рд╣реИ рдЬреЛ рдЖрдк рдЪрд╛рд╣рддреЗ рд╣реИрдВ
рдХрдо рд╕реЗ рдХрдо рдХреНрд░реЛрдо рдореЗрдВ (рдЕрдиреНрдп рдмреНрд░рд╛рдЙрдЬрд╝рд░реЛрдВ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдирд┐рд╢реНрдЪрд┐рдд рдирд╣реАрдВ), рд░реЗрд╡реЗрди рдХреЛ рджреЗрд╡ рдХрдВрд╕реЛрд▓ рдХреЛ "рдЕрдкрд╣рд░рдг" рд╕реЗ рд░реЛрдХрдиреЗ рдХрд╛ рдПрдХ рдФрд░ рддрд░реАрдХрд╛ рд╣реИ рдмреНрд▓реИрдХрдмреЙрдХреНрд╕ raven.js
:
https://gist.github.com/paulirish/c307a5a585ddbcc17242
https://developer.chrome.com/devtools/docs/blackboxing
рдФрд░ рд╕рдВрддрд░реА рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдХреНрдпрд╛? рдореИрдВ рд░реЗрд╡реЗрди рдХрд╛ рдЙрдкрдпреЛрдЧ рдирд╣реАрдВ рдХрд░рддрд╛, рдореЗрд░реЗ рдкрд╛рд╕ рд╕рдВрддрд░реА рд╣реИ рдФрд░ рдореИрдВ рдЗрд╕реЗ рдЕрдкрдиреЗ рд╕реНрдерд╛рдиреАрдпрд╣реЛрд╕реНрдЯ рдкрд░ рд╡рд┐рдХрд╛рд╕ рдкрд░реНрдпрд╛рд╡рд░рдг рдкрд░ рдЕрдХреНрд╖рдо рдХрд░рдирд╛ рдЪрд╛рд╣рддрд╛ рд╣реВрдВред
https://dev.to/angular/tracking-errors-in-angular-with-sentry-4oo0 тАФ рдпрд╣рд╛рдБ рдпрд╣ рд╣реИ
@artuska рдЖрдк рдпрд╛ рддреЛ рдЦрд╛рд▓реА beforeSend
рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред
Sentry.init({
dsn: process.env.development ? '' : 'your-real-dsn'
})
рдпрд╛
Sentry.init({
dsn: 'your-real-dsn',
beforeSend(event) {
if (process.env.development) return null;
return event;
}
})
рдореБрдЭреЗ рдирд╣реАрдВ рд▓рдЧрддрд╛ рдХрд┐ рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рд╕рдВрддрд░реА рдХреЛ рдЕрдХреНрд╖рдо рдХрд░рддрд╛ рд╣реИред рднреЗрдЬрдиреЗ рд╕реЗ рддреЛ рдмрд╕ рд░реБрдХ рдЬрд╛рддрд╛ рд╣реИ
рдЖрдВрдХрдбрд╝реЗред рдлрд┐рд░ рднреА рдмреНрд░реЗрдбрдХреНрд░рдВрдм рдЬреНрдпрд╛рджрд╛рддрд░ рдореБрджреНрджреЛрдВ рдХреЛ рд▓рдкреЗрдЯрддрд╛ рд╣реИ рдЬреЛ рдмреЗрдХрд╛рд░ рд╣реИ
рд╕реЛрдо, 9 рджрд┐рд╕рдВрдмрд░, 2019 рдХреЛ рд╕реБрдмрд╣ 10:15 рдмрдЬреЗ рдХрд╛рдорд┐рд▓ рдУрдЧреЛрд░реЗрдХ рд╕реВрдЪрдирд╛рдПрдВ @github.com
рд▓рд┐рдЦрд╛ рдерд╛:
@artuska https://github.com/artuska рдЖрдк рдпрд╛ рддреЛ рдЦрд╛рд▓реА DSN рдкреНрд░рджрд╛рди рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ рдпрд╛
рдкрд░рд┐рд╡рд╣рди рдХреЛ рд░реЛрдХрдиреЗ рдХреЗ рд▓рд┐рдП рдкрд╣рд▓реЗ рднреЗрдЬреЗрдВ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░реЗрдВредрд╕рдВрддрд░реА.рдЗрдирд┐рдЯ({
рдбреАрдПрд╕рдПрди: рдкреНрд░рдХреНрд░рд┐рдпрд╛.env.рд╡рд┐рдХрд╛рд╕? '' : 'рдЖрдкрдХрд╛-рд╡рд╛рд╕реНрддрд╡рд┐рдХ-рдбреАрдПрд╕рдПрди'
})рдпрд╛
рд╕рдВрддрд░реА.рдЗрдирд┐рдЯ({
рдбреАрдПрд╕рдПрди: 'рдЖрдкрдХрд╛-рд╡рд╛рд╕реНрддрд╡рд┐рдХ-рдбреАрдПрд╕рдПрди',
рдкрд╣рд▓реЗ рднреЗрдЬреЗрдВ (рдШрдЯрдирд╛) {
рдЕрдЧрд░ (рдкреНрд░реЛрд╕реЗрд╕.рдПрдирд╡реА.рдбреЗрд╡рд▓рдкрдореЗрдВрдЯ) рд░рд┐рдЯрд░реНрди рдЕрд╢рдХреНрдд рд╣реИ;
рд╡рд╛рдкрд╕реА рдХреА рдШрдЯрдирд╛;
}
})-
рдЖрдк рдЗрд╕реЗ рдкреНрд░рд╛рдкреНрдд рдХрд░ рд░рд╣реЗ рд╣реИрдВ рдХреНрдпреЛрдВрдХрд┐ рдЖрдкрдиреЗ рдЯрд┐рдкреНрдкрдгреА рдХреА рдереАред
рдЗрд╕ рдИрдореЗрд▓ рдХрд╛ рд╕реАрдзреЗ рдЙрддреНрддрд░ рджреЗрдВ, рдЗрд╕реЗ GitHub рдкрд░ рджреЗрдЦреЗрдВ
https://github.com/getsentry/sentry-javascript/issues/436?email_source=notifications&email_token=AAJVX45ZEIJWZSXZSBQ5ZQLQXYECDA5CNFSM4BW42VRKYY3PNVWWK3TUL52HS4DFVREXG43VMXHJ#TWS76 рдореБрджреНрджрд╛ ,
рдпрд╛ рд╕рджрд╕реНрдпрддрд╛ рд╕рдорд╛рдкреНрдд рдХрд░реЗрдВ
https://github.com/notifications/unsubscribe-auth/AAJVX4YBWA3R6SM63NV5JPDQXYECDANCNFSM4BW42VRA
.
@jimmykane рд╕рд╣реА рд╣реИ, рдЕрдЧрд░ рдЖрдк рд╕рдВрддрд░реА рдХреЛ рдирд┐рд╖реНрдХреНрд░рд┐рдп рдХрд░рдирд╛ рдЪрд╛рд╣рддреЗ рд╣реИрдВ, рддреЛ init
рдХреЙрд▓ рдХрд░реЗрдВ
рд╕рдмрд╕реЗ рдЙрдкрдпреЛрдЧреА рдЯрд┐рдкреНрдкрдгреА
рдореЗрд░рд╛ @benvinegar рд╕реЗ рднреА рдРрд╕рд╛ рд╣реА рдЕрдиреБрд░реЛрдз рдерд╛ рдФрд░ рдЙрдиреНрд╣реЛрдВрдиреЗ рдмрддрд╛рдпрд╛ рдХрд┐ рдЖрдк рдЗрд╕рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ:
рдФрд░ рд╡рд╣ рд░реЗрд╡реЗрди рдХреЛ рд░рд┐рдкреЛрд░реНрдЯрд┐рдВрдЧ рдХрд░рдиреЗ рд╕реЗ рд░реЛрдХреЗрдЧрд╛ред
return
рд╕реНрдерд┐рддрд┐ рдХреЛ TRUE рдкрд░ рд╕реНрд╡рд┐рдЪ рдХрд░реЗрдВ рдФрд░ рдпрд╣ рд░рд┐рдкреЛрд░реНрдЯ рдХрд░рдирд╛ рд╢реБрд░реВ рдХрд░ рджреЗрдЧрд╛ред рдХрдо рд╕реЗ рдХрдо рдореБрдЭреЗ рддреЛ рдпрд╣реА рдмрддрд╛рдпрд╛ рдЧрдпрд╛ рд╣реИред рд╣рдо рддреИрдирд╛рддреА рдХреЗ рд╕рдордп рдмреВрд▓рд┐рдпрди рдХреЛ рдлрд╝реНрд▓рд┐рдк рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдЗрд╕ рдкреНрд▓рд╕ рдПрдХ рдкрд░рд┐рдирд┐рдпреЛрдЬрдиsed
рдХрдорд╛рдВрдб рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХреА рдпреЛрдЬрдирд╛ рдмрдирд╛ рд░рд╣реЗ рд╣реИрдВред