From d2e817c25f70f4017c97822b1efdb478d32e6556 Mon Sep 17 00:00:00 2001 From: despiegk Date: Sun, 14 Sep 2025 14:27:26 +0200 Subject: [PATCH] ... --- examples/hero/herorpc/herorpc_example.vsh | 28 +++--- lib/hero/heromodels copy/ai_openrpcprompt.md | 27 ------ lib/hero/heromodels copy/examples/.gitignore | 4 - .../examples/client_example.vsh | 85 ------------------- .../heromodels copy/examples/example1.vsh | 37 -------- .../examples/server_example.vsh | 23 ----- lib/hero/heromodels copy/openrpc_interface.v | 47 ---------- lib/hero/heromodels/readme.md | 30 +++++-- lib/hero/heromodels/rpc/factory.v | 7 +- lib/schemas/openrpc/controller_http.v | 28 +++--- 10 files changed, 56 insertions(+), 260 deletions(-) delete mode 100644 lib/hero/heromodels copy/ai_openrpcprompt.md delete mode 100644 lib/hero/heromodels copy/examples/.gitignore delete mode 100755 lib/hero/heromodels copy/examples/client_example.vsh delete mode 100755 lib/hero/heromodels copy/examples/example1.vsh delete mode 100755 lib/hero/heromodels copy/examples/server_example.vsh delete mode 100644 lib/hero/heromodels copy/openrpc_interface.v diff --git a/examples/hero/herorpc/herorpc_example.vsh b/examples/hero/herorpc/herorpc_example.vsh index 54352e04..8a6eb607 100755 --- a/examples/hero/herorpc/herorpc_example.vsh +++ b/examples/hero/herorpc/herorpc_example.vsh @@ -2,21 +2,25 @@ import freeflowuniverse.herolib.hero.heromodels.rpc -println(' -#to test the discover function: -echo \'\{"jsonrpc":"2.0","method":"rpc.discover","params":[],"id":1\}\' \\ - | nc -U /tmp/heromodels -\' -#to test interactively: +mut http_port := 9933 -nc -U /tmp/heromodels +if http_port == 0 { + println(' + #to test the discover function: + echo \'\{"jsonrpc":"2.0","method":"rpc.discover","params":[],"id":1\}\' \\ + | nc -U /tmp/heromodels + \' + #to test interactively: -then e.g. do + nc -U /tmp/heromodels -\{"jsonrpc":"2.0","method":"comment_set","params":{"comment":"Hello world!","parent":0,"author":42},"id":1\} + then e.g. do -needs to be on one line for openrpc to work + \{"jsonrpc":"2.0","method":"comment_set","params":{"comment":"Hello world!","parent":0,"author":42},"id":1\} -') + needs to be on one line for openrpc to work -rpc.start()! + ') +} + +rpc.start(http_port: http_port)! diff --git a/lib/hero/heromodels copy/ai_openrpcprompt.md b/lib/hero/heromodels copy/ai_openrpcprompt.md deleted file mode 100644 index 49d2bcc2..00000000 --- a/lib/hero/heromodels copy/ai_openrpcprompt.md +++ /dev/null @@ -1,27 +0,0 @@ -lets make an openrpc server -over unixsocker - -on /tmp/heromodels - -put code in lib/hero/heromodels/openrpc - -do example for comment.v - -make struct called RPCServer - -put as methods - -- comment_get(args CommentGetArgs)[]Comment! //chose the params well is @[params] struct CommentGetArgs always with id… in this case maybe author. … - - walk over the hset with data, find the one we are looking for based on the args -- comment_set(obj Comment)! -- comment_delete(id…) -- comment_list() ![]u32 -- discover()!string //returns a full openrpc spec - -make one .v file per type of object now comment_… - -we will then do for the other objects too - -also generate the openrpc spec based on the methods we have and the objects we return - - diff --git a/lib/hero/heromodels copy/examples/.gitignore b/lib/hero/heromodels copy/examples/.gitignore deleted file mode 100644 index 52a2bb97..00000000 --- a/lib/hero/heromodels copy/examples/.gitignore +++ /dev/null @@ -1,4 +0,0 @@ -example -client_example -server_example -example1 diff --git a/lib/hero/heromodels copy/examples/client_example.vsh b/lib/hero/heromodels copy/examples/client_example.vsh deleted file mode 100755 index d5c6218f..00000000 --- a/lib/hero/heromodels copy/examples/client_example.vsh +++ /dev/null @@ -1,85 +0,0 @@ -#!/usr/bin/env -S v -n -w -cg -gc none -cc tcc -d use_openssl -enable-globals run - -import net.unix -import json -import freeflowuniverse.herolib.ui.console -import freeflowuniverse.herolib.hero.heromodels.openrpc - -fn send_request(mut conn unix.StreamConn, request openrpc.JsonRpcRequest) ! { - request_json := json.encode(request) - conn.write_string(request_json)! -} - -fn read_response(mut conn unix.StreamConn) !string { - mut buffer := []u8{len: 8192} - bytes_read := conn.read(mut buffer)! - return buffer[..bytes_read].bytestr() -} - -console.print_header('HeroModels OpenRPC Client Example') - -// Connect to the server -mut conn := unix.connect_stream('/tmp/heromodels')! -defer { - conn.close() or {} -} - -console.print_item('Connected to server') - -// Test 1: Get OpenRPC specification -console.print_header('Test 1: Discover OpenRPC Specification') -discover_request := openrpc.JsonRpcRequest{ - jsonrpc: '2.0' - method: 'discover' - params: 'null' - id: '1' -} - -send_request(mut conn, discover_request)! -response := read_response(mut conn)! -console.print_item('OpenRPC Spec received: ${response.len} characters') - -// Test 2: Create a comment -console.print_header('Test 2: Create Comment') -comment_json := '{"comment": "This is a test comment from OpenRPC client", "parent": 0, "author": 1}' - -create_request := openrpc.JsonRpcRequest{ - jsonrpc: '2.0' - method: 'comment_set' - params: comment_json - id: '2' -} - -send_request(mut conn, create_request)! -create_response := read_response(mut conn)! -console.print_item('Comment created: ${create_response}') - -// Test 3: List all comments -console.print_header('Test 3: List All Comments') -list_request := openrpc.JsonRpcRequest{ - jsonrpc: '2.0' - method: 'comment_list' - params: 'null' - id: '3' -} - -send_request(mut conn, list_request)! -list_response := read_response(mut conn)! -console.print_item('Comment list: ${list_response}') - -// Test 4: Get comment by author -console.print_header('Test 4: Get Comments by Author') -get_args_json := '{"author": 1}' - -get_request := openrpc.JsonRpcRequest{ - jsonrpc: '2.0' - method: 'comment_get' - params: get_args_json - id: '4' -} - -send_request(mut conn, get_request)! -get_response := read_response(mut conn)! -console.print_item('Comments by author: ${get_response}') - -console.print_header('All tests completed successfully!') diff --git a/lib/hero/heromodels copy/examples/example1.vsh b/lib/hero/heromodels copy/examples/example1.vsh deleted file mode 100755 index e490c861..00000000 --- a/lib/hero/heromodels copy/examples/example1.vsh +++ /dev/null @@ -1,37 +0,0 @@ -#!/usr/bin/env -S v -n -w -cg -gc none -cc tcc -d use_openssl -enable-globals run - -// Create a user -mut user := new_user('John Doe', 'john@example.com') - -// Create a group -mut group := new_group('Development Team', 'Software development group') -group.add_member(user.id, .admin) - -// Create a project -mut project := new_project('Website Redesign', 'Redesign company website', group.id) - -// Create an issue -mut issue := new_project_issue('Fix login bug', project.id, user.id, .bug) - -// Create a calendar -mut calendar := new_calendar('Team Calendar', group.id) - -// Create an event -mut event := new_calendar_event('Sprint Planning', 1672531200, 1672534800, calendar.id, - user.id) -calendar.add_event(event.id) - -// Create a filesystem -mut fs := new_fs('Team Files', group.id) - -// Create a blob for file content -mut blob := new_fs_blob('Hello World!'.bytes())! - -println('User ID: ${user.id}') -println('Group ID: ${group.id}') -println('Project ID: ${project.id}') -println('Issue ID: ${issue.id}') -println('Calendar ID: ${calendar.id}') -println('Event ID: ${event.id}') -println('Filesystem ID: ${fs.id}') -println('Blob ID: ${blob.id}') diff --git a/lib/hero/heromodels copy/examples/server_example.vsh b/lib/hero/heromodels copy/examples/server_example.vsh deleted file mode 100755 index 566abab3..00000000 --- a/lib/hero/heromodels copy/examples/server_example.vsh +++ /dev/null @@ -1,23 +0,0 @@ -#!/usr/bin/env -S v -n -w -cg -gc none -cc tcc -d use_openssl -enable-globals run - -import freeflowuniverse.herolib.hero.heromodels.openrpc -import freeflowuniverse.herolib.hero.heromodels -import freeflowuniverse.herolib.ui.console -import time -import os - -console.print_header('HeroModels OpenRPC Server Example') - -// Create and start the server -mut server := openrpc.new_rpc_server(socket_path: '/tmp/heromodels')! - -// Start server in a separate thread -spawn server.start() - -console.print_item('Server started on /tmp/heromodels') -console.print_item('Press Ctrl+C to stop the server') - -// Keep the main thread alive -for { - time.sleep(1 * time.second) -} diff --git a/lib/hero/heromodels copy/openrpc_interface.v b/lib/hero/heromodels copy/openrpc_interface.v deleted file mode 100644 index 6005ef22..00000000 --- a/lib/hero/heromodels copy/openrpc_interface.v +++ /dev/null @@ -1,47 +0,0 @@ -module heromodels - -import freeflowuniverse.herolib.schemas.openrpc - - - -// // Re-export core methods from openrpcserver for convenience -// pub fn set[T](mut obj T) !u32 { -// return openrpcserver.set[T](mut obj)! -// } - -// pub fn get[T](id u32) !T { -// return openrpcserver.get[T](id)! -// } - -// pub fn exists[T](id u32) !bool { -// return openrpcserver.exists[T](id)! -// } - -// pub fn delete[T](id u32) ! { -// openrpcserver.delete[T](id)! -// } - -// pub fn list[T]() ![]T { -// return openrpcserver.list[T]()! -// } - -// // Re-export utility functions -// pub fn tags2id(tags []string) !u32 { -// return openrpcserver.tags2id(tags)! -// } - -// pub fn comment_multiset(args []CommentArg) ![]u32 { -// return openrpcserver.comment_multiset(args)! -// } - -// pub fn comments2ids(args []CommentArg) ![]u32 { -// return openrpcserver.comments2ids(args)! -// } - -// pub fn comment2id(comment string) !u32 { -// return openrpcserver.comment2id(comment)! -// } - -// pub fn new_base(args BaseArgs) !Base { -// return openrpcserver.new_base(args)! -// } diff --git a/lib/hero/heromodels/readme.md b/lib/hero/heromodels/readme.md index 1f0e89e2..8eae08d3 100644 --- a/lib/hero/heromodels/readme.md +++ b/lib/hero/heromodels/readme.md @@ -1,18 +1,32 @@ +## http based RPC server + +```bash -## unix socket based RPC server +curl -s http://localhost:9933/ \ + -H "Content-Type: application/json" \ + -d '{ + "jsonrpc": "2.0", + "method": "comment_set", + "params": { + "comment": "Hello world!", + "parent": 0, + "author": 42 + }, + "id": 1 + }' | jq . -see lib/hero/heromodels/rpc/rpc_comment.v for an example of how to implement RPC methods. - -```v -import freeflowuniverse.herolib.hero.heromodels.rpc - -#starts the rpc server -rpc.start()! +{ + "jsonrpc": "2.0", + "result": "46", + "id": 1 +} ``` +## unix socket based RPC server + ```bash # to test the discover function, this returns the openrpc specification: echo '{"jsonrpc":"2.0","method":"rpc.discover","params":[],"id":1}' | nc -U /tmp/heromodels diff --git a/lib/hero/heromodels/rpc/factory.v b/lib/hero/heromodels/rpc/factory.v index 9d109dae..7e3a9e45 100644 --- a/lib/hero/heromodels/rpc/factory.v +++ b/lib/hero/heromodels/rpc/factory.v @@ -9,6 +9,7 @@ const openrpc_path = os.join_path(os.dir(@FILE), 'openrpc.json') pub struct ServerArgs { pub mut: socket_path string = '/tmp/heromodels' + http_port int // if 0, no http server will be started } pub fn start(args ServerArgs) ! { @@ -59,5 +60,9 @@ pub fn start(args ServerArgs) ! { openrpc_handler.register_procedure_handle('user_delete', user_delete) openrpc_handler.register_procedure_handle('user_list', user_list) - openrpc.start_unix_server(openrpc_handler, socket_path: args.socket_path)! + if args.http_port != 0 { + openrpc.start_http_server(openrpc_handler, port: args.http_port)! + } else { + openrpc.start_unix_server(openrpc_handler, socket_path: args.socket_path)! + } } diff --git a/lib/schemas/openrpc/controller_http.v b/lib/schemas/openrpc/controller_http.v index 738312a8..6bb16873 100644 --- a/lib/schemas/openrpc/controller_http.v +++ b/lib/schemas/openrpc/controller_http.v @@ -14,24 +14,22 @@ pub struct Context { veb.Context } -// Creates a new HTTPController instance -pub fn new_http_controller(c HTTPController) &HTTPController { - return &HTTPController{ - ...c - Handler: c.Handler - } +@[params] +pub struct HTTPServerParams { +pub mut: + port int = 9944 // Default to port 9944 } -// Parameters for running the server -@[params] -pub struct RunParams { -pub: - port int = 8080 // Default to port 8080 +pub fn start_http_server(handler Handler, params HTTPServerParams) ! { + mut server := HTTPController{ + Handler: handler + } + server.start(params)! } // Starts the server -pub fn (mut c HTTPController) run(params RunParams) { - veb.run[HTTPController, Context](mut c, 8080) +pub fn (mut c HTTPController) start(params HTTPServerParams) ! { + veb.run[HTTPController, Context](mut c, params.port) } // Handles POST requests at the index endpoint @@ -43,9 +41,7 @@ pub fn (mut c HTTPController) index(mut ctx Context) veb.Result { } // Process the JSONRPC request with the OpenRPC handler - response := c.handle(request) or { - return ctx.server_error('Handler error: ${err.msg()}') - } + response := c.handle(request) or { return ctx.server_error('Handler error: ${err.msg()}') } // Encode and return the handler's JSONRPC Response return ctx.json(response)