@ldtr/nestjs-webtransport 0.0.4 → 0.0.6
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 +32 -2
- package/dist/index.cjs +39 -37
- package/dist/index.d.cts +33 -19
- package/package.json +1 -1
package/README.md
CHANGED
|
@@ -10,7 +10,7 @@ npm install @ldtr/nestjs-webtransport
|
|
|
10
10
|
Usage
|
|
11
11
|
=====
|
|
12
12
|
|
|
13
|
-
|
|
13
|
+
First, declare a server:
|
|
14
14
|
```ts
|
|
15
15
|
import {
|
|
16
16
|
WtSession,
|
|
@@ -40,7 +40,10 @@ export class MainWebTransportServer implements WebTransportServerOptionsFactory
|
|
|
40
40
|
}
|
|
41
41
|
}
|
|
42
42
|
}
|
|
43
|
+
```
|
|
43
44
|
|
|
45
|
+
then, declare a gateway:
|
|
46
|
+
```ts
|
|
44
47
|
@WebTransportGateway({ server: "main", path: "/events" })
|
|
45
48
|
export class EventsGateway implements WebTransportGatewayLifecycle {
|
|
46
49
|
async onSession(session: WtSession): Promise<void> {
|
|
@@ -109,4 +112,31 @@ import { Module } from "@nestjs/common"
|
|
|
109
112
|
})
|
|
110
113
|
export class AppModule {
|
|
111
114
|
}
|
|
112
|
-
```
|
|
115
|
+
```
|
|
116
|
+
|
|
117
|
+
Session and stream data
|
|
118
|
+
=======================
|
|
119
|
+
|
|
120
|
+
Gateways are singleton providers in NestJS. Do not store session-specific or stream-specific state in gateway class properties. Instead, use the `data` object available on sessions and streams.
|
|
121
|
+
|
|
122
|
+
You can type this data by passing a generic type to `WebTransportGatewayLifecycle`:
|
|
123
|
+
|
|
124
|
+
```ts
|
|
125
|
+
import {
|
|
126
|
+
WtSession,
|
|
127
|
+
WtStreamRW,
|
|
128
|
+
type GatewayData,
|
|
129
|
+
type WebTransportGatewayLifecycle
|
|
130
|
+
} from "@ldtr/nestjs-webtransport"
|
|
131
|
+
|
|
132
|
+
type EventsGatewayData = {
|
|
133
|
+
session: {
|
|
134
|
+
connectedAt: Date }
|
|
135
|
+
}
|
|
136
|
+
|
|
137
|
+
@WebTransportGateway({ server: "main", path: "/events" })
|
|
138
|
+
export class EventsGateway implements WebTransportGatewayLifecycle<EventsGatewayData> {
|
|
139
|
+
async onSession(session: WtSession<EventsGatewayData>): Promise<void> {
|
|
140
|
+
session.data = { connectedAt: new Date() }
|
|
141
|
+
}
|
|
142
|
+
}
|
package/dist/index.cjs
CHANGED
|
@@ -120,6 +120,7 @@ var WritableStreamHandler = class extends AbstractStreamHandler {
|
|
|
120
120
|
var AbstractWtStream = class {
|
|
121
121
|
session;
|
|
122
122
|
webTransportStream;
|
|
123
|
+
data;
|
|
123
124
|
constructor(session, webTransportStream) {
|
|
124
125
|
this.session = session;
|
|
125
126
|
this.webTransportStream = webTransportStream;
|
|
@@ -239,6 +240,41 @@ let WebTransportServerExplorer = class WebTransportServerExplorer {
|
|
|
239
240
|
};
|
|
240
241
|
WebTransportServerExplorer = __decorate([(0, _nestjs_common.Injectable)(), __decorateMetadata("design:paramtypes", [typeof _nestjs_core.DiscoveryService === "undefined" ? Object : _nestjs_core.DiscoveryService])], WebTransportServerExplorer);
|
|
241
242
|
//#endregion
|
|
243
|
+
//#region src/lib/bootstraps/web-transport-bootstrapper.ts
|
|
244
|
+
var _WebTransportBootstrapper;
|
|
245
|
+
let WebTransportBootstrapper = _WebTransportBootstrapper = class WebTransportBootstrapper {
|
|
246
|
+
serverFactory;
|
|
247
|
+
webTransportExplorer;
|
|
248
|
+
logger = new _nestjs_common.Logger(_WebTransportBootstrapper.name);
|
|
249
|
+
h3ServersWithInfo = [];
|
|
250
|
+
constructor(serverFactory, webTransportExplorer) {
|
|
251
|
+
this.serverFactory = serverFactory;
|
|
252
|
+
this.webTransportExplorer = webTransportExplorer;
|
|
253
|
+
}
|
|
254
|
+
async onApplicationBootstrap() {
|
|
255
|
+
const serverBindings = this.webTransportExplorer.discover();
|
|
256
|
+
this.h3ServersWithInfo = await this.serverFactory.createH3Servers(serverBindings);
|
|
257
|
+
await Promise.all(this.h3ServersWithInfo.map(async ({ options, name, h3Server }) => {
|
|
258
|
+
try {
|
|
259
|
+
h3Server.startServer();
|
|
260
|
+
await h3Server.ready;
|
|
261
|
+
this.logger.log(`WebTransport server "${name}" is ready on ${options.host}:${options.port}`);
|
|
262
|
+
} catch (e) {
|
|
263
|
+
this.logger.error(`Failed to start WebTransport server "${name}" on ${options.host}:${options.port}`);
|
|
264
|
+
throw e;
|
|
265
|
+
}
|
|
266
|
+
}));
|
|
267
|
+
}
|
|
268
|
+
async onApplicationShutdown() {
|
|
269
|
+
await Promise.all(this.h3ServersWithInfo.map(async ({ name, h3Server }) => {
|
|
270
|
+
h3Server.stopServer();
|
|
271
|
+
await h3Server.closed;
|
|
272
|
+
this.logger.log(`WebTransport server "${name}" stopped`);
|
|
273
|
+
}));
|
|
274
|
+
}
|
|
275
|
+
};
|
|
276
|
+
WebTransportBootstrapper = _WebTransportBootstrapper = __decorate([(0, _nestjs_common.Injectable)(), __decorateMetadata("design:paramtypes", [Object, Object])], WebTransportBootstrapper);
|
|
277
|
+
//#endregion
|
|
242
278
|
//#region src/lib/explorers/web-transport.explorer.ts
|
|
243
279
|
var _WebTransportExplorer;
|
|
244
280
|
let WebTransportExplorer = _WebTransportExplorer = class WebTransportExplorer {
|
|
@@ -265,7 +301,7 @@ let WebTransportExplorer = _WebTransportExplorer = class WebTransportExplorer {
|
|
|
265
301
|
return serverBindings;
|
|
266
302
|
}
|
|
267
303
|
};
|
|
268
|
-
WebTransportExplorer = _WebTransportExplorer = __decorate([(0, _nestjs_common.Injectable)(), __decorateMetadata("design:paramtypes", [
|
|
304
|
+
WebTransportExplorer = _WebTransportExplorer = __decorate([(0, _nestjs_common.Injectable)(), __decorateMetadata("design:paramtypes", [Object, Object])], WebTransportExplorer);
|
|
269
305
|
//#endregion
|
|
270
306
|
//#region src/lib/bootstraps/consumers/abstract-stream.consumer.ts
|
|
271
307
|
var AbstractStreamConsumer = class {
|
|
@@ -313,6 +349,7 @@ StreamRWConsumer = _StreamRWConsumer = __decorate([(0, _nestjs_common.Injectable
|
|
|
313
349
|
//#region src/lib/classes/wt-session.ts
|
|
314
350
|
var WtSession = class {
|
|
315
351
|
webTransportSession;
|
|
352
|
+
data;
|
|
316
353
|
constructor(webTransportSession) {
|
|
317
354
|
this.webTransportSession = webTransportSession;
|
|
318
355
|
}
|
|
@@ -401,42 +438,7 @@ let ServerFactory = _ServerFactory = class ServerFactory {
|
|
|
401
438
|
this.streamROConsumer.consume(gateway, webTransportSession, session).catch((error) => this.logger.error(error));
|
|
402
439
|
}
|
|
403
440
|
};
|
|
404
|
-
ServerFactory = _ServerFactory = __decorate([(0, _nestjs_common.Injectable)(), __decorateMetadata("design:paramtypes", [
|
|
405
|
-
//#endregion
|
|
406
|
-
//#region src/lib/bootstraps/web-transport-bootstrapper.ts
|
|
407
|
-
var _WebTransportBootstrapper;
|
|
408
|
-
let WebTransportBootstrapper = _WebTransportBootstrapper = class WebTransportBootstrapper {
|
|
409
|
-
serverFactory;
|
|
410
|
-
webTransportExplorer;
|
|
411
|
-
logger = new _nestjs_common.Logger(_WebTransportBootstrapper.name);
|
|
412
|
-
h3ServersWithInfo = [];
|
|
413
|
-
constructor(serverFactory, webTransportExplorer) {
|
|
414
|
-
this.serverFactory = serverFactory;
|
|
415
|
-
this.webTransportExplorer = webTransportExplorer;
|
|
416
|
-
}
|
|
417
|
-
async onApplicationBootstrap() {
|
|
418
|
-
const serverBindings = this.webTransportExplorer.discover();
|
|
419
|
-
this.h3ServersWithInfo = await this.serverFactory.createH3Servers(serverBindings);
|
|
420
|
-
await Promise.all(this.h3ServersWithInfo.map(async ({ options, name, h3Server }) => {
|
|
421
|
-
try {
|
|
422
|
-
h3Server.startServer();
|
|
423
|
-
await h3Server.ready;
|
|
424
|
-
this.logger.log(`WebTransport server "${name}" is ready on ${options.host}:${options.port}`);
|
|
425
|
-
} catch (e) {
|
|
426
|
-
this.logger.error(`Failed to start WebTransport server "${name}" on ${options.host}:${options.port}`);
|
|
427
|
-
throw e;
|
|
428
|
-
}
|
|
429
|
-
}));
|
|
430
|
-
}
|
|
431
|
-
async onApplicationShutdown() {
|
|
432
|
-
await Promise.all(this.h3ServersWithInfo.map(async ({ name, h3Server }) => {
|
|
433
|
-
h3Server.stopServer();
|
|
434
|
-
await h3Server.closed;
|
|
435
|
-
this.logger.log(`WebTransport server "${name}" stopped`);
|
|
436
|
-
}));
|
|
437
|
-
}
|
|
438
|
-
};
|
|
439
|
-
WebTransportBootstrapper = _WebTransportBootstrapper = __decorate([(0, _nestjs_common.Injectable)(), __decorateMetadata("design:paramtypes", [typeof ServerFactory === "undefined" ? Object : ServerFactory, typeof WebTransportExplorer === "undefined" ? Object : WebTransportExplorer])], WebTransportBootstrapper);
|
|
441
|
+
ServerFactory = _ServerFactory = __decorate([(0, _nestjs_common.Injectable)(), __decorateMetadata("design:paramtypes", [Object, Object])], ServerFactory);
|
|
440
442
|
//#endregion
|
|
441
443
|
//#region src/lib/webtransport.module.ts
|
|
442
444
|
let WebTransportModule = class WebTransportModule {};
|
package/dist/index.d.cts
CHANGED
|
@@ -12,23 +12,20 @@ interface WebTransportServerOptions {
|
|
|
12
12
|
}
|
|
13
13
|
declare function WebTransportServer(options: WebTransportServerOptions): ClassDecorator;
|
|
14
14
|
//#endregion
|
|
15
|
-
//#region src/lib/explorers/webtransport-server.explorer.d.ts
|
|
16
|
-
type WebTransportServerOptionsFactory = {
|
|
17
|
-
options(): HttpServerInit$1 | Promise<HttpServerInit$1>;
|
|
18
|
-
};
|
|
19
|
-
//#endregion
|
|
20
15
|
//#region src/lib/classes/wt-session.d.ts
|
|
21
|
-
declare class WtSession {
|
|
16
|
+
declare class WtSession<GD extends GatewayData = GatewayDefaultData> {
|
|
22
17
|
private readonly webTransportSession;
|
|
18
|
+
data?: GD["session"];
|
|
23
19
|
constructor(webTransportSession: WebTransportSession);
|
|
24
|
-
createStreamWO(): Promise<WtStreamWO
|
|
25
|
-
createStreamRW(): Promise<WtStreamRW
|
|
20
|
+
createStreamWO(): Promise<WtStreamWO<GD>>;
|
|
21
|
+
createStreamRW(): Promise<WtStreamRW<GD>>;
|
|
26
22
|
}
|
|
27
23
|
//#endregion
|
|
28
24
|
//#region src/lib/classes/wt-stream.d.ts
|
|
29
|
-
declare abstract class AbstractWtStream<TWebStream> {
|
|
25
|
+
declare abstract class AbstractWtStream<TWebStream, Data extends object | undefined> {
|
|
30
26
|
readonly session: WtSession;
|
|
31
27
|
protected readonly webTransportStream: TWebStream;
|
|
28
|
+
data?: Data;
|
|
32
29
|
protected constructor(session: WtSession, webTransportStream: TWebStream);
|
|
33
30
|
}
|
|
34
31
|
interface WtReadableStream {
|
|
@@ -39,7 +36,7 @@ interface WtWritableStream {
|
|
|
39
36
|
write(data: Uint8Array): Promise<void>;
|
|
40
37
|
closeWritable(): Promise<void>;
|
|
41
38
|
}
|
|
42
|
-
declare class WtStreamRW extends AbstractWtStream<WebTransportBidirectionalStream> implements WtReadableStream, WtWritableStream {
|
|
39
|
+
declare class WtStreamRW<GD extends GatewayData = GatewayDefaultData> extends AbstractWtStream<WebTransportBidirectionalStream, GD["streamRW"]> implements WtReadableStream, WtWritableStream {
|
|
43
40
|
private readonly readableStreamHandler;
|
|
44
41
|
private readonly writableStreamHandler;
|
|
45
42
|
constructor(session: WtSession, webTransportStream: WebTransportBidirectionalStream);
|
|
@@ -49,19 +46,24 @@ declare class WtStreamRW extends AbstractWtStream<WebTransportBidirectionalStrea
|
|
|
49
46
|
closeWritable(): Promise<void>;
|
|
50
47
|
close(): Promise<void>;
|
|
51
48
|
}
|
|
52
|
-
declare class WtStreamRO extends AbstractWtStream<WebTransportReceiveStream> implements WtReadableStream {
|
|
49
|
+
declare class WtStreamRO<GD extends GatewayData = GatewayDefaultData> extends AbstractWtStream<WebTransportReceiveStream, GD["streamRO"]> implements WtReadableStream {
|
|
53
50
|
private readonly readableStreamHandler;
|
|
54
51
|
constructor(session: WtSession, webTransportStream: WebTransportReceiveStream);
|
|
55
52
|
read(): AsyncIterableIterator<Uint8Array>;
|
|
56
53
|
closeReadable(): Promise<void>;
|
|
57
54
|
}
|
|
58
|
-
declare class WtStreamWO extends AbstractWtStream<WebTransportSendStream> implements WtWritableStream {
|
|
55
|
+
declare class WtStreamWO<GD extends GatewayData = GatewayDefaultData> extends AbstractWtStream<WebTransportSendStream, GD["streamWO"]> implements WtWritableStream {
|
|
59
56
|
private readonly writableStreamHandler;
|
|
60
57
|
constructor(session: WtSession, webTransportStream: WebTransportSendStream);
|
|
61
58
|
write(data: Uint8Array): Promise<void>;
|
|
62
59
|
closeWritable(): Promise<void>;
|
|
63
60
|
}
|
|
64
61
|
//#endregion
|
|
62
|
+
//#region src/lib/explorers/webtransport-server.explorer.d.ts
|
|
63
|
+
type WebTransportServerOptionsFactory = {
|
|
64
|
+
options(): HttpServerInit$1 | Promise<HttpServerInit$1>;
|
|
65
|
+
};
|
|
66
|
+
//#endregion
|
|
65
67
|
//#region src/lib/bootstraps/types.d.ts
|
|
66
68
|
type WebTransportRequestHeader = {
|
|
67
69
|
readonly ':path': string;
|
|
@@ -70,16 +72,28 @@ type WebTransportRequest = {
|
|
|
70
72
|
readonly header: WebTransportRequestHeader;
|
|
71
73
|
};
|
|
72
74
|
//#endregion
|
|
73
|
-
//#region src/lib/
|
|
74
|
-
type
|
|
75
|
+
//#region src/lib/types/web-transport-gateway-lifecycle.d.ts
|
|
76
|
+
type GatewayData = {
|
|
77
|
+
session?: object;
|
|
78
|
+
streamRW?: object;
|
|
79
|
+
streamWO?: object;
|
|
80
|
+
streamRO?: object;
|
|
81
|
+
};
|
|
82
|
+
type GatewayDefaultData = {
|
|
83
|
+
session: undefined;
|
|
84
|
+
streamRW: undefined;
|
|
85
|
+
streamWO: undefined;
|
|
86
|
+
streamRO: undefined;
|
|
87
|
+
};
|
|
88
|
+
type WebTransportGatewayLifecycle<GD extends GatewayData = GatewayDefaultData> = {
|
|
75
89
|
allowRequest?(request: WebTransportRequest): void | Promise<void>;
|
|
76
|
-
onSession?(session: WtSession): void | Promise<void>;
|
|
77
|
-
onSessionClosed?(session: WtSession): void | Promise<void>;
|
|
78
|
-
onStreamRW?(stream: WtStreamRW): void | Promise<void>;
|
|
79
|
-
onStreamRO?(stream: WtStreamRO): void | Promise<void>;
|
|
90
|
+
onSession?(session: WtSession<GD>): void | Promise<void>;
|
|
91
|
+
onSessionClosed?(session: WtSession<GD>): void | Promise<void>;
|
|
92
|
+
onStreamRW?(stream: WtStreamRW<GD>): void | Promise<void>;
|
|
93
|
+
onStreamRO?(stream: WtStreamRO<GD>): void | Promise<void>;
|
|
80
94
|
};
|
|
81
95
|
//#endregion
|
|
82
96
|
//#region src/lib/webtransport.module.d.ts
|
|
83
97
|
declare class WebTransportModule {}
|
|
84
98
|
//#endregion
|
|
85
|
-
export { type HttpServerInit, WebTransportGateway, type WebTransportGatewayLifecycle, type WebTransportGatewayOptions, WebTransportModule, WebTransportServer, type WebTransportServerOptions, type WebTransportServerOptionsFactory, WtSession, WtStreamRO, WtStreamRW, WtStreamWO };
|
|
99
|
+
export { type GatewayData, type HttpServerInit, WebTransportGateway, type WebTransportGatewayLifecycle, type WebTransportGatewayOptions, WebTransportModule, WebTransportServer, type WebTransportServerOptions, type WebTransportServerOptionsFactory, WtSession, WtStreamRO, WtStreamRW, WtStreamWO };
|