diff --git a/electron/main.js b/electron/main.js index 733b260..94b9210 100644 --- a/electron/main.js +++ b/electron/main.js @@ -2,9 +2,13 @@ const { app, BrowserWindow, dialog, ipcMain, shell } = require('electron'); const path = require('path'); const url = require('url'); const { initialStorageEvents, storage } = require('./storage'); +const { initialWebsocketEvents } = require('./socket'); +const { Subject } = require('./tool'); let mainWindow; +const socketMsgSubject = new Subject(); + function createWindow() { //创建窗口 mainWindow = new BrowserWindow({ @@ -44,12 +48,18 @@ function createWindow() { }), ); } - // 加载初始localStorage数据 + const onMessageReceive = (message) => { + mainWindow.webContents.send('socket:on-message', message); + }; + mainWindow.webContents.on('did-finish-load', () => { + // 加载初始localStorage数据 mainWindow.webContents.send('initialStorageData', storage.getAllItem()); + socketMsgSubject.add(onMessageReceive); }); mainWindow.on('closed', () => { mainWindow = null; + socketMsgSubject.remove(onMessageReceive); }); } @@ -106,3 +116,7 @@ app.on('window-all-closed', () => { app.quit(); } }); + +initialWebsocketEvents(function onMessage(message) { + socketMsgSubject.notify(message); +}); diff --git a/electron/socket.js b/electron/socket.js new file mode 100644 index 0000000..b7d9fae --- /dev/null +++ b/electron/socket.js @@ -0,0 +1,23 @@ +const io = require('ws'); + +function initialWebsocket(onMessage) { + const socket = new io('ws://127.0.0.1:7888/websocket/subscriptionTaskSync'); + + socket.on('open', (socket) => { + // socket.emit("hello", "world"); + console.log('socket connection'); + socket.on('message', onMessage); + }); + socket.on('error', (...args) => { + // socket.emit("hello", "world"); + console.log('socket error:', args); + }); +} + +module.exports.initialWebsocketEvents = function initialWebsocketEvents( + onMessage, + onError, +) { + initialWebsocket(); + // ipcMain.handle('socket:on', ) +}; diff --git a/electron/tool.js b/electron/tool.js new file mode 100644 index 0000000..0f02007 --- /dev/null +++ b/electron/tool.js @@ -0,0 +1,14 @@ +export class Subject { + constructor() { + this.observers = []; + } + add(observer) { + this.observers.push(observer); + } + remove(observer) { + this.observers = this.observers.filter((iO) => iO !== observer); + } + notify(...args) { + this.observers.forEach((f) => f(...args)); + } +} diff --git a/package.json b/package.json index bf1c4fe..c0374ed 100644 --- a/package.json +++ b/package.json @@ -39,7 +39,8 @@ "electron-packager": "^15.2.0", "electron-store": "^8.0.0", "lodash": "^4.17.21", - "umi": "^3.4.25" + "umi": "^3.4.25", + "ws": "^7.5.2" }, "devDependencies": { "@types/ali-oss": "^6.0.8", diff --git a/src/services/socket.ts b/src/services/socket.ts new file mode 100644 index 0000000..fe6f22a --- /dev/null +++ b/src/services/socket.ts @@ -0,0 +1,11 @@ +export const isClient = !!window.ipcRenderer; // process.env.IS_CLIENT; + +const safeCall = (f: (...args: any[]) => any) => (isClient ? f : () => {}); + +const ipcRenderer = window.ipcRenderer; + +if (isClient) { + window.addIpcRendererListener('socket:on-message', (_, message) => { + console.log('receive electron socket message:', message); + }); +}