Merge branch 'develop' into iceshrimp_mastodon

This commit is contained in:
naskya 2024-07-05 16:41:23 +09:00
commit cdb890843a
No known key found for this signature in database
GPG key ID: 712D413B3A9FED5C
26 changed files with 230 additions and 349 deletions

14
Cargo.lock generated
View file

@ -1808,14 +1808,14 @@ dependencies = [
[[package]] [[package]]
name = "napi" name = "napi"
version = "2.16.8" version = "3.0.0-alpha.3"
source = "registry+https://github.com/rust-lang/crates.io-index" source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "a1bd081bbaef43600fd2c5dd4c525b8ecea7dfdacf40ebc674e87851dce6559e" checksum = "53112614847625adf534655b35b7adcc66c4f6ca407284cca73fd5bb0cf8cde5"
dependencies = [ dependencies = [
"bitflags 2.6.0", "bitflags 2.6.0",
"chrono", "chrono",
"ctor", "ctor",
"napi-derive", "napi-build",
"napi-sys", "napi-sys",
"once_cell", "once_cell",
"serde", "serde",
@ -1831,9 +1831,9 @@ checksum = "e1c0f5d67ee408a4685b61f5ab7e58605c8ae3f2b4189f0127d804ff13d5560a"
[[package]] [[package]]
name = "napi-derive" name = "napi-derive"
version = "2.16.8" version = "3.0.0-alpha.3"
source = "registry+https://github.com/rust-lang/crates.io-index" source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "eafd2b920906ea5b1f5f1f9d1eff9cc74e4ff8124dca41b501c1413079589187" checksum = "823fb2987af2446a2b4055604a920f2c1f1a028743c72adc8872d92da7e30d2b"
dependencies = [ dependencies = [
"cfg-if", "cfg-if",
"convert_case", "convert_case",
@ -1845,9 +1845,9 @@ dependencies = [
[[package]] [[package]]
name = "napi-derive-backend" name = "napi-derive-backend"
version = "1.0.70" version = "2.0.0-alpha.3"
source = "registry+https://github.com/rust-lang/crates.io-index" source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "b370b784440c65eb9001d839012eb912ee43e3a2d0361e2c30c13052372c39fe" checksum = "abd42151b3c26b5cdde9cf9a8fc5f7240de0919f234e14c6f54e3571d56e4dab"
dependencies = [ dependencies = [
"convert_case", "convert_case",
"once_cell", "once_cell",

View file

@ -6,8 +6,8 @@ resolver = "2"
macros = { path = "packages/macro-rs/macros" } macros = { path = "packages/macro-rs/macros" }
macros-impl = { path = "packages/macro-rs/macros-impl" } macros-impl = { path = "packages/macro-rs/macros-impl" }
napi = "2.16.8" napi = "3.0.0-alpha.3"
napi-derive = "2.16.8" napi-derive = "3.0.0-alpha.3"
napi-build = "2.1.3" napi-build = "2.1.3"
argon2 = { version = "0.5.3", default-features = false } argon2 = { version = "0.5.3", default-features = false }

View file

@ -413,7 +413,7 @@ sudo --user=postgres psql --command='SHOW data_directory'
## Tune database configuration ## Tune database configuration
The default PostgreSQL configuration not suitable for running a Firefish server. Thus, it is highly recommended that you use [PGTune](https://pgtune.leopard.in.ua/) to tweak the configuration. The default PostgreSQL configuration is not suitable for running a Firefish server. So, it is highly recommended that you use [PGTune](https://pgtune.leopard.in.ua/) to tweak the configuration.
Here is an example set of parameters you can provide to PGTune: Here is an example set of parameters you can provide to PGTune:
@ -427,7 +427,7 @@ Here is an example set of parameters you can provide to PGTune:
| Number of connections | 200 | | Number of connections | 200 |
| Data storage | SSD storage | | Data storage | SSD storage |
Since this is not a dedicated database server, be sure to leave some memory space for other software such as Firefish and Redis. Since a Firefish server is not a dedicated database server, be sure to leave some memory space for other software such as Firefish, Redis, and reverse proxy.
Once you have entered the appropriate values for your environment, click the "Generate" button to generate a configuration and replace the values in `postgresql.conf` with the suggested values. Once you have entered the appropriate values for your environment, click the "Generate" button to generate a configuration and replace the values in `postgresql.conf` with the suggested values.

View file

@ -97,14 +97,12 @@ export interface Antenna {
excludeKeywords: Array<string> excludeKeywords: Array<string>
} }
export enum AntennaSrc { export type AntennaSrc = 'all'|
All = 'all', 'group'|
Group = 'group', 'home'|
Home = 'home', 'instances'|
Instances = 'instances', 'list'|
List = 'list', 'users';
Users = 'users'
}
export interface App { export interface App {
id: string id: string
@ -166,17 +164,13 @@ export interface ChannelNotePining {
noteId: string noteId: string
} }
export enum ChatEvent { export type ChatEvent = 'message'|
Message = 0, 'read'|
Read = 1, 'deleted'|
Deleted = 2, 'typing';
Typing = 3
}
export enum ChatIndexEvent { export type ChatIndexEvent = 'message'|
Message = 0, 'read';
Read = 1
}
/** /**
* Returns whether `note` should be hard-muted. * Returns whether `note` should be hard-muted.
@ -330,16 +324,12 @@ export interface DriveFile {
usageHint: DriveFileUsageHint | null usageHint: DriveFileUsageHint | null
} }
export enum DriveFileEvent { export type DriveFileEvent = 'create'|
Create = 0, 'update'|
Update = 1, 'delete';
Delete = 2
}
export enum DriveFileUsageHint { export type DriveFileUsageHint = 'userAvatar'|
UserAvatar = 'userAvatar', 'userBanner';
UserBanner = 'userBanner'
}
export interface DriveFolder { export interface DriveFolder {
id: string id: string
@ -349,11 +339,9 @@ export interface DriveFolder {
parentId: string | null parentId: string | null
} }
export enum DriveFolderEvent { export type DriveFolderEvent = 'create'|
Create = 0, 'update'|
Update = 1, 'delete';
Delete = 2
}
export interface EmailConfig { export interface EmailConfig {
managed?: boolean managed?: boolean
@ -511,7 +499,7 @@ export interface ImageSize {
} }
/** The third party sites this server can retrieve messages from for combined display with regular traffic. */ /** The third party sites this server can retrieve messages from for combined display with regular traffic. */
export enum Inbound { export declare enum Inbound {
Atom1 = 0, Atom1 = 0,
Gnusocial = 1, Gnusocial = 1,
Imap = 2, Imap = 2,
@ -774,12 +762,10 @@ export interface MutedNote {
reason: MutedNoteReason reason: MutedNoteReason
} }
export enum MutedNoteReason { export type MutedNoteReason = 'manual'|
Manual = 'manual', 'other'|
Other = 'other', 'spam'|
Spam = 'spam', 'word';
Word = 'word'
}
export interface Muting { export interface Muting {
id: string id: string
@ -901,13 +887,11 @@ export interface NoteUnread {
noteChannelId: string | null noteChannelId: string | null
} }
export enum NoteVisibility { export type NoteVisibility = 'followers'|
Followers = 'followers', 'hidden'|
Hidden = 'hidden', 'home'|
Home = 'home', 'public'|
Public = 'public', 'specified';
Specified = 'specified'
}
export interface NoteWatching { export interface NoteWatching {
id: string id: string
@ -935,20 +919,18 @@ export interface Notification {
appAccessTokenId: string | null appAccessTokenId: string | null
} }
export enum NotificationType { export type NotificationType = 'app'|
App = 'app', 'follow'|
Follow = 'follow', 'followRequestAccepted'|
FollowRequestAccepted = 'followRequestAccepted', 'groupInvited'|
GroupInvited = 'groupInvited', 'mention'|
Mention = 'mention', 'pollEnded'|
PollEnded = 'pollEnded', 'pollVote'|
PollVote = 'pollVote', 'quote'|
Quote = 'quote', 'reaction'|
Reaction = 'reaction', 'receiveFollowRequest'|
ReceiveFollowRequest = 'receiveFollowRequest', 'renote'|
Renote = 'renote', 'reply';
Reply = 'reply'
}
/** /**
* Converts the given text into the cat language. * Converts the given text into the cat language.
@ -987,7 +969,7 @@ export interface ObjectStorageConfig {
} }
/** The third party sites this server can publish messages to on the behalf of a user. */ /** The third party sites this server can publish messages to on the behalf of a user. */
export enum Outbound { export declare enum Outbound {
Atom1 = 0, Atom1 = 0,
Blogger = 1, Blogger = 1,
Buddycloud = 2, Buddycloud = 2,
@ -1058,11 +1040,9 @@ export interface PageLike {
pageId: string pageId: string
} }
export enum PageVisibility { export type PageVisibility = 'followers'|
Followers = 'followers', 'public'|
Public = 'public', 'specified';
Specified = 'specified'
}
export interface PartialNoteToCheckWordMute { export interface PartialNoteToCheckWordMute {
fileIds: Array<string> fileIds: Array<string>
@ -1090,12 +1070,10 @@ export interface Poll {
userHost: string | null userHost: string | null
} }
export enum PollNoteVisibility { export type PollNoteVisibility = 'followers'|
Followers = 'followers', 'home'|
Home = 'home', 'public'|
Public = 'public', 'specified';
Specified = 'specified'
}
export interface PollVote { export interface PollVote {
id: string id: string
@ -1118,7 +1096,7 @@ export interface PromoRead {
noteId: string noteId: string
} }
export enum Protocol { export declare enum Protocol {
Activitypub = 0, Activitypub = 0,
Buddycloud = 1, Buddycloud = 1,
Dfrn = 2, Dfrn = 2,
@ -1161,15 +1139,13 @@ export interface PugArgs {
privateMode: boolean | null privateMode: boolean | null
} }
export enum PushNotificationKind { export type PushNotificationKind = 'generic'|
Generic = 0, 'chat'|
Chat = 1, 'readAllChats'|
ReadAllChats = 2, 'readAllChatsInTheRoom'|
ReadAllChatsInTheRoom = 3, 'readNotifications'|
ReadNotifications = 4, 'readAllNotifications'|
ReadAllNotifications = 5, 'mastodon';
Mastodon = 6
}
export enum PushSubscriptionType { export enum PushSubscriptionType {
AdminReport = 'adminReport', AdminReport = 'adminReport',
@ -1218,11 +1194,9 @@ export interface Relay {
status: RelayStatus status: RelayStatus
} }
export enum RelayStatus { export type RelayStatus = 'accepted'|
Accepted = 'accepted', 'rejected'|
Rejected = 'rejected', 'requesting';
Requesting = 'requesting'
}
/** Delete all entries in the [attestation_challenge] table created at more than 5 minutes ago */ /** Delete all entries in the [attestation_challenge] table created at more than 5 minutes ago */
export declare function removeOldAttestationChallenges(): Promise<void> export declare function removeOldAttestationChallenges(): Promise<void>
@ -1438,12 +1412,10 @@ export const USER_ACTIVE_THRESHOLD: number
export const USER_ONLINE_THRESHOLD: number export const USER_ONLINE_THRESHOLD: number
export enum UserEmojiModPerm { export type UserEmojiModPerm = 'add'|
Add = 'add', 'full'|
Full = 'full', 'mod'|
Mod = 'mod', 'unauthorized';
Unauthorized = 'unauthorized'
}
export interface UserGroup { export interface UserGroup {
id: string id: string
@ -1556,26 +1528,22 @@ export interface UserProfile {
lang: string | null lang: string | null
} }
export enum UserProfileFfvisibility { export type UserProfileFfvisibility = 'followers'|
Followers = 'followers', 'private'|
Private = 'private', 'public';
Public = 'public'
}
export enum UserProfileMutingNotificationTypes { export type UserProfileMutingNotificationTypes = 'app'|
App = 'app', 'follow'|
Follow = 'follow', 'followRequestAccepted'|
FollowRequestAccepted = 'followRequestAccepted', 'groupInvited'|
GroupInvited = 'groupInvited', 'mention'|
Mention = 'mention', 'pollEnded'|
PollEnded = 'pollEnded', 'pollVote'|
PollVote = 'pollVote', 'quote'|
Quote = 'quote', 'reaction'|
Reaction = 'reaction', 'receiveFollowRequest'|
ReceiveFollowRequest = 'receiveFollowRequest', 'renote'|
Renote = 'renote', 'reply';
Reply = 'reply'
}
export interface UserPublickey { export interface UserPublickey {
userId: string userId: string

View file

@ -7,7 +7,7 @@
"binaryName": "backend-rs" "binaryName": "backend-rs"
}, },
"devDependencies": { "devDependencies": {
"@napi-rs/cli": "3.0.0-alpha.55" "@napi-rs/cli": "3.0.0-alpha.56"
}, },
"scripts": { "scripts": {
"build": "napi build --features napi --no-const-enum --platform --release --output-dir ./built/", "build": "napi build --features napi --no-const-enum --platform --release --output-dir ./built/",

View file

@ -42,7 +42,7 @@ fn get_client() -> Result<IsahcWebPushClient, Error> {
.cloned()?) .cloned()?)
} }
#[macros::export] #[macros::export(string_enum = "camelCase")]
pub enum PushNotificationKind { pub enum PushNotificationKind {
Generic, Generic,
Chat, Chat,

View file

@ -54,7 +54,7 @@ pub enum Stream {
}, },
} }
#[macros::export] #[macros::export(string_enum = "camelCase")]
pub enum ChatEvent { pub enum ChatEvent {
Message, Message,
Read, Read,

View file

@ -1,6 +1,6 @@
use crate::service::stream::{publish_to_stream, Error, Stream}; use crate::service::stream::{publish_to_stream, Error, Stream};
#[macros::export] #[macros::export(string_enum = "camelCase")]
pub enum ChatIndexEvent { pub enum ChatIndexEvent {
Message, Message,
Read, Read,

View file

@ -1,13 +1,13 @@
use crate::service::stream::{publish_to_stream, Error, Stream}; use crate::service::stream::{publish_to_stream, Error, Stream};
#[macros::export] #[macros::export(string_enum = "camelCase")]
pub enum DriveFileEvent { pub enum DriveFileEvent {
Create, Create,
Update, Update,
Delete, Delete,
} }
#[macros::export] #[macros::export(string_enum = "camelCase")]
pub enum DriveFolderEvent { pub enum DriveFolderEvent {
Create, Create,
Update, Update,

View file

@ -16,8 +16,10 @@ export const AntennaRepository = db.getRepository(Antenna).extend({
id: antenna.id, id: antenna.id,
createdAt: antenna.createdAt.toISOString(), createdAt: antenna.createdAt.toISOString(),
name: antenna.name, name: antenna.name,
keywords: antenna.keywords.map((row) => row.split(" ")), keywords: antenna.keywords.map((row: string) => row.split(" ")),
excludeKeywords: antenna.excludeKeywords.map((row) => row.split(" ")), excludeKeywords: antenna.excludeKeywords.map((row: string) =>
row.split(" "),
),
src: antenna.src, src: antenna.src,
userListId: antenna.userListId, userListId: antenna.userListId,
userGroupId: userGroupJoining ? userGroupJoining.userGroupId : null, userGroupId: userGroupJoining ? userGroupJoining.userGroupId : null,

View file

@ -4,9 +4,6 @@ import {
publishToGroupChatStream, publishToGroupChatStream,
publishToChatIndexStream, publishToChatIndexStream,
sendPushNotification, sendPushNotification,
ChatEvent,
ChatIndexEvent,
PushNotificationKind,
} from "backend-rs"; } from "backend-rs";
import type { User, IRemoteUser } from "@/models/entities/user.js"; import type { User, IRemoteUser } from "@/models/entities/user.js";
import type { MessagingMessage } from "@/models/entities/messaging-message.js"; import type { MessagingMessage } from "@/models/entities/messaging-message.js";
@ -58,14 +55,14 @@ export async function readUserMessagingMessage(
// Publish event // Publish event
await Promise.all([ await Promise.all([
publishToChatStream(otherpartyId, userId, ChatEvent.Read, messageIds), publishToChatStream(otherpartyId, userId, "read", messageIds),
publishToChatIndexStream(userId, ChatIndexEvent.Read, messageIds), publishToChatIndexStream(userId, "read", messageIds),
]); ]);
if (!(await Users.getHasUnreadMessagingMessage(userId))) { if (!(await Users.getHasUnreadMessagingMessage(userId))) {
// 全ての(いままで未読だった)自分宛てのメッセージを(これで)読みましたよというイベントを発行 // 全ての(いままで未読だった)自分宛てのメッセージを(これで)読みましたよというイベントを発行
publishMainStream(userId, "readAllMessagingMessages"); publishMainStream(userId, "readAllMessagingMessages");
await sendPushNotification(userId, PushNotificationKind.ReadAllChats, {}); await sendPushNotification(userId, "readAllChats", {});
} else { } else {
// そのユーザーとのメッセージで未読がなければイベント発行 // そのユーザーとのメッセージで未読がなければイベント発行
const hasUnread = await MessagingMessages.existsBy({ const hasUnread = await MessagingMessages.existsBy({
@ -75,13 +72,9 @@ export async function readUserMessagingMessage(
}); });
if (!hasUnread) { if (!hasUnread) {
await sendPushNotification( await sendPushNotification(userId, "readAllChatsInTheRoom", {
userId, userId: otherpartyId,
PushNotificationKind.ReadAllChatsInTheRoom, });
{
userId: otherpartyId,
},
);
} }
} }
} }
@ -133,17 +126,17 @@ export async function readGroupMessagingMessage(
// Publish events // Publish events
await Promise.all([ await Promise.all([
publishToGroupChatStream(groupId, ChatEvent.Read, { publishToGroupChatStream(groupId, "read", {
ids: reads, ids: reads,
userId, userId,
}), }),
publishToChatIndexStream(userId, ChatIndexEvent.Read, reads), publishToChatIndexStream(userId, "read", reads),
]); ]);
if (!(await Users.getHasUnreadMessagingMessage(userId))) { if (!(await Users.getHasUnreadMessagingMessage(userId))) {
// 全ての(いままで未読だった)自分宛てのメッセージを(これで)読みましたよというイベントを発行 // 全ての(いままで未読だった)自分宛てのメッセージを(これで)読みましたよというイベントを発行
publishMainStream(userId, "readAllMessagingMessages"); publishMainStream(userId, "readAllMessagingMessages");
await sendPushNotification(userId, PushNotificationKind.ReadAllChats, {}); await sendPushNotification(userId, "readAllChats", {});
} else { } else {
// そのグループにおいて未読がなければイベント発行 // そのグループにおいて未読がなければイベント発行
const hasUnread = await MessagingMessages.createQueryBuilder("message") const hasUnread = await MessagingMessages.createQueryBuilder("message")
@ -157,13 +150,9 @@ export async function readGroupMessagingMessage(
.then((x) => x != null); .then((x) => x != null);
if (!hasUnread) { if (!hasUnread) {
await sendPushNotification( await sendPushNotification(userId, "readAllChatsInTheRoom", {
userId, groupId,
PushNotificationKind.ReadAllChatsInTheRoom, });
{
groupId,
},
);
} }
} }
} }

View file

@ -1,6 +1,6 @@
import { In } from "typeorm"; import { In } from "typeorm";
import { publishMainStream } from "@/services/stream.js"; import { publishMainStream } from "@/services/stream.js";
import { sendPushNotification, PushNotificationKind } from "backend-rs"; import { sendPushNotification } from "backend-rs";
import type { User } from "@/models/entities/user.js"; import type { User } from "@/models/entities/user.js";
import type { Notification } from "@/models/entities/notification.js"; import type { Notification } from "@/models/entities/notification.js";
import { Notifications, Users } from "@/models/index.js"; import { Notifications, Users } from "@/models/index.js";
@ -47,11 +47,7 @@ export async function readNotificationByQuery(
function postReadAllNotifications(userId: User["id"]) { function postReadAllNotifications(userId: User["id"]) {
publishMainStream(userId, "readAllNotifications"); publishMainStream(userId, "readAllNotifications");
return sendPushNotification( return sendPushNotification(userId, "readAllNotifications", {});
userId,
PushNotificationKind.ReadAllNotifications,
{},
);
} }
function postReadNotifications( function postReadNotifications(
@ -59,7 +55,7 @@ function postReadNotifications(
notificationIds: Notification["id"][], notificationIds: Notification["id"][],
) { ) {
publishMainStream(userId, "readNotifications", notificationIds); publishMainStream(userId, "readNotifications", notificationIds);
return sendPushNotification(userId, PushNotificationKind.ReadNotifications, { return sendPushNotification(userId, "readNotifications", {
notificationIds, notificationIds,
}); });
} }

View file

@ -1,5 +1,5 @@
import { deleteFile } from "@/services/drive/delete-file.js"; import { deleteFile } from "@/services/drive/delete-file.js";
import { publishToDriveFileStream, DriveFileEvent } from "backend-rs"; import { publishToDriveFileStream } 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
publishToDriveFileStream(user.id, DriveFileEvent.Delete, file.id); publishToDriveFileStream(user.id, "delete", file.id);
}); });

View file

@ -1,4 +1,4 @@
import { publishToDriveFileStream, DriveFileEvent } from "backend-rs"; import { publishToDriveFileStream } 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";
@ -111,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
publishToDriveFileStream(user.id, DriveFileEvent.Update, toRustObject(file)); publishToDriveFileStream(user.id, "update", toRustObject(file));
return fileObj; return fileObj;
}); });

View file

@ -1,4 +1,4 @@
import { publishToDriveFolderStream, DriveFolderEvent } from "backend-rs"; import { publishToDriveFolderStream } 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";
@ -65,11 +65,7 @@ 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
publishToDriveFolderStream( publishToDriveFolderStream(user.id, "create", toRustObject(folder));
user.id,
DriveFolderEvent.Create,
toRustObject(folder),
);
return folderObj; return folderObj;
}); });

View file

@ -1,5 +1,5 @@
import define from "@/server/api/define.js"; import define from "@/server/api/define.js";
import { publishToDriveFolderStream, DriveFolderEvent } from "backend-rs"; import { publishToDriveFolderStream } 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
publishToDriveFolderStream(user.id, DriveFolderEvent.Delete, folder.id); publishToDriveFolderStream(user.id, "delete", folder.id);
}); });

View file

@ -1,4 +1,4 @@
import { publishToDriveFolderStream, DriveFolderEvent } from "backend-rs"; import { publishToDriveFolderStream } 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";
@ -85,10 +85,10 @@ export default define(meta, paramDef, async (ps, user) => {
id: folderId, id: folderId,
}); });
if (folder2!.id === folder!.id) { if (folder2?.id === folder.id) {
return true; return true;
} else if (folder2!.parentId) { } else if (folder2?.parentId) {
return await checkCircle(folder2!.parentId); return await checkCircle(folder2?.parentId);
} else { } else {
return false; return false;
} }
@ -113,11 +113,7 @@ 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
publishToDriveFolderStream( publishToDriveFolderStream(user.id, "update", toRustObject(folder));
user.id,
DriveFolderEvent.Update,
toRustObject(folder),
);
return folderObj; return folderObj;
}); });

View file

@ -1,5 +1,5 @@
import { publishMainStream } from "@/services/stream.js"; import { publishMainStream } from "@/services/stream.js";
import { sendPushNotification, PushNotificationKind } from "backend-rs"; import { sendPushNotification } from "backend-rs";
import { Notifications } from "@/models/index.js"; import { Notifications } from "@/models/index.js";
import define from "@/server/api/define.js"; import define from "@/server/api/define.js";
@ -31,9 +31,5 @@ export default define(meta, paramDef, async (_, user) => {
// 全ての通知を読みましたよというイベントを発行 // 全ての通知を読みましたよというイベントを発行
publishMainStream(user.id, "readAllNotifications"); publishMainStream(user.id, "readAllNotifications");
await sendPushNotification( await sendPushNotification(user.id, "readAllNotifications", {});
user.id,
PushNotificationKind.ReadAllNotifications,
{},
);
}); });

View file

@ -18,7 +18,6 @@ import {
publishToChannelStream, publishToChannelStream,
publishToChatStream, publishToChatStream,
publishToGroupChatStream, publishToGroupChatStream,
ChatEvent,
} from "backend-rs"; } from "backend-rs";
import type { UserGroup } from "@/models/entities/user-group.js"; import type { UserGroup } from "@/models/entities/user-group.js";
import type { Packed } from "@/misc/schema.js"; import type { Packed } from "@/misc/schema.js";
@ -378,15 +377,11 @@ export default class Connection {
await publishToChatStream( await publishToChatStream(
param.partner, param.partner,
this.user.id, this.user.id,
ChatEvent.Typing, "typing",
this.user.id, this.user.id,
); );
} else if (param.group != null) { } else if (param.group != null) {
await publishToGroupChatStream( await publishToGroupChatStream(param.group, "typing", this.user.id);
param.group,
ChatEvent.Typing,
this.user.id,
);
} }
} }
} }

