@moq/web-transport 0.1.0 → 0.1.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/README.md CHANGED
@@ -1,63 +1,29 @@
1
1
  # @moq/web-transport
2
2
 
3
- WebTransport for Node.js, powered by QUIC and HTTP/3.
3
+ WebTransport for Node.js, powered by native QUIC/HTTP3 via NAPI-RS.
4
4
 
5
- This package provides both a client-side `WebTransport` polyfill and a server implementation.
5
+ Provides a custom client and server API for setup, then exposes the standard [W3C WebTransport API](https://www.w3.org/TR/webtransport/) for streams, datagrams, and session lifecycle.
6
6
 
7
- ## Install
7
+ ## Installation
8
8
 
9
9
  ```bash
10
- npm install @moq/web-transport
10
+ bun add @moq/web-transport
11
11
  ```
12
12
 
13
13
  ## Client
14
14
 
15
- The `Session` class implements the [W3C WebTransport API](https://www.w3.org/TR/webtransport/).
15
+ Connect to a WebTransport server using the `Session` class, which implements the W3C `WebTransport` interface:
16
16
 
17
17
  ```ts
18
18
  import Session from "@moq/web-transport";
19
19
 
20
- const session = new Session("https://example.com:4443");
20
+ const session = new Session("https://example.com:4443/path");
21
21
  await session.ready;
22
22
 
23
- // Bidirectional streams
24
- const bidi = await session.createBidirectionalStream();
25
- const writer = bidi.writable.getWriter();
26
- await writer.write(new Uint8Array([1, 2, 3]));
27
- await writer.close();
28
-
29
- // Unidirectional streams
30
- const uni = await session.createUnidirectionalStream();
31
- const uniWriter = uni.getWriter();
32
- await uniWriter.write(new Uint8Array([4, 5, 6]));
33
- await uniWriter.close();
34
-
35
- // Datagrams
36
- const dgWriter = session.datagrams.writable.getWriter();
37
- await dgWriter.write(new Uint8Array([7, 8, 9]));
38
-
39
- // Incoming streams
40
- for await (const recv of session.incomingUnidirectionalStreams) {
41
- const reader = recv.getReader();
42
- // read from reader...
43
- }
44
-
45
- session.close();
23
+ // Use the standard W3C WebTransport API from here on
46
24
  ```
47
25
 
48
- ### Polyfill
49
-
50
- Use `install()` to register `Session` as the global `WebTransport` if one doesn't already exist:
51
-
52
- ```ts
53
- import { install } from "@moq/web-transport";
54
- install();
55
-
56
- // Now use the standard WebTransport API
57
- const session = new WebTransport("https://example.com:4443");
58
- ```
59
-
60
- ### Certificate Options
26
+ ### Certificate options
61
27
 
62
28
  ```ts
63
29
  // Skip certificate verification (testing only!)
@@ -66,32 +32,110 @@ const session = new Session("https://localhost:4443", {
66
32
  });
67
33
 
68
34
  // Pin to specific certificate hashes
69
- const session = new Session("https://example.com:4443", {
35
+ const session = new Session("https://localhost:4443", {
70
36
  serverCertificateHashes: [
71
- { algorithm: "sha-256", value: hashBuffer },
37
+ { algorithm: "sha-256", value: certHash },
72
38
  ],
73
39
  });
74
40
  ```
75
41
 
42
+ ### Polyfill
43
+
44
+ Install `Session` as the global `WebTransport` for libraries that expect the browser API:
45
+
46
+ ```ts
47
+ import { install } from "@moq/web-transport";
48
+
49
+ install(); // globalThis.WebTransport = Session (no-op if already defined)
50
+ ```
51
+
76
52
  ## Server
77
53
 
54
+ Use `Server` to accept incoming connections. Each `Request` can be accepted (returning a W3C `Session`) or rejected:
55
+
78
56
  ```ts
79
57
  import { Server } from "@moq/web-transport";
80
58
  import fs from "node:fs";
81
59
 
82
- const certPem = fs.readFileSync("cert.pem");
83
- const keyPem = fs.readFileSync("key.pem");
60
+ const cert = fs.readFileSync("cert.pem");
61
+ const key = fs.readFileSync("key.pem");
84
62
 
85
- const server = Server.bind("[::]:4443", certPem, keyPem);
63
+ const server = Server.bind("[::]:4443", cert, key);
86
64
 
87
65
  while (true) {
88
66
  const request = await server.accept();
89
67
  if (!request) break;
90
68
 
91
69
  const url = await request.url;
92
- console.log("incoming request:", url);
70
+ console.log("incoming session:", url);
71
+
72
+ const session = await request.ok(); // or request.reject(404)
93
73
 
94
- const session = await request.ok();
95
- // Use session just like the client-side API
74
+ // Use the standard W3C WebTransport API from here on
75
+ handleSession(session);
96
76
  }
77
+
78
+ // Stop accepting new connections
79
+ server.close();
97
80
  ```
81
+
82
+ ## W3C WebTransport API
83
+
84
+ Once you have a `Session` (client or server-side), the API follows the [W3C WebTransport spec](https://www.w3.org/TR/webtransport/):
85
+
86
+ ### Bidirectional streams
87
+
88
+ ```ts
89
+ // Open a bidirectional stream
90
+ const stream = await session.createBidirectionalStream();
91
+ const writer = stream.writable.getWriter();
92
+ await writer.write(new Uint8Array([1, 2, 3]));
93
+ await writer.close();
94
+
95
+ // Accept incoming bidirectional streams
96
+ const reader = session.incomingBidirectionalStreams.getReader();
97
+ const { value: incoming } = await reader.read();
98
+ const data = await new Response(incoming.readable).arrayBuffer();
99
+ ```
100
+
101
+ ### Unidirectional streams
102
+
103
+ ```ts
104
+ // Open a unidirectional stream
105
+ const writable = await session.createUnidirectionalStream();
106
+ const writer = writable.getWriter();
107
+ await writer.write(new TextEncoder().encode("hello"));
108
+ await writer.close();
109
+
110
+ // Accept incoming unidirectional streams
111
+ const reader = session.incomingUnidirectionalStreams.getReader();
112
+ const { value: readable } = await reader.read();
113
+ const text = await new Response(readable).text();
114
+ ```
115
+
116
+ ### Datagrams
117
+
118
+ ```ts
119
+ // Send datagrams
120
+ const writer = session.datagrams.writable.getWriter();
121
+ await writer.write(new Uint8Array([0x01, 0x02]));
122
+
123
+ // Receive datagrams
124
+ const reader = session.datagrams.readable.getReader();
125
+ const { value: datagram } = await reader.read();
126
+ ```
127
+
128
+ ### Closing
129
+
130
+ ```ts
131
+ // Close gracefully
132
+ session.close({ closeCode: 0, reason: "done" });
133
+
134
+ // Wait for the session to close
135
+ const info = await session.closed;
136
+ console.log(info.closeCode, info.reason);
137
+ ```
138
+
139
+ ## License
140
+
141
+ MIT OR Apache-2.0
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@moq/web-transport",
3
- "version": "0.1.0",
3
+ "version": "0.1.1",
4
4
  "description": "WebTransport polyfill for Node.js via QUIC/HTTP3",
5
5
  "type": "module",
6
6
  "license": "(MIT OR Apache-2.0)",
@@ -36,11 +36,11 @@
36
36
  "@types/node": "^24.3.0"
37
37
  },
38
38
  "optionalDependencies": {
39
- "@moq/web-transport-darwin-x64": "0.1.0",
40
- "@moq/web-transport-darwin-arm64": "0.1.0",
41
- "@moq/web-transport-win32-x64-msvc": "0.1.0",
42
- "@moq/web-transport-linux-x64-gnu": "0.1.0",
43
- "@moq/web-transport-linux-arm64-gnu": "0.1.0"
39
+ "@moq/web-transport-darwin-x64": "0.1.1",
40
+ "@moq/web-transport-darwin-arm64": "0.1.1",
41
+ "@moq/web-transport-win32-x64-msvc": "0.1.1",
42
+ "@moq/web-transport-linux-x64-gnu": "0.1.1",
43
+ "@moq/web-transport-linux-arm64-gnu": "0.1.1"
44
44
  },
45
45
  "keywords": [
46
46
  "webtransport",
Binary file