@cloudpss/ubrpc
Version:
Rpc server/client build on websocket and ubjson.
71 lines • 2.14 kB
JavaScript
import { decode } from '@cloudpss/ubjson';
/** 反序列化 */
export function decodePayload(data) {
if (!data || typeof data == 'string')
return undefined;
try {
const payload = decode(data);
if (!payload || typeof payload != 'object')
return undefined;
if (typeof payload.type !== 'string')
return undefined;
if (typeof payload.seq !== 'number')
return undefined;
return payload;
}
catch (ex) {
return undefined;
}
}
const serializing = Symbol('serializing error');
/** 序列化错误信息 */
export function serializeError(error) {
if (error == null)
return {
name: 'Error',
message: '',
};
if (typeof error != 'object')
return {
name: 'Error',
message: String(error),
};
try {
const reenter = !!error[serializing];
error[serializing] = true;
const { message, stack, name, errors, ...rest } = error;
return {
...rest,
name: String(name ?? 'Error'),
message: String(message ?? ''),
stack: stack,
errors: reenter ? undefined : Array.isArray(errors) ? errors.map((e) => serializeError(e)) : errors,
};
}
finally {
delete error[serializing];
}
}
/** 反序列化错误信息 */
export function deserializeError(error) {
if (error == null || typeof error != 'object')
return new Error(error ?? '');
const { message, stack, name, errors, ...rest } = error;
let ex;
if (Array.isArray(errors)) {
ex = new AggregateError(errors.map((e) => deserializeError(e)), message);
}
else {
ex = new Error(message);
}
if (name !== ex?.name)
Object.defineProperty(ex, 'name', { value: String(name), configurable: true, writable: true });
Object.defineProperty(ex, 'stack', {
value: stack ? String(stack) : undefined,
configurable: true,
writable: true,
});
Object.assign(ex, rest);
return ex;
}
//# sourceMappingURL=serialize.js.map