mirror of
https://github.com/syuilo/ai.git
synced 2024-11-22 21:27:58 +00:00
68 lines
1.4 KiB
TypeScript
68 lines
1.4 KiB
TypeScript
|
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
|
||
|
}));
|
||
|
}
|
||
|
}
|