mirror of
https://github.com/aljazceru/rabbit.git
synced 2025-12-18 22:44:26 +01:00
fix: use latest event
This commit is contained in:
@@ -104,10 +104,6 @@ export const parseTextNote = (event: NostrEvent): ParsedTextNote => {
|
||||
result.push(plainText);
|
||||
}
|
||||
|
||||
if (result.length > 1) {
|
||||
console.log(JSON.stringify(result, null, 2));
|
||||
}
|
||||
|
||||
return result;
|
||||
};
|
||||
|
||||
|
||||
@@ -40,7 +40,7 @@ const useBatch = <TaskArgs, TaskResult>(
|
||||
) => {
|
||||
const props = createMemo(propsProvider);
|
||||
const batchSize = createMemo(() => props().batchSize ?? 100);
|
||||
const interval = createMemo(() => props().interval ?? 2400);
|
||||
const interval = createMemo(() => props().interval ?? 1000);
|
||||
|
||||
const [seqId, setSeqId] = createSignal<number>(0);
|
||||
const [taskQueue, setTaskQueue] = createSignal<Task<TaskArgs, TaskResult>[]>([]);
|
||||
|
||||
@@ -1,4 +1,4 @@
|
||||
import { createMemo } from 'solid-js';
|
||||
import { createSignal, createMemo, type Signal, type Accessor } from 'solid-js';
|
||||
import { type Event as NostrEvent, type Filter } from 'nostr-tools';
|
||||
|
||||
import useConfig from '@/nostr/useConfig';
|
||||
@@ -15,16 +15,17 @@ export type UseBatchedEventProps<TaskArgs> = {
|
||||
const useBatchedEvent = <TaskArgs>(propsProvider: () => UseBatchedEventProps<TaskArgs>) => {
|
||||
const props = createMemo(propsProvider);
|
||||
|
||||
return useBatch<TaskArgs, NostrEvent>(() => ({
|
||||
return useBatch<TaskArgs, Accessor<NostrEvent>>(() => ({
|
||||
interval: props().interval,
|
||||
executor: (tasks) => {
|
||||
const { generateKey, mergeFilters, extractKey } = props();
|
||||
// TODO relayUrlsを考慮する
|
||||
const { config } = useConfig();
|
||||
|
||||
const keyTaskMap = new Map<string | number, Task<TaskArgs, NostrEvent>>(
|
||||
const keyTaskMap = new Map<string | number, Task<TaskArgs, Accessor<NostrEvent>>>(
|
||||
tasks.map((task) => [generateKey(task.args), task]),
|
||||
);
|
||||
const keyEventSignalMap = new Map<string | number, Signal<NostrEvent>>();
|
||||
const filters = mergeFilters(tasks.map((task) => task.args));
|
||||
|
||||
useSubscription(() => ({
|
||||
@@ -34,9 +35,21 @@ const useBatchedEvent = <TaskArgs>(propsProvider: () => UseBatchedEventProps<Tas
|
||||
onEvent: (event: NostrEvent) => {
|
||||
const key = extractKey(event);
|
||||
if (key == null) return;
|
||||
|
||||
const task = keyTaskMap.get(key);
|
||||
if (task == null) return;
|
||||
task.resolve(event);
|
||||
|
||||
let signal = keyEventSignalMap.get(key);
|
||||
if (signal == null) {
|
||||
signal = createSignal(event);
|
||||
keyEventSignalMap.set(key, signal);
|
||||
}
|
||||
|
||||
if (event.created_at > signal[0]().created_at) {
|
||||
signal[1](event);
|
||||
}
|
||||
|
||||
task.resolve(signal[0]);
|
||||
},
|
||||
onEOSE: () => {
|
||||
tasks.forEach((task) => {
|
||||
|
||||
@@ -13,7 +13,7 @@ export type UseEventProps = {
|
||||
|
||||
export type UseEvent = {
|
||||
event: Accessor<NostrEvent | undefined>;
|
||||
query: CreateQueryResult<NostrEvent | undefined>;
|
||||
query: CreateQueryResult<Accessor<NostrEvent> | undefined>;
|
||||
};
|
||||
|
||||
const { exec } = useBatchedEvent<UseEventProps>(() => ({
|
||||
@@ -41,7 +41,7 @@ const useEvent = (propsProvider: () => UseEventProps | null): UseEvent => {
|
||||
},
|
||||
);
|
||||
|
||||
const event = () => query.data;
|
||||
const event = () => query.data?.();
|
||||
|
||||
return { event, query };
|
||||
};
|
||||
|
||||
@@ -30,11 +30,10 @@ export type UseProfileProps = {
|
||||
|
||||
type UseProfile = {
|
||||
profile: Accessor<Profile | undefined>;
|
||||
query: CreateQueryResult<NostrEvent>;
|
||||
query: CreateQueryResult<Accessor<NostrEvent> | undefined>;
|
||||
};
|
||||
|
||||
const { exec } = useBatchedEvent<UseProfileProps>(() => ({
|
||||
interval: 2000,
|
||||
generateKey: ({ pubkey }: UseProfileProps): string => pubkey,
|
||||
mergeFilters: (args: UseProfileProps[]): Filter[] => {
|
||||
const pubkeys = args.map((arg) => arg.pubkey);
|
||||
@@ -62,12 +61,13 @@ const useProfile = (propsProvider: () => UseProfileProps | null): UseProfile =>
|
||||
);
|
||||
|
||||
const profile = () => {
|
||||
if (query.data == null) return undefined;
|
||||
const content = query.data?.()?.content;
|
||||
if (content == null) return undefined;
|
||||
// TODO 大きすぎたりしないかどうか、JSONかどうかのチェック
|
||||
try {
|
||||
return JSON.parse(query.data.content) as Profile;
|
||||
return JSON.parse(content) as Profile;
|
||||
} catch (e) {
|
||||
console.error(e, query.data.content);
|
||||
console.error(e, content);
|
||||
return undefined;
|
||||
}
|
||||
};
|
||||
|
||||
Reference in New Issue
Block a user