@libp2p/yamux 7.0.4-0f07e3df5

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.
Files changed (49) hide show
  1. package/README.md +127 -0
  2. package/dist/index.min.js +4 -0
  3. package/dist/index.min.js.map +7 -0
  4. package/dist/src/config.d.ts +30 -0
  5. package/dist/src/config.d.ts.map +1 -0
  6. package/dist/src/config.js +41 -0
  7. package/dist/src/config.js.map +1 -0
  8. package/dist/src/constants.d.ts +12 -0
  9. package/dist/src/constants.d.ts.map +1 -0
  10. package/dist/src/constants.js +22 -0
  11. package/dist/src/constants.js.map +1 -0
  12. package/dist/src/decode.d.ts +34 -0
  13. package/dist/src/decode.d.ts.map +1 -0
  14. package/dist/src/decode.js +76 -0
  15. package/dist/src/decode.js.map +1 -0
  16. package/dist/src/encode.d.ts +3 -0
  17. package/dist/src/encode.d.ts.map +1 -0
  18. package/dist/src/encode.js +19 -0
  19. package/dist/src/encode.js.map +1 -0
  20. package/dist/src/errors.d.ts +40 -0
  21. package/dist/src/errors.d.ts.map +1 -0
  22. package/dist/src/errors.js +70 -0
  23. package/dist/src/errors.js.map +1 -0
  24. package/dist/src/frame.d.ts +54 -0
  25. package/dist/src/frame.d.ts.map +1 -0
  26. package/dist/src/frame.js +36 -0
  27. package/dist/src/frame.js.map +1 -0
  28. package/dist/src/index.d.ts +85 -0
  29. package/dist/src/index.d.ts.map +1 -0
  30. package/dist/src/index.js +84 -0
  31. package/dist/src/index.js.map +1 -0
  32. package/dist/src/muxer.d.ts +91 -0
  33. package/dist/src/muxer.d.ts.map +1 -0
  34. package/dist/src/muxer.js +428 -0
  35. package/dist/src/muxer.js.map +1 -0
  36. package/dist/src/stream.d.ts +96 -0
  37. package/dist/src/stream.d.ts.map +1 -0
  38. package/dist/src/stream.js +253 -0
  39. package/dist/src/stream.js.map +1 -0
  40. package/package.json +95 -0
  41. package/src/config.ts +72 -0
  42. package/src/constants.ts +25 -0
  43. package/src/decode.ts +105 -0
  44. package/src/encode.ts +26 -0
  45. package/src/errors.ts +89 -0
  46. package/src/frame.ts +64 -0
  47. package/src/index.ts +90 -0
  48. package/src/muxer.ts +507 -0
  49. package/src/stream.ts +313 -0
