Skip to content

Commit 62fd026

Browse files
authored
Fix the example for guest. (#126)
* Fix the example for guest. * Add biome to format everything. * Improve some TS stuff.
1 parent 8939807 commit 62fd026

File tree

16 files changed

+948
-333
lines changed

16 files changed

+948
-333
lines changed

.gitignore

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,4 @@
11
target
22
Cargo.lock
33
.direnv/
4+
node_modules

biome.jsonc

Lines changed: 39 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,39 @@
1+
// This has to be in the root otherwise the VSCode plugin will not work out of the box.
2+
{
3+
"$schema": "https://biomejs.dev/schemas/2.3.6/schema.json",
4+
"vcs": {
5+
"enabled": true,
6+
"clientKind": "git",
7+
"useIgnoreFile": true
8+
},
9+
"formatter": {
10+
// We repeat the editorconfig settings here because biome has spotty mono-repo support.
11+
// "useEditorconfig": true,
12+
"lineWidth": 120,
13+
"indentStyle": "tab",
14+
"indentWidth": 4,
15+
"lineEnding": "lf"
16+
},
17+
"linter": {
18+
"rules": {
19+
"a11y": {
20+
// We mostly make headless <video> elements.
21+
"useMediaCaption": "off"
22+
},
23+
"style": {
24+
"useNodejsImportProtocol": "off"
25+
},
26+
"suspicious": {
27+
// Until Tailwind support lands (very soon)
28+
"noUnknownAtRules": "off",
29+
// Some runtimes need ts-ignore
30+
"noTsIgnore": "off"
31+
}
32+
}
33+
},
34+
"javascript": {
35+
"formatter": {
36+
"quoteStyle": "double"
37+
}
38+
}
39+
}

bun.lock

Lines changed: 548 additions & 0 deletions
Large diffs are not rendered by default.

flake.nix

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -27,6 +27,7 @@
2727
pkgs.cargo-edit
2828
pkgs.cargo-hack
2929
pkgs.just
30+
pkgs.bun
3031
pkgs.pkg-config
3132
pkgs.glib
3233
pkgs.gtk3

justfile

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -44,6 +44,10 @@ check:
4444
# requires: cargo install cargo-sort
4545
cargo sort --workspace --check
4646

47+
# Check JavaScript/TypeScript with biome
48+
bun install
49+
bun run check
50+
4751
# Run any CI tests
4852
test:
4953
cargo test --workspace --all-targets --all-features
@@ -70,6 +74,10 @@ fix:
7074
# And of course, make sure the formatting is correct.
7175
cargo fmt --all
7276

77+
# Fix JavaScript/TypeScript with biome
78+
bun install
79+
bun run fix
80+
7381
# Upgrade any tooling
7482
upgrade:
7583
rustup upgrade

package.json

Lines changed: 16 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,16 @@
1+
{
2+
"name": "web-transport-workspace",
3+
"private": true,
4+
"type": "module",
5+
"workspaces": [
6+
"web-demo",
7+
"web-transport-ws"
8+
],
9+
"scripts": {
10+
"check": "biome check",
11+
"fix": "biome check --fix"
12+
},
13+
"devDependencies": {
14+
"@biomejs/biome": "^2.2.2"
15+
}
16+
}

web-demo/client.js

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -59,14 +59,14 @@ async function run() {
5959
await writer.close();
6060
writer.releaseLock();
6161

62-
log("send: " + msg);
62+
log(`send: ${msg}`);
6363

6464
// Read a message from it
6565
// TODO handle partial reads
6666
const { value } = await reader.read();
6767

6868
const recv = new TextDecoder().decode(value);
69-
log("recv: " + recv);
69+
log(`recv: ${recv}`);
7070

7171
transport.close();
7272
log("closed");

web-demo/package.json

Lines changed: 6 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,8 @@
11
{
2-
"devDependencies": {
3-
"@parcel/transformer-inline-string": "^2.10.3",
4-
"parcel": "^2.10.3"
5-
}
2+
"name": "web-demo",
3+
"private": true,
4+
"devDependencies": {
5+
"@parcel/transformer-inline-string": "^2.10.3",
6+
"parcel": "^2.10.3"
7+
}
68
}

web-transport-ws/examples/client.ts

Lines changed: 71 additions & 74 deletions
Original file line numberDiff line numberDiff line change
@@ -11,84 +11,81 @@ globalThis.WebTransport = WebTransportWs;
1111
globalThis.WebSocket = WebSocket;
1212

1313
async function main() {
14-
// @ts-expect-error too lazy to debug node types
1514
const url = process.argv[2] || "http://localhost:3000";
1615

1716
console.log(`Connecting to ${url}...`);
1817

19-
// Create a new WebTransport connection
20-
const transport = new WebTransport(url);
21-
22-
// Add error handling for closed promise
23-
transport.closed.then(
24-
(info) => console.log("Transport closed with info:", info),
25-
(error) => console.error("Transport closed with error:", error)
26-
);
27-
28-
// Wait for the connection to be ready
29-
await transport.ready;
30-
console.log("✓ Connected successfully");
31-
32-
// Example 1: Send data on a unidirectional stream
33-
console.log("\n--- Sending unidirectional stream ---");
34-
const sendStream = await transport.createUnidirectionalStream();
35-
const writer = sendStream.getWriter();
36-
37-
const message = "Hello from Node.js client!";
38-
await writer.write(new TextEncoder().encode(message));
39-
await writer.close();
40-
console.log(`✓ Sent: "${message}"`);
41-
42-
// Example 2: Create and use a bidirectional stream
43-
console.log("\n--- Creating bidirectional stream ---");
44-
const biStream = await transport.createBidirectionalStream();
45-
46-
// Send data
47-
const biWriter = biStream.writable.getWriter();
48-
const request = "ping";
49-
await biWriter.write(new TextEncoder().encode(request));
50-
console.log(`✓ Sent: "${request}"`);
51-
52-
// Read response
53-
const biReader = biStream.readable.getReader();
54-
const { value, done } = await biReader.read();
55-
if (!done && value) {
56-
const response = new TextDecoder().decode(value);
57-
console.log(`✓ Received: "${response}"`);
58-
}
59-
60-
await biWriter.close();
61-
biReader.releaseLock();
62-
63-
// Example 3: Listen for incoming streams
64-
console.log("\n--- Listening for incoming streams ---");
65-
66-
// Handle incoming unidirectional streams
67-
const uni: ReadableStreamDefaultReader<ReadableStream<Uint8Array>> = transport.incomingUnidirectionalStreams.getReader();
68-
69-
const { value: stream } = await uni.read();
70-
if (!stream) throw new Error("No stream received");
71-
72-
const reader = stream.getReader();
73-
const { value: data } = await reader.read();
74-
if (!data) throw new Error("No data received");
75-
76-
console.log(
77-
`✓ Received uni stream: "${new TextDecoder().decode(data)}"`,
78-
);
79-
reader.releaseLock();
80-
uni.releaseLock();
81-
82-
// Close the connection
83-
console.log("\n--- Closing connection ---");
84-
transport.close({
85-
closeCode: 0,
86-
reason: "Client finished",
87-
});
88-
89-
// Wait for closed
90-
const closeInfo = await transport.closed;
91-
console.log(`✓ Connection closed: ${closeInfo.reason || "No reason"}`);
18+
// Create a new WebTransport connection
19+
const transport = new WebTransport(url);
20+
21+
// Add error handling for closed promise
22+
transport.closed.then(
23+
(info) => console.log("Transport closed with info:", info),
24+
(error) => console.error("Transport closed with error:", error),
25+
);
26+
27+
// Wait for the connection to be ready
28+
await transport.ready;
29+
console.log("✓ Connected successfully");
30+
31+
// Example 1: Send data on a unidirectional stream
32+
console.log("\n--- Sending unidirectional stream ---");
33+
const sendStream = await transport.createUnidirectionalStream();
34+
const writer = sendStream.getWriter();
35+
36+
const message = "Hello from Node.js client!";
37+
await writer.write(new TextEncoder().encode(message));
38+
await writer.close();
39+
console.log(`✓ Sent: "${message}"`);
40+
41+
// Example 2: Create and use a bidirectional stream
42+
console.log("\n--- Creating bidirectional stream ---");
43+
const biStream = await transport.createBidirectionalStream();
44+
45+
// Send data
46+
const biWriter = biStream.writable.getWriter();
47+
const request = "ping";
48+
await biWriter.write(new TextEncoder().encode(request));
49+
await biWriter.close();
50+
console.log(`✓ Sent: "${request}"`);
51+
52+
// Read response
53+
const biReader = biStream.readable.getReader();
54+
const { value, done } = await biReader.read();
55+
if (!done && value) {
56+
const response = new TextDecoder().decode(value);
57+
console.log(`✓ Received: "${response}"`);
58+
}
59+
biReader.releaseLock();
60+
61+
// Example 3: Listen for incoming streams
62+
console.log("\n--- Listening for incoming streams ---");
63+
64+
// Handle incoming unidirectional streams
65+
const uni: ReadableStreamDefaultReader<ReadableStream<Uint8Array>> =
66+
transport.incomingUnidirectionalStreams.getReader();
67+
68+
const { value: stream } = await uni.read();
69+
if (!stream) throw new Error("No stream received");
70+
71+
const reader = stream.getReader();
72+
const { value: data } = await reader.read();
73+
if (!data) throw new Error("No data received");
74+
75+
console.log(`✓ Received uni stream: "${new TextDecoder().decode(data)}"`);
76+
reader.releaseLock();
77+
uni.releaseLock();
78+
79+
// Close the connection
80+
console.log("\n--- Closing connection ---");
81+
transport.close({
82+
closeCode: 0,
83+
reason: "Client finished",
84+
});
85+
86+
// Wait for closed
87+
const closeInfo = await transport.closed;
88+
console.log(`✓ Connection closed: ${closeInfo.reason || "No reason"}`);
9289
}
9390

9491
// Run the client

web-transport-ws/package.json

Lines changed: 35 additions & 35 deletions
Original file line numberDiff line numberDiff line change
@@ -1,37 +1,37 @@
11
{
2-
"name": "@kixelated/web-transport-ws",
3-
"author": "Luke Curley <[email protected]>",
4-
"version": "0.1.2",
5-
"description": "WebTransport polyfill using WebSockets",
6-
"type": "module",
7-
"license": "(MIT OR Apache-2.0)",
8-
"repository": "github:kixelated/web-transport",
9-
"exports": {
10-
".": "./src/index.ts"
11-
},
12-
"types": "./src/index.ts",
13-
"files": [
14-
"./src"
15-
],
16-
"scripts": {
17-
"build": "rimraf dist && tsc && tsx scripts/package.ts",
18-
"dev": "tsc --watch",
19-
"check": "tsc --noEmit",
20-
"example": "tsx examples/client.ts",
21-
"release": "tsx scripts/release.ts"
22-
},
23-
"devDependencies": {
24-
"typescript": "^5.9.2",
25-
"ws": "^8.16.0",
26-
"rimraf": "^6.0.1",
27-
"@types/node": "^24.3.0",
28-
"tsx": "^4.20.5"
29-
},
30-
"keywords": [
31-
"webtransport",
32-
"websocket",
33-
"polyfill",
34-
"quic",
35-
"streams"
36-
]
2+
"name": "@kixelated/web-transport-ws",
3+
"author": "Luke Curley <[email protected]>",
4+
"version": "0.1.2",
5+
"description": "WebTransport polyfill using WebSockets",
6+
"type": "module",
7+
"license": "(MIT OR Apache-2.0)",
8+
"repository": "github:kixelated/web-transport",
9+
"exports": {
10+
".": "./src/index.ts"
11+
},
12+
"types": "./src/index.ts",
13+
"files": [
14+
"./src"
15+
],
16+
"scripts": {
17+
"build": "rimraf dist && tsc && tsx scripts/package.ts",
18+
"dev": "tsc --watch",
19+
"check": "tsc --noEmit",
20+
"example": "tsx examples/client.ts",
21+
"release": "tsx scripts/release.ts"
22+
},
23+
"devDependencies": {
24+
"typescript": "^5.9.2",
25+
"ws": "^8.16.0",
26+
"rimraf": "^6.0.1",
27+
"@types/node": "^24.3.0",
28+
"tsx": "^4.20.5"
29+
},
30+
"keywords": [
31+
"webtransport",
32+
"websocket",
33+
"polyfill",
34+
"quic",
35+
"streams"
36+
]
3737
}

0 commit comments

Comments
 (0)