rails-profiler 0.10.1 → 0.11.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: 20025b12e3ae03c1814148f47ae152c639bb6512d43660eda538b37c4924ec40
4
- data.tar.gz: 99c09a40a20ea03c41621743ab8fa73169c6512cdc8939baa7fd6a7ac55b4d8b
3
+ metadata.gz: 5f02d90b7d6f03504d5aa8412b3f4a3c1fc3064152057489514981daeba18307
4
+ data.tar.gz: bbf33083a998d3e9ac918ba7600522799bea7006c54fe66f020ea98465e7b086
5
5
  SHA512:
6
- metadata.gz: dacb466a09c8fa9ff6eb415a109cfbff3e44a17c1b91da5ac2d708ba1d712d0b5b887548ddc9126d11f3f5cc9304361ab74ecb269b06d2e068c160ef73d91746
7
- data.tar.gz: 803616c41249b1c8e17dd490cc27dcd166cbe4a50821e8e346cf44d68b9acb9472e98d105e0957f4b65a5a0a640fa6f20babdfcedfd866e37cce7852da606f43
6
+ metadata.gz: 4b92adb363521979754c08a7304e0559d8221c5541c706d45d2aea01cb9a52bc7893b00847fe741e854551b74fbf6ea02ff9a641893fa5005f7c93953715059b
7
+ data.tar.gz: b5a00222dee6d68456211b346210573c1781cb42cc6c196a0ade5b0c05e2fc04c86abc4f58a2dd2ee42bf21be7f99ed1a0ef5c2e320bf82642dfa0f563a09bd5
@@ -430,6 +430,12 @@ table a {
430
430
  color: #fff;
431
431
  }
432
432
 
433
+ .profiler-load-more {
434
+ display: flex;
435
+ justify-content: center;
436
+ padding: var(--profiler-space-4) 0 var(--profiler-space-2);
437
+ }
438
+
433
439
  .token-copy {
434
440
  background: none;
435
441
  border: none;
@@ -740,7 +740,13 @@
740
740
  };
741
741
  const [section, setSection] = d2(initialSection);
742
742
  const [profiles, setProfiles] = d2([]);
743
+ const [httpOffset, setHttpOffset] = d2(0);
744
+ const [httpHasMore, setHttpHasMore] = d2(false);
745
+ const [httpLoadingMore, setHttpLoadingMore] = d2(false);
743
746
  const [jobs, setJobs] = d2([]);
747
+ const [jobOffset, setJobOffset] = d2(0);
748
+ const [jobHasMore, setJobHasMore] = d2(false);
749
+ const [jobLoadingMore, setJobLoadingMore] = d2(false);
744
750
  const [outboundRequests, setOutboundRequests] = d2([]);
745
751
  const [loadingHttp, setLoadingHttp] = d2(true);
746
752
  const [loadingJobs, setLoadingJobs] = d2(false);
@@ -767,8 +773,10 @@
767
773
  const [outboundMethod, setOutboundMethod] = d2("");
768
774
  const [outboundStatus, setOutboundStatus] = d2("");
