add docker server

Kim committed Oct 28, 2025 at 20:47 UTC 2c5d6889e0679b9bd4057254567095ee2c98877e
12 files changed +223 -350
Dockerfile
+23 -6
@@ -1,4 +1,19 @@
1 -# Multi-stage build for relayserver
1 +#############################################
2 +# Stage 1: Build WASM artifacts
3 +#############################################
4 +FROM rust:1-bullseye AS wasm-builder
5 +
6 +WORKDIR /src
7 +
8 +# Install dependencies: make + wasm-pack
9 +RUN apt-get update && apt-get install -y --no-install-recommends make protobuf-compiler && rm -rf /var/lib/apt/lists/*
10 +RUN cargo install wasm-pack
11 +
12 +# Build wasm artifacts
13 +COPY . .
14 +RUN make build-wasm
15 +
16 +# Stage 2: Build Go relayserver binary (embeds WASM)
17 FROM golang:1 AS builder
18
19 WORKDIR /src
@@ -8,15 +23,17 @@ RUN --mount=type=cache,target=/go/pkg/mod \
23 go mod download
24
25 COPY . .
26 +COPY --from=wasm-builder /src/cmd/relay-server/wasm /src/cmd/relay-server/wasm
27 +
28 +# Install make to use Makefile and build the server
29 +RUN apt-get update && apt-get install -y --no-install-recommends make && rm -rf /var/lib/apt/lists/*
30 +
31 RUN --mount=type=cache,target=/go/pkg/mod \
12 - CGO_ENABLED=0 GOOS=linux GOARCH=amd64 \
13 - go build -trimpath -ldflags "-s -w" -o /out/relayserver ./cmd/relay-server
32 + make build-server && install -D bin/relayserver /out/relayserver
33
15 -# Minimal runtime image
34 +# Stage 3: Minimal runtime image
35 FROM gcr.io/distroless/static-debian12:nonroot
36
37 COPY --from=builder /out/relayserver /usr/bin/relayserver
38
20 -EXPOSE 8080 4001/tcp 4001/udp
21 -
39 ENTRYPOINT ["/usr/bin/relayserver"]
Makefile new
+26
@@ -0,0 +1,26 @@
1 +SHELL := /bin/sh
2 +
3 +.PHONY: build build-wasm build-server clean
4 +
5 +# Convenience target: build wasm then server
6 +build: build-wasm build-server
7 +
8 +# Build WASM artifacts and copy to both embed dir and SDK dir (no external scripts)
9 +build-wasm:
10 + @echo "[wasm] building with wasm-pack..."
11 + cd relaydns/wasm && wasm-pack build --target web --out-dir pkg
12 + @echo "[wasm] copying artifacts to embed dirs..."
13 + mkdir -p cmd/relay-server/wasm
14 + rm -rf cmd/relay-server/wasm/* sdk/wasm/*
15 + cp -R relaydns/wasm/pkg/. cmd/relay-server/wasm/
16 +
17 +# Build Go relay server (embeds WASM from cmd/relay-server/wasm)
18 +build-server:
19 + @echo "[server] building Go relayserver..."
20 + CGO_ENABLED=0 go build -trimpath -ldflags "-s -w" -o bin/relayserver ./cmd/relay-server
21 +
22 +clean:
23 + rm -rf bin
24 + rm -rf cmd/relay-server/wasm
25 + rm -rf sdk/wasm
26 + rm -rf relaydns/wasm/pkg
cmd/relay-server/view.go
+118 -232
@@ -2,9 +2,11 @@ package main
2
3 import (
4 "context"
5 + "embed"
6 "encoding/json"
7 "fmt"
8 "html/template"
9 + "io/fs"
10 "net"
11 "net/http"
12 "net/http/httputil"
@@ -21,104 +23,10 @@ import (
23 "github.com/gosuda/relaydns/sdk"
24 )
25
24 -type leaseRow struct {
25 - Peer string
26 - Name string
27 - Kind string
28 - Connected bool
29 - DNS string
30 - LastSeen string
31 - TTL string
32 - Link string
33 -}
34 -
35 -type adminPageData struct {
36 - NodeID string
37 - Bootstraps []string
38 - Rows []leaseRow
39 -}
40 -
41 -// convertLeaseEntriesToRows converts LeaseEntry data from LeaseManager to leaseRow format for the admin page
42 -func convertLeaseEntriesToRows(serv *relaydns.RelayServer) []leaseRow {
43 - // Get all lease entries directly from the lease manager
44 - leaseEntries := serv.GetAllLeaseEntries()
45 -
46 - var rows []leaseRow
47 - now := time.Now()
48 -
49 - for _, leaseEntry := range leaseEntries {
50 - // Check if lease is still valid
51 - if now.After(leaseEntry.Expires) {
52 - continue
53 - }
54 -
55 - lease := leaseEntry.Lease
56 - identityID := string(lease.Identity.Id)
57 -
58 - // Calculate TTL
59 - ttl := time.Until(leaseEntry.Expires)
60 - ttlStr := ""
61 - if ttl > 0 {
62 - if ttl > time.Hour {
63 - ttlStr = fmt.Sprintf("%.0fh", ttl.Hours())
64 - } else if ttl > time.Minute {
65 - ttlStr = fmt.Sprintf("%.0fm", ttl.Minutes())
66 - } else {
67 - ttlStr = fmt.Sprintf("%.0fs", ttl.Seconds())
68 - }
69 - }
70 -
71 - // Format last seen time
72 - lastSeenStr := leaseEntry.LastSeen.Format("2006-01-02 15:04:05")
73 -
74 - // Check if connection is still active by checking if the connection ID exists in the connections map
75 - connected := serv.IsConnectionActive(leaseEntry.ConnectionID)
76 -
77 - // Use name from lease if available
78 - name := lease.Name
79 - if name == "" {
80 - name = "(unnamed)"
81 - }
82 -
83 - // Determine kind/type based on ALPN if available
84 - kind := "client"
85 - if len(lease.Alpn) > 0 {
86 - kind = lease.Alpn[0]
87 - }
88 -
89 - // Create DNS label from identity (first 8 chars for display)
90 - dnsLabel := identityID
91 - if len(dnsLabel) > 8 {
92 - dnsLabel = dnsLabel[:8] + "..."
93 - }
94 -
95 - // Create link for the lease
96 - link := fmt.Sprintf("/peer/%s", identityID)
97 -
98 - row := leaseRow{
99 - Peer: identityID,
100 - Name: name,
101 - Kind: kind,
102 - Connected: connected,
103 - DNS: dnsLabel,
104 - LastSeen: lastSeenStr,
105 - TTL: ttlStr,
106 - Link: link,
107 - }
108 -
109 - rows = append(rows, row)
110 - }
111 -
112 - return rows
113 -}
114 -
115 -var wsUpgrader = websocket.Upgrader{
116 - ReadBufferSize: 1024,
117 - WriteBufferSize: 1024,
118 - CheckOrigin: func(r *http.Request) bool {
119 - return true
120 - },
121 -}
26 +// Paths are relative to this file's directory
27 +//
28 +//go:embed wasm
29 +var wasmFS embed.FS
30
31 // serveHTTP builds the HTTP mux and returns the server.
32 func serveHTTP(ctx context.Context, addr string, serv *relaydns.RelayServer, nodeID string, bootstraps []string, alpn string, cancel context.CancelFunc) *http.Server {
@@ -135,7 +43,7 @@ func serveHTTP(ctx context.Context, addr string, serv *relaydns.RelayServer, nod
43 proxyClientOnce sync.Once
44 proxyClientErr error
45 )
138 - // Lazily initialize a client that connects to provided bootstraps or the current server
46 + // Lazily initialize a client that connects to provided bootstraps or current server
47 initProxyClient := func(r *http.Request) (*sdk.RDClient, error) {
48 proxyClientOnce.Do(func() {
49 bs := bootstraps
@@ -160,16 +68,11 @@ func serveHTTP(ctx context.Context, addr string, serv *relaydns.RelayServer, nod
68 http.NotFound(w, r)
69 return
70 }
163 - // Split leaseID and remainder
164 - var leaseID, rest string
165 - slash := strings.IndexByte(path, '/')
166 - if slash == -1 {
167 - leaseID, rest = path, "/"
168 - } else {
169 - leaseID, rest = path[:slash], path[slash:]
170 - if rest == "" {
171 - rest = "/"
172 - }
71 + parts := strings.SplitN(path, "/", 2)
72 + leaseID := parts[0]
73 + rest := "/"
74 + if len(parts) == 2 && parts[1] != "" {
75 + rest = "/" + parts[1]
76 }
77
78 // Get ALPN from lease metadata
@@ -261,22 +164,7 @@ func serveHTTP(ctx context.Context, addr string, serv *relaydns.RelayServer, nod
164 }
165 })
166
264 - mux.HandleFunc("/api/leases", func(w http.ResponseWriter, r *http.Request) {
265 - if r.Method != http.MethodGet {
266 - w.Header().Set("Allow", http.MethodGet)
267 - http.Error(w, "method not allowed", http.StatusMethodNotAllowed)
268 - return
269 - }
270 -
271 - // Convert lease entries to rows
272 - rows := convertLeaseEntriesToRows(serv)
273 -
274 - w.Header().Set("Content-Type", "application/json")
275 - if err := json.NewEncoder(w).Encode(rows); err != nil {
276 - log.Error().Err(err).Msg("[server] failed to encode lease data")
277 - http.Error(w, "internal server error", http.StatusInternalServerError)
278 - }
279 - })
167 + // Note: removed /api/leases; admin renders server-side for simplicity
168
169 mux.HandleFunc("/health", func(w http.ResponseWriter, r *http.Request) {
170 type info struct {
@@ -287,8 +175,12 @@ func serveHTTP(ctx context.Context, addr string, serv *relaydns.RelayServer, nod
175 _ = json.NewEncoder(w).Encode(resp)
176 })
177
290 - // Serve WASM files for Service Worker
291 - mux.Handle("/pkg/", http.StripPrefix("/pkg/", http.FileServer(http.Dir("./relaydns/wasm/pkg"))))
178 + // Serve embedded WASM pkg files at /pkg/
179 + if sub, err := fs.Sub(wasmFS, "wasm"); err != nil {
180 + log.Error().Err(err).Msg("[server] failed to init embedded wasm pkg FS")
181 + } else {
182 + mux.Handle("/pkg/", http.StripPrefix("/pkg/", http.FileServer(http.FS(sub))))
183 + }
184 mux.HandleFunc("/sw-proxy.js", func(w http.ResponseWriter, r *http.Request) {
185 w.Header().Set("Content-Type", "application/javascript")
186 http.ServeFile(w, r, "./relaydns/wasm/sw-proxy.js")
@@ -310,6 +202,105 @@ func serveHTTP(ctx context.Context, addr string, serv *relaydns.RelayServer, nod
202 return srv
203 }
204
205 +type leaseRow struct {
206 + Peer string
207 + Name string
208 + Kind string
209 + Connected bool
210 + DNS string
211 + LastSeen string
212 + TTL string
213 + Link string
214 +}
215 +
216 +type adminPageData struct {
217 + NodeID string
218 + Bootstraps []string
219 + Rows []leaseRow
220 +}
221 +
222 +// convertLeaseEntriesToRows converts LeaseEntry data from LeaseManager to leaseRow format for the admin page
223 +func convertLeaseEntriesToRows(serv *relaydns.RelayServer) []leaseRow {
224 + // Get all lease entries directly from the lease manager
225 + leaseEntries := serv.GetAllLeaseEntries()
226 +
227 + var rows []leaseRow
228 + now := time.Now()
229 +
230 + for _, leaseEntry := range leaseEntries {
231 + // Check if lease is still valid
232 + if now.After(leaseEntry.Expires) {
233 + continue
234 + }
235 +
236 + lease := leaseEntry.Lease
237 + identityID := string(lease.Identity.Id)
238 +
239 + // Calculate TTL
240 + ttl := time.Until(leaseEntry.Expires)
241 + ttlStr := ""
242 + if ttl > 0 {
243 + if ttl > time.Hour {
244 + ttlStr = fmt.Sprintf("%.0fh", ttl.Hours())
245 + } else if ttl > time.Minute {
246 + ttlStr = fmt.Sprintf("%.0fm", ttl.Minutes())
247 + } else {
248 + ttlStr = fmt.Sprintf("%.0fs", ttl.Seconds())
249 + }
250 + }
251 +
252 + // Format last seen time
253 + lastSeenStr := leaseEntry.LastSeen.Format("2006-01-02 15:04:05")
254 +
255 + // Check if connection is still active by checking if the connection ID exists in the connections map
256 + connected := serv.IsConnectionActive(leaseEntry.ConnectionID)
257 +
258 + // Use name from lease if available
259 + name := lease.Name
260 + if name == "" {
261 + name = "(unnamed)"
262 + }
263 +
264 + // Determine kind/type based on ALPN if available
265 + kind := "client"
266 + if len(lease.Alpn) > 0 {
267 + kind = lease.Alpn[0]
268 + }
269 +
270 + // Create DNS label from identity (first 8 chars for display)
271 + dnsLabel := identityID
272 + if len(dnsLabel) > 8 {
273 + dnsLabel = dnsLabel[:8] + "..."
274 + }
275 +
276 + // Create link for the lease
277 + link := fmt.Sprintf("/peer/%s", identityID)
278 +
279 + row := leaseRow{
280 + Peer: identityID,
281 + Name: name,
282 + Kind: kind,
283 + Connected: connected,
284 + DNS: dnsLabel,
285 + LastSeen: lastSeenStr,
286 + TTL: ttlStr,
287 + Link: link,
288 + }
289 +
290 + rows = append(rows, row)
291 + }
292 +
293 + return rows
294 +}
295 +
296 +var wsUpgrader = websocket.Upgrader{
297 + ReadBufferSize: 1024,
298 + WriteBufferSize: 1024,
299 + CheckOrigin: func(r *http.Request) bool {
300 + return true
301 + },
302 +}
303 +
304 var serverTmpl = template.Must(template.New("admin-index").Parse(`<!doctype html>
305 <html lang="ko">
306 <head>
@@ -340,111 +331,6 @@ var serverTmpl = template.Must(template.New("admin-index").Parse(`<!doctype html
331 .head { display:flex; align-items:center; justify-content:space-between; gap:12px }
332 .btn { display:inline-block; background:var(--primary); color:#fff; text-decoration:none; border-radius:10px; padding:10px 14px; font-weight:800; margin-top:8px }
333 </style>
343 - <script>
344 - // Register Service Worker for E2EE proxy
345 - (async () => {
346 - try {
347 - console.log('[RelayDNS] Registering Service Worker...');
348 - const registration = await navigator.serviceWorker.register('/sw-proxy.js');
349 - console.log('[RelayDNS] ✓ Service Worker registered');
350 -
351 - await navigator.serviceWorker.ready;
352 - console.log('[RelayDNS] ✓ Service Worker active');
353 -
354 - // Check WASM status
355 - const channel = new MessageChannel();
356 - const status = await new Promise((resolve) => {
357 - channel.port1.onmessage = (event) => resolve(event.data);
358 - registration.active.postMessage({ type: 'GET_STATUS' }, [channel.port2]);
359 - setTimeout(() => resolve({ success: false }), 2000);
360 - });
361 -
362 - if (status.success && status.status.wasmReady) {
363 - console.log('[RelayDNS] ✓ E2EE WASM ready!');
364 - } else {
365 - console.log('[RelayDNS] ⚠ WASM still loading...');
366 - }
367 - } catch (error) {
368 - console.error('[RelayDNS] Service Worker error:', error);
369 - }
370 - })();
371 -
372 - // Auto-refresh lease data every 5 seconds
373 - async function refreshLeases() {
374 - try {
375 - const response = await fetch('/api/leases');
376 - if (!response.ok) throw new Error('Failed to fetch leases');
377 -
378 - const leases = await response.json();
379 - updateLeaseDisplay(leases);
380 - } catch (error) {
381 - console.error('Error refreshing leases:', error);
382 - }
383 - }
384 -
385 - function updateLeaseDisplay(leases) {
386 - const main = document.querySelector('main');
387 -
388 - // Find the existing sections
389 - const serverSection = main.querySelector('.section');
390 - const existingLeaseSections = main.querySelectorAll('.section[id^="peer-"]');
391 - const noClientsSection = main.querySelector('.section:not([id])');
392 -
393 - // Remove existing lease sections and "no clients" section
394 - existingLeaseSections.forEach(section => section.remove());
395 - if (noClientsSection && noClientsSection.textContent.includes('No clients discovered')) {
396 - noClientsSection.remove();
397 - }
398 -
399 - // Add lease sections
400 - if (leases.length === 0) {
401 - const noClientsSection = document.createElement('section');
402 - noClientsSection.className = 'section';
403 - noClientsSection.innerHTML = '<div class="title">No clients discovered</div><div class="muted">Start a client and ensure bootstrap URLs point at this server\'s /relay WebSocket endpoint.</div>';
404 - main.appendChild(noClientsSection);
405 - } else {
406 - leases.forEach(lease => {
407 - const section = document.createElement('section');
408 - section.className = 'section';
409 - section.id = 'peer-' + lease.Peer;
410 - section.setAttribute('data-peer', lease.Peer);
411 - section.setAttribute('data-name', lease.Name);
412 -
413 - const connectedClass = lease.Connected ? 'ok' : 'bad';
414 - const connectedText = lease.Connected ? 'Connected' : 'Disconnected';
415 - const displayName = lease.Name || '(unnamed)';
416 -
417 - let html = '<div class="head"><div class="title">' + displayName + '</div><div><span class="muted" style="margin-right:8px">' + lease.Kind + '</span><span class="pill ' + connectedClass + '"><span class="dot"></span>' + connectedText + '</span></div></div>';
418 - if (lease.DNS) {
419 - html += '<div class="muted">DNS Label: <span class="mono">' + lease.DNS + '</span></div>';
420 - }
421 - html += '<div class="muted">Lease Identity</div><div class="mono">' + lease.Peer + '</div><div class="muted" style="margin-top:6px">Last seen: ' + lease.LastSeen;
422 - if (lease.TTL) {
423 - html += ' - TTL: ' + lease.TTL;
424 - }
425 - html += '</div><a class="btn" href="' + lease.Link + '">Open</a>';
426 - section.innerHTML = html;
427 -
428 - main.appendChild(section);
429 - });
430 - }
431 -
432 - // Update active clients count
433 - const activeCountElement = serverSection.querySelector('.muted');
434 - if (activeCountElement && activeCountElement.textContent.includes('Active clients:')) {
435 - activeCountElement.textContent = 'Active clients: ' + leases.length;
436 - }
437 - }
438 -
439 - // Start auto-refresh when page loads
440 - document.addEventListener('DOMContentLoaded', () => {
441 - // Initial refresh
442 - refreshLeases();
443 -
444 - // Set up interval for auto-refresh
445 - setInterval(refreshLeases, 5000);
446 - });
447 - </script>
334 </head>
335 <body>
336 <div class="wrap">
cmd/relay-server/wasm/README.md new
+39
@@ -0,0 +1,39 @@
1 +# RelayDNS WASM Client
2 +
3 +WebAssembly client for RelayDNS with End-to-End Encryption (E2EE).
4 +
5 +## Features
6 +
7 +- 🔒 **End-to-End Encryption**: Client-side E2EE using Ed25519 + X25519 + ChaCha20-Poly1305
8 +- 🌐 **WebSocket Transport**: Real-time bidirectional communication
9 +- 📦 **Protocol Support**: HTTP, WebSocket, TCP proxying through encrypted tunnels
10 +- 🎯 **Browser Native**: Runs directly in the browser using WebAssembly
11 +- ⚡ **High Performance**: Compiled Rust code for optimal performance
12 +
13 +## Building
14 +
15 +### Prerequisites
16 +
17 +- Rust toolchain (1.70+)
18 +- wasm-pack: `cargo install wasm-pack`
19 +
20 +### Build WASM Module
21 +
22 +**Linux/macOS:**
23 +```bash
24 +./build-wasm.sh
25 +```
26 +
27 +**Windows:**
28 +```cmd
29 +build-wasm.bat
30 +```
31 +
32 +This will:
33 +1. Build the WASM module with wasm-pack
34 +2. Copy output files to ../../sdk/wasm/
35 +3. Generate TypeScript definitions
36 +
37 +## License
38 +
39 +MIT OR Apache-2.0
cmd/relay-server/wasm/package.json renamed
cmd/relay-server/wasm/relaydns_wasm.d.ts renamed
+5 -5
@@ -183,11 +183,11 @@ export interface InitOutput {
183 readonly relayclient_getCredentialId: (a: number) => [number, number];
184 readonly relayclient_requestConnection: (a: number, b: number, c: number, d: number, e: number) => any;
185 readonly init: () => void;
186 - readonly wasm_bindgen__convert__closures_____invoke__h75a085a52d492ff4: (a: number, b: number, c: any) => void;
187 - readonly wasm_bindgen__closure__destroy__h2dcad6e62f01cec1: (a: number, b: number) => void;
188 - readonly wasm_bindgen__convert__closures_____invoke__hed2088bf6dd2c621: (a: number, b: number, c: any) => void;
189 - readonly wasm_bindgen__closure__destroy__h8eb17c158a55b496: (a: number, b: number) => void;
190 - readonly wasm_bindgen__convert__closures_____invoke__h404cda7fa36c69a6: (a: number, b: number, c: any, d: any) => void;
186 + readonly wasm_bindgen__convert__closures_____invoke__h2ce83fdd17154ebc: (a: number, b: number, c: any) => void;
187 + readonly wasm_bindgen__closure__destroy__h32885bf911f580c8: (a: number, b: number) => void;
188 + readonly wasm_bindgen__convert__closures_____invoke__h0c7f57f83b71ca0f: (a: number, b: number, c: any) => void;
189 + readonly wasm_bindgen__closure__destroy__h6c08fb85ab9cb9ad: (a: number, b: number) => void;
190 + readonly wasm_bindgen__convert__closures_____invoke__h88872580b620af7b: (a: number, b: number, c: any, d: any) => void;
191 readonly __wbindgen_malloc: (a: number, b: number) => number;
192 readonly __wbindgen_realloc: (a: number, b: number, c: number, d: number) => number;
193 readonly __wbindgen_exn_store: (a: number) => void;
cmd/relay-server/wasm/relaydns_wasm.js renamed
+11 -11
@@ -243,16 +243,16 @@ export function init() {
243 wasm.init();
244 }
245
246 -function wasm_bindgen__convert__closures_____invoke__h75a085a52d492ff4(arg0, arg1, arg2) {
247 - wasm.wasm_bindgen__convert__closures_____invoke__h75a085a52d492ff4(arg0, arg1, arg2);
246 +function wasm_bindgen__convert__closures_____invoke__h2ce83fdd17154ebc(arg0, arg1, arg2) {
247 + wasm.wasm_bindgen__convert__closures_____invoke__h2ce83fdd17154ebc(arg0, arg1, arg2);
248 }
249
250 -function wasm_bindgen__convert__closures_____invoke__hed2088bf6dd2c621(arg0, arg1, arg2) {
251 - wasm.wasm_bindgen__convert__closures_____invoke__hed2088bf6dd2c621(arg0, arg1, arg2);
250 +function wasm_bindgen__convert__closures_____invoke__h0c7f57f83b71ca0f(arg0, arg1, arg2) {
251 + wasm.wasm_bindgen__convert__closures_____invoke__h0c7f57f83b71ca0f(arg0, arg1, arg2);
252 }
253
254 -function wasm_bindgen__convert__closures_____invoke__h404cda7fa36c69a6(arg0, arg1, arg2, arg3) {
255 - wasm.wasm_bindgen__convert__closures_____invoke__h404cda7fa36c69a6(arg0, arg1, arg2, arg3);
254 +function wasm_bindgen__convert__closures_____invoke__h88872580b620af7b(arg0, arg1, arg2, arg3) {
255 + wasm.wasm_bindgen__convert__closures_____invoke__h88872580b620af7b(arg0, arg1, arg2, arg3);
256 }
257
258 const __wbindgen_enum_BinaryType = ["blob", "arraybuffer"];
@@ -997,7 +997,7 @@ function __wbg_get_imports() {
997 const a = state0.a;
998 state0.a = 0;
999 try {
1000 - return wasm_bindgen__convert__closures_____invoke__h404cda7fa36c69a6(a, state0.b, arg0, arg1);
1000 + return wasm_bindgen__convert__closures_____invoke__h88872580b620af7b(a, state0.b, arg0, arg1);
1001 } finally {
1002 state0.a = a;
1003 }
@@ -1211,7 +1211,7 @@ function __wbg_get_imports() {
1211 };
1212 imports.wbg.__wbindgen_cast_3a4c91c0888a208b = function(arg0, arg1) {
1213 // Cast intrinsic for `Closure(Closure { dtor_idx: 1, function: Function { arguments: [NamedExternref("CloseEvent")], shim_idx: 2, ret: Unit, inner_ret: Some(Unit) }, mutable: true }) -> Externref`.
1214 - const ret = makeMutClosure(arg0, arg1, wasm.wasm_bindgen__closure__destroy__h2dcad6e62f01cec1, wasm_bindgen__convert__closures_____invoke__h75a085a52d492ff4);
1214 + const ret = makeMutClosure(arg0, arg1, wasm.wasm_bindgen__closure__destroy__h32885bf911f580c8, wasm_bindgen__convert__closures_____invoke__h2ce83fdd17154ebc);
1215 return ret;
1216 };
1217 imports.wbg.__wbindgen_cast_4625c577ab2ec9ee = function(arg0) {
@@ -1221,7 +1221,7 @@ function __wbg_get_imports() {
1221 };
1222 imports.wbg.__wbindgen_cast_46d6ccd6e2a13afa = function(arg0, arg1) {
1223 // Cast intrinsic for `Closure(Closure { dtor_idx: 1, function: Function { arguments: [NamedExternref("MessageEvent")], shim_idx: 2, ret: Unit, inner_ret: Some(Unit) }, mutable: true }) -> Externref`.
1224 - const ret = makeMutClosure(arg0, arg1, wasm.wasm_bindgen__closure__destroy__h2dcad6e62f01cec1, wasm_bindgen__convert__closures_____invoke__h75a085a52d492ff4);
1224 + const ret = makeMutClosure(arg0, arg1, wasm.wasm_bindgen__closure__destroy__h32885bf911f580c8, wasm_bindgen__convert__closures_____invoke__h2ce83fdd17154ebc);
1225 return ret;
1226 };
1227 imports.wbg.__wbindgen_cast_77bc3e92745e9a35 = function(arg0, arg1) {
@@ -1238,7 +1238,7 @@ function __wbg_get_imports() {
1238 };
1239 imports.wbg.__wbindgen_cast_a4bd8eb24f626613 = function(arg0, arg1) {
1240 // Cast intrinsic for `Closure(Closure { dtor_idx: 1, function: Function { arguments: [NamedExternref("ErrorEvent")], shim_idx: 2, ret: Unit, inner_ret: Some(Unit) }, mutable: true }) -> Externref`.
1241 - const ret = makeMutClosure(arg0, arg1, wasm.wasm_bindgen__closure__destroy__h2dcad6e62f01cec1, wasm_bindgen__convert__closures_____invoke__h75a085a52d492ff4);
1241 + const ret = makeMutClosure(arg0, arg1, wasm.wasm_bindgen__closure__destroy__h32885bf911f580c8, wasm_bindgen__convert__closures_____invoke__h2ce83fdd17154ebc);
1242 return ret;
1243 };
1244 imports.wbg.__wbindgen_cast_cb9088102bce6b30 = function(arg0, arg1) {
@@ -1248,7 +1248,7 @@ function __wbg_get_imports() {
1248 };
1249 imports.wbg.__wbindgen_cast_d17062ab4b8c9928 = function(arg0, arg1) {
1250 // Cast intrinsic for `Closure(Closure { dtor_idx: 253, function: Function { arguments: [Externref], shim_idx: 254, ret: Unit, inner_ret: Some(Unit) }, mutable: true }) -> Externref`.
1251 - const ret = makeMutClosure(arg0, arg1, wasm.wasm_bindgen__closure__destroy__h8eb17c158a55b496, wasm_bindgen__convert__closures_____invoke__hed2088bf6dd2c621);
1251 + const ret = makeMutClosure(arg0, arg1, wasm.wasm_bindgen__closure__destroy__h6c08fb85ab9cb9ad, wasm_bindgen__convert__closures_____invoke__h0c7f57f83b71ca0f);
1252 return ret;
1253 };
1254 imports.wbg.__wbindgen_cast_d6cd19b81560fd6e = function(arg0) {
cmd/relay-server/wasm/relaydns_wasm_bg.wasm renamed
Binary files a/sdk/wasm/relaydns_wasm_bg.wasm and b/cmd/relay-server/wasm/relaydns_wasm_bg.wasm differ
docker-compose.yml
+1 -1
@@ -4,7 +4,7 @@ services:
4 context: .
5 dockerfile: Dockerfile
6 command:
7 - - "--http-port"
7 + - "--port"
8 - "4017"
9 ports:
10 - "4017:4017"
relaydns/wasm/build-wasm.bat deleted
-53
@@ -1,53 +0,0 @@
1 -@echo off
2 -setlocal
3 -
4 -REM Build script for RelayDNS WASM client
5 -echo ====================================
6 -echo Building RelayDNS WASM Client
7 -echo ====================================
8 -echo.
9 -
10 -REM Get the directory where this script is located
11 -set SCRIPT_DIR=%~dp0
12 -cd /d "%SCRIPT_DIR%"
13 -
14 -echo Current directory: %CD%
15 -echo.
16 -
17 -REM Check if Cargo.toml exists
18 -if not exist "Cargo.toml" (
19 - echo Error: Cargo.toml not found in current directory!
20 - echo Current directory: %CD%
21 - exit /b 1
22 -)
23 -
24 -echo [1/3] Building WASM module...
25 -wasm-pack build --target web --out-dir pkg
26 -if %ERRORLEVEL% neq 0 (
27 - echo.
28 - echo Error: Build failed!
29 - exit /b %ERRORLEVEL%
30 -)
31 -
32 -echo.
33 -echo [2/3] Creating SDK directory...
34 -set SDK_DIR=..\..\sdk\wasm
35 -if not exist "%SDK_DIR%" mkdir "%SDK_DIR%"
36 -
37 -echo [3/3] Copying files to SDK...
38 -copy /Y pkg\relaydns_wasm.js "%SDK_DIR%\"
39 -copy /Y pkg\relaydns_wasm_bg.wasm "%SDK_DIR%\"
40 -copy /Y pkg\relaydns_wasm.d.ts "%SDK_DIR%\"
41 -copy /Y pkg\package.json "%SDK_DIR%\"
42 -
43 -echo.
44 -echo ====================================
45 -echo Build Complete!
46 -echo ====================================
47 -echo.
48 -echo Output location: %SDK_DIR%
49 -echo.
50 -
51 -dir /B "%SDK_DIR%\relaydns_wasm*"
52 -
53 -endlocal
relaydns/wasm/build-wasm.sh deleted
-39
@@ -1,39 +0,0 @@
1 -#!/bin/bash
2 -# Build script for RelayDNS WASM client
3 -# Builds the WASM module and copies output to SDK directory
4 -
5 -set -e
6 -
7 -echo "🔨 Building RelayDNS WASM client..."
8 -
9 -# Build with wasm-pack
10 -wasm-pack build --target web --out-dir pkg
11 -
12 -echo "📦 Build complete!"
13 -
14 -# Create SDK output directory if it doesn't exist
15 -SDK_DIR="../../sdk/wasm"
16 -mkdir -p "$SDK_DIR"
17 -
18 -echo "📋 Copying files to SDK directory: $SDK_DIR"
19 -
20 -# Copy WASM output files
21 -cp pkg/relaydns_wasm.js "$SDK_DIR/"
22 -cp pkg/relaydns_wasm_bg.wasm "$SDK_DIR/"
23 -cp pkg/relaydns_wasm.d.ts "$SDK_DIR/"
24 -cp pkg/package.json "$SDK_DIR/"
25 -
26 -# Copy README if exists
27 -if [ -f "README.md" ]; then
28 - cp README.md "$SDK_DIR/"
29 -fi
30 -
31 -echo "✅ WASM files copied to $SDK_DIR"
32 -echo ""
33 -echo "📁 Output files:"
34 -ls -lh "$SDK_DIR"
35 -
36 -echo ""
37 -echo "🎉 Build and copy complete!"
38 -echo ""
39 -echo "You can now use the WASM module from: $SDK_DIR"
sdk/wasm/README.md deleted
-3
@@ -1,3 +0,0 @@
1 -# RelayDNS WASM SDK
2 -
3 -Compiled WebAssembly module for RelayDNS with E2EE support.