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