2022-03-01 19:14:15 -08:00
|
|
|
const dotenv = require('dotenv')
|
|
|
|
|
dotenv.config()
|
|
|
|
|
|
2022-03-23 14:27:45 -07:00
|
|
|
const { Config, System } = require('simplyapi')
|
|
|
|
|
const { Util } = require('simplyapi')
|
2022-03-23 14:01:47 -07:00
|
|
|
const { initializeCache, determineAction, insertFront, removeFront, updateCustomStatus } = require('./dataManager')
|
2022-02-28 20:59:49 -08:00
|
|
|
|
2022-05-09 08:07:44 -07:00
|
|
|
const {
|
|
|
|
|
isMainThread,
|
|
|
|
|
BroadcastChannel,
|
|
|
|
|
Worker
|
|
|
|
|
} = require('node:worker_threads')
|
|
|
|
|
|
2022-03-01 11:10:19 -08:00
|
|
|
let e
|
2022-05-09 08:07:44 -07:00
|
|
|
main = () => {
|
|
|
|
|
initiateWorkerPool()
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
// Queue
|
|
|
|
|
const async = require('async')
|
|
|
|
|
const queue = async.queue((task, completed) => {
|
|
|
|
|
let error = { status: false, message: '' }
|
|
|
|
|
update(task.data)
|
|
|
|
|
.catch(err => {
|
|
|
|
|
error.status = true
|
|
|
|
|
error.message = err
|
|
|
|
|
})
|
|
|
|
|
completed(error, task)
|
|
|
|
|
|
|
|
|
|
}, Config.max_workers)
|
|
|
|
|
|
|
|
|
|
initiateWorkerPool = () => {
|
|
|
|
|
// Worker Pool
|
|
|
|
|
const bc = new BroadcastChannel('plural')
|
|
|
|
|
|
|
|
|
|
if (isMainThread) {
|
|
|
|
|
openWebSocket()
|
|
|
|
|
|
|
|
|
|
bc.onmessage = (event) => {
|
|
|
|
|
//console.log('::SimplyWS:: received message from worker')
|
|
|
|
|
queue.push(event.data, (error, task) => {
|
|
|
|
|
if (error.status) {
|
|
|
|
|
console.log(`An error occurred while processing task ${error.message}`)
|
|
|
|
|
}
|
|
|
|
|
})
|
|
|
|
|
}
|
|
|
|
|
for (let n = 0; n < Config.max_workers; n++)
|
|
|
|
|
new Worker(__filename)
|
|
|
|
|
}
|
2022-02-28 20:59:49 -08:00
|
|
|
}
|
|
|
|
|
|
2022-05-09 08:07:44 -07:00
|
|
|
// Socket
|
|
|
|
|
openWebSocket = () => {
|
2022-03-01 19:40:22 -08:00
|
|
|
const WebSocketClient = require('./WebsocketClient')
|
2022-05-09 08:07:44 -07:00
|
|
|
const wss = new WebSocketClient(Config.socket)
|
2022-03-06 03:02:52 -08:00
|
|
|
let initialPacket = { "op": "authenticate", "token": Config.token }
|
2022-02-28 20:59:49 -08:00
|
|
|
wss.onOpen = (_) => { wss.send(JSON.stringify(initialPacket)); }
|
|
|
|
|
wss.onClose = (e) => { console.log('SimplyWS/onClose :: %s', e); e = '' }
|
|
|
|
|
wss.onError = (e) => { console.log('SimplyWS/onError :: %s', e) }
|
|
|
|
|
|
2022-05-09 08:07:44 -07:00
|
|
|
const bc = new BroadcastChannel('plural')
|
2022-03-23 14:01:47 -07:00
|
|
|
wss.onMessage = (raw) => {
|
2022-02-28 20:59:49 -08:00
|
|
|
e = raw
|
|
|
|
|
let data = JSON.parse(e)
|
|
|
|
|
if (Object.keys(data).length === 0) return
|
2022-03-23 14:01:47 -07:00
|
|
|
|
2022-02-28 20:59:49 -08:00
|
|
|
switch (data.msg) {
|
|
|
|
|
case "Successfully authenticated":
|
|
|
|
|
console.log('::SimplyWS:: authenticated')
|
2022-03-01 11:10:19 -08:00
|
|
|
// cache current front
|
2022-03-23 14:01:47 -07:00
|
|
|
initializeCache()
|
|
|
|
|
break
|
2022-02-28 20:59:49 -08:00
|
|
|
case "Authentication violation: Token is missing or invalid. Goodbye :)":
|
|
|
|
|
console.log('::SimplyWS:: invalid token, exiting..')
|
|
|
|
|
process.exit(1)
|
|
|
|
|
case "update":
|
2022-05-09 08:07:44 -07:00
|
|
|
initializeCache()
|
|
|
|
|
bc.postMessage({data: data})
|
2022-03-23 14:01:47 -07:00
|
|
|
break
|
2022-02-28 20:59:49 -08:00
|
|
|
default:
|
2022-03-06 03:02:52 -08:00
|
|
|
//unrecognizedMessage(data.msg)
|
2022-03-23 14:01:47 -07:00
|
|
|
break
|
2022-02-28 20:59:49 -08:00
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
2022-05-09 08:07:44 -07:00
|
|
|
// Data Processing
|
2022-03-23 14:01:47 -07:00
|
|
|
update = async (data) => {
|
|
|
|
|
let target = data.target
|
2022-02-28 20:59:49 -08:00
|
|
|
switch (target) {
|
|
|
|
|
case 'frontHistory':
|
2022-03-01 11:10:19 -08:00
|
|
|
//response += 'Front has changed!'
|
2022-03-23 14:01:47 -07:00
|
|
|
await Util.asyncForEach(data.results, async (o) => {
|
2022-03-06 03:02:52 -08:00
|
|
|
let system = new System(Config)
|
2022-03-23 14:01:47 -07:00
|
|
|
let member = await system.getMemberById(o.content.member)
|
|
|
|
|
// insert
|
|
|
|
|
if (o.operationType == "insert") {
|
|
|
|
|
insertFront(member)
|
|
|
|
|
}
|
|
|
|
|
else {
|
|
|
|
|
// get current fronters and patch the list
|
|
|
|
|
let frontData = await system.getFronters()
|
|
|
|
|
let action = await determineAction(o, frontData)
|
|
|
|
|
// if delete operation, remove the member from the list
|
|
|
|
|
switch (action) {
|
|
|
|
|
case "remove":
|
|
|
|
|
removeFront(member)
|
|
|
|
|
break
|
|
|
|
|
|
|
|
|
|
case "customStatus":
|
|
|
|
|
updateCustomStatus(member)
|
|
|
|
|
break
|
|
|
|
|
}
|
|
|
|
|
}
|
2022-02-28 20:59:49 -08:00
|
|
|
})
|
2022-03-23 14:01:47 -07:00
|
|
|
break
|
2022-02-28 20:59:49 -08:00
|
|
|
default:
|
2022-03-06 03:02:52 -08:00
|
|
|
//unknownTarget(data.target)
|
2022-03-23 14:01:47 -07:00
|
|
|
break
|
2022-03-01 11:10:19 -08:00
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
2022-02-28 20:59:49 -08:00
|
|
|
main()
|