769
775
  y2(() => {
770
- fetch(`${BASE}/api/profiles`).then((res) => res.json()).then((data) => {
771
- setProfiles(data.filter((p3) => p3.profile_type !== "job"));
776
+ fetch(`${BASE}/api/profiles?limit=50&offset=0`).then((res) => res.json()).then((data) => {
777
+ setProfiles(data.profiles);
778
+ setHttpOffset(data.profiles.length);
779
+ setHttpHasMore(data.has_more);
772
780
  setLoadingHttp(false);
773
781
  }).catch(() => {
774
782
  setError("Failed to load profiles");
@@ -803,11 +811,22 @@
803
811
  const togglePreset = (key) => {
804
812
  setHttpPreset((prev) => prev === key ? "" : key);
805
813
  };
814
+ const loadMoreHttp = () => {
815
+ setHttpLoadingMore(true);
816
+ fetch(`${BASE}/api/profiles?limit=50&offset=${httpOffset}`).then((res) => res.json()).then((data) => {
817
+ setProfiles((prev) => [...prev, ...data.profiles]);
818
+ setHttpOffset((prev) => prev + data.profiles.length);
819
+ setHttpHasMore(data.has_more);
820
+ setHttpLoadingMore(false);
821
+ }).catch(() => setHttpLoadingMore(false));
822
+ };
806
823
  const loadJobs = () => {
807
824
  if (jobsLoaded) return;
808
825
  setLoadingJobs(true);
809
- fetch(`${BASE}/api/jobs`).then((res) => res.json()).then((data) => {
810
- setJobs(data);
826
+ fetch(`${BASE}/api/jobs?limit=50&offset=0`).then((res) => res.json()).then((data) => {
827
+ setJobs(data.profiles);
828
+ setJobOffset(data.profiles.length);
829
+ setJobHasMore(data.has_more);
811
830
  setLoadingJobs(false);
812
831
  setJobsLoaded(true);
813
832
  }).catch(() => {
@@ -816,6 +835,15 @@
816
835
  setJobsLoaded(true);
817
836
  });
818
837
  };
838
+ const loadMoreJobs = () => {
839
+ setJobLoadingMore(true);
840
+ fetch(`${BASE}/api/jobs?limit=50&offset=${jobOffset}`).then((res) => res.json()).then((data) => {
841
+ setJobs((prev) => [...prev, ...data.profiles]);
842
+ setJobOffset((prev) => prev + data.profiles.length);
843
+ setJobHasMore(data.has_more);
844
+ setJobLoadingMore(false);
845
+ }).catch(() => setJobLoadingMore(false));
846
+ };
819
847
  const loadOutbound = () => {
820
848
  if (outboundLoaded) return;
821
849
  setLoadingOutbound(true);
@@ -878,8 +906,10 @@
878
906
  const refresh = () => {
879
907
  if (section === "http") {
880
908
  setLoadingHttp(true);
881
- fetch(`${BASE}/api/profiles`).then((res) => res.json()).then((data) => {
882
- setProfiles(data.filter((p3) => p3.profile_type !== "job"));
909
+ fetch(`${BASE}/api/profiles?limit=50&offset=0`).then((res) => res.json()).then((data) => {
910
+ setProfiles(data.profiles);
911
+ setHttpOffset(data.profiles.length);
912
+ setHttpHasMore(data.has_more);
883
913
  setLoadingHttp(false);
884
914
  }).catch(() => {
885
915
  setError("Failed to load profiles");
@@ -887,8 +917,10 @@
887
917
  });
888
918
  } else if (section === "jobs") {
889
919
  setLoadingJobs(true);
890
- fetch(`${BASE}/api/jobs`).then((res) => res.json()).then((data) => {
891
- setJobs(data);
920
+ fetch(`${BASE}/api/jobs?limit=50&offset=0`).then((res) => res.json()).then((data) => {
921
+ setJobs(data.profiles);
922
+ setJobOffset(data.profiles.length);
923
+ setJobHasMore(data.has_more);
892
924
  setLoadingJobs(false);
893
925
  }).catch(() => {
894
926
  setJobsError("Failed to load job profiles");
@@ -1094,7 +1126,8 @@
1094
1126
  /* @__PURE__ */ u3("td", { class: "profiler-text--xs profiler-text--mono profiler-text--muted", children: /* @__PURE__ */ u3("button", { class: "token-copy", onClick: () => copyToken(p3.token), title: "Copy full token", children: copiedToken === p3.token ? "\u2713" : p3.token.substring(0, 8) + "\u2026" }) }),
1095
1127
  /* @__PURE__ */ u3("td", { children: /* @__PURE__ */ u3("button", { class: "btn-row-delete", onClick: () => deleteProfile(p3.token), title: "Delete", children: "\xD7" }) })
1096
1128
  ] }, p3.token)) })
1097
- ] })
1129
+ ] }),
1130
+ httpHasMore && !httpFiltersActive && /* @__PURE__ */ u3("div", { class: "profiler-load-more", children: /* @__PURE__ */ u3("button", { class: "btn btn-secondary", onClick: loadMoreHttp, disabled: httpLoadingMore, children: httpLoadingMore ? "Loading\u2026" : "Load more" }) })
1098
1131
  ] })),
1099
1132
  section === "jobs" && (loadingJobs ? /* @__PURE__ */ u3("div", { class: "profiler-empty", children: /* @__PURE__ */ u3("div", { class: "profiler-empty__title", children: "Loading..." }) }) : jobsError ? /* @__PURE__ */ u3("div", { class: "profiler-empty", children: /* @__PURE__ */ u3("div", { class: "profiler-empty__title", children: jobsError }) }) : jobs.length === 0 ? /* @__PURE__ */ u3("div", { class: "profiler-empty", children: [
1100
1133
  /* @__PURE__ */ u3("div", { class: "profiler-empty__title", children: "No job profiles found" }),
@@ -1162,7 +1195,8 @@
1162
1195
  /* @__PURE__ */ u3("td", { children: /* @__PURE__ */ u3("button", { class: "btn-row-delete", onClick: () => deleteJob(p3.token), title: "Delete", children: "\xD7" }) })
1163
1196
  ] }, p3.token);
1164
1197
  }) })
