@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 +94 -50
- package/package.json +6 -6
- package/web-transport.win32-x64-msvc.node +0 -0
package/README.md
CHANGED
|
@@ -1,63 +1,29 @@
|
|
|
1
1
|
# @moq/web-transport
|
|
2
2
|
|
|
3
|
-
WebTransport for Node.js, powered by QUIC
|
|
3
|
+
WebTransport for Node.js, powered by native QUIC/HTTP3 via NAPI-RS.
|
|
4
4
|
|
|
5
|
-
|
|
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
|
-
##
|
|
7
|
+
## Installation
|
|
8
8
|
|
|
9
9
|
```bash
|
|
10
|
-
|
|
10
|
+
bun add @moq/web-transport
|
|
11
11
|
```
|
|
12
12
|
|
|
13
13
|
## Client
|
|
14
14
|
|
|
15
|
-
|
|
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
|
-
//
|
|
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
|
-
###
|
|
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://
|
|
35
|
+
const session = new Session("https://localhost:4443", {
|
|
70
36
|
serverCertificateHashes: [
|
|
71
|
-
{ algorithm: "sha-256", value:
|
|
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
|
|
83
|
-
const
|
|
60
|
+
const cert = fs.readFileSync("cert.pem");
|
|
61
|
+
const key = fs.readFileSync("key.pem");
|
|
84
62
|
|
|
85
|
-
const server = Server.bind("[::]:4443",
|
|
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
|
|
70
|
+
console.log("incoming session:", url);
|
|
71
|
+
|
|
72
|
+
const session = await request.ok(); // or request.reject(404)
|
|
93
73
|
|
|
94
|
-
|
|
95
|
-
|
|
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.
|
|
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.
|
|
40
|
-
"@moq/web-transport-darwin-arm64": "0.1.
|
|
41
|
-
"@moq/web-transport-win32-x64-msvc": "0.1.
|
|
42
|
-
"@moq/web-transport-linux-x64-gnu": "0.1.
|
|
43
|
-
"@moq/web-transport-linux-arm64-gnu": "0.1.
|
|
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
|