Skip to content

feat: initial release of V2X J2735 codec with Python & Node.js bindings#2

Merged
yhseanhsu merged 21 commits intomainfrom
feat/starter-kit
Feb 3, 2026
Merged

feat: initial release of V2X J2735 codec with Python & Node.js bindings#2
yhseanhsu merged 21 commits intomainfrom
feat/starter-kit

Conversation

@yhseanhsu
Copy link
Copy Markdown
Contributor

@yhseanhsu yhseanhsu commented Jan 16, 2026

Summary

This PR introduces the initial implementation of the J2735 V2X Codec. It includes the core C++ logic compiled to WASM, along with high-level bindings for both Python and Node.js.

Key Features

  • Core: WASM-based codec supporting J2735_202409.
  • Python Bindings: uv managed package with full type hinting and pytest suite.
  • Node.js Bindings: TypeScript-ready workspaces with vitest integration.
  • Automation: Integrated Makefile for symmetrical builds and GitHub Actions for CI/CD and automated releases.

Build Mechanism

  • Python artifacts are generated as Wheels in bindings/python/dist/.
  • Node.js artifacts are generated as Tarballs in bindings/node/.
  • Cross-platform support via Emscripten.

Verification

  • make install-py passes (Isolated Wheel test).
  • make install-js passes (Isolated Tarball test).
  • All WASM binaries are correctly mapped in generated/ directories.

Issues

- Add root Makefile to orchestrate Native C and WASM builds.
- Implement modular CMake configuration for j2735codec and core library.
- Add PlatformDetection.cmake for cross-platform OS/Arch identification.
- Implement PostBuild.cmake logic for automated binding generation and WASM asset syncing.
- Add path validation for SAE J2735 standard revisions.
- Update .gitignore to exclude build artifacts and generated assets.
- Add root pyproject.toml for UV workspace management.
- Rewrite Makefile with colorized environment guards and uv detection.
- Implement multi-phase install-py target (build, test, package, and verify).
- Add setup-js, build-js, and install-js targets to Makefile.
- Update codec.test.ts to import from package name.
- Bump the require python version to 3.9 to make protobuf version play nice.
- Added additional pytest for python bindings including memory checks.
- Rename J2735Codec to V2XCodec for python bindings.
@yhseanhsu yhseanhsu force-pushed the feat/starter-kit branch 4 times, most recently from 0778f8f to bb05620 Compare January 18, 2026 05:17
- Add registration and deregistration examples.
- Add vehicle, speed monitor and loopback examples.
- Add CI support to release examples.
- Update documentation for python examples.
@yhseanhsu yhseanhsu force-pushed the feat/starter-kit branch 2 times, most recently from 637f153 to 1103c03 Compare January 19, 2026 01:47
- Add registration and deregistration examples.
- Add vehicle, speed monitor, and loopback examples.
- Add CI support to release examples.
- Update documentation for node examples.
- Replace blocking `input()` calls with non-blocking signal handlers (SIGINT/SIGTERM).
- Remove `readline` dependency in Node.js examples to prevent headless hangs.
- Ensure clean mTLS disconnection and resource cleanup in both Python and Node.js.
- Add `process.stdin.pause()` and `unref()` timers to prevent zombie processes in Node.js.
- Standardize J2735 speed unit conversions across all example clients.
- Rename arguments for registration example from reg_folder to certDir.
- Change registration configuration key from deviceId to device_id.
- Update JSON encoding/decoding to use snake case keys for device configurations.
- Separate codec build Makefile and README instructions into the j2735codec folder.
- Update CI build process to reflet new structure.
@yhseanhsu yhseanhsu merged commit 71be74b into main Feb 3, 2026
10 checks passed
@gytibor gytibor deleted the feat/starter-kit branch April 3, 2026 19:19
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

Unrecognized cli option "--cert-dir" in examples Separate basic and advanced usage

1 participant