View file

@ -7,12 +7,7 @@ import {
Users, Users,
Followings, Followings,
} from "@/models/index.js"; } from "@/models/index.js";
import { import { genIdAt, isSilencedServer, sendPushNotification } from "backend-rs";
genIdAt,
isSilencedServer,
sendPushNotification,
PushNotificationKind,
} from "backend-rs";
import type { User } from "@/models/entities/user.js"; import type { User } from "@/models/entities/user.js";
import type { Notification } from "@/models/entities/notification.js"; import type { Notification } from "@/models/entities/notification.js";
import { sendEmailNotification } from "./send-email-notification.js"; import { sendEmailNotification } from "./send-email-notification.js";
@ -89,17 +84,13 @@ export async function createNotification(
if (fresh == null) return; // 既に削除されているかもしれない if (fresh == null) return; // 既に削除されているかもしれない
// We execute this before, because the server side "read" check doesnt work well with push notifications, the app and service worker will decide themself // We execute this before, because the server side "read" check doesnt work well with push notifications, the app and service worker will decide themself
// when it is best to show push notifications // when it is best to show push notifications
await sendPushNotification( await sendPushNotification(notifieeId, "generic", packed);
notifieeId,
PushNotificationKind.Generic,
packed,
);
const userProfileLang = const userProfileLang =
(await UserProfiles.findOneBy({ userId: notifieeId }))?.lang ?? undefined; (await UserProfiles.findOneBy({ userId: notifieeId }))?.lang ?? undefined;
await sendPushNotification( await sendPushNotification(
notifieeId, notifieeId,
PushNotificationKind.Mastodon, "mastodon",
await NotificationConverter.encodePushNotificationPayloadForRust( await NotificationConverter.encodePushNotificationPayloadForRust(
packed, packed,
userProfileLang, userProfileLang,

View file

@ -7,7 +7,6 @@ import sharp from "sharp";
import { IsNull } from "typeorm"; import { IsNull } from "typeorm";
import { publishMainStream } from "@/services/stream.js"; import { publishMainStream } from "@/services/stream.js";
import { import {
DriveFileEvent,
FILE_TYPE_BROWSERSAFE, FILE_TYPE_BROWSERSAFE,
fetchMeta, fetchMeta,
genId, genId,
@ -669,11 +668,7 @@ export async function addFile({
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);
publishToDriveFileStream( publishToDriveFileStream(user.id, "create", toRustObject(file));
user.id,
DriveFileEvent.Create,
toRustObject(file),
);
}); });
} }

View file

@ -14,9 +14,6 @@ import {
publishToGroupChatStream, publishToGroupChatStream,
publishToChatIndexStream, publishToChatIndexStream,
toPuny, toPuny,
ChatEvent,
ChatIndexEvent,
PushNotificationKind,
} from "backend-rs"; } from "backend-rs";
import type { MessagingMessage } from "@/models/entities/messaging-message.js"; import type { MessagingMessage } from "@/models/entities/messaging-message.js";
import { publishMainStream } from "@/services/stream.js"; import { publishMainStream } from "@/services/stream.js";
@ -61,14 +58,10 @@ export async function createMessage(
publishToChatStream( publishToChatStream(
message.userId, message.userId,
recipientUser.id, recipientUser.id,
ChatEvent.Message, "message",
messageObj,
),
publishToChatIndexStream(
message.userId,
ChatIndexEvent.Message,
messageObj, messageObj,
), ),
publishToChatIndexStream(message.userId, "message", messageObj),
]); ]);
publishMainStream(message.userId, "messagingMessage", messageObj); publishMainStream(message.userId, "messagingMessage", messageObj);
} }
@ -79,35 +72,23 @@ export async function createMessage(
publishToChatStream( publishToChatStream(
recipientUser.id, recipientUser.id,
message.userId, message.userId,
ChatEvent.Message, "message",
messageObj,
),
publishToChatIndexStream(
recipientUser.id,
ChatIndexEvent.Message,
messageObj, messageObj,
), ),
publishToChatIndexStream(recipientUser.id, "message", messageObj),
]); ]);
publishMainStream(recipientUser.id, "messagingMessage", messageObj); publishMainStream(recipientUser.id, "messagingMessage", messageObj);
} }
} else if (recipientGroup != null) { } else if (recipientGroup != null) {
// group's stream // group's stream
await publishToGroupChatStream( await publishToGroupChatStream(recipientGroup.id, "message", messageObj);
recipientGroup.id,
ChatEvent.Message,
messageObj,
);
// member's stream // member's stream
const joinings = await UserGroupJoinings.findBy({ const joinings = await UserGroupJoinings.findBy({
userGroupId: recipientGroup.id, userGroupId: recipientGroup.id,
}); });
for await (const joining of joinings) { for await (const joining of joinings) {
await publishToChatIndexStream( await publishToChatIndexStream(joining.userId, "message", messageObj);
joining.userId,
ChatIndexEvent.Message,
messageObj,
);
publishMainStream(joining.userId, "messagingMessage", messageObj); publishMainStream(joining.userId, "messagingMessage", messageObj);
} }
} }
@ -128,11 +109,7 @@ export async function createMessage(
//#endregion //#endregion
publishMainStream(recipientUser.id, "unreadMessagingMessage", messageObj); publishMainStream(recipientUser.id, "unreadMessagingMessage", messageObj);
await sendPushNotification( await sendPushNotification(recipientUser.id, "chat", messageObj);
recipientUser.id,
PushNotificationKind.Chat,
messageObj,
);
} else if (recipientGroup) { } else if (recipientGroup) {
const joinings = await UserGroupJoinings.findBy({ const joinings = await UserGroupJoinings.findBy({
userGroupId: recipientGroup.id, userGroupId: recipientGroup.id,
@ -141,11 +118,7 @@ export async function createMessage(
for await (const joining of joinings) { for await (const joining of joinings) {
if (freshMessage.reads.includes(joining.userId)) return; // 既読 if (freshMessage.reads.includes(joining.userId)) return; // 既読
publishMainStream(joining.userId, "unreadMessagingMessage", messageObj); publishMainStream(joining.userId, "unreadMessagingMessage", messageObj);
await sendPushNotification( await sendPushNotification(joining.userId, "chat", messageObj);
joining.userId,
PushNotificationKind.Chat,
messageObj,
);
} }
} }
}, 2000); }, 2000);

