summaryrefslogtreecommitdiff
path: root/packages/backend/src/server/api/stream
diff options
context:
space:
mode:
Diffstat (limited to 'packages/backend/src/server/api/stream')
-rw-r--r--packages/backend/src/server/api/stream/ChannelsService.ts3
-rw-r--r--packages/backend/src/server/api/stream/Connection.ts5
-rw-r--r--packages/backend/src/server/api/stream/channel.ts8
-rw-r--r--packages/backend/src/server/api/stream/channels/admin.ts8
-rw-r--r--packages/backend/src/server/api/stream/channels/antenna.ts8
-rw-r--r--packages/backend/src/server/api/stream/channels/channel.ts7
-rw-r--r--packages/backend/src/server/api/stream/channels/drive.ts8
-rw-r--r--packages/backend/src/server/api/stream/channels/global-timeline.ts7
-rw-r--r--packages/backend/src/server/api/stream/channels/hashtag.ts7
-rw-r--r--packages/backend/src/server/api/stream/channels/home-timeline.ts8
-rw-r--r--packages/backend/src/server/api/stream/channels/hybrid-timeline.ts8
-rw-r--r--packages/backend/src/server/api/stream/channels/local-timeline.ts7
-rw-r--r--packages/backend/src/server/api/stream/channels/main.ts8
-rw-r--r--packages/backend/src/server/api/stream/channels/queue-stats.ts7
-rw-r--r--packages/backend/src/server/api/stream/channels/role-timeline.ts7
-rw-r--r--packages/backend/src/server/api/stream/channels/server-stats.ts7
-rw-r--r--packages/backend/src/server/api/stream/channels/user-list.ts7
17 files changed, 77 insertions, 43 deletions
diff --git a/packages/backend/src/server/api/stream/ChannelsService.ts b/packages/backend/src/server/api/stream/ChannelsService.ts
index 8fd106c10c..3bc5380132 100644
--- a/packages/backend/src/server/api/stream/ChannelsService.ts
+++ b/packages/backend/src/server/api/stream/ChannelsService.ts
@@ -19,6 +19,7 @@ import { AntennaChannelService } from './channels/antenna.js';
import { DriveChannelService } from './channels/drive.js';
import { HashtagChannelService } from './channels/hashtag.js';
import { RoleTimelineChannelService } from './channels/role-timeline.js';
+import { type MiChannelService } from './channel.js';
@Injectable()
export class ChannelsService {
@@ -41,7 +42,7 @@ export class ChannelsService {
}
@bindThis
- public getChannelService(name: string) {
+ public getChannelService(name: string): MiChannelService<boolean> {
switch (name) {
case 'main': return this.mainChannelService;
case 'homeTimeline': return this.homeTimelineChannelService;
diff --git a/packages/backend/src/server/api/stream/Connection.ts b/packages/backend/src/server/api/stream/Connection.ts
index 4180ccc56a..a89fbcc5e5 100644
--- a/packages/backend/src/server/api/stream/Connection.ts
+++ b/packages/backend/src/server/api/stream/Connection.ts
@@ -248,6 +248,11 @@ export default class Connection {
return;
}
+ if (this.token && ((channelService.kind && !this.token.permission.some(p => p === channelService.kind))
+ || (!channelService.kind && channelService.requireCredential))) {
+ return;
+ }
+
// 共有可能チャンネルに接続しようとしていて、かつそのチャンネルに既に接続していたら無意味なので無視
if (channelService.shouldShare && this.channels.some(c => c.chName === channel)) {
return;
diff --git a/packages/backend/src/server/api/stream/channel.ts b/packages/backend/src/server/api/stream/channel.ts
index 46b0709773..80df3803eb 100644
--- a/packages/backend/src/server/api/stream/channel.ts
+++ b/packages/backend/src/server/api/stream/channel.ts
@@ -16,6 +16,7 @@ export default abstract class Channel {
public abstract readonly chName: string;
public static readonly shouldShare: boolean;
public static readonly requireCredential: boolean;
+ public static readonly kind?: string | null;
protected get user() {
return this.connection.user;
@@ -76,3 +77,10 @@ export default abstract class Channel {
public onMessage?(type: string, body: any): void;
}
+
+export type MiChannelService<T extends boolean> = {
+ shouldShare: boolean;
+ requireCredential: T;
+ kind: T extends true ? string : string | null | undefined;
+ create: (id: string, connection: Connection) => Channel;
+}
diff --git a/packages/backend/src/server/api/stream/channels/admin.ts b/packages/backend/src/server/api/stream/channels/admin.ts
index bfb36d9cb8..b8f369ce84 100644
--- a/packages/backend/src/server/api/stream/channels/admin.ts
+++ b/packages/backend/src/server/api/stream/channels/admin.ts
@@ -5,12 +5,13 @@
import { Injectable } from '@nestjs/common';
import { bindThis } from '@/decorators.js';
-import Channel from '../channel.js';
+import Channel, { type MiChannelService } from '../channel.js';
class AdminChannel extends Channel {
public readonly chName = 'admin';
public static shouldShare = true;
- public static requireCredential = true;
+ public static requireCredential = true as const;
+ public static kind = 'read:admin:stream';
@bindThis
public async init(params: any) {
@@ -22,9 +23,10 @@ class AdminChannel extends Channel {
}
@Injectable()
-export class AdminChannelService {
+export class AdminChannelService implements MiChannelService<true> {
public readonly shouldShare = AdminChannel.shouldShare;
public readonly requireCredential = AdminChannel.requireCredential;
+ public readonly kind = AdminChannel.kind;
constructor(
) {
diff --git a/packages/backend/src/server/api/stream/channels/antenna.ts b/packages/backend/src/server/api/stream/channels/antenna.ts
index a48e6ba5c6..200db8eb0e 100644
--- a/packages/backend/src/server/api/stream/channels/antenna.ts
+++ b/packages/backend/src/server/api/stream/channels/antenna.ts
@@ -8,12 +8,13 @@ import { isUserRelated } from '@/misc/is-user-related.js';
import { NoteEntityService } from '@/core/entities/NoteEntityService.js';
import { bindThis } from '@/decorators.js';
import type { GlobalEvents } from '@/core/GlobalEventService.js';
-import Channel from '../channel.js';
+import Channel, { type MiChannelService } from '../channel.js';
class AntennaChannel extends Channel {
public readonly chName = 'antenna';
public static shouldShare = false;
- public static requireCredential = false;
+ public static requireCredential = true as const;
+ public static kind = 'read:account';
private antennaId: string;
constructor(
@@ -62,9 +63,10 @@ class AntennaChannel extends Channel {
}
@Injectable()
-export class AntennaChannelService {
+export class AntennaChannelService implements MiChannelService<true> {
public readonly shouldShare = AntennaChannel.shouldShare;
public readonly requireCredential = AntennaChannel.requireCredential;
+ public readonly kind = AntennaChannel.kind;
constructor(
private noteEntityService: NoteEntityService,
diff --git a/packages/backend/src/server/api/stream/channels/channel.ts b/packages/backend/src/server/api/stream/channels/channel.ts
index 57034231a3..20275249b8 100644
--- a/packages/backend/src/server/api/stream/channels/channel.ts
+++ b/packages/backend/src/server/api/stream/channels/channel.ts
@@ -8,12 +8,12 @@ import { isUserRelated } from '@/misc/is-user-related.js';
import type { Packed } from '@/misc/json-schema.js';
import { NoteEntityService } from '@/core/entities/NoteEntityService.js';
import { bindThis } from '@/decorators.js';
-import Channel from '../channel.js';
+import Channel, { type MiChannelService } from '../channel.js';
class ChannelChannel extends Channel {
public readonly chName = 'channel';
public static shouldShare = false;
- public static requireCredential = false;
+ public static requireCredential = false as const;
private channelId: string;
constructor(
@@ -65,9 +65,10 @@ class ChannelChannel extends Channel {
}
@Injectable()
-export class ChannelChannelService {
+export class ChannelChannelService implements MiChannelService<false> {
public readonly shouldShare = ChannelChannel.shouldShare;
public readonly requireCredential = ChannelChannel.requireCredential;
+ public readonly kind = ChannelChannel.kind;
constructor(
private noteEntityService: NoteEntityService,
diff --git a/packages/backend/src/server/api/stream/channels/drive.ts b/packages/backend/src/server/api/stream/channels/drive.ts
index 83f53c1836..4bf34a72c9 100644
--- a/packages/backend/src/server/api/stream/channels/drive.ts
+++ b/packages/backend/src/server/api/stream/channels/drive.ts
@@ -5,12 +5,13 @@
import { Injectable } from '@nestjs/common';
import { bindThis } from '@/decorators.js';
-import Channel from '../channel.js';
+import Channel, { type MiChannelService } from '../channel.js';
class DriveChannel extends Channel {
public readonly chName = 'drive';
public static shouldShare = true;
- public static requireCredential = true;
+ public static requireCredential = true as const;
+ public static kind = 'read:account';
@bindThis
public async init(params: any) {
@@ -22,9 +23,10 @@ class DriveChannel extends Channel {
}
@Injectable()
-export class DriveChannelService {
+export class DriveChannelService implements MiChannelService<true> {
public readonly shouldShare = DriveChannel.shouldShare;
public readonly requireCredential = DriveChannel.requireCredential;
+ public readonly kind = DriveChannel.kind;
constructor(
) {
diff --git a/packages/backend/src/server/api/stream/channels/global-timeline.ts b/packages/backend/src/server/api/stream/channels/global-timeline.ts
index 553c44071f..8df13da8a9 100644
--- a/packages/backend/src/server/api/stream/channels/global-timeline.ts
+++ b/packages/backend/src/server/api/stream/channels/global-timeline.ts
@@ -12,12 +12,12 @@ import { MetaService } from '@/core/MetaService.js';
import { NoteEntityService } from '@/core/entities/NoteEntityService.js';
import { bindThis } from '@/decorators.js';
import { RoleService } from '@/core/RoleService.js';
-import Channel from '../channel.js';
+import Channel, { type MiChannelService } from '../channel.js';
class GlobalTimelineChannel extends Channel {
public readonly chName = 'globalTimeline';
public static shouldShare = false;
- public static requireCredential = false;
+ public static requireCredential = false as const;
private withRenotes: boolean;
private withFiles: boolean;
@@ -91,9 +91,10 @@ class GlobalTimelineChannel extends Channel {
}
@Injectable()
-export class GlobalTimelineChannelService {
+export class GlobalTimelineChannelService implements MiChannelService<false> {
public readonly shouldShare = GlobalTimelineChannel.shouldShare;
public readonly requireCredential = GlobalTimelineChannel.requireCredential;
+ public readonly kind = GlobalTimelineChannel.kind;
constructor(
private metaService: MetaService,
diff --git a/packages/backend/src/server/api/stream/channels/hashtag.ts b/packages/backend/src/server/api/stream/channels/hashtag.ts
index f30b29cfd6..3d4f2fc528 100644
--- a/packages/backend/src/server/api/stream/channels/hashtag.ts
+++ b/packages/backend/src/server/api/stream/channels/hashtag.ts
@@ -9,12 +9,12 @@ import { isUserRelated } from '@/misc/is-user-related.js';
import type { Packed } from '@/misc/json-schema.js';
import { NoteEntityService } from '@/core/entities/NoteEntityService.js';
import { bindThis } from '@/decorators.js';
-import Channel from '../channel.js';
+import Channel, { type MiChannelService } from '../channel.js';
class HashtagChannel extends Channel {
public readonly chName = 'hashtag';
public static shouldShare = false;
- public static requireCredential = false;
+ public static requireCredential = false as const;
private q: string[][];
constructor(
@@ -70,9 +70,10 @@ class HashtagChannel extends Channel {
}
@Injectable()
-export class HashtagChannelService {
+export class HashtagChannelService implements MiChannelService<false> {
public readonly shouldShare = HashtagChannel.shouldShare;
public readonly requireCredential = HashtagChannel.requireCredential;
+ public readonly kind = HashtagChannel.kind;
constructor(
private noteEntityService: NoteEntityService,
diff --git a/packages/backend/src/server/api/stream/channels/home-timeline.ts b/packages/backend/src/server/api/stream/channels/home-timeline.ts
index 80054d0881..6c9f52ba70 100644
--- a/packages/backend/src/server/api/stream/channels/home-timeline.ts
+++ b/packages/backend/src/server/api/stream/channels/home-timeline.ts
@@ -10,12 +10,13 @@ import { isInstanceMuted } from '@/misc/is-instance-muted.js';
import type { Packed } from '@/misc/json-schema.js';
import { NoteEntityService } from '@/core/entities/NoteEntityService.js';
import { bindThis } from '@/decorators.js';
-import Channel from '../channel.js';
+import Channel, { type MiChannelService } from '../channel.js';
class HomeTimelineChannel extends Channel {
public readonly chName = 'homeTimeline';
public static shouldShare = false;
- public static requireCredential = true;
+ public static requireCredential = true as const;
+ public static kind = 'read:account';
private withRenotes: boolean;
private withFiles: boolean;
@@ -99,9 +100,10 @@ class HomeTimelineChannel extends Channel {
}
@Injectable()
-export class HomeTimelineChannelService {
+export class HomeTimelineChannelService implements MiChannelService<true> {
public readonly shouldShare = HomeTimelineChannel.shouldShare;
public readonly requireCredential = HomeTimelineChannel.requireCredential;
+ public readonly kind = HomeTimelineChannel.kind;
constructor(
private noteEntityService: NoteEntityService,
diff --git a/packages/backend/src/server/api/stream/channels/hybrid-timeline.ts b/packages/backend/src/server/api/stream/channels/hybrid-timeline.ts
index 78645982bf..957d8b6d41 100644
--- a/packages/backend/src/server/api/stream/channels/hybrid-timeline.ts
+++ b/packages/backend/src/server/api/stream/channels/hybrid-timeline.ts
@@ -12,12 +12,13 @@ import { MetaService } from '@/core/MetaService.js';
import { NoteEntityService } from '@/core/entities/NoteEntityService.js';
import { bindThis } from '@/decorators.js';
import { RoleService } from '@/core/RoleService.js';
-import Channel from '../channel.js';
+import Channel, { type MiChannelService } from '../channel.js';
class HybridTimelineChannel extends Channel {
public readonly chName = 'hybridTimeline';
public static shouldShare = false;
- public static requireCredential = true;
+ public static requireCredential = true as const;
+ public static kind = 'read:account';
private withRenotes: boolean;
private withReplies: boolean;
private withFiles: boolean;
@@ -114,9 +115,10 @@ class HybridTimelineChannel extends Channel {
}
@Injectable()
-export class HybridTimelineChannelService {
+export class HybridTimelineChannelService implements MiChannelService<true> {
public readonly shouldShare = HybridTimelineChannel.shouldShare;
public readonly requireCredential = HybridTimelineChannel.requireCredential;
+ public readonly kind = HybridTimelineChannel.kind;
constructor(
private metaService: MetaService,
diff --git a/packages/backend/src/server/api/stream/channels/local-timeline.ts b/packages/backend/src/server/api/stream/channels/local-timeline.ts
index 1388f186ff..888d268d56 100644
--- a/packages/backend/src/server/api/stream/channels/local-timeline.ts
+++ b/packages/backend/src/server/api/stream/channels/local-timeline.ts
@@ -11,12 +11,12 @@ import { MetaService } from '@/core/MetaService.js';
import { NoteEntityService } from '@/core/entities/NoteEntityService.js';
import { bindThis } from '@/decorators.js';
import { RoleService } from '@/core/RoleService.js';
-import Channel from '../channel.js';
+import Channel, { type MiChannelService } from '../channel.js';
class LocalTimelineChannel extends Channel {
public readonly chName = 'localTimeline';
public static shouldShare = false;
- public static requireCredential = false;
+ public static requireCredential = false as const;
private withRenotes: boolean;
private withReplies: boolean;
private withFiles: boolean;
@@ -90,9 +90,10 @@ class LocalTimelineChannel extends Channel {
}
@Injectable()
-export class LocalTimelineChannelService {
+export class LocalTimelineChannelService implements MiChannelService<false> {
public readonly shouldShare = LocalTimelineChannel.shouldShare;
public readonly requireCredential = LocalTimelineChannel.requireCredential;
+ public readonly kind = LocalTimelineChannel.kind;
constructor(
private metaService: MetaService,
diff --git a/packages/backend/src/server/api/stream/channels/main.ts b/packages/backend/src/server/api/stream/channels/main.ts
index f969d02337..ab605e3ec5 100644
--- a/packages/backend/src/server/api/stream/channels/main.ts
+++ b/packages/backend/src/server/api/stream/channels/main.ts
@@ -7,12 +7,13 @@ import { Injectable } from '@nestjs/common';
import { isInstanceMuted, isUserFromMutedInstance } from '@/misc/is-instance-muted.js';
import { NoteEntityService } from '@/core/entities/NoteEntityService.js';
import { bindThis } from '@/decorators.js';
-import Channel from '../channel.js';
+import Channel, { type MiChannelService } from '../channel.js';
class MainChannel extends Channel {
public readonly chName = 'main';
public static shouldShare = true;
- public static requireCredential = true;
+ public static requireCredential = true as const;
+ public static kind = 'read:account';
constructor(
private noteEntityService: NoteEntityService,
@@ -63,9 +64,10 @@ class MainChannel extends Channel {
}
@Injectable()
-export class MainChannelService {
+export class MainChannelService implements MiChannelService<true> {
public readonly shouldShare = MainChannel.shouldShare;
public readonly requireCredential = MainChannel.requireCredential;
+ public readonly kind = MainChannel.kind;
constructor(
private noteEntityService: NoteEntityService,
diff --git a/packages/backend/src/server/api/stream/channels/queue-stats.ts b/packages/backend/src/server/api/stream/channels/queue-stats.ts
index f0dc472303..5ceb2c3bbc 100644
--- a/packages/backend/src/server/api/stream/channels/queue-stats.ts
+++ b/packages/backend/src/server/api/stream/channels/queue-stats.ts
@@ -6,14 +6,14 @@
import Xev from 'xev';
import { Injectable } from '@nestjs/common';
import { bindThis } from '@/decorators.js';
-import Channel from '../channel.js';
+import Channel, { type MiChannelService } from '../channel.js';
const ev = new Xev();
class QueueStatsChannel extends Channel {
public readonly chName = 'queueStats';
public static shouldShare = true;
- public static requireCredential = false;
+ public static requireCredential = false as const;
constructor(id: string, connection: Channel['connection']) {
super(id, connection);
@@ -53,9 +53,10 @@ class QueueStatsChannel extends Channel {
}
@Injectable()
-export class QueueStatsChannelService {
+export class QueueStatsChannelService implements MiChannelService<false> {
public readonly shouldShare = QueueStatsChannel.shouldShare;
public readonly requireCredential = QueueStatsChannel.requireCredential;
+ public readonly kind = QueueStatsChannel.kind;
constructor(
) {
diff --git a/packages/backend/src/server/api/stream/channels/role-timeline.ts b/packages/backend/src/server/api/stream/channels/role-timeline.ts
index 38d3604cc5..b3bbb77dbf 100644
--- a/packages/backend/src/server/api/stream/channels/role-timeline.ts
+++ b/packages/backend/src/server/api/stream/channels/role-timeline.ts
@@ -10,12 +10,12 @@ import { NoteEntityService } from '@/core/entities/NoteEntityService.js';
import { bindThis } from '@/decorators.js';
import { RoleService } from '@/core/RoleService.js';
import type { GlobalEvents } from '@/core/GlobalEventService.js';
-import Channel from '../channel.js';
+import Channel, { type MiChannelService } from '../channel.js';
class RoleTimelineChannel extends Channel {
public readonly chName = 'roleTimeline';
public static shouldShare = false;
- public static requireCredential = false;
+ public static requireCredential = false as const;
private roleId: string;
constructor(
@@ -67,9 +67,10 @@ class RoleTimelineChannel extends Channel {
}
@Injectable()
-export class RoleTimelineChannelService {
+export class RoleTimelineChannelService implements MiChannelService<false> {
public readonly shouldShare = RoleTimelineChannel.shouldShare;
public readonly requireCredential = RoleTimelineChannel.requireCredential;
+ public readonly kind = RoleTimelineChannel.kind;
constructor(
private noteEntityService: NoteEntityService,
diff --git a/packages/backend/src/server/api/stream/channels/server-stats.ts b/packages/backend/src/server/api/stream/channels/server-stats.ts
index cacae275a8..615b6946cc 100644
--- a/packages/backend/src/server/api/stream/channels/server-stats.ts
+++ b/packages/backend/src/server/api/stream/channels/server-stats.ts
@@ -6,14 +6,14 @@
import Xev from 'xev';
import { Injectable } from '@nestjs/common';
import { bindThis } from '@/decorators.js';
-import Channel from '../channel.js';
+import Channel, { type MiChannelService } from '../channel.js';
const ev = new Xev();
class ServerStatsChannel extends Channel {
public readonly chName = 'serverStats';
public static shouldShare = true;
- public static requireCredential = false;
+ public static requireCredential = false as const;
constructor(id: string, connection: Channel['connection']) {
super(id, connection);
@@ -53,9 +53,10 @@ class ServerStatsChannel extends Channel {
}
@Injectable()
-export class ServerStatsChannelService {
+export class ServerStatsChannelService implements MiChannelService<false> {
public readonly shouldShare = ServerStatsChannel.shouldShare;
public readonly requireCredential = ServerStatsChannel.requireCredential;
+ public readonly kind = ServerStatsChannel.kind;
constructor(
) {
diff --git a/packages/backend/src/server/api/stream/channels/user-list.ts b/packages/backend/src/server/api/stream/channels/user-list.ts
index fe293e2b4d..909b5a5e03 100644
--- a/packages/backend/src/server/api/stream/channels/user-list.ts
+++ b/packages/backend/src/server/api/stream/channels/user-list.ts
@@ -11,12 +11,12 @@ import { NoteEntityService } from '@/core/entities/NoteEntityService.js';
import { DI } from '@/di-symbols.js';
import { bindThis } from '@/decorators.js';
import { isInstanceMuted } from '@/misc/is-instance-muted.js';
-import Channel from '../channel.js';
+import Channel, { type MiChannelService } from '../channel.js';
class UserListChannel extends Channel {
public readonly chName = 'userList';
public static shouldShare = false;
- public static requireCredential = false;
+ public static requireCredential = false as const;
private listId: string;
private membershipsMap: Record<string, Pick<MiUserListMembership, 'withReplies'> | undefined> = {};
private listUsersClock: NodeJS.Timeout;
@@ -137,9 +137,10 @@ class UserListChannel extends Channel {
}
@Injectable()
-export class UserListChannelService {
+export class UserListChannelService implements MiChannelService<false> {
public readonly shouldShare = UserListChannel.shouldShare;
public readonly requireCredential = UserListChannel.requireCredential;
+ public readonly kind = UserListChannel.kind;
constructor(
@Inject(DI.userListsRepository)