From 63632e55208535302c7a14d4644a0ca18eff4f6e Mon Sep 17 00:00:00 2001 From: droak Date: Thu, 15 Aug 2024 15:58:42 +0900 Subject: [PATCH] more changes to the chat; added fn in topology obj --- examples/chat/src/handlers.ts | 6 +- examples/chat/src/index.ts | 2 +- packages/network/src/proto/messages_pb.ts | 2 +- packages/object/src/index.ts | 13 ++- packages/object/src/proto/object.proto | 11 +- packages/object/src/proto/object_pb.ts | 135 ++++++++++++++++++++-- 6 files changed, 150 insertions(+), 19 deletions(-) diff --git a/examples/chat/src/handlers.ts b/examples/chat/src/handlers.ts index e0178199..a9b26c66 100644 --- a/examples/chat/src/handlers.ts +++ b/examples/chat/src/handlers.ts @@ -1,5 +1,5 @@ import { toString as uint8ArrayToString } from "uint8arrays/to-string"; -import { Chat } from "./objects/chat"; +import { addMessage, Chat } from "./objects/chat"; export const handleChatMessages = (chat: ChatI, e: any) => { if (e.detail.msg.topic === "topology::discovery") return; @@ -18,13 +18,13 @@ export const handleChatMessages = (chat: ChatI, e: any) => { } }; -function handleObjectUpdate(chat: ChatI, fn: string) { +function handleObjectUpdate(chat: Chat, fn: string) { // In this case we only have addMessage // `addMessage(${timestamp}, ${message}, ${node.getPeerId()})` let args = fn.replace("addMessage(", "").replace(")", "").split(", "); console.log("Received message: ", args); try { - chat.addMessage(args[0], args[1], args[2]); + addMessage(chat, args[0], args[1], args[2]) } catch (e) { console.error(e); } diff --git a/examples/chat/src/index.ts b/examples/chat/src/index.ts index 3ee3635d..24b85199 100644 --- a/examples/chat/src/index.ts +++ b/examples/chat/src/index.ts @@ -2,7 +2,7 @@ import { TopologyNode } from "@topology-foundation/node"; import * as topology from "@topology-foundation/node"; import { Chat, addMessage, getMessages } from "./objects/chat"; import { handleChatMessages } from "./handlers"; -// import { GSet } from "@topology-foundation/crdt"; +import { GSet } from "@topology-foundation/crdt"; import { newTopologyObject } from "@topology-foundation/object"; const node = new TopologyNode(); diff --git a/packages/network/src/proto/messages_pb.ts b/packages/network/src/proto/messages_pb.ts index 4f331762..da36bdfc 100644 --- a/packages/network/src/proto/messages_pb.ts +++ b/packages/network/src/proto/messages_pb.ts @@ -5,7 +5,7 @@ // source: network/src/proto/messages.proto /* eslint-disable */ -import _m0 from "protobufjs/minimal.js"; +import _m0 from "protobufjs/minimal"; export const protobufPackage = "topology.network"; diff --git a/packages/object/src/index.ts b/packages/object/src/index.ts index 3addf0be..4fa5b86c 100644 --- a/packages/object/src/index.ts +++ b/packages/object/src/index.ts @@ -22,12 +22,23 @@ export async function newTopologyObject(peerId: string, path: string, id?: strin .digest("hex"), abi: abi ?? "", bytecode: bytecode ?? new Uint8Array(), + operations: [] } } +export async function callFn(obj: TopologyObject, fn: string, args: string[]): Promise { + obj.operations.push({ + nonce: Math.floor(Math.random() * Number.MAX_VALUE).toString(), + fn: fn, + args: args + }); + + return obj; +} + async function run() { // TODO: just for testing wasm compilation with tsx, should be deleted let obj = await newTopologyObject("peerId", "/Users/droak/code/topology/ts-topology/examples/chat/src/objects/chat.ts", "", ""); console.log(obj); } -run(); +// run(); diff --git a/packages/object/src/proto/object.proto b/packages/object/src/proto/object.proto index 16ffbaf0..08beca0d 100644 --- a/packages/object/src/proto/object.proto +++ b/packages/object/src/proto/object.proto @@ -2,7 +2,14 @@ syntax = "proto3"; package topology.object; message TopologyObject { + message Operation { + string nonce = 1; + optional string fn = 2; + repeated string args = 3; + }; + string id = 1; - string abi = 2; - bytes bytecode = 3; + optional string abi = 2; + optional bytes bytecode = 3; + repeated Operation operations = 4; } diff --git a/packages/object/src/proto/object_pb.ts b/packages/object/src/proto/object_pb.ts index 993d377b..e4365e88 100644 --- a/packages/object/src/proto/object_pb.ts +++ b/packages/object/src/proto/object_pb.ts @@ -11,12 +11,19 @@ export const protobufPackage = "topology.object"; export interface TopologyObject { id: string; - abi: string; - bytecode: Uint8Array; + abi?: string | undefined; + bytecode?: Uint8Array | undefined; + operations: TopologyObject_Operation[]; +} + +export interface TopologyObject_Operation { + nonce: string; + fn?: string | undefined; + args: string[]; } function createBaseTopologyObject(): TopologyObject { - return { id: "", abi: "", bytecode: new Uint8Array(0) }; + return { id: "", abi: undefined, bytecode: undefined, operations: [] }; } export const TopologyObject = { @@ -24,12 +31,15 @@ export const TopologyObject = { if (message.id !== "") { writer.uint32(10).string(message.id); } - if (message.abi !== "") { + if (message.abi !== undefined) { writer.uint32(18).string(message.abi); } - if (message.bytecode.length !== 0) { + if (message.bytecode !== undefined) { writer.uint32(26).bytes(message.bytecode); } + for (const v of message.operations) { + TopologyObject_Operation.encode(v!, writer.uint32(34).fork()).ldelim(); + } return writer; }, @@ -61,6 +71,13 @@ export const TopologyObject = { message.bytecode = reader.bytes(); continue; + case 4: + if (tag !== 34) { + break; + } + + message.operations.push(TopologyObject_Operation.decode(reader, reader.uint32())); + continue; } if ((tag & 7) === 4 || tag === 0) { break; @@ -73,8 +90,11 @@ export const TopologyObject = { fromJSON(object: any): TopologyObject { return { id: isSet(object.id) ? globalThis.String(object.id) : "", - abi: isSet(object.abi) ? globalThis.String(object.abi) : "", - bytecode: isSet(object.bytecode) ? bytesFromBase64(object.bytecode) : new Uint8Array(0), + abi: isSet(object.abi) ? globalThis.String(object.abi) : undefined, + bytecode: isSet(object.bytecode) ? bytesFromBase64(object.bytecode) : undefined, + operations: globalThis.Array.isArray(object?.operations) + ? object.operations.map((e: any) => TopologyObject_Operation.fromJSON(e)) + : [], }; }, @@ -83,12 +103,15 @@ export const TopologyObject = { if (message.id !== "") { obj.id = message.id; } - if (message.abi !== "") { + if (message.abi !== undefined) { obj.abi = message.abi; } - if (message.bytecode.length !== 0) { + if (message.bytecode !== undefined) { obj.bytecode = base64FromBytes(message.bytecode); } + if (message.operations?.length) { + obj.operations = message.operations.map((e) => TopologyObject_Operation.toJSON(e)); + } return obj; }, @@ -98,8 +121,98 @@ export const TopologyObject = { fromPartial, I>>(object: I): TopologyObject { const message = createBaseTopologyObject(); message.id = object.id ?? ""; - message.abi = object.abi ?? ""; - message.bytecode = object.bytecode ?? new Uint8Array(0); + message.abi = object.abi ?? undefined; + message.bytecode = object.bytecode ?? undefined; + message.operations = object.operations?.map((e) => TopologyObject_Operation.fromPartial(e)) || []; + return message; + }, +}; + +function createBaseTopologyObject_Operation(): TopologyObject_Operation { + return { nonce: "", fn: undefined, args: [] }; +} + +export const TopologyObject_Operation = { + encode(message: TopologyObject_Operation, writer: _m0.Writer = _m0.Writer.create()): _m0.Writer { + if (message.nonce !== "") { + writer.uint32(10).string(message.nonce); + } + if (message.fn !== undefined) { + writer.uint32(18).string(message.fn); + } + for (const v of message.args) { + writer.uint32(26).string(v!); + } + return writer; + }, + + decode(input: _m0.Reader | Uint8Array, length?: number): TopologyObject_Operation { + const reader = input instanceof _m0.Reader ? input : _m0.Reader.create(input); + let end = length === undefined ? reader.len : reader.pos + length; + const message = createBaseTopologyObject_Operation(); + while (reader.pos < end) { + const tag = reader.uint32(); + switch (tag >>> 3) { + case 1: + if (tag !== 10) { + break; + } + + message.nonce = reader.string(); + continue; + case 2: + if (tag !== 18) { + break; + } + + message.fn = reader.string(); + continue; + case 3: + if (tag !== 26) { + break; + } + + message.args.push(reader.string()); + continue; + } + if ((tag & 7) === 4 || tag === 0) { + break; + } + reader.skipType(tag & 7); + } + return message; + }, + + fromJSON(object: any): TopologyObject_Operation { + return { + nonce: isSet(object.nonce) ? globalThis.String(object.nonce) : "", + fn: isSet(object.fn) ? globalThis.String(object.fn) : undefined, + args: globalThis.Array.isArray(object?.args) ? object.args.map((e: any) => globalThis.String(e)) : [], + }; + }, + + toJSON(message: TopologyObject_Operation): unknown { + const obj: any = {}; + if (message.nonce !== "") { + obj.nonce = message.nonce; + } + if (message.fn !== undefined) { + obj.fn = message.fn; + } + if (message.args?.length) { + obj.args = message.args; + } + return obj; + }, + + create, I>>(base?: I): TopologyObject_Operation { + return TopologyObject_Operation.fromPartial(base ?? ({} as any)); + }, + fromPartial, I>>(object: I): TopologyObject_Operation { + const message = createBaseTopologyObject_Operation(); + message.nonce = object.nonce ?? ""; + message.fn = object.fn ?? undefined; + message.args = object.args?.map((e) => e) || []; return message; }, };