energy/cef/ipc.go

192 lines
6.2 KiB
Go
Raw Normal View History

2023-03-13 17:30:13 +08:00
//----------------------------------------
//
// Copyright © yanghy. All Rights Reserved.
//
// Licensed under Apache License Version 2.0, January 2004
//
// https://www.apache.org/licenses/LICENSE-2.0
//
//----------------------------------------
2023-05-31 17:41:14 +08:00
// IPC
2023-03-13 17:30:13 +08:00
package cef
import (
2023-05-31 18:00:34 +08:00
"github.com/energye/energy/v2/cef/internal/ipc"
"github.com/energye/energy/v2/cef/process"
2023-03-13 17:30:13 +08:00
"sync"
"time"
2023-03-13 17:30:13 +08:00
)
2023-03-22 11:46:21 +08:00
// ipc bind event name
2023-03-13 17:30:13 +08:00
const (
2023-03-22 13:22:31 +08:00
internalIPC = "ipc" // JavaScript -> ipc 事件驱动, 根对象名
internalIPCEmit = "emit" // JavaScript -> ipc.emit 在 JavaScript 触发 GO 监听事件函数名, 异步
internalIPCEmitSync = "emitSync" // JavaScript -> ipc.emitSync 在 JavaScript 触发 GO 监听事件函数名, 同步
internalIPCOn = "on" // JavaScript -> ipc.on 在 JavaScript 监听事件, 提供给 GO 调用
2023-03-13 17:30:13 +08:00
)
2023-03-22 11:46:21 +08:00
// ipc message name
2023-03-13 17:30:13 +08:00
const (
2023-03-22 11:46:21 +08:00
internalIPCJSExecuteGoEvent = "JSEmitGo" // JS 触发 GO事件异步
internalIPCJSExecuteGoEventReplay = "JSEmitGoReplay" // JS 触发 GO事件异步 - 返回结果
internalIPCJSExecuteGoSyncEvent = "JSEmitSyncGo" // JS 触发 GO事件同步
internalIPCJSExecuteGoSyncEventReplay = "JSEmitSyncGoReplay" // JS 触发 GO事件同步 - 返回结果
internalIPCGoExecuteJSEvent = "GoEmitJS" // GO 触发 JS事件
internalIPCGoExecuteJSEventReplay = "GoEmitJSReplay" // GO 触发 JS事件 - 返回结果
2023-03-13 17:30:13 +08:00
)
2023-03-23 10:42:02 +08:00
// js execute go 返回类型
type result_type int8
const (
rt_function result_type = iota //回调函数
rt_variable //变量接收
)
2023-03-13 17:30:13 +08:00
var (
internalObjectRootName = "energy" // GO 和 V8Value 绑定根对象名
2023-03-20 10:09:54 +08:00
ipcRender *ipcRenderProcess // 渲染进程 IPC
ipcBrowser *ipcBrowserProcess // 主进程 IPC
2023-03-13 17:30:13 +08:00
)
2023-03-23 16:03:20 +08:00
// ipcEmitHandler ipc.emit 处理器
2023-03-13 17:30:13 +08:00
type ipcEmitHandler struct {
handler *ICefV8Handler // ipc.emit handler
2023-03-22 11:54:15 +08:00
handlerSync *ICefV8Handler // ipc.emitSync handler
2023-03-13 17:30:13 +08:00
callbackList map[int32]*ipcCallback // ipc.emit callbackList *list.List
callbackMessageId int32 // ipc.emit messageId
callbackLock sync.Mutex // ipc.emit lock
}
2023-03-23 16:03:20 +08:00
// ipcOnHandler ipc.on 处理器
2023-03-13 17:30:13 +08:00
type ipcOnHandler struct {
2023-03-23 16:03:20 +08:00
handler *ICefV8Handler // ipc.on handler
callbackList map[string]*ipcCallback // ipc.on callbackList
callbackLock sync.Mutex // ipc.emit lock
2023-03-13 17:30:13 +08:00
}
2023-03-23 16:03:20 +08:00
// ipcCallback ipc.emit 回调结果
2023-03-13 17:30:13 +08:00
type ipcCallback struct {
2023-03-23 18:13:23 +08:00
isSync bool //同否同步 true:同步 false:异步, 默认false
resultType result_type //返回值类型 0:function 1:variable 默认:0
variable *ICefV8Value //回调函数, 根据 resultType
function *ICefV8Value //回调函数, 根据 resultType
2023-03-13 17:30:13 +08:00
}
2023-03-23 16:03:20 +08:00
// isIPCInternalKey IPC 内部定义使用 key 不允许使用
2023-03-22 11:46:21 +08:00
func isIPCInternalKey(key string) bool {
2023-03-22 13:22:31 +08:00
return key == internalIPC || key == internalIPCEmit || key == internalIPCOn || key == internalIPCEmitSync ||
2023-03-22 11:46:21 +08:00
key == internalIPCJSExecuteGoEvent || key == internalIPCJSExecuteGoEventReplay ||
2023-03-22 11:54:15 +08:00
key == internalIPCGoExecuteJSEvent || key == internalIPCGoExecuteJSEventReplay ||
key == internalIPCJSExecuteGoSyncEvent || key == internalIPCJSExecuteGoSyncEventReplay
2023-03-22 11:46:21 +08:00
}
2023-03-13 17:43:22 +08:00
// ipcInit 初始化
func ipcInit() {
2023-03-13 17:54:22 +08:00
isSingleProcess := application.SingleProcess()
if isSingleProcess {
2023-03-24 15:20:26 +08:00
ipcBrowser = &ipcBrowserProcess{}
2023-03-13 17:43:22 +08:00
ipcRender = &ipcRenderProcess{
2023-05-31 17:41:14 +08:00
syncChan: &ipc.SyncChan{},
2023-03-13 22:40:20 +08:00
emitHandler: &ipcEmitHandler{callbackList: make(map[int32]*ipcCallback)},
onHandler: &ipcOnHandler{callbackList: make(map[string]*ipcCallback)},
2023-03-13 17:43:22 +08:00
}
ipc.CreateBrowserIPC() // Go IPC browser
ipc.CreateRenderIPC(0, time.Now().UnixMicro()) // Go IPC render
2023-03-13 17:43:22 +08:00
} else {
2023-05-31 17:41:14 +08:00
if process.Args.IsMain() {
2023-03-13 17:43:22 +08:00
ipcBrowser = &ipcBrowserProcess{}
ipc.CreateBrowserIPC() // Go IPC browser
2023-05-31 17:41:14 +08:00
} else if process.Args.IsRender() {
2023-03-13 17:43:22 +08:00
ipcRender = &ipcRenderProcess{
2023-05-31 17:41:14 +08:00
syncChan: &ipc.SyncChan{},
2023-03-13 22:40:20 +08:00
emitHandler: &ipcEmitHandler{callbackList: make(map[int32]*ipcCallback)},
onHandler: &ipcOnHandler{callbackList: make(map[string]*ipcCallback)},
2023-03-13 17:43:22 +08:00
}
ipc.CreateRenderIPC(0, time.Now().UnixMicro()) // Go IPC render
2023-03-13 17:43:22 +08:00
}
2023-03-13 17:30:13 +08:00
}
}
// addCallback
func (m *ipcEmitHandler) addCallback(callback *ipcCallback) int32 {
//return uintptr(unsafe.Pointer(m.callbackList.PushBack(callback)))
m.callbackLock.Lock()
defer m.callbackLock.Unlock()
2023-03-23 09:16:27 +08:00
m.callbackList[m.nextMessageId()] = callback
return m.callbackMessageId
}
2023-03-23 16:03:20 +08:00
// nextMessageId 获取下一个消息ID
2023-03-23 09:16:27 +08:00
func (m *ipcEmitHandler) nextMessageId() int32 {
m.callbackMessageId++
2023-03-13 17:30:13 +08:00
if m.callbackMessageId == -1 {
m.callbackMessageId = 1
}
return m.callbackMessageId
}
2023-03-23 16:03:20 +08:00
// getCallback 返回回调函数
2023-03-13 17:30:13 +08:00
func (m *ipcEmitHandler) getCallback(messageId int32) *ipcCallback {
//return (*list.Element)(unsafe.Pointer(ptr)).Value.(*ipcCallback)
m.callbackLock.Lock()
defer m.callbackLock.Unlock()
2023-03-15 14:29:45 +08:00
if callback, ok := m.callbackList[messageId]; ok {
delete(m.callbackList, messageId)
return callback
}
return nil
2023-03-13 17:30:13 +08:00
}
2023-03-23 16:03:20 +08:00
//clear 清空所有回调函数
2023-03-13 22:40:20 +08:00
func (m *ipcEmitHandler) clear() {
for _, v := range m.callbackList {
v.free()
}
2023-03-23 16:03:20 +08:00
m.callbackMessageId = 0
2023-03-13 22:40:20 +08:00
m.callbackList = make(map[int32]*ipcCallback)
}
2023-03-23 16:03:20 +08:00
// addCallback 根据事件名添加回调函数
func (m *ipcOnHandler) addCallback(eventName string, callback *ipcCallback) {
2023-03-13 17:30:13 +08:00
//return uintptr(unsafe.Pointer(m.callbackList.PushBack(callback)))
m.callbackLock.Lock()
defer m.callbackLock.Unlock()
m.callbackList[eventName] = callback
}
2023-03-23 16:03:20 +08:00
// removeCallback 根据事件名移除回调函数
2023-03-13 17:30:13 +08:00
func (m *ipcOnHandler) removeCallback(eventName string) {
//m.callbackList.Remove((*list.Element)(unsafe.Pointer(ptr)))
m.callbackLock.Lock()
defer m.callbackLock.Unlock()
delete(m.callbackList, eventName)
}
2023-03-23 16:03:20 +08:00
// getCallback 根据事件名返回回调函数
2023-03-13 17:30:13 +08:00
func (m *ipcOnHandler) getCallback(eventName string) *ipcCallback {
//return (*list.Element)(unsafe.Pointer(ptr)).Value.(*ipcCallback)
m.callbackLock.Lock()
defer m.callbackLock.Unlock()
return m.callbackList[eventName]
}
2023-03-23 16:03:20 +08:00
//clear 清空所有回调函数
2023-03-13 22:40:20 +08:00
func (m *ipcOnHandler) clear() {
for _, v := range m.callbackList {
v.free()
}
m.callbackList = make(map[string]*ipcCallback)
}
2023-03-23 16:03:20 +08:00
//free 清空所有回调函数
2023-03-13 17:30:13 +08:00
func (m *ipcCallback) free() {
if m.function != nil {
m.function.Free()
m.function = nil
}
}