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/activitypub/process/process.ts | 92 ------------------------------- 1 file changed, 92 deletions(-) delete mode 100644 server/lib/activitypub/process/process.ts (limited to 'server/lib/activitypub/process/process.ts') diff --git a/server/lib/activitypub/process/process.ts b/server/lib/activitypub/process/process.ts deleted file mode 100644 index 2bc3dce03..000000000 --- a/server/lib/activitypub/process/process.ts +++ /dev/null @@ -1,92 +0,0 @@ -import { StatsManager } from '@server/lib/stat-manager' -import { Activity, ActivityType } from '../../../../shared/models/activitypub' -import { logger } from '../../../helpers/logger' -import { APProcessorOptions } from '../../../types/activitypub-processor.model' -import { MActorDefault, MActorSignature } from '../../../types/models' -import { getAPId } from '../activity' -import { getOrCreateAPActor } from '../actors' -import { checkUrlsSameHost } from '../url' -import { processAcceptActivity } from './process-accept' -import { processAnnounceActivity } from './process-announce' -import { processCreateActivity } from './process-create' -import { processDeleteActivity } from './process-delete' -import { processDislikeActivity } from './process-dislike' -import { processFlagActivity } from './process-flag' -import { processFollowActivity } from './process-follow' -import { processLikeActivity } from './process-like' -import { processRejectActivity } from './process-reject' -import { processUndoActivity } from './process-undo' -import { processUpdateActivity } from './process-update' -import { processViewActivity } from './process-view' - -const processActivity: { [ P in ActivityType ]: (options: APProcessorOptions) => Promise } = { - Create: processCreateActivity, - Update: processUpdateActivity, - Delete: processDeleteActivity, - Follow: processFollowActivity, - Accept: processAcceptActivity, - Reject: processRejectActivity, - Announce: processAnnounceActivity, - Undo: processUndoActivity, - Like: processLikeActivity, - Dislike: processDislikeActivity, - Flag: processFlagActivity, - View: processViewActivity -} - -async function processActivities ( - activities: Activity[], - options: { - signatureActor?: MActorSignature - inboxActor?: MActorDefault - outboxUrl?: string - fromFetch?: boolean - } = {} -) { - const { outboxUrl, signatureActor, inboxActor, fromFetch = false } = options - - const actorsCache: { [ url: string ]: MActorSignature } = {} - - for (const activity of activities) { - if (!signatureActor && [ 'Create', 'Announce', 'Like' ].includes(activity.type) === false) { - logger.error('Cannot process activity %s (type: %s) without the actor signature.', activity.id, activity.type) - continue - } - - const actorUrl = getAPId(activity.actor) - - // When we fetch remote data, we don't have signature - if (signatureActor && actorUrl !== signatureActor.url) { - logger.warn('Signature mismatch between %s and %s, skipping.', actorUrl, signatureActor.url) - continue - } - - if (outboxUrl && checkUrlsSameHost(outboxUrl, actorUrl) !== true) { - logger.warn('Host mismatch between outbox URL %s and actor URL %s, skipping.', outboxUrl, actorUrl) - continue - } - - const byActor = signatureActor || actorsCache[actorUrl] || await getOrCreateAPActor(actorUrl) - actorsCache[actorUrl] = byActor - - const activityProcessor = processActivity[activity.type] - if (activityProcessor === undefined) { - logger.warn('Unknown activity type %s.', activity.type, { activityId: activity.id }) - continue - } - - try { - await activityProcessor({ activity, byActor, inboxActor, fromFetch }) - - StatsManager.Instance.addInboxProcessedSuccess(activity.type) - } catch (err) { - logger.warn('Cannot process activity %s.', activity.type, { err }) - - StatsManager.Instance.addInboxProcessedError(activity.type) - } - } -} - -export { - processActivities -} -- cgit v1.2.3