From c43ed8e8624383db5a0cf22b210cee202bae323c Mon Sep 17 00:00:00 2001 From: kontrollanten <6680299+kontrollanten@users.noreply.github.com> Date: Mon, 10 Oct 2022 15:18:31 +0200 Subject: Expose PeerTube socket to plugins (#5239) * server(pluginHelpers): add socket * test(plugins): add socket cases * fixes after review * Update plugin-helpers.ts * Update plugin-helpers.ts --- server/lib/plugins/plugin-helpers-builder.ts | 17 +++++++++++++- .../fixtures/peertube-plugin-test-four/main.js | 16 +++++++++++++ server/tests/plugins/plugin-helpers.ts | 27 ++++++++++++++++++++++ .../types/plugins/register-server-option.model.ts | 7 +++++- 4 files changed, 65 insertions(+), 2 deletions(-) (limited to 'server') diff --git a/server/lib/plugins/plugin-helpers-builder.ts b/server/lib/plugins/plugin-helpers-builder.ts index 4e799b3d4..35945422c 100644 --- a/server/lib/plugins/plugin-helpers-builder.ts +++ b/server/lib/plugins/plugin-helpers-builder.ts @@ -13,13 +13,14 @@ import { ServerBlocklistModel } from '@server/models/server/server-blocklist' import { UserModel } from '@server/models/user/user' import { VideoModel } from '@server/models/video/video' import { VideoBlacklistModel } from '@server/models/video/video-blacklist' -import { MPlugin } from '@server/types/models' +import { MPlugin, MVideo, UserNotificationModelForApi } from '@server/types/models' import { PeerTubeHelpers } from '@server/types/plugins' import { VideoBlacklistCreate, VideoStorage } from '@shared/models' import { addAccountInBlocklist, addServerInBlocklist, removeAccountFromBlocklist, removeServerFromBlocklist } from '../blocklist' import { ServerConfigManager } from '../server-config-manager' import { blacklistVideo, unblacklistVideo } from '../video-blacklist' import { VideoPathManager } from '../video-path-manager' +import { PeerTubeSocket } from '../peertube-socket' function buildPluginHelpers (pluginModel: MPlugin, npmName: string): PeerTubeHelpers { const logger = buildPluginLogger(npmName) @@ -35,6 +36,8 @@ function buildPluginHelpers (pluginModel: MPlugin, npmName: string): PeerTubeHel const plugin = buildPluginRelatedHelpers(pluginModel, npmName) + const socket = buildSocketHelpers() + const user = buildUserHelpers() return { @@ -45,6 +48,7 @@ function buildPluginHelpers (pluginModel: MPlugin, npmName: string): PeerTubeHel moderation, plugin, server, + socket, user } } @@ -218,6 +222,17 @@ function buildPluginRelatedHelpers (plugin: MPlugin, npmName: string) { } } +function buildSocketHelpers () { + return { + sendNotification: (userId: number, notification: UserNotificationModelForApi) => { + PeerTubeSocket.Instance.sendNotification(userId, notification) + }, + sendVideoLiveNewState: (video: MVideo) => { + PeerTubeSocket.Instance.sendVideoLiveNewState(video) + } + } +} + function buildUserHelpers () { return { loadById: (id: number) => { diff --git a/server/tests/fixtures/peertube-plugin-test-four/main.js b/server/tests/fixtures/peertube-plugin-test-four/main.js index 5194e3e02..3e848c49e 100644 --- a/server/tests/fixtures/peertube-plugin-test-four/main.js +++ b/server/tests/fixtures/peertube-plugin-test-four/main.js @@ -128,6 +128,22 @@ async function register ({ return res.json(result) }) + + router.post('/send-notification', async (req, res) => { + peertubeHelpers.socket.sendNotification(req.body.userId, { + type: 1, + userId: req.body.userId + }) + + return res.sendStatus(201) + }) + + router.post('/send-video-live-new-state/:uuid', async (req, res) => { + const video = await peertubeHelpers.videos.loadByIdOrUUID(req.params.uuid) + peertubeHelpers.socket.sendVideoLiveNewState(video) + + return res.sendStatus(201) + }) } } diff --git a/server/tests/plugins/plugin-helpers.ts b/server/tests/plugins/plugin-helpers.ts index 955d7ddfd..31c18350a 100644 --- a/server/tests/plugins/plugin-helpers.ts +++ b/server/tests/plugins/plugin-helpers.ts @@ -83,6 +83,33 @@ describe('Test plugin helpers', function () { }) }) + describe('Socket', function () { + + it('Should sendNotification without any exceptions', async () => { + const user = await servers[0].users.create({ username: 'notis_redding', password: 'secret1234?' }) + await makePostBodyRequest({ + url: servers[0].url, + path: '/plugins/test-four/router/send-notification', + fields: { + userId: user.id + }, + expectedStatus: HttpStatusCode.CREATED_201 + }) + }) + + it('Should sendVideoLiveNewState without any exceptions', async () => { + const res = await servers[0].videos.quickUpload({ name: 'video server 1' }) + + await makePostBodyRequest({ + url: servers[0].url, + path: '/plugins/test-four/router/send-video-live-new-state/' + res.uuid, + expectedStatus: HttpStatusCode.CREATED_201 + }) + + await servers[0].videos.remove({ id: res.uuid }) + }) + }) + describe('Plugin', function () { it('Should get the base static route', async function () { diff --git a/server/types/plugins/register-server-option.model.ts b/server/types/plugins/register-server-option.model.ts index fb4f12a4c..a8b804b63 100644 --- a/server/types/plugins/register-server-option.model.ts +++ b/server/types/plugins/register-server-option.model.ts @@ -16,7 +16,7 @@ import { ThumbnailType, VideoBlacklistCreate } from '@shared/models' -import { MUserDefault, MVideoThumbnail } from '../models' +import { MUserDefault, MVideo, MVideoThumbnail, UserNotificationModelForApi } from '../models' import { RegisterServerAuthExternalOptions, RegisterServerAuthExternalResult, @@ -86,6 +86,11 @@ export type PeerTubeHelpers = { getServerActor: () => Promise } + socket: { + sendNotification: (userId: number, notification: UserNotificationModelForApi) => void + sendVideoLiveNewState: (video: MVideo) => void + } + plugin: { // PeerTube >= 3.2 getBaseStaticRoute: () => string -- cgit v1.2.3