@yume-chan/adb 0.0.23 → 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/CHANGELOG.md +51 -2
- package/LICENSE +1 -1
- package/README.md +4 -1
- package/esm/adb.d.ts +15 -9
- package/esm/adb.d.ts.map +1 -1
- package/esm/adb.js +5 -2
- package/esm/adb.js.map +1 -1
- package/esm/banner.d.ts +7 -6
- package/esm/banner.d.ts.map +1 -1
- package/esm/banner.js +6 -7
- package/esm/banner.js.map +1 -1
- package/esm/commands/framebuffer.d.ts +63 -34
- package/esm/commands/framebuffer.d.ts.map +1 -1
- package/esm/commands/framebuffer.js +35 -33
- package/esm/commands/framebuffer.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 +12 -12
- package/esm/commands/reverse.d.ts.map +1 -1
- package/esm/commands/reverse.js +60 -39
- 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/none.js +3 -5
- package/esm/commands/subprocess/protocols/none.js.map +1 -1
- package/esm/commands/subprocess/protocols/shell.d.ts +22 -14
- package/esm/commands/subprocess/protocols/shell.d.ts.map +1 -1
- package/esm/commands/subprocess/protocols/shell.js +21 -27
- package/esm/commands/subprocess/protocols/shell.js.map +1 -1
- package/esm/commands/subprocess/protocols/types.d.ts +8 -8
- package/esm/commands/subprocess/protocols/types.d.ts.map +1 -1
- package/esm/commands/sync/list.d.ts +49 -30
- package/esm/commands/sync/list.d.ts.map +1 -1
- package/esm/commands/sync/list.js +9 -11
- package/esm/commands/sync/list.js.map +1 -1
- package/esm/commands/sync/pull.d.ts +7 -9
- package/esm/commands/sync/pull.d.ts.map +1 -1
- package/esm/commands/sync/pull.js +4 -6
- package/esm/commands/sync/pull.js.map +1 -1
- package/esm/commands/sync/push.d.ts +25 -22
- package/esm/commands/sync/push.d.ts.map +1 -1
- package/esm/commands/sync/push.js +14 -21
- package/esm/commands/sync/push.js.map +1 -1
- package/esm/commands/sync/request.d.ts +20 -23
- package/esm/commands/sync/request.d.ts.map +1 -1
- package/esm/commands/sync/request.js +26 -35
- package/esm/commands/sync/request.js.map +1 -1
- package/esm/commands/sync/response.d.ts +25 -19
- package/esm/commands/sync/response.d.ts.map +1 -1
- package/esm/commands/sync/response.js +49 -26
- package/esm/commands/sync/response.js.map +1 -1
- package/esm/commands/sync/socket.d.ts +3 -3
- 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 +75 -54
- package/esm/commands/sync/stat.d.ts.map +1 -1
- package/esm/commands/sync/stat.js +73 -69
- package/esm/commands/sync/stat.js.map +1 -1
- package/esm/commands/sync/sync.d.ts +18 -17
- package/esm/commands/sync/sync.d.ts.map +1 -1
- package/esm/commands/sync/sync.js +8 -8
- package/esm/commands/sync/sync.js.map +1 -1
- package/esm/commands/tcpip.d.ts +0 -1
- package/esm/commands/tcpip.d.ts.map +1 -1
- package/esm/commands/tcpip.js +9 -9
- package/esm/commands/tcpip.js.map +1 -1
- package/esm/daemon/auth.d.ts +8 -7
- package/esm/daemon/auth.d.ts.map +1 -1
- package/esm/daemon/auth.js +8 -9
- package/esm/daemon/auth.js.map +1 -1
- package/esm/daemon/crypto.d.ts +4 -3
- package/esm/daemon/crypto.d.ts.map +1 -1
- package/esm/daemon/crypto.js +57 -49
- package/esm/daemon/crypto.js.map +1 -1
- package/esm/daemon/device.d.ts +2 -2
- package/esm/daemon/device.d.ts.map +1 -1
- package/esm/daemon/dispatcher.d.ts +35 -10
- package/esm/daemon/dispatcher.d.ts.map +1 -1
- package/esm/daemon/dispatcher.js +46 -33
- package/esm/daemon/dispatcher.js.map +1 -1
- package/esm/daemon/packet.d.ts +48 -32
- package/esm/daemon/packet.d.ts.map +1 -1
- package/esm/daemon/packet.js +36 -32
- package/esm/daemon/packet.js.map +1 -1
- package/esm/daemon/socket.d.ts +11 -11
- package/esm/daemon/socket.d.ts.map +1 -1
- package/esm/daemon/socket.js +19 -40
- package/esm/daemon/socket.js.map +1 -1
- package/esm/daemon/transport.d.ts +60 -20
- package/esm/daemon/transport.d.ts.map +1 -1
- package/esm/daemon/transport.js +12 -15
- package/esm/daemon/transport.js.map +1 -1
- package/esm/device-observer.d.ts +10 -0
- package/esm/device-observer.d.ts.map +1 -0
- package/esm/device-observer.js +2 -0
- package/esm/device-observer.js.map +1 -0
- package/esm/features.d.ts +12 -11
- package/esm/features.d.ts.map +1 -1
- package/esm/features.js +11 -12
- package/esm/features.js.map +1 -1
- package/esm/index.d.ts +1 -0
- package/esm/index.d.ts.map +1 -1
- package/esm/index.js +1 -0
- package/esm/index.js.map +1 -1
- package/esm/server/client.d.ts +140 -50
- package/esm/server/client.d.ts.map +1 -1
- package/esm/server/client.js +396 -180
- package/esm/server/client.js.map +1 -1
- package/esm/server/transport.d.ts +2 -2
- package/esm/server/transport.d.ts.map +1 -1
- package/esm/server/transport.js +4 -6
- package/esm/server/transport.js.map +1 -1
- package/esm/utils/base64.d.ts.map +1 -1
- package/esm/utils/base64.js +52 -38
- 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/no-op.d.ts.map +1 -1
- package/esm/utils/no-op.js +1 -0
- package/esm/utils/no-op.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 +14 -19
- package/src/adb.ts +20 -11
- package/src/banner.ts +8 -6
- package/src/commands/framebuffer.ts +44 -35
- package/src/commands/power.ts +7 -5
- package/src/commands/reverse.ts +78 -47
- package/src/commands/subprocess/command.ts +3 -3
- package/src/commands/subprocess/protocols/none.ts +5 -7
- package/src/commands/subprocess/protocols/shell.ts +33 -35
- package/src/commands/subprocess/protocols/types.ts +8 -8
- package/src/commands/sync/list.ts +20 -15
- package/src/commands/sync/pull.ts +9 -8
- package/src/commands/sync/push.ts +25 -24
- package/src/commands/sync/request.ts +37 -38
- package/src/commands/sync/response.ts +63 -37
- package/src/commands/sync/socket.ts +13 -8
- package/src/commands/sync/stat.ts +93 -73
- package/src/commands/sync/sync.ts +12 -11
- package/src/commands/tcpip.ts +9 -9
- package/src/daemon/auth.ts +12 -10
- package/src/daemon/crypto.ts +66 -55
- package/src/daemon/device.ts +2 -2
- package/src/daemon/dispatcher.ts +106 -44
- package/src/daemon/packet.ts +57 -38
- package/src/daemon/socket.ts +30 -50
- package/src/daemon/transport.ts +98 -50
- package/src/device-observer.ts +10 -0
- package/src/features.ts +13 -11
- package/src/index.ts +1 -0
- package/src/server/client.ts +505 -268
- package/src/server/transport.ts +7 -9
- package/src/utils/base64.ts +59 -40
- package/src/utils/hex.ts +16 -14
- package/src/utils/index.ts +1 -1
- package/src/utils/no-op.ts +1 -0
- package/src/utils/sequence-equal.ts +13 -0
- package/tsconfig.build.json +1 -12
- package/tsconfig.build.tsbuildinfo +1 -1
- package/CHANGELOG.json +0 -265
- 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 { EmptyUint8Array, decodeUtf8, encodeUtf8 } from "@yume-chan/struct";
|
|
5
5
|
import { AdbCommand, calculateChecksum } from "./packet.js";
|
|
6
6
|
import { AdbDaemonSocketController } from "./socket.js";
|
|
7
7
|
/**
|
|
@@ -107,13 +107,13 @@ export class AdbPacketDispatcher {
|
|
|
107
107
|
#handleOkay(packet) {
|
|
108
108
|
let ackBytes;
|
|
109
109
|
if (this.options.initialDelayedAckBytes !== 0) {
|
|
110
|
-
if (packet.payload.
|
|
110
|
+
if (packet.payload.length !== 4) {
|
|
111
111
|
throw new Error("Invalid OKAY packet. Payload size should be 4");
|
|
112
112
|
}
|
|
113
|
-
ackBytes =
|
|
113
|
+
ackBytes = getUint32LittleEndian(packet.payload, 0);
|
|
114
114
|
}
|
|
115
115
|
else {
|
|
116
|
-
if (packet.payload.
|
|
116
|
+
if (packet.payload.length !== 0) {
|
|
117
117
|
throw new Error("Invalid OKAY packet. Payload size should be 0");
|
|
118
118
|
}
|
|
119
119
|
ackBytes = Infinity;
|
|
@@ -136,41 +136,49 @@ export class AdbPacketDispatcher {
|
|
|
136
136
|
}
|
|
137
137
|
// Maybe the device is responding to a packet of last connection
|
|
138
138
|
// Tell the device to close the socket
|
|
139
|
-
void this.sendPacket(AdbCommand.Close, packet.arg1, packet.arg0);
|
|
139
|
+
void this.sendPacket(AdbCommand.Close, packet.arg1, packet.arg0, EmptyUint8Array);
|
|
140
140
|
}
|
|
141
141
|
#sendOkay(localId, remoteId, ackBytes) {
|
|
142
142
|
let payload;
|
|
143
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
|
|
144
146
|
payload = new Uint8Array(4);
|
|
145
|
-
|
|
147
|
+
setUint32LittleEndian(payload, 0, ackBytes);
|
|
146
148
|
}
|
|
147
149
|
else {
|
|
148
|
-
payload =
|
|
150
|
+
payload = EmptyUint8Array;
|
|
149
151
|
}
|
|
150
152
|
return this.sendPacket(AdbCommand.Okay, localId, remoteId, payload);
|
|
151
153
|
}
|
|
152
154
|
async #handleOpen(packet) {
|
|
153
|
-
//
|
|
154
|
-
//
|
|
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
|
|
155
158
|
const [localId] = this.#initializers.add();
|
|
156
159
|
this.#initializers.resolve(localId, undefined);
|
|
157
160
|
const remoteId = packet.arg0;
|
|
158
|
-
let
|
|
159
|
-
|
|
161
|
+
let availableWriteBytes = packet.arg1;
|
|
162
|
+
let service = decodeUtf8(packet.payload);
|
|
163
|
+
// ADB Daemon still adds a null character to the service string
|
|
164
|
+
if (service.endsWith("\0")) {
|
|
165
|
+
service = service.substring(0, service.length - 1);
|
|
166
|
+
}
|
|
167
|
+
// Check remote delayed ack enablement is consistent with local
|
|
160
168
|
if (this.options.initialDelayedAckBytes === 0) {
|
|
161
|
-
if (
|
|
169
|
+
if (availableWriteBytes !== 0) {
|
|
162
170
|
throw new Error("Invalid OPEN packet. arg1 should be 0");
|
|
163
171
|
}
|
|
164
|
-
|
|
172
|
+
availableWriteBytes = Infinity;
|
|
165
173
|
}
|
|
166
174
|
else {
|
|
167
|
-
if (
|
|
175
|
+
if (availableWriteBytes === 0) {
|
|
168
176
|
throw new Error("Invalid OPEN packet. arg1 should be greater than 0");
|
|
169
177
|
}
|
|
170
178
|
}
|
|
171
179
|
const handler = this.#incomingSocketHandlers.get(service);
|
|
172
180
|
if (!handler) {
|
|
173
|
-
await this.sendPacket(AdbCommand.Close, 0, remoteId);
|
|
181
|
+
await this.sendPacket(AdbCommand.Close, 0, remoteId, EmptyUint8Array);
|
|
174
182
|
return;
|
|
175
183
|
}
|
|
176
184
|
const controller = new AdbDaemonSocketController({
|
|
@@ -179,15 +187,15 @@ export class AdbPacketDispatcher {
|
|
|
179
187
|
remoteId,
|
|
180
188
|
localCreated: false,
|
|
181
189
|
service,
|
|
190
|
+
availableWriteBytes,
|
|
182
191
|
});
|
|
183
|
-
controller.ack(initialDelayedAckBytes);
|
|
184
192
|
try {
|
|
185
193
|
await handler(controller.socket);
|
|
186
194
|
this.#sockets.set(localId, controller);
|
|
187
195
|
await this.#sendOkay(localId, remoteId, this.options.initialDelayedAckBytes);
|
|
188
196
|
}
|
|
189
|
-
catch
|
|
190
|
-
await this.sendPacket(AdbCommand.Close, 0, remoteId);
|
|
197
|
+
catch {
|
|
198
|
+
await this.sendPacket(AdbCommand.Close, 0, remoteId, EmptyUint8Array);
|
|
191
199
|
}
|
|
192
200
|
}
|
|
193
201
|
async #handleWrite(packet) {
|
|
@@ -196,19 +204,22 @@ export class AdbPacketDispatcher {
|
|
|
196
204
|
throw new Error(`Unknown local socket id: ${packet.arg1}`);
|
|
197
205
|
}
|
|
198
206
|
let handled = false;
|
|
199
|
-
|
|
200
|
-
delay(5000).then(() => {
|
|
201
|
-
if (this.options.debugSlowRead && !handled) {
|
|
202
|
-
throw new Error(`packet for \`${socket.service}\` not handled in 5 seconds`);
|
|
203
|
-
}
|
|
204
|
-
}),
|
|
207
|
+
const promises = [
|
|
205
208
|
(async () => {
|
|
206
209
|
await socket.enqueue(packet.payload);
|
|
207
210
|
await this.#sendOkay(packet.arg1, packet.arg0, packet.payload.length);
|
|
208
211
|
handled = true;
|
|
209
212
|
})(),
|
|
210
|
-
]
|
|
211
|
-
|
|
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);
|
|
212
223
|
}
|
|
213
224
|
async createSocket(service) {
|
|
214
225
|
if (this.options.appendNullToServiceString) {
|
|
@@ -224,8 +235,8 @@ export class AdbPacketDispatcher {
|
|
|
224
235
|
remoteId,
|
|
225
236
|
localCreated: true,
|
|
226
237
|
service,
|
|
238
|
+
availableWriteBytes,
|
|
227
239
|
});
|
|
228
|
-
controller.ack(availableWriteBytes);
|
|
229
240
|
this.#sockets.set(localId, controller);
|
|
230
241
|
return controller.socket;
|
|
231
242
|
}
|
|
@@ -238,14 +249,16 @@ export class AdbPacketDispatcher {
|
|
|
238
249
|
clearReverseTunnels() {
|
|
239
250
|
this.#incomingSocketHandlers.clear();
|
|
240
251
|
}
|
|
241
|
-
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) {
|
|
242
255
|
if (typeof payload === "string") {
|
|
243
256
|
payload = encodeUtf8(payload);
|
|
244
257
|
}
|
|
245
|
-
if (payload.
|
|
246
|
-
throw new
|
|
258
|
+
if (payload.length > this.options.maxPayloadSize) {
|
|
259
|
+
throw new TypeError("payload too large");
|
|
247
260
|
}
|
|
248
|
-
await
|
|
261
|
+
await Consumable.WritableStream.write(this.#writer, {
|
|
249
262
|
command,
|
|
250
263
|
arg0,
|
|
251
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,32 +1,48 @@
|
|
|
1
|
-
import {
|
|
2
|
-
import
|
|
3
|
-
export declare
|
|
4
|
-
Auth
|
|
5
|
-
Close
|
|
6
|
-
Connect
|
|
7
|
-
Okay
|
|
8
|
-
Open
|
|
9
|
-
Write
|
|
10
|
-
}
|
|
11
|
-
export
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
1
|
+
import { Consumable, TransformStream } from "@yume-chan/stream-extra";
|
|
2
|
+
import type { StructInit, StructValue } from "@yume-chan/struct";
|
|
3
|
+
export declare const AdbCommand: {
|
|
4
|
+
readonly Auth: 1213486401;
|
|
5
|
+
readonly Close: 1163086915;
|
|
6
|
+
readonly Connect: 1314410051;
|
|
7
|
+
readonly Okay: 1497451343;
|
|
8
|
+
readonly Open: 1313165391;
|
|
9
|
+
readonly Write: 1163154007;
|
|
10
|
+
};
|
|
11
|
+
export type AdbCommand = (typeof AdbCommand)[keyof typeof AdbCommand];
|
|
12
|
+
export declare const AdbPacketHeader: import("@yume-chan/struct").Struct<{
|
|
13
|
+
command: import("@yume-chan/struct").NumberField<number>;
|
|
14
|
+
arg0: import("@yume-chan/struct").NumberField<number>;
|
|
15
|
+
arg1: import("@yume-chan/struct").NumberField<number>;
|
|
16
|
+
payloadLength: import("@yume-chan/struct").NumberField<number>;
|
|
17
|
+
checksum: import("@yume-chan/struct").NumberField<number>;
|
|
18
|
+
magic: import("@yume-chan/struct").NumberField<number>;
|
|
19
|
+
}, {}, import("@yume-chan/struct").FieldsType<{
|
|
20
|
+
command: import("@yume-chan/struct").NumberField<number>;
|
|
21
|
+
arg0: import("@yume-chan/struct").NumberField<number>;
|
|
22
|
+
arg1: import("@yume-chan/struct").NumberField<number>;
|
|
23
|
+
payloadLength: import("@yume-chan/struct").NumberField<number>;
|
|
24
|
+
checksum: import("@yume-chan/struct").NumberField<number>;
|
|
25
|
+
magic: import("@yume-chan/struct").NumberField<number>;
|
|
26
|
+
}>>;
|
|
27
|
+
export type AdbPacketHeader = StructValue<typeof AdbPacketHeader>;
|
|
28
|
+
export declare const AdbPacket: import("@yume-chan/struct").Struct<{
|
|
29
|
+
payload: import("@yume-chan/struct").Field<Uint8Array<ArrayBufferLike>, "payloadLength", Record<"payloadLength", number>>;
|
|
30
|
+
command: import("@yume-chan/struct").NumberField<number>;
|
|
31
|
+
arg0: import("@yume-chan/struct").NumberField<number>;
|
|
32
|
+
arg1: import("@yume-chan/struct").NumberField<number>;
|
|
33
|
+
payloadLength: import("@yume-chan/struct").NumberField<number>;
|
|
34
|
+
checksum: import("@yume-chan/struct").NumberField<number>;
|
|
35
|
+
magic: import("@yume-chan/struct").NumberField<number>;
|
|
36
|
+
}, {}, import("@yume-chan/struct").FieldsType<{
|
|
37
|
+
payload: import("@yume-chan/struct").Field<Uint8Array<ArrayBufferLike>, "payloadLength", Record<"payloadLength", number>>;
|
|
38
|
+
command: import("@yume-chan/struct").NumberField<number>;
|
|
39
|
+
arg0: import("@yume-chan/struct").NumberField<number>;
|
|
40
|
+
arg1: import("@yume-chan/struct").NumberField<number>;
|
|
41
|
+
payloadLength: import("@yume-chan/struct").NumberField<number>;
|
|
42
|
+
checksum: import("@yume-chan/struct").NumberField<number>;
|
|
43
|
+
magic: import("@yume-chan/struct").NumberField<number>;
|
|
44
|
+
}>>;
|
|
45
|
+
export type AdbPacket = StructValue<typeof AdbPacket>;
|
|
30
46
|
/**
|
|
31
47
|
* `AdbPacketData` contains all the useful fields of `AdbPacket`.
|
|
32
48
|
*
|
|
@@ -37,10 +53,10 @@ export type AdbPacket = (typeof AdbPacket)["TDeserializeResult"];
|
|
|
37
53
|
* however, `AdbDaemonTransport` will transform `AdbPacketData` to `AdbPacketInit` for you,
|
|
38
54
|
* so `AdbSocket#writable#write` only needs `AdbPacketData`.
|
|
39
55
|
*/
|
|
40
|
-
export type AdbPacketData = Omit<
|
|
41
|
-
export type AdbPacketInit =
|
|
56
|
+
export type AdbPacketData = Omit<StructInit<typeof AdbPacket>, "checksum" | "magic">;
|
|
57
|
+
export type AdbPacketInit = StructInit<typeof AdbPacket>;
|
|
42
58
|
export declare function calculateChecksum(payload: Uint8Array): number;
|
|
43
|
-
export declare class AdbPacketSerializeStream extends
|
|
59
|
+
export declare class AdbPacketSerializeStream extends TransformStream<Consumable<AdbPacketInit>, Consumable<Uint8Array>> {
|
|
44
60
|
constructor();
|
|
45
61
|
}
|
|
46
62
|
//# 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,KAAK,EAAE,UAAU,EAAE,WAAW,EAAE,MAAM,mBAAmB,CAAC;AAGjE,eAAO,MAAM,UAAU;;;;;;;CAOb,CAAC;AAEX,MAAM,MAAM,UAAU,GAAG,CAAC,OAAO,UAAU,CAAC,CAAC,MAAM,OAAO,UAAU,CAAC,CAAC;AAEtE,eAAO,MAAM,eAAe;;;;;;;;;;;;;;GAU3B,CAAC;AAEF,MAAM,MAAM,eAAe,GAAG,WAAW,CAAC,OAAO,eAAe,CAAC,CAAC;AAIlE,eAAO,MAAM,SAAS;;;;;;;;;;;;;;;;GAMrB,CAAC;AAEF,MAAM,MAAM,SAAS,GAAG,WAAW,CAAC,OAAO,SAAS,CAAC,CAAC;AAEtD;;;;;;;;;GASG;AACH,MAAM,MAAM,aAAa,GAAG,IAAI,CAC5B,UAAU,CAAC,OAAO,SAAS,CAAC,EAC5B,UAAU,GAAG,OAAO,CACvB,CAAC;AAEF,MAAM,MAAM,aAAa,GAAG,UAAU,CAAC,OAAO,SAAS,CAAC,CAAC;AAEzD,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;;CA4BA"}
|
package/esm/daemon/packet.js
CHANGED
|
@@ -1,42 +1,46 @@
|
|
|
1
|
-
import {
|
|
2
|
-
import
|
|
3
|
-
export
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
export const AdbPacket =
|
|
20
|
-
|
|
21
|
-
.
|
|
1
|
+
import { Consumable, TransformStream } from "@yume-chan/stream-extra";
|
|
2
|
+
import { buffer, s32, struct, u32 } from "@yume-chan/struct";
|
|
3
|
+
export const AdbCommand = {
|
|
4
|
+
Auth: 0x48545541, // 'AUTH'
|
|
5
|
+
Close: 0x45534c43, // 'CLSE'
|
|
6
|
+
Connect: 0x4e584e43, // 'CNXN'
|
|
7
|
+
Okay: 0x59414b4f, // 'OKAY'
|
|
8
|
+
Open: 0x4e45504f, // 'OPEN'
|
|
9
|
+
Write: 0x45545257, // 'WRTE'
|
|
10
|
+
};
|
|
11
|
+
export const AdbPacketHeader = struct({
|
|
12
|
+
command: u32,
|
|
13
|
+
arg0: u32,
|
|
14
|
+
arg1: u32,
|
|
15
|
+
payloadLength: u32,
|
|
16
|
+
checksum: u32,
|
|
17
|
+
magic: s32,
|
|
18
|
+
}, { littleEndian: true });
|
|
19
|
+
export const AdbPacket = struct(
|
|
20
|
+
/* #__PURE__ */ (() => ({
|
|
21
|
+
...AdbPacketHeader.fields,
|
|
22
|
+
payload: buffer("payloadLength"),
|
|
23
|
+
}))(), { littleEndian: true });
|
|
22
24
|
export function calculateChecksum(payload) {
|
|
23
25
|
return payload.reduce((result, item) => result + item, 0);
|
|
24
26
|
}
|
|
25
|
-
export class AdbPacketSerializeStream extends
|
|
27
|
+
export class AdbPacketSerializeStream extends TransformStream {
|
|
26
28
|
constructor() {
|
|
27
29
|
const headerBuffer = new Uint8Array(AdbPacketHeader.size);
|
|
28
30
|
super({
|
|
29
31
|
transform: async (chunk, controller) => {
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
32
|
+
await chunk.tryConsume(async (chunk) => {
|
|
33
|
+
const init = chunk;
|
|
34
|
+
init.payloadLength = init.payload.length;
|
|
35
|
+
AdbPacketHeader.serialize(init, headerBuffer);
|
|
36
|
+
await Consumable.ReadableStream.enqueue(controller, headerBuffer);
|
|
37
|
+
if (init.payloadLength) {
|
|
38
|
+
// USB protocol preserves packet boundaries,
|
|
39
|
+
// so we must write payload separately as native ADB does,
|
|
40
|
+
// otherwise the read operation on device will fail.
|
|
41
|
+
await Consumable.ReadableStream.enqueue(controller, init.payload);
|
|
42
|
+
}
|
|
43
|
+
});
|
|
40
44
|
},
|
|
41
45
|
});
|
|
42
46
|
}
|
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;AAEtE,OAAO,EAAE,MAAM,EAAE,GAAG,EAAE,MAAM,EAAE,GAAG,EAAE,MAAM,mBAAmB,CAAC;AAE7D,MAAM,CAAC,MAAM,UAAU,GAAG;IACtB,IAAI,EAAE,UAAU,EAAE,SAAS;IAC3B,KAAK,EAAE,UAAU,EAAE,SAAS;IAC5B,OAAO,EAAE,UAAU,EAAE,SAAS;IAC9B,IAAI,EAAE,UAAU,EAAE,SAAS;IAC3B,IAAI,EAAE,UAAU,EAAE,SAAS;IAC3B,KAAK,EAAE,UAAU,EAAE,SAAS;CACtB,CAAC;AAIX,MAAM,CAAC,MAAM,eAAe,GAAG,MAAM,CACjC;IACI,OAAO,EAAE,GAAG;IACZ,IAAI,EAAE,GAAG;IACT,IAAI,EAAE,GAAG;IACT,aAAa,EAAE,GAAG;IAClB,QAAQ,EAAE,GAAG;IACb,KAAK,EAAE,GAAG;CACb,EACD,EAAE,YAAY,EAAE,IAAI,EAAE,CACzB,CAAC;AAMF,MAAM,CAAC,MAAM,SAAS,GAAG,MAAM;AAC3B,eAAe,CAAC,CAAC,GAAG,EAAE,CAAC,CAAC;IACpB,GAAG,eAAe,CAAC,MAAM;IACzB,OAAO,EAAE,MAAM,CAAC,eAAe,CAAC;CACnC,CAAC,CAAC,EAAE,EACL,EAAE,YAAY,EAAE,IAAI,EAAE,CACzB,CAAC;AAqBF,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,eAAe,CAAC,SAAS,CAAC,IAAI,EAAE,YAAY,CAAC,CAAC;oBAC9C,MAAM,UAAU,CAAC,cAAc,CAAC,OAAO,CACnC,UAAU,EACV,YAAY,CACf,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;
|
|
@@ -18,11 +23,11 @@ export declare class AdbDaemonSocketController implements AdbDaemonSocketInfo, A
|
|
|
18
23
|
readonly remoteId: number;
|
|
19
24
|
readonly localCreated: boolean;
|
|
20
25
|
readonly service: string;
|
|
21
|
-
get readable(): ReadableStream<Uint8Array
|
|
22
|
-
readonly writable: WritableStream<
|
|
26
|
+
get readable(): ReadableStream<Uint8Array<ArrayBufferLike>>;
|
|
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
32
|
ack(bytes: number): void;
|
|
28
33
|
close(): Promise<void>;
|
|
@@ -30,11 +35,6 @@ export declare class AdbDaemonSocketController implements AdbDaemonSocketInfo, A
|
|
|
30
35
|
}
|
|
31
36
|
/**
|
|
32
37
|
* A duplex stream representing a socket to ADB daemon.
|
|
33
|
-
*
|
|
34
|
-
* To close it, call either `socket.close()`,
|
|
35
|
-
* `socket.readable.cancel()`, `socket.readable.getReader().cancel()`,
|
|
36
|
-
* `socket.writable.abort()`, `socket.writable.getWriter().abort()`,
|
|
37
|
-
* `socket.writable.close()` or `socket.writable.getWriter().close()`.
|
|
38
38
|
*/
|
|
39
39
|
export declare class AdbDaemonSocket implements AdbDaemonSocketInfo, AdbSocket {
|
|
40
40
|
#private;
|
|
@@ -43,7 +43,7 @@ export declare class AdbDaemonSocket implements AdbDaemonSocketInfo, AdbSocket {
|
|
|
43
43
|
get localCreated(): boolean;
|
|
44
44
|
get service(): string;
|
|
45
45
|
get readable(): ReadableStream<Uint8Array>;
|
|
46
|
-
get writable(): WritableStream<
|
|
46
|
+
get writable(): WritableStream<MaybeConsumable<Uint8Array>>;
|
|
47
47
|
get closed(): Promise<void>;
|
|
48
48
|
constructor(controller: AdbDaemonSocketController);
|
|
49
49
|
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,EAER,
|
|
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,gDAEX;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;IAIvB,GAAG,CAAC,KAAK,EAAE,MAAM;IAKlB,KAAK,IAAI,OAAO,CAAC,IAAI,CAAC;IAsB5B,OAAO;CAIV;AAED;;GAEG;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,5 +1,6 @@
|
|
|
1
1
|
import { PromiseResolver } from "@yume-chan/async";
|
|
2
|
-
import {
|
|
2
|
+
import { MaybeConsumable, PushReadableStream } from "@yume-chan/stream-extra";
|
|
3
|
+
import { EmptyUint8Array } from "@yume-chan/struct";
|
|
3
4
|
import { AdbCommand } from "./packet.js";
|
|
4
5
|
export class AdbDaemonSocketController {
|
|
5
6
|
#dispatcher;
|
|
@@ -25,12 +26,12 @@ export class AdbDaemonSocketController {
|
|
|
25
26
|
}
|
|
26
27
|
#availableWriteBytesChanged;
|
|
27
28
|
/**
|
|
28
|
-
* When delayed ack is disabled,
|
|
29
|
-
*
|
|
30
|
-
* is waiting for ack.
|
|
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.
|
|
31
32
|
*
|
|
32
|
-
* When delayed ack is enabled, a non-negative finite number indicates the number of
|
|
33
|
-
* bytes that can be written to the socket before
|
|
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.
|
|
34
35
|
*/
|
|
35
36
|
#availableWriteBytes = 0;
|
|
36
37
|
constructor(options) {
|
|
@@ -42,30 +43,31 @@ export class AdbDaemonSocketController {
|
|
|
42
43
|
this.#readable = new PushReadableStream((controller) => {
|
|
43
44
|
this.#readableController = controller;
|
|
44
45
|
});
|
|
45
|
-
this.writable = new
|
|
46
|
+
this.writable = new MaybeConsumable.WritableStream({
|
|
46
47
|
start: (controller) => {
|
|
47
48
|
this.#writableController = controller;
|
|
49
|
+
controller.signal.addEventListener("abort", () => {
|
|
50
|
+
this.#availableWriteBytesChanged?.reject(controller.signal.reason);
|
|
51
|
+
});
|
|
48
52
|
},
|
|
49
|
-
write: async (data
|
|
53
|
+
write: async (data) => {
|
|
50
54
|
const size = data.length;
|
|
51
55
|
const chunkSize = this.#dispatcher.options.maxPayloadSize;
|
|
52
56
|
for (let start = 0, end = chunkSize; start < size; start = end, end += chunkSize) {
|
|
53
57
|
const chunk = data.subarray(start, end);
|
|
54
|
-
await this.#writeChunk(chunk
|
|
58
|
+
await this.#writeChunk(chunk);
|
|
55
59
|
}
|
|
56
60
|
},
|
|
57
61
|
});
|
|
58
62
|
this.#socket = new AdbDaemonSocket(this);
|
|
63
|
+
this.#availableWriteBytes = options.availableWriteBytes;
|
|
59
64
|
}
|
|
60
|
-
async #writeChunk(data
|
|
61
|
-
const length = data.
|
|
65
|
+
async #writeChunk(data) {
|
|
66
|
+
const length = data.length;
|
|
62
67
|
while (this.#availableWriteBytes < length) {
|
|
63
68
|
// Only one lock is required because Web Streams API guarantees
|
|
64
69
|
// that `write` is not reentrant.
|
|
65
70
|
const resolver = new PromiseResolver();
|
|
66
|
-
signal.addEventListener("abort", () => {
|
|
67
|
-
resolver.reject(signal.reason);
|
|
68
|
-
});
|
|
69
71
|
this.#availableWriteBytesChanged = resolver;
|
|
70
72
|
await resolver.promise;
|
|
71
73
|
}
|
|
@@ -78,20 +80,7 @@ export class AdbDaemonSocketController {
|
|
|
78
80
|
await this.#dispatcher.sendPacket(AdbCommand.Write, this.localId, this.remoteId, data);
|
|
79
81
|
}
|
|
80
82
|
async enqueue(data) {
|
|
81
|
-
|
|
82
|
-
// Throw away the data if that happens.
|
|
83
|
-
if (this.#readableController.abortSignal.aborted) {
|
|
84
|
-
return;
|
|
85
|
-
}
|
|
86
|
-
try {
|
|
87
|
-
await this.#readableController.enqueue(data);
|
|
88
|
-
}
|
|
89
|
-
catch (e) {
|
|
90
|
-
if (this.#readableController.abortSignal.aborted) {
|
|
91
|
-
return;
|
|
92
|
-
}
|
|
93
|
-
throw e;
|
|
94
|
-
}
|
|
83
|
+
await this.#readableController.enqueue(data);
|
|
95
84
|
}
|
|
96
85
|
ack(bytes) {
|
|
97
86
|
this.#availableWriteBytes += bytes;
|
|
@@ -109,25 +98,15 @@ export class AdbDaemonSocketController {
|
|
|
109
98
|
catch {
|
|
110
99
|
// ignore
|
|
111
100
|
}
|
|
112
|
-
await this.#dispatcher.sendPacket(AdbCommand.Close, this.localId, this.remoteId);
|
|
101
|
+
await this.#dispatcher.sendPacket(AdbCommand.Close, this.localId, this.remoteId, EmptyUint8Array);
|
|
113
102
|
}
|
|
114
103
|
dispose() {
|
|
115
|
-
|
|
116
|
-
this.#readableController.close();
|
|
117
|
-
}
|
|
118
|
-
catch {
|
|
119
|
-
// ignore
|
|
120
|
-
}
|
|
104
|
+
this.#readableController.close();
|
|
121
105
|
this.#closedPromise.resolve();
|
|
122
106
|
}
|
|
123
107
|
}
|
|
124
108
|
/**
|
|
125
109
|
* A duplex stream representing a socket to ADB daemon.
|
|
126
|
-
*
|
|
127
|
-
* To close it, call either `socket.close()`,
|
|
128
|
-
* `socket.readable.cancel()`, `socket.readable.getReader().cancel()`,
|
|
129
|
-
* `socket.writable.abort()`, `socket.writable.getWriter().abort()`,
|
|
130
|
-
* `socket.writable.close()` or `socket.writable.getWriter().close()`.
|
|
131
110
|
*/
|
|
132
111
|
export class AdbDaemonSocket {
|
|
133
112
|
#controller;
|
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":"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"}
|