update.ts 2.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115
  1. import { FETCH_COMMIT_URL, FETCH_TAG_URL, StoreKey } from "../constant";
  2. import { api } from "../client/api";
  3. import { getClientConfig } from "../config/client";
  4. import { createPersistStore } from "../utils/store";
  5. const ONE_MINUTE = 60 * 1000;
  6. function formatVersionDate(t: string) {
  7. const d = new Date(+t);
  8. const year = d.getUTCFullYear();
  9. const month = d.getUTCMonth() + 1;
  10. const day = d.getUTCDate();
  11. return [
  12. year.toString(),
  13. month.toString().padStart(2, "0"),
  14. day.toString().padStart(2, "0"),
  15. ].join("");
  16. }
  17. type VersionType = "date" | "tag";
  18. async function getVersion(type: VersionType) {
  19. if (type === "date") {
  20. const data = (await (await fetch(FETCH_COMMIT_URL)).json()) as {
  21. commit: {
  22. author: { name: string; date: string };
  23. };
  24. sha: string;
  25. }[];
  26. const remoteCommitTime = data[0].commit.author.date;
  27. const remoteId = new Date(remoteCommitTime).getTime().toString();
  28. return remoteId;
  29. } else if (type === "tag") {
  30. const data = (await (await fetch(FETCH_TAG_URL)).json()) as {
  31. commit: { sha: string; url: string };
  32. name: string;
  33. }[];
  34. return data.at(0)?.name;
  35. }
  36. }
  37. export const useUpdateStore = createPersistStore(
  38. {
  39. versionType: "tag" as VersionType,
  40. lastUpdate: 0,
  41. version: "unknown",
  42. remoteVersion: "",
  43. used: 0,
  44. subscription: 0,
  45. lastUpdateUsage: 0,
  46. },
  47. (set, get) => ({
  48. formatVersion(version: string) {
  49. if (get().versionType === "date") {
  50. version = formatVersionDate(version);
  51. }
  52. return version;
  53. },
  54. async getLatestVersion(force = false) {
  55. const versionType = get().versionType;
  56. let version =
  57. versionType === "date"
  58. ? getClientConfig()?.commitDate
  59. : getClientConfig()?.version;
  60. set(() => ({ version }));
  61. const shouldCheck = Date.now() - get().lastUpdate > 2 * 60 * ONE_MINUTE;
  62. if (!force && !shouldCheck) return;
  63. set(() => ({
  64. lastUpdate: Date.now(),
  65. }));
  66. try {
  67. const remoteId = await getVersion(versionType);
  68. set(() => ({
  69. remoteVersion: remoteId,
  70. }));
  71. console.log("[Got Upstream] ", remoteId);
  72. } catch (error) {
  73. console.error("[Fetch Upstream Commit Id]", error);
  74. }
  75. },
  76. async updateUsage(force = false) {
  77. const overOneMinute = Date.now() - get().lastUpdateUsage >= ONE_MINUTE;
  78. if (!overOneMinute && !force) return;
  79. set(() => ({
  80. lastUpdateUsage: Date.now(),
  81. }));
  82. try {
  83. const usage = await api.llm.usage();
  84. if (usage) {
  85. set(() => ({
  86. used: usage.used,
  87. subscription: usage.total,
  88. }));
  89. }
  90. } catch (e) {
  91. console.error((e as Error).message);
  92. }
  93. },
  94. }),
  95. {
  96. name: StoreKey.Update,
  97. version: 1,
  98. },
  99. );