puzzle/src/server/GameLog.ts

74 lines
1.5 KiB
TypeScript
Raw Normal View History

2020-12-22 22:35:09 +01:00
import fs from 'fs'
2021-05-29 11:44:55 +02:00
import readline from 'readline'
import stream from 'stream'
import { logger } from './../common/Util'
import { DATA_DIR } from './../server/Dirs'
const log = logger('GameLog.js')
2020-12-22 22:35:09 +01:00
2021-05-17 00:27:47 +02:00
const filename = (gameId: string) => `${DATA_DIR}/log_${gameId}.log`
2020-12-22 22:54:31 +01:00
2021-05-29 15:36:03 +02:00
const create = (gameId: string): void => {
2020-12-22 22:54:31 +01:00
const file = filename(gameId)
if (!fs.existsSync(file)) {
fs.appendFileSync(file, '')
}
}
2021-05-29 15:36:03 +02:00
const exists = (gameId: string): boolean => {
2020-12-22 22:54:31 +01:00
const file = filename(gameId)
return fs.existsSync(file)
}
2021-05-29 15:36:03 +02:00
const _log = (gameId: string, ...args: Array<any>): void => {
2020-12-22 22:54:31 +01:00
const file = filename(gameId)
if (!fs.existsSync(file)) {
return
}
2020-12-22 22:35:09 +01:00
const str = JSON.stringify(args)
2020-12-22 22:54:31 +01:00
fs.appendFileSync(file, str + "\n")
2020-12-22 22:35:09 +01:00
}
2021-05-29 11:44:55 +02:00
const get = async (
gameId: string,
offset: number = 0,
size: number = 10000
): Promise<any[]> => {
2020-12-22 22:54:31 +01:00
const file = filename(gameId)
if (!fs.existsSync(file)) {
return []
}
2021-05-29 11:44:55 +02:00
return new Promise((resolve) => {
const instream = fs.createReadStream(file)
const outstream = new stream.Writable()
const rl = readline.createInterface(instream, outstream)
const lines: any[] = []
let i = -1
rl.on('line', (line) => {
if (!line) {
// skip empty
return
}
i++
if (offset > i) {
return
}
if (offset + size <= i) {
rl.close()
return
}
lines.push(JSON.parse(line))
})
rl.on('close', () => {
resolve(lines)
})
2020-12-22 22:35:09 +01:00
})
}
export default {
2020-12-22 22:54:31 +01:00
create,
exists,
log: _log,
2020-12-22 22:35:09 +01:00
get,
}