View file

@ -1,11 +1,7 @@
import { config } from "@/config.js"; import { config } from "@/config.js";
import { MessagingMessages, Users } from "@/models/index.js"; import { MessagingMessages, Users } from "@/models/index.js";
import type { MessagingMessage } from "@/models/entities/messaging-message.js"; import type { MessagingMessage } from "@/models/entities/messaging-message.js";
import { import { publishToChatStream, publishToGroupChatStream } from "backend-rs";
publishToChatStream,
publishToGroupChatStream,
ChatEvent,
} from "backend-rs";
import { renderActivity } from "@/remote/activitypub/renderer/index.js"; import { renderActivity } from "@/remote/activitypub/renderer/index.js";
import renderDelete from "@/remote/activitypub/renderer/delete.js"; import renderDelete from "@/remote/activitypub/renderer/delete.js";
import renderTombstone from "@/remote/activitypub/renderer/tombstone.js"; import renderTombstone from "@/remote/activitypub/renderer/tombstone.js";
@ -27,14 +23,14 @@ async function postDeleteMessage(message: MessagingMessage) {
await publishToChatStream( await publishToChatStream(
message.userId, message.userId,
message.recipientId, message.recipientId,
ChatEvent.Deleted, "deleted",
message.id, message.id,
); );
if (Users.isLocalUser(recipient)) if (Users.isLocalUser(recipient))
await publishToChatStream( await publishToChatStream(
message.recipientId, message.recipientId,
message.userId, message.userId,
ChatEvent.Deleted, "deleted",
message.id, message.id,
); );
@ -48,10 +44,6 @@ async function postDeleteMessage(message: MessagingMessage) {
deliver(user, activity, recipient.inbox); deliver(user, activity, recipient.inbox);
} }
} else if (message.groupId != null) { } else if (message.groupId != null) {
await publishToGroupChatStream( await publishToGroupChatStream(message.groupId, "deleted", message.id);
message.groupId,
ChatEvent.Deleted,
message.id,
);
} }
} }

