anr.js 1.7 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273
  1. import { dropUndefinedKeys } from './object.js';
  2. import { filenameIsInApp } from './node-stack-trace.js';
  3. /**
  4. * A node.js watchdog timer
  5. * @param pollInterval The interval that we expect to get polled at
  6. * @param anrThreshold The threshold for when we consider ANR
  7. * @param callback The callback to call for ANR
  8. * @returns An object with `poll` and `enabled` functions {@link WatchdogReturn}
  9. */
  10. function watchdogTimer(
  11. createTimer,
  12. pollInterval,
  13. anrThreshold,
  14. callback,
  15. ) {
  16. const timer = createTimer();
  17. let triggered = false;
  18. let enabled = true;
  19. setInterval(() => {
  20. const diffMs = timer.getTimeMs();
  21. if (triggered === false && diffMs > pollInterval + anrThreshold) {
  22. triggered = true;
  23. if (enabled) {
  24. callback();
  25. }
  26. }
  27. if (diffMs < pollInterval + anrThreshold) {
  28. triggered = false;
  29. }
  30. }, 20);
  31. return {
  32. poll: () => {
  33. timer.reset();
  34. },
  35. enabled: (state) => {
  36. enabled = state;
  37. },
  38. };
  39. }
  40. // types copied from inspector.d.ts
  41. /**
  42. * Converts Debugger.CallFrame to Sentry StackFrame
  43. */
  44. function callFrameToStackFrame(
  45. frame,
  46. url,
  47. getModuleFromFilename,
  48. ) {
  49. const filename = url ? url.replace(/^file:\/\//, '') : undefined;
  50. // CallFrame row/col are 0 based, whereas StackFrame are 1 based
  51. const colno = frame.location.columnNumber ? frame.location.columnNumber + 1 : undefined;
  52. const lineno = frame.location.lineNumber ? frame.location.lineNumber + 1 : undefined;
  53. return dropUndefinedKeys({
  54. filename,
  55. module: getModuleFromFilename(filename),
  56. function: frame.functionName || '?',
  57. colno,
  58. lineno,
  59. in_app: filename ? filenameIsInApp(filename) : undefined,
  60. });
  61. }
  62. export { callFrameToStackFrame, watchdogTimer };
  63. //# sourceMappingURL=anr.js.map