index.js 2.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899
  1. /* This Source Code Form is subject to the terms of the Mozilla Public
  2. * License, v. 2.0. If a copy of the MPL was not distributed with this
  3. * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
  4. "use strict";
  5. const { createSelector } = require("devtools/client/shared/vendor/reselect");
  6. /**
  7. * Gets the total number of bytes representing the cumulated content size of
  8. * a set of requests. Returns 0 for an empty set.
  9. *
  10. * @param {array} items - an array of request items
  11. * @return {number} total bytes of requests
  12. */
  13. function getContentSizeOfRequests(items) {
  14. if (!items.length) {
  15. return 0;
  16. }
  17. let result = 0;
  18. items.forEach((item) => {
  19. let size = item.attachment.contentSize;
  20. result += (typeof size == "number") ? size : 0;
  21. });
  22. return result;
  23. }
  24. function getTransferredSizeOfRequests(items) {
  25. if (!items.length) {
  26. return 0;
  27. }
  28. let result = 0;
  29. items.forEach((item) => {
  30. let size = item.attachment.transferredSize;
  31. result += (typeof size == "number") ? size : 0;
  32. });
  33. return result;
  34. }
  35. /**
  36. * Gets the total milliseconds for all requests. Returns null for an
  37. * empty set.
  38. *
  39. * @param {array} items - an array of request items
  40. * @return {object} total milliseconds for all requests
  41. */
  42. function getMillisOfRequests(items) {
  43. if (!items.length) {
  44. return null;
  45. }
  46. const oldest = items.reduce((prev, curr) =>
  47. prev.attachment.startedMillis < curr.attachment.startedMillis ?
  48. prev : curr);
  49. const newest = items.reduce((prev, curr) =>
  50. prev.attachment.startedMillis > curr.attachment.startedMillis ?
  51. prev : curr);
  52. return newest.attachment.endedMillis - oldest.attachment.startedMillis;
  53. }
  54. const getDisplayedRequestsSummary = createSelector(
  55. (state) => state.requests.items,
  56. (requests) => ({
  57. count: requests.length,
  58. contentSize: getContentSizeOfRequests(requests),
  59. transferredSize: getTransferredSizeOfRequests(requests),
  60. millis: getMillisOfRequests(requests),
  61. })
  62. );
  63. function getDisplayedTimingMarker(state, marker) {
  64. let timingMarker = null;
  65. if (state.timingMarkers) {
  66. timingMarker = state.timingMarkers.get(marker);
  67. }
  68. let firstRequestStartedMillis = null;
  69. if (state.requests.items.length) {
  70. firstRequestStartedMillis = state.requests
  71. .items[state.requests.items.length - 1]
  72. .attachment
  73. .firstRequestStartedMillisNotPersistent;
  74. }
  75. if (timingMarker && firstRequestStartedMillis) {
  76. return timingMarker - firstRequestStartedMillis;
  77. } else {
  78. return -1;
  79. }
  80. }
  81. module.exports = {
  82. getDisplayedRequestsSummary,
  83. getDisplayedTimingMarker,
  84. };