From ceca260c922f40318279cf2871da3a8f718ae4df Mon Sep 17 00:00:00 2001 From: naskya Date: Sun, 14 Apr 2024 14:53:25 +0900 Subject: [PATCH] refactor (backend): port convert-milliseconds to backend-rs --- packages/backend-rs/index.d.ts | 2 + packages/backend-rs/index.js | 3 +- .../src/misc/format_milliseconds.rs | 46 +++++++++++++++++++ packages/backend-rs/src/misc/mod.rs | 1 + .../backend/src/misc/convert-milliseconds.ts | 17 ------- packages/backend/src/server/api/limiter.ts | 4 +- 6 files changed, 53 insertions(+), 20 deletions(-) create mode 100644 packages/backend-rs/src/misc/format_milliseconds.rs delete mode 100644 packages/backend/src/misc/convert-milliseconds.ts diff --git a/packages/backend-rs/index.d.ts b/packages/backend-rs/index.d.ts index f2830dcac3..d3bb13164a 100644 --- a/packages/backend-rs/index.d.ts +++ b/packages/backend-rs/index.d.ts @@ -132,6 +132,8 @@ export function isSelfHost(host?: string | undefined | null): boolean export function isSameOrigin(uri: string): boolean export function extractHost(uri: string): string export function toPuny(host: string): string +/** Convert milliseconds to a human readable string */ +export function formatMilliseconds(milliseconds: number): string export function toMastodonId(firefishId: string): string | null export function fromMastodonId(mastodonId: string): string | null export function nyaify(text: string, lang?: string | undefined | null): string diff --git a/packages/backend-rs/index.js b/packages/backend-rs/index.js index af9a293bbb..6fbfe9414d 100644 --- a/packages/backend-rs/index.js +++ b/packages/backend-rs/index.js @@ -310,7 +310,7 @@ if (!nativeBinding) { throw new Error(`Failed to load native binding`) } -const { readServerConfig, stringToAcct, acctToString, checkWordMute, getFullApAccount, isSelfHost, isSameOrigin, extractHost, toPuny, toMastodonId, fromMastodonId, nyaify, hashPassword, verifyPassword, isOldPasswordAlgorithm, AntennaSrcEnum, MutedNoteReasonEnum, NoteVisibilityEnum, NotificationTypeEnum, PageVisibilityEnum, PollNotevisibilityEnum, RelayStatusEnum, UserEmojimodpermEnum, UserProfileFfvisibilityEnum, UserProfileMutingnotificationtypesEnum, initIdGenerator, getTimestamp, genId, secureRndstr } = nativeBinding +const { readServerConfig, stringToAcct, acctToString, checkWordMute, getFullApAccount, isSelfHost, isSameOrigin, extractHost, toPuny, formatMilliseconds, toMastodonId, fromMastodonId, nyaify, hashPassword, verifyPassword, isOldPasswordAlgorithm, AntennaSrcEnum, MutedNoteReasonEnum, NoteVisibilityEnum, NotificationTypeEnum, PageVisibilityEnum, PollNotevisibilityEnum, RelayStatusEnum, UserEmojimodpermEnum, UserProfileFfvisibilityEnum, UserProfileMutingnotificationtypesEnum, initIdGenerator, getTimestamp, genId, secureRndstr } = nativeBinding module.exports.readServerConfig = readServerConfig module.exports.stringToAcct = stringToAcct @@ -321,6 +321,7 @@ module.exports.isSelfHost = isSelfHost module.exports.isSameOrigin = isSameOrigin module.exports.extractHost = extractHost module.exports.toPuny = toPuny +module.exports.formatMilliseconds = formatMilliseconds module.exports.toMastodonId = toMastodonId module.exports.fromMastodonId = fromMastodonId module.exports.nyaify = nyaify diff --git a/packages/backend-rs/src/misc/format_milliseconds.rs b/packages/backend-rs/src/misc/format_milliseconds.rs new file mode 100644 index 0000000000..dfa8df6f62 --- /dev/null +++ b/packages/backend-rs/src/misc/format_milliseconds.rs @@ -0,0 +1,46 @@ +/// Convert milliseconds to a human readable string +#[crate::export] +pub fn format_milliseconds(milliseconds: u32) -> String { + let mut seconds = milliseconds / 1000; + let mut minutes = seconds / 60; + let mut hours = minutes / 60; + let days = hours / 24; + + seconds %= 60; + minutes %= 60; + hours %= 24; + + let mut buf: Vec = vec![]; + + if days > 0 { + buf.push(format!("{} day(s)", days)); + } + if hours > 0 { + buf.push(format!("{} hour(s)", hours)); + } + if minutes > 0 { + buf.push(format!("{} minute(s)", minutes)); + } + if seconds > 0 { + buf.push(format!("{} second(s)", seconds)); + } + + buf.join(", ") +} + +#[cfg(test)] +mod unit_test { + use super::format_milliseconds; + use pretty_assertions::assert_eq; + + #[test] + fn format_milliseconds_test() { + assert_eq!(format_milliseconds(1000), "1 second(s)"); + assert_eq!(format_milliseconds(1387938), "23 minute(s), 7 second(s)"); + assert_eq!(format_milliseconds(34200457), "9 hour(s), 30 minute(s)"); + assert_eq!( + format_milliseconds(998244353), + "11 day(s), 13 hour(s), 17 minute(s), 24 second(s)" + ); + } +} diff --git a/packages/backend-rs/src/misc/mod.rs b/packages/backend-rs/src/misc/mod.rs index 6eda4e449e..d5a84e56a1 100644 --- a/packages/backend-rs/src/misc/mod.rs +++ b/packages/backend-rs/src/misc/mod.rs @@ -1,6 +1,7 @@ pub mod acct; pub mod check_word_mute; pub mod convert_host; +pub mod format_milliseconds; pub mod mastodon_id; pub mod nyaify; pub mod password; diff --git a/packages/backend/src/misc/convert-milliseconds.ts b/packages/backend/src/misc/convert-milliseconds.ts deleted file mode 100644 index d8c163ffda..0000000000 --- a/packages/backend/src/misc/convert-milliseconds.ts +++ /dev/null @@ -1,17 +0,0 @@ -export function convertMilliseconds(ms: number) { - let seconds = Math.round(ms / 1000); - let minutes = Math.round(seconds / 60); - let hours = Math.round(minutes / 60); - const days = Math.round(hours / 24); - seconds %= 60; - minutes %= 60; - hours %= 24; - - const result = []; - if (days > 0) result.push(`${days} day(s)`); - if (hours > 0) result.push(`${hours} hour(s)`); - if (minutes > 0) result.push(`${minutes} minute(s)`); - if (seconds > 0) result.push(`${seconds} second(s)`); - - return result.join(", "); -} diff --git a/packages/backend/src/server/api/limiter.ts b/packages/backend/src/server/api/limiter.ts index f03f8754cf..d4a9353ade 100644 --- a/packages/backend/src/server/api/limiter.ts +++ b/packages/backend/src/server/api/limiter.ts @@ -2,7 +2,7 @@ import Limiter from "ratelimiter"; import Logger from "@/services/logger.js"; import { redisClient } from "@/db/redis.js"; import type { IEndpointMeta } from "./endpoints.js"; -import { convertMilliseconds } from "@/misc/convert-milliseconds.js"; +import { formatMilliseconds } from "backend-rs"; const logger = new Logger("limiter"); @@ -78,7 +78,7 @@ export const limiter = ( if (info.remaining === 0) { reject({ message: "RATE_LIMIT_EXCEEDED", - remainingTime: convertMilliseconds(info.resetMs - Date.now()), + remainingTime: formatMilliseconds(info.resetMs - Date.now()), }); } else { ok();