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
pull/5325/head
kontrollanten 2022-10-10 15:18:31 +02:00 committed by GitHub
parent 213bb3bb58
commit c43ed8e862
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
4 changed files with 65 additions and 2 deletions

View File

@ -13,13 +13,14 @@ import { ServerBlocklistModel } from '@server/models/server/server-blocklist'
import { UserModel } from '@server/models/user/user' import { UserModel } from '@server/models/user/user'
import { VideoModel } from '@server/models/video/video' import { VideoModel } from '@server/models/video/video'
import { VideoBlacklistModel } from '@server/models/video/video-blacklist' 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 { PeerTubeHelpers } from '@server/types/plugins'
import { VideoBlacklistCreate, VideoStorage } from '@shared/models' import { VideoBlacklistCreate, VideoStorage } from '@shared/models'
import { addAccountInBlocklist, addServerInBlocklist, removeAccountFromBlocklist, removeServerFromBlocklist } from '../blocklist' import { addAccountInBlocklist, addServerInBlocklist, removeAccountFromBlocklist, removeServerFromBlocklist } from '../blocklist'
import { ServerConfigManager } from '../server-config-manager' import { ServerConfigManager } from '../server-config-manager'
import { blacklistVideo, unblacklistVideo } from '../video-blacklist' import { blacklistVideo, unblacklistVideo } from '../video-blacklist'
import { VideoPathManager } from '../video-path-manager' import { VideoPathManager } from '../video-path-manager'
import { PeerTubeSocket } from '../peertube-socket'
function buildPluginHelpers (pluginModel: MPlugin, npmName: string): PeerTubeHelpers { function buildPluginHelpers (pluginModel: MPlugin, npmName: string): PeerTubeHelpers {
const logger = buildPluginLogger(npmName) const logger = buildPluginLogger(npmName)
@ -35,6 +36,8 @@ function buildPluginHelpers (pluginModel: MPlugin, npmName: string): PeerTubeHel
const plugin = buildPluginRelatedHelpers(pluginModel, npmName) const plugin = buildPluginRelatedHelpers(pluginModel, npmName)
const socket = buildSocketHelpers()
const user = buildUserHelpers() const user = buildUserHelpers()
return { return {
@ -45,6 +48,7 @@ function buildPluginHelpers (pluginModel: MPlugin, npmName: string): PeerTubeHel
moderation, moderation,
plugin, plugin,
server, server,
socket,
user 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 () { function buildUserHelpers () {
return { return {
loadById: (id: number) => { loadById: (id: number) => {

View File

@ -128,6 +128,22 @@ async function register ({
return res.json(result) 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)
})
} }
} }

View File

@ -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 () { describe('Plugin', function () {
it('Should get the base static route', async function () { it('Should get the base static route', async function () {

View File

@ -16,7 +16,7 @@ import {
ThumbnailType, ThumbnailType,
VideoBlacklistCreate VideoBlacklistCreate
} from '@shared/models' } from '@shared/models'
import { MUserDefault, MVideoThumbnail } from '../models' import { MUserDefault, MVideo, MVideoThumbnail, UserNotificationModelForApi } from '../models'
import { import {
RegisterServerAuthExternalOptions, RegisterServerAuthExternalOptions,
RegisterServerAuthExternalResult, RegisterServerAuthExternalResult,
@ -86,6 +86,11 @@ export type PeerTubeHelpers = {
getServerActor: () => Promise<ActorModel> getServerActor: () => Promise<ActorModel>
} }
socket: {
sendNotification: (userId: number, notification: UserNotificationModelForApi) => void
sendVideoLiveNewState: (video: MVideo) => void
}
plugin: { plugin: {
// PeerTube >= 3.2 // PeerTube >= 3.2
getBaseStaticRoute: () => string getBaseStaticRoute: () => string