From 3a4992633ee62d5edfbb484d9c6bcb3cf158489d Mon Sep 17 00:00:00 2001 From: Chocobozzz Date: Mon, 31 Jul 2023 14:34:36 +0200 Subject: Migrate server to ESM Sorry for the very big commit that may lead to git log issues and merge conflicts, but it's a major step forward: * Server can be faster at startup because imports() are async and we can easily lazy import big modules * Angular doesn't seem to support ES import (with .js extension), so we had to correctly organize peertube into a monorepo: * Use yarn workspace feature * Use typescript reference projects for dependencies * Shared projects have been moved into "packages", each one is now a node module (with a dedicated package.json/tsconfig.json) * server/tools have been moved into apps/ and is now a dedicated app bundled and published on NPM so users don't have to build peertube cli tools manually * server/tests have been moved into packages/ so we don't compile them every time we want to run the server * Use isolatedModule option: * Had to move from const enum to const (https://www.typescriptlang.org/docs/handbook/enums.html#objects-vs-enums) * Had to explictely specify "type" imports when used in decorators * Prefer tsx (that uses esbuild under the hood) instead of ts-node to load typescript files (tests with mocha or scripts): * To reduce test complexity as esbuild doesn't support decorator metadata, we only test server files that do not import server models * We still build tests files into js files for a faster CI * Remove unmaintained peertube CLI import script * Removed some barrels to speed up execution (less imports) --- server/lib/stat-manager.ts | 182 --------------------------------------------- 1 file changed, 182 deletions(-) delete mode 100644 server/lib/stat-manager.ts (limited to 'server/lib/stat-manager.ts') diff --git a/server/lib/stat-manager.ts b/server/lib/stat-manager.ts deleted file mode 100644 index 0516e7f1a..000000000 --- a/server/lib/stat-manager.ts +++ /dev/null @@ -1,182 +0,0 @@ -import { mapSeries } from 'bluebird' -import { CONFIG } from '@server/initializers/config' -import { ActorFollowModel } from '@server/models/actor/actor-follow' -import { VideoRedundancyModel } from '@server/models/redundancy/video-redundancy' -import { UserModel } from '@server/models/user/user' -import { VideoModel } from '@server/models/video/video' -import { VideoChannelModel } from '@server/models/video/video-channel' -import { VideoCommentModel } from '@server/models/video/video-comment' -import { VideoFileModel } from '@server/models/video/video-file' -import { VideoPlaylistModel } from '@server/models/video/video-playlist' -import { ActivityType, ServerStats, VideoRedundancyStrategyWithManual } from '@shared/models' - -class StatsManager { - - private static instance: StatsManager - - private readonly instanceStartDate = new Date() - - private readonly inboxMessages = { - processed: 0, - errors: 0, - successes: 0, - waiting: 0, - errorsPerType: this.buildAPPerType(), - successesPerType: this.buildAPPerType() - } - - private constructor () {} - - updateInboxWaiting (inboxMessagesWaiting: number) { - this.inboxMessages.waiting = inboxMessagesWaiting - } - - addInboxProcessedSuccess (type: ActivityType) { - this.inboxMessages.processed++ - this.inboxMessages.successes++ - this.inboxMessages.successesPerType[type]++ - } - - addInboxProcessedError (type: ActivityType) { - this.inboxMessages.processed++ - this.inboxMessages.errors++ - this.inboxMessages.errorsPerType[type]++ - } - - async getStats () { - const { totalLocalVideos, totalLocalVideoViews, totalVideos } = await VideoModel.getStats() - const { totalLocalVideoComments, totalVideoComments } = await VideoCommentModel.getStats() - const { totalUsers, totalDailyActiveUsers, totalWeeklyActiveUsers, totalMonthlyActiveUsers } = await UserModel.getStats() - const { totalInstanceFollowers, totalInstanceFollowing } = await ActorFollowModel.getStats() - const { totalLocalVideoFilesSize } = await VideoFileModel.getStats() - const { - totalLocalVideoChannels, - totalLocalDailyActiveVideoChannels, - totalLocalWeeklyActiveVideoChannels, - totalLocalMonthlyActiveVideoChannels - } = await VideoChannelModel.getStats() - const { totalLocalPlaylists } = await VideoPlaylistModel.getStats() - - const videosRedundancyStats = await this.buildRedundancyStats() - - const data: ServerStats = { - totalUsers, - totalDailyActiveUsers, - totalWeeklyActiveUsers, - totalMonthlyActiveUsers, - - totalLocalVideos, - totalLocalVideoViews, - totalLocalVideoComments, - totalLocalVideoFilesSize, - - totalVideos, - totalVideoComments, - - totalLocalVideoChannels, - totalLocalDailyActiveVideoChannels, - totalLocalWeeklyActiveVideoChannels, - totalLocalMonthlyActiveVideoChannels, - - totalLocalPlaylists, - - totalInstanceFollowers, - totalInstanceFollowing, - - videosRedundancy: videosRedundancyStats, - - ...this.buildAPStats() - } - - return data - } - - private buildActivityPubMessagesProcessedPerSecond () { - const now = new Date() - const startedSeconds = (now.getTime() - this.instanceStartDate.getTime()) / 1000 - - return this.inboxMessages.processed / startedSeconds - } - - private buildRedundancyStats () { - const strategies = CONFIG.REDUNDANCY.VIDEOS.STRATEGIES - .map(r => ({ - strategy: r.strategy as VideoRedundancyStrategyWithManual, - size: r.size - })) - - strategies.push({ strategy: 'manual', size: null }) - - return mapSeries(strategies, r => { - return VideoRedundancyModel.getStats(r.strategy) - .then(stats => Object.assign(stats, { strategy: r.strategy, totalSize: r.size })) - }) - } - - private buildAPPerType () { - return { - Create: 0, - Update: 0, - Delete: 0, - Follow: 0, - Accept: 0, - Reject: 0, - Announce: 0, - Undo: 0, - Like: 0, - Dislike: 0, - Flag: 0, - View: 0 - } - } - - private buildAPStats () { - return { - totalActivityPubMessagesProcessed: this.inboxMessages.processed, - - totalActivityPubMessagesSuccesses: this.inboxMessages.successes, - - // Dirty, but simpler and with type checking - totalActivityPubCreateMessagesSuccesses: this.inboxMessages.successesPerType.Create, - totalActivityPubUpdateMessagesSuccesses: this.inboxMessages.successesPerType.Update, - totalActivityPubDeleteMessagesSuccesses: this.inboxMessages.successesPerType.Delete, - totalActivityPubFollowMessagesSuccesses: this.inboxMessages.successesPerType.Follow, - totalActivityPubAcceptMessagesSuccesses: this.inboxMessages.successesPerType.Accept, - totalActivityPubRejectMessagesSuccesses: this.inboxMessages.successesPerType.Reject, - totalActivityPubAnnounceMessagesSuccesses: this.inboxMessages.successesPerType.Announce, - totalActivityPubUndoMessagesSuccesses: this.inboxMessages.successesPerType.Undo, - totalActivityPubLikeMessagesSuccesses: this.inboxMessages.successesPerType.Like, - totalActivityPubDislikeMessagesSuccesses: this.inboxMessages.successesPerType.Dislike, - totalActivityPubFlagMessagesSuccesses: this.inboxMessages.successesPerType.Flag, - totalActivityPubViewMessagesSuccesses: this.inboxMessages.successesPerType.View, - - totalActivityPubCreateMessagesErrors: this.inboxMessages.errorsPerType.Create, - totalActivityPubUpdateMessagesErrors: this.inboxMessages.errorsPerType.Update, - totalActivityPubDeleteMessagesErrors: this.inboxMessages.errorsPerType.Delete, - totalActivityPubFollowMessagesErrors: this.inboxMessages.errorsPerType.Follow, - totalActivityPubAcceptMessagesErrors: this.inboxMessages.errorsPerType.Accept, - totalActivityPubRejectMessagesErrors: this.inboxMessages.errorsPerType.Reject, - totalActivityPubAnnounceMessagesErrors: this.inboxMessages.errorsPerType.Announce, - totalActivityPubUndoMessagesErrors: this.inboxMessages.errorsPerType.Undo, - totalActivityPubLikeMessagesErrors: this.inboxMessages.errorsPerType.Like, - totalActivityPubDislikeMessagesErrors: this.inboxMessages.errorsPerType.Dislike, - totalActivityPubFlagMessagesErrors: this.inboxMessages.errorsPerType.Flag, - totalActivityPubViewMessagesErrors: this.inboxMessages.errorsPerType.View, - - totalActivityPubMessagesErrors: this.inboxMessages.errors, - - activityPubMessagesProcessedPerSecond: this.buildActivityPubMessagesProcessedPerSecond(), - totalActivityPubMessagesWaiting: this.inboxMessages.waiting - } - } - - static get Instance () { - return this.instance || (this.instance = new this()) - } -} - -// --------------------------------------------------------------------------- - -export { - StatsManager -} -- cgit v1.2.3