Fix bug, Support thirdparty streaming access
This commit is contained in:
		
							parent
							
								
									fa591e5c9b
								
							
						
					
					
						commit
						2ded8ba858
					
				
					 4 changed files with 31 additions and 18 deletions
				
			
		| 
						 | 
				
			
			@ -2,6 +2,7 @@ import * as http from 'http';
 | 
			
		|||
import * as websocket from 'websocket';
 | 
			
		||||
import * as redis from 'redis';
 | 
			
		||||
import User from './models/user';
 | 
			
		||||
import Userkey from './models/userkey';
 | 
			
		||||
 | 
			
		||||
import homeStream from './stream/home';
 | 
			
		||||
import messagingStream from './stream/messaging';
 | 
			
		||||
| 
						 | 
				
			
			@ -17,7 +18,13 @@ module.exports = (server: http.Server) => {
 | 
			
		|||
	ws.on('request', async (request) => {
 | 
			
		||||
		const connection = request.accept();
 | 
			
		||||
 | 
			
		||||
		const user = await authenticate(connection);
 | 
			
		||||
		const user = await authenticate(connection, request.resourceURL.query.i);
 | 
			
		||||
 | 
			
		||||
		if (user == null) {
 | 
			
		||||
			connection.send('authentication-failed');
 | 
			
		||||
			connection.close();
 | 
			
		||||
			return;
 | 
			
		||||
		}
 | 
			
		||||
 | 
			
		||||
		// Connect to Redis
 | 
			
		||||
		const subscriber = redis.createClient(
 | 
			
		||||
| 
						 | 
				
			
			@ -41,29 +48,36 @@ module.exports = (server: http.Server) => {
 | 
			
		|||
	});
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
function authenticate(connection: websocket.connection): Promise<any> {
 | 
			
		||||
	return new Promise((resolve, reject) => {
 | 
			
		||||
		// Listen first message
 | 
			
		||||
		connection.once('message', async (data) => {
 | 
			
		||||
			const msg = JSON.parse(data.utf8Data);
 | 
			
		||||
 | 
			
		||||
function authenticate(connection: websocket.connection, token: string): Promise<any> {
 | 
			
		||||
	return new Promise(async (resolve, reject) => {
 | 
			
		||||
		if (token[0] == '!') {
 | 
			
		||||
			// Fetch user
 | 
			
		||||
			// SELECT _id
 | 
			
		||||
			const user = await User
 | 
			
		||||
				.findOne({
 | 
			
		||||
					token: msg.i
 | 
			
		||||
					token: token
 | 
			
		||||
				}, {
 | 
			
		||||
					_id: true
 | 
			
		||||
				});
 | 
			
		||||
 | 
			
		||||
			if (user === null) {
 | 
			
		||||
				connection.close();
 | 
			
		||||
				return;
 | 
			
		||||
			resolve(user);
 | 
			
		||||
		} else {
 | 
			
		||||
			const userkey = await Userkey.findOne({
 | 
			
		||||
				key: token
 | 
			
		||||
			});
 | 
			
		||||
 | 
			
		||||
			if (userkey == null) {
 | 
			
		||||
				return reject('invalid userkey');
 | 
			
		||||
			}
 | 
			
		||||
 | 
			
		||||
			connection.send('authenticated');
 | 
			
		||||
			// Fetch user
 | 
			
		||||
			// SELECT _id
 | 
			
		||||
			const user = await User
 | 
			
		||||
				.findOne({ _id: userkey.user_id }, {
 | 
			
		||||
					_id: true
 | 
			
		||||
				});
 | 
			
		||||
 | 
			
		||||
			resolve(user);
 | 
			
		||||
		});
 | 
			
		||||
		}
 | 
			
		||||
	});
 | 
			
		||||
}
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -39,7 +39,7 @@ try {
 | 
			
		|||
checkForUpdate();
 | 
			
		||||
 | 
			
		||||
// Get token from cookie
 | 
			
		||||
const i = (document.cookie.match(/i=(\w+)/) || [null, null])[1];
 | 
			
		||||
const i = (document.cookie.match(/i=(!\w+)/) || [null, null])[1];
 | 
			
		||||
 | 
			
		||||
// ユーザーをフェッチしてコールバックする
 | 
			
		||||
module.exports = callback => {
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -9,7 +9,7 @@ class Connection
 | 
			
		|||
		@event = riot.observable!
 | 
			
		||||
		@me = me
 | 
			
		||||
		host = CONFIG.api.url.replace \http \ws
 | 
			
		||||
		@socket = new ReconnectingWebSocket "#{host}/messaging?otherparty=#{otherparty}"
 | 
			
		||||
		@socket = new ReconnectingWebSocket "#{host}/messaging?i=#{me.token}&otherparty=#{otherparty}"
 | 
			
		||||
 | 
			
		||||
		@socket.add-event-listener \open @on-open
 | 
			
		||||
		@socket.add-event-listener \message @on-message
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -9,13 +9,12 @@ module.exports = (me) ~>
 | 
			
		|||
	state-ev = riot.observable!
 | 
			
		||||
	event = riot.observable!
 | 
			
		||||
 | 
			
		||||
	socket = new ReconnectingWebSocket CONFIG.api.url.replace \http \ws
 | 
			
		||||
	host = CONFIG.api.url.replace \http \ws
 | 
			
		||||
	socket = new ReconnectingWebSocket "#{host}?i=#{me.token}"
 | 
			
		||||
 | 
			
		||||
	socket.onopen = ~>
 | 
			
		||||
		state := \connected
 | 
			
		||||
		state-ev.trigger \connected
 | 
			
		||||
		socket.send JSON.stringify do
 | 
			
		||||
			i: me.token
 | 
			
		||||
 | 
			
		||||
	socket.onclose = ~>
 | 
			
		||||
		state := \reconnecting
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
		Loading…
	
	Add table
		Add a link
		
	
		Reference in a new issue