@yume-chan/adb 0.0.13 → 0.0.16
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 +29 -1
- package/LICENSE +21 -21
- package/README.md +247 -247
- package/esm/adb.d.ts +12 -4
- package/esm/adb.d.ts.map +1 -1
- package/esm/adb.js +29 -19
- package/esm/adb.js.map +1 -1
- package/esm/commands/reverse.d.ts +9 -12
- package/esm/commands/reverse.d.ts.map +1 -1
- package/esm/commands/reverse.js +44 -36
- package/esm/commands/reverse.js.map +1 -1
- package/esm/commands/subprocess/protocols/none.d.ts +2 -1
- package/esm/commands/subprocess/protocols/none.d.ts.map +1 -1
- package/esm/commands/subprocess/protocols/none.js +10 -9
- package/esm/commands/subprocess/protocols/none.js.map +1 -1
- package/esm/commands/sync/pull.d.ts.map +1 -1
- package/esm/commands/sync/pull.js +6 -3
- package/esm/commands/sync/pull.js.map +1 -1
- package/esm/commands/sync/stat.d.ts.map +1 -1
- package/esm/commands/sync/stat.js +2 -2
- package/esm/commands/sync/stat.js.map +1 -1
- package/esm/commands/sync/sync.js +1 -1
- package/esm/commands/sync/sync.js.map +1 -1
- package/esm/socket/dispatcher.d.ts +25 -14
- package/esm/socket/dispatcher.d.ts.map +1 -1
- package/esm/socket/dispatcher.js +94 -63
- package/esm/socket/dispatcher.js.map +1 -1
- package/esm/socket/socket.d.ts +18 -4
- package/esm/socket/socket.d.ts.map +1 -1
- package/esm/socket/socket.js +36 -21
- package/esm/socket/socket.js.map +1 -1
- package/esm/stream/buffered.d.ts +7 -3
- package/esm/stream/buffered.d.ts.map +1 -1
- package/esm/stream/buffered.js +69 -49
- package/esm/stream/buffered.js.map +1 -1
- package/esm/stream/detect.js +1 -0
- package/esm/stream/detect.js.map +1 -1
- package/esm/stream/detect.polyfill.d.ts +1 -1
- package/esm/stream/detect.polyfill.d.ts.map +1 -1
- package/esm/stream/detect.polyfill.js +0 -5
- package/esm/stream/detect.polyfill.js.map +1 -1
- package/esm/stream/transform.d.ts +39 -13
- package/esm/stream/transform.d.ts.map +1 -1
- package/esm/stream/transform.js +67 -90
- package/esm/stream/transform.js.map +1 -1
- package/esm/utils/base64.js +5 -5
- package/esm/utils/base64.js.map +1 -1
- package/package.json +10 -10
- package/src/adb.ts +280 -270
- package/src/auth.ts +173 -173
- package/src/backend.ts +11 -11
- package/src/commands/base.ts +11 -11
- package/src/commands/framebuffer.ts +73 -73
- package/src/commands/index.ts +8 -8
- package/src/commands/install.ts +30 -30
- package/src/commands/power.ts +54 -54
- package/src/commands/reverse.ts +140 -136
- package/src/commands/subprocess/index.ts +139 -139
- package/src/commands/subprocess/protocols/none.ts +70 -68
- package/src/commands/subprocess/protocols/shell.ts +190 -190
- package/src/commands/subprocess/protocols/types.ts +59 -59
- package/src/commands/subprocess/utils.ts +20 -20
- package/src/commands/sync/index.ts +7 -7
- package/src/commands/sync/list.ts +86 -86
- package/src/commands/sync/pull.ts +46 -43
- package/src/commands/sync/push.ts +41 -41
- package/src/commands/sync/request.ts +50 -50
- package/src/commands/sync/response.ts +64 -64
- package/src/commands/sync/stat.ts +151 -150
- package/src/commands/sync/sync.ts +181 -181
- package/src/commands/tcpip.ts +21 -21
- package/src/crypto.ts +296 -296
- package/src/features.ts +9 -9
- package/src/index.ts +11 -11
- package/src/packet.ts +80 -80
- package/src/socket/dispatcher.ts +305 -270
- package/src/socket/index.ts +2 -2
- package/src/socket/socket.ts +155 -136
- package/src/stream/buffered.ts +168 -147
- package/src/stream/detect.native.ts +362 -362
- package/src/stream/detect.polyfill.ts +22 -28
- package/src/stream/detect.ts +7 -5
- package/src/stream/index.ts +3 -3
- package/src/stream/transform.ts +474 -483
- package/src/utils/auto-reset-event.ts +41 -41
- package/src/utils/base64.ts +306 -306
- package/src/utils/index.ts +3 -3
- package/tsconfig.build.json +3 -3
- package/tsconfig.build.tsbuildinfo +1 -1
- package/tsconfig.test.json +9 -10
- package/web-streams-polyfill-4.0.0-beta.2.tgz +0 -0
- package/esm/commands/subprocess/legacy.d.ts +0 -35
- package/esm/commands/subprocess/legacy.d.ts.map +0 -1
- package/esm/commands/subprocess/legacy.js +0 -53
- package/esm/commands/subprocess/legacy.js.map +0 -1
- package/esm/commands/subprocess/protocol.d.ts +0 -39
- package/esm/commands/subprocess/protocol.d.ts.map +0 -1
- package/esm/commands/subprocess/protocol.js +0 -157
- package/esm/commands/subprocess/protocol.js.map +0 -1
- package/esm/commands/subprocess/types.d.ts +0 -50
- package/esm/commands/subprocess/types.d.ts.map +0 -1
- package/esm/commands/subprocess/types.js +0 -2
- package/esm/commands/subprocess/types.js.map +0 -1
- package/esm/socket/controller.d.ts +0 -37
- package/esm/socket/controller.d.ts.map +0 -1
- package/esm/socket/controller.js +0 -66
- package/esm/socket/controller.js.map +0 -1
- package/esm/stream/detect.bak.d.ts +0 -240
- package/esm/stream/detect.bak.d.ts.map +0 -1
- package/esm/stream/detect.bak.js +0 -60
- package/esm/stream/detect.bak.js.map +0 -1
- package/esm/utils/encoding.d.ts +0 -3
- package/esm/utils/encoding.d.ts.map +0 -1
- package/esm/utils/encoding.js +0 -11
- package/esm/utils/encoding.js.map +0 -1
|
@@ -1,13 +1,8 @@
|
|
|
1
|
-
import {
|
|
1
|
+
import type { RemoveEventListener } from '@yume-chan/event';
|
|
2
|
+
import { type ValueOrPromise } from "@yume-chan/struct";
|
|
2
3
|
import { AdbCommand, type AdbPacketData, type AdbPacketInit } from '../packet.js';
|
|
3
4
|
import { type ReadableWritablePair } from '../stream/index.js';
|
|
4
5
|
import { AdbSocket } from './socket.js';
|
|
5
|
-
export interface AdbIncomingSocketEventArgs {
|
|
6
|
-
handled: boolean;
|
|
7
|
-
packet: AdbPacketData;
|
|
8
|
-
serviceString: string;
|
|
9
|
-
socket: AdbSocket;
|
|
10
|
-
}
|
|
11
6
|
export interface AdbPacketDispatcherOptions {
|
|
12
7
|
calculateChecksum: boolean;
|
|
13
8
|
/**
|
|
@@ -19,26 +14,42 @@ export interface AdbPacketDispatcherOptions {
|
|
|
19
14
|
appendNullToServiceString: boolean;
|
|
20
15
|
maxPayloadSize: number;
|
|
21
16
|
}
|
|
22
|
-
export declare
|
|
17
|
+
export declare type AdbIncomingSocketHandler = (socket: AdbSocket) => ValueOrPromise<boolean>;
|
|
18
|
+
export interface Closeable {
|
|
19
|
+
close(): ValueOrPromise<void>;
|
|
20
|
+
}
|
|
21
|
+
/**
|
|
22
|
+
* The dispatcher is the "dumb" part of the connection handling logic.
|
|
23
|
+
*
|
|
24
|
+
* Except some options to change some minor behaviors,
|
|
25
|
+
* its only job is forwarding packets between authenticated underlying streams
|
|
26
|
+
* and abstracted socket objects.
|
|
27
|
+
*
|
|
28
|
+
* The `Adb` class is responsible for doing the authentication,
|
|
29
|
+
* negotiating the options, and has shortcuts to high-level services.
|
|
30
|
+
*/
|
|
31
|
+
export declare class AdbPacketDispatcher implements Closeable {
|
|
23
32
|
private readonly initializers;
|
|
33
|
+
/**
|
|
34
|
+
* Socket local ID to the socket controller.
|
|
35
|
+
*/
|
|
24
36
|
private readonly sockets;
|
|
25
37
|
private _writer;
|
|
26
38
|
readonly options: AdbPacketDispatcherOptions;
|
|
39
|
+
private _closed;
|
|
27
40
|
private _disconnected;
|
|
28
41
|
get disconnected(): Promise<void>;
|
|
29
|
-
private
|
|
30
|
-
get onIncomingSocket(): {
|
|
31
|
-
(listener: import("@yume-chan/event").EventListener<AdbIncomingSocketEventArgs, unknown, [], unknown>): import("@yume-chan/event").RemoveEventListener;
|
|
32
|
-
<TThis, TArgs extends unknown[]>(listener: import("@yume-chan/event").EventListener<AdbIncomingSocketEventArgs, TThis, TArgs, unknown>, thisArg: TThis, ...args: TArgs): import("@yume-chan/event").RemoveEventListener;
|
|
33
|
-
};
|
|
42
|
+
private _incomingSocketHandlers;
|
|
34
43
|
private _abortController;
|
|
35
44
|
constructor(connection: ReadableWritablePair<AdbPacketData, AdbPacketInit>, options: AdbPacketDispatcherOptions);
|
|
36
45
|
private handleOk;
|
|
37
46
|
private handleClose;
|
|
47
|
+
addIncomingSocketHandler(handler: AdbIncomingSocketHandler): RemoveEventListener;
|
|
38
48
|
private handleOpen;
|
|
39
49
|
createSocket(serviceString: string): Promise<AdbSocket>;
|
|
40
50
|
sendPacket(packet: AdbPacketInit): Promise<void>;
|
|
41
51
|
sendPacket(command: AdbCommand, arg0: number, arg1: number, payload?: string | Uint8Array): Promise<void>;
|
|
42
|
-
|
|
52
|
+
close(): Promise<void>;
|
|
53
|
+
private dispose;
|
|
43
54
|
}
|
|
44
55
|
//# sourceMappingURL=dispatcher.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"dispatcher.d.ts","sourceRoot":"","sources":["../../src/socket/dispatcher.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,
|
|
1
|
+
{"version":3,"file":"dispatcher.d.ts","sourceRoot":"","sources":["../../src/socket/dispatcher.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,mBAAmB,EAAE,MAAM,kBAAkB,CAAC;AAC5D,OAAO,EAAqB,KAAK,cAAc,EAAE,MAAM,mBAAmB,CAAC;AAE3E,OAAO,EAAE,UAAU,EAAqB,KAAK,aAAa,EAAE,KAAK,aAAa,EAAE,MAAM,cAAc,CAAC;AACrG,OAAO,EAAgE,KAAK,oBAAoB,EAAE,MAAM,oBAAoB,CAAC;AAE7H,OAAO,EAAE,SAAS,EAAuB,MAAM,aAAa,CAAC;AAE7D,MAAM,WAAW,0BAA0B;IACvC,iBAAiB,EAAE,OAAO,CAAC;IAC3B;;;;;OAKG;IACH,yBAAyB,EAAE,OAAO,CAAC;IACnC,cAAc,EAAE,MAAM,CAAC;CAC1B;AAED,oBAAY,wBAAwB,GAAG,CAAC,MAAM,EAAE,SAAS,KAAK,cAAc,CAAC,OAAO,CAAC,CAAC;AAEtF,MAAM,WAAW,SAAS;IACtB,KAAK,IAAI,cAAc,CAAC,IAAI,CAAC,CAAC;CACjC;AAED;;;;;;;;;GASG;AACH,qBAAa,mBAAoB,YAAW,SAAS;IAGjD,OAAO,CAAC,QAAQ,CAAC,YAAY,CAAgC;IAC7D;;OAEG;IACH,OAAO,CAAC,QAAQ,CAAC,OAAO,CAA0C;IAElE,OAAO,CAAC,OAAO,CAA8C;IAE7D,SAAgB,OAAO,EAAE,0BAA0B,CAAC;IAEpD,OAAO,CAAC,OAAO,CAAS;IACxB,OAAO,CAAC,aAAa,CAA+B;IACpD,IAAW,YAAY,kBAAyC;IAEhE,OAAO,CAAC,uBAAuB,CAA4C;IAE3E,OAAO,CAAC,gBAAgB,CAAyB;gBAG7C,UAAU,EAAE,oBAAoB,CAAC,aAAa,EAAE,aAAa,CAAC,EAC9D,OAAO,EAAE,0BAA0B;IAwDvC,OAAO,CAAC,QAAQ;YAkBF,WAAW;IAoClB,wBAAwB,CAAC,OAAO,EAAE,wBAAwB,GAAG,mBAAmB;YASzE,UAAU;IA4BX,YAAY,CAAC,aAAa,EAAE,MAAM,GAAG,OAAO,CAAC,SAAS,CAAC;IA2B7D,UAAU,CAAC,MAAM,EAAE,aAAa,GAAG,OAAO,CAAC,IAAI,CAAC;IAChD,UAAU,CACb,OAAO,EAAE,UAAU,EACnB,IAAI,EAAE,MAAM,EACZ,IAAI,EAAE,MAAM,EACZ,OAAO,CAAC,EAAE,MAAM,GAAG,UAAU,GAC9B,OAAO,CAAC,IAAI,CAAC;IAsCH,KAAK;IAmBlB,OAAO,CAAC,OAAO;CAOlB"}
|
package/esm/socket/dispatcher.js
CHANGED
|
@@ -1,63 +1,82 @@
|
|
|
1
1
|
import { AsyncOperationManager, PromiseResolver } from '@yume-chan/async';
|
|
2
|
-
import {
|
|
2
|
+
import { EMPTY_UINT8_ARRAY } from "@yume-chan/struct";
|
|
3
3
|
import { AdbCommand, calculateChecksum } from '../packet.js';
|
|
4
4
|
import { AbortController, WritableStream } from '../stream/index.js';
|
|
5
5
|
import { decodeUtf8, encodeUtf8 } from '../utils/index.js';
|
|
6
6
|
import { AdbSocketController } from './socket.js';
|
|
7
|
-
|
|
8
|
-
|
|
7
|
+
/**
|
|
8
|
+
* The dispatcher is the "dumb" part of the connection handling logic.
|
|
9
|
+
*
|
|
10
|
+
* Except some options to change some minor behaviors,
|
|
11
|
+
* its only job is forwarding packets between authenticated underlying streams
|
|
12
|
+
* and abstracted socket objects.
|
|
13
|
+
*
|
|
14
|
+
* The `Adb` class is responsible for doing the authentication,
|
|
15
|
+
* negotiating the options, and has shortcuts to high-level services.
|
|
16
|
+
*/
|
|
17
|
+
export class AdbPacketDispatcher {
|
|
9
18
|
// ADB socket id starts from 1
|
|
10
19
|
// (0 means open failed)
|
|
11
20
|
initializers = new AsyncOperationManager(1);
|
|
21
|
+
/**
|
|
22
|
+
* Socket local ID to the socket controller.
|
|
23
|
+
*/
|
|
12
24
|
sockets = new Map();
|
|
13
25
|
_writer;
|
|
14
26
|
options;
|
|
27
|
+
_closed = false;
|
|
15
28
|
_disconnected = new PromiseResolver();
|
|
16
29
|
get disconnected() { return this._disconnected.promise; }
|
|
17
|
-
|
|
18
|
-
get onIncomingSocket() { return this.incomingSocketEvent.event; }
|
|
30
|
+
_incomingSocketHandlers = new Set();
|
|
19
31
|
_abortController = new AbortController();
|
|
20
32
|
constructor(connection, options) {
|
|
21
|
-
super();
|
|
22
33
|
this.options = options;
|
|
23
34
|
connection.readable
|
|
24
35
|
.pipeTo(new WritableStream({
|
|
25
36
|
write: async (packet) => {
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
// But won't close `readable` because of `preventCancel: true`
|
|
50
|
-
throw e;
|
|
37
|
+
switch (packet.command) {
|
|
38
|
+
case AdbCommand.OK:
|
|
39
|
+
this.handleOk(packet);
|
|
40
|
+
break;
|
|
41
|
+
case AdbCommand.Close:
|
|
42
|
+
await this.handleClose(packet);
|
|
43
|
+
break;
|
|
44
|
+
case AdbCommand.Write:
|
|
45
|
+
if (this.sockets.has(packet.arg1)) {
|
|
46
|
+
await this.sockets.get(packet.arg1).enqueue(packet.payload);
|
|
47
|
+
await this.sendPacket(AdbCommand.OK, packet.arg1, packet.arg0);
|
|
48
|
+
break;
|
|
49
|
+
}
|
|
50
|
+
throw new Error(`Unknown local socket id: ${packet.arg1}`);
|
|
51
|
+
case AdbCommand.Open:
|
|
52
|
+
await this.handleOpen(packet);
|
|
53
|
+
break;
|
|
54
|
+
default:
|
|
55
|
+
// Junk data may only appear in the authentication phase,
|
|
56
|
+
// since the dispatcher only works after authentication,
|
|
57
|
+
// all packets should have a valid command.
|
|
58
|
+
// (although it's possible that Adb added new commands in the future)
|
|
59
|
+
throw new Error(`Unknown command: ${packet.command.toString(16)}`);
|
|
51
60
|
}
|
|
52
61
|
},
|
|
53
62
|
}), {
|
|
54
|
-
|
|
63
|
+
// There are multiple reasons for the pipe to stop,
|
|
64
|
+
// (device disconnection, protocol error, or user abortion)
|
|
65
|
+
// if the underlying streams are still open,
|
|
66
|
+
// it's still possible to create another ADB connection.
|
|
67
|
+
// So don't close `readable` here.
|
|
68
|
+
preventCancel: true,
|
|
55
69
|
signal: this._abortController.signal,
|
|
56
70
|
})
|
|
57
71
|
.then(() => {
|
|
58
72
|
this.dispose();
|
|
59
73
|
}, (e) => {
|
|
60
|
-
|
|
74
|
+
// https://github.com/MattiasBuelens/web-streams-polyfill/issues/115
|
|
75
|
+
// `e` is always `AbortError` (instead of what I give in `abortController.abort()`)
|
|
76
|
+
// so we can't check if `e` is a real error.
|
|
77
|
+
if (!this._closed) {
|
|
78
|
+
this._disconnected.reject(e);
|
|
79
|
+
}
|
|
61
80
|
this.dispose();
|
|
62
81
|
});
|
|
63
82
|
this._writer = connection.writable.getWriter();
|
|
@@ -78,18 +97,23 @@ export class AdbPacketDispatcher extends AutoDisposable {
|
|
|
78
97
|
this.sendPacket(AdbCommand.Close, packet.arg1, packet.arg0);
|
|
79
98
|
}
|
|
80
99
|
async handleClose(packet) {
|
|
100
|
+
// If the socket is still pending
|
|
101
|
+
if (packet.arg0 === 0 &&
|
|
102
|
+
this.initializers.reject(packet.arg1, new Error('Socket open failed'))) {
|
|
103
|
+
// Device failed to create the socket
|
|
104
|
+
// (unknown service string, failed to execute command, etc.)
|
|
105
|
+
// it doesn't break the connection,
|
|
106
|
+
// so only reject the socket creation promise,
|
|
107
|
+
// don't throw an error here.
|
|
108
|
+
return;
|
|
109
|
+
}
|
|
81
110
|
// From https://android.googlesource.com/platform/packages/modules/adb/+/65d18e2c1cc48b585811954892311b28a4c3d188/adb.cpp#459
|
|
82
111
|
/* According to protocol.txt, p->msg.arg0 might be 0 to indicate
|
|
83
112
|
* a failed OPEN only. However, due to a bug in previous ADB
|
|
84
113
|
* versions, CLOSE(0, remote-id, "") was also used for normal
|
|
85
114
|
* CLOSE() operations.
|
|
86
115
|
*/
|
|
87
|
-
//
|
|
88
|
-
if (packet.arg0 === 0 &&
|
|
89
|
-
this.initializers.reject(packet.arg1, new Error('Socket open failed'))) {
|
|
90
|
-
// Device failed to create the socket
|
|
91
|
-
return;
|
|
92
|
-
}
|
|
116
|
+
// Ignore `arg0` and search for the socket
|
|
93
117
|
const socket = this.sockets.get(packet.arg1);
|
|
94
118
|
if (socket) {
|
|
95
119
|
// The device want to close the socket
|
|
@@ -100,8 +124,17 @@ export class AdbPacketDispatcher extends AutoDisposable {
|
|
|
100
124
|
this.sockets.delete(packet.arg1);
|
|
101
125
|
return;
|
|
102
126
|
}
|
|
103
|
-
//
|
|
104
|
-
//
|
|
127
|
+
// TODO: adb: is double closing an socket a catastrophic error?
|
|
128
|
+
// If the client sends two `CLSE` packets for one socket,
|
|
129
|
+
// the device may also respond with two `CLSE` packets.
|
|
130
|
+
}
|
|
131
|
+
addIncomingSocketHandler(handler) {
|
|
132
|
+
this._incomingSocketHandlers.add(handler);
|
|
133
|
+
const remove = () => {
|
|
134
|
+
this._incomingSocketHandlers.delete(handler);
|
|
135
|
+
};
|
|
136
|
+
remove.dispose = remove;
|
|
137
|
+
return remove;
|
|
105
138
|
}
|
|
106
139
|
async handleOpen(packet) {
|
|
107
140
|
// AsyncOperationManager doesn't support get and skip an ID
|
|
@@ -117,20 +150,14 @@ export class AdbPacketDispatcher extends AutoDisposable {
|
|
|
117
150
|
localCreated: false,
|
|
118
151
|
serviceString,
|
|
119
152
|
});
|
|
120
|
-
const
|
|
121
|
-
|
|
122
|
-
|
|
123
|
-
|
|
124
|
-
|
|
125
|
-
|
|
126
|
-
this.incomingSocketEvent.fire(args);
|
|
127
|
-
if (args.handled) {
|
|
128
|
-
this.sockets.set(localId, controller);
|
|
129
|
-
await this.sendPacket(AdbCommand.OK, localId, remoteId);
|
|
130
|
-
}
|
|
131
|
-
else {
|
|
132
|
-
await this.sendPacket(AdbCommand.Close, 0, remoteId);
|
|
153
|
+
for (const handler of this._incomingSocketHandlers) {
|
|
154
|
+
if (await handler(controller.socket)) {
|
|
155
|
+
this.sockets.set(localId, controller);
|
|
156
|
+
await this.sendPacket(AdbCommand.OK, localId, remoteId);
|
|
157
|
+
return;
|
|
158
|
+
}
|
|
133
159
|
}
|
|
160
|
+
await this.sendPacket(AdbCommand.Close, 0, remoteId);
|
|
134
161
|
}
|
|
135
162
|
async createSocket(serviceString) {
|
|
136
163
|
if (this.options.appendNullToServiceString) {
|
|
@@ -150,7 +177,7 @@ export class AdbPacketDispatcher extends AutoDisposable {
|
|
|
150
177
|
this.sockets.set(localId, controller);
|
|
151
178
|
return controller.socket;
|
|
152
179
|
}
|
|
153
|
-
async sendPacket(packetOrCommand, arg0, arg1, payload =
|
|
180
|
+
async sendPacket(packetOrCommand, arg0, arg1, payload = EMPTY_UINT8_ARRAY) {
|
|
154
181
|
let init;
|
|
155
182
|
if (arg0 === undefined) {
|
|
156
183
|
init = packetOrCommand;
|
|
@@ -176,21 +203,25 @@ export class AdbPacketDispatcher extends AutoDisposable {
|
|
|
176
203
|
else {
|
|
177
204
|
init.checksum = 0;
|
|
178
205
|
}
|
|
206
|
+
await this._writer.ready;
|
|
179
207
|
await this._writer.write(init);
|
|
180
208
|
}
|
|
209
|
+
async close() {
|
|
210
|
+
// Send `CLSE` packets for all sockets
|
|
211
|
+
await Promise.all(Array.from(this.sockets.values(), socket => socket.close()));
|
|
212
|
+
// Stop receiving
|
|
213
|
+
// It's possible that we haven't received all `CLSE` confirm packets,
|
|
214
|
+
// but it doesn't matter, the next connection can cope with them.
|
|
215
|
+
this._closed = true;
|
|
216
|
+
this._abortController.abort();
|
|
217
|
+
this._writer.releaseLock();
|
|
218
|
+
// `pipe().then()` will call `dispose`
|
|
219
|
+
}
|
|
181
220
|
dispose() {
|
|
182
221
|
for (const socket of this.sockets.values()) {
|
|
183
222
|
socket.dispose();
|
|
184
223
|
}
|
|
185
|
-
this.sockets.clear();
|
|
186
|
-
try {
|
|
187
|
-
// Stop pipes
|
|
188
|
-
this._abortController.abort();
|
|
189
|
-
}
|
|
190
|
-
catch { }
|
|
191
|
-
this._writer.releaseLock();
|
|
192
224
|
this._disconnected.resolve();
|
|
193
|
-
super.dispose();
|
|
194
225
|
}
|
|
195
226
|
}
|
|
196
227
|
//# sourceMappingURL=dispatcher.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"dispatcher.js","sourceRoot":"","sources":["../../src/socket/dispatcher.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,qBAAqB,EAAE,eAAe,EAAE,MAAM,kBAAkB,CAAC;
|
|
1
|
+
{"version":3,"file":"dispatcher.js","sourceRoot":"","sources":["../../src/socket/dispatcher.ts"],"names":[],"mappings":"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"}
|
package/esm/socket/socket.d.ts
CHANGED
|
@@ -1,5 +1,6 @@
|
|
|
1
|
-
import
|
|
2
|
-
import type
|
|
1
|
+
import type { Disposable } from "@yume-chan/event";
|
|
2
|
+
import { WritableStream, type ReadableStream, type ReadableWritablePair } from '../stream/index.js';
|
|
3
|
+
import type { AdbPacketDispatcher, Closeable } from './dispatcher.js';
|
|
3
4
|
export interface AdbSocketInfo {
|
|
4
5
|
localId: number;
|
|
5
6
|
remoteId: number;
|
|
@@ -10,19 +11,24 @@ export interface AdbSocketConstructionOptions extends AdbSocketInfo {
|
|
|
10
11
|
dispatcher: AdbPacketDispatcher;
|
|
11
12
|
highWaterMark?: number | undefined;
|
|
12
13
|
}
|
|
13
|
-
export declare class AdbSocketController implements AdbSocketInfo, ReadableWritablePair<Uint8Array, Uint8Array
|
|
14
|
+
export declare class AdbSocketController implements AdbSocketInfo, ReadableWritablePair<Uint8Array, Uint8Array>, Closeable, Disposable {
|
|
14
15
|
private readonly dispatcher;
|
|
15
16
|
readonly localId: number;
|
|
16
17
|
readonly remoteId: number;
|
|
17
18
|
readonly localCreated: boolean;
|
|
18
19
|
readonly serviceString: string;
|
|
19
|
-
private
|
|
20
|
+
private _duplex;
|
|
20
21
|
private _readable;
|
|
21
22
|
private _readableController;
|
|
22
23
|
get readable(): ReadableStream<Uint8Array>;
|
|
23
24
|
private _writePromise;
|
|
24
25
|
readonly writable: WritableStream<Uint8Array>;
|
|
25
26
|
private _closed;
|
|
27
|
+
/**
|
|
28
|
+
* Whether the socket is half-closed (i.e. the local side initiated the close).
|
|
29
|
+
*
|
|
30
|
+
* It's only used by dispatcher to avoid sending another `CLSE` packet to remote.
|
|
31
|
+
*/
|
|
26
32
|
get closed(): boolean;
|
|
27
33
|
private _socket;
|
|
28
34
|
get socket(): AdbSocket;
|
|
@@ -32,6 +38,14 @@ export declare class AdbSocketController implements AdbSocketInfo, ReadableWrita
|
|
|
32
38
|
close(): Promise<void>;
|
|
33
39
|
dispose(): void;
|
|
34
40
|
}
|
|
41
|
+
/**
|
|
42
|
+
* AdbSocket is a duplex stream.
|
|
43
|
+
*
|
|
44
|
+
* To close it, call either `socket.close()`,
|
|
45
|
+
* `socket.readable.cancel()`, `socket.readable.getReader().cancel()`,
|
|
46
|
+
* `socket.writable.abort()`, `socket.writable.getWriter().abort()`,
|
|
47
|
+
* `socket.writable.close()` or `socket.writable.getWriter().close()`.
|
|
48
|
+
*/
|
|
35
49
|
export declare class AdbSocket implements AdbSocketInfo, ReadableWritablePair<Uint8Array, Uint8Array> {
|
|
36
50
|
private _controller;
|
|
37
51
|
get localId(): number;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"socket.d.ts","sourceRoot":"","sources":["../../src/socket/socket.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"socket.d.ts","sourceRoot":"","sources":["../../src/socket/socket.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,kBAAkB,CAAC;AAEnD,OAAO,EAAkE,cAAc,EAAqC,KAAK,cAAc,EAAE,KAAK,oBAAoB,EAAE,MAAM,oBAAoB,CAAC;AACvM,OAAO,KAAK,EAAE,mBAAmB,EAAE,SAAS,EAAE,MAAM,iBAAiB,CAAC;AAEtE,MAAM,WAAW,aAAa;IAC1B,OAAO,EAAE,MAAM,CAAC;IAChB,QAAQ,EAAE,MAAM,CAAC;IAEjB,YAAY,EAAE,OAAO,CAAC;IACtB,aAAa,EAAE,MAAM,CAAC;CACzB;AAED,MAAM,WAAW,4BAA6B,SAAQ,aAAa;IAC/D,UAAU,EAAE,mBAAmB,CAAC;IAEhC,aAAa,CAAC,EAAE,MAAM,GAAG,SAAS,CAAC;CACtC;AAED,qBAAa,mBAAoB,YAAW,aAAa,EAAE,oBAAoB,CAAC,UAAU,EAAE,UAAU,CAAC,EAAE,SAAS,EAAE,UAAU;IAC1H,OAAO,CAAC,QAAQ,CAAC,UAAU,CAAuB;IAElD,SAAgB,OAAO,EAAG,MAAM,CAAC;IACjC,SAAgB,QAAQ,EAAG,MAAM,CAAC;IAClC,SAAgB,YAAY,EAAG,OAAO,CAAC;IACvC,SAAgB,aAAa,EAAG,MAAM,CAAC;IAEvC,OAAO,CAAC,OAAO,CAA8C;IAE7D,OAAO,CAAC,SAAS,CAA6B;IAC9C,OAAO,CAAC,mBAAmB,CAA4C;IACvE,IAAW,QAAQ,+BAA6B;IAEhD,OAAO,CAAC,aAAa,CAAoC;IACzD,SAAgB,QAAQ,EAAE,cAAc,CAAC,UAAU,CAAC,CAAC;IAErD,OAAO,CAAC,OAAO,CAAS;IACxB;;;;OAIG;IACH,IAAW,MAAM,YAA2B;IAE5C,OAAO,CAAC,OAAO,CAAY;IAC3B,IAAW,MAAM,cAA2B;gBAEzB,OAAO,EAAE,4BAA4B;IAyD3C,OAAO,CAAC,MAAM,EAAE,UAAU;IAUhC,GAAG;IAIG,KAAK,IAAI,OAAO,CAAC,IAAI,CAAC;IAI5B,OAAO;CAGjB;AAED;;;;;;;GAOG;AACH,qBAAa,SAAU,YAAW,aAAa,EAAE,oBAAoB,CAAC,UAAU,EAAE,UAAU,CAAC;IACzF,OAAO,CAAC,WAAW,CAAsB;IAEzC,IAAW,OAAO,IAAI,MAAM,CAAqC;IACjE,IAAW,QAAQ,IAAI,MAAM,CAAsC;IACnE,IAAW,YAAY,IAAI,OAAO,CAA0C;IAC5E,IAAW,aAAa,IAAI,MAAM,CAA2C;IAE7E,IAAW,QAAQ,IAAI,cAAc,CAAC,UAAU,CAAC,CAAsC;IACvF,IAAW,QAAQ,IAAI,cAAc,CAAC,UAAU,CAAC,CAAsC;gBAEpE,UAAU,EAAE,mBAAmB;IAI3C,KAAK;CAGf"}
|
package/esm/socket/socket.js
CHANGED
|
@@ -1,19 +1,24 @@
|
|
|
1
1
|
import { PromiseResolver } from "@yume-chan/async";
|
|
2
2
|
import { AdbCommand } from '../packet.js';
|
|
3
|
-
import { ChunkStream, DuplexStreamFactory, pipeFrom } from '../stream/index.js';
|
|
3
|
+
import { ChunkStream, DuplexStreamFactory, pipeFrom, PushReadableStream, WritableStream } from '../stream/index.js';
|
|
4
4
|
export class AdbSocketController {
|
|
5
5
|
dispatcher;
|
|
6
6
|
localId;
|
|
7
7
|
remoteId;
|
|
8
8
|
localCreated;
|
|
9
9
|
serviceString;
|
|
10
|
-
|
|
10
|
+
_duplex;
|
|
11
11
|
_readable;
|
|
12
12
|
_readableController;
|
|
13
13
|
get readable() { return this._readable; }
|
|
14
14
|
_writePromise;
|
|
15
15
|
writable;
|
|
16
16
|
_closed = false;
|
|
17
|
+
/**
|
|
18
|
+
* Whether the socket is half-closed (i.e. the local side initiated the close).
|
|
19
|
+
*
|
|
20
|
+
* It's only used by dispatcher to avoid sending another `CLSE` packet to remote.
|
|
21
|
+
*/
|
|
17
22
|
get closed() { return this._closed; }
|
|
18
23
|
_socket;
|
|
19
24
|
get socket() { return this._socket; }
|
|
@@ -22,50 +27,60 @@ export class AdbSocketController {
|
|
|
22
27
|
// Check this image to help you understand the stream graph
|
|
23
28
|
// cspell: disable-next-line
|
|
24
29
|
// https://www.plantuml.com/plantuml/png/TL0zoeGm4ErpYc3l5JxyS0yWM6mX5j4C6p4cxcJ25ejttuGX88ZftizxUKmJI275pGhXl0PP_UkfK_CAz5Z2hcWsW9Ny2fdU4C1f5aSchFVxA8vJjlTPRhqZzDQMRB7AklwJ0xXtX0ZSKH1h24ghoKAdGY23FhxC4nS2pDvxzIvxb-8THU0XlEQJ-ZB7SnXTAvc_LhOckhMdLBnbtndpb-SB7a8q2SRD_W00
|
|
25
|
-
this.
|
|
30
|
+
this._duplex = new DuplexStreamFactory({
|
|
26
31
|
close: async () => {
|
|
27
|
-
|
|
32
|
+
this._closed = true;
|
|
33
|
+
await this.dispatcher.sendPacket(AdbCommand.Close, this.localId, this.remoteId);
|
|
34
|
+
// Don't `dispose` here, we need to wait for `CLSE` response packet.
|
|
35
|
+
return false;
|
|
36
|
+
},
|
|
37
|
+
dispose: () => {
|
|
38
|
+
// Error out the pending writes
|
|
39
|
+
this._writePromise?.reject(new Error('Socket closed'));
|
|
28
40
|
},
|
|
29
41
|
});
|
|
30
|
-
this._readable = this.
|
|
42
|
+
this._readable = this._duplex.wrapReadable(new PushReadableStream(controller => {
|
|
31
43
|
this._readableController = controller;
|
|
32
44
|
}, {
|
|
33
45
|
highWaterMark: options.highWaterMark ?? 16 * 1024,
|
|
34
46
|
size(chunk) { return chunk.byteLength; }
|
|
35
|
-
});
|
|
36
|
-
this.writable = pipeFrom(this.
|
|
47
|
+
}));
|
|
48
|
+
this.writable = pipeFrom(this._duplex.createWritable(new WritableStream({
|
|
37
49
|
write: async (chunk) => {
|
|
38
50
|
// Wait for an ack packet
|
|
39
51
|
this._writePromise = new PromiseResolver();
|
|
40
52
|
await this.dispatcher.sendPacket(AdbCommand.Write, this.localId, this.remoteId, chunk);
|
|
41
53
|
await this._writePromise.promise;
|
|
42
|
-
}
|
|
43
|
-
}), new ChunkStream(this.dispatcher.options.maxPayloadSize));
|
|
54
|
+
}
|
|
55
|
+
})), new ChunkStream(this.dispatcher.options.maxPayloadSize));
|
|
44
56
|
this._socket = new AdbSocket(this);
|
|
45
57
|
}
|
|
46
58
|
async enqueue(packet) {
|
|
59
|
+
// Consumer may abort the `ReadableStream` to close the socket,
|
|
60
|
+
// it's OK to throw away further packets in this case.
|
|
61
|
+
if (this._readableController.abortSignal.aborted) {
|
|
62
|
+
return;
|
|
63
|
+
}
|
|
47
64
|
await this._readableController.enqueue(packet);
|
|
48
65
|
}
|
|
49
66
|
ack() {
|
|
50
67
|
this._writePromise?.resolve();
|
|
51
68
|
}
|
|
52
69
|
async close() {
|
|
53
|
-
|
|
54
|
-
this._writePromise?.reject(new Error('Socket closed'));
|
|
55
|
-
if (!this._closed) {
|
|
56
|
-
this._closed = true;
|
|
57
|
-
// Only send close packet when `close` is called before `dispose`
|
|
58
|
-
// (the client initiated the close)
|
|
59
|
-
await this.dispatcher.sendPacket(AdbCommand.Close, this.localId, this.remoteId);
|
|
60
|
-
}
|
|
70
|
+
await this._duplex.close();
|
|
61
71
|
}
|
|
62
72
|
dispose() {
|
|
63
|
-
this.
|
|
64
|
-
this._factory.close();
|
|
65
|
-
// Close `writable` side
|
|
66
|
-
this.close();
|
|
73
|
+
this._duplex.dispose();
|
|
67
74
|
}
|
|
68
75
|
}
|
|
76
|
+
/**
|
|
77
|
+
* AdbSocket is a duplex stream.
|
|
78
|
+
*
|
|
79
|
+
* To close it, call either `socket.close()`,
|
|
80
|
+
* `socket.readable.cancel()`, `socket.readable.getReader().cancel()`,
|
|
81
|
+
* `socket.writable.abort()`, `socket.writable.getWriter().abort()`,
|
|
82
|
+
* `socket.writable.close()` or `socket.writable.getWriter().close()`.
|
|
83
|
+
*/
|
|
69
84
|
export class AdbSocket {
|
|
70
85
|
_controller;
|
|
71
86
|
get localId() { return this._controller.localId; }
|
package/esm/socket/socket.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"socket.js","sourceRoot":"","sources":["../../src/socket/socket.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,eAAe,EAAE,MAAM,kBAAkB,CAAC;
|
|
1
|
+
{"version":3,"file":"socket.js","sourceRoot":"","sources":["../../src/socket/socket.ts"],"names":[],"mappings":"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"}
|
package/esm/stream/buffered.d.ts
CHANGED
|
@@ -5,23 +5,27 @@ export declare class BufferedStreamEndedError extends Error {
|
|
|
5
5
|
constructor();
|
|
6
6
|
}
|
|
7
7
|
export declare class BufferedStream {
|
|
8
|
-
private
|
|
8
|
+
private buffered;
|
|
9
|
+
private bufferedOffset;
|
|
10
|
+
private bufferedLength;
|
|
9
11
|
protected readonly stream: ReadableStream<Uint8Array>;
|
|
10
12
|
protected readonly reader: ReadableStreamDefaultReader<Uint8Array>;
|
|
11
13
|
constructor(stream: ReadableStream<Uint8Array>);
|
|
14
|
+
private readSource;
|
|
15
|
+
private readAsync;
|
|
12
16
|
/**
|
|
13
17
|
*
|
|
14
18
|
* @param length
|
|
15
19
|
* @returns
|
|
16
20
|
*/
|
|
17
|
-
read(length: number): Promise<Uint8Array>;
|
|
21
|
+
read(length: number): Uint8Array | Promise<Uint8Array>;
|
|
18
22
|
/**
|
|
19
23
|
* Return a readable stream with unconsumed data (if any) and
|
|
20
24
|
* all data from the wrapped stream.
|
|
21
25
|
* @returns A `ReadableStream`
|
|
22
26
|
*/
|
|
23
27
|
release(): ReadableStream<Uint8Array>;
|
|
24
|
-
close(): void
|
|
28
|
+
close(): Promise<void>;
|
|
25
29
|
}
|
|
26
30
|
export declare class AdbBufferedStream extends BufferedStream implements AdbSocketInfo, StructAsyncDeserializeStream {
|
|
27
31
|
protected readonly socket: AdbSocket;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"buffered.d.ts","sourceRoot":"","sources":["../../src/stream/buffered.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,4BAA4B,EAAE,MAAM,mBAAmB,CAAC;AACtE,OAAO,KAAK,EAAE,SAAS,EAAE,aAAa,EAAE,MAAM,oBAAoB,CAAC;AACnE,OAAO,KAAK,EAAE,cAAc,EAAE,2BAA2B,EAAE,MAAM,aAAa,CAAC;AAG/E,qBAAa,wBAAyB,SAAQ,KAAK;;CAOlD;AAED,qBAAa,cAAc;IACvB,OAAO,CAAC,
|
|
1
|
+
{"version":3,"file":"buffered.d.ts","sourceRoot":"","sources":["../../src/stream/buffered.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,4BAA4B,EAAE,MAAM,mBAAmB,CAAC;AACtE,OAAO,KAAK,EAAE,SAAS,EAAE,aAAa,EAAE,MAAM,oBAAoB,CAAC;AACnE,OAAO,KAAK,EAAE,cAAc,EAAE,2BAA2B,EAAE,MAAM,aAAa,CAAC;AAG/E,qBAAa,wBAAyB,SAAQ,KAAK;;CAOlD;AAED,qBAAa,cAAc;IACvB,OAAO,CAAC,QAAQ,CAAyB;IACzC,OAAO,CAAC,cAAc,CAAK;IAC3B,OAAO,CAAC,cAAc,CAAK;IAE3B,SAAS,CAAC,QAAQ,CAAC,MAAM,EAAE,cAAc,CAAC,UAAU,CAAC,CAAC;IAEtD,SAAS,CAAC,QAAQ,CAAC,MAAM,EAAE,2BAA2B,CAAC,UAAU,CAAC,CAAC;gBAEhD,MAAM,EAAE,cAAc,CAAC,UAAU,CAAC;YAKvC,UAAU;YAQV,SAAS;IAmDvB;;;;OAIG;IACI,IAAI,CAAC,MAAM,EAAE,MAAM,GAAG,UAAU,GAAG,OAAO,CAAC,UAAU,CAAC;IAoB7D;;;;OAIG;IACI,OAAO,IAAI,cAAc,CAAC,UAAU,CAAC;IA6B/B,KAAK;CAGrB;AAED,qBAAa,iBACT,SAAQ,cACR,YAAW,aAAa,EAAE,4BAA4B;IACtD,SAAS,CAAC,QAAQ,CAAC,MAAM,EAAE,SAAS,CAAC;IAErC,IAAW,OAAO,WAAkC;IACpD,IAAW,QAAQ,WAAmC;IACtD,IAAW,YAAY,YAAuC;IAC9D,IAAW,aAAa,WAAwC;IAEhE,IAAW,QAAQ,8DAAmC;gBAEnC,MAAM,EAAE,SAAS;CAIvC"}
|