thedesk/src/main/Streaming.ts
2019-04-24 06:07:15 +09:00

84 lines
2.2 KiB
TypeScript

import { ipcMain, Event } from 'electron'
import { default as Mastodon, Status, WebSocket } from 'megalodon'
import Window from './Window'
import Client from './Client'
export default class Streaming {
private static _instance: Streaming
public static get shared(): Streaming {
return this._instance || (this._instance = new this())
}
public static ready() {
ipcMain.on('open-streaming', (_: Event, name: string, type: string) => {
return this.shared.openStreaming(name, type)
})
}
private sockets: Map<string, WebSocket>
private constructor() {
this.sockets = new Map()
}
private openStreaming(name: string, type: string) {
let client: Mastodon
let stream: string
switch (type) {
case 'no-auth':
client = Client.getNoAuthClient(name, 'websocket')
stream = 'public:local'
break
default:
return
}
let socketName = name + ':' + type
if (this.sockets.has(socketName)) {
return
}
const socket: WebSocket = client.socket('/streaming', stream)
socket.on('connect', () => {
console.log('start streaming:', socketName)
})
socket.on('update', (status: Status) => {
if (Window.windowMap.has('main')) {
Window.windowMap.get('main')!.webContents.send(`update-${name}-${type}`, status)
}
})
socket.on('notification', (notification: Notification) => {
console.log(notification)
})
socket.on('delete', (id: number) => {
if (Window.windowMap.has('main')) {
Window.windowMap.get('main')!.webContents.send(`delete-${name}-${type}`, id)
}
})
socket.on('error', (err: Error) => {
console.error(err)
})
socket.on('heartbeat', () => {
console.log('thump.')
})
socket.on('close', () => {
console.log('close streaming:', socketName)
})
socket.on('parser-error', (err: Error) => {
console.error(err)
})
this.sockets.set(socketName, socket)
}
}