From 65de27bb3e1018b6df39440111b41a6aa5066c1b Mon Sep 17 00:00:00 2001 From: hoangquocvietuet Date: Wed, 12 Feb 2025 13:41:57 +0700 Subject: [PATCH] add msgpack dependency --- packages/node/package.json | 7 +- packages/node/src/utils.ts | 7 +- packages/object/src/index.ts | 1 - packages/object/src/utils/serializer.ts | 141 ------------------------ packages/object/tests/utils.test.ts | 10 -- pnpm-lock.yaml | 9 ++ 6 files changed, 17 insertions(+), 158 deletions(-) delete mode 100644 packages/object/src/utils/serializer.ts delete mode 100644 packages/object/tests/utils.test.ts diff --git a/packages/node/package.json b/packages/node/package.json index 6b8e993a7..9553fed29 100644 --- a/packages/node/package.json +++ b/packages/node/package.json @@ -32,9 +32,9 @@ "devDependencies": { "@bufbuild/protobuf": "^2.0.0", "@types/node": "^22.5.4", + "race-event": "^1.3.0", "tsx": "4.19.1", "typescript": "^5.5.4", - "race-event": "^1.3.0", "vitest": "^3.0.5" }, "dependencies": { @@ -46,12 +46,13 @@ "@grpc/reflection": "^1.0.4", "@libp2p/crypto": "^5.0.5", "@libp2p/interface": "^2.1.3", - "dotenv": "^16.4.5", + "@msgpack/msgpack": "^3.0.1", "@ts-drp/blueprints": "0.7.0", + "@ts-drp/logger": "0.7.0", "@ts-drp/network": "0.7.0", "@ts-drp/object": "0.7.0", - "@ts-drp/logger": "0.7.0", "commander": "^13.0.0", + "dotenv": "^16.4.5", "uint8arrays": "^5.1.0" } } diff --git a/packages/node/src/utils.ts b/packages/node/src/utils.ts index 2144d63dc..cf032ec98 100644 --- a/packages/node/src/utils.ts +++ b/packages/node/src/utils.ts @@ -1,11 +1,12 @@ -import { ObjectPb, deserializeValue, serializeValue } from "@ts-drp/object"; +import { encode, decode } from "@msgpack/msgpack"; +import { ObjectPb } from "@ts-drp/object"; export function serializeStateMessage(state?: ObjectPb.DRPState): ObjectPb.DRPState { const drpState = ObjectPb.DRPState.create(); for (const e of state?.state ?? []) { const entry = ObjectPb.DRPStateEntry.create({ key: e.key, - value: serializeValue(e.value), + value: encode(e.value), }); drpState.state.push(entry); } @@ -17,7 +18,7 @@ export function deserializeStateMessage(state?: ObjectPb.DRPState): ObjectPb.DRP for (const e of state?.state ?? []) { const entry = ObjectPb.DRPStateEntry.create({ key: e.key, - value: deserializeValue(e.value), + value: decode(e.value), }); drpState.state.push(entry); } diff --git a/packages/object/src/index.ts b/packages/object/src/index.ts index 6cc0ee5ba..5702a57be 100644 --- a/packages/object/src/index.ts +++ b/packages/object/src/index.ts @@ -24,7 +24,6 @@ import * as ObjectPb from "./proto/drp/object/v1/object_pb.js"; import { ObjectSet } from "./utils/objectSet.js"; export * as ObjectPb from "./proto/drp/object/v1/object_pb.js"; -export * from "./utils/serializer.js"; export * from "./acl/index.js"; export * from "./hashgraph/index.js"; export * from "./acl/interface.js"; diff --git a/packages/object/src/utils/serializer.ts b/packages/object/src/utils/serializer.ts deleted file mode 100644 index 0fe5927dc..000000000 --- a/packages/object/src/utils/serializer.ts +++ /dev/null @@ -1,141 +0,0 @@ -import { Value } from "../proto/google/protobuf/struct_pb.js"; - -export function serializeValue(obj: any): Uint8Array { - const serialized = _serializeToJSON(obj); - return Value.encode(Value.wrap(serialized)).finish(); -} - -export function deserializeValue(value: any): any { - const bytes = new Uint8Array(_objectValues(value)); - const v = Value.decode(bytes); - const unwrapped = Value.unwrap(v); - return _deserializeFromJSON(unwrapped); -} - -function _objectValues(obj: any): any[] { - const tmp: any[] = []; - for (const key in obj) { - tmp.push(obj[key]); - } - return tmp; -} - -function _serializeToJSON(obj: any): any { - // Handle null/undefined - if (obj == null) return null; - - // Handle primitive types - if (typeof obj !== "object") return obj; - - // Handle Date objects - if (obj instanceof Date) { - return { - __type: "Date", - value: obj.toISOString(), - }; - } - - // Handle Maps - if (obj instanceof Map) { - return { - __type: "Map", - value: Array.from(obj.entries()), - }; - } - - // Handle Sets - if (obj instanceof Set) { - return { - __type: "Set", - value: Array.from(obj.values()), - }; - } - - // Handle regular arrays - if (Array.isArray(obj)) { - return obj.map((item) => _serializeToJSON(item)); - } - - // Handle regular objects - const result: any = {}; - for (const [key, value] of Object.entries(obj)) { - // Skip non-enumerable properties and functions - if (typeof value === "function") continue; - - // Handle circular references - try { - result[key] = _serializeToJSON(value); - } catch (e) { - console.warn(`Circular reference detected for key: ${key}`); - result[key] = null; - } - } - - // Add class name if available - if (obj.constructor && obj.constructor.name !== "Object") { - result.__type = obj.constructor.name; - } - - return result; -} - -function _deserializeFromJSON(obj: any): any { - // Handle null/undefined - if (obj == null) return obj; - - // Handle primitive types - if (typeof obj !== "object") return obj; - - // Handle arrays - if (Array.isArray(obj)) { - return obj.map((item) => _deserializeFromJSON(item)); - } - - // Handle special types - if (obj.__type) { - switch (obj.__type) { - case "Date": - return new Date(obj.value); - - case "Map": - return new Map( - obj.value.map(([k, v]: [any, any]) => [_deserializeFromJSON(k), _deserializeFromJSON(v)]) - ); - - case "Set": - return new Set(obj.value.map((v: any) => _deserializeFromJSON(v))); - - case "Uint8Array": - return new Uint8Array(obj.value); - - case "Float32Array": - return new Float32Array(obj.value); - - // Add other TypedArrays as needed - - default: - // Try to reconstruct custom class if available - try { - const CustomClass = globalThis[obj.__type as keyof typeof globalThis]; - if (typeof CustomClass === "function") { - return Object.assign( - new CustomClass(), - _deserializeFromJSON({ ...obj, __type: undefined }) - ); - } - } catch (e) { - console.warn(`Could not reconstruct class ${obj.__type}`); - } - } - } - - // Handle regular objects - const result: any = {}; - for (const [key, value] of Object.entries(obj)) { - if (key !== "__type") { - result[key] = _deserializeFromJSON(value); - } - } - - return result; -} diff --git a/packages/object/tests/utils.test.ts b/packages/object/tests/utils.test.ts deleted file mode 100644 index 3d7d6806e..000000000 --- a/packages/object/tests/utils.test.ts +++ /dev/null @@ -1,10 +0,0 @@ -import { expect, test } from "vitest"; - -import { deserializeValue, serializeValue } from "../src/index.js"; - -test("Serialize & deserialize correctly", () => { - const obj = { a: 1, b: 2 }; - const serialized = serializeValue(obj); - const deserialized = deserializeValue(serialized); - expect(deserialized).toEqual(obj); -}); diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 59475cb34..9899090c5 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -290,6 +290,9 @@ importers: '@libp2p/interface': specifier: ^2.1.3 version: 2.4.1 + '@msgpack/msgpack': + specifier: ^3.0.1 + version: 3.0.1 '@ts-drp/blueprints': specifier: 0.7.0 version: link:../blueprints @@ -1644,6 +1647,10 @@ packages: '@libp2p/webtransport@5.0.24': resolution: {integrity: sha512-JSIa3bPwm5UGLxI8Bd77pnfcVVLvQ6luZNVZUjY0tRDOOi157OxxSWd3WA3yh3P7CKJPkxg58EVWQjILjZQ6Rg==} + '@msgpack/msgpack@3.0.1': + resolution: {integrity: sha512-9qysoVTITLcOFIIJeXbdtUgvvY25ojUp+WWfLc0O4H4KKWeamUNAqkjS5mej/PnVDnH70llWKNa7pzv5U4TqVQ==} + engines: {node: '>= 18'} + '@multiformats/dns@1.0.6': resolution: {integrity: sha512-nt/5UqjMPtyvkG9BQYdJ4GfLK3nMqGpFZOzf4hAmIa0sJh2LlS9YKXZ4FgwBDsaHvzZqR/rUFIywIc7pkHNNuw==} @@ -7544,6 +7551,8 @@ snapshots: uint8arraylist: 2.4.8 uint8arrays: 5.1.0 + '@msgpack/msgpack@3.0.1': {} + '@multiformats/dns@1.0.6': dependencies: '@types/dns-packet': 5.6.5