mirror of
				https://gitlab.com/MrFry/mrfrys-node-server
				synced 2025-04-01 20:24:18 +02:00 
			
		
		
		
	
		
			
				
	
	
		
			84 lines
		
	
	
		
			2.6 KiB
		
	
	
	
		
			TypeScript
		
	
	
	
	
	
			
		
		
	
	
			84 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,
 | |
|     })
 | |
| }
 |