fix: use latest event

This commit is contained in:
Shusui MOYATANI
2023-03-13 00:31:38 +09:00
parent c3d9eaa10b
commit 19b2a8c367
5 changed files with 25 additions and 16 deletions

View File

@@ -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;
};

View File

@@ -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>[]>([]);

View File

@@ -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) => {

View File

@@ -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 };
};

View File

@@ -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;
}
};