mirror of
https://github.com/xtr-dev/rondevu-server.git
synced 2025-12-16 05:43:23 +00:00
Compare commits
12 Commits
| Author | SHA1 | Date | |
|---|---|---|---|
| b5cdc1ef14 | |||
| 8752cd9751 | |||
| 76539c4b65 | |||
| d486283c01 | |||
| 100a86e3ce | |||
|
|
1d9ba69a5f | ||
|
|
83fc5d89d6 | ||
|
|
59b008983d | ||
| 6a1ca14bf8 | |||
| 350d15591a | |||
| 7246d4c723 | |||
| f53d3024c7 |
57
.github/workflows/claude-code-review.yml
vendored
Normal file
57
.github/workflows/claude-code-review.yml
vendored
Normal 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
50
.github/workflows/claude.yml
vendored
Normal 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:*)'
|
||||||
|
|
||||||
@@ -254,6 +254,13 @@ All authenticated operations require Ed25519 signatures:
|
|||||||
|
|
||||||
See [ADVANCED.md](./ADVANCED.md#security) for detailed security documentation.
|
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
|
## License
|
||||||
|
|
||||||
MIT
|
MIT
|
||||||
|
|||||||
4
package-lock.json
generated
4
package-lock.json
generated
@@ -1,12 +1,12 @@
|
|||||||
{
|
{
|
||||||
"name": "@xtr-dev/rondevu-server",
|
"name": "@xtr-dev/rondevu-server",
|
||||||
"version": "0.5.1",
|
"version": "0.5.4",
|
||||||
"lockfileVersion": 3,
|
"lockfileVersion": 3,
|
||||||
"requires": true,
|
"requires": true,
|
||||||
"packages": {
|
"packages": {
|
||||||
"": {
|
"": {
|
||||||
"name": "@xtr-dev/rondevu-server",
|
"name": "@xtr-dev/rondevu-server",
|
||||||
"version": "0.5.1",
|
"version": "0.5.4",
|
||||||
"dependencies": {
|
"dependencies": {
|
||||||
"@hono/node-server": "^1.19.6",
|
"@hono/node-server": "^1.19.6",
|
||||||
"@noble/ed25519": "^3.0.0",
|
"@noble/ed25519": "^3.0.0",
|
||||||
|
|||||||
@@ -1,6 +1,6 @@
|
|||||||
{
|
{
|
||||||
"name": "@xtr-dev/rondevu-server",
|
"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",
|
"description": "DNS-like WebRTC signaling server with username claiming and service discovery",
|
||||||
"main": "dist/index.js",
|
"main": "dist/index.js",
|
||||||
"scripts": {
|
"scripts": {
|
||||||
|
|||||||
@@ -14,7 +14,7 @@ ed25519.hashes.sha512Async = async (message: Uint8Array) => {
|
|||||||
};
|
};
|
||||||
|
|
||||||
// Username validation
|
// 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_MIN_LENGTH = 3;
|
||||||
const USERNAME_MAX_LENGTH = 32;
|
const USERNAME_MAX_LENGTH = 32;
|
||||||
|
|
||||||
|
|||||||
@@ -215,7 +215,7 @@ const handlers: Record<string, RpcHandler> = {
|
|||||||
const pageLimit = Math.min(Math.max(1, limit), MAX_PAGE_SIZE);
|
const pageLimit = Math.min(Math.max(1, limit), MAX_PAGE_SIZE);
|
||||||
const pageOffset = Math.max(0, offset || 0);
|
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);
|
const compatibleServices = filterCompatibleServices(allServices);
|
||||||
|
|
||||||
// Get unique services per username with available offers
|
// Get unique services per username with available offers
|
||||||
@@ -260,14 +260,12 @@ const handlers: Record<string, RpcHandler> = {
|
|||||||
}
|
}
|
||||||
|
|
||||||
// Mode 3: Random discovery without username
|
// Mode 3: Random discovery without username
|
||||||
const allServices = await storage.getServicesByName(parsed.service, parsed.version);
|
const randomService = await storage.getRandomService(parsed.serviceName, parsed.version);
|
||||||
const compatibleServices = filterCompatibleServices(allServices);
|
|
||||||
|
|
||||||
if (compatibleServices.length === 0) {
|
if (!randomService) {
|
||||||
throw new Error('No services found');
|
throw new Error('No services found');
|
||||||
}
|
}
|
||||||
|
|
||||||
const randomService = compatibleServices[Math.floor(Math.random() * compatibleServices.length)];
|
|
||||||
const availableOffer = await findAvailableOffer(randomService);
|
const availableOffer = await findAvailableOffer(randomService);
|
||||||
|
|
||||||
if (!availableOffer) {
|
if (!availableOffer) {
|
||||||
|
|||||||
@@ -17,7 +17,7 @@ OFFER_MIN_TTL = "60000" # Min offer TTL: 1 minute
|
|||||||
MAX_OFFERS_PER_REQUEST = "100" # Max offers per request
|
MAX_OFFERS_PER_REQUEST = "100" # Max offers per request
|
||||||
MAX_TOPICS_PER_OFFER = "50" # Max topics per offer
|
MAX_TOPICS_PER_OFFER = "50" # Max topics per offer
|
||||||
CORS_ORIGINS = "*" # Comma-separated list of allowed origins
|
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
|
# AUTH_SECRET should be set as a secret, not a var
|
||||||
# Run: npx wrangler secret put AUTH_SECRET
|
# Run: npx wrangler secret put AUTH_SECRET
|
||||||
|
|||||||
Reference in New Issue
Block a user