@yume-chan/adb 3.0.0-beta.1 → 3.0.0-beta.2
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/esm/adb.d.ts +7 -2
- package/esm/adb.d.ts.map +1 -1
- package/esm/adb.js +2 -2
- package/esm/adb.js.map +1 -1
- package/esm/banner.spec.d.ts +2 -0
- package/esm/banner.spec.d.ts.map +1 -0
- package/esm/daemon/auth/packet-processor.spec.d.ts +2 -0
- package/esm/daemon/auth/packet-processor.spec.d.ts.map +1 -0
- package/esm/daemon/auth/public-key.spec.d.ts +2 -0
- package/esm/daemon/auth/public-key.spec.d.ts.map +1 -0
- package/esm/daemon/crypto.spec.d.ts +2 -0
- package/esm/daemon/crypto.spec.d.ts.map +1 -0
- package/esm/server/client.spec.d.ts +2 -0
- package/esm/server/client.spec.d.ts.map +1 -0
- package/esm/server/transport.d.ts +1 -1
- package/esm/server/transport.d.ts.map +1 -1
- package/esm/server/transport.js +2 -2
- package/esm/server/transport.js.map +1 -1
- package/esm/service/reverse/response.spec.d.ts +2 -0
- package/esm/service/reverse/response.spec.d.ts.map +1 -0
- package/esm/service/subprocess/none/process.spec.d.ts +2 -0
- package/esm/service/subprocess/none/process.spec.d.ts.map +1 -0
- package/esm/service/subprocess/none/spawner.spec.d.ts +2 -0
- package/esm/service/subprocess/none/spawner.spec.d.ts.map +1 -0
- package/esm/service/subprocess/shell/process.spec.d.ts +2 -0
- package/esm/service/subprocess/shell/process.spec.d.ts.map +1 -0
- package/esm/service/subprocess/shell/shared.spec.d.ts +2 -0
- package/esm/service/subprocess/shell/shared.spec.d.ts.map +1 -0
- package/esm/service/subprocess/shell/spawner.spec.d.ts +2 -0
- package/esm/service/subprocess/shell/spawner.spec.d.ts.map +1 -0
- package/esm/service/subprocess/utils.spec.d.ts +2 -0
- package/esm/service/subprocess/utils.spec.d.ts.map +1 -0
- package/esm/service/sync/compression/adapters.d.ts +16 -0
- package/esm/service/sync/compression/adapters.d.ts.map +1 -0
- package/esm/service/sync/compression/adapters.js +84 -0
- package/esm/service/sync/compression/adapters.js.map +1 -0
- package/esm/service/sync/compression/format-ns.d.ts.map +1 -1
- package/esm/service/sync/compression/format-ns.js +1 -0
- package/esm/service/sync/compression/format-ns.js.map +1 -1
- package/esm/service/sync/compression/format.d.ts +1 -0
- package/esm/service/sync/compression/format.d.ts.map +1 -1
- package/esm/service/sync/compression/format.js +1 -0
- package/esm/service/sync/compression/format.js.map +1 -1
- package/esm/service/sync/compression/index.d.ts +1 -1
- package/esm/service/sync/compression/index.d.ts.map +1 -1
- package/esm/service/sync/compression/index.js +1 -1
- package/esm/service/sync/compression/index.js.map +1 -1
- package/esm/service/sync/compression/mode.d.ts +6 -0
- package/esm/service/sync/compression/mode.d.ts.map +1 -0
- package/esm/service/sync/compression/mode.js +5 -0
- package/esm/service/sync/compression/mode.js.map +1 -0
- package/esm/service/sync/compression/native.d.ts +8 -0
- package/esm/service/sync/compression/native.d.ts.map +1 -0
- package/esm/service/sync/compression/native.js +53 -0
- package/esm/service/sync/compression/native.js.map +1 -0
- package/esm/service/sync/id/request.d.ts +1 -0
- package/esm/service/sync/id/request.d.ts.map +1 -1
- package/esm/service/sync/id/request.js +1 -0
- package/esm/service/sync/id/request.js.map +1 -1
- package/esm/service/sync/request/flag.d.ts +9 -0
- package/esm/service/sync/request/flag.d.ts.map +1 -0
- package/esm/service/sync/request/flag.js +8 -0
- package/esm/service/sync/request/flag.js.map +1 -0
- package/esm/service/sync/request/pull.d.ts +25 -2
- package/esm/service/sync/request/pull.d.ts.map +1 -1
- package/esm/service/sync/request/pull.js +76 -16
- package/esm/service/sync/request/pull.js.map +1 -1
- package/esm/service/sync/request/push.d.ts +36 -14
- package/esm/service/sync/request/push.d.ts.map +1 -1
- package/esm/service/sync/request/push.js +176 -60
- package/esm/service/sync/request/push.js.map +1 -1
- package/esm/service/sync/service.d.ts +32 -16
- package/esm/service/sync/service.d.ts.map +1 -1
- package/esm/service/sync/service.js +58 -13
- package/esm/service/sync/service.js.map +1 -1
- package/esm/service/sync/socket-pool.d.ts +1 -0
- package/esm/service/sync/socket-pool.d.ts.map +1 -1
- package/esm/service/sync/socket-pool.js +45 -9
- package/esm/service/sync/socket-pool.js.map +1 -1
- package/esm/service/sync/socket-pool.spec.d.ts +2 -0
- package/esm/service/sync/socket-pool.spec.d.ts.map +1 -0
- package/esm/service/sync/socket.d.ts +4 -0
- package/esm/service/sync/socket.d.ts.map +1 -1
- package/esm/service/sync/socket.js +16 -0
- package/esm/service/sync/socket.js.map +1 -1
- package/esm/service/sync/socket.spec.d.ts +2 -0
- package/esm/service/sync/socket.spec.d.ts.map +1 -0
- package/esm/utils/base64.spec.d.ts +2 -0
- package/esm/utils/base64.spec.d.ts.map +1 -0
- package/esm/utils/md5.spec.d.ts +2 -0
- package/esm/utils/md5.spec.d.ts.map +1 -0
- package/esm/utils/ref.d.ts +3 -5
- package/esm/utils/ref.d.ts.map +1 -1
- package/esm/utils/ref.js +12 -6
- package/esm/utils/ref.js.map +1 -1
- package/package.json +5 -5
- package/src/adb.ts +15 -3
- package/src/server/transport.ts +5 -1
- package/src/service/sync/compression/adapters.ts +137 -0
- package/src/service/sync/compression/format-ns.ts +2 -0
- package/src/service/sync/compression/format.ts +5 -0
- package/src/service/sync/compression/index.ts +1 -1
- package/src/service/sync/compression/mode.ts +6 -0
- package/src/service/sync/compression/native.ts +73 -0
- package/src/service/sync/id/request.ts +1 -0
- package/src/service/sync/request/flag.ts +9 -0
- package/src/service/sync/request/pull.ts +135 -27
- package/src/service/sync/request/push.ts +241 -91
- package/src/service/sync/service.ts +87 -27
- package/src/service/sync/socket-pool.ts +50 -9
- package/src/service/sync/socket.ts +23 -1
- package/src/utils/ref.ts +17 -7
- package/yume-chan-adb-3.0.0-beta.0.tgz +0 -0
- package/esm/service/sync/compression/compression.d.ts +0 -17
- package/esm/service/sync/compression/compression.d.ts.map +0 -1
- package/esm/service/sync/compression/compression.js +0 -92
- package/esm/service/sync/compression/compression.js.map +0 -1
- package/src/service/sync/compression/compression.ts +0 -126
|
@@ -1,3 +1,4 @@
|
|
|
1
|
+
import { MaybeConsumable } from "@yume-chan/stream-extra";
|
|
1
2
|
import { AdbFeature } from "../../features.js";
|
|
2
3
|
import { escapeArg } from "../subprocess/index.js";
|
|
3
4
|
import { Compression } from "./compression/index.js";
|
|
@@ -130,41 +131,85 @@ export class Service {
|
|
|
130
131
|
return results;
|
|
131
132
|
}
|
|
132
133
|
/**
|
|
133
|
-
*
|
|
134
|
-
*
|
|
135
|
-
* @param
|
|
136
|
-
* @returns A
|
|
134
|
+
* Creates a readable stream to read the content of a file on device.
|
|
135
|
+
* @param path The full path of the file on device to read.
|
|
136
|
+
* @param compression The compression format to use for reading the file. If the device doesn't support compressed reading, the value will be ignored.
|
|
137
|
+
* @returns A {@link Receive.ReceiveSession} object that contains a readable stream to read the file content.
|
|
137
138
|
*/
|
|
138
|
-
|
|
139
|
-
|
|
139
|
+
createReadable(path, compression) {
|
|
140
|
+
if (this.#supportsSendReceive2) {
|
|
141
|
+
if (compression === undefined) {
|
|
142
|
+
compression = Compression.chooseFormat(this._adb, Compression.Mode.Decompress);
|
|
143
|
+
}
|
|
144
|
+
else if (!Compression.canUseFormat(this._adb, compression, Compression.Mode.Decompress)) {
|
|
145
|
+
throw new Error(`Compression type ${Compression.FormatNameMap[compression]} is not supported`);
|
|
146
|
+
}
|
|
147
|
+
return Receive.receiveV2(this.#socketPool, path, compression);
|
|
148
|
+
}
|
|
149
|
+
else {
|
|
150
|
+
return Receive.receiveV1(this.#socketPool, path);
|
|
151
|
+
}
|
|
140
152
|
}
|
|
141
153
|
/**
|
|
142
|
-
*
|
|
154
|
+
* Creates a readable stream to read the content of a file on device.
|
|
143
155
|
*
|
|
144
|
-
* @param
|
|
156
|
+
* @param path The full path of the file on device to read.
|
|
157
|
+
* @returns A readable stream to read the file content.
|
|
145
158
|
*/
|
|
146
|
-
|
|
159
|
+
read(path) {
|
|
160
|
+
const session = this.createReadable(path);
|
|
161
|
+
return session.readable;
|
|
162
|
+
}
|
|
163
|
+
/**
|
|
164
|
+
* Creates a writable stream to write a file
|
|
165
|
+
* @param options The options for writing the file, including the path, type, permission, mtime, and compression format.
|
|
166
|
+
* @returns A {@link SendSession} object that contains a writable stream to write the file content.
|
|
167
|
+
*/
|
|
168
|
+
async createWritable(options) {
|
|
147
169
|
if (this.needPushMkdirWorkaround) {
|
|
148
170
|
// It may fail if `filename` already exists.
|
|
149
171
|
// Ignore the result.
|
|
150
172
|
// TODO: sync: test push mkdir workaround (need an Android 8 device)
|
|
151
173
|
await this._adb.subprocess.noneProtocol
|
|
152
|
-
.spawn(["mkdir", "-p", escapeArg(dirname(options.
|
|
174
|
+
.spawn(["mkdir", "-p", escapeArg(dirname(options.path))])
|
|
153
175
|
.wait();
|
|
154
176
|
}
|
|
155
177
|
if (this.supportsSendReceive2) {
|
|
156
178
|
if (options.compression === undefined) {
|
|
157
|
-
options
|
|
179
|
+
options = {
|
|
180
|
+
...options,
|
|
181
|
+
compression: Compression.chooseFormat(this._adb, Compression.Mode.Compress),
|
|
182
|
+
};
|
|
158
183
|
}
|
|
159
184
|
else if (!Compression.canUseFormat(this._adb, options.compression, Compression.Mode.Compress)) {
|
|
160
|
-
throw new Error(`Compression type ${options.compression} is not supported`);
|
|
185
|
+
throw new Error(`Compression type ${Compression.FormatNameMap[options.compression]} is not supported`);
|
|
161
186
|
}
|
|
162
187
|
}
|
|
163
|
-
|
|
188
|
+
else {
|
|
189
|
+
options = {
|
|
190
|
+
...options,
|
|
191
|
+
compression: undefined,
|
|
192
|
+
};
|
|
193
|
+
}
|
|
194
|
+
return await Send.send({
|
|
164
195
|
version: this.supportsSendReceive2 ? 2 : 1,
|
|
165
196
|
pool: this.#socketPool,
|
|
166
197
|
...options,
|
|
167
198
|
});
|
|
168
199
|
}
|
|
200
|
+
/**
|
|
201
|
+
* Writes a file to the device using a readable stream.
|
|
202
|
+
* @param options The options for writing the file, including the path, type, permission, mtime, compression format, and a readable stream to read the file content.
|
|
203
|
+
* @returns An object that contains the number of bytes written, the compression format used (if any), and the size of the compressed data written (if any).
|
|
204
|
+
*/
|
|
205
|
+
async write(options) {
|
|
206
|
+
const session = await this.createWritable(options);
|
|
207
|
+
await options.readable.pipeTo(new MaybeConsumable.WrapWritableStream(session.writable));
|
|
208
|
+
return {
|
|
209
|
+
bytesWritten: session.bytesWritten,
|
|
210
|
+
compression: session.compression,
|
|
211
|
+
bytesCompressed: session.bytesCompressed,
|
|
212
|
+
};
|
|
213
|
+
}
|
|
169
214
|
}
|
|
170
215
|
//# sourceMappingURL=service.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"service.js","sourceRoot":"","sources":["../../../src/service/sync/service.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"service.js","sourceRoot":"","sources":["../../../src/service/sync/service.ts"],"names":[],"mappings":"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"}
|
|
@@ -5,6 +5,7 @@ export declare class SocketPool {
|
|
|
5
5
|
constructor(adb: Adb, maxSize?: number, idleTimeout?: number);
|
|
6
6
|
acquire(): Promise<Socket>;
|
|
7
7
|
withSocket<T>(fn: (socket: Socket) => Promise<T>): Promise<T>;
|
|
8
|
+
withSocketGenerator<T>(fn: (socket: Socket) => AsyncGenerator<T, void, void>): AsyncGenerator<T, void, void>;
|
|
8
9
|
release(socket: Socket, discard?: boolean): Promise<void>;
|
|
9
10
|
dispose(): Promise<void>;
|
|
10
11
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"socket-pool.d.ts","sourceRoot":"","sources":["../../../src/service/sync/socket-pool.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,GAAG,EAAE,MAAM,cAAc,CAAC;
|
|
1
|
+
{"version":3,"file":"socket-pool.d.ts","sourceRoot":"","sources":["../../../src/service/sync/socket-pool.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,GAAG,EAAE,MAAM,cAAc,CAAC;AAGxC,OAAO,EAAyB,MAAM,EAAE,MAAM,aAAa,CAAC;AAE5D,qBAAa,UAAU;;gBASP,GAAG,EAAE,GAAG,EAAE,OAAO,SAAI,EAAE,WAAW,SAAQ;IAMhD,OAAO,IAAI,OAAO,CAAC,MAAM,CAAC;IAsC1B,UAAU,CAAC,CAAC,EAAE,EAAE,EAAE,CAAC,MAAM,EAAE,MAAM,KAAK,OAAO,CAAC,CAAC,CAAC,GAAG,OAAO,CAAC,CAAC,CAAC;IAY5D,mBAAmB,CAAC,CAAC,EACxB,EAAE,EAAE,CAAC,MAAM,EAAE,MAAM,KAAK,cAAc,CAAC,CAAC,EAAE,IAAI,EAAE,IAAI,CAAC,GACtD,cAAc,CAAC,CAAC,EAAE,IAAI,EAAE,IAAI,CAAC;IAkB1B,OAAO,CAAC,MAAM,EAAE,MAAM,EAAE,OAAO,UAAQ,GAAG,OAAO,CAAC,IAAI,CAAC;IA6BvD,OAAO,IAAI,OAAO,CAAC,IAAI,CAAC;CAkBjC"}
|
|
@@ -1,3 +1,4 @@
|
|
|
1
|
+
import { Ref } from "../../utils/ref.js";
|
|
1
2
|
import { Error as AdbSyncError, Socket } from "./socket.js";
|
|
2
3
|
export class SocketPool {
|
|
3
4
|
#adb;
|
|
@@ -5,6 +6,7 @@ export class SocketPool {
|
|
|
5
6
|
#idleTimeout;
|
|
6
7
|
#availableSockets = [];
|
|
7
8
|
#inUseSockets = new Set();
|
|
9
|
+
#ref = new Ref({ unref: true });
|
|
8
10
|
#closed = false;
|
|
9
11
|
constructor(adb, maxSize = 4, idleTimeout = 60000) {
|
|
10
12
|
this.#adb = adb;
|
|
@@ -21,17 +23,28 @@ export class SocketPool {
|
|
|
21
23
|
// Clear the idle timeout
|
|
22
24
|
socket.clearIdleTimer();
|
|
23
25
|
this.#inUseSockets.add(socket);
|
|
26
|
+
this.#ref.ref();
|
|
24
27
|
return socket;
|
|
25
28
|
}
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
29
|
+
try {
|
|
30
|
+
// Add ref early to keep the process alive while initializing the new socket
|
|
31
|
+
this.#ref.ref();
|
|
32
|
+
// Create a new socket
|
|
33
|
+
const adbSocket = await this.#adb.createSocket("sync:", {
|
|
34
|
+
unref: true,
|
|
35
|
+
});
|
|
36
|
+
if (this.#closed) {
|
|
37
|
+
await adbSocket.close();
|
|
38
|
+
throw new Error("SocketPool is closed");
|
|
39
|
+
}
|
|
40
|
+
const socket = new Socket(adbSocket, this.#adb.maxPayloadSize);
|
|
41
|
+
this.#inUseSockets.add(socket);
|
|
42
|
+
return socket;
|
|
43
|
+
}
|
|
44
|
+
catch (e) {
|
|
45
|
+
this.#ref.unref();
|
|
46
|
+
throw e;
|
|
31
47
|
}
|
|
32
|
-
const socket = new Socket(adbSocket, this.#adb.maxPayloadSize);
|
|
33
|
-
this.#inUseSockets.add(socket);
|
|
34
|
-
return socket;
|
|
35
48
|
}
|
|
36
49
|
async withSocket(fn) {
|
|
37
50
|
const socket = await this.acquire();
|
|
@@ -45,8 +58,30 @@ export class SocketPool {
|
|
|
45
58
|
throw e;
|
|
46
59
|
}
|
|
47
60
|
}
|
|
61
|
+
async *withSocketGenerator(fn) {
|
|
62
|
+
const socket = await this.acquire();
|
|
63
|
+
let discard = true;
|
|
64
|
+
try {
|
|
65
|
+
for await (const value of fn(socket)) {
|
|
66
|
+
yield value;
|
|
67
|
+
}
|
|
68
|
+
discard = false;
|
|
69
|
+
}
|
|
70
|
+
catch (e) {
|
|
71
|
+
discard = !(e instanceof AdbSyncError);
|
|
72
|
+
throw e;
|
|
73
|
+
}
|
|
74
|
+
finally {
|
|
75
|
+
// When the generator is retuned early, `discard` will have the default value of `true`,
|
|
76
|
+
// the socket needs to be closed, so the server will stop sending data.
|
|
77
|
+
await this.release(socket, discard);
|
|
78
|
+
}
|
|
79
|
+
}
|
|
48
80
|
async release(socket, discard = false) {
|
|
49
|
-
this.#inUseSockets.delete(socket)
|
|
81
|
+
if (!this.#inUseSockets.delete(socket)) {
|
|
82
|
+
return;
|
|
83
|
+
}
|
|
84
|
+
this.#ref.unref();
|
|
50
85
|
// If discarding or we already have enough sockets in the pool, close this socket
|
|
51
86
|
if (discard || this.#availableSockets.length >= this.#maxSize) {
|
|
52
87
|
await socket.close();
|
|
@@ -74,6 +109,7 @@ export class SocketPool {
|
|
|
74
109
|
// Force close all in-use sockets immediately
|
|
75
110
|
const inUseClosePromises = Array.from(this.#inUseSockets).map((socket) => socket.close());
|
|
76
111
|
this.#inUseSockets.clear();
|
|
112
|
+
this.#ref.dispose();
|
|
77
113
|
await Promise.all([...closePromises, ...inUseClosePromises]);
|
|
78
114
|
}
|
|
79
115
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"socket-pool.js","sourceRoot":"","sources":["../../../src/service/sync/socket-pool.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"socket-pool.js","sourceRoot":"","sources":["../../../src/service/sync/socket-pool.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"socket-pool.spec.d.ts","sourceRoot":"","sources":["../../../src/service/sync/socket-pool.spec.ts"],"names":[],"mappings":""}
|
|
@@ -1,6 +1,9 @@
|
|
|
1
1
|
import type { AsyncExactReadable, StructDeserializer } from "@yume-chan/struct";
|
|
2
2
|
import type { Adb } from "../../adb.js";
|
|
3
|
+
declare const AdbSyncErrorBrand: unique symbol;
|
|
3
4
|
declare class AdbSyncError extends Error {
|
|
5
|
+
[AdbSyncErrorBrand]: boolean;
|
|
6
|
+
static [Symbol.hasInstance](value: unknown): boolean;
|
|
4
7
|
}
|
|
5
8
|
export { AdbSyncError as Error };
|
|
6
9
|
export declare class Socket implements AsyncExactReadable {
|
|
@@ -15,6 +18,7 @@ export declare class Socket implements AsyncExactReadable {
|
|
|
15
18
|
static readonly FailResponse: import("@yume-chan/struct").Struct<{
|
|
16
19
|
message: import("@yume-chan/struct").Field<string, string, never, string>;
|
|
17
20
|
}, undefined, never>;
|
|
21
|
+
get id(): number;
|
|
18
22
|
get position(): number;
|
|
19
23
|
get closed(): Promise<undefined>;
|
|
20
24
|
constructor(socket: Adb.Socket, bufferSize: number);
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"socket.d.ts","sourceRoot":"","sources":["../../../src/service/sync/socket.ts"],"names":[],"mappings":"AAaA,OAAO,KAAK,EAAE,kBAAkB,EAAE,kBAAkB,EAAE,MAAM,mBAAmB,CAAC;AAGhF,OAAO,KAAK,EAAE,GAAG,EAAE,MAAM,cAAc,CAAC;AAOxC,cAAM,YAAa,SAAQ,KAAK;
|
|
1
|
+
{"version":3,"file":"socket.d.ts","sourceRoot":"","sources":["../../../src/service/sync/socket.ts"],"names":[],"mappings":"AAaA,OAAO,KAAK,EAAE,kBAAkB,EAAE,kBAAkB,EAAE,MAAM,mBAAmB,CAAC;AAGhF,OAAO,KAAK,EAAE,GAAG,EAAE,MAAM,cAAc,CAAC;AAOxC,QAAA,MAAM,iBAAiB,eAAmC,CAAC;AAE3D,cAAM,YAAa,SAAQ,KAAK;IAC5B,CAAC,iBAAiB,CAAC,UAAQ;WAEX,CAAC,MAAM,CAAC,WAAW,CAAC,CAAC,KAAK,EAAE,OAAO;CAGtD;AACD,OAAO,EAAE,YAAY,IAAI,KAAK,EAAE,CAAC;AAkBjC,qBAAa,MAAO,YAAW,kBAAkB;;IAC7C,MAAM,CAAC,QAAQ,CAAC,aAAa;;;;;;QAAiB;IAC9C,MAAM,CAAC,QAAQ,CAAC,YAAY;;yBAAgB;IAU5C,IAAI,EAAE,WAEL;IAED,IAAI,QAAQ,WAEX;IAED,IAAI,MAAM,IAAI,OAAO,CAAC,SAAS,CAAC,CAE/B;gBAEW,MAAM,EAAE,GAAG,CAAC,MAAM,EAAE,UAAU,EAAE,MAAM;IAUlD;;;;;OAKG;IACH,cAAc,CAAC,OAAO,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,IAAI;IASpD;;OAEG;IACH,cAAc;IAyBR,KAAK;IAaX,KAAK,CAAC,IAAI,EAAE,UAAU;IAIhB,YAAY,CAAC,EAAE,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,GAAG,MAAM,GAAG,UAAU;IAkB5D,WAAW,CAAC,MAAM,EAAE,MAAM;IAO1B,YAAY,CAAC,CAAC,EAAE,EAAE,EAAE,MAAM,EAAE,IAAI,EAAE,kBAAkB,CAAC,CAAC,CAAC;IAgBtD,aAAa,CAAC,CAAC,EAClB,UAAU,EAAE,MAAM,EAClB,IAAI,EAAE,kBAAkB,CAAC,CAAC,CAAC,GAC5B,cAAc,CAAC,CAAC,EAAE,IAAI,EAAE,IAAI,CAAC;IA6B1B,KAAK;CAKd"}
|
|
@@ -4,7 +4,12 @@ import { decodeUtf8, string, struct, u32 } from "@yume-chan/struct";
|
|
|
4
4
|
import { AutoResetEvent, encodeUtf8, unreachable } from "../../utils/index.js";
|
|
5
5
|
import { ResponseId } from "./id/index.js";
|
|
6
6
|
const NumberRequest = struct({ id: u32, arg: u32 }, { littleEndian: true });
|
|
7
|
+
const AdbSyncErrorBrand = Symbol.for("AdbSyncError.brand");
|
|
7
8
|
class AdbSyncError extends Error {
|
|
9
|
+
[AdbSyncErrorBrand] = true;
|
|
10
|
+
static [Symbol.hasInstance](value) {
|
|
11
|
+
return !!value?.[AdbSyncErrorBrand];
|
|
12
|
+
}
|
|
8
13
|
}
|
|
9
14
|
export { AdbSyncError as Error };
|
|
10
15
|
const FailResponse = struct({ message: string(u32) }, {
|
|
@@ -16,15 +21,20 @@ const FailResponse = struct({ message: string(u32) }, {
|
|
|
16
21
|
function i32ToHex(i) {
|
|
17
22
|
return "0x" + i.toString(16).padStart(8, "0");
|
|
18
23
|
}
|
|
24
|
+
let NextId = 0;
|
|
19
25
|
export class Socket {
|
|
20
26
|
static NumberRequest = NumberRequest;
|
|
21
27
|
static FailResponse = FailResponse;
|
|
28
|
+
#id;
|
|
22
29
|
#socket;
|
|
23
30
|
#writer;
|
|
24
31
|
#readable;
|
|
25
32
|
#writeLock = new AutoResetEvent();
|
|
26
33
|
#combiner;
|
|
27
34
|
#idleTimeoutId = null;
|
|
35
|
+
get id() {
|
|
36
|
+
return this.#id;
|
|
37
|
+
}
|
|
28
38
|
get position() {
|
|
29
39
|
return this.#readable.position;
|
|
30
40
|
}
|
|
@@ -32,6 +42,8 @@ export class Socket {
|
|
|
32
42
|
return this.#socket.closed;
|
|
33
43
|
}
|
|
34
44
|
constructor(socket, bufferSize) {
|
|
45
|
+
this.#id = NextId;
|
|
46
|
+
NextId += 1;
|
|
35
47
|
this.#socket = socket;
|
|
36
48
|
this.#writer = socket.writable.getWriter();
|
|
37
49
|
this.#readable = new BufferedReadableStream(socket.readable);
|
|
@@ -46,6 +58,10 @@ export class Socket {
|
|
|
46
58
|
startIdleTimer(timeout, callback) {
|
|
47
59
|
this.clearIdleTimer();
|
|
48
60
|
this.#idleTimeoutId = setTimeout(callback, timeout);
|
|
61
|
+
if (typeof this.#idleTimeoutId === "object") {
|
|
62
|
+
// Node.js: unref the timer so that it won't keep the process alive
|
|
63
|
+
this.#idleTimeoutId.unref?.();
|
|
64
|
+
}
|
|
49
65
|
}
|
|
50
66
|
/**
|
|
51
67
|
* Clear the idle timer.
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"socket.js","sourceRoot":"","sources":["../../../src/service/sync/socket.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,qBAAqB,EAAE,MAAM,yBAAyB,CAAC;AAKhE,OAAO,EACH,cAAc,EACd,sBAAsB,EACtB,YAAY,EACZ,UAAU,EACV,UAAU,EACV,SAAS,GACZ,MAAM,yBAAyB,CAAC;AAEjC,OAAO,EAAE,UAAU,EAAE,MAAM,EAAE,MAAM,EAAE,GAAG,EAAE,MAAM,mBAAmB,CAAC;AAGpE,OAAO,EAAE,cAAc,EAAE,UAAU,EAAE,WAAW,EAAE,MAAM,sBAAsB,CAAC;AAE/E,OAAO,EAAE,UAAU,EAAE,MAAM,eAAe,CAAC;AAE3C,MAAM,aAAa,GAAG,MAAM,CAAC,EAAE,EAAE,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,EAAE,EAAE,YAAY,EAAE,IAAI,EAAE,CAAC,CAAC;AAE5E,MAAM,YAAa,SAAQ,KAAK;
|
|
1
|
+
{"version":3,"file":"socket.js","sourceRoot":"","sources":["../../../src/service/sync/socket.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"socket.spec.d.ts","sourceRoot":"","sources":["../../../src/service/sync/socket.spec.ts"],"names":[],"mappings":""}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"base64.spec.d.ts","sourceRoot":"","sources":["../../src/utils/base64.spec.ts"],"names":[],"mappings":""}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"md5.spec.d.ts","sourceRoot":"","sources":["../../src/utils/md5.spec.ts"],"names":[],"mappings":""}
|
package/esm/utils/ref.d.ts
CHANGED
|
@@ -1,18 +1,16 @@
|
|
|
1
|
+
import type { Disposable } from "@yume-chan/event";
|
|
1
2
|
/**
|
|
2
3
|
* An object to keep current Node.js process alive even when no code is running.
|
|
3
4
|
*
|
|
4
5
|
* Does nothing in Web environments.
|
|
5
|
-
*
|
|
6
|
-
* Note that it does't have reference counting. Calling `unref` will
|
|
7
|
-
* remove the ref no matter how many times `ref` has been previously called, and vice versa.
|
|
8
|
-
* This is the same as how Node.js works.
|
|
9
6
|
*/
|
|
10
|
-
export declare class Ref {
|
|
7
|
+
export declare class Ref implements Disposable {
|
|
11
8
|
#private;
|
|
12
9
|
constructor(options?: {
|
|
13
10
|
unref?: boolean | undefined;
|
|
14
11
|
});
|
|
15
12
|
ref(): void;
|
|
16
13
|
unref(): void;
|
|
14
|
+
dispose(): void;
|
|
17
15
|
}
|
|
18
16
|
//# sourceMappingURL=ref.d.ts.map
|
package/esm/utils/ref.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"ref.d.ts","sourceRoot":"","sources":["../../src/utils/ref.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"ref.d.ts","sourceRoot":"","sources":["../../src/utils/ref.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,kBAAkB,CAAC;AASnD;;;;GAIG;AACH,qBAAa,GAAI,YAAW,UAAU;;gBAKtB,OAAO,CAAC,EAAE;QAAE,KAAK,CAAC,EAAE,OAAO,GAAG,SAAS,CAAA;KAAE;IAMrD,GAAG;IAQH,KAAK;IAOL,OAAO,IAAI,IAAI;CAMlB"}
|
package/esm/utils/ref.js
CHANGED
|
@@ -3,23 +3,29 @@ const { setInterval, clearInterval } = globalThis;
|
|
|
3
3
|
* An object to keep current Node.js process alive even when no code is running.
|
|
4
4
|
*
|
|
5
5
|
* Does nothing in Web environments.
|
|
6
|
-
*
|
|
7
|
-
* Note that it does't have reference counting. Calling `unref` will
|
|
8
|
-
* remove the ref no matter how many times `ref` has been previously called, and vice versa.
|
|
9
|
-
* This is the same as how Node.js works.
|
|
10
6
|
*/
|
|
11
7
|
export class Ref {
|
|
12
8
|
#intervalId;
|
|
9
|
+
#count = 0;
|
|
13
10
|
constructor(options) {
|
|
14
11
|
if (!options?.unref) {
|
|
15
12
|
this.ref();
|
|
16
13
|
}
|
|
17
14
|
}
|
|
18
15
|
ref() {
|
|
19
|
-
|
|
20
|
-
|
|
16
|
+
if (this.#count === 0) {
|
|
17
|
+
// `setInterval` can keep current Node.js alive, the delay value doesn't matter
|
|
18
|
+
this.#intervalId = setInterval(() => { }, 60 * 1000);
|
|
19
|
+
}
|
|
20
|
+
this.#count += 1;
|
|
21
21
|
}
|
|
22
22
|
unref() {
|
|
23
|
+
this.#count -= 1;
|
|
24
|
+
if (this.#count === 0) {
|
|
25
|
+
this.dispose();
|
|
26
|
+
}
|
|
27
|
+
}
|
|
28
|
+
dispose() {
|
|
23
29
|
if (this.#intervalId) {
|
|
24
30
|
clearInterval(this.#intervalId);
|
|
25
31
|
this.#intervalId = undefined;
|
package/esm/utils/ref.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"ref.js","sourceRoot":"","sources":["../../src/utils/ref.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"ref.js","sourceRoot":"","sources":["../../src/utils/ref.ts"],"names":[],"mappings":"AAOA,MAAM,EAAE,WAAW,EAAE,aAAa,EAAE,GAAG,UAAwC,CAAC;AAEhF;;;;GAIG;AACH,MAAM,OAAO,GAAG;IACZ,WAAW,CAAqB;IAEhC,MAAM,GAAG,CAAC,CAAC;IAEX,YAAY,OAAyC;QACjD,IAAI,CAAC,OAAO,EAAE,KAAK,EAAE,CAAC;YAClB,IAAI,CAAC,GAAG,EAAE,CAAC;QACf,CAAC;IACL,CAAC;IAED,GAAG;QACC,IAAI,IAAI,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;YACpB,+EAA+E;YAC/E,IAAI,CAAC,WAAW,GAAG,WAAW,CAAC,GAAG,EAAE,GAAE,CAAC,EAAE,EAAE,GAAG,IAAI,CAAC,CAAC;QACxD,CAAC;QACD,IAAI,CAAC,MAAM,IAAI,CAAC,CAAC;IACrB,CAAC;IAED,KAAK;QACD,IAAI,CAAC,MAAM,IAAI,CAAC,CAAC;QACjB,IAAI,IAAI,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;YACpB,IAAI,CAAC,OAAO,EAAE,CAAC;QACnB,CAAC;IACL,CAAC;IAED,OAAO;QACH,IAAI,IAAI,CAAC,WAAW,EAAE,CAAC;YACnB,aAAa,CAAC,IAAI,CAAC,WAAW,CAAC,CAAC;YAChC,IAAI,CAAC,WAAW,GAAG,SAAS,CAAC;QACjC,CAAC;IACL,CAAC;CACJ"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@yume-chan/adb",
|
|
3
|
-
"version": "3.0.0-beta.
|
|
3
|
+
"version": "3.0.0-beta.2",
|
|
4
4
|
"description": "TypeScript implementation of Android Debug Bridge (ADB) protocol.",
|
|
5
5
|
"keywords": [
|
|
6
6
|
"adb",
|
|
@@ -27,10 +27,10 @@
|
|
|
27
27
|
"sideEffects": false,
|
|
28
28
|
"dependencies": {
|
|
29
29
|
"@yume-chan/async": "^4.1.3",
|
|
30
|
-
"@yume-chan/
|
|
31
|
-
"@yume-chan/
|
|
32
|
-
"@yume-chan/
|
|
33
|
-
"@yume-chan/
|
|
30
|
+
"@yume-chan/no-data-view": "3.0.0-beta.2",
|
|
31
|
+
"@yume-chan/event": "3.0.0-beta.2",
|
|
32
|
+
"@yume-chan/stream-extra": "3.0.0-beta.2",
|
|
33
|
+
"@yume-chan/struct": "3.0.0-beta.2"
|
|
34
34
|
},
|
|
35
35
|
"devDependencies": {
|
|
36
36
|
"@types/node": "^26.1.1",
|
package/src/adb.ts
CHANGED
|
@@ -33,7 +33,10 @@ export interface AdbTransport extends Closeable {
|
|
|
33
33
|
|
|
34
34
|
readonly clientFeatures: readonly AdbFeature[];
|
|
35
35
|
|
|
36
|
-
connect(
|
|
36
|
+
connect(
|
|
37
|
+
service: string,
|
|
38
|
+
options?: AdbTransport.ConnectOptions,
|
|
39
|
+
): MaybePromiseLike<Adb.Socket>;
|
|
37
40
|
|
|
38
41
|
addReverseTunnel(
|
|
39
42
|
handler: Adb.IncomingSocketHandler,
|
|
@@ -45,6 +48,12 @@ export interface AdbTransport extends Closeable {
|
|
|
45
48
|
clearReverseTunnels(): MaybePromiseLike<void>;
|
|
46
49
|
}
|
|
47
50
|
|
|
51
|
+
export namespace AdbTransport {
|
|
52
|
+
export interface ConnectOptions {
|
|
53
|
+
unref?: boolean | undefined;
|
|
54
|
+
}
|
|
55
|
+
}
|
|
56
|
+
|
|
48
57
|
export class Adb implements Closeable {
|
|
49
58
|
readonly #transport: AdbTransport;
|
|
50
59
|
get transport(): AdbTransport {
|
|
@@ -101,8 +110,11 @@ export class Adb implements Closeable {
|
|
|
101
110
|
/**
|
|
102
111
|
* Creates a new ADB Socket to the specified service or socket address.
|
|
103
112
|
*/
|
|
104
|
-
async createSocket(
|
|
105
|
-
|
|
113
|
+
async createSocket(
|
|
114
|
+
service: string,
|
|
115
|
+
options?: AdbTransport.ConnectOptions,
|
|
116
|
+
): Promise<Adb.Socket> {
|
|
117
|
+
return await this.#transport.connect(service, options);
|
|
106
118
|
}
|
|
107
119
|
|
|
108
120
|
async createSocketAndWait(service: string): Promise<string> {
|
package/src/server/transport.ts
CHANGED
|
@@ -52,10 +52,14 @@ export class AdbServerTransport implements AdbTransport {
|
|
|
52
52
|
this.#disconnected = Promise.race([this.#closed.promise, disconnected]);
|
|
53
53
|
}
|
|
54
54
|
|
|
55
|
-
async connect(
|
|
55
|
+
async connect(
|
|
56
|
+
service: string,
|
|
57
|
+
options?: AdbTransport.ConnectOptions,
|
|
58
|
+
): Promise<Adb.Socket> {
|
|
56
59
|
const socket = await this.#client.createDeviceConnection(
|
|
57
60
|
{ transportId: this.transportId },
|
|
58
61
|
service,
|
|
62
|
+
options,
|
|
59
63
|
);
|
|
60
64
|
this.#sockets.push(socket);
|
|
61
65
|
return socket;
|