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.