@@ -0,0 +1,91 @@
1
+ import { serviceCapabilities } from '@libp2p/interface';
2
+ import { AbstractStreamMuxer } from '@libp2p/utils';
3
+ import { Uint8ArrayList } from 'uint8arraylist';
4
+ import { GoAwayCode } from './frame.js';
5
+ import { YamuxStream } from './stream.js';
6
+ import type { Config } from './config.js';
7
+ import type { AbortOptions, MessageStream, StreamMuxerFactory } from '@libp2p/interface';
8
+ export interface YamuxMuxerInit extends Partial<Config> {
9
+ }
10
+ export declare class Yamux implements StreamMuxerFactory {
11
+ protocol: string;
12
+ private readonly _init;
13
+ constructor(init?: Partial<Config>);
14
+ readonly [Symbol.toStringTag] = "@libp2p/yamux";
15
+ readonly [serviceCapabilities]: string[];
16
+ createStreamMuxer(maConn: MessageStream): YamuxMuxer;
17
+ }
18
+ export interface CloseOptions extends AbortOptions {
19
+ reason?: GoAwayCode;
20
+ }
21
+ export interface ActivePing extends PromiseWithResolvers<number> {
22
+ id: number;
23
+ start: number;
24
+ }
25
+ export declare class YamuxMuxer extends AbstractStreamMuxer<YamuxStream> {
26
+ /** The next stream id to be used when initiating a new stream */
27
+ private nextStreamID;
28
+ /** The next ping id to be used when pinging */
29
+ private nextPingID;
30
+ /** Tracking info for the currently active ping */
31
+ private activePing?;
32
+ /** Round trip time */
33
+ private rtt;
34
+ /** True if client, false if server */
35
+ private client;
36
+ private localGoAway?;
37
+ private remoteGoAway?;
38
+ /** Number of tracked inbound streams */
39
+ private numInboundStreams;
40
+ /** Number of tracked outbound streams */
41
+ private numOutboundStreams;
42
+ private decoder;
43
+ private keepAlive?;
44
+ private enableKeepAlive;
45
+ private keepAliveInterval;
46
+ private maxInboundStreams;
47
+ private maxOutboundStreams;
48
+ constructor(maConn: MessageStream, init?: YamuxMuxerInit);
49
+ onData(buf: Uint8Array | Uint8ArrayList): void;
50
+ onCreateStream(): YamuxStream;
51
+ /**
52
+ * Initiate a ping and wait for a response
53
+ *
54
+ * Note: only a single ping will be initiated at a time.
55
+ * If a ping is already in progress, a new ping will not be initiated.
56
+ *
57
+ * @returns the round-trip-time in milliseconds
58
+ */
59
+ ping(options?: AbortOptions): Promise<number>;
60
+ /**
61
+ * Get the ping round trip time
62
+ *
63
+ * Note: Will return 0 if no successful ping has yet been completed
64
+ *
65
+ * @returns the round-trip-time in milliseconds
66
+ */
67
+ getRTT(): number;
68
+ /**
69
+ * Close the muxer
70
+ */
71
+ close(options?: CloseOptions): Promise<void>;
72
+ abort(err: Error): void;
73
+ onTransportClosed(): void;
74
+ /** Create a new stream */
75
+ private _newStream;
76
+ /**
77
+ * closeStream is used to close a stream once both sides have
78
+ * issued a close.
79
+ */
80
+ private closeStream;
81
+ private handleFrame;
82
+ private handlePing;
83
+ private handlePingResponse;
84
+ private handleGoAway;
85
+ private handleStreamMessage;
86
+ private incomingStream;
87
+ private sendFrame;
88
+ private sendPing;
89
+ private sendGoAway;
90
+ }
91
+ //# sourceMappingURL=muxer.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"muxer.d.ts","sourceRoot":"","sources":["../../src/muxer.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,428 @@
1
+ import { InvalidParametersError, MuxerClosedError, TooManyOutboundProtocolStreamsError, serviceCapabilities } from '@libp2p/interface';
2
+ import { AbstractStreamMuxer, repeatingTask } from '@libp2p/utils';
3
+ import { raceSignal } from 'race-signal';
4
+ import { Uint8ArrayList } from 'uint8arraylist';
5
+ import { defaultConfig, verifyConfig } from './config.js';
6
+ import { Decoder } from './decode.js';
7
+ import { encodeHeader } from './encode.js';
8
+ import { InvalidFrameError, isProtocolError, NotMatchingPingError, UnRequestedPingError } from './errors.js';
9
+ import { Flag, FrameType, GoAwayCode } from './frame.js';
10
+ import { StreamState, YamuxStream } from './stream.js';
11
+ function debugFrame(header) {
12
+ return {
13
+ type: FrameType[header.type],
14
+ flags: [
15
+ (header.flag & Flag.SYN) === Flag.SYN ? 'SYN' : undefined,
16
+ (header.flag & Flag.ACK) === Flag.ACK ? 'ACK' : undefined,
17
+ (header.flag & Flag.FIN) === Flag.FIN ? 'FIN' : undefined,
18
+ (header.flag & Flag.RST) === Flag.RST ? 'RST' : undefined
19
+ ].filter(Boolean),
20
+ streamID: header.streamID,
21
+ length: header.length
22
+ };
23
+ }
24
+ const YAMUX_PROTOCOL_ID = '/yamux/1.0.0';
25
+ export class Yamux {
26
+ protocol = YAMUX_PROTOCOL_ID;
27
+ _init;
28
+ constructor(init = {}) {
29
+ this._init = init;
30
+ }
31
+ [Symbol.toStringTag] = '@libp2p/yamux';
32
+ [serviceCapabilities] = [
33
+ '@libp2p/stream-multiplexing'
34
+ ];
35
+ createStreamMuxer(maConn) {
36
+ return new YamuxMuxer(maConn, {
37
+ ...this._init
38
+ });
39
+ }
40
+ }
41
+ export class YamuxMuxer extends AbstractStreamMuxer {
42
+ /** The next stream id to be used when initiating a new stream */
43
+ nextStreamID;
44
+ /** The next ping id to be used when pinging */
45
+ nextPingID;
46
+ /** Tracking info for the currently active ping */
47
+ activePing;
48
+ /** Round trip time */
49
+ rtt;
50
+ /** True if client, false if server */
51
+ client;
52
+ localGoAway;
53
+ remoteGoAway;
54
+ /** Number of tracked inbound streams */
55
+ numInboundStreams;
56
+ /** Number of tracked outbound streams */
57
+ numOutboundStreams;
58
+ decoder;
59
+ keepAlive;
60
+ enableKeepAlive;
61
+ keepAliveInterval;
62
+ maxInboundStreams;
63
+ maxOutboundStreams;
64
+ constructor(maConn, init = {}) {
65
+ super(maConn, {
66
+ ...init,
67
+ protocol: YAMUX_PROTOCOL_ID,
68
+ name: 'yamux'
69
+ });
70
+ this.client = maConn.direction === 'outbound';
71
+ verifyConfig(init);
72
+ this.enableKeepAlive = init.enableKeepAlive ?? defaultConfig.enableKeepAlive;
73
+ this.keepAliveInterval = init.keepAliveInterval ?? defaultConfig.keepAliveInterval;
74
+ this.maxInboundStreams = init.maxInboundStreams ?? defaultConfig.maxInboundStreams;
75
+ this.maxOutboundStreams = init.maxOutboundStreams ?? defaultConfig.maxOutboundStreams;
76
+ this.decoder = new Decoder();
77
+ this.numInboundStreams = 0;
78
+ this.numOutboundStreams = 0;
79
+ // client uses odd streamIDs, server uses even streamIDs
80
+ this.nextStreamID = this.client ? 1 : 2;
81
+ this.nextPingID = 0;
82
+ this.rtt = -1;
83
+ this.log.trace('muxer created');
84
+ if (this.enableKeepAlive) {
85
+ this.log.trace('muxer keepalive enabled interval=%s', this.keepAliveInterval);
86
+ this.keepAlive = repeatingTask(async (options) => {
87
+ try {
88
+ await this.ping(options);
89
+ }
90
+ catch (err) {
91
+ // TODO: should abort here?
92
+ this.log.error('ping error: %s', err);
93
+ }
94
+ }, this.keepAliveInterval, {
95
+ // send an initial ping to establish RTT
96
+ runImmediately: true
97
+ });
98
+ this.keepAlive.start();
99
+ }
100
+ }
101
+ onData(buf) {
102
+ for (const frame of this.decoder.emitFrames(buf)) {
103
+ this.handleFrame(frame);
104
+ }
105
+ }
106
+ onCreateStream() {
107
+ if (this.remoteGoAway !== undefined) {
108
+ throw new MuxerClosedError('Muxer closed remotely');
109
+ }
110
+ if (this.localGoAway !== undefined) {
111
+ throw new MuxerClosedError('Muxer closed locally');
112
+ }
113
+ const id = this.nextStreamID;
114
+ this.nextStreamID += 2;
115
+ // check against our configured maximum number of outbound streams
116
+ if (this.numOutboundStreams >= this.maxOutboundStreams) {
117
+ throw new TooManyOutboundProtocolStreamsError('max outbound streams exceeded');
118
+ }
119
+ this.log.trace('new outgoing stream id=%s', id);
120
+ const stream = this._newStream(id, StreamState.Init, 'outbound');
121
+ this.numOutboundStreams++;
122
+ // send a window update to open the stream on the receiver end. do this in a
123
+ // microtask so the stream gets added to the streams array by the superclass
124
+ // before we send the SYN flag, otherwise we create a race condition whereby
125
+ // we can receive the ACK before the stream is added to the streams list
126
+ queueMicrotask(() => {
127
+ stream.sendWindowUpdate();
128
+ });
129
+ return stream;
130
+ }
131
+ /**
132
+ * Initiate a ping and wait for a response
133
+ *
134
+ * Note: only a single ping will be initiated at a time.
135
+ * If a ping is already in progress, a new ping will not be initiated.
136
+ *
137
+ * @returns the round-trip-time in milliseconds
138
+ */
139
+ async ping(options) {
140
+ if (this.remoteGoAway !== undefined) {
141
+ throw new MuxerClosedError('Muxer closed remotely');
142
+ }
143
+ if (this.localGoAway !== undefined) {
144
+ throw new MuxerClosedError('Muxer closed locally');
145
+ }
146
+ if (this.activePing != null) {
147
+ // an active ping is already in progress, piggyback off that
148
+ return raceSignal(this.activePing.promise, options?.signal);
149
+ }
150
+ // An active ping does not yet exist, handle the process here
151
+ // create active ping
152
+ this.activePing = Object.assign(Promise.withResolvers(), {
153
+ id: this.nextPingID++,
154
+ start: Date.now()
155
+ });
156
+ // send ping
157
+ this.sendPing(this.activePing.id);
158
+ // await pong
159
+ try {
160
+ this.rtt = await raceSignal(this.activePing.promise, options?.signal);
161
+ }
162
+ finally {
163
+ // clean-up active ping
164
+ this.activePing = undefined;
165
+ }
166
+ return this.rtt;
167
+ }
168
+ /**
169
+ * Get the ping round trip time
170
+ *
171
+ * Note: Will return 0 if no successful ping has yet been completed
172
+ *
173
+ * @returns the round-trip-time in milliseconds
174
+ */
175
+ getRTT() {
176
+ return this.rtt;
177
+ }
178
+ /**
179
+ * Close the muxer
180
+ */
181
+ async close(options = {}) {
182
+ if (this.status !== 'open') {
183
+ // already closed
184
+ return;
185
+ }
186
+ try {
187
+ const reason = options?.reason ?? GoAwayCode.NormalTermination;
188
+ this.log.trace('muxer close reason=%s', GoAwayCode[reason]);
189
+ await super.close(options);
190
+ // send reason to the other side, allow the other side to close gracefully
191
+ this.sendGoAway(reason);
192
+ }
193
+ finally {
194
+ this.keepAlive?.stop();
195
+ }
196
+ }
197
+ abort(err) {
198
+ if (this.status !== 'open') {
199
+ // already closed
200
+ return;
201
+ }
202
+ try {
203
+ super.abort(err);
204
+ let reason = GoAwayCode.InternalError;
205
+ if (isProtocolError(err)) {
206
+ reason = err.reason;
207
+ }
208
+ // If reason was provided, use that, otherwise use the presence of `err` to determine the reason
209
+ this.log.error('muxer abort reason=%s error=%s', reason, err);
210
+ // send reason to the other side, allow the other side to close gracefully
211
+ this.sendGoAway(reason);
212
+ }
213
+ finally {
214
+ this.keepAlive?.stop();
215
+ }
216
+ }
217
+ onTransportClosed() {
218
+ try {
219
+ super.onTransportClosed();
220
+ }
221
+ finally {
222
+ this.keepAlive?.stop();
223
+ }
224
+ }
225
+ /** Create a new stream */
226
+ _newStream(streamId, state, direction) {
227
+ if (this.streams.find(s => s.streamId === streamId) != null) {
228
+ throw new InvalidParametersError('Stream already exists with that id');
229
+ }
230
+ const stream = new YamuxStream({
231
+ ...this.streamOptions,
232
+ id: `${streamId}`,
233
+ streamId,
234
+ state,
235
+ direction,
236
+ sendFrame: this.sendFrame.bind(this),
237
+ log: this.log.newScope(`${direction}:${streamId}`),
238
+ getRTT: this.getRTT.bind(this)
239
+ });
240
+ stream.addEventListener('close', () => {
241
+ this.closeStream(streamId);
242
+ }, {
243
+ once: true
244
+ });
245
+ return stream;
246
+ }
247
+ /**
248
+ * closeStream is used to close a stream once both sides have
249
+ * issued a close.
250
+ */
251
+ closeStream(id) {
252
+ if (this.client === (id % 2 === 0)) {
253
+ this.numInboundStreams--;
254
+ }
255
+ else {
256
+ this.numOutboundStreams--;
257
+ }
258
+ }
259
+ handleFrame(frame) {
260
+ const { streamID, type, length } = frame.header;
261
+ this.log.trace('received frame %o', debugFrame(frame.header));
262
+ if (streamID === 0) {
263
+ switch (type) {
264
+ case FrameType.Ping:
265
+ {
266
+ this.handlePing(frame.header);
267
+ return;
268
+ }
269
+ case FrameType.GoAway:
270
+ {
271
+ this.handleGoAway(length);
272
+ return;
273
+ }
274
+ default:
275
+ // Invalid state
276
+ throw new InvalidFrameError('Invalid frame type');
277
+ }
278
+ }
279
+ else {
280
+ switch (frame.header.type) {
281
+ case FrameType.Data:
282
+ case FrameType.WindowUpdate:
283
+ {
284
+ this.handleStreamMessage(frame);
285
+ return;
286
+ }
287
+ default:
288
+ // Invalid state
289
+ throw new InvalidFrameError('Invalid frame type');
290
+ }
291
+ }
292
+ }
293
+ handlePing(header) {
294
+ // If the ping is initiated by the sender, send a response
295
+ if (header.flag === Flag.SYN) {
296
+ this.log.trace('received ping request pingId=%s', header.length);
297
+ this.sendPing(header.length, Flag.ACK);
298
+ }
299
+ else if (header.flag === Flag.ACK) {
300
+ this.log.trace('received ping response pingId=%s', header.length);
301
+ this.handlePingResponse(header.length);
302
+ }
303
+ else {
304
+ // Invalid state
305
+ throw new InvalidFrameError('Invalid frame flag');
306
+ }
307
+ }
308
+ handlePingResponse(pingId) {
309
+ if (this.activePing === undefined) {
310
+ // this ping was not requested
311
+ throw new UnRequestedPingError('ping not requested');
312
+ }
313
+ if (this.activePing.id !== pingId) {
314
+ // this ping doesn't match our active ping request
315
+ throw new NotMatchingPingError('ping doesn\'t match our id');
316
+ }
317
+ // valid ping response
318
+ this.activePing.resolve(Date.now() - this.activePing.start);
319
+ }
320
+ handleGoAway(reason) {
321
+ this.log.trace('received GoAway reason=%s', GoAwayCode[reason] ?? 'unknown');
322
+ this.remoteGoAway = reason;
323
+ if (reason === GoAwayCode.NormalTermination) {
324
+ this.onTransportClosed();
325
+ }
326
+ else {
327
+ // reset any streams that are still open and close the muxer
328
+ this.abort(new Error('Remote sent GoAway'));
329
+ }
330
+ }
331
+ handleStreamMessage(frame) {
332
+ const { streamID, flag, type } = frame.header;
333
+ if ((flag & Flag.SYN) === Flag.SYN) {
334
+ this.incomingStream(streamID);
335
+ }
336
+ const stream = this.streams.find(s => s.streamId === streamID);
337
+ if (stream === undefined) {
338
+ this.log.trace('frame for missing stream id=%s', streamID);
339
+ return;
340
+ }
341
+ switch (type) {
342
+ case FrameType.WindowUpdate: {
343
+ stream.handleWindowUpdate(frame);
344
+ return;
345
+ }
346
+ case FrameType.Data: {
347
+ stream.handleData(frame);
348
+ return;
349
+ }
350
+ default:
351
+ throw new Error('unreachable');
352
+ }
353
+ }
354
+ incomingStream(id) {
355
+ if (this.client !== (id % 2 === 0)) {
356
+ throw new InvalidParametersError('Both endpoints are clients');
357
+ }
358
+ if (this.streams.find(s => s.streamId === id)) {
359
+ return;
360
+ }
361
+ this.log.trace('new incoming stream id=%s', id);
362
+ if (this.localGoAway !== undefined) {
363
+ // reject (reset) immediately if we are doing a go away
364
+ this.sendFrame({
365
+ type: FrameType.WindowUpdate,
366
+ flag: Flag.RST,
367
+ streamID: id,
368
+ length: 0
369
+ });
370
+ return;
371
+ }
372
+ // check against our configured maximum number of inbound streams
373
+ if (this.numInboundStreams >= this.maxInboundStreams) {
374
+ this.log('maxIncomingStreams exceeded, forcing stream reset');
375
+ this.sendFrame({
376
+ type: FrameType.WindowUpdate,
377
+ flag: Flag.RST,
378
+ streamID: id,
379
+ length: 0
380
+ });
381
+ return;
382
+ }
383
+ // allocate a new stream
384
+ const stream = this._newStream(id, StreamState.SYNReceived, 'inbound');
385
+ this.numInboundStreams++;
386
+ // the stream should now be tracked
387
+ this.onRemoteStream(stream);
388
+ }
389
+ sendFrame(header, data) {
390
+ let encoded;
391
+ if (header.type === FrameType.Data) {
392
+ if (data == null) {
393
+ throw new InvalidFrameError('Invalid frame');
394
+ }
395
+ encoded = new Uint8ArrayList(encodeHeader(header), data);
396
+ }
397
+ else {
398
+ encoded = encodeHeader(header);
399
+ }
400
+ this.log.trace('sending frame %o', debugFrame(header));
401
+ return this.send(encoded);
402
+ }
403
+ sendPing(pingId, flag = Flag.SYN) {
404
+ if (flag === Flag.SYN) {
405
+ this.log.trace('sending ping request pingId=%s', pingId);
406
+ }
407
+ else {
408
+ this.log.trace('sending ping response pingId=%s', pingId);
409
+ }
410
+ this.sendFrame({
411
+ type: FrameType.Ping,
412
+ flag,
413
+ streamID: 0,
414
+ length: pingId
415
+ });
416
+ }
417
+ sendGoAway(reason = GoAwayCode.NormalTermination) {
418
+ this.log('sending GoAway reason=%s', GoAwayCode[reason]);
419
+ this.localGoAway = reason;
420
+ this.sendFrame({
421
+ type: FrameType.GoAway,
422
+ flag: 0,
423
+ streamID: 0,
424
+ length: reason
425
+ });
426
+ }
427
+ }
428
+ //# sourceMappingURL=muxer.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"muxer.js","sourceRoot":"","sources":["../../src/muxer.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,96 @@
1
+ import { AbstractStream } from '@libp2p/utils';
2
+ import { Uint8ArrayList } from 'uint8arraylist';
3
+ import type { Frame } from './decode.ts';
4
+ import type { FrameHeader } from './frame.js';
5
+ import type { AbortOptions } from '@libp2p/interface';
6
+ import type { AbstractStreamInit, SendResult } from '@libp2p/utils';
7
+ export declare enum StreamState {
8
+ Init = 0,
9
+ SYNSent = 1,
10
+ SYNReceived = 2,
11
+ Established = 3,
12
+ Finished = 4,
13
+ Paused = 5
14
+ }
15
+ export interface YamuxStreamInit extends AbstractStreamInit {
16
+ streamId: number;
17
+ sendFrame(header: FrameHeader, body?: Uint8ArrayList): boolean;
18
+ getRTT(): number;
19
+ initialStreamWindowSize?: number;
20
+ maxMessageSize?: number;
21
+ maxStreamWindowSize?: number;
22
+ state: StreamState;
23
+ }
24
+ /** YamuxStream is used to represent a logical stream within a session */
25
+ export declare class YamuxStream extends AbstractStream {
26
+ streamId: number;
27
+ state: StreamState;
28
+ /** The number of available bytes to send */
29
+ private sendWindowCapacity;
30
+ /** The number of bytes available to receive in a full window */
31
+ private recvWindow;
32
+ /** The number of available bytes to receive */
33
+ private recvWindowCapacity;
34
+ private maxStreamWindowSize;
35
+ /**
36
+ * An 'epoch' is the time it takes to process and read data
37
+ *
38
+ * Used in conjunction with RTT to determine whether to increase the recvWindow
39
+ */
40
+ private epochStart;
41
+ private readonly getRTT;
42
+ private readonly sendFrame;
43
+ constructor(init: YamuxStreamInit);
44
+ /**
45
+ * Send a data message to the remote muxer
46
+ */
47
+ sendData(buf: Uint8ArrayList): SendResult;
48
+ /**
49
+ * Send a reset message to the remote muxer
50
+ */
51
+ sendReset(): Promise<void>;
52
+ /**
53
+ * Send a message to the remote muxer, informing them no more data messages
54
+ * will be sent by this end of the stream
55
+ */
56
+ sendCloseWrite(): Promise<void>;
57
+ /**
58
+ * Send a message to the remote muxer, informing them no more data messages
59
+ * will be read by this end of the stream - this is a no-op on Yamux streams
60
+ */
61
+ sendCloseRead(options?: AbortOptions): Promise<void>;
62
+ /**
63
+ * Stop sending window updates temporarily - in the interim the the remote
64
+ * send window will exhaust and the remote will stop sending data
65
+ */
66
+ sendPause(): void;
67
+ /**
68
+ * Start sending window updates as normal
69
+ */
70
+ sendResume(): void;
71
+ /**
72
+ * handleWindowUpdate is called when the stream receives a window update frame
73
+ */
74
+ handleWindowUpdate(frame: Frame): void;
75
+ /**
76
+ * handleData is called when the stream receives a data frame
77
+ */
78
+ handleData(frame: Frame): void;
79
+ /**
80
+ * processFlags is used to update the state of the stream based on set flags, if any.
81
+ */
82
+ private processFlags;
83
+ /**
84
+ * getSendFlags determines any flags that are appropriate
85
+ * based on the current stream state.
86
+ *
87
+ * The state is updated as a side-effect.
88
+ */
89
+ private getSendFlags;
90
+ /**
91
+ * Potentially sends a window update enabling further remote writes to take
92
+ * place.
93
+ */
94
+ sendWindowUpdate(): void;
95
+ }
96
+ //# sourceMappingURL=stream.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"stream.d.ts","sourceRoot":"","sources":["../../src/stream.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,cAAc,EAAE,MAAM,eAAe,CAAA;AAC9C,OAAO,EAAE,cAAc,EAAE,MAAM,gBAAgB,CAAA;AAK/C,OAAO,KAAK,EAAE,KAAK,EAAE,MAAM,aAAa,CAAA;AACxC,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,YAAY,CAAA;AAC7C,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,mBAAmB,CAAA;AACrD,OAAO,KAAK,EAAE,kBAAkB,EAAE,UAAU,EAAE,MAAM,eAAe,CAAA;AAEnE,oBAAY,WAAW;IACrB,IAAI,IAAA;IACJ,OAAO,IAAA;IACP,WAAW,IAAA;IACX,WAAW,IAAA;IACX,QAAQ,IAAA;IACR,MAAM,IAAA;CACP;AAED,MAAM,WAAW,eAAgB,SAAQ,kBAAkB;IACzD,QAAQ,EAAE,MAAM,CAAA;IAChB,SAAS,CAAC,MAAM,EAAE,WAAW,EAAE,IAAI,CAAC,EAAE,cAAc,GAAG,OAAO,CAAA;IAC9D,MAAM,IAAI,MAAM,CAAA;IAChB,uBAAuB,CAAC,EAAE,MAAM,CAAA;IAChC,cAAc,CAAC,EAAE,MAAM,CAAA;IACvB,mBAAmB,CAAC,EAAE,MAAM,CAAA;IAC5B,KAAK,EAAE,WAAW,CAAA;CACnB;AAED,yEAAyE;AACzE,qBAAa,WAAY,SAAQ,cAAc;IAC7C,QAAQ,EAAE,MAAM,CAAA;IAChB,KAAK,EAAE,WAAW,CAAA;IAElB,4CAA4C;IAC5C,OAAO,CAAC,kBAAkB,CAAQ;IAClC,gEAAgE;IAChE,OAAO,CAAC,UAAU,CAAQ;IAC1B,+CAA+C;IAC/C,OAAO,CAAC,kBAAkB,CAAQ;IAClC,OAAO,CAAC,mBAAmB,CAAQ;IAEnC;;;;OAIG;IACH,OAAO,CAAC,UAAU,CAAQ;IAC1B,OAAO,CAAC,QAAQ,CAAC,MAAM,CAAc;IAErC,OAAO,CAAC,QAAQ,CAAC,SAAS,CAAyD;gBAEtE,IAAI,EAAE,eAAe;IAwBlC;;OAEG;IACH,QAAQ,CAAE,GAAG,EAAE,cAAc,GAAG,UAAU;IA8C1C;;OAEG;IACG,SAAS,IAAK,OAAO,CAAC,IAAI,CAAC;IASjC;;;OAGG;IACG,cAAc,IAAK,OAAO,CAAC,IAAI,CAAC;IAUtC;;;OAGG;IACG,aAAa,CAAE,OAAO,CAAC,EAAE,YAAY,GAAG,OAAO,CAAC,IAAI,CAAC;IAI3D;;;OAGG;IACH,SAAS,IAAK,IAAI;IAIlB;;OAEG;IACH,UAAU,IAAK,IAAI;IAKnB;;OAEG;IACH,kBAAkB,CAAE,KAAK,EAAE,KAAK,GAAG,IAAI;IAyBvC;;OAEG;IACH,UAAU,CAAE,KAAK,EAAE,KAAK,GAAG,IAAI;IAmB/B;;OAEG;IACH,OAAO,CAAC,YAAY;IAgBpB;;;;;OAKG;IACH,OAAO,CAAC,YAAY;IAapB;;;OAGG;IACH,gBAAgB,IAAK,IAAI;CA4C1B"}