streaming: establish WebSocket connection

This commit is contained in:
Alex Gleason 2023-05-13 17:41:21 -05:00
parent a766449ba6
commit 8ba456a100
No known key found for this signature in database
GPG Key ID: 7211D1F99744FBB7
4 changed files with 41 additions and 6 deletions

View File

@ -14,15 +14,16 @@ import { homeController } from './controllers/api/timelines.ts';
import instanceController from './controllers/api/instance.ts';
import { createTokenController, oauthAuthorizeController, oauthController } from './controllers/api/oauth.ts';
import { preferencesController } from './controllers/api/preferences.ts';
import { searchController } from './controllers/api/search.ts';
import {
contextController,
createStatusController,
favouriteController,
statusController,
} from './controllers/api/statuses.ts';
import { requireAuth, setAuth } from './middleware/auth.ts';
import { streamingController } from './controllers/api/streaming.ts';
import { indexController } from './controllers/site.ts';
import { searchController } from './controllers/api/search.ts';
import { requireAuth, setAuth } from './middleware/auth.ts';
interface AppEnv extends HonoEnv {
Variables: {
@ -37,7 +38,12 @@ type AppController = Handler<AppEnv>;
const app = new Hono<AppEnv>();
app.use('/*', logger(), cors({ origin: '*', exposeHeaders: ['link'] }), setAuth);
app.use('*', logger());
app.get('/api/v1/streaming', streamingController);
app.get('/api/v1/streaming/', streamingController);
app.use('*', cors({ origin: '*', exposeHeaders: ['link'] }), setAuth);
app.get('/api/v1/instance', instanceController);

View File

@ -3,7 +3,7 @@ import { ADMIN_EMAIL, LOCAL_DOMAIN, POST_CHAR_LIMIT } from '@/config.ts';
import type { Context } from '@/deps.ts';
function instanceController(c: Context) {
const { host } = new URL(LOCAL_DOMAIN);
const { host, protocol } = new URL(LOCAL_DOMAIN);
return c.json({
uri: host,
@ -35,7 +35,7 @@ function instanceController(c: Context) {
user_count: 0,
},
urls: {
streaming_api: `wss://${host}`,
streaming_api: `${protocol === 'http:' ? 'ws:' : 'wss:'}//${host}`,
},
version: '0.0.0 (compatible; Ditto 0.0.1)',
email: ADMIN_EMAIL,

View File

@ -0,0 +1,29 @@
import { AppController } from '@/app.ts';
import { nip21 } from '@/deps.ts';
const streamingController: AppController = (c) => {
const upgrade = c.req.headers.get('upgrade');
const token = c.req.headers.get('sec-websocket-protocol');
if (upgrade?.toLowerCase() !== 'websocket') {
return c.text('Please use websocket protocol', 400);
}
if (!token) {
return c.json({ error: 'Missing access token' }, 401);
}
if (!nip21.BECH32_REGEX.test(token)) {
return c.json({ error: 'Invalid access token' }, 401);
}
const { socket, response } = Deno.upgradeWebSocket(c.req.raw, { protocol: token });
socket.addEventListener('open', () => console.log('websocket: connection opened'));
socket.addEventListener('close', () => console.log('websocket: connection closed'));
socket.addEventListener('message', (e) => console.log('websocket message: ', e.data));
return response;
};
export { streamingController };

View File

@ -3,7 +3,7 @@ import { getPublicKey, HTTPException, nip19 } from '@/deps.ts';
/** NIP-19 auth middleware. */
const setAuth: AppMiddleware = async (c, next) => {
const authHeader = c.req.headers.get('Authorization');
const authHeader = c.req.headers.get('authorization');
if (authHeader?.startsWith('Bearer ')) {
const bech32 = authHeader.replace(/^Bearer /, '');