summaryrefslogtreecommitdiff
path: root/packages/frontend/src/utility/stream-mock.ts
blob: 9b1b368de448d2ed49b918d1ad885a861b03afe7 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
/*
 * SPDX-FileCopyrightText: syuilo and misskey-project
 * SPDX-License-Identifier: AGPL-3.0-only
 */

import { EventEmitter } from 'eventemitter3';
import * as Misskey from 'misskey-js';
import type { Channels, StreamEvents, IStream, IChannelConnection } from 'misskey-js';

type AnyOf<T extends Record<any, any>> = T[keyof T];
type OmitFirst<T extends any[]> = T extends [any, ...infer R] ? R : never;

/**
 * Websocket無効化時に使うStreamのモック(なにもしない)
 */
export class StreamMock extends EventEmitter<StreamEvents> implements IStream {
	public readonly state = 'initializing';

	constructor(...args: ConstructorParameters<typeof Misskey.Stream>) {
		super();
		// do nothing
	}

	public useChannel<C extends keyof Channels>(channel: C, params?: Channels[C]['params'], name?: string): ChannelConnectionMock<Channels[C]> {
		return new ChannelConnectionMock(this, channel, name);
	}

	public removeSharedConnection(connection: any): void {
		// do nothing
	}

	public removeSharedConnectionPool(pool: any): void {
		// do nothing
	}

	public disconnectToChannel(): void {
		// do nothing
	}

	public send(typeOrPayload: string): void;
	public send(typeOrPayload: string, payload: any): void;
	public send(typeOrPayload: Record<string, any> | any[]): void;
	public send(typeOrPayload: string | Record<string, any> | any[], payload?: any): void {
		// do nothing
	}

	public ping(): void {
		// do nothing
	}

	public heartbeat(): void {
		// do nothing
	}

	public close(): void {
		// do nothing
	}
}

class ChannelConnectionMock<Channel extends AnyOf<Channels> = any> extends EventEmitter<Channel['events']> implements IChannelConnection<Channel> {
	public id = '';
	public name?: string; // for debug
	public inCount = 0; // for debug
	public outCount = 0; // for debug
	public channel: string;

	constructor(stream: IStream, ...args: OmitFirst<ConstructorParameters<typeof Misskey.ChannelConnection<Channel>>>) {
		super();

		this.channel = args[0];
		this.name = args[1];
	}

	public send<T extends keyof Channel['receives']>(type: T, body: Channel['receives'][T]): void {
		// do nothing
	}

	public dispose(): void {
		// do nothing
	}
}