mirror of
https://gitlab.com/MrFry/mrfrys-node-server
synced 2025-04-01 20:24:18 +02:00
83 lines
2.6 KiB
TypeScript
83 lines
2.6 KiB
TypeScript
import { parentPort } from 'node:worker_threads'
|
|
import { PeerInfo, Question, QuestionDb } from '../../types/basicTypes'
|
|
import { files, paths, readAndValidateFile } from '../../utils/files'
|
|
import utils from '../../utils/utils'
|
|
import { RecievedData } from '../../utils/actions'
|
|
import { removeCacheFromQuestion } from '../../utils/qdbUtils'
|
|
import { QuestionAddResponse } from '../../modules/api/submodules/qminingapi'
|
|
import logger from '../../utils/logger'
|
|
import { peerToString, loginAndPostDataToAllPeers } from '../../utils/p2putils'
|
|
import { post } from '../../utils/networkUtils'
|
|
|
|
export type QuestionsToPeersTaskObject = {
|
|
type: 'sendQuestionsToPeers'
|
|
data: {
|
|
newQuestions: Question[]
|
|
location: string
|
|
subj: string
|
|
}
|
|
}
|
|
|
|
export const handleQuestionsToPeers = async (
|
|
_qdbs: QuestionDb[],
|
|
msg: QuestionsToPeersTaskObject,
|
|
workerIndex: number
|
|
): Promise<void> => {
|
|
const { newQuestions, location, subj } = msg.data
|
|
|
|
const domain = utils.ReadFile(paths.domainFile).trim()
|
|
const peers = readAndValidateFile<PeerInfo[]>(files.peersFile)
|
|
|
|
if (!peers || peers.length === 0 || newQuestions.length === 0) {
|
|
parentPort.postMessage({
|
|
msg: `From thread #${workerIndex}: sendQuestionsToPeers done`,
|
|
workerIndex: workerIndex,
|
|
})
|
|
return
|
|
}
|
|
|
|
const dataToSend: RecievedData = {
|
|
fromPeer: true,
|
|
subj: subj,
|
|
location: location,
|
|
id: domain, // client ID
|
|
version: 'P2P',
|
|
quiz: newQuestions.map((question) => {
|
|
return removeCacheFromQuestion({
|
|
...question,
|
|
data: {
|
|
...question.data,
|
|
source: domain,
|
|
},
|
|
})
|
|
}),
|
|
}
|
|
|
|
const postData = (peer: PeerInfo, sessionCookie: string) => {
|
|
return post<QuestionAddResponse>({
|
|
hostname: peer.host,
|
|
port: peer.port,
|
|
http: peer.http,
|
|
path: '/api/isAdding',
|
|
bodyObject: dataToSend,
|
|
cookie: `sessionID=${sessionCookie}`,
|
|
})
|
|
}
|
|
|
|
const hadNewQuestions: string[] = []
|
|
loginAndPostDataToAllPeers<QuestionAddResponse & { success: boolean }>(
|
|
peers,
|
|
postData,
|
|
(peer, res) => {
|
|
if (res.data?.totalNewQuestions > 0) {
|
|
hadNewQuestions.push(peerToString(peer))
|
|
}
|
|
}
|
|
)
|
|
logger.Log(`Peers that added new questions: ${hadNewQuestions.join(', ')}`)
|
|
|
|
parentPort.postMessage({
|
|
msg: `From thread #${workerIndex}: sendQuestionsToPeers done`,
|
|
workerIndex: workerIndex,
|
|
})
|
|
}
|