streaming: establish WebSocket connection
This commit is contained in:
parent
a766449ba6
commit
8ba456a100
12
src/app.ts
12
src/app.ts
|
@ -14,15 +14,16 @@ import { homeController } from './controllers/api/timelines.ts';
|
||||||
import instanceController from './controllers/api/instance.ts';
|
import instanceController from './controllers/api/instance.ts';
|
||||||
import { createTokenController, oauthAuthorizeController, oauthController } from './controllers/api/oauth.ts';
|
import { createTokenController, oauthAuthorizeController, oauthController } from './controllers/api/oauth.ts';
|
||||||
import { preferencesController } from './controllers/api/preferences.ts';
|
import { preferencesController } from './controllers/api/preferences.ts';
|
||||||
|
import { searchController } from './controllers/api/search.ts';
|
||||||
import {
|
import {
|
||||||
contextController,
|
contextController,
|
||||||
createStatusController,
|
createStatusController,
|
||||||
favouriteController,
|
favouriteController,
|
||||||
statusController,
|
statusController,
|
||||||
} from './controllers/api/statuses.ts';
|
} 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 { indexController } from './controllers/site.ts';
|
||||||
import { searchController } from './controllers/api/search.ts';
|
import { requireAuth, setAuth } from './middleware/auth.ts';
|
||||||
|
|
||||||
interface AppEnv extends HonoEnv {
|
interface AppEnv extends HonoEnv {
|
||||||
Variables: {
|
Variables: {
|
||||||
|
@ -37,7 +38,12 @@ type AppController = Handler<AppEnv>;
|
||||||
|
|
||||||
const app = new Hono<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);
|
app.get('/api/v1/instance', instanceController);
|
||||||
|
|
||||||
|
|
|
@ -3,7 +3,7 @@ import { ADMIN_EMAIL, LOCAL_DOMAIN, POST_CHAR_LIMIT } from '@/config.ts';
|
||||||
import type { Context } from '@/deps.ts';
|
import type { Context } from '@/deps.ts';
|
||||||
|
|
||||||
function instanceController(c: Context) {
|
function instanceController(c: Context) {
|
||||||
const { host } = new URL(LOCAL_DOMAIN);
|
const { host, protocol } = new URL(LOCAL_DOMAIN);
|
||||||
|
|
||||||
return c.json({
|
return c.json({
|
||||||
uri: host,
|
uri: host,
|
||||||
|
@ -35,7 +35,7 @@ function instanceController(c: Context) {
|
||||||
user_count: 0,
|
user_count: 0,
|
||||||
},
|
},
|
||||||
urls: {
|
urls: {
|
||||||
streaming_api: `wss://${host}`,
|
streaming_api: `${protocol === 'http:' ? 'ws:' : 'wss:'}//${host}`,
|
||||||
},
|
},
|
||||||
version: '0.0.0 (compatible; Ditto 0.0.1)',
|
version: '0.0.0 (compatible; Ditto 0.0.1)',
|
||||||
email: ADMIN_EMAIL,
|
email: ADMIN_EMAIL,
|
||||||
|
|
|
@ -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 };
|
|
@ -3,7 +3,7 @@ import { getPublicKey, HTTPException, nip19 } from '@/deps.ts';
|
||||||
|
|
||||||
/** NIP-19 auth middleware. */
|
/** NIP-19 auth middleware. */
|
||||||
const setAuth: AppMiddleware = async (c, next) => {
|
const setAuth: AppMiddleware = async (c, next) => {
|
||||||
const authHeader = c.req.headers.get('Authorization');
|
const authHeader = c.req.headers.get('authorization');
|
||||||
|
|
||||||
if (authHeader?.startsWith('Bearer ')) {
|
if (authHeader?.startsWith('Bearer ')) {
|
||||||
const bech32 = authHeader.replace(/^Bearer /, '');
|
const bech32 = authHeader.replace(/^Bearer /, '');
|
||||||
|
|
Loading…
Reference in New Issue