@yume-chan/adb 0.0.22 → 0.0.24
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.json +51 -0
- package/CHANGELOG.md +24 -1
- package/LICENSE +1 -1
- package/esm/adb.d.ts +6 -3
- package/esm/adb.d.ts.map +1 -1
- package/esm/adb.js +11 -4
- package/esm/adb.js.map +1 -1
- package/esm/banner.d.ts.map +1 -1
- package/esm/banner.js +1 -0
- package/esm/banner.js.map +1 -1
- package/esm/commands/power.d.ts.map +1 -1
- package/esm/commands/power.js +6 -5
- package/esm/commands/power.js.map +1 -1
- package/esm/commands/reverse.d.ts.map +1 -1
- package/esm/commands/reverse.js +23 -11
- package/esm/commands/reverse.js.map +1 -1
- package/esm/commands/subprocess/command.js +3 -3
- package/esm/commands/subprocess/command.js.map +1 -1
- package/esm/commands/subprocess/protocols/none.d.ts +2 -2
- package/esm/commands/subprocess/protocols/none.d.ts.map +1 -1
- package/esm/commands/subprocess/protocols/shell.d.ts +3 -3
- package/esm/commands/subprocess/protocols/shell.d.ts.map +1 -1
- package/esm/commands/subprocess/protocols/shell.js +14 -69
- package/esm/commands/subprocess/protocols/shell.js.map +1 -1
- package/esm/commands/subprocess/protocols/types.d.ts +2 -2
- package/esm/commands/subprocess/protocols/types.d.ts.map +1 -1
- package/esm/commands/subprocess/utils.js +1 -1
- package/esm/commands/subprocess/utils.js.map +1 -1
- package/esm/commands/sync/list.d.ts +2 -5
- package/esm/commands/sync/list.d.ts.map +1 -1
- package/esm/commands/sync/list.js +2 -4
- package/esm/commands/sync/list.js.map +1 -1
- package/esm/commands/sync/pull.d.ts +1 -4
- package/esm/commands/sync/pull.d.ts.map +1 -1
- package/esm/commands/sync/pull.js +2 -2
- package/esm/commands/sync/pull.js.map +1 -1
- package/esm/commands/sync/push.d.ts +4 -7
- package/esm/commands/sync/push.d.ts.map +1 -1
- package/esm/commands/sync/push.js +3 -6
- package/esm/commands/sync/push.js.map +1 -1
- package/esm/commands/sync/request.d.ts +13 -18
- package/esm/commands/sync/request.d.ts.map +1 -1
- package/esm/commands/sync/request.js +23 -28
- package/esm/commands/sync/request.js.map +1 -1
- package/esm/commands/sync/response.d.ts +18 -12
- package/esm/commands/sync/response.d.ts.map +1 -1
- package/esm/commands/sync/response.js +39 -17
- package/esm/commands/sync/response.js.map +1 -1
- package/esm/commands/sync/socket.d.ts +2 -2
- package/esm/commands/sync/socket.d.ts.map +1 -1
- package/esm/commands/sync/socket.js +10 -5
- package/esm/commands/sync/socket.js.map +1 -1
- package/esm/commands/sync/stat.d.ts +0 -3
- package/esm/commands/sync/stat.d.ts.map +1 -1
- package/esm/commands/sync/stat.js +0 -2
- package/esm/commands/sync/stat.js.map +1 -1
- package/esm/commands/sync/sync.d.ts +4 -3
- package/esm/commands/sync/sync.d.ts.map +1 -1
- package/esm/commands/sync/sync.js +9 -7
- package/esm/commands/sync/sync.js.map +1 -1
- package/esm/commands/tcpip.js +1 -1
- package/esm/commands/tcpip.js.map +1 -1
- package/esm/daemon/auth.js +1 -1
- package/esm/daemon/auth.js.map +1 -1
- package/esm/daemon/crypto.d.ts +3 -2
- package/esm/daemon/crypto.d.ts.map +1 -1
- package/esm/daemon/crypto.js +56 -49
- package/esm/daemon/crypto.js.map +1 -1
- package/esm/daemon/dispatcher.d.ts +38 -6
- package/esm/daemon/dispatcher.d.ts.map +1 -1
- package/esm/daemon/dispatcher.js +86 -28
- package/esm/daemon/dispatcher.js.map +1 -1
- package/esm/daemon/packet.d.ts +2 -2
- package/esm/daemon/packet.d.ts.map +1 -1
- package/esm/daemon/packet.js +13 -12
- package/esm/daemon/packet.js.map +1 -1
- package/esm/daemon/socket.d.ts +11 -6
- package/esm/daemon/socket.d.ts.map +1 -1
- package/esm/daemon/socket.js +42 -12
- package/esm/daemon/socket.js.map +1 -1
- package/esm/daemon/transport.d.ts +75 -11
- package/esm/daemon/transport.d.ts.map +1 -1
- package/esm/daemon/transport.js +60 -33
- package/esm/daemon/transport.js.map +1 -1
- package/esm/features.d.ts +2 -1
- package/esm/features.d.ts.map +1 -1
- package/esm/features.js +2 -1
- package/esm/features.js.map +1 -1
- package/esm/server/client.d.ts +128 -48
- package/esm/server/client.d.ts.map +1 -1
- package/esm/server/client.js +378 -145
- package/esm/server/client.js.map +1 -1
- package/esm/server/transport.d.ts +3 -0
- package/esm/server/transport.d.ts.map +1 -1
- package/esm/server/transport.js +30 -4
- package/esm/server/transport.js.map +1 -1
- package/esm/utils/base64.d.ts.map +1 -1
- package/esm/utils/base64.js +33 -22
- package/esm/utils/base64.js.map +1 -1
- package/esm/utils/hex.d.ts +1 -1
- package/esm/utils/hex.d.ts.map +1 -1
- package/esm/utils/hex.js +12 -14
- package/esm/utils/hex.js.map +1 -1
- package/esm/utils/index.d.ts +1 -1
- package/esm/utils/index.d.ts.map +1 -1
- package/esm/utils/index.js +1 -1
- package/esm/utils/index.js.map +1 -1
- package/esm/utils/sequence-equal.d.ts +2 -0
- package/esm/utils/sequence-equal.d.ts.map +1 -0
- package/esm/utils/sequence-equal.js +12 -0
- package/esm/utils/sequence-equal.js.map +1 -0
- package/package.json +13 -15
- package/src/adb.ts +22 -6
- package/src/banner.ts +1 -0
- package/src/commands/power.ts +7 -5
- package/src/commands/reverse.ts +31 -18
- package/src/commands/subprocess/command.ts +3 -3
- package/src/commands/subprocess/protocols/none.ts +2 -2
- package/src/commands/subprocess/protocols/shell.ts +21 -100
- package/src/commands/subprocess/protocols/types.ts +2 -2
- package/src/commands/subprocess/utils.ts +1 -1
- package/src/commands/sync/list.ts +2 -4
- package/src/commands/sync/pull.ts +2 -2
- package/src/commands/sync/push.ts +7 -10
- package/src/commands/sync/request.ts +32 -32
- package/src/commands/sync/response.ts +47 -20
- package/src/commands/sync/socket.ts +13 -8
- package/src/commands/sync/stat.ts +0 -2
- package/src/commands/sync/sync.ts +13 -9
- package/src/commands/tcpip.ts +1 -1
- package/src/daemon/auth.ts +1 -1
- package/src/daemon/crypto.ts +64 -55
- package/src/daemon/dispatcher.ts +175 -37
- package/src/daemon/packet.ts +21 -14
- package/src/daemon/socket.ts +62 -28
- package/src/daemon/transport.ts +145 -40
- package/src/features.ts +2 -1
- package/src/server/client.ts +472 -224
- package/src/server/transport.ts +32 -4
- package/src/utils/base64.ts +33 -22
- package/src/utils/hex.ts +16 -14
- package/src/utils/index.ts +1 -1
- package/src/utils/sequence-equal.ts +13 -0
- package/tsconfig.build.tsbuildinfo +1 -1
- package/esm/utils/conditional-variable.d.ts +0 -8
- package/esm/utils/conditional-variable.d.ts.map +0 -1
- package/esm/utils/conditional-variable.js +0 -34
- package/esm/utils/conditional-variable.js.map +0 -1
- package/src/utils/conditional-variable.ts +0 -45
package/esm/daemon/dispatcher.js
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
import { AsyncOperationManager, PromiseResolver, delay, } from "@yume-chan/async";
|
|
2
|
-
import {
|
|
3
|
-
import {
|
|
4
|
-
import { decodeUtf8, encodeUtf8 } from "
|
|
2
|
+
import { getUint32LittleEndian, setUint32LittleEndian, } from "@yume-chan/no-data-view";
|
|
3
|
+
import { AbortController, Consumable, WritableStream, } from "@yume-chan/stream-extra";
|
|
4
|
+
import { EMPTY_UINT8_ARRAY, decodeUtf8, encodeUtf8 } from "@yume-chan/struct";
|
|
5
5
|
import { AdbCommand, calculateChecksum } from "./packet.js";
|
|
6
6
|
import { AdbDaemonSocketController } from "./socket.js";
|
|
7
7
|
/**
|
|
@@ -33,6 +33,10 @@ export class AdbPacketDispatcher {
|
|
|
33
33
|
#readAbortController = new AbortController();
|
|
34
34
|
constructor(connection, options) {
|
|
35
35
|
this.options = options;
|
|
36
|
+
// Don't allow negative values in dispatcher
|
|
37
|
+
if (this.options.initialDelayedAckBytes < 0) {
|
|
38
|
+
this.options.initialDelayedAckBytes = 0;
|
|
39
|
+
}
|
|
36
40
|
connection.readable
|
|
37
41
|
.pipeTo(new WritableStream({
|
|
38
42
|
write: async (packet) => {
|
|
@@ -101,33 +105,80 @@ export class AdbPacketDispatcher {
|
|
|
101
105
|
// the device may also respond with two `CLSE` packets.
|
|
102
106
|
}
|
|
103
107
|
#handleOkay(packet) {
|
|
104
|
-
|
|
108
|
+
let ackBytes;
|
|
109
|
+
if (this.options.initialDelayedAckBytes !== 0) {
|
|
110
|
+
if (packet.payload.length !== 4) {
|
|
111
|
+
throw new Error("Invalid OKAY packet. Payload size should be 4");
|
|
112
|
+
}
|
|
113
|
+
ackBytes = getUint32LittleEndian(packet.payload, 0);
|
|
114
|
+
}
|
|
115
|
+
else {
|
|
116
|
+
if (packet.payload.length !== 0) {
|
|
117
|
+
throw new Error("Invalid OKAY packet. Payload size should be 0");
|
|
118
|
+
}
|
|
119
|
+
ackBytes = Infinity;
|
|
120
|
+
}
|
|
121
|
+
if (this.#initializers.resolve(packet.arg1, {
|
|
122
|
+
remoteId: packet.arg0,
|
|
123
|
+
availableWriteBytes: ackBytes,
|
|
124
|
+
})) {
|
|
105
125
|
// Device successfully created the socket
|
|
106
126
|
return;
|
|
107
127
|
}
|
|
108
128
|
const socket = this.#sockets.get(packet.arg1);
|
|
109
129
|
if (socket) {
|
|
110
|
-
//
|
|
111
|
-
socket.
|
|
130
|
+
// When delayed ack is enabled, `ackBytes` is a positive number represents
|
|
131
|
+
// how many bytes the device has received from this socket.
|
|
132
|
+
// When delayed ack is disabled, `ackBytes` is always `Infinity` represents
|
|
133
|
+
// the device has received last `WRTE` packet from the socket.
|
|
134
|
+
socket.ack(ackBytes);
|
|
112
135
|
return;
|
|
113
136
|
}
|
|
114
137
|
// Maybe the device is responding to a packet of last connection
|
|
115
138
|
// Tell the device to close the socket
|
|
116
|
-
void this.sendPacket(AdbCommand.Close, packet.arg1, packet.arg0);
|
|
139
|
+
void this.sendPacket(AdbCommand.Close, packet.arg1, packet.arg0, EMPTY_UINT8_ARRAY);
|
|
140
|
+
}
|
|
141
|
+
#sendOkay(localId, remoteId, ackBytes) {
|
|
142
|
+
let payload;
|
|
143
|
+
if (this.options.initialDelayedAckBytes !== 0) {
|
|
144
|
+
// TODO: try reusing this buffer to reduce memory allocation
|
|
145
|
+
// However, that requires blocking reentrance of `sendOkay`, which might be more expensive
|
|
146
|
+
payload = new Uint8Array(4);
|
|
147
|
+
setUint32LittleEndian(payload, 0, ackBytes);
|
|
148
|
+
}
|
|
149
|
+
else {
|
|
150
|
+
payload = EMPTY_UINT8_ARRAY;
|
|
151
|
+
}
|
|
152
|
+
return this.sendPacket(AdbCommand.Okay, localId, remoteId, payload);
|
|
117
153
|
}
|
|
118
154
|
async #handleOpen(packet) {
|
|
119
|
-
//
|
|
120
|
-
//
|
|
155
|
+
// Allocate a local ID for the socket from `#initializers`.
|
|
156
|
+
// `AsyncOperationManager` doesn't directly support returning the next ID,
|
|
157
|
+
// so use `add` + `resolve` to simulate this
|
|
121
158
|
const [localId] = this.#initializers.add();
|
|
122
159
|
this.#initializers.resolve(localId, undefined);
|
|
123
160
|
const remoteId = packet.arg0;
|
|
161
|
+
let availableWriteBytes = packet.arg1;
|
|
124
162
|
let service = decodeUtf8(packet.payload);
|
|
163
|
+
// ADB Daemon still adds a null character to the service string
|
|
125
164
|
if (service.endsWith("\0")) {
|
|
126
165
|
service = service.substring(0, service.length - 1);
|
|
127
166
|
}
|
|
167
|
+
// Check remote delayed ack enablement is consistent with local
|
|
168
|
+
if (this.options.initialDelayedAckBytes === 0) {
|
|
169
|
+
if (availableWriteBytes !== 0) {
|
|
170
|
+
throw new Error("Invalid OPEN packet. arg1 should be 0");
|
|
171
|
+
}
|
|
172
|
+
availableWriteBytes = Infinity;
|
|
173
|
+
}
|
|
174
|
+
else {
|
|
175
|
+
if (availableWriteBytes === 0) {
|
|
176
|
+
throw new Error("Invalid OPEN packet. arg1 should be greater than 0");
|
|
177
|
+
}
|
|
178
|
+
}
|
|
128
179
|
const handler = this.#incomingSocketHandlers.get(service);
|
|
129
180
|
if (!handler) {
|
|
130
|
-
await this.sendPacket(AdbCommand.Close, 0, remoteId);
|
|
181
|
+
await this.sendPacket(AdbCommand.Close, 0, remoteId, EMPTY_UINT8_ARRAY);
|
|
131
182
|
return;
|
|
132
183
|
}
|
|
133
184
|
const controller = new AdbDaemonSocketController({
|
|
@@ -136,14 +187,15 @@ export class AdbPacketDispatcher {
|
|
|
136
187
|
remoteId,
|
|
137
188
|
localCreated: false,
|
|
138
189
|
service,
|
|
190
|
+
availableWriteBytes,
|
|
139
191
|
});
|
|
140
192
|
try {
|
|
141
193
|
await handler(controller.socket);
|
|
142
194
|
this.#sockets.set(localId, controller);
|
|
143
|
-
await this
|
|
195
|
+
await this.#sendOkay(localId, remoteId, this.options.initialDelayedAckBytes);
|
|
144
196
|
}
|
|
145
197
|
catch (e) {
|
|
146
|
-
await this.sendPacket(AdbCommand.Close, 0, remoteId);
|
|
198
|
+
await this.sendPacket(AdbCommand.Close, 0, remoteId, EMPTY_UINT8_ARRAY);
|
|
147
199
|
}
|
|
148
200
|
}
|
|
149
201
|
async #handleWrite(packet) {
|
|
@@ -152,34 +204,38 @@ export class AdbPacketDispatcher {
|
|
|
152
204
|
throw new Error(`Unknown local socket id: ${packet.arg1}`);
|
|
153
205
|
}
|
|
154
206
|
let handled = false;
|
|
155
|
-
|
|
156
|
-
delay(5000).then(() => {
|
|
157
|
-
if (this.options.debugSlowRead && !handled) {
|
|
158
|
-
throw new Error(`packet for \`${socket.service}\` not handled in 5 seconds`);
|
|
159
|
-
}
|
|
160
|
-
}),
|
|
207
|
+
const promises = [
|
|
161
208
|
(async () => {
|
|
162
209
|
await socket.enqueue(packet.payload);
|
|
163
|
-
await this
|
|
210
|
+
await this.#sendOkay(packet.arg1, packet.arg0, packet.payload.length);
|
|
164
211
|
handled = true;
|
|
165
212
|
})(),
|
|
166
|
-
]
|
|
167
|
-
|
|
213
|
+
];
|
|
214
|
+
if (this.options.readTimeLimit) {
|
|
215
|
+
promises.push((async () => {
|
|
216
|
+
await delay(this.options.readTimeLimit);
|
|
217
|
+
if (!handled) {
|
|
218
|
+
throw new Error(`readable of \`${socket.service}\` has stalled for ${this.options.readTimeLimit} milliseconds`);
|
|
219
|
+
}
|
|
220
|
+
})());
|
|
221
|
+
}
|
|
222
|
+
await Promise.race(promises);
|
|
168
223
|
}
|
|
169
224
|
async createSocket(service) {
|
|
170
225
|
if (this.options.appendNullToServiceString) {
|
|
171
226
|
service += "\0";
|
|
172
227
|
}
|
|
173
228
|
const [localId, initializer] = this.#initializers.add();
|
|
174
|
-
await this.sendPacket(AdbCommand.Open, localId,
|
|
175
|
-
// Fulfilled by `
|
|
176
|
-
const remoteId = await initializer;
|
|
229
|
+
await this.sendPacket(AdbCommand.Open, localId, this.options.initialDelayedAckBytes, service);
|
|
230
|
+
// Fulfilled by `handleOkay`
|
|
231
|
+
const { remoteId, availableWriteBytes } = await initializer;
|
|
177
232
|
const controller = new AdbDaemonSocketController({
|
|
178
233
|
dispatcher: this,
|
|
179
234
|
localId,
|
|
180
235
|
remoteId,
|
|
181
236
|
localCreated: true,
|
|
182
237
|
service,
|
|
238
|
+
availableWriteBytes,
|
|
183
239
|
});
|
|
184
240
|
this.#sockets.set(localId, controller);
|
|
185
241
|
return controller.socket;
|
|
@@ -193,14 +249,16 @@ export class AdbPacketDispatcher {
|
|
|
193
249
|
clearReverseTunnels() {
|
|
194
250
|
this.#incomingSocketHandlers.clear();
|
|
195
251
|
}
|
|
196
|
-
async sendPacket(command, arg0, arg1,
|
|
252
|
+
async sendPacket(command, arg0, arg1,
|
|
253
|
+
// PERF: It's slightly faster to not use default parameter values
|
|
254
|
+
payload) {
|
|
197
255
|
if (typeof payload === "string") {
|
|
198
256
|
payload = encodeUtf8(payload);
|
|
199
257
|
}
|
|
200
|
-
if (payload.
|
|
201
|
-
throw new
|
|
258
|
+
if (payload.length > this.options.maxPayloadSize) {
|
|
259
|
+
throw new TypeError("payload too large");
|
|
202
260
|
}
|
|
203
|
-
await
|
|
261
|
+
await Consumable.WritableStream.write(this.#writer, {
|
|
204
262
|
command,
|
|
205
263
|
arg0,
|
|
206
264
|
arg1,
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"dispatcher.js","sourceRoot":"","sources":["../../src/daemon/dispatcher.ts"],"names":[],"mappings":"AAAA,OAAO,EACH,qBAAqB,EACrB,eAAe,EACf,KAAK,GACR,MAAM,kBAAkB,CAAC;
|
|
1
|
+
{"version":3,"file":"dispatcher.js","sourceRoot":"","sources":["../../src/daemon/dispatcher.ts"],"names":[],"mappings":"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"}
|
package/esm/daemon/packet.d.ts
CHANGED
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import {
|
|
1
|
+
import { Consumable, TransformStream } from "@yume-chan/stream-extra";
|
|
2
2
|
import Struct from "@yume-chan/struct";
|
|
3
3
|
export declare enum AdbCommand {
|
|
4
4
|
Auth = 1213486401,// 'AUTH'
|
|
@@ -40,7 +40,7 @@ export type AdbPacket = (typeof AdbPacket)["TDeserializeResult"];
|
|
|
40
40
|
export type AdbPacketData = Omit<(typeof AdbPacket)["TInit"], "checksum" | "magic">;
|
|
41
41
|
export type AdbPacketInit = (typeof AdbPacket)["TInit"];
|
|
42
42
|
export declare function calculateChecksum(payload: Uint8Array): number;
|
|
43
|
-
export declare class AdbPacketSerializeStream extends
|
|
43
|
+
export declare class AdbPacketSerializeStream extends TransformStream<Consumable<AdbPacketInit>, Consumable<Uint8Array>> {
|
|
44
44
|
constructor();
|
|
45
45
|
}
|
|
46
46
|
//# sourceMappingURL=packet.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"packet.d.ts","sourceRoot":"","sources":["../../src/daemon/packet.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,
|
|
1
|
+
{"version":3,"file":"packet.d.ts","sourceRoot":"","sources":["../../src/daemon/packet.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,eAAe,EAAE,MAAM,yBAAyB,CAAC;AACtE,OAAO,MAAM,MAAM,mBAAmB,CAAC;AAEvC,oBAAY,UAAU;IAClB,IAAI,aAAa,CAAE,SAAS;IAC5B,KAAK,aAAa,CAAE,SAAS;IAC7B,OAAO,aAAa,CAAE,SAAS;IAC/B,IAAI,aAAa,CAAE,SAAS;IAC5B,IAAI,aAAa,CAAE,SAAS;IAC5B,KAAK,aAAa;CACrB;AAED,eAAO,MAAM,eAAe;;;;;;;0CAMT,CAAC;AAEpB,MAAM,MAAM,eAAe,GAAG,CAAC,OAAO,eAAe,CAAC,CAAC,oBAAoB,CAAC,CAAC;AAI7E,eAAO,MAAM,SAAS;;;;;;;;oDAEsC,CAAC;AAE7D,MAAM,MAAM,SAAS,GAAG,CAAC,OAAO,SAAS,CAAC,CAAC,oBAAoB,CAAC,CAAC;AAEjE;;;;;;;;;GASG;AACH,MAAM,MAAM,aAAa,GAAG,IAAI,CAC5B,CAAC,OAAO,SAAS,CAAC,CAAC,OAAO,CAAC,EAC3B,UAAU,GAAG,OAAO,CACvB,CAAC;AAEF,MAAM,MAAM,aAAa,GAAG,CAAC,OAAO,SAAS,CAAC,CAAC,OAAO,CAAC,CAAC;AAExD,wBAAgB,iBAAiB,CAAC,OAAO,EAAE,UAAU,GAAG,MAAM,CAE7D;AAED,qBAAa,wBAAyB,SAAQ,eAAe,CACzD,UAAU,CAAC,aAAa,CAAC,EACzB,UAAU,CAAC,UAAU,CAAC,CACzB;;CA2BA"}
|
package/esm/daemon/packet.js
CHANGED
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import {
|
|
1
|
+
import { Consumable, TransformStream } from "@yume-chan/stream-extra";
|
|
2
2
|
import Struct from "@yume-chan/struct";
|
|
3
3
|
export var AdbCommand;
|
|
4
4
|
(function (AdbCommand) {
|
|
@@ -22,21 +22,22 @@ export const AdbPacket = new Struct({ littleEndian: true })
|
|
|
22
22
|
export function calculateChecksum(payload) {
|
|
23
23
|
return payload.reduce((result, item) => result + item, 0);
|
|
24
24
|
}
|
|
25
|
-
export class AdbPacketSerializeStream extends
|
|
25
|
+
export class AdbPacketSerializeStream extends TransformStream {
|
|
26
26
|
constructor() {
|
|
27
27
|
const headerBuffer = new Uint8Array(AdbPacketHeader.size);
|
|
28
28
|
super({
|
|
29
29
|
transform: async (chunk, controller) => {
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
30
|
+
await chunk.tryConsume(async (chunk) => {
|
|
31
|
+
const init = chunk;
|
|
32
|
+
init.payloadLength = init.payload.length;
|
|
33
|
+
await Consumable.ReadableStream.enqueue(controller, AdbPacketHeader.serialize(init, headerBuffer));
|
|
34
|
+
if (init.payloadLength) {
|
|
35
|
+
// USB protocol preserves packet boundaries,
|
|
36
|
+
// so we must write payload separately as native ADB does,
|
|
37
|
+
// otherwise the read operation on device will fail.
|
|
38
|
+
await Consumable.ReadableStream.enqueue(controller, init.payload);
|
|
39
|
+
}
|
|
40
|
+
});
|
|
40
41
|
},
|
|
41
42
|
});
|
|
42
43
|
}
|
package/esm/daemon/packet.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"packet.js","sourceRoot":"","sources":["../../src/daemon/packet.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,
|
|
1
|
+
{"version":3,"file":"packet.js","sourceRoot":"","sources":["../../src/daemon/packet.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,eAAe,EAAE,MAAM,yBAAyB,CAAC;AACtE,OAAO,MAAM,MAAM,mBAAmB,CAAC;AAEvC,MAAM,CAAN,IAAY,UAOX;AAPD,WAAY,UAAU;IAClB,oDAAiB,CAAA;IACjB,sDAAkB,CAAA;IAClB,0DAAoB,CAAA;IACpB,oDAAiB,CAAA;IACjB,oDAAiB,CAAA;IACjB,sDAAkB,CAAA;AACtB,CAAC,EAPW,UAAU,KAAV,UAAU,QAOrB;AAED,MAAM,CAAC,MAAM,eAAe,GAAG,IAAI,MAAM,CAAC,EAAE,YAAY,EAAE,IAAI,EAAE,CAAC;KAC5D,MAAM,CAAC,SAAS,CAAC;KACjB,MAAM,CAAC,MAAM,CAAC;KACd,MAAM,CAAC,MAAM,CAAC;KACd,MAAM,CAAC,eAAe,CAAC;KACvB,MAAM,CAAC,UAAU,CAAC;KAClB,KAAK,CAAC,OAAO,CAAC,CAAC;AAMpB,MAAM,CAAC,MAAM,SAAS,GAAG,IAAI,MAAM,CAAC,EAAE,YAAY,EAAE,IAAI,EAAE,CAAC;KACtD,MAAM,CAAC,eAAe,CAAC;KACvB,UAAU,CAAC,SAAS,EAAE,EAAE,WAAW,EAAE,eAAe,EAAE,CAAC,CAAC;AAqB7D,MAAM,UAAU,iBAAiB,CAAC,OAAmB;IACjD,OAAO,OAAO,CAAC,MAAM,CAAC,CAAC,MAAM,EAAE,IAAI,EAAE,EAAE,CAAC,MAAM,GAAG,IAAI,EAAE,CAAC,CAAC,CAAC;AAC9D,CAAC;AAED,MAAM,OAAO,wBAAyB,SAAQ,eAG7C;IACG;QACI,MAAM,YAAY,GAAG,IAAI,UAAU,CAAC,eAAe,CAAC,IAAI,CAAC,CAAC;QAC1D,KAAK,CAAC;YACF,SAAS,EAAE,KAAK,EAAE,KAAK,EAAE,UAAU,EAAE,EAAE;gBACnC,MAAM,KAAK,CAAC,UAAU,CAAC,KAAK,EAAE,KAAK,EAAE,EAAE;oBACnC,MAAM,IAAI,GAAG,KAA4C,CAAC;oBAC1D,IAAI,CAAC,aAAa,GAAG,IAAI,CAAC,OAAO,CAAC,MAAM,CAAC;oBAEzC,MAAM,UAAU,CAAC,cAAc,CAAC,OAAO,CACnC,UAAU,EACV,eAAe,CAAC,SAAS,CAAC,IAAI,EAAE,YAAY,CAAC,CAChD,CAAC;oBAEF,IAAI,IAAI,CAAC,aAAa,EAAE,CAAC;wBACrB,4CAA4C;wBAC5C,0DAA0D;wBAC1D,oDAAoD;wBACpD,MAAM,UAAU,CAAC,cAAc,CAAC,OAAO,CACnC,UAAU,EACV,IAAI,CAAC,OAAO,CACf,CAAC;oBACN,CAAC;gBACL,CAAC,CAAC,CAAC;YACP,CAAC;SACJ,CAAC,CAAC;IACP,CAAC;CACJ"}
|
package/esm/daemon/socket.d.ts
CHANGED
|
@@ -1,5 +1,6 @@
|
|
|
1
1
|
import type { Disposable } from "@yume-chan/event";
|
|
2
|
-
import type {
|
|
2
|
+
import type { ReadableStream, WritableStream } from "@yume-chan/stream-extra";
|
|
3
|
+
import { MaybeConsumable } from "@yume-chan/stream-extra";
|
|
3
4
|
import type { AdbSocket } from "../adb.js";
|
|
4
5
|
import type { AdbPacketDispatcher } from "./dispatcher.js";
|
|
5
6
|
export interface AdbDaemonSocketInfo {
|
|
@@ -8,9 +9,13 @@ export interface AdbDaemonSocketInfo {
|
|
|
8
9
|
localCreated: boolean;
|
|
9
10
|
service: string;
|
|
10
11
|
}
|
|
11
|
-
export interface
|
|
12
|
+
export interface AdbDaemonSocketInit extends AdbDaemonSocketInfo {
|
|
12
13
|
dispatcher: AdbPacketDispatcher;
|
|
13
14
|
highWaterMark?: number | undefined;
|
|
15
|
+
/**
|
|
16
|
+
* The initial delayed ack byte count, or `Infinity` if delayed ack is disabled.
|
|
17
|
+
*/
|
|
18
|
+
availableWriteBytes: number;
|
|
14
19
|
}
|
|
15
20
|
export declare class AdbDaemonSocketController implements AdbDaemonSocketInfo, AdbSocket, Disposable {
|
|
16
21
|
#private;
|
|
@@ -19,12 +24,12 @@ export declare class AdbDaemonSocketController implements AdbDaemonSocketInfo, A
|
|
|
19
24
|
readonly localCreated: boolean;
|
|
20
25
|
readonly service: string;
|
|
21
26
|
get readable(): ReadableStream<Uint8Array>;
|
|
22
|
-
readonly writable: WritableStream<
|
|
27
|
+
readonly writable: WritableStream<MaybeConsumable<Uint8Array>>;
|
|
23
28
|
get closed(): Promise<void>;
|
|
24
29
|
get socket(): AdbDaemonSocket;
|
|
25
|
-
constructor(options:
|
|
30
|
+
constructor(options: AdbDaemonSocketInit);
|
|
26
31
|
enqueue(data: Uint8Array): Promise<void>;
|
|
27
|
-
ack(): void;
|
|
32
|
+
ack(bytes: number): void;
|
|
28
33
|
close(): Promise<void>;
|
|
29
34
|
dispose(): void;
|
|
30
35
|
}
|
|
@@ -43,7 +48,7 @@ export declare class AdbDaemonSocket implements AdbDaemonSocketInfo, AdbSocket {
|
|
|
43
48
|
get localCreated(): boolean;
|
|
44
49
|
get service(): string;
|
|
45
50
|
get readable(): ReadableStream<Uint8Array>;
|
|
46
|
-
get writable(): WritableStream<
|
|
51
|
+
get writable(): WritableStream<MaybeConsumable<Uint8Array>>;
|
|
47
52
|
get closed(): Promise<void>;
|
|
48
53
|
constructor(controller: AdbDaemonSocketController);
|
|
49
54
|
close(): Promise<void>;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"socket.d.ts","sourceRoot":"","sources":["../../src/daemon/socket.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,kBAAkB,CAAC;AACnD,OAAO,KAAK,
|
|
1
|
+
{"version":3,"file":"socket.d.ts","sourceRoot":"","sources":["../../src/daemon/socket.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,kBAAkB,CAAC;AACnD,OAAO,KAAK,EAER,cAAc,EACd,cAAc,EAEjB,MAAM,yBAAyB,CAAC;AACjC,OAAO,EAAE,eAAe,EAAsB,MAAM,yBAAyB,CAAC;AAG9E,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,WAAW,CAAC;AAE3C,OAAO,KAAK,EAAE,mBAAmB,EAAE,MAAM,iBAAiB,CAAC;AAG3D,MAAM,WAAW,mBAAmB;IAChC,OAAO,EAAE,MAAM,CAAC;IAChB,QAAQ,EAAE,MAAM,CAAC;IAEjB,YAAY,EAAE,OAAO,CAAC;IACtB,OAAO,EAAE,MAAM,CAAC;CACnB;AAED,MAAM,WAAW,mBAAoB,SAAQ,mBAAmB;IAC5D,UAAU,EAAE,mBAAmB,CAAC;IAEhC,aAAa,CAAC,EAAE,MAAM,GAAG,SAAS,CAAC;IAEnC;;OAEG;IACH,mBAAmB,EAAE,MAAM,CAAC;CAC/B;AAED,qBAAa,yBACT,YAAW,mBAAmB,EAAE,SAAS,EAAE,UAAU;;IAIrD,QAAQ,CAAC,OAAO,EAAG,MAAM,CAAC;IAC1B,QAAQ,CAAC,QAAQ,EAAG,MAAM,CAAC;IAC3B,QAAQ,CAAC,YAAY,EAAG,OAAO,CAAC;IAChC,QAAQ,CAAC,OAAO,EAAG,MAAM,CAAC;IAI1B,IAAI,QAAQ,+BAEX;IAGD,QAAQ,CAAC,QAAQ,EAAE,cAAc,CAAC,eAAe,CAAC,UAAU,CAAC,CAAC,CAAC;IAK/D,IAAI,MAAM,kBAET;IAGD,IAAI,MAAM,oBAET;gBAaW,OAAO,EAAE,mBAAmB;IA8DlC,OAAO,CAAC,IAAI,EAAE,UAAU;IAiBvB,GAAG,CAAC,KAAK,EAAE,MAAM;IAKlB,KAAK,IAAI,OAAO,CAAC,IAAI,CAAC;IAsB5B,OAAO;CASV;AAED;;;;;;;GAOG;AACH,qBAAa,eAAgB,YAAW,mBAAmB,EAAE,SAAS;;IAGlE,IAAI,OAAO,IAAI,MAAM,CAEpB;IACD,IAAI,QAAQ,IAAI,MAAM,CAErB;IACD,IAAI,YAAY,IAAI,OAAO,CAE1B;IACD,IAAI,OAAO,IAAI,MAAM,CAEpB;IAED,IAAI,QAAQ,IAAI,cAAc,CAAC,UAAU,CAAC,CAEzC;IACD,IAAI,QAAQ,IAAI,cAAc,CAAC,eAAe,CAAC,UAAU,CAAC,CAAC,CAE1D;IAED,IAAI,MAAM,IAAI,OAAO,CAAC,IAAI,CAAC,CAE1B;gBAEW,UAAU,EAAE,yBAAyB;IAIjD,KAAK;CAGR"}
|
package/esm/daemon/socket.js
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
import { PromiseResolver } from "@yume-chan/async";
|
|
2
|
-
import {
|
|
3
|
-
import {
|
|
2
|
+
import { MaybeConsumable, PushReadableStream } from "@yume-chan/stream-extra";
|
|
3
|
+
import { EMPTY_UINT8_ARRAY } from "@yume-chan/struct";
|
|
4
4
|
import { AdbCommand } from "./packet.js";
|
|
5
5
|
export class AdbDaemonSocketController {
|
|
6
6
|
#dispatcher;
|
|
@@ -13,7 +13,6 @@ export class AdbDaemonSocketController {
|
|
|
13
13
|
get readable() {
|
|
14
14
|
return this.#readable;
|
|
15
15
|
}
|
|
16
|
-
#writePromise;
|
|
17
16
|
#writableController;
|
|
18
17
|
writable;
|
|
19
18
|
#closed = false;
|
|
@@ -25,6 +24,16 @@ export class AdbDaemonSocketController {
|
|
|
25
24
|
get socket() {
|
|
26
25
|
return this.#socket;
|
|
27
26
|
}
|
|
27
|
+
#availableWriteBytesChanged;
|
|
28
|
+
/**
|
|
29
|
+
* When delayed ack is disabled, returns `Infinity` if the socket is ready to write
|
|
30
|
+
* (exactly one packet can be written no matter how large it is), or `-1` if the socket
|
|
31
|
+
* is waiting for ack message.
|
|
32
|
+
*
|
|
33
|
+
* When delayed ack is enabled, returns a non-negative finite number indicates the number of
|
|
34
|
+
* bytes that can be written to the socket before waiting for ack message.
|
|
35
|
+
*/
|
|
36
|
+
#availableWriteBytes = 0;
|
|
28
37
|
constructor(options) {
|
|
29
38
|
this.#dispatcher = options.dispatcher;
|
|
30
39
|
this.localId = options.localId;
|
|
@@ -34,22 +43,41 @@ export class AdbDaemonSocketController {
|
|
|
34
43
|
this.#readable = new PushReadableStream((controller) => {
|
|
35
44
|
this.#readableController = controller;
|
|
36
45
|
});
|
|
37
|
-
this.writable = new
|
|
46
|
+
this.writable = new MaybeConsumable.WritableStream({
|
|
38
47
|
start: (controller) => {
|
|
39
48
|
this.#writableController = controller;
|
|
49
|
+
controller.signal.addEventListener("abort", () => {
|
|
50
|
+
this.#availableWriteBytesChanged?.reject(controller.signal.reason);
|
|
51
|
+
});
|
|
40
52
|
},
|
|
41
|
-
write: async (data
|
|
53
|
+
write: async (data) => {
|
|
42
54
|
const size = data.length;
|
|
43
55
|
const chunkSize = this.#dispatcher.options.maxPayloadSize;
|
|
44
56
|
for (let start = 0, end = chunkSize; start < size; start = end, end += chunkSize) {
|
|
45
|
-
|
|
46
|
-
await this.#
|
|
47
|
-
// Wait for ack packet
|
|
48
|
-
await raceSignal(() => this.#writePromise.promise, controller.signal);
|
|
57
|
+
const chunk = data.subarray(start, end);
|
|
58
|
+
await this.#writeChunk(chunk);
|
|
49
59
|
}
|
|
50
60
|
},
|
|
51
61
|
});
|
|
52
62
|
this.#socket = new AdbDaemonSocket(this);
|
|
63
|
+
this.#availableWriteBytes = options.availableWriteBytes;
|
|
64
|
+
}
|
|
65
|
+
async #writeChunk(data) {
|
|
66
|
+
const length = data.length;
|
|
67
|
+
while (this.#availableWriteBytes < length) {
|
|
68
|
+
// Only one lock is required because Web Streams API guarantees
|
|
69
|
+
// that `write` is not reentrant.
|
|
70
|
+
const resolver = new PromiseResolver();
|
|
71
|
+
this.#availableWriteBytesChanged = resolver;
|
|
72
|
+
await resolver.promise;
|
|
73
|
+
}
|
|
74
|
+
if (this.#availableWriteBytes === Infinity) {
|
|
75
|
+
this.#availableWriteBytes = -1;
|
|
76
|
+
}
|
|
77
|
+
else {
|
|
78
|
+
this.#availableWriteBytes -= length;
|
|
79
|
+
}
|
|
80
|
+
await this.#dispatcher.sendPacket(AdbCommand.Write, this.localId, this.remoteId, data);
|
|
53
81
|
}
|
|
54
82
|
async enqueue(data) {
|
|
55
83
|
// Consumers can `cancel` the `readable` if they are not interested in future data.
|
|
@@ -67,21 +95,23 @@ export class AdbDaemonSocketController {
|
|
|
67
95
|
throw e;
|
|
68
96
|
}
|
|
69
97
|
}
|
|
70
|
-
ack() {
|
|
71
|
-
this.#
|
|
98
|
+
ack(bytes) {
|
|
99
|
+
this.#availableWriteBytes += bytes;
|
|
100
|
+
this.#availableWriteBytesChanged?.resolve();
|
|
72
101
|
}
|
|
73
102
|
async close() {
|
|
74
103
|
if (this.#closed) {
|
|
75
104
|
return;
|
|
76
105
|
}
|
|
77
106
|
this.#closed = true;
|
|
107
|
+
this.#availableWriteBytesChanged?.reject(new Error("Socket closed"));
|
|
78
108
|
try {
|
|
79
109
|
this.#writableController.error(new Error("Socket closed"));
|
|
80
110
|
}
|
|
81
111
|
catch {
|
|
82
112
|
// ignore
|
|
83
113
|
}
|
|
84
|
-
await this.#dispatcher.sendPacket(AdbCommand.Close, this.localId, this.remoteId);
|
|
114
|
+
await this.#dispatcher.sendPacket(AdbCommand.Close, this.localId, this.remoteId, EMPTY_UINT8_ARRAY);
|
|
85
115
|
}
|
|
86
116
|
dispose() {
|
|
87
117
|
try {
|
package/esm/daemon/socket.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"socket.js","sourceRoot":"","sources":["../../src/daemon/socket.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,eAAe,EAAE,MAAM,kBAAkB,CAAC;
|
|
1
|
+
{"version":3,"file":"socket.js","sourceRoot":"","sources":["../../src/daemon/socket.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,eAAe,EAAE,MAAM,kBAAkB,CAAC;AAQnD,OAAO,EAAE,eAAe,EAAE,kBAAkB,EAAE,MAAM,yBAAyB,CAAC;AAC9E,OAAO,EAAE,iBAAiB,EAAE,MAAM,mBAAmB,CAAC;AAKtD,OAAO,EAAE,UAAU,EAAE,MAAM,aAAa,CAAC;AAqBzC,MAAM,OAAO,yBAAyB;IAGzB,WAAW,CAAuB;IAElC,OAAO,CAAU;IACjB,QAAQ,CAAU;IAClB,YAAY,CAAW;IACvB,OAAO,CAAU;IAE1B,SAAS,CAA6B;IACtC,mBAAmB,CAA4C;IAC/D,IAAI,QAAQ;QACR,OAAO,IAAI,CAAC,SAAS,CAAC;IAC1B,CAAC;IAED,mBAAmB,CAAmC;IAC7C,QAAQ,CAA8C;IAE/D,OAAO,GAAG,KAAK,CAAC;IAEhB,cAAc,GAAG,IAAI,eAAe,EAAQ,CAAC;IAC7C,IAAI,MAAM;QACN,OAAO,IAAI,CAAC,cAAc,CAAC,OAAO,CAAC;IACvC,CAAC;IAED,OAAO,CAAkB;IACzB,IAAI,MAAM;QACN,OAAO,IAAI,CAAC,OAAO,CAAC;IACxB,CAAC;IAED,2BAA2B,CAAoC;IAC/D;;;;;;;OAOG;IACH,oBAAoB,GAAG,CAAC,CAAC;IAEzB,YAAY,OAA4B;QACpC,IAAI,CAAC,WAAW,GAAG,OAAO,CAAC,UAAU,CAAC;QACtC,IAAI,CAAC,OAAO,GAAG,OAAO,CAAC,OAAO,CAAC;QAC/B,IAAI,CAAC,QAAQ,GAAG,OAAO,CAAC,QAAQ,CAAC;QACjC,IAAI,CAAC,YAAY,GAAG,OAAO,CAAC,YAAY,CAAC;QACzC,IAAI,CAAC,OAAO,GAAG,OAAO,CAAC,OAAO,CAAC;QAE/B,IAAI,CAAC,SAAS,GAAG,IAAI,kBAAkB,CAAC,CAAC,UAAU,EAAE,EAAE;YACnD,IAAI,CAAC,mBAAmB,GAAG,UAAU,CAAC;QAC1C,CAAC,CAAC,CAAC;QAEH,IAAI,CAAC,QAAQ,GAAG,IAAI,eAAe,CAAC,cAAc,CAAa;YAC3D,KAAK,EAAE,CAAC,UAAU,EAAE,EAAE;gBAClB,IAAI,CAAC,mBAAmB,GAAG,UAAU,CAAC;gBACtC,UAAU,CAAC,MAAM,CAAC,gBAAgB,CAAC,OAAO,EAAE,GAAG,EAAE;oBAC7C,IAAI,CAAC,2BAA2B,EAAE,MAAM,CACpC,UAAU,CAAC,MAAM,CAAC,MAAM,CAC3B,CAAC;gBACN,CAAC,CAAC,CAAC;YACP,CAAC;YACD,KAAK,EAAE,KAAK,EAAE,IAAI,EAAE,EAAE;gBAClB,MAAM,IAAI,GAAG,IAAI,CAAC,MAAM,CAAC;gBACzB,MAAM,SAAS,GAAG,IAAI,CAAC,WAAW,CAAC,OAAO,CAAC,cAAc,CAAC;gBAC1D,KACI,IAAI,KAAK,GAAG,CAAC,EAAE,GAAG,GAAG,SAAS,EAC9B,KAAK,GAAG,IAAI,EACZ,KAAK,GAAG,GAAG,EAAE,GAAG,IAAI,SAAS,EAC/B,CAAC;oBACC,MAAM,KAAK,GAAG,IAAI,CAAC,QAAQ,CAAC,KAAK,EAAE,GAAG,CAAC,CAAC;oBACxC,MAAM,IAAI,CAAC,WAAW,CAAC,KAAK,CAAC,CAAC;gBAClC,CAAC;YACL,CAAC;SACJ,CAAC,CAAC;QAEH,IAAI,CAAC,OAAO,GAAG,IAAI,eAAe,CAAC,IAAI,CAAC,CAAC;QACzC,IAAI,CAAC,oBAAoB,GAAG,OAAO,CAAC,mBAAmB,CAAC;IAC5D,CAAC;IAED,KAAK,CAAC,WAAW,CAAC,IAAgB;QAC9B,MAAM,MAAM,GAAG,IAAI,CAAC,MAAM,CAAC;QAC3B,OAAO,IAAI,CAAC,oBAAoB,GAAG,MAAM,EAAE,CAAC;YACxC,+DAA+D;YAC/D,iCAAiC;YACjC,MAAM,QAAQ,GAAG,IAAI,eAAe,EAAQ,CAAC;YAC7C,IAAI,CAAC,2BAA2B,GAAG,QAAQ,CAAC;YAC5C,MAAM,QAAQ,CAAC,OAAO,CAAC;QAC3B,CAAC;QAED,IAAI,IAAI,CAAC,oBAAoB,KAAK,QAAQ,EAAE,CAAC;YACzC,IAAI,CAAC,oBAAoB,GAAG,CAAC,CAAC,CAAC;QACnC,CAAC;aAAM,CAAC;YACJ,IAAI,CAAC,oBAAoB,IAAI,MAAM,CAAC;QACxC,CAAC;QAED,MAAM,IAAI,CAAC,WAAW,CAAC,UAAU,CAC7B,UAAU,CAAC,KAAK,EAChB,IAAI,CAAC,OAAO,EACZ,IAAI,CAAC,QAAQ,EACb,IAAI,CACP,CAAC;IACN,CAAC;IAED,KAAK,CAAC,OAAO,CAAC,IAAgB;QAC1B,mFAAmF;QACnF,uCAAuC;QACvC,IAAI,IAAI,CAAC,mBAAmB,CAAC,WAAW,CAAC,OAAO,EAAE,CAAC;YAC/C,OAAO;QACX,CAAC;QAED,IAAI,CAAC;YACD,MAAM,IAAI,CAAC,mBAAmB,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC;QACjD,CAAC;QAAC,OAAO,CAAC,EAAE,CAAC;YACT,IAAI,IAAI,CAAC,mBAAmB,CAAC,WAAW,CAAC,OAAO,EAAE,CAAC;gBAC/C,OAAO;YACX,CAAC;YACD,MAAM,CAAC,CAAC;QACZ,CAAC;IACL,CAAC;IAEM,GAAG,CAAC,KAAa;QACpB,IAAI,CAAC,oBAAoB,IAAI,KAAK,CAAC;QACnC,IAAI,CAAC,2BAA2B,EAAE,OAAO,EAAE,CAAC;IAChD,CAAC;IAED,KAAK,CAAC,KAAK;QACP,IAAI,IAAI,CAAC,OAAO,EAAE,CAAC;YACf,OAAO;QACX,CAAC;QACD,IAAI,CAAC,OAAO,GAAG,IAAI,CAAC;QAEpB,IAAI,CAAC,2BAA2B,EAAE,MAAM,CAAC,IAAI,KAAK,CAAC,eAAe,CAAC,CAAC,CAAC;QAErE,IAAI,CAAC;YACD,IAAI,CAAC,mBAAmB,CAAC,KAAK,CAAC,IAAI,KAAK,CAAC,eAAe,CAAC,CAAC,CAAC;QAC/D,CAAC;QAAC,MAAM,CAAC;YACL,SAAS;QACb,CAAC;QAED,MAAM,IAAI,CAAC,WAAW,CAAC,UAAU,CAC7B,UAAU,CAAC,KAAK,EAChB,IAAI,CAAC,OAAO,EACZ,IAAI,CAAC,QAAQ,EACb,iBAAiB,CACpB,CAAC;IACN,CAAC;IAED,OAAO;QACH,IAAI,CAAC;YACD,IAAI,CAAC,mBAAmB,CAAC,KAAK,EAAE,CAAC;QACrC,CAAC;QAAC,MAAM,CAAC;YACL,SAAS;QACb,CAAC;QAED,IAAI,CAAC,cAAc,CAAC,OAAO,EAAE,CAAC;IAClC,CAAC;CACJ;AAED;;;;;;;GAOG;AACH,MAAM,OAAO,eAAe;IACxB,WAAW,CAA4B;IAEvC,IAAI,OAAO;QACP,OAAO,IAAI,CAAC,WAAW,CAAC,OAAO,CAAC;IACpC,CAAC;IACD,IAAI,QAAQ;QACR,OAAO,IAAI,CAAC,WAAW,CAAC,QAAQ,CAAC;IACrC,CAAC;IACD,IAAI,YAAY;QACZ,OAAO,IAAI,CAAC,WAAW,CAAC,YAAY,CAAC;IACzC,CAAC;IACD,IAAI,OAAO;QACP,OAAO,IAAI,CAAC,WAAW,CAAC,OAAO,CAAC;IACpC,CAAC;IAED,IAAI,QAAQ;QACR,OAAO,IAAI,CAAC,WAAW,CAAC,QAAQ,CAAC;IACrC,CAAC;IACD,IAAI,QAAQ;QACR,OAAO,IAAI,CAAC,WAAW,CAAC,QAAQ,CAAC;IACrC,CAAC;IAED,IAAI,MAAM;QACN,OAAO,IAAI,CAAC,WAAW,CAAC,MAAM,CAAC;IACnC,CAAC;IAED,YAAY,UAAqC;QAC7C,IAAI,CAAC,WAAW,GAAG,UAAU,CAAC;IAClC,CAAC;IAED,KAAK;QACD,OAAO,IAAI,CAAC,WAAW,CAAC,KAAK,EAAE,CAAC;IACpC,CAAC;CACJ"}
|
|
@@ -1,21 +1,58 @@
|
|
|
1
|
-
import type {
|
|
1
|
+
import type { ReadableWritablePair } from "@yume-chan/stream-extra";
|
|
2
|
+
import { Consumable } from "@yume-chan/stream-extra";
|
|
2
3
|
import type { ValueOrPromise } from "@yume-chan/struct";
|
|
3
4
|
import type { AdbIncomingSocketHandler, AdbSocket, AdbTransport } from "../adb.js";
|
|
4
5
|
import { AdbBanner } from "../banner.js";
|
|
6
|
+
import { AdbFeature } from "../features.js";
|
|
5
7
|
import type { AdbAuthenticator, AdbCredentialStore } from "./auth.js";
|
|
6
8
|
import type { AdbPacketData, AdbPacketInit } from "./packet.js";
|
|
7
9
|
export declare const ADB_DAEMON_VERSION_OMIT_CHECKSUM = 16777217;
|
|
10
|
+
export declare const ADB_DAEMON_DEFAULT_FEATURES: AdbFeature[];
|
|
11
|
+
export declare const ADB_DAEMON_DEFAULT_INITIAL_PAYLOAD_SIZE: number;
|
|
8
12
|
export type AdbDaemonConnection = ReadableWritablePair<AdbPacketData, Consumable<AdbPacketInit>>;
|
|
9
|
-
interface AdbDaemonAuthenticationOptions {
|
|
13
|
+
export interface AdbDaemonAuthenticationOptions {
|
|
10
14
|
serial: string;
|
|
11
15
|
connection: AdbDaemonConnection;
|
|
12
16
|
credentialStore: AdbCredentialStore;
|
|
13
17
|
authenticators?: AdbAuthenticator[];
|
|
18
|
+
features?: readonly AdbFeature[];
|
|
14
19
|
/**
|
|
15
|
-
*
|
|
20
|
+
* The number of bytes the device can send before receiving an ack packet.
|
|
21
|
+
* Using delayed ack can improve the throughput,
|
|
22
|
+
* especially when the device is connected over Wi-Fi (so the latency is higher).
|
|
23
|
+
*
|
|
24
|
+
* Set to 0 or any negative value to disable delayed ack in handshake.
|
|
25
|
+
* Otherwise the value must be in the range of unsigned 32-bit integer.
|
|
26
|
+
*
|
|
27
|
+
* Delayed ack was added in Android 14,
|
|
28
|
+
* this option will be ignored when the device doesn't support it.
|
|
29
|
+
*
|
|
30
|
+
* @default ADB_DAEMON_DEFAULT_INITIAL_PAYLOAD_SIZE
|
|
31
|
+
*/
|
|
32
|
+
initialDelayedAckBytes?: number;
|
|
33
|
+
/**
|
|
34
|
+
* Whether to keep the `connection` open (don't call `writable.close` and `readable.cancel`)
|
|
35
|
+
* when `AdbDaemonTransport.close` is called.
|
|
36
|
+
*
|
|
37
|
+
* Note that when `authenticate` fails,
|
|
38
|
+
* no matter which value this option has,
|
|
39
|
+
* the `connection` is always kept open, so it can be used in another `authenticate` call.
|
|
40
|
+
*
|
|
41
|
+
* @default false
|
|
16
42
|
*/
|
|
17
43
|
preserveConnection?: boolean | undefined;
|
|
18
|
-
|
|
44
|
+
/**
|
|
45
|
+
* When set, the transport will throw an error when
|
|
46
|
+
* one of the socket readable stalls for this amount of milliseconds.
|
|
47
|
+
*
|
|
48
|
+
* Because ADB is a multiplexed protocol, blocking one socket will also block all other sockets.
|
|
49
|
+
* It's important to always read from all sockets to prevent stalling.
|
|
50
|
+
*
|
|
51
|
+
* This option is helpful to detect bugs in the client code.
|
|
52
|
+
*
|
|
53
|
+
* @default undefined
|
|
54
|
+
*/
|
|
55
|
+
readTimeLimit?: number | undefined;
|
|
19
56
|
}
|
|
20
57
|
interface AdbDaemonSocketConnectorConstructionOptions {
|
|
21
58
|
serial: string;
|
|
@@ -23,11 +60,37 @@ interface AdbDaemonSocketConnectorConstructionOptions {
|
|
|
23
60
|
version: number;
|
|
24
61
|
maxPayloadSize: number;
|
|
25
62
|
banner: string;
|
|
63
|
+
features?: readonly AdbFeature[];
|
|
26
64
|
/**
|
|
27
|
-
*
|
|
65
|
+
* The number of bytes the device can send before receiving an ack packet.
|
|
66
|
+
* Using delayed ack can improve the throughput,
|
|
67
|
+
* especially when the device is connected over Wi-Fi (so the latency is higher).
|
|
68
|
+
*
|
|
69
|
+
* When `features` doesn't include `AdbFeature.DelayedAck`, it must be set to 0. Otherwise,
|
|
70
|
+
* the value must be in the range of unsigned 32-bit integer. If the device enabled
|
|
71
|
+
* delayed ack but the client didn't, the device will throw an error when the client sends
|
|
72
|
+
* the first data packet. And vice versa.
|
|
73
|
+
*/
|
|
74
|
+
initialDelayedAckBytes: number;
|
|
75
|
+
/**
|
|
76
|
+
* Whether to keep the `connection` open (don't call `writable.close` and `readable.cancel`)
|
|
77
|
+
* when `AdbDaemonTransport.close` is called.
|
|
78
|
+
*
|
|
79
|
+
* @default false
|
|
28
80
|
*/
|
|
29
81
|
preserveConnection?: boolean | undefined;
|
|
30
|
-
|
|
82
|
+
/**
|
|
83
|
+
* When set, the transport will throw an error when
|
|
84
|
+
* one of the socket readable stalls for this amount of milliseconds.
|
|
85
|
+
*
|
|
86
|
+
* Because ADB is a multiplexed protocol, blocking one socket will also block all other sockets.
|
|
87
|
+
* It's important to always read from all sockets to prevent stalling.
|
|
88
|
+
*
|
|
89
|
+
* This option is helpful to detect bugs in the client code.
|
|
90
|
+
*
|
|
91
|
+
* @default undefined
|
|
92
|
+
*/
|
|
93
|
+
readTimeLimit?: number | undefined;
|
|
31
94
|
}
|
|
32
95
|
export declare class AdbDaemonTransport implements AdbTransport {
|
|
33
96
|
#private;
|
|
@@ -35,18 +98,19 @@ export declare class AdbDaemonTransport implements AdbTransport {
|
|
|
35
98
|
* Authenticates the connection and creates an `AdbDaemonTransport` instance
|
|
36
99
|
* that can be used by `Adb` class.
|
|
37
100
|
*
|
|
38
|
-
* If an authentication process failed,
|
|
39
|
-
*
|
|
40
|
-
*
|
|
101
|
+
* If an authentication process failed,
|
|
102
|
+
* no matter which value the `preserveConnection` option has,
|
|
103
|
+
* the `connection` is always kept open, so it can be used in another `authenticate` call.
|
|
41
104
|
*/
|
|
42
|
-
static authenticate({ serial, connection, credentialStore, authenticators, ...options }: AdbDaemonAuthenticationOptions): Promise<AdbDaemonTransport>;
|
|
105
|
+
static authenticate({ serial, connection, credentialStore, authenticators, features, initialDelayedAckBytes, ...options }: AdbDaemonAuthenticationOptions): Promise<AdbDaemonTransport>;
|
|
43
106
|
get connection(): AdbDaemonConnection;
|
|
44
107
|
get serial(): string;
|
|
45
108
|
get protocolVersion(): number;
|
|
46
109
|
get maxPayloadSize(): number;
|
|
47
110
|
get banner(): AdbBanner;
|
|
48
111
|
get disconnected(): Promise<void>;
|
|
49
|
-
|
|
112
|
+
get clientFeatures(): readonly AdbFeature[];
|
|
113
|
+
constructor({ serial, connection, version, banner, features, initialDelayedAckBytes, ...options }: AdbDaemonSocketConnectorConstructionOptions);
|
|
50
114
|
connect(service: string): ValueOrPromise<AdbSocket>;
|
|
51
115
|
addReverseTunnel(handler: AdbIncomingSocketHandler, address?: string): string;
|
|
52
116
|
removeReverseTunnel(address: string): void;
|