mirror of
				https://codeberg.org/yeentown/barkey.git
				synced 2025-11-04 07:24:13 +00:00 
			
		
		
		
	
		
			
				
	
	
		
			165 lines
		
	
	
	
		
			4.8 KiB
		
	
	
	
		
			TypeScript
		
	
	
	
	
	
			
		
		
	
	
			165 lines
		
	
	
	
		
			4.8 KiB
		
	
	
	
		
			TypeScript
		
	
	
	
	
	
import WS from 'jest-websocket-mock';
 | 
						|
import Stream from '../src/streaming.js';
 | 
						|
 | 
						|
describe('Streaming', () => {
 | 
						|
	test('useChannel', async () => {
 | 
						|
		const server = new WS('wss://misskey.test/streaming');
 | 
						|
		const stream = new Stream('https://misskey.test', { token: 'TOKEN' });
 | 
						|
		const mainChannelReceived: any[] = [];
 | 
						|
		const main = stream.useChannel('main');
 | 
						|
		main.on('meUpdated', payload => {
 | 
						|
			mainChannelReceived.push(payload);
 | 
						|
		});
 | 
						|
 | 
						|
		const ws = await server.connected;
 | 
						|
		expect(new URLSearchParams(new URL(ws.url).search).get('i')).toEqual('TOKEN');
 | 
						|
 | 
						|
		const msg = JSON.parse(await server.nextMessage as string);
 | 
						|
		const mainChannelId = msg.body.id;
 | 
						|
		expect(msg.type).toEqual('connect');
 | 
						|
		expect(msg.body.channel).toEqual('main');
 | 
						|
		expect(mainChannelId != null).toEqual(true);
 | 
						|
 | 
						|
		server.send(JSON.stringify({
 | 
						|
			type: 'channel',
 | 
						|
			body: {
 | 
						|
				id: mainChannelId,
 | 
						|
				type: 'meUpdated',
 | 
						|
				body: {
 | 
						|
					id: 'foo'
 | 
						|
				}
 | 
						|
			}
 | 
						|
		}));
 | 
						|
 | 
						|
		expect(mainChannelReceived[0]).toEqual({
 | 
						|
			id: 'foo'
 | 
						|
		});
 | 
						|
 | 
						|
		stream.close();
 | 
						|
		server.close();
 | 
						|
	});
 | 
						|
 | 
						|
	test('useChannel with parameters', async () => {
 | 
						|
		const server = new WS('wss://misskey.test/streaming');
 | 
						|
		const stream = new Stream('https://misskey.test', { token: 'TOKEN' });
 | 
						|
		const messagingChannelReceived: any[] = [];
 | 
						|
		const messaging = stream.useChannel('messaging', { otherparty: 'aaa' });
 | 
						|
		messaging.on('message', payload => {
 | 
						|
			messagingChannelReceived.push(payload);
 | 
						|
		});
 | 
						|
 | 
						|
		const ws = await server.connected;
 | 
						|
		expect(new URLSearchParams(new URL(ws.url).search).get('i')).toEqual('TOKEN');
 | 
						|
 | 
						|
		const msg = JSON.parse(await server.nextMessage as string);
 | 
						|
		const messagingChannelId = msg.body.id;
 | 
						|
		expect(msg.type).toEqual('connect');
 | 
						|
		expect(msg.body.channel).toEqual('messaging');
 | 
						|
		expect(msg.body.params).toEqual({ otherparty: 'aaa' });
 | 
						|
		expect(messagingChannelId != null).toEqual(true);
 | 
						|
 | 
						|
		server.send(JSON.stringify({
 | 
						|
			type: 'channel',
 | 
						|
			body: {
 | 
						|
				id: messagingChannelId,
 | 
						|
				type: 'message',
 | 
						|
				body: {
 | 
						|
					id: 'foo'
 | 
						|
				}
 | 
						|
			}
 | 
						|
		}));
 | 
						|
 | 
						|
		expect(messagingChannelReceived[0]).toEqual({
 | 
						|
			id: 'foo'
 | 
						|
		});
 | 
						|
 | 
						|
		stream.close();
 | 
						|
		server.close();
 | 
						|
	});
 | 
						|
 | 
						|
	test('ちゃんとチャンネルごとにidが異なる', async () => {
 | 
						|
		const server = new WS('wss://misskey.test/streaming');
 | 
						|
		const stream = new Stream('https://misskey.test', { token: 'TOKEN' });
 | 
						|
 | 
						|
		stream.useChannel('messaging', { otherparty: 'aaa' });
 | 
						|
		stream.useChannel('messaging', { otherparty: 'bbb' });
 | 
						|
 | 
						|
		const ws = await server.connected;
 | 
						|
		expect(new URLSearchParams(new URL(ws.url).search).get('i')).toEqual('TOKEN');
 | 
						|
 | 
						|
		const msg = JSON.parse(await server.nextMessage as string);
 | 
						|
		const messagingChannelId = msg.body.id;
 | 
						|
		const msg2 = JSON.parse(await server.nextMessage as string);
 | 
						|
		const messagingChannelId2 = msg2.body.id;
 | 
						|
 | 
						|
		expect(messagingChannelId != null).toEqual(true);
 | 
						|
		expect(messagingChannelId2 != null).toEqual(true);
 | 
						|
		expect(messagingChannelId).not.toEqual(messagingChannelId2);
 | 
						|
 | 
						|
		stream.close();
 | 
						|
		server.close();
 | 
						|
	});
 | 
						|
 | 
						|
	test('Connection#send', async () => {
 | 
						|
		const server = new WS('wss://misskey.test/streaming');
 | 
						|
		const stream = new Stream('https://misskey.test', { token: 'TOKEN' });
 | 
						|
 | 
						|
		const messaging = stream.useChannel('messaging', { otherparty: 'aaa' });
 | 
						|
		messaging.send('read', { id: 'aaa' });
 | 
						|
 | 
						|
		const ws = await server.connected;
 | 
						|
		expect(new URLSearchParams(new URL(ws.url).search).get('i')).toEqual('TOKEN');
 | 
						|
 | 
						|
		const connectMsg = JSON.parse(await server.nextMessage as string);
 | 
						|
		const channelId = connectMsg.body.id;
 | 
						|
		const msg = JSON.parse(await server.nextMessage as string);
 | 
						|
 | 
						|
		expect(msg.type).toEqual('ch');
 | 
						|
		expect(msg.body.id).toEqual(channelId);
 | 
						|
		expect(msg.body.type).toEqual('read');
 | 
						|
		expect(msg.body.body).toEqual({ id: 'aaa' });
 | 
						|
 | 
						|
		stream.close();
 | 
						|
		server.close();
 | 
						|
	});
 | 
						|
 | 
						|
	test('Connection#dispose', async () => {
 | 
						|
		const server = new WS('wss://misskey.test/streaming');
 | 
						|
		const stream = new Stream('https://misskey.test', { token: 'TOKEN' });
 | 
						|
		const mainChannelReceived: any[] = [];
 | 
						|
		const main = stream.useChannel('main');
 | 
						|
		main.on('meUpdated', payload => {
 | 
						|
			mainChannelReceived.push(payload);
 | 
						|
		});
 | 
						|
 | 
						|
		const ws = await server.connected;
 | 
						|
		expect(new URLSearchParams(new URL(ws.url).search).get('i')).toEqual('TOKEN');
 | 
						|
 | 
						|
		const msg = JSON.parse(await server.nextMessage as string);
 | 
						|
		const mainChannelId = msg.body.id;
 | 
						|
		expect(msg.type).toEqual('connect');
 | 
						|
		expect(msg.body.channel).toEqual('main');
 | 
						|
		expect(mainChannelId != null).toEqual(true);
 | 
						|
		main.dispose();
 | 
						|
 | 
						|
		server.send(JSON.stringify({
 | 
						|
			type: 'channel',
 | 
						|
			body: {
 | 
						|
				id: mainChannelId,
 | 
						|
				type: 'meUpdated',
 | 
						|
				body: {
 | 
						|
					id: 'foo'
 | 
						|
				}
 | 
						|
			}
 | 
						|
		}));
 | 
						|
 | 
						|
		expect(mainChannelReceived.length).toEqual(0);
 | 
						|
 | 
						|
		stream.close();
 | 
						|
		server.close();
 | 
						|
	});
 | 
						|
 | 
						|
	// TODO: SharedConnection#dispose して一定時間経ったら disconnect メッセージがサーバーに送られてくるかのテスト
 | 
						|
 | 
						|
	// TODO: チャンネル接続が使いまわされるかのテスト
 | 
						|
});
 |