View file

@ -391,7 +391,6 @@ export default async (
} }
}); });
// type errors will be resolved by https://github.com/napi-rs/napi-rs/pull/2054
const _note = toRustObject(note); const _note = toRustObject(note);
if (note.renoteId == null || isQuote(_note)) { if (note.renoteId == null || isQuote(_note)) {
await updateAntennasOnNewNote(_note, user, thisNoteIsMutedBy); await updateAntennasOnNewNote(_note, user, thisNoteIsMutedBy);

View file

@ -88,6 +88,6 @@
"vue-draggable-plus": "0.5.0", "vue-draggable-plus": "0.5.0",
"vue-plyr": "7.0.0", "vue-plyr": "7.0.0",
"vue-prism-editor": "2.0.0-alpha.2", "vue-prism-editor": "2.0.0-alpha.2",
"vue-tsc": "2.0.24" "vue-tsc": "2.0.26"
} }
} }

View file

@ -506,8 +506,8 @@ importers:
packages/backend-rs: packages/backend-rs:
devDependencies: devDependencies:
'@napi-rs/cli': '@napi-rs/cli':
specifier: 3.0.0-alpha.55 specifier: 3.0.0-alpha.56
version: 3.0.0-alpha.55(@emnapi/runtime@1.2.0) version: 3.0.0-alpha.56(@emnapi/runtime@1.2.0)
packages/client: packages/client:
devDependencies: devDependencies:
@ -737,8 +737,8 @@ importers:
specifier: 2.0.0-alpha.2 specifier: 2.0.0-alpha.2
version: 2.0.0-alpha.2(vue@3.4.31(typescript@5.5.3)) version: 2.0.0-alpha.2(vue@3.4.31(typescript@5.5.3))
vue-tsc: vue-tsc:
specifier: 2.0.24 specifier: 2.0.26
version: 2.0.24(typescript@5.5.3) version: 2.0.26(typescript@5.5.3)
packages/firefish-js: packages/firefish-js:
dependencies: dependencies:
@ -1717,8 +1717,8 @@ packages:
cpu: [x64] cpu: [x64]
os: [win32] os: [win32]
'@napi-rs/cli@3.0.0-alpha.55': '@napi-rs/cli@3.0.0-alpha.56':
resolution: {integrity: sha512-6XgBBTX8O28W5gcSzqYkI72UVJV6Y2YcyQNrEqak39JavJRLlXCv09uLF97raynXAOO50KeP6DEXFy5P8MR2sw==} resolution: {integrity: sha512-a03KyEodiZD9+MIL8xnIAcnNzznZy+BT/IBtXZe/kIEUYv/zVcxwpcBuNme5r6zIyDqla8NkhsC6h8IZR+HAgg==}
engines: {node: '>= 16'} engines: {node: '>= 16'}
hasBin: true hasBin: true
peerDependencies: peerDependencies:
@ -2027,20 +2027,20 @@ packages:
resolution: {integrity: sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg==} resolution: {integrity: sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg==}
engines: {node: '>= 8'} engines: {node: '>= 8'}
'@octokit/auth-token@4.0.0': '@octokit/auth-token@5.1.1':
resolution: {integrity: sha512-tY/msAuJo6ARbK6SPIxZrPBms3xPbfwBrulZe0Wtr/DIY9lje2HeV1uoebShn6mx7SjCHif6EjMvoREj+gZ+SA==} resolution: {integrity: sha512-rh3G3wDO8J9wSjfI436JUKzHIxq8NaiL0tVeB2aXmG6p/9859aUOAjA9pmSPNGGZxfwmaJ9ozOJImuNVJdpvbA==}
engines: {node: '>= 18'} engines: {node: '>= 18'}
'@octokit/core@5.2.0': '@octokit/core@6.1.2':
resolution: {integrity: sha512-1LFfa/qnMQvEOAdzlQymH0ulepxbxnCYAKJZfMci/5XJyIHWgEYnDmgnKakbTh7CH2tFQ5O60oYDvns4i9RAIg==} resolution: {integrity: sha512-hEb7Ma4cGJGEUNOAVmyfdB/3WirWMg5hDuNFVejGEDFqupeOysLc2sG6HJxY2etBp5YQu5Wtxwi020jS9xlUwg==}
engines: {node: '>= 18'} engines: {node: '>= 18'}
'@octokit/endpoint@9.0.5': '@octokit/endpoint@10.1.1':
resolution: {integrity: sha512-ekqR4/+PCLkEBF6qgj8WqJfvDq65RH85OAgrtnVp1mSxaXF03u2xW/hUdweGS5654IlC0wkNYC18Z50tSYTAFw==} resolution: {integrity: sha512-JYjh5rMOwXMJyUpj028cu0Gbp7qe/ihxfJMLc8VZBMMqSwLgOxDI1911gV4Enl1QSavAQNJcwmwBF9M0VvLh6Q==}
engines: {node: '>= 18'} engines: {node: '>= 18'}
'@octokit/graphql@7.1.0': '@octokit/graphql@8.1.1':
resolution: {integrity: sha512-r+oZUH7aMFui1ypZnAvZmn0KSqAUgE1/tUXIWaqUCa1758ts/Jio84GZuzsvUkme98kv0WFY8//n0J1Z+vsIsQ==} resolution: {integrity: sha512-ukiRmuHTi6ebQx/HFRCXKbDlOh/7xEV6QUXaE7MJEKGNAncGI/STSbOkl12qVXZrfZdpXctx5O9X1AIaebiDBg==}
engines: {node: '>= 18'} engines: {node: '>= 18'}
'@octokit/openapi-types@22.2.0': '@octokit/openapi-types@22.2.0':
@ -2052,11 +2052,11 @@ packages:
peerDependencies: peerDependencies:
'@octokit/core': '5' '@octokit/core': '5'
'@octokit/plugin-request-log@4.0.1': '@octokit/plugin-request-log@5.3.0':
resolution: {integrity: sha512-GihNqNpGHorUrO7Qa9JbAl0dbLnqJVrV8OXe2Zm5/Y4wFkZQDfTreBzVmiRfJVfE4mClXdihHnbpyyO9FSX4HA==} resolution: {integrity: sha512-FiGcyjdtYPlr03ExBk/0ysIlEFIFGJQAVoPPMxL19B24bVSEiZQnVGBunNtaAF1YnvE/EFoDpXmITtRnyCiypQ==}
engines: {node: '>= 18'} engines: {node: '>= 18'}
peerDependencies: peerDependencies:
'@octokit/core': '5' '@octokit/core': '>=6'
'@octokit/plugin-rest-endpoint-methods@13.2.2': '@octokit/plugin-rest-endpoint-methods@13.2.2':
resolution: {integrity: sha512-EI7kXWidkt3Xlok5uN43suK99VWqc8OaIMktY9d9+RNKl69juoTyxmLoWPIZgJYzi41qj/9zU7G/ljnNOJ5AFA==} resolution: {integrity: sha512-EI7kXWidkt3Xlok5uN43suK99VWqc8OaIMktY9d9+RNKl69juoTyxmLoWPIZgJYzi41qj/9zU7G/ljnNOJ5AFA==}
@ -2064,16 +2064,16 @@ packages:
peerDependencies: peerDependencies:
'@octokit/core': ^5 '@octokit/core': ^5
'@octokit/request-error@5.1.0': '@octokit/request-error@6.1.1':
resolution: {integrity: sha512-GETXfE05J0+7H2STzekpKObFe765O5dlAKUTLNGeH+x47z7JjXHfsHKo5z21D/o/IOZTUEI6nyWyR+bZVP/n5Q==} resolution: {integrity: sha512-1mw1gqT3fR/WFvnoVpY/zUM2o/XkMs/2AszUUG9I69xn0JFLv6PGkPhNk5lbfvROs79wiS0bqiJNxfCZcRJJdg==}
engines: {node: '>= 18'} engines: {node: '>= 18'}
'@octokit/request@8.4.0': '@octokit/request@9.1.1':
resolution: {integrity: sha512-9Bb014e+m2TgBeEJGEbdplMVWwPmL1FPtggHQRkV+WVsMggPtEkLKPlcVYm/o8xKLkpJ7B+6N8WfQMtDLX2Dpw==} resolution: {integrity: sha512-pyAguc0p+f+GbQho0uNetNQMmLG1e80WjkIaqqgUkihqUp0boRU6nKItXO4VWnr+nbZiLGEyy4TeKRwqaLvYgw==}
engines: {node: '>= 18'} engines: {node: '>= 18'}
'@octokit/rest@20.1.1': '@octokit/rest@21.0.0':
resolution: {integrity: sha512-MB4AYDsM5jhIHro/dq4ix1iWTLGToIGk6cWF5L6vanFaMble5jTX/UBQyiv05HsWnwUtY8JrfHy2LWfKwihqMw==} resolution: {integrity: sha512-XudXXOmiIjivdjNZ+fN71NLrnDM00sxSZlhqmPR3v0dVoJwyP628tSlc12xqn8nX3N0965583RBw5GPo6r8u4Q==}
engines: {node: '>= 18'} engines: {node: '>= 18'}
'@octokit/types@13.5.0': '@octokit/types@13.5.0':
@ -2574,14 +2574,14 @@ packages:
vite: ^5.0.0 vite: ^5.0.0
vue: ^3.2.25 vue: ^3.2.25
'@volar/language-core@2.4.0-alpha.5': '@volar/language-core@2.4.0-alpha.15':
resolution: {integrity: sha512-CX+0vrNoCcO3tGZYIn7kNHug/u6+EImfbZe0tI6x/lCZc0MBJ7t9f6AKJT+mHJZ3ePhva6NVNv8mY1tNEURd5A==} resolution: {integrity: sha512-mt8z4Fm2WxfQYoQHPcKVjLQV6PgPqyKLbkCVY2cr5RSaamqCHjhKEpsFX66aL4D/7oYguuaUw9Bx03Vt0TpIIA==}
'@volar/source-map@2.4.0-alpha.5': '@volar/source-map@2.4.0-alpha.15':
resolution: {integrity: sha512-5OxMPGqbxaMuFXfj10k3xWwmJ2nb0b20kNaONAKxwUQxGY6nh6skX5AAFhIAbC8woplsVJpR0tAhgQR4S96VYQ==} resolution: {integrity: sha512-8Htngw5TmBY4L3ClDqBGyfLhsB8EmoEXUH1xydyEtEoK0O6NX5ur4Jw8jgvscTlwzizyl/wsN1vn0cQXVbbXYg==}
'@volar/typescript@2.4.0-alpha.5': '@volar/typescript@2.4.0-alpha.15':
resolution: {integrity: sha512-D9nzGP09afyLlsXC5rzVeLzEaMLOmW1GGPyOiuXRRGTLshX+/cp+MNsUbwUd3pih0OhRmpUFl4VHpUGA2M4iBw==} resolution: {integrity: sha512-U3StRBbDuxV6Woa4hvGS4kz3XcOzrWUKgFdEFN+ba1x3eaYg7+ytau8ul05xgA+UNGLXXsKur7fTUhDFyISk0w==}
'@vue/compiler-core@3.4.31': '@vue/compiler-core@3.4.31':
resolution: {integrity: sha512-skOiodXWTV3DxfDhB4rOf3OGalpITLlgCeOwb+Y9GJpfQ8ErigdBUHomBzvG78JoVE8MJoQsb+qhZiHfKeNeEg==} resolution: {integrity: sha512-skOiodXWTV3DxfDhB4rOf3OGalpITLlgCeOwb+Y9GJpfQ8ErigdBUHomBzvG78JoVE8MJoQsb+qhZiHfKeNeEg==}
@ -2598,8 +2598,8 @@ packages:
'@vue/compiler-ssr@3.4.31': '@vue/compiler-ssr@3.4.31':
resolution: {integrity: sha512-RtefmITAje3fJ8FSg1gwgDhdKhZVntIVbwupdyZDSifZTRMiWxWehAOTCc8/KZDnBOcYQ4/9VWxsTbd3wT0hAA==} resolution: {integrity: sha512-RtefmITAje3fJ8FSg1gwgDhdKhZVntIVbwupdyZDSifZTRMiWxWehAOTCc8/KZDnBOcYQ4/9VWxsTbd3wT0hAA==}
'@vue/language-core@2.0.24': '@vue/language-core@2.0.26':
resolution: {integrity: sha512-997YD6Lq/66LXr3ZOLNxDCmyn13z9NP8LU1UZn9hGCDWhzlbXAIP0hOgL3w3x4RKEaWTaaRtsHP9DzHvmduruQ==} resolution: {integrity: sha512-/lt6SfQ3O1yDAhPsnLv9iSUgXd1dMHqUm/t3RctfqjuwQf1LnftZ414X3UBn6aXT4MiwXWtbNJ4Z0NZWwDWgJQ==}
peerDependencies: peerDependencies:
typescript: '*' typescript: '*'
peerDependenciesMeta: peerDependenciesMeta:
@ -2893,8 +2893,8 @@ packages:
bcrypt-pbkdf@1.0.2: bcrypt-pbkdf@1.0.2:
resolution: {integrity: sha512-qeFIXtP4MSoi6NLqO12WfqARWWuCKi2Rn/9hJLEmtB5yTNr9DqFWkJRCf2qShWzPeAMRnOgCrq0sg/KLv5ES9w==} resolution: {integrity: sha512-qeFIXtP4MSoi6NLqO12WfqARWWuCKi2Rn/9hJLEmtB5yTNr9DqFWkJRCf2qShWzPeAMRnOgCrq0sg/KLv5ES9w==}
before-after-hook@2.2.3: before-after-hook@3.0.2:
resolution: {integrity: sha512-NzUnlZexiaH/46WDhANlyR2bXRopNg4F/zuSA3OpZnllCUgRaOF2znDioDWrmbNVsuZk6l9pMquQB38cfBZwkQ==} resolution: {integrity: sha512-Nik3Sc0ncrMK4UUdXQmAnRtzmNQTAAXmXIopizwZ1W1t8QmfJj+zL4OA2I7XPTPW5z5TDqv4hRo/JzouDJnX3A==}
binary-extensions@2.3.0: binary-extensions@2.3.0:
resolution: {integrity: sha512-Ceh+7ox5qe7LJuLHoY0feh3pHuUDHAcRUeyL2VYghZwfpkNIy/+8Ocg0a3UuSoYzavmylwuLWQOf3hl0jjMMIw==} resolution: {integrity: sha512-Ceh+7ox5qe7LJuLHoY0feh3pHuUDHAcRUeyL2VYghZwfpkNIy/+8Ocg0a3UuSoYzavmylwuLWQOf3hl0jjMMIw==}
@ -3657,9 +3657,6 @@ packages:
resolution: {integrity: sha512-g7nH6P6dyDioJogAAGprGpCtVImJhpPk/roCzdb3fIh61/s/nPsfR6onyMwkCAR/OlC3yBC0lESvUoQEAssIrw==} resolution: {integrity: sha512-g7nH6P6dyDioJogAAGprGpCtVImJhpPk/roCzdb3fIh61/s/nPsfR6onyMwkCAR/OlC3yBC0lESvUoQEAssIrw==}
engines: {node: '>= 0.8'} engines: {node: '>= 0.8'}
deprecation@2.3.1:
resolution: {integrity: sha512-xmHIy4F3scKVwMsQ4WnVaS8bHOx0DmVwRywosKhaILI0ywMDWPtBSku2HNxRvF7jtwDRsoEwYQSfbxj8b7RlJQ==}
destroy@1.2.0: destroy@1.2.0:
resolution: {integrity: sha512-2sJGJTaXIIaR1w4iJSNoN0hnMY7Gpc/n8D4qSCJw8QqFWXf7cuAgnEHxBpweaVcPevC2l3KpjYCx3NypQQgaJg==} resolution: {integrity: sha512-2sJGJTaXIIaR1w4iJSNoN0hnMY7Gpc/n8D4qSCJw8QqFWXf7cuAgnEHxBpweaVcPevC2l3KpjYCx3NypQQgaJg==}
engines: {node: '>= 0.8', npm: 1.2.8000 || >= 1.4.16} engines: {node: '>= 0.8', npm: 1.2.8000 || >= 1.4.16}
@ -6587,8 +6584,8 @@ packages:
unicode-emoji-json@0.6.0: unicode-emoji-json@0.6.0:
resolution: {integrity: sha512-tAYF+EsOxa8jo/XPNYHRX7Nc8uoII+/edIpHM4DQI4nMp3AuRmwGZhL8fEBe0kUk0zHK+6wiwxxxNwfW5ap2Tg==} resolution: {integrity: sha512-tAYF+EsOxa8jo/XPNYHRX7Nc8uoII+/edIpHM4DQI4nMp3AuRmwGZhL8fEBe0kUk0zHK+6wiwxxxNwfW5ap2Tg==}
universal-user-agent@6.0.1: universal-user-agent@7.0.2:
resolution: {integrity: sha512-yCzhz6FN2wU1NiiQRogkTQszlQSlpWaw8SvVegAc+bDxbzHgh1vX8uIe8OYyMH6DwH+sdTJsgMl36+mSMdRJIQ==} resolution: {integrity: sha512-0JCqzSKnStlRRQfCdowvqy3cy0Dvtlb8xecj/H8JFZuCze4rwjPZQOgvFvn0Ws/usCHQFGpyr+pB9adaGwXn4Q==}
universalify@0.1.2: universalify@0.1.2:
resolution: {integrity: sha512-rBJeI5CXAlmy1pV+617WB9J63U6XcazHHF2f2dbJix4XzpUF0RS3Zbj0FGIOCAva5P/d/GBOYaACQ1w+0azUkg==} resolution: {integrity: sha512-rBJeI5CXAlmy1pV+617WB9J63U6XcazHHF2f2dbJix4XzpUF0RS3Zbj0FGIOCAva5P/d/GBOYaACQ1w+0azUkg==}
@ -6732,8 +6729,8 @@ packages:
vue-template-compiler@2.7.16: vue-template-compiler@2.7.16:
resolution: {integrity: sha512-AYbUWAJHLGGQM7+cNTELw+KsOG9nl2CnSv467WobS5Cv9uk3wFcnr1Etsz2sEIHEZvw1U+o9mRlEO6QbZvUPGQ==} resolution: {integrity: sha512-AYbUWAJHLGGQM7+cNTELw+KsOG9nl2CnSv467WobS5Cv9uk3wFcnr1Etsz2sEIHEZvw1U+o9mRlEO6QbZvUPGQ==}
vue-tsc@2.0.24: vue-tsc@2.0.26:
resolution: {integrity: sha512-1qi4P8L7yS78A7OJ7CDDxUIZPD6nVxoQEgX3DkRZNi1HI1qOfzOJwQlNpmwkogSVD6S/XcanbW9sktzpSxz6rA==} resolution: {integrity: sha512-tOhuwy2bIXbMhz82ef37qeiaQHMXKQkD6mOF6CCPl3/uYtST3l6fdNyfMxipudrQTxTfXVPlgJdMENBFfC1CfQ==}
hasBin: true hasBin: true
peerDependencies: peerDependencies:
typescript: '>=5.0.0' typescript: '>=5.0.0'
@ -7910,11 +7907,11 @@ snapshots:
'@msgpackr-extract/msgpackr-extract-win32-x64@3.0.3': '@msgpackr-extract/msgpackr-extract-win32-x64@3.0.3':
optional: true optional: true
'@napi-rs/cli@3.0.0-alpha.55(@emnapi/runtime@1.2.0)': '@napi-rs/cli@3.0.0-alpha.56(@emnapi/runtime@1.2.0)':
dependencies: dependencies:
'@napi-rs/cross-toolchain': 0.0.16 '@napi-rs/cross-toolchain': 0.0.16
'@napi-rs/wasm-tools': 0.0.2 '@napi-rs/wasm-tools': 0.0.2
'@octokit/rest': 20.1.1 '@octokit/rest': 21.0.0
clipanion: 3.2.1(typanion@3.14.0) clipanion: 3.2.1(typanion@3.14.0)
colorette: 2.0.20 colorette: 2.0.20
debug: 4.3.5(supports-color@8.1.1) debug: 4.3.5(supports-color@8.1.1)
@ -8144,64 +8141,62 @@ snapshots:
'@nodelib/fs.scandir': 2.1.5 '@nodelib/fs.scandir': 2.1.5
fastq: 1.17.1 fastq: 1.17.1
'@octokit/auth-token@4.0.0': {} '@octokit/auth-token@5.1.1': {}
'@octokit/core@5.2.0': '@octokit/core@6.1.2':
dependencies: dependencies:
'@octokit/auth-token': 4.0.0 '@octokit/auth-token': 5.1.1
'@octokit/graphql': 7.1.0 '@octokit/graphql': 8.1.1
'@octokit/request': 8.4.0 '@octokit/request': 9.1.1
'@octokit/request-error': 5.1.0 '@octokit/request-error': 6.1.1
'@octokit/types': 13.5.0 '@octokit/types': 13.5.0
before-after-hook: 2.2.3 before-after-hook: 3.0.2
universal-user-agent: 6.0.1 universal-user-agent: 7.0.2
'@octokit/endpoint@9.0.5': '@octokit/endpoint@10.1.1':
dependencies: dependencies:
'@octokit/types': 13.5.0 '@octokit/types': 13.5.0
universal-user-agent: 6.0.1 universal-user-agent: 7.0.2
'@octokit/graphql@7.1.0': '@octokit/graphql@8.1.1':
dependencies: dependencies:
'@octokit/request': 8.4.0 '@octokit/request': 9.1.1
'@octokit/types': 13.5.0 '@octokit/types': 13.5.0
universal-user-agent: 6.0.1 universal-user-agent: 7.0.2
'@octokit/openapi-types@22.2.0': {} '@octokit/openapi-types@22.2.0': {}
'@octokit/plugin-paginate-rest@11.3.1(@octokit/core@5.2.0)': '@octokit/plugin-paginate-rest@11.3.1(@octokit/core@6.1.2)':
dependencies: dependencies:
'@octokit/core': 5.2.0 '@octokit/core': 6.1.2
'@octokit/types': 13.5.0 '@octokit/types': 13.5.0
'@octokit/plugin-request-log@4.0.1(@octokit/core@5.2.0)': '@octokit/plugin-request-log@5.3.0(@octokit/core@6.1.2)':
dependencies: dependencies:
'@octokit/core': 5.2.0 '@octokit/core': 6.1.2
'@octokit/plugin-rest-endpoint-methods@13.2.2(@octokit/core@5.2.0)': '@octokit/plugin-rest-endpoint-methods@13.2.2(@octokit/core@6.1.2)':
dependencies: dependencies:
'@octokit/core': 5.2.0 '@octokit/core': 6.1.2
'@octokit/types': 13.5.0 '@octokit/types': 13.5.0
'@octokit/request-error@5.1.0': '@octokit/request-error@6.1.1':
dependencies: dependencies:
'@octokit/types': 13.5.0 '@octokit/types': 13.5.0
deprecation: 2.3.1
once: 1.4.0
'@octokit/request@8.4.0': '@octokit/request@9.1.1':
dependencies: dependencies:
'@octokit/endpoint': 9.0.5 '@octokit/endpoint': 10.1.1
'@octokit/request-error': 5.1.0 '@octokit/request-error': 6.1.1
'@octokit/types': 13.5.0 '@octokit/types': 13.5.0
universal-user-agent: 6.0.1 universal-user-agent: 7.0.2
'@octokit/rest@20.1.1': '@octokit/rest@21.0.0':
dependencies: dependencies:
'@octokit/core': 5.2.0 '@octokit/core': 6.1.2
'@octokit/plugin-paginate-rest': 11.3.1(@octokit/core@5.2.0) '@octokit/plugin-paginate-rest': 11.3.1(@octokit/core@6.1.2)
'@octokit/plugin-request-log': 4.0.1(@octokit/core@5.2.0) '@octokit/plugin-request-log': 5.3.0(@octokit/core@6.1.2)
'@octokit/plugin-rest-endpoint-methods': 13.2.2(@octokit/core@5.2.0) '@octokit/plugin-rest-endpoint-methods': 13.2.2(@octokit/core@6.1.2)
'@octokit/types@13.5.0': '@octokit/types@13.5.0':
dependencies: dependencies:
@ -8714,15 +8709,15 @@ snapshots:
vite: 5.3.3(@types/node@20.14.9)(sass@1.77.6)(stylus@0.57.0)(terser@5.31.0) vite: 5.3.3(@types/node@20.14.9)(sass@1.77.6)(stylus@0.57.0)(terser@5.31.0)
vue: 3.4.31(typescript@5.5.3) vue: 3.4.31(typescript@5.5.3)
'@volar/language-core@2.4.0-alpha.5': '@volar/language-core@2.4.0-alpha.15':
dependencies: dependencies:
'@volar/source-map': 2.4.0-alpha.5 '@volar/source-map': 2.4.0-alpha.15
'@volar/source-map@2.4.0-alpha.5': {} '@volar/source-map@2.4.0-alpha.15': {}
'@volar/typescript@2.4.0-alpha.5': '@volar/typescript@2.4.0-alpha.15':
dependencies: dependencies:
'@volar/language-core': 2.4.0-alpha.5 '@volar/language-core': 2.4.0-alpha.15
path-browserify: 1.0.1 path-browserify: 1.0.1
vscode-uri: 3.0.8 vscode-uri: 3.0.8
@ -8764,9 +8759,9 @@ snapshots:
'@vue/compiler-dom': 3.4.31 '@vue/compiler-dom': 3.4.31
'@vue/shared': 3.4.31 '@vue/shared': 3.4.31
'@vue/language-core@2.0.24(typescript@5.5.3)': '@vue/language-core@2.0.26(typescript@5.5.3)':
dependencies: dependencies:
'@volar/language-core': 2.4.0-alpha.5 '@volar/language-core': 2.4.0-alpha.15
'@vue/compiler-dom': 3.4.31 '@vue/compiler-dom': 3.4.31
'@vue/shared': 3.4.31 '@vue/shared': 3.4.31
computeds: 0.0.1 computeds: 0.0.1
@ -9124,7 +9119,7 @@ snapshots:
dependencies: dependencies:
tweetnacl: 0.14.5 tweetnacl: 0.14.5
before-after-hook@2.2.3: {} before-after-hook@3.0.2: {}
binary-extensions@2.3.0: {} binary-extensions@2.3.0: {}
@ -9787,8 +9782,6 @@ snapshots:
depd@2.0.0: {} depd@2.0.0: {}
deprecation@2.3.1: {}
destroy@1.2.0: {} destroy@1.2.0: {}
detect-libc@2.0.3: {} detect-libc@2.0.3: {}
@ -13042,7 +13035,7 @@ snapshots:
unicode-emoji-json@0.6.0: {} unicode-emoji-json@0.6.0: {}
universal-user-agent@6.0.1: {} universal-user-agent@7.0.2: {}
universalify@0.1.2: {} universalify@0.1.2: {}
@ -13162,10 +13155,10 @@ snapshots:
de-indent: 1.0.2 de-indent: 1.0.2
he: 1.2.0 he: 1.2.0
vue-tsc@2.0.24(typescript@5.5.3): vue-tsc@2.0.26(typescript@5.5.3):
dependencies: dependencies:
'@volar/typescript': 2.4.0-alpha.5 '@volar/typescript': 2.4.0-alpha.15
'@vue/language-core': 2.0.24(typescript@5.5.3) '@vue/language-core': 2.0.26(typescript@5.5.3)
semver: 7.6.2 semver: 7.6.2
typescript: 5.5.3 typescript: 5.5.3