diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index b9e54e7..12b8c30 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -64,8 +64,8 @@ importers: specifier: ~29.5 version: 29.5.0(@types/node@18.16.19) prettier: - specifier: ~2.8 - version: 2.8.8 + specifier: 3.2.5 + version: 3.2.5 rimraf: specifier: ~5.0 version: 5.0.1 @@ -2171,9 +2171,9 @@ packages: resolution: {integrity: sha512-vkcDPrRZo1QZLbn5RLGPpg/WmIQ65qoWWhcGKf/b5eplkkarX0m9z8ppCat4mlOqUsWpyNuYgO3VRyrYHSzX5g==} engines: {node: '>= 0.8.0'} - prettier@2.8.8: - resolution: {integrity: sha512-tdN8qQGvNjw4CHbY+XXk0JgCXn9QiF21a55rBe5LJAU+kDyC4WQn4+awm2Xfk2lQMk5fKup9XgzTZtGkjBdP9Q==} - engines: {node: '>=10.13.0'} + prettier@3.2.5: + resolution: {integrity: sha512-3/GWa9aOC0YeD7LUfvOG2NiDyhOWRvt1k+rcKhOuYnMY24iiCphgneUfJDyFXd6rZCAnuLBv6UeAULtrhT/F4A==} + engines: {node: '>=14'} hasBin: true pretty-format@29.6.1: @@ -5246,7 +5246,7 @@ snapshots: prelude-ls@1.2.1: {} - prettier@2.8.8: {} + prettier@3.2.5: {} pretty-format@29.6.1: dependencies: diff --git a/src/job-types/relay-info.ts b/src/job-types/relay-info.ts new file mode 100644 index 0000000..7ce1ee9 --- /dev/null +++ b/src/job-types/relay-info.ts @@ -0,0 +1,49 @@ +import { NDKEvent } from '@nostr-dev-kit/ndk' +import { log } from '../main.js' +import axios from 'axios' +import { RelayInfo } from '../types/index.js' + +export const relayInfoJob = async (event: NDKEvent): Promise => { + log('New relay-info job', event.rawEvent()) + + const input: string = event.tagValue('i') + + let relays: string[] = [] + + try { + const relaysArr = JSON.parse(input) + + // input is a string containing an array of strings representing multiple relay URIs + relays = relaysArr + } catch (err) { + // input is a string containing a string representing single relay URI + + relays.push(input) + } + + const wssPrefix = 'wss://' + const headers = { + headers: { Accept: 'application/nostr+json' } + } + + const requests = relays.map((relay) => { + if (relay.startsWith(wssPrefix)) { + relay = relay.replace(wssPrefix, '') + } + + return axios + .get((relay = `https://${relay}`), headers) + .catch(() => { + return axios + .get(`http://${relay}`, headers) + .catch(() => undefined) + }) + }) + + let responses = await Promise.all(requests) + responses = responses.filter((response) => response !== undefined) + + const data = responses.map((response) => response.data) + + return Promise.resolve(JSON.stringify(data)) +} diff --git a/src/main.ts b/src/main.ts index cdf88e9..de1a7da 100644 --- a/src/main.ts +++ b/src/main.ts @@ -11,6 +11,8 @@ import { getConfig } from './config/index.js' import { decode } from 'light-bolt11-decoder' import { checkInvoiceStatus } from './utils/lnbits.js' import { blockChainBlockNumberJob } from './job-types/blockChain-block-number.js' +import { relayInfoJob } from './job-types/relay-info.js' +import { JobType, JobTypes } from './types/index.js' export const log = debug('fool-me-once-dvm') @@ -34,7 +36,7 @@ const subs = ndk.subscribe( { kinds: [68001 as number], since: Math.floor(Date.now() / 1000), - '#j': ['summarize', 'explain'] + '#j': [JobTypes.Summarize, JobTypes.Explain] }, { closeOnEose: false } ) @@ -43,7 +45,7 @@ const speechToTextSub = ndk.subscribe( { kinds: [68001 as number], since: Math.floor(Date.now() / 1000), - '#j': ['speech-to-text'] + '#j': [JobTypes.SpeechToText] }, { closeOnEose: false } ) @@ -52,26 +54,31 @@ const blockChainBlockNumberSub = ndk.subscribe( { kinds: [68001 as number], since: Math.floor(Date.now() / 1000), - '#j': ['blockChain-block-number'] + '#j': [JobTypes.BlockChainBlockNumber] + }, + { closeOnEose: false } +) +const relayInfoSub = ndk.subscribe( + { + kinds: [68001 as number], + since: Math.floor(Date.now() / 1000), + '#j': [JobTypes.RelayInfo] }, { closeOnEose: false } ) -subs.on('event', (e) => processJobEvent(e, 'summarize')) -speechToTextSub.on('event', (e) => processJobEvent(e, 'speech-to-text')) +subs.on('event', (e) => processJobEvent(e, JobTypes.Summarize)) +speechToTextSub.on('event', (e) => processJobEvent(e, JobTypes.SpeechToText)) blockChainBlockNumberSub.on('event', (e) => - processJobEvent(e, 'blockChain-block-number') + processJobEvent(e, JobTypes.BlockChainBlockNumber) ) +relayInfoSub.on('event', (e) => processJobEvent(e, JobTypes.RelayInfo)) -type JobType = - | 'summarize' - | 'explain' - | 'speech-to-text' - | 'blockChain-block-number' +const freeJobs: string[] = [JobTypes.BlockChainBlockNumber, JobTypes.RelayInfo] async function processJobEvent(event: NDKEvent, type: JobType): Promise { const config = getConfig() - let jobAmount = type === 'blockChain-block-number' ? 0 : await priceJob(event) + let jobAmount = freeJobs.includes(type) ? 0 : await priceJob(event) let output: any let payReqEvent: NDKEvent let paidAmount = 0 @@ -195,18 +202,22 @@ async function processJobEvent(event: NDKEvent, type: JobType): Promise { await inProgress(event) switch (type) { - case 'summarize': { + case JobTypes.Summarize: { output = await onNewSummarizationJob(event) break } - case 'speech-to-text': { + case JobTypes.SpeechToText: { output = await speechToTextJob(event) break } - case 'blockChain-block-number': { + case JobTypes.BlockChainBlockNumber: { output = await blockChainBlockNumberJob(event) break } + case JobTypes.RelayInfo: { + output = await relayInfoJob(event) + break + } } } diff --git a/src/types/index.ts b/src/types/index.ts new file mode 100644 index 0000000..1fc9c26 --- /dev/null +++ b/src/types/index.ts @@ -0,0 +1,2 @@ +export * from './relay.js' +export * from './job.js' diff --git a/src/types/job.ts b/src/types/job.ts new file mode 100644 index 0000000..3a60329 --- /dev/null +++ b/src/types/job.ts @@ -0,0 +1,14 @@ +export type JobType = + | 'summarize' + | 'explain' + | 'speech-to-text' + | 'blockChain-block-number' + | 'relay-info' + +export enum JobTypes { + Summarize = 'summarize', + Explain = 'explain', + SpeechToText = 'speech-to-text', + BlockChainBlockNumber = 'blockChain-block-number', + RelayInfo = 'relay-info' +} diff --git a/src/types/relay.ts b/src/types/relay.ts new file mode 100644 index 0000000..7924fb2 --- /dev/null +++ b/src/types/relay.ts @@ -0,0 +1,9 @@ +export interface RelayInfo { + name: string + description: string + pubkey: string + contact: string + supported_nips: number[] + software: string + version: string +}