@yume-chan/adb 0.0.19 → 0.0.21
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 +57 -0
- package/CHANGELOG.md +26 -1
- package/README.md +222 -103
- package/esm/adb.d.ts +28 -45
- package/esm/adb.d.ts.map +1 -1
- package/esm/adb.js +34 -213
- package/esm/adb.js.map +1 -1
- package/esm/banner.d.ts +17 -0
- package/esm/banner.d.ts.map +1 -0
- package/esm/banner.js +67 -0
- package/esm/banner.js.map +1 -0
- package/esm/commands/base.d.ts.map +1 -1
- package/esm/commands/base.js.map +1 -1
- package/esm/commands/framebuffer.d.ts +9 -0
- package/esm/commands/framebuffer.d.ts.map +1 -1
- package/esm/commands/framebuffer.js +27 -3
- package/esm/commands/framebuffer.js.map +1 -1
- package/esm/commands/power.d.ts +1 -1
- package/esm/commands/power.d.ts.map +1 -1
- package/esm/commands/power.js +2 -2
- package/esm/commands/power.js.map +1 -1
- package/esm/commands/reverse.d.ts +17 -18
- package/esm/commands/reverse.d.ts.map +1 -1
- package/esm/commands/reverse.js +53 -48
- package/esm/commands/reverse.js.map +1 -1
- package/esm/commands/subprocess/command.d.ts +1 -1
- package/esm/commands/subprocess/command.d.ts.map +1 -1
- package/esm/commands/subprocess/command.js +15 -13
- package/esm/commands/subprocess/command.js.map +1 -1
- package/esm/commands/subprocess/protocols/none.d.ts +3 -8
- package/esm/commands/subprocess/protocols/none.d.ts.map +1 -1
- package/esm/commands/subprocess/protocols/none.js +16 -16
- package/esm/commands/subprocess/protocols/none.js.map +1 -1
- package/esm/commands/subprocess/protocols/shell.d.ts +3 -9
- package/esm/commands/subprocess/protocols/shell.d.ts.map +1 -1
- package/esm/commands/subprocess/protocols/shell.js +63 -57
- package/esm/commands/subprocess/protocols/shell.js.map +1 -1
- package/esm/commands/subprocess/protocols/types.d.ts +1 -2
- package/esm/commands/subprocess/protocols/types.d.ts.map +1 -1
- package/esm/commands/sync/list.js +2 -2
- package/esm/commands/sync/push.d.ts +14 -3
- package/esm/commands/sync/push.d.ts.map +1 -1
- package/esm/commands/sync/push.js +9 -9
- package/esm/commands/sync/push.js.map +1 -1
- package/esm/commands/sync/request.js +2 -2
- package/esm/commands/sync/request.js.map +1 -1
- package/esm/commands/sync/response.d.ts +5 -3
- package/esm/commands/sync/response.d.ts.map +1 -1
- package/esm/commands/sync/response.js +7 -5
- package/esm/commands/sync/response.js.map +1 -1
- package/esm/commands/sync/socket.d.ts +8 -14
- package/esm/commands/sync/socket.d.ts.map +1 -1
- package/esm/commands/sync/socket.js +35 -32
- package/esm/commands/sync/socket.js.map +1 -1
- package/esm/commands/sync/stat.js +4 -4
- package/esm/commands/sync/stat.js.map +1 -1
- package/esm/commands/sync/sync.d.ts +26 -18
- package/esm/commands/sync/sync.d.ts.map +1 -1
- package/esm/commands/sync/sync.js +36 -25
- package/esm/commands/sync/sync.js.map +1 -1
- package/esm/commands/tcpip.d.ts +2 -2
- package/esm/commands/tcpip.d.ts.map +1 -1
- package/esm/commands/tcpip.js +4 -2
- package/esm/commands/tcpip.js.map +1 -1
- package/esm/{auth.d.ts → daemon/auth.d.ts} +12 -11
- package/esm/daemon/auth.d.ts.map +1 -0
- package/esm/{auth.js → daemon/auth.js} +31 -22
- package/esm/daemon/auth.js.map +1 -0
- package/esm/{crypto.d.ts → daemon/crypto.d.ts} +5 -5
- package/esm/daemon/crypto.d.ts.map +1 -0
- package/esm/{crypto.js → daemon/crypto.js} +24 -28
- package/esm/daemon/crypto.js.map +1 -0
- package/esm/{backend.d.ts → daemon/device.d.ts} +2 -2
- package/esm/daemon/device.d.ts.map +1 -0
- package/esm/daemon/device.js +2 -0
- package/esm/daemon/device.js.map +1 -0
- package/esm/{socket → daemon}/dispatcher.d.ts +12 -30
- package/esm/daemon/dispatcher.d.ts.map +1 -0
- package/esm/{socket → daemon}/dispatcher.js +80 -78
- package/esm/daemon/dispatcher.js.map +1 -0
- package/esm/daemon/index.d.ts +8 -0
- package/esm/daemon/index.d.ts.map +1 -0
- package/esm/daemon/index.js +8 -0
- package/esm/daemon/index.js.map +1 -0
- package/esm/{packet.d.ts → daemon/packet.d.ts} +4 -4
- package/esm/daemon/packet.d.ts.map +1 -0
- package/esm/{packet.js → daemon/packet.js} +2 -2
- package/esm/{packet.js.map → daemon/packet.js.map} +1 -1
- package/esm/{socket → daemon}/socket.d.ts +15 -19
- package/esm/daemon/socket.d.ts.map +1 -0
- package/esm/{socket → daemon}/socket.js +49 -42
- package/esm/daemon/socket.js.map +1 -0
- package/esm/daemon/transport.d.ts +53 -0
- package/esm/daemon/transport.d.ts.map +1 -0
- package/esm/daemon/transport.js +186 -0
- package/esm/daemon/transport.js.map +1 -0
- package/esm/features.js +1 -1
- package/esm/features.js.map +1 -1
- package/esm/index.d.ts +3 -5
- package/esm/index.d.ts.map +1 -1
- package/esm/index.js +3 -5
- package/esm/index.js.map +1 -1
- package/esm/server/client.d.ts +78 -0
- package/esm/server/client.d.ts.map +1 -0
- package/esm/server/client.js +328 -0
- package/esm/server/client.js.map +1 -0
- package/esm/server/index.d.ts +3 -0
- package/esm/server/index.d.ts.map +1 -0
- package/esm/server/index.js +3 -0
- package/esm/server/index.js.map +1 -0
- package/esm/server/transport.d.ts +19 -0
- package/esm/server/transport.d.ts.map +1 -0
- package/esm/server/transport.js +44 -0
- package/esm/server/transport.js.map +1 -0
- package/esm/utils/auto-reset-event.d.ts +1 -2
- package/esm/utils/auto-reset-event.d.ts.map +1 -1
- package/esm/utils/auto-reset-event.js +12 -12
- package/esm/utils/auto-reset-event.js.map +1 -1
- package/esm/utils/base64.js +5 -5
- package/esm/utils/base64.js.map +1 -1
- package/esm/utils/conditional-variable.d.ts +1 -2
- package/esm/utils/conditional-variable.d.ts.map +1 -1
- package/esm/utils/conditional-variable.js +10 -10
- package/esm/utils/conditional-variable.js.map +1 -1
- package/esm/utils/hex.d.ts +3 -0
- package/esm/utils/hex.d.ts.map +1 -0
- package/esm/utils/hex.js +55 -0
- package/esm/utils/hex.js.map +1 -0
- package/esm/utils/index.d.ts +2 -0
- package/esm/utils/index.d.ts.map +1 -1
- package/esm/utils/index.js +2 -0
- package/esm/utils/index.js.map +1 -1
- package/esm/utils/no-op.d.ts +7 -0
- package/esm/utils/no-op.d.ts.map +1 -0
- package/esm/utils/no-op.js +12 -0
- package/esm/utils/no-op.js.map +1 -0
- package/package.json +12 -12
- package/src/adb.ts +75 -274
- package/src/banner.ts +82 -0
- package/src/commands/base.ts +1 -1
- package/src/commands/framebuffer.ts +31 -3
- package/src/commands/power.ts +10 -10
- package/src/commands/reverse.ts +77 -82
- package/src/commands/subprocess/command.ts +24 -25
- package/src/commands/subprocess/protocols/none.ts +29 -30
- package/src/commands/subprocess/protocols/shell.ts +87 -89
- package/src/commands/subprocess/protocols/types.ts +1 -2
- package/src/commands/sync/list.ts +7 -7
- package/src/commands/sync/pull.ts +4 -4
- package/src/commands/sync/push.ts +28 -16
- package/src/commands/sync/request.ts +4 -4
- package/src/commands/sync/response.ts +13 -11
- package/src/commands/sync/socket.ts +48 -46
- package/src/commands/sync/stat.ts +5 -5
- package/src/commands/sync/sync.ts +55 -43
- package/src/commands/tcpip.ts +6 -4
- package/src/{auth.ts → daemon/auth.ts} +62 -43
- package/src/{crypto.ts → daemon/crypto.ts} +33 -41
- package/src/{backend.ts → daemon/device.ts} +1 -1
- package/src/{socket → daemon}/dispatcher.ts +103 -109
- package/src/daemon/index.ts +7 -0
- package/src/{packet.ts → daemon/packet.ts} +6 -6
- package/src/{socket → daemon}/socket.ts +77 -67
- package/src/daemon/transport.ts +281 -0
- package/src/index.ts +3 -5
- package/src/server/client.ts +473 -0
- package/src/server/index.ts +2 -0
- package/src/server/transport.ts +77 -0
- package/src/utils/auto-reset-event.ts +16 -16
- package/src/utils/base64.ts +5 -5
- package/src/utils/conditional-variable.ts +14 -14
- package/src/utils/hex.ts +58 -0
- package/src/utils/index.ts +2 -0
- package/src/utils/no-op.ts +12 -0
- package/tsconfig.build.json +12 -1
- package/tsconfig.build.tsbuildinfo +1 -1
- package/esm/auth.d.ts.map +0 -1
- package/esm/auth.js.map +0 -1
- package/esm/backend.d.ts.map +0 -1
- package/esm/backend.js +0 -2
- package/esm/backend.js.map +0 -1
- package/esm/commands/install.d.ts +0 -10
- package/esm/commands/install.d.ts.map +0 -1
- package/esm/commands/install.js +0 -29
- package/esm/commands/install.js.map +0 -1
- package/esm/crypto.d.ts.map +0 -1
- package/esm/crypto.js.map +0 -1
- package/esm/packet.d.ts.map +0 -1
- package/esm/socket/dispatcher.d.ts.map +0 -1
- package/esm/socket/dispatcher.js.map +0 -1
- package/esm/socket/index.d.ts +0 -3
- package/esm/socket/index.d.ts.map +0 -1
- package/esm/socket/index.js +0 -3
- package/esm/socket/index.js.map +0 -1
- package/esm/socket/socket.d.ts.map +0 -1
- package/esm/socket/socket.js.map +0 -1
- package/src/socket/index.ts +0 -2
|
@@ -1,8 +1,4 @@
|
|
|
1
1
|
import { getBigUint64, setBigUint64, } from "@yume-chan/dataview-bigint-polyfill/esm/fallback.js";
|
|
2
|
-
const BigInt0 = BigInt(0);
|
|
3
|
-
const BigInt1 = BigInt(1);
|
|
4
|
-
const BigInt2 = BigInt(2);
|
|
5
|
-
const BigInt64 = BigInt(64);
|
|
6
2
|
/**
|
|
7
3
|
* Gets the `BigInt` value at the specified byte offset and length from the start of the view. There is
|
|
8
4
|
* no alignment constraint; multi-byte values may be fetched from any offset.
|
|
@@ -11,11 +7,11 @@ const BigInt64 = BigInt(64);
|
|
|
11
7
|
* @param byteOffset The place in the buffer at which the value should be retrieved.
|
|
12
8
|
*/
|
|
13
9
|
export function getBigUint(dataView, byteOffset, length) {
|
|
14
|
-
let result =
|
|
10
|
+
let result = 0n;
|
|
15
11
|
// Currently `length` must be a multiplication of 8
|
|
16
12
|
// Support for arbitrary length can be easily added
|
|
17
13
|
for (let i = byteOffset; i < byteOffset + length; i += 8) {
|
|
18
|
-
result <<=
|
|
14
|
+
result <<= 64n;
|
|
19
15
|
const value = getBigUint64(dataView, i, false);
|
|
20
16
|
result += value;
|
|
21
17
|
}
|
|
@@ -31,19 +27,19 @@ export function getBigUint(dataView, byteOffset, length) {
|
|
|
31
27
|
export function setBigUint(dataView, byteOffset, value, littleEndian) {
|
|
32
28
|
const start = byteOffset;
|
|
33
29
|
if (littleEndian) {
|
|
34
|
-
while (value >
|
|
30
|
+
while (value > 0n) {
|
|
35
31
|
setBigUint64(dataView, byteOffset, value, true);
|
|
36
32
|
byteOffset += 8;
|
|
37
|
-
value >>=
|
|
33
|
+
value >>= 64n;
|
|
38
34
|
}
|
|
39
35
|
}
|
|
40
36
|
else {
|
|
41
37
|
// Because we don't know how long (in bits) the `value` is,
|
|
42
38
|
// Convert it to an array of `uint64` first.
|
|
43
39
|
const uint64Array = [];
|
|
44
|
-
while (value >
|
|
40
|
+
while (value > 0n) {
|
|
45
41
|
uint64Array.push(BigInt.asUintN(64, value));
|
|
46
|
-
value >>=
|
|
42
|
+
value >>= 64n;
|
|
47
43
|
}
|
|
48
44
|
for (let i = uint64Array.length - 1; i >= 0; i -= 1) {
|
|
49
45
|
setBigUint64(dataView, byteOffset, uint64Array[i], false);
|
|
@@ -74,7 +70,7 @@ const RsaPrivateKeyNOffset = 38;
|
|
|
74
70
|
const RsaPrivateKeyNLength = 2048 / 8;
|
|
75
71
|
const RsaPrivateKeyDOffset = 303;
|
|
76
72
|
const RsaPrivateKeyDLength = 2048 / 8;
|
|
77
|
-
export function
|
|
73
|
+
export function rsaParsePrivateKey(key) {
|
|
78
74
|
const view = new DataView(key.buffer, key.byteOffset, key.byteLength);
|
|
79
75
|
const n = getBigUint(view, RsaPrivateKeyNOffset, RsaPrivateKeyNLength);
|
|
80
76
|
const d = getBigUint(view, RsaPrivateKeyDOffset, RsaPrivateKeyDLength);
|
|
@@ -106,10 +102,10 @@ export function modInverse(a, m) {
|
|
|
106
102
|
}
|
|
107
103
|
return ((y % m) + m) % m;
|
|
108
104
|
}
|
|
109
|
-
export function
|
|
105
|
+
export function adbGetPublicKeySize() {
|
|
110
106
|
return 4 + 4 + 2048 / 8 + 2048 / 8 + 4;
|
|
111
107
|
}
|
|
112
|
-
export function
|
|
108
|
+
export function adbGeneratePublicKey(privateKey, output) {
|
|
113
109
|
// Android has its own public key generation algorithm
|
|
114
110
|
// See https://android.googlesource.com/platform/system/core.git/+/91784040db2b9273687f88d8b95f729d4a61ecc2/libcrypto_utils/android_pubkey.cpp#111
|
|
115
111
|
// The public key is an array of
|
|
@@ -125,10 +121,8 @@ export function calculatePublicKey(privateKey, output) {
|
|
|
125
121
|
//
|
|
126
122
|
// (All in little endian)
|
|
127
123
|
// See https://android.googlesource.com/platform/system/core.git/+/91784040db2b9273687f88d8b95f729d4a61ecc2/libcrypto_utils/android_pubkey.cpp#38
|
|
128
|
-
// extract `n` from private key
|
|
129
|
-
const [n] = parsePrivateKey(privateKey);
|
|
130
124
|
let outputType;
|
|
131
|
-
const outputLength =
|
|
125
|
+
const outputLength = adbGetPublicKeySize();
|
|
132
126
|
if (!output) {
|
|
133
127
|
output = new Uint8Array(outputLength);
|
|
134
128
|
outputType = "Uint8Array";
|
|
@@ -144,17 +138,19 @@ export function calculatePublicKey(privateKey, output) {
|
|
|
144
138
|
// modulusLengthInWords
|
|
145
139
|
outputView.setUint32(outputOffset, 2048 / 8 / 4, true);
|
|
146
140
|
outputOffset += 4;
|
|
141
|
+
// extract `n` from private key
|
|
142
|
+
const [n] = rsaParsePrivateKey(privateKey);
|
|
147
143
|
// Calculate `n0inv`
|
|
148
|
-
// Don't know why need to
|
|
144
|
+
// Don't know why need to multiply by -1
|
|
149
145
|
// Didn't exist in Android codebase
|
|
150
|
-
const n0inv = modInverse(Number(BigInt.asUintN(32, n)
|
|
146
|
+
const n0inv = modInverse(-Number(BigInt.asUintN(32, n)), 2 ** 32);
|
|
151
147
|
outputView.setUint32(outputOffset, n0inv, true);
|
|
152
148
|
outputOffset += 4;
|
|
153
149
|
// Write n
|
|
154
150
|
setBigUint(outputView, outputOffset, n, true);
|
|
155
151
|
outputOffset += 256;
|
|
156
152
|
// Calculate rr = (2^(rsa_size)) ^ 2 mod n
|
|
157
|
-
const rr =
|
|
153
|
+
const rr = 2n ** 4096n % n;
|
|
158
154
|
outputOffset += setBigUint(outputView, outputOffset, rr, true);
|
|
159
155
|
// exponent
|
|
160
156
|
outputView.setUint32(outputOffset, 65537, true);
|
|
@@ -174,17 +170,17 @@ export function calculatePublicKey(privateKey, output) {
|
|
|
174
170
|
* See https://en.wikipedia.org/wiki/Modular_exponentiation#Implementation_in_Lua
|
|
175
171
|
*/
|
|
176
172
|
export function powMod(base, exponent, modulus) {
|
|
177
|
-
if (modulus ===
|
|
178
|
-
return
|
|
173
|
+
if (modulus === 1n) {
|
|
174
|
+
return 0n;
|
|
179
175
|
}
|
|
180
|
-
let r =
|
|
176
|
+
let r = 1n;
|
|
181
177
|
base = base % modulus;
|
|
182
|
-
while (exponent >
|
|
183
|
-
if (BigInt.asUintN(1, exponent) ===
|
|
178
|
+
while (exponent > 0n) {
|
|
179
|
+
if (BigInt.asUintN(1, exponent) === 1n) {
|
|
184
180
|
r = (r * base) % modulus;
|
|
185
181
|
}
|
|
186
|
-
|
|
187
|
-
|
|
182
|
+
base = (base * base) % modulus;
|
|
183
|
+
exponent >>= 1n;
|
|
188
184
|
}
|
|
189
185
|
return r;
|
|
190
186
|
}
|
|
@@ -218,8 +214,8 @@ export const SHA1_DIGEST_INFO = new Uint8Array([
|
|
|
218
214
|
// encrypt the given data with its private key)
|
|
219
215
|
// However SubtileCrypto.encrypt() doesn't accept 'RSASSA-PKCS1-v1_5' algorithm
|
|
220
216
|
// So we need to implement the encryption by ourself
|
|
221
|
-
export function
|
|
222
|
-
const [n, d] =
|
|
217
|
+
export function rsaSign(privateKey, data) {
|
|
218
|
+
const [n, d] = rsaParsePrivateKey(privateKey);
|
|
223
219
|
// PKCS#1 padding
|
|
224
220
|
const padded = new Uint8Array(256);
|
|
225
221
|
let index = 0;
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"crypto.js","sourceRoot":"","sources":["../../src/daemon/crypto.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,9 +1,9 @@
|
|
|
1
1
|
import type { Consumable, ReadableWritablePair } from "@yume-chan/stream-extra";
|
|
2
2
|
import type { ValueOrPromise } from "@yume-chan/struct";
|
|
3
3
|
import type { AdbPacketData, AdbPacketInit } from "./packet.js";
|
|
4
|
-
export interface
|
|
4
|
+
export interface AdbDaemonDevice {
|
|
5
5
|
readonly serial: string;
|
|
6
6
|
readonly name: string | undefined;
|
|
7
7
|
connect(): ValueOrPromise<ReadableWritablePair<AdbPacketData, Consumable<AdbPacketInit>>>;
|
|
8
8
|
}
|
|
9
|
-
//# sourceMappingURL=
|
|
9
|
+
//# sourceMappingURL=device.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"device.d.ts","sourceRoot":"","sources":["../../src/daemon/device.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,UAAU,EAAE,oBAAoB,EAAE,MAAM,yBAAyB,CAAC;AAChF,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,mBAAmB,CAAC;AAExD,OAAO,KAAK,EAAE,aAAa,EAAE,aAAa,EAAE,MAAM,aAAa,CAAC;AAEhE,MAAM,WAAW,eAAe;IAC5B,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAC;IAExB,QAAQ,CAAC,IAAI,EAAE,MAAM,GAAG,SAAS,CAAC;IAElC,OAAO,IAAI,cAAc,CACrB,oBAAoB,CAAC,aAAa,EAAE,UAAU,CAAC,aAAa,CAAC,CAAC,CACjE,CAAC;CACL"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"device.js","sourceRoot":"","sources":["../../src/daemon/device.ts"],"names":[],"mappings":""}
|
|
@@ -1,9 +1,7 @@
|
|
|
1
|
-
import type { RemoveEventListener } from "@yume-chan/event";
|
|
2
1
|
import type { Consumable, ReadableWritablePair } from "@yume-chan/stream-extra";
|
|
3
|
-
import type {
|
|
4
|
-
import type { AdbPacketData, AdbPacketInit } from "
|
|
5
|
-
import { AdbCommand } from "
|
|
6
|
-
import type { AdbSocket } from "./socket.js";
|
|
2
|
+
import type { AdbIncomingSocketHandler, AdbSocket, Closeable } from "../adb.js";
|
|
3
|
+
import type { AdbPacketData, AdbPacketInit } from "./packet.js";
|
|
4
|
+
import { AdbCommand } from "./packet.js";
|
|
7
5
|
export interface AdbPacketDispatcherOptions {
|
|
8
6
|
calculateChecksum: boolean;
|
|
9
7
|
/**
|
|
@@ -14,10 +12,10 @@ export interface AdbPacketDispatcherOptions {
|
|
|
14
12
|
*/
|
|
15
13
|
appendNullToServiceString: boolean;
|
|
16
14
|
maxPayloadSize: number;
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
15
|
+
/**
|
|
16
|
+
* Whether to preserve the connection open after the `AdbPacketDispatcher` is closed.
|
|
17
|
+
*/
|
|
18
|
+
preserveConnection?: boolean | undefined;
|
|
21
19
|
}
|
|
22
20
|
/**
|
|
23
21
|
* The dispatcher is the "dumb" part of the connection handling logic.
|
|
@@ -30,31 +28,15 @@ export interface Closeable {
|
|
|
30
28
|
* negotiating the options, and has shortcuts to high-level services.
|
|
31
29
|
*/
|
|
32
30
|
export declare class AdbPacketDispatcher implements Closeable {
|
|
33
|
-
private
|
|
34
|
-
/**
|
|
35
|
-
* Socket local ID to the socket controller.
|
|
36
|
-
*/
|
|
37
|
-
private readonly sockets;
|
|
38
|
-
private _writer;
|
|
31
|
+
#private;
|
|
39
32
|
readonly options: AdbPacketDispatcherOptions;
|
|
40
|
-
private _closed;
|
|
41
|
-
private _disconnected;
|
|
42
33
|
get disconnected(): Promise<void>;
|
|
43
|
-
private _incomingSocketHandlers;
|
|
44
|
-
private _abortController;
|
|
45
34
|
constructor(connection: ReadableWritablePair<AdbPacketData, Consumable<AdbPacketInit>>, options: AdbPacketDispatcherOptions);
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
* @param handler A function to call with new incoming sockets. It must return `true` if it accepts the socket.
|
|
51
|
-
* @returns A function to remove the handler.
|
|
52
|
-
*/
|
|
53
|
-
onIncomingSocket(handler: AdbIncomingSocketHandler): RemoveEventListener;
|
|
54
|
-
private handleOpen;
|
|
55
|
-
createSocket(serviceString: string): Promise<AdbSocket>;
|
|
35
|
+
addReverseTunnel(service: string, handler: AdbIncomingSocketHandler): void;
|
|
36
|
+
removeReverseTunnel(address: string): void;
|
|
37
|
+
clearReverseTunnels(): void;
|
|
38
|
+
createSocket(service: string): Promise<AdbSocket>;
|
|
56
39
|
sendPacket(command: AdbCommand, arg0: number, arg1: number, payload?: string | Uint8Array): Promise<void>;
|
|
57
40
|
close(): Promise<void>;
|
|
58
|
-
private dispose;
|
|
59
41
|
}
|
|
60
42
|
//# sourceMappingURL=dispatcher.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"dispatcher.d.ts","sourceRoot":"","sources":["../../src/daemon/dispatcher.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EACR,UAAU,EACV,oBAAoB,EAEvB,MAAM,yBAAyB,CAAC;AAQjC,OAAO,KAAK,EAAE,wBAAwB,EAAE,SAAS,EAAE,SAAS,EAAE,MAAM,WAAW,CAAC;AAGhF,OAAO,KAAK,EAAE,aAAa,EAAE,aAAa,EAAE,MAAM,aAAa,CAAC;AAChE,OAAO,EAAE,UAAU,EAAqB,MAAM,aAAa,CAAC;AAG5D,MAAM,WAAW,0BAA0B;IACvC,iBAAiB,EAAE,OAAO,CAAC;IAC3B;;;;;OAKG;IACH,yBAAyB,EAAE,OAAO,CAAC;IACnC,cAAc,EAAE,MAAM,CAAC;IACvB;;OAEG;IACH,kBAAkB,CAAC,EAAE,OAAO,GAAG,SAAS,CAAC;CAC5C;AAED;;;;;;;;;GASG;AACH,qBAAa,mBAAoB,YAAW,SAAS;;IAWjD,QAAQ,CAAC,OAAO,EAAE,0BAA0B,CAAC;IAI7C,IAAI,YAAY,kBAEf;gBAMG,UAAU,EAAE,oBAAoB,CAC5B,aAAa,EACb,UAAU,CAAC,aAAa,CAAC,CAC5B,EACD,OAAO,EAAE,0BAA0B;IAiIvC,gBAAgB,CAAC,OAAO,EAAE,MAAM,EAAE,OAAO,EAAE,wBAAwB;IAInE,mBAAmB,CAAC,OAAO,EAAE,MAAM;IAInC,mBAAmB;IAuCb,YAAY,CAAC,OAAO,EAAE,MAAM,GAAG,OAAO,CAAC,SAAS,CAAC;IAsBjD,UAAU,CACZ,OAAO,EAAE,UAAU,EACnB,IAAI,EAAE,MAAM,EACZ,IAAI,EAAE,MAAM,EACZ,OAAO,GAAE,MAAM,GAAG,UAA8B,GACjD,OAAO,CAAC,IAAI,CAAC;IAqBV,KAAK;CA4Bd"}
|
|
@@ -1,9 +1,9 @@
|
|
|
1
1
|
import { AsyncOperationManager, PromiseResolver } from "@yume-chan/async";
|
|
2
2
|
import { AbortController, ConsumableWritableStream, WritableStream, } from "@yume-chan/stream-extra";
|
|
3
3
|
import { EMPTY_UINT8_ARRAY } from "@yume-chan/struct";
|
|
4
|
-
import {
|
|
5
|
-
import {
|
|
6
|
-
import {
|
|
4
|
+
import { decodeUtf8, encodeUtf8, unreachable } from "../utils/index.js";
|
|
5
|
+
import { AdbCommand, calculateChecksum } from "./packet.js";
|
|
6
|
+
import { AdbDaemonSocketController } from "./socket.js";
|
|
7
7
|
/**
|
|
8
8
|
* The dispatcher is the "dumb" part of the connection handling logic.
|
|
9
9
|
*
|
|
@@ -17,20 +17,20 @@ import { AdbSocketController } from "./socket.js";
|
|
|
17
17
|
export class AdbPacketDispatcher {
|
|
18
18
|
// ADB socket id starts from 1
|
|
19
19
|
// (0 means open failed)
|
|
20
|
-
initializers = new AsyncOperationManager(1);
|
|
20
|
+
#initializers = new AsyncOperationManager(1);
|
|
21
21
|
/**
|
|
22
22
|
* Socket local ID to the socket controller.
|
|
23
23
|
*/
|
|
24
|
-
sockets = new Map();
|
|
25
|
-
|
|
24
|
+
#sockets = new Map();
|
|
25
|
+
#writer;
|
|
26
26
|
options;
|
|
27
|
-
|
|
28
|
-
|
|
27
|
+
#closed = false;
|
|
28
|
+
#disconnected = new PromiseResolver();
|
|
29
29
|
get disconnected() {
|
|
30
|
-
return this.
|
|
30
|
+
return this.#disconnected.promise;
|
|
31
31
|
}
|
|
32
|
-
|
|
33
|
-
|
|
32
|
+
#incomingSocketHandlers = new Map();
|
|
33
|
+
#readAbortController = new AbortController();
|
|
34
34
|
constructor(connection, options) {
|
|
35
35
|
this.options = options;
|
|
36
36
|
connection.readable
|
|
@@ -38,14 +38,14 @@ export class AdbPacketDispatcher {
|
|
|
38
38
|
write: async (packet) => {
|
|
39
39
|
switch (packet.command) {
|
|
40
40
|
case AdbCommand.OK:
|
|
41
|
-
this
|
|
41
|
+
this.#handleOk(packet);
|
|
42
42
|
break;
|
|
43
43
|
case AdbCommand.Close:
|
|
44
|
-
await this
|
|
44
|
+
await this.#handleClose(packet);
|
|
45
45
|
break;
|
|
46
46
|
case AdbCommand.Write:
|
|
47
|
-
if (this
|
|
48
|
-
await this
|
|
47
|
+
if (this.#sockets.has(packet.arg1)) {
|
|
48
|
+
await this.#sockets
|
|
49
49
|
.get(packet.arg1)
|
|
50
50
|
.enqueue(packet.payload);
|
|
51
51
|
await this.sendPacket(AdbCommand.OK, packet.arg1, packet.arg0);
|
|
@@ -53,7 +53,7 @@ export class AdbPacketDispatcher {
|
|
|
53
53
|
}
|
|
54
54
|
throw new Error(`Unknown local socket id: ${packet.arg1}`);
|
|
55
55
|
case AdbCommand.Open:
|
|
56
|
-
await this
|
|
56
|
+
await this.#handleOpen(packet);
|
|
57
57
|
break;
|
|
58
58
|
default:
|
|
59
59
|
// Junk data may only appear in the authentication phase,
|
|
@@ -64,30 +64,25 @@ export class AdbPacketDispatcher {
|
|
|
64
64
|
}
|
|
65
65
|
},
|
|
66
66
|
}), {
|
|
67
|
-
|
|
68
|
-
|
|
69
|
-
// if the underlying streams are still open,
|
|
70
|
-
// it's still possible to create another ADB connection.
|
|
71
|
-
// So don't close `readable` here.
|
|
72
|
-
preventCancel: true,
|
|
73
|
-
signal: this._abortController.signal,
|
|
67
|
+
preventCancel: options.preserveConnection ?? false,
|
|
68
|
+
signal: this.#readAbortController.signal,
|
|
74
69
|
})
|
|
75
70
|
.then(() => {
|
|
76
|
-
this
|
|
71
|
+
this.#dispose();
|
|
77
72
|
}, (e) => {
|
|
78
|
-
if (!this
|
|
79
|
-
this.
|
|
73
|
+
if (!this.#closed) {
|
|
74
|
+
this.#disconnected.reject(e);
|
|
80
75
|
}
|
|
81
|
-
this
|
|
76
|
+
this.#dispose();
|
|
82
77
|
});
|
|
83
|
-
this
|
|
78
|
+
this.#writer = connection.writable.getWriter();
|
|
84
79
|
}
|
|
85
|
-
handleOk(packet) {
|
|
86
|
-
if (this
|
|
80
|
+
#handleOk(packet) {
|
|
81
|
+
if (this.#initializers.resolve(packet.arg1, packet.arg0)) {
|
|
87
82
|
// Device successfully created the socket
|
|
88
83
|
return;
|
|
89
84
|
}
|
|
90
|
-
const socket = this
|
|
85
|
+
const socket = this.#sockets.get(packet.arg1);
|
|
91
86
|
if (socket) {
|
|
92
87
|
// Device has received last `WRTE` to the socket
|
|
93
88
|
socket.ack();
|
|
@@ -97,10 +92,10 @@ export class AdbPacketDispatcher {
|
|
|
97
92
|
// Tell the device to close the socket
|
|
98
93
|
void this.sendPacket(AdbCommand.Close, packet.arg1, packet.arg0);
|
|
99
94
|
}
|
|
100
|
-
async handleClose(packet) {
|
|
95
|
+
async #handleClose(packet) {
|
|
101
96
|
// If the socket is still pending
|
|
102
97
|
if (packet.arg0 === 0 &&
|
|
103
|
-
this
|
|
98
|
+
this.#initializers.reject(packet.arg1, new Error("Socket open failed"))) {
|
|
104
99
|
// Device failed to create the socket
|
|
105
100
|
// (unknown service string, failed to execute command, etc.)
|
|
106
101
|
// it doesn't break the connection,
|
|
@@ -115,72 +110,76 @@ export class AdbPacketDispatcher {
|
|
|
115
110
|
* CLOSE() operations.
|
|
116
111
|
*/
|
|
117
112
|
// Ignore `arg0` and search for the socket
|
|
118
|
-
const socket = this
|
|
113
|
+
const socket = this.#sockets.get(packet.arg1);
|
|
119
114
|
if (socket) {
|
|
120
115
|
// The device want to close the socket
|
|
121
116
|
if (!socket.closed) {
|
|
122
117
|
await this.sendPacket(AdbCommand.Close, packet.arg1, packet.arg0);
|
|
123
118
|
}
|
|
124
119
|
await socket.dispose();
|
|
125
|
-
this
|
|
120
|
+
this.#sockets.delete(packet.arg1);
|
|
126
121
|
return;
|
|
127
122
|
}
|
|
128
123
|
// TODO: adb: is double closing an socket a catastrophic error?
|
|
129
124
|
// If the client sends two `CLSE` packets for one socket,
|
|
130
125
|
// the device may also respond with two `CLSE` packets.
|
|
131
126
|
}
|
|
132
|
-
|
|
133
|
-
|
|
134
|
-
|
|
135
|
-
|
|
136
|
-
|
|
137
|
-
onIncomingSocket(handler) {
|
|
138
|
-
this._incomingSocketHandlers.add(handler);
|
|
139
|
-
const remove = () => {
|
|
140
|
-
this._incomingSocketHandlers.delete(handler);
|
|
141
|
-
};
|
|
142
|
-
remove.dispose = remove;
|
|
143
|
-
return remove;
|
|
127
|
+
addReverseTunnel(service, handler) {
|
|
128
|
+
this.#incomingSocketHandlers.set(service, handler);
|
|
129
|
+
}
|
|
130
|
+
removeReverseTunnel(address) {
|
|
131
|
+
this.#incomingSocketHandlers.delete(address);
|
|
144
132
|
}
|
|
145
|
-
|
|
133
|
+
clearReverseTunnels() {
|
|
134
|
+
this.#incomingSocketHandlers.clear();
|
|
135
|
+
}
|
|
136
|
+
async #handleOpen(packet) {
|
|
146
137
|
// `AsyncOperationManager` doesn't support skipping IDs
|
|
147
138
|
// Use `add` + `resolve` to simulate this behavior
|
|
148
|
-
const [localId] = this
|
|
149
|
-
this
|
|
139
|
+
const [localId] = this.#initializers.add();
|
|
140
|
+
this.#initializers.resolve(localId, undefined);
|
|
150
141
|
const remoteId = packet.arg0;
|
|
151
|
-
|
|
152
|
-
|
|
142
|
+
let service = decodeUtf8(packet.payload);
|
|
143
|
+
if (service.endsWith("\0")) {
|
|
144
|
+
service = service.substring(0, service.length - 1);
|
|
145
|
+
}
|
|
146
|
+
const handler = this.#incomingSocketHandlers.get(service);
|
|
147
|
+
if (!handler) {
|
|
148
|
+
await this.sendPacket(AdbCommand.Close, 0, remoteId);
|
|
149
|
+
return;
|
|
150
|
+
}
|
|
151
|
+
const controller = new AdbDaemonSocketController({
|
|
153
152
|
dispatcher: this,
|
|
154
153
|
localId,
|
|
155
154
|
remoteId,
|
|
156
155
|
localCreated: false,
|
|
157
|
-
|
|
156
|
+
service,
|
|
158
157
|
});
|
|
159
|
-
|
|
160
|
-
|
|
161
|
-
|
|
162
|
-
|
|
163
|
-
|
|
164
|
-
|
|
158
|
+
try {
|
|
159
|
+
await handler(controller.socket);
|
|
160
|
+
this.#sockets.set(localId, controller);
|
|
161
|
+
await this.sendPacket(AdbCommand.OK, localId, remoteId);
|
|
162
|
+
}
|
|
163
|
+
catch (e) {
|
|
164
|
+
await this.sendPacket(AdbCommand.Close, 0, remoteId);
|
|
165
165
|
}
|
|
166
|
-
await this.sendPacket(AdbCommand.Close, 0, remoteId);
|
|
167
166
|
}
|
|
168
|
-
async createSocket(
|
|
167
|
+
async createSocket(service) {
|
|
169
168
|
if (this.options.appendNullToServiceString) {
|
|
170
|
-
|
|
169
|
+
service += "\0";
|
|
171
170
|
}
|
|
172
|
-
const [localId, initializer] = this
|
|
173
|
-
await this.sendPacket(AdbCommand.Open, localId, 0,
|
|
171
|
+
const [localId, initializer] = this.#initializers.add();
|
|
172
|
+
await this.sendPacket(AdbCommand.Open, localId, 0, service);
|
|
174
173
|
// Fulfilled by `handleOk`
|
|
175
174
|
const remoteId = await initializer;
|
|
176
|
-
const controller = new
|
|
175
|
+
const controller = new AdbDaemonSocketController({
|
|
177
176
|
dispatcher: this,
|
|
178
177
|
localId,
|
|
179
178
|
remoteId,
|
|
180
179
|
localCreated: true,
|
|
181
|
-
|
|
180
|
+
service,
|
|
182
181
|
});
|
|
183
|
-
this
|
|
182
|
+
this.#sockets.set(localId, controller);
|
|
184
183
|
return controller.socket;
|
|
185
184
|
}
|
|
186
185
|
async sendPacket(command, arg0, arg1, payload = EMPTY_UINT8_ARRAY) {
|
|
@@ -190,7 +189,7 @@ export class AdbPacketDispatcher {
|
|
|
190
189
|
if (payload.byteLength > this.options.maxPayloadSize) {
|
|
191
190
|
throw new Error("payload too large");
|
|
192
191
|
}
|
|
193
|
-
await ConsumableWritableStream.write(this
|
|
192
|
+
await ConsumableWritableStream.write(this.#writer, {
|
|
194
193
|
command,
|
|
195
194
|
arg0,
|
|
196
195
|
arg1,
|
|
@@ -203,22 +202,25 @@ export class AdbPacketDispatcher {
|
|
|
203
202
|
}
|
|
204
203
|
async close() {
|
|
205
204
|
// Send `CLSE` packets for all sockets
|
|
206
|
-
await Promise.all(Array.from(this
|
|
205
|
+
await Promise.all(Array.from(this.#sockets.values(), (socket) => socket.close()));
|
|
207
206
|
// Stop receiving
|
|
208
207
|
// It's possible that we haven't received all `CLSE` confirm packets,
|
|
209
208
|
// but it doesn't matter, the next connection can cope with them.
|
|
210
|
-
this
|
|
211
|
-
this.
|
|
212
|
-
this.
|
|
209
|
+
this.#closed = true;
|
|
210
|
+
this.#readAbortController.abort();
|
|
211
|
+
if (this.options.preserveConnection ?? false) {
|
|
212
|
+
this.#writer.releaseLock();
|
|
213
|
+
}
|
|
214
|
+
else {
|
|
215
|
+
await this.#writer.close();
|
|
216
|
+
}
|
|
213
217
|
// `pipe().then()` will call `dispose`
|
|
214
218
|
}
|
|
215
|
-
dispose() {
|
|
216
|
-
for (const socket of this
|
|
217
|
-
socket.dispose().catch(
|
|
218
|
-
void e;
|
|
219
|
-
});
|
|
219
|
+
#dispose() {
|
|
220
|
+
for (const socket of this.#sockets.values()) {
|
|
221
|
+
socket.dispose().catch(unreachable);
|
|
220
222
|
}
|
|
221
|
-
this.
|
|
223
|
+
this.#disconnected.resolve();
|
|
222
224
|
}
|
|
223
225
|
}
|
|
224
226
|
//# sourceMappingURL=dispatcher.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"dispatcher.js","sourceRoot":"","sources":["../../src/daemon/dispatcher.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,qBAAqB,EAAE,eAAe,EAAE,MAAM,kBAAkB,CAAC;AAM1E,OAAO,EACH,eAAe,EACf,wBAAwB,EACxB,cAAc,GACjB,MAAM,yBAAyB,CAAC;AACjC,OAAO,EAAE,iBAAiB,EAAE,MAAM,mBAAmB,CAAC;AAGtD,OAAO,EAAE,UAAU,EAAE,UAAU,EAAE,WAAW,EAAE,MAAM,mBAAmB,CAAC;AAGxE,OAAO,EAAE,UAAU,EAAE,iBAAiB,EAAE,MAAM,aAAa,CAAC;AAC5D,OAAO,EAAE,yBAAyB,EAAE,MAAM,aAAa,CAAC;AAkBxD;;;;;;;;;GASG;AACH,MAAM,OAAO,mBAAmB;IAC5B,8BAA8B;IAC9B,wBAAwB;IACf,aAAa,GAAG,IAAI,qBAAqB,CAAC,CAAC,CAAC,CAAC;IACtD;;OAEG;IACM,QAAQ,GAAG,IAAI,GAAG,EAAqC,CAAC;IAEjE,OAAO,CAAyD;IAEvD,OAAO,CAA6B;IAE7C,OAAO,GAAG,KAAK,CAAC;IAChB,aAAa,GAAG,IAAI,eAAe,EAAQ,CAAC;IAC5C,IAAI,YAAY;QACZ,OAAO,IAAI,CAAC,aAAa,CAAC,OAAO,CAAC;IACtC,CAAC;IAED,uBAAuB,GAAG,IAAI,GAAG,EAAoC,CAAC;IACtE,oBAAoB,GAAG,IAAI,eAAe,EAAE,CAAC;IAE7C,YACI,UAGC,EACD,OAAmC;QAEnC,IAAI,CAAC,OAAO,GAAG,OAAO,CAAC;QAEvB,UAAU,CAAC,QAAQ;aACd,MAAM,CACH,IAAI,cAAc,CAAC;YACf,KAAK,EAAE,KAAK,EAAE,MAAM,EAAE,EAAE;gBACpB,QAAQ,MAAM,CAAC,OAAO,EAAE;oBACpB,KAAK,UAAU,CAAC,EAAE;wBACd,IAAI,CAAC,SAAS,CAAC,MAAM,CAAC,CAAC;wBACvB,MAAM;oBACV,KAAK,UAAU,CAAC,KAAK;wBACjB,MAAM,IAAI,CAAC,YAAY,CAAC,MAAM,CAAC,CAAC;wBAChC,MAAM;oBACV,KAAK,UAAU,CAAC,KAAK;wBACjB,IAAI,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,MAAM,CAAC,IAAI,CAAC,EAAE;4BAChC,MAAM,IAAI,CAAC,QAAQ;iCACd,GAAG,CAAC,MAAM,CAAC,IAAI,CAAE;iCACjB,OAAO,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC;4BAC7B,MAAM,IAAI,CAAC,UAAU,CACjB,UAAU,CAAC,EAAE,EACb,MAAM,CAAC,IAAI,EACX,MAAM,CAAC,IAAI,CACd,CAAC;4BACF,MAAM;yBACT;wBACD,MAAM,IAAI,KAAK,CACX,4BAA4B,MAAM,CAAC,IAAI,EAAE,CAC5C,CAAC;oBACN,KAAK,UAAU,CAAC,IAAI;wBAChB,MAAM,IAAI,CAAC,WAAW,CAAC,MAAM,CAAC,CAAC;wBAC/B,MAAM;oBACV;wBACI,yDAAyD;wBACzD,wDAAwD;wBACxD,2CAA2C;wBAC3C,qEAAqE;wBACrE,MAAM,IAAI,KAAK,CACX,oBAAoB,MAAM,CAAC,OAAO,CAAC,QAAQ,CACvC,EAAE,CACL,EAAE,CACN,CAAC;iBACT;YACL,CAAC;SACJ,CAAC,EACF;YACI,aAAa,EAAE,OAAO,CAAC,kBAAkB,IAAI,KAAK;YAClD,MAAM,EAAE,IAAI,CAAC,oBAAoB,CAAC,MAAM;SAC3C,CACJ;aACA,IAAI,CACD,GAAG,EAAE;YACD,IAAI,CAAC,QAAQ,EAAE,CAAC;QACpB,CAAC,EACD,CAAC,CAAC,EAAE,EAAE;YACF,IAAI,CAAC,IAAI,CAAC,OAAO,EAAE;gBACf,IAAI,CAAC,aAAa,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC;aAChC;YACD,IAAI,CAAC,QAAQ,EAAE,CAAC;QACpB,CAAC,CACJ,CAAC;QAEN,IAAI,CAAC,OAAO,GAAG,UAAU,CAAC,QAAQ,CAAC,SAAS,EAAE,CAAC;IACnD,CAAC;IAED,SAAS,CAAC,MAAqB;QAC3B,IAAI,IAAI,CAAC,aAAa,CAAC,OAAO,CAAC,MAAM,CAAC,IAAI,EAAE,MAAM,CAAC,IAAI,CAAC,EAAE;YACtD,yCAAyC;YACzC,OAAO;SACV;QAED,MAAM,MAAM,GAAG,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC;QAC9C,IAAI,MAAM,EAAE;YACR,gDAAgD;YAChD,MAAM,CAAC,GAAG,EAAE,CAAC;YACb,OAAO;SACV;QAED,gEAAgE;QAChE,sCAAsC;QACtC,KAAK,IAAI,CAAC,UAAU,CAAC,UAAU,CAAC,KAAK,EAAE,MAAM,CAAC,IAAI,EAAE,MAAM,CAAC,IAAI,CAAC,CAAC;IACrE,CAAC;IAED,KAAK,CAAC,YAAY,CAAC,MAAqB;QACpC,iCAAiC;QACjC,IACI,MAAM,CAAC,IAAI,KAAK,CAAC;YACjB,IAAI,CAAC,aAAa,CAAC,MAAM,CACrB,MAAM,CAAC,IAAI,EACX,IAAI,KAAK,CAAC,oBAAoB,CAAC,CAClC,EACH;YACE,qCAAqC;YACrC,4DAA4D;YAC5D,mCAAmC;YACnC,8CAA8C;YAC9C,6BAA6B;YAC7B,OAAO;SACV;QAED,6HAA6H;QAC7H;;;;WAIG;QAEH,0CAA0C;QAC1C,MAAM,MAAM,GAAG,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC;QAC9C,IAAI,MAAM,EAAE;YACR,sCAAsC;YACtC,IAAI,CAAC,MAAM,CAAC,MAAM,EAAE;gBAChB,MAAM,IAAI,CAAC,UAAU,CACjB,UAAU,CAAC,KAAK,EAChB,MAAM,CAAC,IAAI,EACX,MAAM,CAAC,IAAI,CACd,CAAC;aACL;YACD,MAAM,MAAM,CAAC,OAAO,EAAE,CAAC;YACvB,IAAI,CAAC,QAAQ,CAAC,MAAM,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC;YAClC,OAAO;SACV;QAED,+DAA+D;QAC/D,yDAAyD;QACzD,uDAAuD;IAC3D,CAAC;IAED,gBAAgB,CAAC,OAAe,EAAE,OAAiC;QAC/D,IAAI,CAAC,uBAAuB,CAAC,GAAG,CAAC,OAAO,EAAE,OAAO,CAAC,CAAC;IACvD,CAAC;IAED,mBAAmB,CAAC,OAAe;QAC/B,IAAI,CAAC,uBAAuB,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC;IACjD,CAAC;IAED,mBAAmB;QACf,IAAI,CAAC,uBAAuB,CAAC,KAAK,EAAE,CAAC;IACzC,CAAC;IAED,KAAK,CAAC,WAAW,CAAC,MAAqB;QACnC,uDAAuD;QACvD,kDAAkD;QAClD,MAAM,CAAC,OAAO,CAAC,GAAG,IAAI,CAAC,aAAa,CAAC,GAAG,EAAU,CAAC;QACnD,IAAI,CAAC,aAAa,CAAC,OAAO,CAAC,OAAO,EAAE,SAAS,CAAC,CAAC;QAE/C,MAAM,QAAQ,GAAG,MAAM,CAAC,IAAI,CAAC;QAC7B,IAAI,OAAO,GAAG,UAAU,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC;QACzC,IAAI,OAAO,CAAC,QAAQ,CAAC,IAAI,CAAC,EAAE;YACxB,OAAO,GAAG,OAAO,CAAC,SAAS,CAAC,CAAC,EAAE,OAAO,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC;SACtD;QAED,MAAM,OAAO,GAAG,IAAI,CAAC,uBAAuB,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC;QAC1D,IAAI,CAAC,OAAO,EAAE;YACV,MAAM,IAAI,CAAC,UAAU,CAAC,UAAU,CAAC,KAAK,EAAE,CAAC,EAAE,QAAQ,CAAC,CAAC;YACrD,OAAO;SACV;QAED,MAAM,UAAU,GAAG,IAAI,yBAAyB,CAAC;YAC7C,UAAU,EAAE,IAAI;YAChB,OAAO;YACP,QAAQ;YACR,YAAY,EAAE,KAAK;YACnB,OAAO;SACV,CAAC,CAAC;QAEH,IAAI;YACA,MAAM,OAAO,CAAC,UAAU,CAAC,MAAM,CAAC,CAAC;YACjC,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,OAAO,EAAE,UAAU,CAAC,CAAC;YACvC,MAAM,IAAI,CAAC,UAAU,CAAC,UAAU,CAAC,EAAE,EAAE,OAAO,EAAE,QAAQ,CAAC,CAAC;SAC3D;QAAC,OAAO,CAAC,EAAE;YACR,MAAM,IAAI,CAAC,UAAU,CAAC,UAAU,CAAC,KAAK,EAAE,CAAC,EAAE,QAAQ,CAAC,CAAC;SACxD;IACL,CAAC;IAED,KAAK,CAAC,YAAY,CAAC,OAAe;QAC9B,IAAI,IAAI,CAAC,OAAO,CAAC,yBAAyB,EAAE;YACxC,OAAO,IAAI,IAAI,CAAC;SACnB;QAED,MAAM,CAAC,OAAO,EAAE,WAAW,CAAC,GAAG,IAAI,CAAC,aAAa,CAAC,GAAG,EAAU,CAAC;QAChE,MAAM,IAAI,CAAC,UAAU,CAAC,UAAU,CAAC,IAAI,EAAE,OAAO,EAAE,CAAC,EAAE,OAAO,CAAC,CAAC;QAE5D,0BAA0B;QAC1B,MAAM,QAAQ,GAAG,MAAM,WAAW,CAAC;QACnC,MAAM,UAAU,GAAG,IAAI,yBAAyB,CAAC;YAC7C,UAAU,EAAE,IAAI;YAChB,OAAO;YACP,QAAQ;YACR,YAAY,EAAE,IAAI;YAClB,OAAO;SACV,CAAC,CAAC;QACH,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,OAAO,EAAE,UAAU,CAAC,CAAC;QAEvC,OAAO,UAAU,CAAC,MAAM,CAAC;IAC7B,CAAC;IAED,KAAK,CAAC,UAAU,CACZ,OAAmB,EACnB,IAAY,EACZ,IAAY,EACZ,UAA+B,iBAAiB;QAEhD,IAAI,OAAO,OAAO,KAAK,QAAQ,EAAE;YAC7B,OAAO,GAAG,UAAU,CAAC,OAAO,CAAC,CAAC;SACjC;QAED,IAAI,OAAO,CAAC,UAAU,GAAG,IAAI,CAAC,OAAO,CAAC,cAAc,EAAE;YAClD,MAAM,IAAI,KAAK,CAAC,mBAAmB,CAAC,CAAC;SACxC;QAED,MAAM,wBAAwB,CAAC,KAAK,CAAC,IAAI,CAAC,OAAO,EAAE;YAC/C,OAAO;YACP,IAAI;YACJ,IAAI;YACJ,OAAO;YACP,QAAQ,EAAE,IAAI,CAAC,OAAO,CAAC,iBAAiB;gBACpC,CAAC,CAAC,iBAAiB,CAAC,OAAO,CAAC;gBAC5B,CAAC,CAAC,CAAC;YACP,KAAK,EAAE,OAAO,GAAG,UAAU;SAC9B,CAAC,CAAC;IACP,CAAC;IAED,KAAK,CAAC,KAAK;QACP,sCAAsC;QACtC,MAAM,OAAO,CAAC,GAAG,CACb,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,QAAQ,CAAC,MAAM,EAAE,EAAE,CAAC,MAAM,EAAE,EAAE,CAAC,MAAM,CAAC,KAAK,EAAE,CAAC,CACjE,CAAC;QAEF,iBAAiB;QACjB,qEAAqE;QACrE,iEAAiE;QACjE,IAAI,CAAC,OAAO,GAAG,IAAI,CAAC;QAEpB,IAAI,CAAC,oBAAoB,CAAC,KAAK,EAAE,CAAC;QAClC,IAAI,IAAI,CAAC,OAAO,CAAC,kBAAkB,IAAI,KAAK,EAAE;YAC1C,IAAI,CAAC,OAAO,CAAC,WAAW,EAAE,CAAC;SAC9B;aAAM;YACH,MAAM,IAAI,CAAC,OAAO,CAAC,KAAK,EAAE,CAAC;SAC9B;QAED,sCAAsC;IAC1C,CAAC;IAED,QAAQ;QACJ,KAAK,MAAM,MAAM,IAAI,IAAI,CAAC,QAAQ,CAAC,MAAM,EAAE,EAAE;YACzC,MAAM,CAAC,OAAO,EAAE,CAAC,KAAK,CAAC,WAAW,CAAC,CAAC;SACvC;QAED,IAAI,CAAC,aAAa,CAAC,OAAO,EAAE,CAAC;IACjC,CAAC;CACJ"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/daemon/index.ts"],"names":[],"mappings":"AAAA,cAAc,WAAW,CAAC;AAC1B,cAAc,aAAa,CAAC;AAC5B,cAAc,aAAa,CAAC;AAC5B,cAAc,iBAAiB,CAAC;AAChC,cAAc,aAAa,CAAC;AAC5B,cAAc,aAAa,CAAC;AAC5B,cAAc,gBAAgB,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/daemon/index.ts"],"names":[],"mappings":"AAAA,cAAc,WAAW,CAAC;AAC1B,cAAc,aAAa,CAAC;AAC5B,cAAc,aAAa,CAAC;AAC5B,cAAc,iBAAiB,CAAC;AAChC,cAAc,aAAa,CAAC;AAC5B,cAAc,aAAa,CAAC;AAC5B,cAAc,gBAAgB,CAAC"}
|
|
@@ -30,11 +30,11 @@ export type AdbPacket = (typeof AdbPacket)["TDeserializeResult"];
|
|
|
30
30
|
/**
|
|
31
31
|
* `AdbPacketData` contains all the useful fields of `AdbPacket`.
|
|
32
32
|
*
|
|
33
|
-
* `
|
|
34
|
-
*
|
|
33
|
+
* `AdvDaemonConnection#connect` will return a `ReadableStream<AdbPacketData>`,
|
|
34
|
+
* allow each connection to encode `AdbPacket` in different methods.
|
|
35
35
|
*
|
|
36
|
-
* `
|
|
37
|
-
* however, `
|
|
36
|
+
* `AdbDaemonConnection#connect` will return a `WritableStream<AdbPacketInit>`,
|
|
37
|
+
* however, `AdbDaemonTransport` will transform `AdbPacketData` to `AdbPacketInit` for you,
|
|
38
38
|
* so `AdbSocket#writable#write` only needs `AdbPacketData`.
|
|
39
39
|
*/
|
|
40
40
|
export type AdbPacketData = Omit<(typeof AdbPacket)["TInit"], "checksum" | "magic">;
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"packet.d.ts","sourceRoot":"","sources":["../../src/daemon/packet.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,yBAAyB,EAAE,MAAM,yBAAyB,CAAC;AACpE,OAAO,MAAM,MAAM,mBAAmB,CAAC;AAEvC,oBAAY,UAAU;IAClB,IAAI,aAAa;IACjB,KAAK,aAAa;IAClB,OAAO,aAAa;IACpB,EAAE,aAAa;IACf,IAAI,aAAa;IACjB,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,yBAAyB,CACnE,aAAa,EACb,UAAU,CACb;;CAoBA"}
|
|
@@ -8,7 +8,7 @@ export var AdbCommand;
|
|
|
8
8
|
AdbCommand[AdbCommand["OK"] = 1497451343] = "OK";
|
|
9
9
|
AdbCommand[AdbCommand["Open"] = 1313165391] = "Open";
|
|
10
10
|
AdbCommand[AdbCommand["Write"] = 1163154007] = "Write";
|
|
11
|
-
})(AdbCommand
|
|
11
|
+
})(AdbCommand || (AdbCommand = {}));
|
|
12
12
|
export const AdbPacketHeader = new Struct({ littleEndian: true })
|
|
13
13
|
.uint32("command")
|
|
14
14
|
.uint32("arg0")
|
|
@@ -17,7 +17,7 @@ export const AdbPacketHeader = new Struct({ littleEndian: true })
|
|
|
17
17
|
.uint32("checksum")
|
|
18
18
|
.int32("magic");
|
|
19
19
|
export const AdbPacket = new Struct({ littleEndian: true })
|
|
20
|
-
.
|
|
20
|
+
.concat(AdbPacketHeader)
|
|
21
21
|
.uint8Array("payload", { lengthField: "payloadLength" });
|
|
22
22
|
export function calculateChecksum(payload) {
|
|
23
23
|
return payload.reduce((result, item) => result + item, 0);
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"packet.js","sourceRoot":"","sources":["
|
|
1
|
+
{"version":3,"file":"packet.js","sourceRoot":"","sources":["../../src/daemon/packet.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,yBAAyB,EAAE,MAAM,yBAAyB,CAAC;AACpE,OAAO,MAAM,MAAM,mBAAmB,CAAC;AAEvC,MAAM,CAAN,IAAY,UAOX;AAPD,WAAY,UAAU;IAClB,oDAAiB,CAAA;IACjB,sDAAkB,CAAA;IAClB,0DAAoB,CAAA;IACpB,gDAAe,CAAA;IACf,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,yBAG7C;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,IAAI,GAAG,KAA4C,CAAC;gBAC1D,IAAI,CAAC,aAAa,GAAG,IAAI,CAAC,OAAO,CAAC,UAAU,CAAC;gBAE7C,eAAe,CAAC,SAAS,CAAC,IAAI,EAAE,YAAY,CAAC,CAAC;gBAC9C,MAAM,UAAU,CAAC,OAAO,CAAC,YAAY,CAAC,CAAC;gBAEvC,IAAI,IAAI,CAAC,OAAO,CAAC,UAAU,EAAE;oBACzB,4CAA4C;oBAC5C,0DAA0D;oBAC1D,oDAAoD;oBACpD,MAAM,UAAU,CAAC,OAAO,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;iBAC1C;YACL,CAAC;SACJ,CAAC,CAAC;IACP,CAAC;CACJ"}
|