Skip to content

Commit f925649

Browse files
committed
migrate sendTo
1 parent 473fc46 commit f925649

File tree

5 files changed

+170
-216
lines changed

5 files changed

+170
-216
lines changed

app/src/ts/main.ts

+9-1
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
import './common/asar'
2-
import { app, BrowserWindow, ipcMain, BrowserWindowConstructorOptions, Menu, MenuItem, globalShortcut } from 'electron'
2+
import { app, BrowserWindow, ipcMain, BrowserWindowConstructorOptions, Menu, MenuItem, globalShortcut, MessageChannelMain } from 'electron'
33
import { join } from 'path'
44
import * as url from 'url'
55
import './common/get-path'
@@ -24,6 +24,8 @@ let mainWindow: BrowserWindow | null = null
2424
let backWindow: BrowserWindow | null = null
2525

2626
function createWindow (): void {
27+
const { port1, port2 } = new MessageChannelMain()
28+
2729
const browerWindowOptions: BrowserWindowConstructorOptions = {
2830
width: 1296,
2931
height: 863,
@@ -50,6 +52,7 @@ function createWindow (): void {
5052
if (!mainWindow) return
5153
mainWindow.show()
5254
mainWindow.focus()
55+
mainWindow.webContents.postMessage('port', null, [port1])
5356
})
5457

5558
mainWindow.on('closed', function () {
@@ -75,6 +78,11 @@ function createWindow (): void {
7578
}
7679
})
7780

81+
backWindow.on('ready-to-show', function () {
82+
if (!backWindow) return
83+
backWindow.webContents.postMessage('port', null, [port2])
84+
})
85+
7886
backWindow.on('closed', function () {
7987
backWindow = null
8088
})

app/src/ts/renderer-back.ts

+64-93
Original file line numberDiff line numberDiff line change
@@ -2,133 +2,104 @@ import './renderer/preload'
22
import { ipcRenderer } from 'electron'
33
import DB from './common/db'
44
import { batchDownload, batchStop, getBatchErrorList, setDownloaderProxy } from './renderer/back/batch-download'
5-
import mainWindowId from './renderer/back/main-window-id'
5+
// import mainWindowId from './renderer/back/main-window-id'
66
import readMaster from './renderer/back/on-master-read'
77

88
let manifest: DB | null = null
99
let master: DB | null = null
1010

11-
ipcRenderer.on('openManifestDatabase', async (event, callbackChannel: string, path: string) => {
12-
if (manifest) {
13-
event.sender.sendTo(mainWindowId, callbackChannel, null)
14-
return
11+
ipcRenderer.on('port', e => {
12+
const mainWindowPort = e.ports[0]
13+
14+
function defineRemoteFunction (name: string, fn: (...args: any[]) => any): void {
15+
mainWindowPort.addEventListener('message', (event) => {
16+
if (event.data.type === name) {
17+
Promise.resolve(fn(...event.data.payload)).then(ret => {
18+
mainWindowPort.postMessage({
19+
id: event.data.id,
20+
err: null,
21+
data: ret
22+
})
23+
}).catch(err => {
24+
mainWindowPort.postMessage({
25+
id: event.data.id,
26+
err: err.message,
27+
data: undefined
28+
})
29+
})
30+
}
31+
})
1532
}
16-
try {
33+
34+
defineRemoteFunction('openManifestDatabase', async (path: string) => {
35+
if (manifest) {
36+
return
37+
}
1738
manifest = await DB.open(path)
18-
event.sender.sendTo(mainWindowId, callbackChannel, null)
19-
} catch (err: any) {
20-
event.sender.sendTo(mainWindowId, callbackChannel, err.message)
21-
}
22-
})
39+
})
2340

24-
ipcRenderer.on('openMasterDatabase', async (event, callbackChannel: string, path: string) => {
25-
if (master) {
26-
event.sender.sendTo(mainWindowId, callbackChannel, null)
27-
return
28-
}
29-
try {
41+
defineRemoteFunction('openMasterDatabase', async (path: string) => {
42+
if (master) {
43+
return
44+
}
3045
master = await DB.open(path)
31-
event.sender.sendTo(mainWindowId, callbackChannel, null)
32-
} catch (err: any) {
33-
event.sender.sendTo(mainWindowId, callbackChannel, err.message)
34-
}
35-
})
46+
})
3647

37-
ipcRenderer.on('getMasterHash', async (event, callbackChannel: string) => {
38-
try {
48+
defineRemoteFunction('getMasterHash', async () => {
3949
const masterHash = (await manifest!.find('manifests', ['name', 'hash'], { name: 'master.mdb' }))[0].hash as string
40-
event.sender.sendTo(mainWindowId, callbackChannel, null, masterHash)
41-
} catch (err: any) {
42-
event.sender.sendTo(mainWindowId, callbackChannel, err.message, '')
43-
}
44-
})
50+
return masterHash
51+
})
4552

46-
ipcRenderer.on('readMasterData', async (event, callbackChannel: string, masterFile: string) => {
47-
try {
53+
defineRemoteFunction('readMasterData', async (masterFile: string) => {
4854
master = await DB.open(masterFile)
4955
const masterData = await readMaster(master, manifest!)
5056
await master.close()
5157
master = null
52-
event.sender.sendTo(mainWindowId, callbackChannel, null, masterData)
53-
} catch (err: any) {
54-
event.sender.sendTo(mainWindowId, callbackChannel, err.message, '')
55-
}
56-
})
58+
return masterData
59+
})
5760

58-
ipcRenderer.on('getCardHash', async (event, callbackChannel: string, id: string | number) => {
59-
try {
61+
defineRemoteFunction('getCardHash', async (id: string | number) => {
6062
const res = await manifest!.find('manifests', ['hash'], { name: `card_bg_${id}.unity3d` })
61-
event.sender.sendTo(mainWindowId, callbackChannel, null, res[0].hash)
62-
} catch (err: any) {
63-
event.sender.sendTo(mainWindowId, callbackChannel, err.message, '')
64-
}
65-
})
63+
return res[0].hash
64+
})
6665

67-
ipcRenderer.on('getIconHash', async (event, callbackChannel: string, id: string | number) => {
68-
try {
66+
defineRemoteFunction('getIconHash', async (id: string | number) => {
6967
const res = await manifest!.findOne('manifests', ['hash'], { name: `card_${id}_m.unity3d` })
70-
event.sender.sendTo(mainWindowId, callbackChannel, null, res.hash)
71-
} catch (err: any) {
72-
event.sender.sendTo(mainWindowId, callbackChannel, err.message, '')
73-
}
74-
})
68+
return res.hash
69+
})
7570

76-
ipcRenderer.on('getEmblemHash', async (event, callbackChannel: string, id: string | number) => {
77-
try {
71+
defineRemoteFunction('getEmblemHash', async (id: string | number) => {
7872
const res = await manifest!.findOne('manifests', ['hash'], { name: `emblem_${id}_l.unity3d` })
79-
event.sender.sendTo(mainWindowId, callbackChannel, null, res.hash)
80-
} catch (err: any) {
81-
event.sender.sendTo(mainWindowId, callbackChannel, err.message, '')
82-
}
83-
})
73+
return res.hash
74+
})
8475

85-
ipcRenderer.on('searchResources', async (event, callbackChannel: string, queryString: string) => {
86-
try {
76+
defineRemoteFunction('searchResources', async (queryString: string) => {
8777
const res = await manifest!.find<{ name: string, hash: string }>('manifests', ['name', 'hash', 'size'], { name: { $like: `%${queryString.trim()}%` } })
88-
event.sender.sendTo(mainWindowId, callbackChannel, null, res)
89-
} catch (err: any) {
90-
event.sender.sendTo(mainWindowId, callbackChannel, err.message, '')
91-
}
92-
})
78+
return res
79+
})
9380

94-
let batchDownloading = false
81+
let batchDownloading = false
9582

96-
ipcRenderer.on('startBatchDownload', async (event, callbackChannel: string) => {
97-
try {
83+
defineRemoteFunction('startBatchDownload', async () => {
9884
batchDownloading = true
99-
await batchDownload(manifest!)
100-
event.sender.sendTo(mainWindowId, callbackChannel, null, batchDownloading)
101-
} catch (err: any) {
102-
event.sender.sendTo(mainWindowId, callbackChannel, err.message, '')
103-
}
104-
})
85+
await batchDownload(mainWindowPort, manifest!)
86+
return batchDownloading
87+
})
10588

106-
ipcRenderer.on('stopBatchDownload', async (event, callbackChannel: string) => {
107-
try {
89+
defineRemoteFunction('stopBatchDownload', async () => {
10890
await batchStop()
10991
batchDownloading = false
110-
event.sender.sendTo(mainWindowId, callbackChannel, null, batchDownloading)
111-
} catch (err: any) {
112-
event.sender.sendTo(mainWindowId, callbackChannel, err.message, '')
113-
}
114-
})
92+
return batchDownloading
93+
})
11594

116-
ipcRenderer.on('getBatchErrorList', (event, callbackChannel: string) => {
117-
try {
95+
defineRemoteFunction('getBatchErrorList', () => {
11896
const list = getBatchErrorList()
119-
event.sender.sendTo(mainWindowId, callbackChannel, null, list)
120-
} catch (err: any) {
121-
event.sender.sendTo(mainWindowId, callbackChannel, err.message, null)
122-
}
123-
})
97+
return list
98+
})
12499

125-
ipcRenderer.on('setDownloaderProxy', (event, callbackChannel: string, proxy: string) => {
126-
try {
100+
defineRemoteFunction('setDownloaderProxy', (proxy: string) => {
127101
setDownloaderProxy(proxy)
128-
event.sender.sendTo(mainWindowId, callbackChannel, null)
129-
} catch (err: any) {
130-
event.sender.sendTo(mainWindowId, callbackChannel, err.message)
131-
}
102+
})
132103
})
133104

134105
window.addEventListener('beforeunload', () => {

app/src/ts/renderer/back/batch-download.ts

+44-32
Original file line numberDiff line numberDiff line change
@@ -3,8 +3,8 @@ import { formatSize } from '../../common/util'
33
import getPath from '../../common/get-path'
44
import { md5File } from './hash'
55
import type { DownloadPromise, ResourceType as ResourceTypeEnum } from 'mishiro-core'
6-
import { ipcRenderer } from 'electron'
7-
import mainWindowId from './main-window-id'
6+
// import { ipcRenderer } from 'electron'
7+
// import mainWindowId from './main-window-id'
88
import { warn } from '../log'
99
import configurer from '../config'
1010

@@ -23,7 +23,7 @@ interface ManifestResouceWithPath extends ManifestResouce {
2323

2424
let stopBatch = false
2525

26-
async function checkFiles (manifest: DB): Promise<{
26+
async function checkFiles (port: MessagePort, manifest: DB): Promise<{
2727
list: ManifestResouceWithPath[]
2828
count: number
2929
}> {
@@ -53,12 +53,15 @@ async function checkFiles (manifest: DB): Promise<{
5353
const n = Date.now()
5454
if ((n >= (t + 100)) || (i === records.length - 1)) {
5555
t = n
56-
ipcRenderer.sendTo(mainWindowId, 'setBatchStatus', {
57-
name: 'Checking',
58-
status: `${i + 1} / ${records.length}`,
59-
status2: `${completeCount} / ${records.length}`,
60-
curprog: 100 * (i + 1) / records.length,
61-
totalprog: 0
56+
port.postMessage({
57+
type: 'setBatchStatus',
58+
payload: [{
59+
name: 'Checking',
60+
status: `${i + 1} / ${records.length}`,
61+
status2: `${completeCount} / ${records.length}`,
62+
curprog: 100 * (i + 1) / records.length,
63+
totalprog: 0
64+
}]
6265
})
6366
}
6467
}
@@ -81,16 +84,16 @@ export function setDownloaderProxy (proxy: string): void {
8184
downloader.setProxy(proxy)
8285
}
8386

84-
export async function batchDownload (manifest: DB): Promise<void> {
87+
export async function batchDownload (port: MessagePort, manifest: DB): Promise<void> {
8588
errorList = []
86-
const info = await checkFiles(manifest)
89+
const info = await checkFiles(port, manifest)
8790
list = info.list
8891
const count = info.count
8992
const totalCount = list.length + count
9093
if (stopBatch) {
9194
stopBatch = false
9295
list.length = 0
93-
resetBatchStatus()
96+
resetBatchStatus(port)
9497
return
9598
}
9699
for (let i = 0; i < list.length; i++) {
@@ -101,21 +104,27 @@ export async function batchDownload (manifest: DB): Promise<void> {
101104
continue
102105
}
103106
const status2 = `${i + count} / ${totalCount}`
104-
ipcRenderer.sendTo(mainWindowId, 'setBatchStatus', {
105-
name: resource.name,
106-
status: '',
107-
status2: status2,
108-
curprog: 0,
109-
totalprog: 100 * (i + count) / totalCount
107+
port.postMessage({
108+
type: 'setBatchStatus',
109+
payload: [{
110+
name: resource.name,
111+
status: '',
112+
status2: status2,
113+
curprog: 0,
114+
totalprog: 100 * (i + count) / totalCount
115+
}]
110116
})
111117
try {
112118
currentDownloadPromise = downloader.downloadOneRaw(type, resource.hash, resource.path, (prog) => {
113-
ipcRenderer.sendTo(mainWindowId, 'setBatchStatus', {
114-
name: resource.name ?? '',
115-
status: `${formatSize(prog.current)} / ${formatSize(prog.max)}`,
116-
status2: status2,
117-
curprog: prog.loading,
118-
totalprog: 100 * (i + count) / totalCount + prog.loading / totalCount
119+
port.postMessage({
120+
type: 'setBatchStatus',
121+
payload: [{
122+
name: resource.name ?? '',
123+
status: `${formatSize(prog.current)} / ${formatSize(prog.max)}`,
124+
status2: status2,
125+
curprog: prog.loading,
126+
totalprog: 100 * (i + count) / totalCount + prog.loading / totalCount
127+
}]
119128
})
120129
})
121130
await currentDownloadPromise
@@ -141,7 +150,7 @@ export async function batchDownload (manifest: DB): Promise<void> {
141150
}
142151
stopBatch = false
143152
list.length = 0
144-
resetBatchStatus()
153+
resetBatchStatus(port)
145154
}
146155

147156
export function batchStop (): Promise<void> {
@@ -153,13 +162,16 @@ export function batchStop (): Promise<void> {
153162
})
154163
}
155164

156-
function resetBatchStatus (): void {
157-
ipcRenderer.sendTo(mainWindowId, 'setBatchStatus', {
158-
name: '',
159-
status: '',
160-
status2: '',
161-
curprog: 0,
162-
totalprog: 0
165+
function resetBatchStatus (port: MessagePort): void {
166+
port.postMessage({
167+
type: 'setBatchStatus',
168+
payload: [{
169+
name: '',
170+
status: '',
171+
status2: '',
172+
curprog: 0,
173+
totalprog: 0
174+
}]
163175
})
164176
}
165177

0 commit comments

Comments
 (0)