test use db in worker_thread

This commit is contained in:
geekgeekrun
2024-03-29 09:35:35 +08:00
parent fc91859639
commit 6518776596
5 changed files with 125 additions and 1 deletions
+1 -1
View File
@@ -17,7 +17,7 @@ import sqlite3 from 'sqlite3';
import * as cliHighlight from 'cli-highlight';
Boolean(cliHighlight);
function initDb(dbFilePath) {
export function initDb(dbFilePath) {
const { DataSource } = requireTypeorm()
const appDataSource = new DataSource({
type: "sqlite",
@@ -17,6 +17,7 @@ import { getAnyAvailablePuppeteerExecutable } from '../../../flow/CHECK_AND_DOWN
import { sleep } from '@geekgeekrun/utils/sleep.mjs'
import { AUTO_CHAT_ERROR_EXIT_CODE } from '../../../../common/enums/auto-start-chat'
import { mainWindow } from '../../../window/mainWindow'
import { getAutoStartChatRecord, initDbWorker } from '../utils/db/index'
export default function initIpc () {
ipcMain.on('open-external-link', (_, link) => {
@@ -257,4 +258,11 @@ export default function initIpc () {
const cookies = readStorageFile('boss-cookies.json')
return checkCookieListFormat(cookies)
})
ipcMain.handle('connect-db', async () => {
const worker = await initDbWorker()
console.log(worker)
const a = await getAutoStartChatRecord()
console.log(a)
})
}
@@ -0,0 +1,57 @@
import createDbWorker from './worker/index?nodeWorker&url'
import { type Worker } from 'node:worker_threads'
import { randomUUID } from 'node:crypto'
let worker: Worker | null = null
let workerExitCode: number | null = null
export const initDbWorker = () => {
if (!worker || typeof workerExitCode === 'number') {
worker = createDbWorker()
workerExitCode = null
return new Promise((resolve, reject) => {
worker.once('exit', (exitCode) => {
workerExitCode = exitCode
worker = null
})
worker.on('message', function handler(data) {
if (data.type === 'DB_INIT_SUCCESS') {
resolve(worker)
// attach more event
worker?.off('message', handler)
} else if (data.type === 'DB_INIT_FAIL') {
reject(undefined)
worker?.terminate()
worker?.off('message', handler)
worker = null
}
})
})
} else {
return worker
}
}
const createWorkerPromise = async (data) => {
await initDbWorker()
const uuid = randomUUID()
worker.postMessage({
_uuid: uuid,
...data
})
return new Promise((resolve) => {
worker.on('message', function handler(data) {
const { _uuid, ...payload } = data ?? {}
if (_uuid === uuid) {
resolve(payload)
worker!.off('message', handler)
}
})
})
}
export const getAutoStartChatRecord = async () => {
const res = await createWorkerPromise({
type: 'getAutoStartChatRecord'
})
return res
}
@@ -0,0 +1,53 @@
import { parentPort } from 'node:worker_threads'
import { initDb } from '@geekgeekrun/sqlite-plugin'
import typeorm from 'typeorm'
import { type DataSource } from 'typeorm'
import { getPublicDbFilePath } from '@geekgeekrun/geek-auto-start-chat-with-boss/runtime-file-utils.mjs'
const dbInitPromise = initDb(getPublicDbFilePath())
let dataSource = null
dbInitPromise.then(
(_dataSource) => {
dataSource = _dataSource
attachMessageHandler()
parentPort?.postMessage({
type: 'DB_INIT_SUCCESS'
})
},
(error) => {
parentPort?.postMessage({
type: 'DB_INIT_FAIL',
error
})
process.exit(1)
}
)
const payloadHandler = {
getAutoStartChatRecord(payload, callback) {
callback({
x: 'zzzz',
...payload
})
}
}
async function attachMessageHandler() {
if (!dataSource) {
await dbInitPromise
}
parentPort?.on('message', (event) => {
const { _uuid, ...restObj } = event
const { type } = event
const callback = (result) => {
parentPort?.postMessage({
_uuid,
data: result
})
}
payloadHandler[type](restObj, callback)
})
}
@@ -52,4 +52,10 @@ onMounted(async () => {
}
})
})
electron.ipcRenderer.invoke('connect-db').then(() => {
debugger
}, () => {
debugger
})
</script>