refactor (backend): port publishDriveStream to backend-rs
This commit is contained in:
parent
e10a188751
commit
4e36d22164
11 changed files with 126 additions and 28 deletions
12
packages/backend-rs/index.d.ts
vendored
12
packages/backend-rs/index.d.ts
vendored
|
@ -1373,6 +1373,18 @@ export interface PackedEmoji {
|
||||||
height: number | null
|
height: number | null
|
||||||
}
|
}
|
||||||
export function publishToBroadcastStream(emoji: PackedEmoji): Promise<void>
|
export function publishToBroadcastStream(emoji: PackedEmoji): Promise<void>
|
||||||
|
export enum DriveFileEvent {
|
||||||
|
Create = 0,
|
||||||
|
Update = 1,
|
||||||
|
Delete = 2
|
||||||
|
}
|
||||||
|
export enum DriveFolderEvent {
|
||||||
|
Create = 0,
|
||||||
|
Update = 1,
|
||||||
|
Delete = 2
|
||||||
|
}
|
||||||
|
export function publishToDriveFileStream(userId: string, kind: DriveFileEvent, object: any): Promise<void>
|
||||||
|
export function publishToDriveFolderStream(userId: string, kind: DriveFolderEvent, object: any): Promise<void>
|
||||||
export function publishToGroupChatStream(groupId: string, kind: ChatEvent, object: any): Promise<void>
|
export function publishToGroupChatStream(groupId: string, kind: ChatEvent, object: any): Promise<void>
|
||||||
export interface AbuseUserReportLike {
|
export interface AbuseUserReportLike {
|
||||||
id: string
|
id: string
|
||||||
|
|
|
@ -310,7 +310,7 @@ if (!nativeBinding) {
|
||||||
throw new Error(`Failed to load native binding`)
|
throw new Error(`Failed to load native binding`)
|
||||||
}
|
}
|
||||||
|
|
||||||
const { SECOND, MINUTE, HOUR, DAY, USER_ONLINE_THRESHOLD, USER_ACTIVE_THRESHOLD, FILE_TYPE_BROWSERSAFE, fetchMeta, updateMetaCache, metaToPugArgs, loadConfig, stringToAcct, acctToString, fetchNodeinfo, nodeinfo_2_1, nodeinfo_2_0, updateNodeinfoCache, Protocol, Inbound, Outbound, greet, initializeRustLogger, showServerInfo, isBlockedServer, isSilencedServer, isAllowedServer, checkWordMute, getFullApAccount, isSelfHost, isSameOrigin, extractHost, toPuny, isUnicodeEmoji, sqlLikeEscape, safeForSql, formatMilliseconds, getImageSizeFromUrl, isQuote, isSafeUrl, latestVersion, toMastodonId, fromMastodonId, getNoteSummary, nyaify, hashPassword, verifyPassword, isOldPasswordAlgorithm, decodeReaction, countReactions, toDbReaction, removeOldAttestationChallenges, cpuInfo, cpuUsage, memoryUsage, storageUsage, AntennaSrc, DriveFileUsageHint, MutedNoteReason, NoteVisibility, NotificationType, PageVisibility, PollNoteVisibility, RelayStatus, UserEmojiModPerm, UserProfileFfvisibility, UserProfileMutingNotificationTypes, updateAntennasOnNewNote, updateAntennaCache, watchNote, unwatchNote, PushNotificationKind, sendPushNotification, publishToChannelStream, publishToChatStream, ChatIndexEvent, publishToChatIndexStream, publishToBroadcastStream, publishToGroupChatStream, publishToModerationStream, publishToNotesStream, ChatEvent, getTimestamp, genId, genIdAt, generateSecureRandomString, generateUserToken } = nativeBinding
|
const { SECOND, MINUTE, HOUR, DAY, USER_ONLINE_THRESHOLD, USER_ACTIVE_THRESHOLD, FILE_TYPE_BROWSERSAFE, fetchMeta, updateMetaCache, metaToPugArgs, loadConfig, stringToAcct, acctToString, fetchNodeinfo, nodeinfo_2_1, nodeinfo_2_0, updateNodeinfoCache, Protocol, Inbound, Outbound, greet, initializeRustLogger, showServerInfo, isBlockedServer, isSilencedServer, isAllowedServer, checkWordMute, getFullApAccount, isSelfHost, isSameOrigin, extractHost, toPuny, isUnicodeEmoji, sqlLikeEscape, safeForSql, formatMilliseconds, getImageSizeFromUrl, isQuote, isSafeUrl, latestVersion, toMastodonId, fromMastodonId, getNoteSummary, nyaify, hashPassword, verifyPassword, isOldPasswordAlgorithm, decodeReaction, countReactions, toDbReaction, removeOldAttestationChallenges, cpuInfo, cpuUsage, memoryUsage, storageUsage, AntennaSrc, DriveFileUsageHint, MutedNoteReason, NoteVisibility, NotificationType, PageVisibility, PollNoteVisibility, RelayStatus, UserEmojiModPerm, UserProfileFfvisibility, UserProfileMutingNotificationTypes, updateAntennasOnNewNote, updateAntennaCache, watchNote, unwatchNote, PushNotificationKind, sendPushNotification, publishToChannelStream, publishToChatStream, ChatIndexEvent, publishToChatIndexStream, publishToBroadcastStream, DriveFileEvent, DriveFolderEvent, publishToDriveFileStream, publishToDriveFolderStream, publishToGroupChatStream, publishToModerationStream, publishToNotesStream, ChatEvent, getTimestamp, genId, genIdAt, generateSecureRandomString, generateUserToken } = nativeBinding
|
||||||
|
|
||||||
module.exports.SECOND = SECOND
|
module.exports.SECOND = SECOND
|
||||||
module.exports.MINUTE = MINUTE
|
module.exports.MINUTE = MINUTE
|
||||||
|
@ -389,6 +389,10 @@ module.exports.publishToChatStream = publishToChatStream
|
||||||
module.exports.ChatIndexEvent = ChatIndexEvent
|
module.exports.ChatIndexEvent = ChatIndexEvent
|
||||||
module.exports.publishToChatIndexStream = publishToChatIndexStream
|
module.exports.publishToChatIndexStream = publishToChatIndexStream
|
||||||
module.exports.publishToBroadcastStream = publishToBroadcastStream
|
module.exports.publishToBroadcastStream = publishToBroadcastStream
|
||||||
|
module.exports.DriveFileEvent = DriveFileEvent
|
||||||
|
module.exports.DriveFolderEvent = DriveFolderEvent
|
||||||
|
module.exports.publishToDriveFileStream = publishToDriveFileStream
|
||||||
|
module.exports.publishToDriveFolderStream = publishToDriveFolderStream
|
||||||
module.exports.publishToGroupChatStream = publishToGroupChatStream
|
module.exports.publishToGroupChatStream = publishToGroupChatStream
|
||||||
module.exports.publishToModerationStream = publishToModerationStream
|
module.exports.publishToModerationStream = publishToModerationStream
|
||||||
module.exports.publishToNotesStream = publishToNotesStream
|
module.exports.publishToNotesStream = publishToNotesStream
|
||||||
|
|
|
@ -3,6 +3,7 @@ pub mod channel;
|
||||||
pub mod chat;
|
pub mod chat;
|
||||||
pub mod chat_index;
|
pub mod chat_index;
|
||||||
pub mod custom_emoji;
|
pub mod custom_emoji;
|
||||||
|
pub mod drive;
|
||||||
pub mod group_chat;
|
pub mod group_chat;
|
||||||
pub mod moderation;
|
pub mod moderation;
|
||||||
pub mod notes;
|
pub mod notes;
|
||||||
|
|
58
packages/backend-rs/src/service/stream/drive.rs
Normal file
58
packages/backend-rs/src/service/stream/drive.rs
Normal file
|
@ -0,0 +1,58 @@
|
||||||
|
use crate::service::stream::{publish_to_stream, Error, Stream};
|
||||||
|
|
||||||
|
#[crate::export]
|
||||||
|
pub enum DriveFileEvent {
|
||||||
|
Create,
|
||||||
|
Update,
|
||||||
|
Delete,
|
||||||
|
}
|
||||||
|
|
||||||
|
#[crate::export]
|
||||||
|
pub enum DriveFolderEvent {
|
||||||
|
Create,
|
||||||
|
Update,
|
||||||
|
Delete,
|
||||||
|
}
|
||||||
|
|
||||||
|
// We want to merge `kind` and `object` into a single enum and merge the 2 functions
|
||||||
|
// https://github.com/napi-rs/napi-rs/issues/2036
|
||||||
|
|
||||||
|
#[crate::export(js_name = "publishToDriveFileStream")]
|
||||||
|
pub async fn publish_file(
|
||||||
|
user_id: String,
|
||||||
|
kind: DriveFileEvent,
|
||||||
|
object: &serde_json::Value, // file (create, update) or file id (delete)
|
||||||
|
) -> Result<(), Error> {
|
||||||
|
let kind = match kind {
|
||||||
|
DriveFileEvent::Create => "fileCreated",
|
||||||
|
DriveFileEvent::Update => "fileUpdated",
|
||||||
|
DriveFileEvent::Delete => "fileDeleted",
|
||||||
|
};
|
||||||
|
|
||||||
|
publish_to_stream(
|
||||||
|
&Stream::Drive { user_id },
|
||||||
|
Some(kind),
|
||||||
|
Some(serde_json::to_string(object)?),
|
||||||
|
)
|
||||||
|
.await
|
||||||
|
}
|
||||||
|
|
||||||
|
#[crate::export(js_name = "publishToDriveFolderStream")]
|
||||||
|
pub async fn publish_folder(
|
||||||
|
user_id: String,
|
||||||
|
kind: DriveFolderEvent,
|
||||||
|
object: &serde_json::Value, // folder (create, update) or folder id (delete)
|
||||||
|
) -> Result<(), Error> {
|
||||||
|
let kind = match kind {
|
||||||
|
DriveFolderEvent::Create => "folderCreated",
|
||||||
|
DriveFolderEvent::Update => "folderUpdated",
|
||||||
|
DriveFolderEvent::Delete => "folderDeleted",
|
||||||
|
};
|
||||||
|
|
||||||
|
publish_to_stream(
|
||||||
|
&Stream::Drive { user_id },
|
||||||
|
Some(kind),
|
||||||
|
Some(serde_json::to_string(object)?),
|
||||||
|
)
|
||||||
|
.await
|
||||||
|
}
|
|
@ -1,5 +1,5 @@
|
||||||
import { deleteFile } from "@/services/drive/delete-file.js";
|
import { deleteFile } from "@/services/drive/delete-file.js";
|
||||||
import { publishDriveStream } from "@/services/stream.js";
|
import { publishToDriveFileStream, DriveFileEvent } from "backend-rs";
|
||||||
import define from "@/server/api/define.js";
|
import define from "@/server/api/define.js";
|
||||||
import { ApiError } from "@/server/api/error.js";
|
import { ApiError } from "@/server/api/error.js";
|
||||||
import { DriveFiles } from "@/models/index.js";
|
import { DriveFiles } from "@/models/index.js";
|
||||||
|
@ -51,5 +51,5 @@ export default define(meta, paramDef, async (ps, user) => {
|
||||||
await deleteFile(file);
|
await deleteFile(file);
|
||||||
|
|
||||||
// Publish fileDeleted event
|
// Publish fileDeleted event
|
||||||
publishDriveStream(user.id, "fileDeleted", file.id);
|
publishToDriveFileStream(user.id, DriveFileEvent.Delete, file.id);
|
||||||
});
|
});
|
||||||
|
|
|
@ -1,8 +1,9 @@
|
||||||
import { publishDriveStream } from "@/services/stream.js";
|
import { publishToDriveFileStream, DriveFileEvent } from "backend-rs";
|
||||||
import { DriveFiles, DriveFolders } from "@/models/index.js";
|
import { DriveFiles, DriveFolders } from "@/models/index.js";
|
||||||
import { config } from "@/config.js";
|
import { config } from "@/config.js";
|
||||||
import define from "@/server/api/define.js";
|
import define from "@/server/api/define.js";
|
||||||
import { ApiError } from "@/server/api/error.js";
|
import { ApiError } from "@/server/api/error.js";
|
||||||
|
import { toRustObject } from "@/prelude/undefined-to-null.js";
|
||||||
|
|
||||||
export const meta = {
|
export const meta = {
|
||||||
tags: ["drive"],
|
tags: ["drive"],
|
||||||
|
@ -110,7 +111,7 @@ export default define(meta, paramDef, async (ps, user) => {
|
||||||
const fileObj = await DriveFiles.pack(file, { self: true });
|
const fileObj = await DriveFiles.pack(file, { self: true });
|
||||||
|
|
||||||
// Publish fileUpdated event
|
// Publish fileUpdated event
|
||||||
publishDriveStream(user.id, "fileUpdated", fileObj);
|
publishToDriveFileStream(user.id, DriveFileEvent.Update, toRustObject(file));
|
||||||
|
|
||||||
return fileObj;
|
return fileObj;
|
||||||
});
|
});
|
||||||
|
|
|
@ -1,8 +1,9 @@
|
||||||
import { publishDriveStream } from "@/services/stream.js";
|
import { publishToDriveFolderStream, DriveFolderEvent } from "backend-rs";
|
||||||
import define from "@/server/api/define.js";
|
import define from "@/server/api/define.js";
|
||||||
import { ApiError } from "@/server/api/error.js";
|
import { ApiError } from "@/server/api/error.js";
|
||||||
import { DriveFolders } from "@/models/index.js";
|
import { DriveFolders } from "@/models/index.js";
|
||||||
import { genIdAt } from "backend-rs";
|
import { genIdAt } from "backend-rs";
|
||||||
|
import { toRustObject } from "@/prelude/undefined-to-null.js";
|
||||||
|
|
||||||
export const meta = {
|
export const meta = {
|
||||||
tags: ["drive"],
|
tags: ["drive"],
|
||||||
|
@ -64,7 +65,11 @@ export default define(meta, paramDef, async (ps, user) => {
|
||||||
const folderObj = await DriveFolders.pack(folder);
|
const folderObj = await DriveFolders.pack(folder);
|
||||||
|
|
||||||
// Publish folderCreated event
|
// Publish folderCreated event
|
||||||
publishDriveStream(user.id, "folderCreated", folderObj);
|
publishToDriveFolderStream(
|
||||||
|
user.id,
|
||||||
|
DriveFolderEvent.Create,
|
||||||
|
toRustObject(folder),
|
||||||
|
);
|
||||||
|
|
||||||
return folderObj;
|
return folderObj;
|
||||||
});
|
});
|
||||||
|
|
|
@ -1,5 +1,5 @@
|
||||||
import define from "@/server/api/define.js";
|
import define from "@/server/api/define.js";
|
||||||
import { publishDriveStream } from "@/services/stream.js";
|
import { publishToDriveFolderStream, DriveFolderEvent } from "backend-rs";
|
||||||
import { ApiError } from "@/server/api/error.js";
|
import { ApiError } from "@/server/api/error.js";
|
||||||
import { DriveFolders, DriveFiles } from "@/models/index.js";
|
import { DriveFolders, DriveFiles } from "@/models/index.js";
|
||||||
|
|
||||||
|
@ -56,5 +56,5 @@ export default define(meta, paramDef, async (ps, user) => {
|
||||||
await DriveFolders.delete(folder.id);
|
await DriveFolders.delete(folder.id);
|
||||||
|
|
||||||
// Publish folderCreated event
|
// Publish folderCreated event
|
||||||
publishDriveStream(user.id, "folderDeleted", folder.id);
|
publishToDriveFolderStream(user.id, DriveFolderEvent.Delete, folder.id);
|
||||||
});
|
});
|
||||||
|
|
|
@ -1,7 +1,8 @@
|
||||||
import { publishDriveStream } from "@/services/stream.js";
|
import { publishToDriveFolderStream, DriveFolderEvent } from "backend-rs";
|
||||||
import define from "@/server/api/define.js";
|
import define from "@/server/api/define.js";
|
||||||
import { ApiError } from "@/server/api/error.js";
|
import { ApiError } from "@/server/api/error.js";
|
||||||
import { DriveFolders } from "@/models/index.js";
|
import { DriveFolders } from "@/models/index.js";
|
||||||
|
import { toRustObject } from "@/prelude/undefined-to-null.js";
|
||||||
|
|
||||||
export const meta = {
|
export const meta = {
|
||||||
tags: ["drive"],
|
tags: ["drive"],
|
||||||
|
@ -112,7 +113,11 @@ export default define(meta, paramDef, async (ps, user) => {
|
||||||
const folderObj = await DriveFolders.pack(folder);
|
const folderObj = await DriveFolders.pack(folder);
|
||||||
|
|
||||||
// Publish folderUpdated event
|
// Publish folderUpdated event
|
||||||
publishDriveStream(user.id, "folderUpdated", folderObj);
|
publishToDriveFolderStream(
|
||||||
|
user.id,
|
||||||
|
DriveFolderEvent.Update,
|
||||||
|
toRustObject(folder),
|
||||||
|
);
|
||||||
|
|
||||||
return folderObj;
|
return folderObj;
|
||||||
});
|
});
|
||||||
|
|
|
@ -5,8 +5,14 @@ import { v4 as uuid } from "uuid";
|
||||||
import type S3 from "aws-sdk/clients/s3.js"; // TODO: migrate to SDK v3
|
import type S3 from "aws-sdk/clients/s3.js"; // TODO: migrate to SDK v3
|
||||||
import sharp from "sharp";
|
import sharp from "sharp";
|
||||||
import { IsNull } from "typeorm";
|
import { IsNull } from "typeorm";
|
||||||
import { publishMainStream, publishDriveStream } from "@/services/stream.js";
|
import { publishMainStream } from "@/services/stream.js";
|
||||||
import { FILE_TYPE_BROWSERSAFE, fetchMeta, genId } from "backend-rs";
|
import {
|
||||||
|
DriveFileEvent,
|
||||||
|
FILE_TYPE_BROWSERSAFE,
|
||||||
|
fetchMeta,
|
||||||
|
genId,
|
||||||
|
publishToDriveFileStream,
|
||||||
|
} from "backend-rs";
|
||||||
import { contentDisposition } from "@/misc/content-disposition.js";
|
import { contentDisposition } from "@/misc/content-disposition.js";
|
||||||
import { getFileInfo } from "@/misc/get-file-info.js";
|
import { getFileInfo } from "@/misc/get-file-info.js";
|
||||||
import {
|
import {
|
||||||
|
@ -28,6 +34,7 @@ import { driveLogger } from "./logger.js";
|
||||||
import { GenerateVideoThumbnail } from "./generate-video-thumbnail.js";
|
import { GenerateVideoThumbnail } from "./generate-video-thumbnail.js";
|
||||||
import { deleteFile } from "./delete-file.js";
|
import { deleteFile } from "./delete-file.js";
|
||||||
import { inspect } from "node:util";
|
import { inspect } from "node:util";
|
||||||
|
import { toRustObject } from "@/prelude/undefined-to-null.js";
|
||||||
|
|
||||||
const logger = driveLogger.createSubLogger("register", "yellow");
|
const logger = driveLogger.createSubLogger("register", "yellow");
|
||||||
|
|
||||||
|
@ -656,11 +663,15 @@ export async function addFile({
|
||||||
|
|
||||||
logger.info(`drive file has been created ${file.id}`);
|
logger.info(`drive file has been created ${file.id}`);
|
||||||
|
|
||||||
if (user) {
|
if (user != null) {
|
||||||
DriveFiles.pack(file, { self: true }).then((packedFile) => {
|
DriveFiles.pack(file, { self: true }).then((packedFile) => {
|
||||||
// Publish driveFileCreated event
|
// Publish driveFileCreated event
|
||||||
publishMainStream(user.id, "driveFileCreated", packedFile);
|
publishMainStream(user.id, "driveFileCreated", packedFile);
|
||||||
publishDriveStream(user.id, "fileCreated", packedFile);
|
publishToDriveFileStream(
|
||||||
|
user.id,
|
||||||
|
DriveFileEvent.Create,
|
||||||
|
toRustObject(file),
|
||||||
|
);
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -12,7 +12,7 @@ import type {
|
||||||
// AntennaStreamTypes,
|
// AntennaStreamTypes,
|
||||||
// BroadcastTypes,
|
// BroadcastTypes,
|
||||||
// ChannelStreamTypes,
|
// ChannelStreamTypes,
|
||||||
DriveStreamTypes,
|
// DriveStreamTypes,
|
||||||
// GroupMessagingStreamTypes,
|
// GroupMessagingStreamTypes,
|
||||||
InternalStreamTypes,
|
InternalStreamTypes,
|
||||||
MainStreamTypes,
|
MainStreamTypes,
|
||||||
|
@ -88,17 +88,18 @@ class Publisher {
|
||||||
);
|
);
|
||||||
};
|
};
|
||||||
|
|
||||||
public publishDriveStream = <K extends keyof DriveStreamTypes>(
|
/* ported to backend-rs */
|
||||||
userId: User["id"],
|
// public publishDriveStream = <K extends keyof DriveStreamTypes>(
|
||||||
type: K,
|
// userId: User["id"],
|
||||||
value?: DriveStreamTypes[K],
|
// type: K,
|
||||||
): void => {
|
// value?: DriveStreamTypes[K],
|
||||||
this.publish(
|
// ): void => {
|
||||||
`driveStream:${userId}`,
|
// this.publish(
|
||||||
type,
|
// `driveStream:${userId}`,
|
||||||
typeof value === "undefined" ? null : value,
|
// type,
|
||||||
);
|
// typeof value === "undefined" ? null : value,
|
||||||
};
|
// );
|
||||||
|
// };
|
||||||
|
|
||||||
public publishNoteStream = <K extends keyof NoteStreamTypes>(
|
public publishNoteStream = <K extends keyof NoteStreamTypes>(
|
||||||
noteId: Note["id"],
|
noteId: Note["id"],
|
||||||
|
@ -220,7 +221,7 @@ export const publishInternalEvent = publisher.publishInternalEvent;
|
||||||
export const publishUserEvent = publisher.publishUserEvent;
|
export const publishUserEvent = publisher.publishUserEvent;
|
||||||
// export const publishBroadcastStream = publisher.publishBroadcastStream;
|
// export const publishBroadcastStream = publisher.publishBroadcastStream;
|
||||||
export const publishMainStream = publisher.publishMainStream;
|
export const publishMainStream = publisher.publishMainStream;
|
||||||
export const publishDriveStream = publisher.publishDriveStream;
|
// export const publishDriveStream = publisher.publishDriveStream;
|
||||||
export const publishNoteStream = publisher.publishNoteStream;
|
export const publishNoteStream = publisher.publishNoteStream;
|
||||||
// export const publishNotesStream = publisher.publishNotesStream;
|
// export const publishNotesStream = publisher.publishNotesStream;
|
||||||
// export const publishChannelStream = publisher.publishChannelStream;
|
// export const publishChannelStream = publisher.publishChannelStream;
|
||||||
|
|
Loading…
Reference in a new issue