appium-ios-remotexpc 5.18.2 → 5.18.3
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/CHANGELOG.md +6 -0
- package/build/src/lib/remote-xpc/constants.d.ts +3 -0
- package/build/src/lib/remote-xpc/constants.d.ts.map +1 -1
- package/build/src/lib/remote-xpc/constants.js +3 -0
- package/build/src/lib/remote-xpc/constants.js.map +1 -1
- package/build/src/lib/remote-xpc/handshake.d.ts +4 -0
- package/build/src/lib/remote-xpc/handshake.d.ts.map +1 -1
- package/build/src/lib/remote-xpc/handshake.js +17 -9
- package/build/src/lib/remote-xpc/handshake.js.map +1 -1
- package/build/src/lib/remote-xpc/http2-frame-parser.d.ts +7 -0
- package/build/src/lib/remote-xpc/http2-frame-parser.d.ts.map +1 -1
- package/build/src/lib/remote-xpc/http2-frame-parser.js +17 -0
- package/build/src/lib/remote-xpc/http2-frame-parser.js.map +1 -1
- package/build/src/lib/remote-xpc/remote-xpc-framed-transport.d.ts +17 -1
- package/build/src/lib/remote-xpc/remote-xpc-framed-transport.d.ts.map +1 -1
- package/build/src/lib/remote-xpc/remote-xpc-framed-transport.js +85 -4
- package/build/src/lib/remote-xpc/remote-xpc-framed-transport.js.map +1 -1
- package/package.json +1 -1
- package/src/lib/remote-xpc/constants.ts +3 -0
- package/src/lib/remote-xpc/handshake.ts +19 -9
- package/src/lib/remote-xpc/http2-frame-parser.ts +25 -1
- package/src/lib/remote-xpc/remote-xpc-framed-transport.ts +93 -4
package/CHANGELOG.md
CHANGED
|
@@ -1,3 +1,9 @@
|
|
|
1
|
+
## [5.18.3](https://github.com/appium/appium-ios-remotexpc/compare/v5.18.2...v5.18.3) (2026-09-02)
|
|
2
|
+
|
|
3
|
+
### Bug Fixes
|
|
4
|
+
|
|
5
|
+
* **remote-xpc:** honor HTTP/2 frame size and flow control on outbound DATA frames ([#316](https://github.com/appium/appium-ios-remotexpc/issues/316)) ([0b640ad](https://github.com/appium/appium-ios-remotexpc/commit/0b640ada41fec828e31cc7aaa43342a2871f0308))
|
|
6
|
+
|
|
1
7
|
## [5.18.2](https://github.com/appium/appium-ios-remotexpc/compare/v5.18.1...v5.18.2) (2026-09-01)
|
|
2
8
|
|
|
3
9
|
### Miscellaneous Chores
|
|
@@ -10,6 +10,9 @@ export declare const Http2Constants: {
|
|
|
10
10
|
readonly DEFAULT_WIN_SIZE_INCR: number;
|
|
11
11
|
readonly SETTINGS_MAX_CONCURRENT_STREAMS: 3;
|
|
12
12
|
readonly SETTINGS_INITIAL_WINDOW_SIZE: 4;
|
|
13
|
+
readonly SETTINGS_MAX_FRAME_SIZE: 5;
|
|
14
|
+
readonly DEFAULT_PEER_MAX_FRAME_SIZE: 16384;
|
|
15
|
+
readonly DEFAULT_PEER_WINDOW_SIZE: 65535;
|
|
13
16
|
};
|
|
14
17
|
export declare const XpcConstants: {
|
|
15
18
|
readonly XPC_FLAGS_INIT_HANDSHAKE: 4194304;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"constants.d.ts","sourceRoot":"","sources":["../../../../src/lib/remote-xpc/constants.ts"],"names":[],"mappings":"AACA,eAAO,MAAM,cAAc
|
|
1
|
+
{"version":3,"file":"constants.d.ts","sourceRoot":"","sources":["../../../../src/lib/remote-xpc/constants.ts"],"names":[],"mappings":"AACA,eAAO,MAAM,cAAc;;;;;;;;;;;;;;;CAmBjB,CAAC;AAGX,eAAO,MAAM,YAAY;;;;;CAKf,CAAC"}
|
|
@@ -15,6 +15,9 @@ export const Http2Constants = {
|
|
|
15
15
|
DEFAULT_WIN_SIZE_INCR: 16 * 1024 * 1024 - 65535,
|
|
16
16
|
SETTINGS_MAX_CONCURRENT_STREAMS: 0x03,
|
|
17
17
|
SETTINGS_INITIAL_WINDOW_SIZE: 0x04,
|
|
18
|
+
SETTINGS_MAX_FRAME_SIZE: 0x05,
|
|
19
|
+
DEFAULT_PEER_MAX_FRAME_SIZE: 16384,
|
|
20
|
+
DEFAULT_PEER_WINDOW_SIZE: 65535,
|
|
18
21
|
};
|
|
19
22
|
// XPC Constants
|
|
20
23
|
export const XpcConstants = {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"constants.js","sourceRoot":"","sources":["../../../../src/lib/remote-xpc/constants.ts"],"names":[],"mappings":"AAAA,mBAAmB;AACnB,MAAM,CAAC,MAAM,cAAc,GAAG;IAC5B,WAAW,EAAE,MAAM,CAAC,IAAI,CAAC,kCAAkC,EAAE,OAAO,CAAC;IACrE,iBAAiB,EAAE,CAAC;IACpB,YAAY,EAAE,CAAC;IACf,aAAa,EAAE,CAAC;IAChB,gBAAgB,EAAE,GAAG;IACrB,QAAQ,EAAE,GAAG;IACb,uCAAuC,EAAE,GAAG;IAC5C,qEAAqE;IACrE,0EAA0E;IAC1E,0EAA0E;IAC1E,iBAAiB;IACjB,oCAAoC,EAAE,EAAE,GAAG,IAAI,GAAG,IAAI;IACtD,qBAAqB,EAAE,EAAE,GAAG,IAAI,GAAG,IAAI,GAAG,KAAK;IAC/C,+BAA+B,EAAE,IAAI;IACrC,4BAA4B,EAAE,IAAI;
|
|
1
|
+
{"version":3,"file":"constants.js","sourceRoot":"","sources":["../../../../src/lib/remote-xpc/constants.ts"],"names":[],"mappings":"AAAA,mBAAmB;AACnB,MAAM,CAAC,MAAM,cAAc,GAAG;IAC5B,WAAW,EAAE,MAAM,CAAC,IAAI,CAAC,kCAAkC,EAAE,OAAO,CAAC;IACrE,iBAAiB,EAAE,CAAC;IACpB,YAAY,EAAE,CAAC;IACf,aAAa,EAAE,CAAC;IAChB,gBAAgB,EAAE,GAAG;IACrB,QAAQ,EAAE,GAAG;IACb,uCAAuC,EAAE,GAAG;IAC5C,qEAAqE;IACrE,0EAA0E;IAC1E,0EAA0E;IAC1E,iBAAiB;IACjB,oCAAoC,EAAE,EAAE,GAAG,IAAI,GAAG,IAAI;IACtD,qBAAqB,EAAE,EAAE,GAAG,IAAI,GAAG,IAAI,GAAG,KAAK;IAC/C,+BAA+B,EAAE,IAAI;IACrC,4BAA4B,EAAE,IAAI;IAClC,uBAAuB,EAAE,IAAI;IAC7B,2BAA2B,EAAE,KAAK;IAClC,wBAAwB,EAAE,KAAK;CACvB,CAAC;AAEX,gBAAgB;AAChB,MAAM,CAAC,MAAM,YAAY,GAAG;IAC1B,wBAAwB,EAAE,UAAU;IACpC,oBAAoB,EAAE,UAAU;IAChC,sBAAsB,EAAE,UAAU;IAClC,uBAAuB,EAAE,UAAU;CAC3B,CAAC"}
|
|
@@ -5,9 +5,13 @@ export type MessageId = number;
|
|
|
5
5
|
declare class Handshake {
|
|
6
6
|
private _socket;
|
|
7
7
|
private readonly _nextMessageId;
|
|
8
|
+
private readonly _dataBytesSent;
|
|
8
9
|
constructor(socket: Socket);
|
|
10
|
+
/** DATA payload bytes sent per stream, so the transport can debit its send windows. */
|
|
11
|
+
get dataBytesSent(): Readonly<Record<ChannelId, number>>;
|
|
9
12
|
sendFrame(frame: Buffer): Promise<void>;
|
|
10
13
|
sendRequest(data: XPCDictionary): Promise<void>;
|
|
14
|
+
private sendData;
|
|
11
15
|
perform(): Promise<void>;
|
|
12
16
|
}
|
|
13
17
|
export default Handshake;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"handshake.d.ts","sourceRoot":"","sources":["../../../../src/lib/remote-xpc/handshake.ts"],"names":[],"mappings":"AAAA,OAAO,EAAC,KAAK,MAAM,EAAC,MAAM,UAAU,CAAC;AAErC,OAAO,EAAC,KAAK,aAAa,EAAC,MAAM,aAAa,CAAC;AAK/C,MAAM,MAAM,SAAS,GAAG,MAAM,CAAC;AAC/B,MAAM,MAAM,SAAS,GAAG,MAAM,CAAC;AAE/B,cAAM,SAAS;IACb,OAAO,CAAC,OAAO,CAAS;IACxB,OAAO,CAAC,QAAQ,CAAC,cAAc,CAA+B;
|
|
1
|
+
{"version":3,"file":"handshake.d.ts","sourceRoot":"","sources":["../../../../src/lib/remote-xpc/handshake.ts"],"names":[],"mappings":"AAAA,OAAO,EAAC,KAAK,MAAM,EAAC,MAAM,UAAU,CAAC;AAErC,OAAO,EAAC,KAAK,aAAa,EAAC,MAAM,aAAa,CAAC;AAK/C,MAAM,MAAM,SAAS,GAAG,MAAM,CAAC;AAC/B,MAAM,MAAM,SAAS,GAAG,MAAM,CAAC;AAE/B,cAAM,SAAS;IACb,OAAO,CAAC,OAAO,CAAS;IACxB,OAAO,CAAC,QAAQ,CAAC,cAAc,CAA+B;IAC9D,OAAO,CAAC,QAAQ,CAAC,cAAc,CAA4B;gBAE/C,MAAM,EAAE,MAAM;IAY1B,uFAAuF;IACvF,IAAI,aAAa,IAAI,QAAQ,CAAC,MAAM,CAAC,SAAS,EAAE,MAAM,CAAC,CAAC,CAEvD;IAEK,SAAS,CAAC,KAAK,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAiBvC,WAAW,CAAC,IAAI,EAAE,aAAa,GAAG,OAAO,CAAC,IAAI,CAAC;YAWvC,QAAQ;IAMhB,OAAO,IAAI,OAAO,CAAC,IAAI,CAAC;CAuE/B;AAED,eAAe,SAAS,CAAC"}
|
|
@@ -4,12 +4,21 @@ import { encodeMessage } from './xpc-protocol.js';
|
|
|
4
4
|
class Handshake {
|
|
5
5
|
_socket;
|
|
6
6
|
_nextMessageId;
|
|
7
|
+
_dataBytesSent;
|
|
7
8
|
constructor(socket) {
|
|
8
9
|
this._socket = socket;
|
|
9
10
|
this._nextMessageId = {
|
|
10
11
|
[Http2Constants.ROOT_CHANNEL]: 0,
|
|
11
12
|
[Http2Constants.REPLY_CHANNEL]: 0,
|
|
12
13
|
};
|
|
14
|
+
this._dataBytesSent = {
|
|
15
|
+
[Http2Constants.ROOT_CHANNEL]: 0,
|
|
16
|
+
[Http2Constants.REPLY_CHANNEL]: 0,
|
|
17
|
+
};
|
|
18
|
+
}
|
|
19
|
+
/** DATA payload bytes sent per stream, so the transport can debit its send windows. */
|
|
20
|
+
get dataBytesSent() {
|
|
21
|
+
return { ...this._dataBytesSent };
|
|
13
22
|
}
|
|
14
23
|
async sendFrame(frame) {
|
|
15
24
|
return new Promise((resolve, reject) => {
|
|
@@ -34,9 +43,12 @@ class Handshake {
|
|
|
34
43
|
id: BigInt(this._nextMessageId[Http2Constants.ROOT_CHANNEL]),
|
|
35
44
|
body: data,
|
|
36
45
|
};
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
46
|
+
await this.sendData(Http2Constants.ROOT_CHANNEL, requestMessage);
|
|
47
|
+
}
|
|
48
|
+
async sendData(streamId, message) {
|
|
49
|
+
const encoded = encodeMessage(message);
|
|
50
|
+
this._dataBytesSent[streamId] += encoded.length;
|
|
51
|
+
await this.sendFrame(new DataFrame(streamId, encoded, []).serialize());
|
|
40
52
|
}
|
|
41
53
|
async perform() {
|
|
42
54
|
try {
|
|
@@ -79,9 +91,7 @@ class Handshake {
|
|
|
79
91
|
id: 0,
|
|
80
92
|
body: null,
|
|
81
93
|
};
|
|
82
|
-
|
|
83
|
-
const dataFrame = new DataFrame(Http2Constants.ROOT_CHANNEL, encodedDataMessage, []);
|
|
84
|
-
await this.sendFrame(dataFrame.serialize());
|
|
94
|
+
await this.sendData(Http2Constants.ROOT_CHANNEL, dataMessage);
|
|
85
95
|
this._nextMessageId[Http2Constants.ROOT_CHANNEL]++;
|
|
86
96
|
// Step 8: Open REPLY_CHANNEL with INIT_HANDSHAKE flags.
|
|
87
97
|
const replyMessage = {
|
|
@@ -89,9 +99,7 @@ class Handshake {
|
|
|
89
99
|
id: 0,
|
|
90
100
|
body: null,
|
|
91
101
|
};
|
|
92
|
-
|
|
93
|
-
const replyDataFrame = new DataFrame(Http2Constants.REPLY_CHANNEL, encodedReplyMessage, []);
|
|
94
|
-
await this.sendFrame(replyDataFrame.serialize());
|
|
102
|
+
await this.sendData(Http2Constants.REPLY_CHANNEL, replyMessage);
|
|
95
103
|
this._nextMessageId[Http2Constants.REPLY_CHANNEL]++;
|
|
96
104
|
// Step 9: Send SETTINGS ACK frame.
|
|
97
105
|
const ackFrame = new SettingsFrame(0, null, ['ACK']);
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"handshake.js","sourceRoot":"","sources":["../../../../src/lib/remote-xpc/handshake.ts"],"names":[],"mappings":"AAGA,OAAO,EAAC,cAAc,EAAE,YAAY,EAAC,MAAM,gBAAgB,CAAC;AAC5D,OAAO,EAAC,SAAS,EAAE,YAAY,EAAE,aAAa,EAAE,iBAAiB,EAAC,MAAM,uBAAuB,CAAC;AAChG,OAAO,EAAkB,aAAa,EAAC,MAAM,mBAAmB,CAAC;AAKjE,MAAM,SAAS;IACL,OAAO,CAAS;IACP,cAAc,CAA+B;
|
|
1
|
+
{"version":3,"file":"handshake.js","sourceRoot":"","sources":["../../../../src/lib/remote-xpc/handshake.ts"],"names":[],"mappings":"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"}
|
|
@@ -6,6 +6,13 @@ export interface ParsedDataFrame {
|
|
|
6
6
|
export type ParsedFrame = {
|
|
7
7
|
readonly type: 'data';
|
|
8
8
|
readonly frame: ParsedDataFrame;
|
|
9
|
+
} | {
|
|
10
|
+
readonly type: 'settings';
|
|
11
|
+
readonly settings: Record<number, number>;
|
|
12
|
+
} | {
|
|
13
|
+
readonly type: 'windowUpdate';
|
|
14
|
+
readonly streamId: number;
|
|
15
|
+
readonly increment: number;
|
|
9
16
|
} | {
|
|
10
17
|
readonly type: 'other';
|
|
11
18
|
};
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"http2-frame-parser.d.ts","sourceRoot":"","sources":["../../../../src/lib/remote-xpc/http2-frame-parser.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"http2-frame-parser.d.ts","sourceRoot":"","sources":["../../../../src/lib/remote-xpc/http2-frame-parser.ts"],"names":[],"mappings":"AAUA,MAAM,WAAW,eAAe;IAC9B,QAAQ,CAAC,QAAQ,EAAE,MAAM,CAAC;IAC1B,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IACtB,QAAQ,CAAC,OAAO,EAAE,MAAM,CAAC;CAC1B;AAED,MAAM,MAAM,WAAW,GACnB;IAAC,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IAAC,QAAQ,CAAC,KAAK,EAAE,eAAe,CAAA;CAAC,GACxD;IAAC,QAAQ,CAAC,IAAI,EAAE,UAAU,CAAC;IAAC,QAAQ,CAAC,QAAQ,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAA;CAAC,GACtE;IAAC,QAAQ,CAAC,IAAI,EAAE,cAAc,CAAC;IAAC,QAAQ,CAAC,QAAQ,EAAE,MAAM,CAAC;IAAC,QAAQ,CAAC,SAAS,EAAE,MAAM,CAAA;CAAC,GACtF;IAAC,QAAQ,CAAC,IAAI,EAAE,OAAO,CAAA;CAAC,CAAC;AAE7B;;GAEG;AACH,qBAAa,gBAAgB;IAC3B,OAAO,CAAC,MAAM,CAA2B;IAEzC,MAAM,CAAC,KAAK,EAAE,MAAM,GAAG,WAAW,EAAE;CAkBrC;AAED;;GAEG;AACH,wBAAgB,uBAAuB,CAAC,QAAQ,EAAE,MAAM,EAAE,SAAS,EAAE,MAAM,GAAG,MAAM,EAAE,CAKrF"}
|
|
@@ -1,7 +1,11 @@
|
|
|
1
|
+
import { Http2Constants } from './constants.js';
|
|
1
2
|
import { InvalidDataError, WindowUpdateFrame } from './handshake-frames.js';
|
|
2
3
|
const FRAME_HEADER_SIZE = 9;
|
|
3
4
|
const FRAME_TYPE_DATA = 0x00;
|
|
5
|
+
const FRAME_TYPE_SETTINGS = 0x04;
|
|
6
|
+
const FRAME_TYPE_WINDOW_UPDATE = 0x08;
|
|
4
7
|
const FLAG_PADDED = 0x08;
|
|
8
|
+
const SETTINGS_ENTRY_SIZE = 6;
|
|
5
9
|
/**
|
|
6
10
|
* Incrementally parse HTTP/2 frames from a byte stream (RFC 7540).
|
|
7
11
|
*/
|
|
@@ -38,6 +42,12 @@ function parseFrame(buffer) {
|
|
|
38
42
|
const flags = buffer[4];
|
|
39
43
|
const streamId = buffer.readUInt32BE(5) & 0x7fffffff;
|
|
40
44
|
const body = buffer.subarray(FRAME_HEADER_SIZE, FRAME_HEADER_SIZE + length);
|
|
45
|
+
if (type === FRAME_TYPE_SETTINGS && !(flags & Http2Constants.FLAG_ACK)) {
|
|
46
|
+
return { type: 'settings', settings: parseSettings(body) };
|
|
47
|
+
}
|
|
48
|
+
if (type === FRAME_TYPE_WINDOW_UPDATE) {
|
|
49
|
+
return { type: 'windowUpdate', streamId, increment: body.readUInt32BE(0) & 0x7fffffff };
|
|
50
|
+
}
|
|
41
51
|
if (type !== FRAME_TYPE_DATA) {
|
|
42
52
|
return { type: 'other' };
|
|
43
53
|
}
|
|
@@ -47,6 +57,13 @@ function parseFrame(buffer) {
|
|
|
47
57
|
frame: { streamId, data, bodyLen: length },
|
|
48
58
|
};
|
|
49
59
|
}
|
|
60
|
+
/** SETTINGS body is a list of 16-bit identifier / 32-bit value pairs (RFC 7540 §6.5.1). */
|
|
61
|
+
function parseSettings(body) {
|
|
62
|
+
return Object.fromEntries(Array.from({ length: Math.floor(body.length / SETTINGS_ENTRY_SIZE) }, (_, i) => {
|
|
63
|
+
const offset = i * SETTINGS_ENTRY_SIZE;
|
|
64
|
+
return [body.readUInt16BE(offset), body.readUInt32BE(offset + 2)];
|
|
65
|
+
}));
|
|
66
|
+
}
|
|
50
67
|
/**
|
|
51
68
|
* Strip HTTP/2 DATA frame padding (RFC 7540 §6.1).
|
|
52
69
|
* @throws {InvalidDataError} when padding length is invalid
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"http2-frame-parser.js","sourceRoot":"","sources":["../../../../src/lib/remote-xpc/http2-frame-parser.ts"],"names":[],"mappings":"AAAA,OAAO,EAAC,gBAAgB,EAAE,iBAAiB,EAAC,MAAM,uBAAuB,CAAC;AAE1E,MAAM,iBAAiB,GAAG,CAAC,CAAC;AAC5B,MAAM,eAAe,GAAG,IAAI,CAAC;AAC7B,MAAM,WAAW,GAAG,IAAI,CAAC;
|
|
1
|
+
{"version":3,"file":"http2-frame-parser.js","sourceRoot":"","sources":["../../../../src/lib/remote-xpc/http2-frame-parser.ts"],"names":[],"mappings":"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"}
|
|
@@ -15,6 +15,11 @@ export declare class RemoteXpcFramedTransport extends EventEmitter {
|
|
|
15
15
|
private connected;
|
|
16
16
|
private closing;
|
|
17
17
|
private desynced;
|
|
18
|
+
private peerMaxFrameSize;
|
|
19
|
+
private peerInitialWindowSize;
|
|
20
|
+
private connectionSendWindow;
|
|
21
|
+
private streamSendWindows;
|
|
22
|
+
private sendQueue;
|
|
18
23
|
constructor(address: [string, number]);
|
|
19
24
|
get isConnected(): boolean;
|
|
20
25
|
/**
|
|
@@ -29,6 +34,17 @@ export declare class RemoteXpcFramedTransport extends EventEmitter {
|
|
|
29
34
|
get localAddress(): string | undefined;
|
|
30
35
|
connect(options: RemoteXpcFramedTransportConnectOptions): Promise<void>;
|
|
31
36
|
sendDataFrame(payload: Buffer, streamId?: number): void;
|
|
37
|
+
/**
|
|
38
|
+
* Writes queued payloads as DATA frames no larger than the peer's max frame size
|
|
39
|
+
* or its send windows. Stops at the first blocked payload so ordering holds.
|
|
40
|
+
*/
|
|
41
|
+
private flushPendingSends;
|
|
42
|
+
/** Stream 0 is the connection-level window. */
|
|
43
|
+
private sendWindow;
|
|
44
|
+
private adjustSendWindow;
|
|
45
|
+
private consumeSendWindow;
|
|
46
|
+
/** A new INITIAL_WINDOW_SIZE shifts every open stream's window by the delta (RFC 7540 §6.9.2). */
|
|
47
|
+
private applyPeerSettings;
|
|
32
48
|
close(): Promise<void>;
|
|
33
49
|
private waitForSocketConnect;
|
|
34
50
|
/**
|
|
@@ -56,6 +72,6 @@ export declare class RemoteXpcFramedTransport extends EventEmitter {
|
|
|
56
72
|
*/
|
|
57
73
|
private decodeAndEmit;
|
|
58
74
|
private shutdownSocket;
|
|
59
|
-
private
|
|
75
|
+
private resetConnectionState;
|
|
60
76
|
}
|
|
61
77
|
//# sourceMappingURL=remote-xpc-framed-transport.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"remote-xpc-framed-transport.d.ts","sourceRoot":"","sources":["../../../../src/lib/remote-xpc/remote-xpc-framed-transport.ts"],"names":[],"mappings":"AAAA,OAAO,EAAC,YAAY,EAAC,MAAM,aAAa,CAAC;
|
|
1
|
+
{"version":3,"file":"remote-xpc-framed-transport.d.ts","sourceRoot":"","sources":["../../../../src/lib/remote-xpc/remote-xpc-framed-transport.ts"],"names":[],"mappings":"AAAA,OAAO,EAAC,YAAY,EAAC,MAAM,aAAa,CAAC;AAgBzC,MAAM,WAAW,sCAAsC;IACrD,SAAS,EAAE,MAAM,CAAC;IAClB,gBAAgB,CAAC,EAAE,MAAM,CAAC;CAC3B;AAED;;;GAGG;AACH,qBAAa,wBAAyB,SAAQ,YAAY;IACxD,OAAO,CAAC,QAAQ,CAAC,OAAO,CAAmB;IAC3C,OAAO,CAAC,MAAM,CAA2B;IACzC,OAAO,CAAC,WAAW,CAA0B;IAC7C,OAAO,CAAC,cAAc,CAA6B;IACnD,OAAO,CAAC,SAAS,CAAS;IAC1B,OAAO,CAAC,OAAO,CAAS;IACxB,OAAO,CAAC,QAAQ,CAAS;IACzB,OAAO,CAAC,gBAAgB,CAAsD;IAC9E,OAAO,CAAC,qBAAqB,CAAmD;IAChF,OAAO,CAAC,oBAAoB,CAAmD;IAC/E,OAAO,CAAC,iBAAiB,CAA6B;IACtD,OAAO,CAAC,SAAS,CAA6C;gBAElD,OAAO,EAAE,CAAC,MAAM,EAAE,MAAM,CAAC;IAKrC,IAAI,WAAW,IAAI,OAAO,CAEzB;IAED;;;;;;;;OAQG;IACH,IAAI,YAAY,IAAI,MAAM,GAAG,SAAS,CAErC;IAEK,OAAO,CAAC,OAAO,EAAE,sCAAsC,GAAG,OAAO,CAAC,IAAI,CAAC;IAmC7E,aAAa,CAAC,OAAO,EAAE,MAAM,EAAE,QAAQ,SAAI,GAAG,IAAI;IAQlD;;;OAGG;IACH,OAAO,CAAC,iBAAiB;IAuBzB,+CAA+C;IAC/C,OAAO,CAAC,UAAU;IAMlB,OAAO,CAAC,gBAAgB;IAQxB,OAAO,CAAC,iBAAiB;IAKzB,kGAAkG;IAClG,OAAO,CAAC,iBAAiB;IAenB,KAAK,IAAI,OAAO,CAAC,IAAI,CAAC;IAe5B,OAAO,CAAC,oBAAoB;IAyB5B;;;OAGG;IACH,OAAO,CAAC,sBAAsB;IAgC9B,OAAO,CAAC,UAAU;IAyClB;;;;OAIG;IACH,OAAO,CAAC,aAAa;IA0BrB;;;;OAIG;IACH,OAAO,CAAC,YAAY;IASpB;;;;OAIG;IACH,OAAO,CAAC,aAAa;IAarB,OAAO,CAAC,cAAc;IA6CtB,OAAO,CAAC,oBAAoB;CAU7B"}
|
|
@@ -1,6 +1,7 @@
|
|
|
1
1
|
import { EventEmitter } from 'node:events';
|
|
2
2
|
import net from 'node:net';
|
|
3
3
|
import { getLogger } from '../logger.js';
|
|
4
|
+
import { Http2Constants } from './constants.js';
|
|
4
5
|
import { DataFrame } from './handshake-frames.js';
|
|
5
6
|
import Handshake from './handshake.js';
|
|
6
7
|
import { Http2FrameParser, buildWindowUpdateFrames } from './http2-frame-parser.js';
|
|
@@ -20,6 +21,11 @@ export class RemoteXpcFramedTransport extends EventEmitter {
|
|
|
20
21
|
connected = false;
|
|
21
22
|
closing = false;
|
|
22
23
|
desynced = false;
|
|
24
|
+
peerMaxFrameSize = Http2Constants.DEFAULT_PEER_MAX_FRAME_SIZE;
|
|
25
|
+
peerInitialWindowSize = Http2Constants.DEFAULT_PEER_WINDOW_SIZE;
|
|
26
|
+
connectionSendWindow = Http2Constants.DEFAULT_PEER_WINDOW_SIZE;
|
|
27
|
+
streamSendWindows = new Map();
|
|
28
|
+
sendQueue = [];
|
|
23
29
|
constructor(address) {
|
|
24
30
|
super();
|
|
25
31
|
this.address = address;
|
|
@@ -43,7 +49,7 @@ export class RemoteXpcFramedTransport extends EventEmitter {
|
|
|
43
49
|
if (this.connected) {
|
|
44
50
|
return;
|
|
45
51
|
}
|
|
46
|
-
this.
|
|
52
|
+
this.resetConnectionState();
|
|
47
53
|
const socket = net.createConnection({
|
|
48
54
|
host: this.address[0],
|
|
49
55
|
port: this.address[1],
|
|
@@ -58,7 +64,11 @@ export class RemoteXpcFramedTransport extends EventEmitter {
|
|
|
58
64
|
await new Promise((resolve) => setTimeout(resolve, options.handshakeDelayMs));
|
|
59
65
|
}
|
|
60
66
|
try {
|
|
61
|
-
|
|
67
|
+
const handshake = new Handshake(socket);
|
|
68
|
+
await handshake.perform();
|
|
69
|
+
for (const [streamId, bytes] of Object.entries(handshake.dataBytesSent)) {
|
|
70
|
+
this.consumeSendWindow(Number(streamId), bytes);
|
|
71
|
+
}
|
|
62
72
|
this.connected = true;
|
|
63
73
|
}
|
|
64
74
|
catch (error) {
|
|
@@ -70,7 +80,63 @@ export class RemoteXpcFramedTransport extends EventEmitter {
|
|
|
70
80
|
if (!this.socket?.writable) {
|
|
71
81
|
throw new Error('RemoteXPC socket is not writable');
|
|
72
82
|
}
|
|
73
|
-
this.
|
|
83
|
+
this.sendQueue.push({ streamId, payload });
|
|
84
|
+
this.flushPendingSends();
|
|
85
|
+
}
|
|
86
|
+
/**
|
|
87
|
+
* Writes queued payloads as DATA frames no larger than the peer's max frame size
|
|
88
|
+
* or its send windows. Stops at the first blocked payload so ordering holds.
|
|
89
|
+
*/
|
|
90
|
+
flushPendingSends() {
|
|
91
|
+
const socket = this.socket;
|
|
92
|
+
while (socket?.writable && this.sendQueue.length > 0) {
|
|
93
|
+
const send = this.sendQueue[0];
|
|
94
|
+
const size = Math.min(send.payload.length, this.peerMaxFrameSize, this.sendWindow(0), this.sendWindow(send.streamId));
|
|
95
|
+
if (size <= 0 && send.payload.length > 0) {
|
|
96
|
+
return;
|
|
97
|
+
}
|
|
98
|
+
socket.write(new DataFrame(send.streamId, send.payload.subarray(0, size), []).serialize());
|
|
99
|
+
this.consumeSendWindow(send.streamId, size);
|
|
100
|
+
if (size === send.payload.length) {
|
|
101
|
+
this.sendQueue.shift();
|
|
102
|
+
}
|
|
103
|
+
else {
|
|
104
|
+
send.payload = send.payload.subarray(size);
|
|
105
|
+
}
|
|
106
|
+
}
|
|
107
|
+
}
|
|
108
|
+
/** Stream 0 is the connection-level window. */
|
|
109
|
+
sendWindow(streamId) {
|
|
110
|
+
return streamId === 0
|
|
111
|
+
? this.connectionSendWindow
|
|
112
|
+
: (this.streamSendWindows.get(streamId) ?? this.peerInitialWindowSize);
|
|
113
|
+
}
|
|
114
|
+
adjustSendWindow(streamId, delta) {
|
|
115
|
+
if (streamId === 0) {
|
|
116
|
+
this.connectionSendWindow += delta;
|
|
117
|
+
}
|
|
118
|
+
else {
|
|
119
|
+
this.streamSendWindows.set(streamId, this.sendWindow(streamId) + delta);
|
|
120
|
+
}
|
|
121
|
+
}
|
|
122
|
+
consumeSendWindow(streamId, bytes) {
|
|
123
|
+
this.adjustSendWindow(0, -bytes);
|
|
124
|
+
this.adjustSendWindow(streamId, -bytes);
|
|
125
|
+
}
|
|
126
|
+
/** A new INITIAL_WINDOW_SIZE shifts every open stream's window by the delta (RFC 7540 §6.9.2). */
|
|
127
|
+
applyPeerSettings(settings) {
|
|
128
|
+
const maxFrameSize = settings[Http2Constants.SETTINGS_MAX_FRAME_SIZE];
|
|
129
|
+
if (maxFrameSize !== undefined) {
|
|
130
|
+
this.peerMaxFrameSize = maxFrameSize;
|
|
131
|
+
}
|
|
132
|
+
const initialWindowSize = settings[Http2Constants.SETTINGS_INITIAL_WINDOW_SIZE];
|
|
133
|
+
if (initialWindowSize !== undefined) {
|
|
134
|
+
const delta = initialWindowSize - this.peerInitialWindowSize;
|
|
135
|
+
this.peerInitialWindowSize = initialWindowSize;
|
|
136
|
+
for (const [streamId, window] of this.streamSendWindows) {
|
|
137
|
+
this.streamSendWindows.set(streamId, window + delta);
|
|
138
|
+
}
|
|
139
|
+
}
|
|
74
140
|
}
|
|
75
141
|
async close() {
|
|
76
142
|
this.closing = true;
|
|
@@ -152,6 +218,16 @@ export class RemoteXpcFramedTransport extends EventEmitter {
|
|
|
152
218
|
return;
|
|
153
219
|
}
|
|
154
220
|
for (const frame of frames) {
|
|
221
|
+
if (frame.type === 'settings') {
|
|
222
|
+
this.applyPeerSettings(frame.settings);
|
|
223
|
+
this.flushPendingSends();
|
|
224
|
+
continue;
|
|
225
|
+
}
|
|
226
|
+
if (frame.type === 'windowUpdate') {
|
|
227
|
+
this.adjustSendWindow(frame.streamId, frame.increment);
|
|
228
|
+
this.flushPendingSends();
|
|
229
|
+
continue;
|
|
230
|
+
}
|
|
155
231
|
if (frame.type !== 'data') {
|
|
156
232
|
continue;
|
|
157
233
|
}
|
|
@@ -264,10 +340,15 @@ export class RemoteXpcFramedTransport extends EventEmitter {
|
|
|
264
340
|
}
|
|
265
341
|
});
|
|
266
342
|
}
|
|
267
|
-
|
|
343
|
+
resetConnectionState() {
|
|
268
344
|
this.frameParser = new Http2FrameParser();
|
|
269
345
|
this.pendingXpcData.clear();
|
|
270
346
|
this.desynced = false;
|
|
347
|
+
this.peerMaxFrameSize = Http2Constants.DEFAULT_PEER_MAX_FRAME_SIZE;
|
|
348
|
+
this.peerInitialWindowSize = Http2Constants.DEFAULT_PEER_WINDOW_SIZE;
|
|
349
|
+
this.connectionSendWindow = Http2Constants.DEFAULT_PEER_WINDOW_SIZE;
|
|
350
|
+
this.streamSendWindows.clear();
|
|
351
|
+
this.sendQueue = [];
|
|
271
352
|
}
|
|
272
353
|
}
|
|
273
354
|
//# sourceMappingURL=remote-xpc-framed-transport.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"remote-xpc-framed-transport.js","sourceRoot":"","sources":["../../../../src/lib/remote-xpc/remote-xpc-framed-transport.ts"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"remote-xpc-framed-transport.js","sourceRoot":"","sources":["../../../../src/lib/remote-xpc/remote-xpc-framed-transport.ts"],"names":[],"mappings":"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"}
|
package/package.json
CHANGED
|
@@ -15,6 +15,9 @@ export const Http2Constants = {
|
|
|
15
15
|
DEFAULT_WIN_SIZE_INCR: 16 * 1024 * 1024 - 65535,
|
|
16
16
|
SETTINGS_MAX_CONCURRENT_STREAMS: 0x03,
|
|
17
17
|
SETTINGS_INITIAL_WINDOW_SIZE: 0x04,
|
|
18
|
+
SETTINGS_MAX_FRAME_SIZE: 0x05,
|
|
19
|
+
DEFAULT_PEER_MAX_FRAME_SIZE: 16384,
|
|
20
|
+
DEFAULT_PEER_WINDOW_SIZE: 65535,
|
|
18
21
|
} as const;
|
|
19
22
|
|
|
20
23
|
// XPC Constants
|
|
@@ -11,6 +11,7 @@ export type MessageId = number;
|
|
|
11
11
|
class Handshake {
|
|
12
12
|
private _socket: Socket;
|
|
13
13
|
private readonly _nextMessageId: Record<ChannelId, MessageId>;
|
|
14
|
+
private readonly _dataBytesSent: Record<ChannelId, number>;
|
|
14
15
|
|
|
15
16
|
constructor(socket: Socket) {
|
|
16
17
|
this._socket = socket;
|
|
@@ -18,6 +19,15 @@ class Handshake {
|
|
|
18
19
|
[Http2Constants.ROOT_CHANNEL]: 0,
|
|
19
20
|
[Http2Constants.REPLY_CHANNEL]: 0,
|
|
20
21
|
};
|
|
22
|
+
this._dataBytesSent = {
|
|
23
|
+
[Http2Constants.ROOT_CHANNEL]: 0,
|
|
24
|
+
[Http2Constants.REPLY_CHANNEL]: 0,
|
|
25
|
+
};
|
|
26
|
+
}
|
|
27
|
+
|
|
28
|
+
/** DATA payload bytes sent per stream, so the transport can debit its send windows. */
|
|
29
|
+
get dataBytesSent(): Readonly<Record<ChannelId, number>> {
|
|
30
|
+
return {...this._dataBytesSent};
|
|
21
31
|
}
|
|
22
32
|
|
|
23
33
|
async sendFrame(frame: Buffer): Promise<void> {
|
|
@@ -45,9 +55,13 @@ class Handshake {
|
|
|
45
55
|
body: data,
|
|
46
56
|
};
|
|
47
57
|
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
58
|
+
await this.sendData(Http2Constants.ROOT_CHANNEL, requestMessage);
|
|
59
|
+
}
|
|
60
|
+
|
|
61
|
+
private async sendData(streamId: ChannelId, message: XPCMessage): Promise<void> {
|
|
62
|
+
const encoded: Buffer = encodeMessage(message);
|
|
63
|
+
this._dataBytesSent[streamId] += encoded.length;
|
|
64
|
+
await this.sendFrame(new DataFrame(streamId, encoded, []).serialize());
|
|
51
65
|
}
|
|
52
66
|
|
|
53
67
|
async perform(): Promise<void> {
|
|
@@ -98,9 +112,7 @@ class Handshake {
|
|
|
98
112
|
id: 0,
|
|
99
113
|
body: null,
|
|
100
114
|
};
|
|
101
|
-
|
|
102
|
-
const dataFrame: DataFrame = new DataFrame(Http2Constants.ROOT_CHANNEL, encodedDataMessage, []);
|
|
103
|
-
await this.sendFrame(dataFrame.serialize());
|
|
115
|
+
await this.sendData(Http2Constants.ROOT_CHANNEL, dataMessage);
|
|
104
116
|
this._nextMessageId[Http2Constants.ROOT_CHANNEL]++;
|
|
105
117
|
|
|
106
118
|
// Step 8: Open REPLY_CHANNEL with INIT_HANDSHAKE flags.
|
|
@@ -109,9 +121,7 @@ class Handshake {
|
|
|
109
121
|
id: 0,
|
|
110
122
|
body: null,
|
|
111
123
|
};
|
|
112
|
-
|
|
113
|
-
const replyDataFrame: DataFrame = new DataFrame(Http2Constants.REPLY_CHANNEL, encodedReplyMessage, []);
|
|
114
|
-
await this.sendFrame(replyDataFrame.serialize());
|
|
124
|
+
await this.sendData(Http2Constants.REPLY_CHANNEL, replyMessage);
|
|
115
125
|
this._nextMessageId[Http2Constants.REPLY_CHANNEL]++;
|
|
116
126
|
|
|
117
127
|
// Step 9: Send SETTINGS ACK frame.
|
|
@@ -1,8 +1,12 @@
|
|
|
1
|
+
import {Http2Constants} from './constants.js';
|
|
1
2
|
import {InvalidDataError, WindowUpdateFrame} from './handshake-frames.js';
|
|
2
3
|
|
|
3
4
|
const FRAME_HEADER_SIZE = 9;
|
|
4
5
|
const FRAME_TYPE_DATA = 0x00;
|
|
6
|
+
const FRAME_TYPE_SETTINGS = 0x04;
|
|
7
|
+
const FRAME_TYPE_WINDOW_UPDATE = 0x08;
|
|
5
8
|
const FLAG_PADDED = 0x08;
|
|
9
|
+
const SETTINGS_ENTRY_SIZE = 6;
|
|
6
10
|
|
|
7
11
|
export interface ParsedDataFrame {
|
|
8
12
|
readonly streamId: number;
|
|
@@ -10,7 +14,11 @@ export interface ParsedDataFrame {
|
|
|
10
14
|
readonly bodyLen: number;
|
|
11
15
|
}
|
|
12
16
|
|
|
13
|
-
export type ParsedFrame =
|
|
17
|
+
export type ParsedFrame =
|
|
18
|
+
| {readonly type: 'data'; readonly frame: ParsedDataFrame}
|
|
19
|
+
| {readonly type: 'settings'; readonly settings: Record<number, number>}
|
|
20
|
+
| {readonly type: 'windowUpdate'; readonly streamId: number; readonly increment: number}
|
|
21
|
+
| {readonly type: 'other'};
|
|
14
22
|
|
|
15
23
|
/**
|
|
16
24
|
* Incrementally parse HTTP/2 frames from a byte stream (RFC 7540).
|
|
@@ -55,6 +63,12 @@ function parseFrame(buffer: Buffer): ParsedFrame {
|
|
|
55
63
|
const streamId = buffer.readUInt32BE(5) & 0x7fffffff;
|
|
56
64
|
const body = buffer.subarray(FRAME_HEADER_SIZE, FRAME_HEADER_SIZE + length);
|
|
57
65
|
|
|
66
|
+
if (type === FRAME_TYPE_SETTINGS && !(flags & Http2Constants.FLAG_ACK)) {
|
|
67
|
+
return {type: 'settings', settings: parseSettings(body)};
|
|
68
|
+
}
|
|
69
|
+
if (type === FRAME_TYPE_WINDOW_UPDATE) {
|
|
70
|
+
return {type: 'windowUpdate', streamId, increment: body.readUInt32BE(0) & 0x7fffffff};
|
|
71
|
+
}
|
|
58
72
|
if (type !== FRAME_TYPE_DATA) {
|
|
59
73
|
return {type: 'other'};
|
|
60
74
|
}
|
|
@@ -67,6 +81,16 @@ function parseFrame(buffer: Buffer): ParsedFrame {
|
|
|
67
81
|
};
|
|
68
82
|
}
|
|
69
83
|
|
|
84
|
+
/** SETTINGS body is a list of 16-bit identifier / 32-bit value pairs (RFC 7540 §6.5.1). */
|
|
85
|
+
function parseSettings(body: Buffer): Record<number, number> {
|
|
86
|
+
return Object.fromEntries(
|
|
87
|
+
Array.from({length: Math.floor(body.length / SETTINGS_ENTRY_SIZE)}, (_, i) => {
|
|
88
|
+
const offset = i * SETTINGS_ENTRY_SIZE;
|
|
89
|
+
return [body.readUInt16BE(offset), body.readUInt32BE(offset + 2)];
|
|
90
|
+
}),
|
|
91
|
+
);
|
|
92
|
+
}
|
|
93
|
+
|
|
70
94
|
/**
|
|
71
95
|
* Strip HTTP/2 DATA frame padding (RFC 7540 §6.1).
|
|
72
96
|
* @throws {InvalidDataError} when padding length is invalid
|
|
@@ -3,6 +3,7 @@ import net from 'node:net';
|
|
|
3
3
|
|
|
4
4
|
import {getLogger} from '../logger.js';
|
|
5
5
|
import type {XPCDictionary} from '../types.js';
|
|
6
|
+
import {Http2Constants} from './constants.js';
|
|
6
7
|
import {DataFrame} from './handshake-frames.js';
|
|
7
8
|
import Handshake from './handshake.js';
|
|
8
9
|
import {Http2FrameParser, buildWindowUpdateFrames} from './http2-frame-parser.js';
|
|
@@ -30,6 +31,11 @@ export class RemoteXpcFramedTransport extends EventEmitter {
|
|
|
30
31
|
private connected = false;
|
|
31
32
|
private closing = false;
|
|
32
33
|
private desynced = false;
|
|
34
|
+
private peerMaxFrameSize: number = Http2Constants.DEFAULT_PEER_MAX_FRAME_SIZE;
|
|
35
|
+
private peerInitialWindowSize: number = Http2Constants.DEFAULT_PEER_WINDOW_SIZE;
|
|
36
|
+
private connectionSendWindow: number = Http2Constants.DEFAULT_PEER_WINDOW_SIZE;
|
|
37
|
+
private streamSendWindows = new Map<number, number>();
|
|
38
|
+
private sendQueue: {streamId: number; payload: Buffer}[] = [];
|
|
33
39
|
|
|
34
40
|
constructor(address: [string, number]) {
|
|
35
41
|
super();
|
|
@@ -58,7 +64,7 @@ export class RemoteXpcFramedTransport extends EventEmitter {
|
|
|
58
64
|
return;
|
|
59
65
|
}
|
|
60
66
|
|
|
61
|
-
this.
|
|
67
|
+
this.resetConnectionState();
|
|
62
68
|
const socket = net.createConnection({
|
|
63
69
|
host: this.address[0],
|
|
64
70
|
port: this.address[1],
|
|
@@ -76,7 +82,11 @@ export class RemoteXpcFramedTransport extends EventEmitter {
|
|
|
76
82
|
}
|
|
77
83
|
|
|
78
84
|
try {
|
|
79
|
-
|
|
85
|
+
const handshake = new Handshake(socket);
|
|
86
|
+
await handshake.perform();
|
|
87
|
+
for (const [streamId, bytes] of Object.entries(handshake.dataBytesSent)) {
|
|
88
|
+
this.consumeSendWindow(Number(streamId), bytes);
|
|
89
|
+
}
|
|
80
90
|
this.connected = true;
|
|
81
91
|
} catch (error) {
|
|
82
92
|
await this.close();
|
|
@@ -88,7 +98,71 @@ export class RemoteXpcFramedTransport extends EventEmitter {
|
|
|
88
98
|
if (!this.socket?.writable) {
|
|
89
99
|
throw new Error('RemoteXPC socket is not writable');
|
|
90
100
|
}
|
|
91
|
-
this.
|
|
101
|
+
this.sendQueue.push({streamId, payload});
|
|
102
|
+
this.flushPendingSends();
|
|
103
|
+
}
|
|
104
|
+
|
|
105
|
+
/**
|
|
106
|
+
* Writes queued payloads as DATA frames no larger than the peer's max frame size
|
|
107
|
+
* or its send windows. Stops at the first blocked payload so ordering holds.
|
|
108
|
+
*/
|
|
109
|
+
private flushPendingSends(): void {
|
|
110
|
+
const socket = this.socket;
|
|
111
|
+
while (socket?.writable && this.sendQueue.length > 0) {
|
|
112
|
+
const send = this.sendQueue[0];
|
|
113
|
+
const size = Math.min(
|
|
114
|
+
send.payload.length,
|
|
115
|
+
this.peerMaxFrameSize,
|
|
116
|
+
this.sendWindow(0),
|
|
117
|
+
this.sendWindow(send.streamId),
|
|
118
|
+
);
|
|
119
|
+
if (size <= 0 && send.payload.length > 0) {
|
|
120
|
+
return;
|
|
121
|
+
}
|
|
122
|
+
socket.write(new DataFrame(send.streamId, send.payload.subarray(0, size), []).serialize());
|
|
123
|
+
this.consumeSendWindow(send.streamId, size);
|
|
124
|
+
if (size === send.payload.length) {
|
|
125
|
+
this.sendQueue.shift();
|
|
126
|
+
} else {
|
|
127
|
+
send.payload = send.payload.subarray(size);
|
|
128
|
+
}
|
|
129
|
+
}
|
|
130
|
+
}
|
|
131
|
+
|
|
132
|
+
/** Stream 0 is the connection-level window. */
|
|
133
|
+
private sendWindow(streamId: number): number {
|
|
134
|
+
return streamId === 0
|
|
135
|
+
? this.connectionSendWindow
|
|
136
|
+
: (this.streamSendWindows.get(streamId) ?? this.peerInitialWindowSize);
|
|
137
|
+
}
|
|
138
|
+
|
|
139
|
+
private adjustSendWindow(streamId: number, delta: number): void {
|
|
140
|
+
if (streamId === 0) {
|
|
141
|
+
this.connectionSendWindow += delta;
|
|
142
|
+
} else {
|
|
143
|
+
this.streamSendWindows.set(streamId, this.sendWindow(streamId) + delta);
|
|
144
|
+
}
|
|
145
|
+
}
|
|
146
|
+
|
|
147
|
+
private consumeSendWindow(streamId: number, bytes: number): void {
|
|
148
|
+
this.adjustSendWindow(0, -bytes);
|
|
149
|
+
this.adjustSendWindow(streamId, -bytes);
|
|
150
|
+
}
|
|
151
|
+
|
|
152
|
+
/** A new INITIAL_WINDOW_SIZE shifts every open stream's window by the delta (RFC 7540 §6.9.2). */
|
|
153
|
+
private applyPeerSettings(settings: Record<number, number>): void {
|
|
154
|
+
const maxFrameSize = settings[Http2Constants.SETTINGS_MAX_FRAME_SIZE];
|
|
155
|
+
if (maxFrameSize !== undefined) {
|
|
156
|
+
this.peerMaxFrameSize = maxFrameSize;
|
|
157
|
+
}
|
|
158
|
+
const initialWindowSize = settings[Http2Constants.SETTINGS_INITIAL_WINDOW_SIZE];
|
|
159
|
+
if (initialWindowSize !== undefined) {
|
|
160
|
+
const delta = initialWindowSize - this.peerInitialWindowSize;
|
|
161
|
+
this.peerInitialWindowSize = initialWindowSize;
|
|
162
|
+
for (const [streamId, window] of this.streamSendWindows) {
|
|
163
|
+
this.streamSendWindows.set(streamId, window + delta);
|
|
164
|
+
}
|
|
165
|
+
}
|
|
92
166
|
}
|
|
93
167
|
|
|
94
168
|
async close(): Promise<void> {
|
|
@@ -181,6 +255,16 @@ export class RemoteXpcFramedTransport extends EventEmitter {
|
|
|
181
255
|
}
|
|
182
256
|
|
|
183
257
|
for (const frame of frames) {
|
|
258
|
+
if (frame.type === 'settings') {
|
|
259
|
+
this.applyPeerSettings(frame.settings);
|
|
260
|
+
this.flushPendingSends();
|
|
261
|
+
continue;
|
|
262
|
+
}
|
|
263
|
+
if (frame.type === 'windowUpdate') {
|
|
264
|
+
this.adjustSendWindow(frame.streamId, frame.increment);
|
|
265
|
+
this.flushPendingSends();
|
|
266
|
+
continue;
|
|
267
|
+
}
|
|
184
268
|
if (frame.type !== 'data') {
|
|
185
269
|
continue;
|
|
186
270
|
}
|
|
@@ -306,9 +390,14 @@ export class RemoteXpcFramedTransport extends EventEmitter {
|
|
|
306
390
|
});
|
|
307
391
|
}
|
|
308
392
|
|
|
309
|
-
private
|
|
393
|
+
private resetConnectionState(): void {
|
|
310
394
|
this.frameParser = new Http2FrameParser();
|
|
311
395
|
this.pendingXpcData.clear();
|
|
312
396
|
this.desynced = false;
|
|
397
|
+
this.peerMaxFrameSize = Http2Constants.DEFAULT_PEER_MAX_FRAME_SIZE;
|
|
398
|
+
this.peerInitialWindowSize = Http2Constants.DEFAULT_PEER_WINDOW_SIZE;
|
|
399
|
+
this.connectionSendWindow = Http2Constants.DEFAULT_PEER_WINDOW_SIZE;
|
|
400
|
+
this.streamSendWindows.clear();
|
|
401
|
+
this.sendQueue = [];
|
|
313
402
|
}
|
|
314
403
|
}
|