12 Commits

Author SHA1 Message Date
b5cdc1ef14 Bump to 0.5.4: Fix service discovery parameter bug 2025-12-14 22:02:33 +01:00
8752cd9751 Fix service discovery bug: Use parsed.serviceName instead of parsed.service
Bug: getService() was accessing parsed.service (undefined) instead of
parsed.serviceName, causing D1_TYPE_ERROR in service discovery.

This affected both random discovery (line 263) and paginated discovery
(line 218) when clients requested services without specifying username.

The parseServiceFqn() function returns { serviceName, version, username },
not { service, version, username }.

Fixes: D1_TYPE_ERROR: Type 'undefined' not supported for value 'undefined'
when discovering services like 'test-chat:1.0.0' (without @username)
2025-12-14 22:02:22 +01:00
76539c4b65 Update README: Add v0.5.3 changelog
- Document fix for storage method calls
- Explain replacement of non-existent storage.getServicesByName()
- Note compatibility with Storage interface specification

Fixes customer-reported error: "storage.getServicesByName is not a function"
2025-12-14 18:27:31 +01:00
d486283c01 Bump version to 0.5.3
🤖 Generated with [Claude Code](https://claude.com/claude-code)

Co-Authored-By: Claude Sonnet 4.5 <noreply@anthropic.com>
2025-12-14 17:02:49 +01:00
100a86e3ce Fix storage.getServicesByName() calls - use correct storage methods
Replace non-existent getServicesByName() with:
- discoverServices() for paginated mode
- getRandomService() for random mode

Fixes "storage.getServicesByName is not a function" error.

🤖 Generated with [Claude Code](https://claude.com/claude-code)

Co-Authored-By: Claude Sonnet 4.5 <noreply@anthropic.com>
2025-12-14 17:02:11 +01:00
Bas
1d9ba69a5f Merge pull request #2 from xtr-dev/add-claude-github-actions-1765706441212
Add Claude Code GitHub Workflow
2025-12-14 11:01:13 +01:00
Bas
83fc5d89d6 "Claude Code Review workflow" 2025-12-14 11:00:45 +01:00
Bas
59b008983d "Claude PR Assistant workflow" 2025-12-14 11:00:44 +01:00
6a1ca14bf8 Update VERSION to 0.5.2 in wrangler.toml 2025-12-13 18:25:16 +01:00
350d15591a v0.5.2 - Allow periods in usernames 2025-12-13 18:24:26 +01:00
7246d4c723 Allow periods in usernames
Update username validation regex to allow periods (.) in addition to alphanumeric characters and dashes. Usernames must still start and end with alphanumeric characters.
2025-12-13 18:24:16 +01:00
f53d3024c7 Update VERSION to 0.5.1 in wrangler.toml 2025-12-13 15:09:11 +01:00
8 changed files with 122 additions and 10 deletions

View File

@@ -0,0 +1,57 @@
name: Claude Code Review
on:
pull_request:
types: [opened, synchronize]
# Optional: Only run on specific file changes
# paths:
# - "src/**/*.ts"
# - "src/**/*.tsx"
# - "src/**/*.js"
# - "src/**/*.jsx"
jobs:
claude-review:
# Optional: Filter by PR author
# if: |
# github.event.pull_request.user.login == 'external-contributor' ||
# github.event.pull_request.user.login == 'new-developer' ||
# github.event.pull_request.author_association == 'FIRST_TIME_CONTRIBUTOR'
runs-on: ubuntu-latest
permissions:
contents: read
pull-requests: read
issues: read
id-token: write
steps:
- name: Checkout repository
uses: actions/checkout@v4
with:
fetch-depth: 1
- name: Run Claude Code Review
id: claude-review
uses: anthropics/claude-code-action@v1
with:
claude_code_oauth_token: ${{ secrets.CLAUDE_CODE_OAUTH_TOKEN }}
prompt: |
REPO: ${{ github.repository }}
PR NUMBER: ${{ github.event.pull_request.number }}
Please review this pull request and provide feedback on:
- Code quality and best practices
- Potential bugs or issues
- Performance considerations
- Security concerns
- Test coverage
Use the repository's CLAUDE.md for guidance on style and conventions. Be constructive and helpful in your feedback.
Use `gh pr comment` with your Bash tool to leave your review as a comment on the PR.
# See https://github.com/anthropics/claude-code-action/blob/main/docs/usage.md
# or https://code.claude.com/docs/en/cli-reference for available options
claude_args: '--allowed-tools "Bash(gh issue view:*),Bash(gh search:*),Bash(gh issue list:*),Bash(gh pr comment:*),Bash(gh pr diff:*),Bash(gh pr view:*),Bash(gh pr list:*)"'

50
.github/workflows/claude.yml vendored Normal file
View File

@@ -0,0 +1,50 @@
name: Claude Code
on:
issue_comment:
types: [created]
pull_request_review_comment:
types: [created]
issues:
types: [opened, assigned]
pull_request_review:
types: [submitted]
jobs:
claude:
if: |
(github.event_name == 'issue_comment' && contains(github.event.comment.body, '@claude')) ||
(github.event_name == 'pull_request_review_comment' && contains(github.event.comment.body, '@claude')) ||
(github.event_name == 'pull_request_review' && contains(github.event.review.body, '@claude')) ||
(github.event_name == 'issues' && (contains(github.event.issue.body, '@claude') || contains(github.event.issue.title, '@claude')))
runs-on: ubuntu-latest
permissions:
contents: read
pull-requests: read
issues: read
id-token: write
actions: read # Required for Claude to read CI results on PRs
steps:
- name: Checkout repository
uses: actions/checkout@v4
with:
fetch-depth: 1
- name: Run Claude Code
id: claude
uses: anthropics/claude-code-action@v1
with:
claude_code_oauth_token: ${{ secrets.CLAUDE_CODE_OAUTH_TOKEN }}
# This is an optional setting that allows Claude to read CI results on PRs
additional_permissions: |
actions: read
# Optional: Give a custom prompt to Claude. If this is not specified, Claude will perform the instructions specified in the comment that tagged it.
# prompt: 'Update the pull request description to include a summary of changes.'
# Optional: Add claude_args to customize behavior and configuration
# See https://github.com/anthropics/claude-code-action/blob/main/docs/usage.md
# or https://code.claude.com/docs/en/cli-reference for available options
# claude_args: '--allowed-tools Bash(gh pr:*)'

View File

@@ -254,6 +254,13 @@ All authenticated operations require Ed25519 signatures:
See [ADVANCED.md](./ADVANCED.md#security) for detailed security documentation.
## Changelog
### v0.5.3 (Latest)
- Fix RPC method calls using non-existent storage methods
- Replace `storage.getServicesByName()` with `storage.discoverServices()` and `storage.getRandomService()`
- Ensures compatibility with Storage interface specification
## License
MIT

4
package-lock.json generated
View File

@@ -1,12 +1,12 @@
{
"name": "@xtr-dev/rondevu-server",
"version": "0.5.1",
"version": "0.5.4",
"lockfileVersion": 3,
"requires": true,
"packages": {
"": {
"name": "@xtr-dev/rondevu-server",
"version": "0.5.1",
"version": "0.5.4",
"dependencies": {
"@hono/node-server": "^1.19.6",
"@noble/ed25519": "^3.0.0",

View File

@@ -1,6 +1,6 @@
{
"name": "@xtr-dev/rondevu-server",
"version": "0.5.1",
"version": "0.5.4",
"description": "DNS-like WebRTC signaling server with username claiming and service discovery",
"main": "dist/index.js",
"scripts": {

View File

@@ -14,7 +14,7 @@ ed25519.hashes.sha512Async = async (message: Uint8Array) => {
};
// Username validation
const USERNAME_REGEX = /^[a-z0-9][a-z0-9-]*[a-z0-9]$/;
const USERNAME_REGEX = /^[a-z0-9][a-z0-9.-]*[a-z0-9]$/;
const USERNAME_MIN_LENGTH = 3;
const USERNAME_MAX_LENGTH = 32;

View File

@@ -215,7 +215,7 @@ const handlers: Record<string, RpcHandler> = {
const pageLimit = Math.min(Math.max(1, limit), MAX_PAGE_SIZE);
const pageOffset = Math.max(0, offset || 0);
const allServices = await storage.getServicesByName(parsed.service, parsed.version);
const allServices = await storage.discoverServices(parsed.serviceName, parsed.version, 1000, 0);
const compatibleServices = filterCompatibleServices(allServices);
// Get unique services per username with available offers
@@ -260,14 +260,12 @@ const handlers: Record<string, RpcHandler> = {
}
// Mode 3: Random discovery without username
const allServices = await storage.getServicesByName(parsed.service, parsed.version);
const compatibleServices = filterCompatibleServices(allServices);
const randomService = await storage.getRandomService(parsed.serviceName, parsed.version);
if (compatibleServices.length === 0) {
if (!randomService) {
throw new Error('No services found');
}
const randomService = compatibleServices[Math.floor(Math.random() * compatibleServices.length)];
const availableOffer = await findAvailableOffer(randomService);
if (!availableOffer) {

View File

@@ -17,7 +17,7 @@ OFFER_MIN_TTL = "60000" # Min offer TTL: 1 minute
MAX_OFFERS_PER_REQUEST = "100" # Max offers per request
MAX_TOPICS_PER_OFFER = "50" # Max topics per offer
CORS_ORIGINS = "*" # Comma-separated list of allowed origins
VERSION = "0.5.0" # Semantic version
VERSION = "0.5.2" # Semantic version
# AUTH_SECRET should be set as a secret, not a var
# Run: npx wrangler secret put AUTH_SECRET