import * as http from 'http'; import * as Koa from 'koa'; import * as websocket from 'websocket'; export class Misskey { private server: http.Server; private streaming: websocket.connection; constructor() { const app = new Koa(); this.server = http.createServer(app.callback()); const ws = new websocket.server({ httpServer: this.server, }); ws.on('request', async (request) => { const q = request.resourceURL.query as ParsedUrlQuery; this.streaming = request.accept(); }); this.server.listen(3000); } public waitForStreamingMessage(handler) { return new Promise((resolve, reject) => { const onMessage = (data: websocket.IMessage) => { if (data.utf8Data == null) return; const message = JSON.parse(data.utf8Data); const result = handler(message); if (result) { this.streaming.off('message', onMessage); resolve(); } }; this.streaming.on('message', onMessage); }); } public async waitForMainChannelConnected() { await this.waitForStreamingMessage((message) => { const {type, body} = message; if (type === 'connect') { const {channel, id, params, pong} = body; if (channel !== 'main') return; if (pong) { this.sendStreamingMessage('connected', { id: id, }); } return true; } }); } public sendStreamingMessage(type: string, payload: any) { this.streaming.send(JSON.stringify({ type: type, body: payload, })); } }