1165
- ] })
1198
+ ] }),
1199
+ jobHasMore && !jobFiltersActive && /* @__PURE__ */ u3("div", { class: "profiler-load-more", children: /* @__PURE__ */ u3("button", { class: "btn btn-secondary", onClick: loadMoreJobs, disabled: jobLoadingMore, children: jobLoadingMore ? "Loading\u2026" : "Load more" }) })
1166
1200
  ] })),
1167
1201
  section === "outbound" && (loadingOutbound ? /* @__PURE__ */ u3("div", { class: "profiler-empty", children: /* @__PURE__ */ u3("div", { class: "profiler-empty__title", children: "Loading..." }) }) : outboundError ? /* @__PURE__ */ u3("div", { class: "profiler-empty", children: /* @__PURE__ */ u3("div", { class: "profiler-empty__title", children: outboundError }) }) : outboundRequests.length === 0 ? /* @__PURE__ */ u3("div", { class: "profiler-empty", children: [
1168
1202
  /* @__PURE__ */ u3("div", { class: "profiler-empty__title", children: "No outbound HTTP requests found" }),
@@ -6,10 +6,17 @@ module Profiler
6
6
  skip_before_action :verify_authenticity_token
7
7
 
8
8
  def index
9
- all_profiles = Profiler.storage.list(limit: (params[:limit] || 200).to_i, offset: (params[:offset] || 0).to_i)
10
- job_profiles = all_profiles.select { |p| p.profile_type == "job" }
11
- job_profiles = job_profiles.first((params[:limit] || 50).to_i)
12
- render json: job_profiles.map(&:to_h)
9
+ limit = (params[:limit] || 50).to_i
10
+ offset = (params[:offset] || 0).to_i
11
+ all = Profiler.storage.list(limit: 1000, offset: 0)
12
+ jobs = all.select { |p| p.profile_type == "job" }
13
+ page = jobs.drop(offset).first(limit + 1)
14
+ render json: {
15
+ profiles: page.first(limit).map(&:to_h),
16
+ limit: limit,
17
+ offset: offset,
18
+ has_more: page.size > limit
19
+ }
13
20
  end
14
21
 
15
22
  def show
@@ -6,8 +6,17 @@ module Profiler
6
6
  skip_before_action :verify_authenticity_token
7
7
 
8
8
  def index
9
- profiles = Profiler.storage.list(limit: params[:limit] || 50, offset: params[:offset] || 0)
10
- render json: profiles.map(&:to_h)
9
+ limit = (params[:limit] || 50).to_i
10
+ offset = (params[:offset] || 0).to_i
11
+ all = Profiler.storage.list(limit: 1000, offset: 0)
12
+ http = all.reject { |p| p.profile_type == "job" }
13
+ page = http.drop(offset).first(limit + 1)
14
+ render json: {
15
+ profiles: page.first(limit).map(&:to_h),
16
+ limit: limit,
17
+ offset: offset,
18
+ has_more: page.size > limit
19
+ }
11
20
  end
12
21
 
13
22
  def show
@@ -1,5 +1,5 @@
1
1
  # frozen_string_literal: true
2
2
 
3
3
  module Profiler
4
- VERSION = "0.10.1"
4
+ VERSION = "0.11.0"
5
5
  end
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: rails-profiler
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.10.1
4
+ version: 0.11.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Sébastien Duplessy