fix(service-party-app): 延迟加载 proto 定义避免启动时崩溃
将 proto 文件加载改为延迟加载模式,在 connect() 时才加载, 避免模块加载时 app.isPackaged 还未准备好导致的路径错误。 🤖 Generated with [Claude Code](https://claude.com/claude-code) Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
This commit is contained in:
parent
4794cafdaa
commit
e78b6e6dcb
|
|
@ -4,18 +4,6 @@ import * as path from 'path';
|
||||||
import { EventEmitter } from 'events';
|
import { EventEmitter } from 'events';
|
||||||
import { app } from 'electron';
|
import { app } from 'electron';
|
||||||
|
|
||||||
// Proto 文件路径 - 在打包后需要从 app.asar.unpacked 或 resources 目录加载
|
|
||||||
function getProtoPath(): string {
|
|
||||||
// 开发环境
|
|
||||||
if (!app.isPackaged) {
|
|
||||||
return path.join(__dirname, '../../proto/message_router.proto');
|
|
||||||
}
|
|
||||||
// 生产环境 - proto 文件需要解包
|
|
||||||
return path.join(process.resourcesPath, 'proto/message_router.proto');
|
|
||||||
}
|
|
||||||
|
|
||||||
const PROTO_PATH = getProtoPath();
|
|
||||||
|
|
||||||
// 定义 proto 包结构类型
|
// 定义 proto 包结构类型
|
||||||
interface ProtoPackage {
|
interface ProtoPackage {
|
||||||
mpc?: {
|
mpc?: {
|
||||||
|
|
@ -27,14 +15,34 @@ interface ProtoPackage {
|
||||||
};
|
};
|
||||||
}
|
}
|
||||||
|
|
||||||
// 加载 Proto 定义
|
// 延迟加载的 Proto 定义
|
||||||
const packageDefinition = protoLoader.loadSync(PROTO_PATH, {
|
let packageDefinition: protoLoader.PackageDefinition | null = null;
|
||||||
keepCase: true,
|
|
||||||
longs: String,
|
// Proto 文件路径 - 在打包后需要从 app.asar.unpacked 或 resources 目录加载
|
||||||
enums: String,
|
function getProtoPath(): string {
|
||||||
defaults: true,
|
// 开发环境
|
||||||
oneofs: true,
|
if (!app.isPackaged) {
|
||||||
});
|
return path.join(__dirname, '../../proto/message_router.proto');
|
||||||
|
}
|
||||||
|
// 生产环境 - proto 文件需要解包
|
||||||
|
return path.join(process.resourcesPath, 'proto/message_router.proto');
|
||||||
|
}
|
||||||
|
|
||||||
|
// 延迟加载 Proto 定义
|
||||||
|
function loadProtoDefinition(): protoLoader.PackageDefinition {
|
||||||
|
if (!packageDefinition) {
|
||||||
|
const protoPath = getProtoPath();
|
||||||
|
console.log('Loading proto from:', protoPath);
|
||||||
|
packageDefinition = protoLoader.loadSync(protoPath, {
|
||||||
|
keepCase: true,
|
||||||
|
longs: String,
|
||||||
|
enums: String,
|
||||||
|
defaults: true,
|
||||||
|
oneofs: true,
|
||||||
|
});
|
||||||
|
}
|
||||||
|
return packageDefinition;
|
||||||
|
}
|
||||||
|
|
||||||
interface SessionInfo {
|
interface SessionInfo {
|
||||||
sessionId: string;
|
sessionId: string;
|
||||||
|
|
@ -116,7 +124,8 @@ export class GrpcClient extends EventEmitter {
|
||||||
*/
|
*/
|
||||||
async connect(address: string, useTLS?: boolean): Promise<void> {
|
async connect(address: string, useTLS?: boolean): Promise<void> {
|
||||||
return new Promise((resolve, reject) => {
|
return new Promise((resolve, reject) => {
|
||||||
const proto = grpc.loadPackageDefinition(packageDefinition) as ProtoPackage;
|
const definition = loadProtoDefinition();
|
||||||
|
const proto = grpc.loadPackageDefinition(definition) as ProtoPackage;
|
||||||
const MessageRouter = proto.mpc?.router?.v1?.MessageRouter;
|
const MessageRouter = proto.mpc?.router?.v1?.MessageRouter;
|
||||||
|
|
||||||
if (!MessageRouter) {
|
if (!MessageRouter) {
|
||||||
|
|
|
||||||
Loading…
Reference in New Issue