{"id":21578851,"url":"https://github.com/rieonke/beco","last_synced_at":"2026-03-08T12:31:28.662Z","repository":{"id":141300140,"uuid":"461090768","full_name":"rieonke/beco","owner":"rieonke","description":"A Browser(Chrome/Firefox/Edge) extension native messaging host library/framework for C.","archived":false,"fork":false,"pushed_at":"2022-02-19T09:08:46.000Z","size":107,"stargazers_count":4,"open_issues_count":0,"forks_count":1,"subscribers_count":1,"default_branch":"main","last_synced_at":"2025-03-30T20:11:13.379Z","etag":null,"topics":["browser-extension","c","chrome-extension","edge-extension","firefox-extension","native-messaging","native-messaging-host"],"latest_commit_sha":null,"homepage":"","language":"C","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"mit","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/rieonke.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":null,"funding":null,"license":"LICENSE","code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null,"governance":null,"roadmap":null,"authors":null,"dei":null,"publiccode":null,"codemeta":null}},"created_at":"2022-02-19T04:58:06.000Z","updated_at":"2023-12-24T12:45:19.000Z","dependencies_parsed_at":null,"dependency_job_id":"f4c14943-f38e-4ed8-8168-74a2a61b659a","html_url":"https://github.com/rieonke/beco","commit_stats":null,"previous_names":[],"tags_count":0,"template":false,"template_full_name":null,"repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/rieonke%2Fbeco","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/rieonke%2Fbeco/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/rieonke%2Fbeco/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/rieonke%2Fbeco/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/rieonke","download_url":"https://codeload.github.com/rieonke/beco/tar.gz/refs/heads/main","host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":251787402,"owners_count":21643877,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2022-07-04T15:15:14.044Z","host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":["browser-extension","c","chrome-extension","edge-extension","firefox-extension","native-messaging","native-messaging-host"],"created_at":"2024-11-24T13:11:43.619Z","updated_at":"2026-03-08T12:31:28.622Z","avatar_url":"https://github.com/rieonke.png","language":"C","funding_links":[],"categories":[],"sub_categories":[],"readme":"# beco\n\nA Browser(Chrome/Firefox/Edge) extension native messaging host library/framework for C.\n\n## Intro\n\nBeco (**B**rowser **E**xtension **C** native messaging h**O**st)\nhelps you to build and test native messaging host easily.\n\nBeco implemented the native messaging protocol and a command-driven request-response application model. It also provides\na mock tool for you to test your app.\n\n## Features\n\n- Native messaging protocol\n- Convert between JSON and C seamlessly\n- Command pattern programming model\n- Easy and native mock framework\n\n## Usages\ncheck out examples/ to find more usages\n### Basic\n```c\nvoid sig_handler(int sig);\nBecoError hello_handler(struct BecoContext *ctx, struct BecoRequest *req, void *user_data);\n\nvolatile bool g_con_exit; // global exit condition\n\nint main(int argc, char **argv) {\n  struct BecoContext ctx;\n  BecoError err;\n\n  signal(SIGTERM, sig_handler);\n  signal(SIGINT, sig_handler);\n\n  BecoContextInit(\u0026ctx);\n  BecoRegisterCommand(\u0026ctx, \"hello\", hello_handler, NULL);\n\n  err = BecoMainLoop(\u0026ctx, \u0026g_con_exit, false);\n  if (err) {\n    BecoLog(\u0026ctx, \"Exit with ret: %d\\n\", err);\n  }\n\n  BecoContextDestroy(\u0026ctx);\n  return 0;\n}\n\nvoid sig_handler(int sig) {\n  g_con_exit = true;\n}\n\nBecoError hello_handler(struct BecoContext *ctx, struct BecoRequest *req, void *user_data) {\n  struct BecoObject *obj;\n  struct BecoMap *map = NULL;\n\n  map = BecoMapNew();\n  BecoMapPut(map, \"hello\", STR(\"you\"));\n\n  obj = MAP(map);\n\n  BecoSendResponse(ctx, obj);\n  BecoObjectFree(obj);\n\n  return BECO_ERR_OK;\n}\n\n```\n\n### Mock\n```c\n\nvoid test_hello(struct BecoContext *ctx) {\n  struct BecoObject obj;\n  struct BecoMap *map = NULL;\n  struct BecoRequest req = {0};\n\n  map = BecoMapNew();\n  BecoMapPut(map, \"hello\", STR(\"you\"));\n\n  obj.type = BECO_VALUE_TYPE_MAP;\n  obj.via.map = map;\n\n  BecoWrite(ctx, \u0026obj); // send request\n\n  BecoRead(ctx, \u0026req);  // receive response\n\n  BecoObjectDump(req.data);\n  BecoMapFree(map);\n  BecoRequestDestroy(\u0026req);\n}\n\nvoid test_print(struct BecoContext *ctx) {\n  struct BecoObject obj;\n  struct BecoMap *map = NULL;\n  struct BecoRequest req = {0};\n\n  map = BecoMapNew();\n  BecoMapPut(map, \"command\", STR(\"print\"));\n  BecoMapPut(map, \"hello\", STR(\"print\"));\n\n  obj.type = BECO_VALUE_TYPE_MAP;\n  obj.via.map = map;\n\n  BecoWrite(ctx, \u0026obj); // send request\n\n  BecoRead(ctx, \u0026req); // receive response\n\n  BecoObjectDump(req.data);\n  BecoMapFree(map);\n  BecoRequestDestroy(\u0026req);\n}\n\n#ifdef _WIN32\n#define MOCK_TARGET_EXE \"test_beco.exe\"\n#else\n#define MOCK_TARGET_EXE \"test_beco\"\n#endif\n\nint main(int argc, char **argv) {\n\n  struct BecoMockContext mock;\n  struct BecoContext *driver;\n  BecoError err;\n\n  BecoMockInit(\u0026mock);\n  mock.exec_path = MOCK_TARGET_EXE;\n\n  err = BecoMockStart(\u0026mock);\n  assert(err == BECO_ERR_OK);\n  driver = BecoMockGetDriver(\u0026mock);\n  assert(driver != NULL);\n\n  test_hello(driver);\n  test_print(driver);\n  close_child(driver);\n\n  BecoMockFinish(\u0026mock);\n  \n  return 0;\n}\n```\n\n## Build\n\n### Tested platforms\n- Windows\n- Linux\n- macOS\n\n### Requirements\n- C90 Compiler (GCC/Clang/MSVC/...)\n- CMake \u003e= 3.0\n\n### Build\n\n```shell\n\nmkdir build \u0026\u0026 cd build\ncmake ..\ncmake --build .\ncmake --install . # optional\n\n```\n\n## TODO\n* [ ] Add documentation and Github page.\n* [ ] Add GitHub workflow for CI and codecov.\n* [ ] Support more json libraries\n* [ ] Add more tests: valgrind, sanitizer.\n* [ ] Add more utilities\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Frieonke%2Fbeco","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Frieonke%2Fbeco","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Frieonke%2Fbeco/lists"}