7 Commits
v0.5.0 ... main

Author SHA1 Message Date
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
384b80ef0d v0.5.1 - Fix base64 encoding for Node.js compatibility 2025-12-13 15:09:02 +01:00
b5799fa9ac Fix base64 encoding for Node.js compatibility
Use Buffer for base64 encoding/decoding to ensure compatibility with Node.js clients using NodeCryptoAdapter. The previous btoa/atob implementation caused signature verification failures when clients used Buffer-based encoding.

Fixes: Invalid signature errors when using NodeCryptoAdapter
2025-12-13 15:08:56 +01:00
2a648c5818 Update VERSION to 0.5.0 in wrangler.toml 2025-12-13 14:43:42 +01:00
4 changed files with 10 additions and 11 deletions

4
package-lock.json generated
View File

@@ -1,12 +1,12 @@
{
"name": "@xtr-dev/rondevu-server",
"version": "0.5.0",
"version": "0.5.2",
"lockfileVersion": 3,
"requires": true,
"packages": {
"": {
"name": "@xtr-dev/rondevu-server",
"version": "0.5.0",
"version": "0.5.2",
"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.0",
"version": "0.5.2",
"description": "DNS-like WebRTC signaling server with username claiming and service discovery",
"main": "dist/index.js",
"scripts": {

View File

@@ -5,6 +5,7 @@
*/
import * as ed25519 from '@noble/ed25519';
import { Buffer } from 'node:buffer';
// Set SHA-512 hash function for ed25519 (required in @noble/ed25519 v3+)
// Uses Web Crypto API (compatible with both Node.js and Cloudflare Workers)
@@ -13,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;
@@ -34,20 +35,18 @@ export function generateAnonymousUsername(): string {
/**
* Convert Uint8Array to base64 string
* Uses Buffer for compatibility with Node.js-based clients
*/
function bytesToBase64(bytes: Uint8Array): string {
const binString = Array.from(bytes, (byte) =>
String.fromCodePoint(byte)
).join('');
return btoa(binString);
return Buffer.from(bytes).toString('base64');
}
/**
* Convert base64 string to Uint8Array
* Uses Buffer for compatibility with Node.js-based clients
*/
function base64ToBytes(base64: string): Uint8Array {
const binString = atob(base64);
return Uint8Array.from(binString, (char) => char.codePointAt(0)!);
return new Uint8Array(Buffer.from(base64, 'base64'));
}
/**

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.4.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