update.ts 3.2 KB

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