streaming: support hashtag timeline
This commit is contained in:
parent
2d619868aa
commit
f25284daa9
|
@ -10,12 +10,22 @@ import { toStatus } from '@/transformers/nostr-to-mastoapi.ts';
|
||||||
* https://docs.joinmastodon.org/methods/streaming/#streams
|
* https://docs.joinmastodon.org/methods/streaming/#streams
|
||||||
*/
|
*/
|
||||||
const streamSchema = z.enum([
|
const streamSchema = z.enum([
|
||||||
'nostr',
|
|
||||||
'public',
|
'public',
|
||||||
|
'public:media',
|
||||||
'public:local',
|
'public:local',
|
||||||
|
'public:local:media',
|
||||||
|
'public:remote',
|
||||||
|
'public:remote:media',
|
||||||
|
'hashtag',
|
||||||
|
'hashtag:local',
|
||||||
'user',
|
'user',
|
||||||
|
'user:notification',
|
||||||
|
'list',
|
||||||
|
'direct',
|
||||||
]);
|
]);
|
||||||
|
|
||||||
|
type Stream = z.infer<typeof streamSchema>;
|
||||||
|
|
||||||
const streamingController: AppController = (c) => {
|
const streamingController: AppController = (c) => {
|
||||||
const upgrade = c.req.headers.get('upgrade');
|
const upgrade = c.req.headers.get('upgrade');
|
||||||
const token = c.req.headers.get('sec-websocket-protocol');
|
const token = c.req.headers.get('sec-websocket-protocol');
|
||||||
|
@ -48,7 +58,7 @@ const streamingController: AppController = (c) => {
|
||||||
|
|
||||||
socket.onopen = async () => {
|
socket.onopen = async () => {
|
||||||
if (!stream) return;
|
if (!stream) return;
|
||||||
const filter = topicToFilter(stream);
|
const filter = topicToFilter(stream, c.req.query());
|
||||||
|
|
||||||
if (filter) {
|
if (filter) {
|
||||||
for await (const event of Sub.sub(socket, '1', [filter])) {
|
for await (const event of Sub.sub(socket, '1', [filter])) {
|
||||||
|
@ -67,12 +77,18 @@ const streamingController: AppController = (c) => {
|
||||||
return response;
|
return response;
|
||||||
};
|
};
|
||||||
|
|
||||||
function topicToFilter(topic: string): DittoFilter<1> | undefined {
|
function topicToFilter(topic: Stream, query?: Record<string, string>): DittoFilter<1> | undefined {
|
||||||
switch (topic) {
|
switch (topic) {
|
||||||
case 'public':
|
case 'public':
|
||||||
return { kinds: [1] };
|
return { kinds: [1] };
|
||||||
case 'public:local':
|
case 'public:local':
|
||||||
return { kinds: [1], local: true };
|
return { kinds: [1], local: true };
|
||||||
|
case 'hashtag':
|
||||||
|
if (query?.tag) return { kinds: [1], '#t': [query.tag] };
|
||||||
|
break;
|
||||||
|
case 'hashtag:local':
|
||||||
|
if (query?.tag) return { kinds: [1], local: true, '#t': [query.tag] };
|
||||||
|
break;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
Loading…
Reference in New Issue