Changeset View
Changeset View
Standalone View
Standalone View
keyserver/src/socket/tunnelbroker.js
// @flow | // @flow | ||||
import WebSocket from 'ws'; | import WebSocket from 'ws'; | ||||
import { type TBKeyserverConnectionInitializationMessage } from 'lib/types/tunnelbroker-messages.js'; | import { | ||||
type TBKeyserverConnectionInitializationMessage, | |||||
type MessageFromTunnelbroker, | |||||
tunnelbrokerMessageTypes, | |||||
} from 'lib/types/tunnelbroker-messages.js'; | |||||
import { ServerError } from 'lib/utils/errors.js'; | |||||
import { fetchOlmAccount } from '../updaters/olm-account-updater.js'; | import { fetchOlmAccount } from '../updaters/olm-account-updater.js'; | ||||
import type { IdentityInfo } from '../user/identity.js'; | import { type IdentityInfo } from '../user/identity.js'; | ||||
import { uploadNewOneTimeKeys } from '../utils/olm-utils.js'; | |||||
async function createAndMaintainTunnelbrokerWebsocket( | async function createAndMaintainTunnelbrokerWebsocket( | ||||
identityInfo: IdentityInfo, | identityInfo: IdentityInfo, | ||||
) { | ) { | ||||
const accountInfo = await fetchOlmAccount('content'); | const accountInfo = await fetchOlmAccount('content'); | ||||
const deviceID = JSON.parse(accountInfo.account.identity_keys()).ed25519; | const deviceID = JSON.parse(accountInfo.account.identity_keys()).ed25519; | ||||
openTunnelbrokerConnection( | openTunnelbrokerConnection( | ||||
deviceID, | deviceID, | ||||
identityInfo.userId, | identityInfo.userId, | ||||
identityInfo.accessToken, | identityInfo.accessToken, | ||||
); | ); | ||||
} | } | ||||
function handleTBMessageEvent(event: ArrayBuffer): Promise<void> { | |||||
const message: MessageFromTunnelbroker = JSON.parse(event.toString()); | |||||
if (message.type === tunnelbrokerMessageTypes.REFRESH_KEYS_REQUEST) { | |||||
return uploadNewOneTimeKeys(message.numberOfKeys); | |||||
} | |||||
throw new ServerError('unsupported_tunnelbroker_message'); | |||||
} | |||||
function openTunnelbrokerConnection( | function openTunnelbrokerConnection( | ||||
deviceID: string, | deviceID: string, | ||||
userID: string, | userID: string, | ||||
accessToken: string, | accessToken: string, | ||||
) { | ) { | ||||
try { | try { | ||||
const tunnelbrokerSocket = new WebSocket('ws://127.0.0.1:51001'); | const tunnelbrokerSocket = new WebSocket('ws://127.0.0.1:51001'); | ||||
Show All 12 Lines | try { | ||||
tunnelbrokerSocket.on('close', async () => { | tunnelbrokerSocket.on('close', async () => { | ||||
console.warn('Connection to Tunnelbroker closed'); | console.warn('Connection to Tunnelbroker closed'); | ||||
}); | }); | ||||
tunnelbrokerSocket.on('error', (error: Error) => { | tunnelbrokerSocket.on('error', (error: Error) => { | ||||
console.error('Tunnelbroker socket error', error.message); | console.error('Tunnelbroker socket error', error.message); | ||||
}); | }); | ||||
tunnelbrokerSocket.on('message', handleTBMessageEvent); | |||||
} catch { | } catch { | ||||
console.log('Failed to open connection with Tunnelbroker'); | console.log('Failed to open connection with Tunnelbroker'); | ||||
} | } | ||||
} | } | ||||
export { createAndMaintainTunnelbrokerWebsocket }; | export { createAndMaintainTunnelbrokerWebsocket }; |