This commit is contained in:
Egor Aristov 2025-12-06 13:09:34 +03:00
parent d7feddec4e
commit 6e7565284e
Signed by: egor3f
GPG Key ID: 40482A264AAEC85F
2 changed files with 22 additions and 6 deletions

View File

@ -287,6 +287,7 @@ func (ipc *ipcCommon) ConvType(needType reflect.Type, gotType reflect.Type, arg
switch needType.Elem().Kind() { switch needType.Elem().Kind() {
case reflect.Uint8: case reflect.Uint8:
if gotType.Kind() == reflect.String { if gotType.Kind() == reflect.String {
// need []byte, got (base64) string
var err error var err error
arg, err = base64.StdEncoding.DecodeString(arg.(string)) arg, err = base64.StdEncoding.DecodeString(arg.(string))
if err != nil { if err != nil {

View File

@ -142,11 +142,11 @@ abstract class IPCCommon {
try { try {
this.processingCalls++; this.processingCalls++;
let result = method.apply(endpoint, msg.args.map(arg => this.convType(arg))); let result = method.apply(endpoint, msg.args.map(this.deserialize));
if (result instanceof Promise) { if (result instanceof Promise) {
result = await result; result = await result;
} }
result = this.convType(result); result = this.serialize(result);
this.sendMsg({type: MsgType.Response, id: msg.id, result: [result]}); this.sendMsg({type: MsgType.Response, id: msg.id, result: [result]});
} catch (err) { } catch (err) {
this.sendMsg({type: MsgType.Response, id: msg.id, error: `${ err }`}); this.sendMsg({type: MsgType.Response, id: msg.id, error: `${ err }`});
@ -184,7 +184,7 @@ abstract class IPCCommon {
} }
}; };
try { try {
this.sendMsg({type: MsgType.Call, id, method, args: args.map(arg => this.convType(arg))}); this.sendMsg({type: MsgType.Call, id, method, args: args.map(this.serialize)});
} catch (e) { } catch (e) {
delete this.pendingCalls[id]; delete this.pendingCalls[id];
reject(new Error(`send call: ${ e }`)); reject(new Error(`send call: ${ e }`));
@ -192,7 +192,7 @@ abstract class IPCCommon {
}); });
} }
public convType(arg: any): any { public serialize(arg: any): any {
// noinspection FallThroughInSwitchStatementJS // noinspection FallThroughInSwitchStatementJS
switch (typeof arg) { switch (typeof arg) {
case 'string': case 'string':
@ -202,7 +202,22 @@ abstract class IPCCommon {
case 'object': case 'object':
if(arg instanceof Buffer) { if(arg instanceof Buffer) {
return arg.toString('base64'); return arg.toString('base64');
} else {
throw new Error(`cannot serialize ${arg}`);
} }
default:
throw new Error(`cannot serialize ${typeof arg}`);
}
}
public deserialize(arg: any): any {
// noinspection FallThroughInSwitchStatementJS
switch (typeof arg) {
case 'string':
case 'boolean':
case 'number':
return arg;
case 'object':
const keys = Object.entries(arg).map(p => p[0]).sort(); const keys = Object.entries(arg).map(p => p[0]).sort();
if(keys[0] === 'd' && keys[1] === 't') { if(keys[0] === 'd' && keys[1] === 't') {
const type = arg['t']; const type = arg['t'];
@ -214,10 +229,10 @@ abstract class IPCCommon {
throw new Error(`custom object type ${type} is not supported`); throw new Error(`custom object type ${type} is not supported`);
} }
} else { } else {
throw new Error(`got unknown arg type: object with keys ${keys}`); throw new Error(`cannot deserialize object with keys ${keys}`);
} }
default: default:
throw new Error(`arg type ${typeof arg} is not supported`); throw new Error(`cannot deserialize ${typeof arg}`);
} }
} }