@agentdance/node-webrtc-sctp 1.0.0
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/dist/association.d.ts +167 -0
- package/dist/association.d.ts.map +1 -0
- package/dist/association.js +1394 -0
- package/dist/association.js.map +1 -0
- package/dist/index.d.ts +4 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +4 -0
- package/dist/index.js.map +1 -0
- package/dist/packet.d.ts +45 -0
- package/dist/packet.d.ts.map +1 -0
- package/dist/packet.js +156 -0
- package/dist/packet.js.map +1 -0
- package/dist/types.d.ts +62 -0
- package/dist/types.d.ts.map +1 -0
- package/dist/types.js +5 -0
- package/dist/types.js.map +1 -0
- package/package.json +56 -0
- package/src/association.ts +1621 -0
- package/src/index.ts +3 -0
- package/src/packet.ts +227 -0
- package/src/types.ts +76 -0
|
@@ -0,0 +1,167 @@
|
|
|
1
|
+
import { EventEmitter } from 'node:events';
|
|
2
|
+
import type { DataChannelOptions, DataChannelInfo, DataChannelState, SctpState } from './types.js';
|
|
3
|
+
export declare interface SctpDataChannel {
|
|
4
|
+
on(event: 'open', listener: () => void): this;
|
|
5
|
+
on(event: 'message', listener: (data: Buffer | string) => void): this;
|
|
6
|
+
on(event: 'close', listener: () => void): this;
|
|
7
|
+
on(event: 'error', listener: (err: Error) => void): this;
|
|
8
|
+
on(event: 'bufferedamountlow', listener: () => void): this;
|
|
9
|
+
}
|
|
10
|
+
export declare class SctpDataChannel extends EventEmitter {
|
|
11
|
+
readonly id: number;
|
|
12
|
+
readonly label: string;
|
|
13
|
+
readonly protocol: string;
|
|
14
|
+
readonly ordered: boolean;
|
|
15
|
+
readonly maxPacketLifeTime: number | undefined;
|
|
16
|
+
readonly maxRetransmits: number | undefined;
|
|
17
|
+
readonly negotiated: boolean;
|
|
18
|
+
private _state;
|
|
19
|
+
private _assoc;
|
|
20
|
+
private _ssn;
|
|
21
|
+
private _bufferedAmount;
|
|
22
|
+
bufferedAmountLowThreshold: number;
|
|
23
|
+
constructor(assoc: SctpAssociation, info: DataChannelInfo);
|
|
24
|
+
get state(): DataChannelState;
|
|
25
|
+
get readyState(): DataChannelState;
|
|
26
|
+
get bufferedAmount(): number;
|
|
27
|
+
/** Send a message through this data channel */
|
|
28
|
+
send(data: Buffer | string): void;
|
|
29
|
+
/** Bump and return the next outgoing SSN (used by association for ZWP probes) */
|
|
30
|
+
_nextSsn(): number;
|
|
31
|
+
close(): void;
|
|
32
|
+
/** Called by association when a message arrives */
|
|
33
|
+
_deliver(ppid: number, data: Buffer): void;
|
|
34
|
+
/** Called by association when this channel is fully open */
|
|
35
|
+
_open(): void;
|
|
36
|
+
/** Called by association when channel is forcibly closed */
|
|
37
|
+
_close(): void;
|
|
38
|
+
/** Called when bytes are acknowledged (reduce bufferedAmount) */
|
|
39
|
+
_onAcked(bytes: number, peerRwnd?: number): void;
|
|
40
|
+
}
|
|
41
|
+
export declare interface SctpAssociation {
|
|
42
|
+
on(event: 'state', listener: (state: SctpState) => void): this;
|
|
43
|
+
on(event: 'datachannel', listener: (channel: SctpDataChannel) => void): this;
|
|
44
|
+
on(event: 'error', listener: (err: Error) => void): this;
|
|
45
|
+
}
|
|
46
|
+
export declare class SctpAssociation extends EventEmitter {
|
|
47
|
+
private _state;
|
|
48
|
+
private readonly _localPort;
|
|
49
|
+
private readonly _remotePort;
|
|
50
|
+
private readonly _role;
|
|
51
|
+
private _localTag;
|
|
52
|
+
private _remoteTag;
|
|
53
|
+
private _localTsn;
|
|
54
|
+
private _remoteCumulativeTsn;
|
|
55
|
+
/** Set of TSNs received out-of-order but not yet cumulatively acknowledged */
|
|
56
|
+
private _receivedTsns;
|
|
57
|
+
/** Congestion window (bytes) – controls how many bytes can be in-flight */
|
|
58
|
+
private _cwnd;
|
|
59
|
+
/** Slow-start threshold */
|
|
60
|
+
private _ssthresh;
|
|
61
|
+
/** Bytes currently in-flight (sent but not yet acknowledged) */
|
|
62
|
+
private _flightSize;
|
|
63
|
+
/** Partial bytes acked accumulator for congestion avoidance (RFC 4960 §7.2.2) */
|
|
64
|
+
private _partialBytesAcked;
|
|
65
|
+
/** Peer's advertised receive window (from SACK a_rwnd field) */
|
|
66
|
+
private _peerRwnd;
|
|
67
|
+
/** Smoothed RTT estimate (ms) */
|
|
68
|
+
private _srtt;
|
|
69
|
+
/** RTT variance (ms) */
|
|
70
|
+
private _rttvar;
|
|
71
|
+
private _sendQueue;
|
|
72
|
+
private _pumping;
|
|
73
|
+
/** TSN → PendingChunk for unacknowledged outgoing chunks */
|
|
74
|
+
private _pendingChunks;
|
|
75
|
+
private _retransmitTimer;
|
|
76
|
+
private _rto;
|
|
77
|
+
/** Zero-window probe back-off delay (ms) – doubles on each probe attempt */
|
|
78
|
+
private _zwpDelay;
|
|
79
|
+
/** Count of SACKs received without new data being ACKed (for fast retransmit) */
|
|
80
|
+
private _dupSackCount;
|
|
81
|
+
private _lastCumAcked;
|
|
82
|
+
/** streamId+ssn key → ReassemblyEntry for multi-fragment messages */
|
|
83
|
+
private _reassembly;
|
|
84
|
+
_channels: Map<number, SctpDataChannel>;
|
|
85
|
+
private _nextChannelId;
|
|
86
|
+
private _streamReceive;
|
|
87
|
+
private _sendCallback;
|
|
88
|
+
/** DATA packets received since last SACK was sent. Every 2nd packet → immediate SACK. */
|
|
89
|
+
private _dataPacketsSinceAck;
|
|
90
|
+
private _sackTimer;
|
|
91
|
+
private _connectResolve;
|
|
92
|
+
private _connectReject;
|
|
93
|
+
constructor(opts: {
|
|
94
|
+
localPort: number;
|
|
95
|
+
remotePort: number;
|
|
96
|
+
role: 'client' | 'server';
|
|
97
|
+
});
|
|
98
|
+
setSendCallback(fn: (buf: Buffer) => void): void;
|
|
99
|
+
/** True when peer's receive window is closed (peerRwnd=0 due to flutter uint32 wrap or genuine 0) */
|
|
100
|
+
get peerWindowClosed(): boolean;
|
|
101
|
+
connect(timeoutMs?: number): Promise<void>;
|
|
102
|
+
handleIncoming(buf: Buffer): void;
|
|
103
|
+
createDataChannel(opts: DataChannelOptions): SctpDataChannel;
|
|
104
|
+
close(): void;
|
|
105
|
+
get state(): SctpState;
|
|
106
|
+
/** Expose congestion/flow state for testing */
|
|
107
|
+
get cwnd(): number;
|
|
108
|
+
get flightSize(): number;
|
|
109
|
+
get peerRwnd(): number;
|
|
110
|
+
get sendQueueLength(): number;
|
|
111
|
+
_sendData(streamId: number, ssn: number, ppid: number, data: Buffer, ordered: boolean, channel: SctpDataChannel): void;
|
|
112
|
+
_closeChannel(id: number): void;
|
|
113
|
+
private _enqueue;
|
|
114
|
+
/**
|
|
115
|
+
* Drain the send queue under cwnd / peerRwnd constraints.
|
|
116
|
+
* Called after enqueue and after each SACK acknowledgement.
|
|
117
|
+
*
|
|
118
|
+
* We call _doPump via setImmediate so that incoming SACKs (which arrive as
|
|
119
|
+
* UDP packets in separate event-loop ticks) can be processed between pump
|
|
120
|
+
* cycles, keeping the window accurate and preventing stalls.
|
|
121
|
+
*/
|
|
122
|
+
private _pump;
|
|
123
|
+
/**
|
|
124
|
+
* Purge PR-SCTP messages (maxRetransmits=0 or maxPacketLifeTime expired)
|
|
125
|
+
* from the head of the send queue when the peer window is zero.
|
|
126
|
+
* Since no TSN has been assigned yet, we simply discard and notify bufferedAmount.
|
|
127
|
+
*
|
|
128
|
+
* Returns the number of complete messages dropped.
|
|
129
|
+
*/
|
|
130
|
+
private _purgeStalePrSctp;
|
|
131
|
+
private _doPump;
|
|
132
|
+
private _transmitFragment;
|
|
133
|
+
private _setState;
|
|
134
|
+
private _send;
|
|
135
|
+
private _sendChunks;
|
|
136
|
+
private _armRetransmitTimer;
|
|
137
|
+
private _clearRetransmitTimer;
|
|
138
|
+
private _doRetransmit;
|
|
139
|
+
private _abandonChunk;
|
|
140
|
+
/** Process cumulative TSN advancement and gap ACK blocks from SACK */
|
|
141
|
+
private _processSack;
|
|
142
|
+
/** Fast retransmit: resend earliest unacked chunk without waiting for RTO */
|
|
143
|
+
private _doFastRetransmit;
|
|
144
|
+
/** RFC 6298 RTO update */
|
|
145
|
+
private _updateRto;
|
|
146
|
+
private _sendInit;
|
|
147
|
+
private _handleInit;
|
|
148
|
+
private _handleInitAck;
|
|
149
|
+
private _handleCookieEcho;
|
|
150
|
+
private _handleCookieAck;
|
|
151
|
+
private _onConnected;
|
|
152
|
+
private _handleData;
|
|
153
|
+
private _reassembleAndDeliver;
|
|
154
|
+
private _deliverToStream;
|
|
155
|
+
private _scheduleSack;
|
|
156
|
+
private _sendSack;
|
|
157
|
+
private _buildGapBlocks;
|
|
158
|
+
private _sendForwardTsn;
|
|
159
|
+
private _handleForwardTsn;
|
|
160
|
+
private _handleDcep;
|
|
161
|
+
private _handleDcepOpen;
|
|
162
|
+
private _handleDcepAck;
|
|
163
|
+
private _sendDcepOpen;
|
|
164
|
+
private _sendDcepAck;
|
|
165
|
+
private _handleChunk;
|
|
166
|
+
}
|
|
167
|
+
//# sourceMappingURL=association.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"association.d.ts","sourceRoot":"","sources":["../src/association.ts"],"names":[],"mappings":"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"}
|