@yume-chan/adb 0.0.11 → 0.0.14
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 +39 -0
- package/CHANGELOG.md +23 -1
- package/README.md +24 -17
- package/esm/adb.d.ts +10 -9
- package/esm/adb.d.ts.map +1 -1
- package/esm/adb.js +87 -64
- package/esm/adb.js.map +1 -1
- package/esm/auth.d.ts +6 -6
- package/esm/auth.d.ts.map +1 -1
- package/esm/auth.js +8 -6
- package/esm/auth.js.map +1 -1
- package/esm/backend.d.ts +2 -2
- package/esm/commands/install.d.ts.map +1 -1
- package/esm/commands/install.js +5 -7
- package/esm/commands/install.js.map +1 -1
- package/esm/commands/reverse.d.ts +7 -10
- package/esm/commands/reverse.d.ts.map +1 -1
- package/esm/commands/reverse.js +9 -15
- package/esm/commands/reverse.js.map +1 -1
- package/esm/commands/subprocess/index.d.ts +19 -20
- package/esm/commands/subprocess/index.d.ts.map +1 -1
- package/esm/commands/subprocess/index.js +36 -31
- package/esm/commands/subprocess/index.js.map +1 -1
- package/esm/commands/subprocess/legacy.d.ts +14 -7
- package/esm/commands/subprocess/legacy.d.ts.map +1 -1
- package/esm/commands/subprocess/legacy.js +14 -5
- package/esm/commands/subprocess/legacy.js.map +1 -1
- package/esm/commands/subprocess/protocol.d.ts +3 -2
- package/esm/commands/subprocess/protocol.d.ts.map +1 -1
- package/esm/commands/subprocess/protocol.js +6 -4
- package/esm/commands/subprocess/protocol.js.map +1 -1
- package/esm/commands/subprocess/protocols/index.d.ts +4 -0
- package/esm/commands/subprocess/protocols/index.d.ts.map +1 -0
- package/esm/commands/subprocess/protocols/index.js +4 -0
- package/esm/commands/subprocess/protocols/index.js.map +1 -0
- package/esm/commands/subprocess/protocols/none.d.ts +35 -0
- package/esm/commands/subprocess/protocols/none.d.ts.map +1 -0
- package/esm/commands/subprocess/protocols/none.js +53 -0
- package/esm/commands/subprocess/protocols/none.js.map +1 -0
- package/esm/commands/subprocess/protocols/shell.d.ts +39 -0
- package/esm/commands/subprocess/protocols/shell.d.ts.map +1 -0
- package/esm/commands/subprocess/protocols/shell.js +155 -0
- package/esm/commands/subprocess/protocols/shell.js.map +1 -0
- package/esm/commands/subprocess/protocols/types.d.ts +50 -0
- package/esm/commands/subprocess/protocols/types.d.ts.map +1 -0
- package/esm/commands/subprocess/protocols/types.js +2 -0
- package/esm/commands/subprocess/protocols/types.js.map +1 -0
- package/esm/commands/subprocess/types.d.ts +9 -6
- package/esm/commands/subprocess/types.d.ts.map +1 -1
- package/esm/commands/sync/list.d.ts +25 -1
- package/esm/commands/sync/list.d.ts.map +1 -1
- package/esm/commands/sync/list.js +40 -5
- package/esm/commands/sync/list.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/request.d.ts +1 -0
- package/esm/commands/sync/request.d.ts.map +1 -1
- package/esm/commands/sync/request.js +1 -0
- package/esm/commands/sync/request.js.map +1 -1
- package/esm/commands/sync/response.d.ts +2 -1
- package/esm/commands/sync/response.d.ts.map +1 -1
- package/esm/commands/sync/response.js +2 -1
- package/esm/commands/sync/response.js.map +1 -1
- package/esm/commands/sync/stat.d.ts +13 -1
- package/esm/commands/sync/stat.d.ts.map +1 -1
- package/esm/commands/sync/stat.js +20 -7
- package/esm/commands/sync/stat.js.map +1 -1
- package/esm/commands/sync/sync.d.ts +13 -35
- package/esm/commands/sync/sync.d.ts.map +1 -1
- package/esm/commands/sync/sync.js +39 -9
- package/esm/commands/sync/sync.js.map +1 -1
- package/esm/crypto.d.ts +23 -10
- package/esm/crypto.d.ts.map +1 -1
- package/esm/crypto.js +64 -46
- package/esm/crypto.js.map +1 -1
- package/esm/features.d.ts +4 -2
- package/esm/features.d.ts.map +1 -1
- package/esm/features.js +6 -2
- package/esm/features.js.map +1 -1
- package/esm/packet.d.ts +21 -2
- package/esm/packet.d.ts.map +1 -1
- package/esm/packet.js +2 -2
- package/esm/packet.js.map +1 -1
- package/esm/socket/dispatcher.d.ts +34 -23
- package/esm/socket/dispatcher.d.ts.map +1 -1
- package/esm/socket/dispatcher.js +92 -70
- package/esm/socket/dispatcher.js.map +1 -1
- package/esm/socket/socket.d.ts +29 -8
- package/esm/socket/socket.d.ts.map +1 -1
- package/esm/socket/socket.js +41 -27
- package/esm/socket/socket.js.map +1 -1
- package/esm/stream/detect.d.ts +1 -17
- package/esm/stream/detect.d.ts.map +1 -1
- package/esm/stream/detect.js +4 -5
- package/esm/stream/detect.js.map +1 -1
- package/esm/stream/detect.polyfill.d.ts.map +1 -1
- package/esm/stream/detect.polyfill.js +4 -1
- package/esm/stream/detect.polyfill.js.map +1 -1
- package/esm/stream/transform.d.ts +37 -32
- package/esm/stream/transform.d.ts.map +1 -1
- package/esm/stream/transform.js +106 -92
- package/esm/stream/transform.js.map +1 -1
- package/esm/utils/encoding.d.ts.map +1 -1
- package/esm/utils/encoding.js.map +1 -1
- package/esm/utils/index.d.ts +1 -1
- package/esm/utils/index.d.ts.map +1 -1
- package/esm/utils/index.js +1 -1
- package/esm/utils/index.js.map +1 -1
- package/package.json +6 -6
- package/src/adb.ts +105 -76
- package/src/auth.ts +21 -18
- package/src/backend.ts +2 -2
- package/src/commands/install.ts +7 -9
- package/src/commands/reverse.ts +13 -24
- package/src/commands/subprocess/index.ts +57 -42
- package/src/commands/subprocess/protocols/index.ts +3 -0
- package/src/commands/subprocess/{legacy.ts → protocols/none.ts} +20 -10
- package/src/commands/subprocess/{protocol.ts → protocols/shell.ts} +22 -17
- package/src/commands/subprocess/{types.ts → protocols/types.ts} +13 -9
- package/src/commands/sync/list.ts +51 -5
- package/src/commands/sync/pull.ts +6 -3
- package/src/commands/sync/request.ts +1 -0
- package/src/commands/sync/response.ts +8 -2
- package/src/commands/sync/stat.ts +36 -9
- package/src/commands/sync/sync.ts +55 -19
- package/src/crypto.ts +72 -56
- package/src/features.ts +6 -2
- package/src/packet.ts +17 -6
- package/src/socket/dispatcher.ts +133 -88
- package/src/socket/socket.ts +61 -48
- package/src/stream/detect.polyfill.ts +4 -1
- package/src/stream/detect.ts +4 -24
- package/src/stream/transform.ts +133 -116
- package/src/utils/index.ts +1 -1
- package/tsconfig.build.tsbuildinfo +1 -1
- package/src/utils/encoding.ts +0 -13
package/esm/packet.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"packet.js","sourceRoot":"","sources":["../src/packet.ts"],"names":[],"mappings":"AAAA,OAAO,MAAM,MAAM,mBAAmB,CAAC;AACvC,OAAO,EAAE,eAAe,EAAE,MAAM,mBAAmB,CAAC;AAEpD,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,GAAV,UAAU,KAAV,UAAU,QAOrB;AAED,MAAM,eAAe,
|
|
1
|
+
{"version":3,"file":"packet.js","sourceRoot":"","sources":["../src/packet.ts"],"names":[],"mappings":"AAAA,OAAO,MAAM,MAAM,mBAAmB,CAAC;AACvC,OAAO,EAAE,eAAe,EAAE,MAAM,mBAAmB,CAAC;AAEpD,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,GAAV,UAAU,KAAV,UAAU,QAOrB;AAED,MAAM,CAAC,MAAM,eAAe,GACxB,IAAI,MAAM,CAAC,EAAE,YAAY,EAAE,IAAI,EAAE,CAAC;KAC7B,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;AAMxB,MAAM,CAAC,MAAM,SAAS,GAClB,IAAI,MAAM,CAAC,EAAE,YAAY,EAAE,IAAI,EAAE,CAAC;KAC7B,MAAM,CAAC,eAAe,CAAC;KACvB,UAAU,CAAC,SAAS,EAAE,EAAE,WAAW,EAAE,eAAe,EAAE,CAAC,CAAC;AAqBjE,MAAM,UAAU,iBAAiB,CAAC,OAAmC;IACjE,IAAI,OAAO,YAAY,UAAU,EAAE;QAC/B,OAAO,OAAO,CAAC,MAAM,CAAC,CAAC,MAAM,EAAE,IAAI,EAAE,EAAE,CAAC,MAAM,GAAG,IAAI,EAAE,CAAC,CAAC,CAAC;KAC7D;SAAM;QACF,OAAyB,CAAC,QAAQ,GAAG,iBAAiB,CAAC,OAAO,CAAC,OAAO,CAAC,CAAC;QACzE,OAAO,OAAwB,CAAC;KACnC;AACL,CAAC;AAED,MAAM,OAAO,wBAAyB,SAAQ,eAA0C;IACpF;QACI,KAAK,CAAC;YACF,SAAS,EAAE,KAAK,EAAE,IAAI,EAAE,UAAU,EAAE,EAAE;gBAClC,gEAAgE;gBAC/D,IAAuC,CAAC,KAAK,GAAG,IAAI,CAAC,OAAO,GAAG,UAAU,CAAC;gBAC1E,IAAuC,CAAC,aAAa,GAAG,IAAI,CAAC,OAAO,CAAC,UAAU,CAAC;gBAEjF,UAAU,CAAC,OAAO,CACd,eAAe,CAAC,SAAS,CACrB,IAAsC,CACzC,CACJ,CAAC;gBAEF,IAAI,IAAI,CAAC,OAAO,CAAC,UAAU,EAAE;oBACzB,8CAA8C;oBAC9C,UAAU,CAAC,OAAO,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;iBACpC;YACL,CAAC;SACJ,CAAC,CAAC;IACP,CAAC;CACJ"}
|
|
@@ -1,40 +1,51 @@
|
|
|
1
|
-
import {
|
|
2
|
-
import
|
|
1
|
+
import type { RemoveEventListener } from '@yume-chan/event';
|
|
2
|
+
import type { ValueOrPromise } from "@yume-chan/struct";
|
|
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
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
6
|
+
export interface AdbPacketDispatcherOptions {
|
|
7
|
+
calculateChecksum: boolean;
|
|
8
|
+
/**
|
|
9
|
+
* Before Android 9.0, ADB uses `char*` to parse service string,
|
|
10
|
+
* thus requires a null character to terminate.
|
|
11
|
+
*
|
|
12
|
+
* Usually it should have the same value as `calculateChecksum`.
|
|
13
|
+
*/
|
|
14
|
+
appendNullToServiceString: boolean;
|
|
15
|
+
maxPayloadSize: number;
|
|
16
|
+
}
|
|
17
|
+
export declare type AdbIncomingSocketHandler = (socket: AdbSocket) => ValueOrPromise<boolean>;
|
|
18
|
+
export interface Closeable {
|
|
19
|
+
close(): ValueOrPromise<void>;
|
|
10
20
|
}
|
|
11
|
-
|
|
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 {
|
|
12
32
|
private readonly initializers;
|
|
13
33
|
private readonly sockets;
|
|
14
34
|
private _writer;
|
|
15
|
-
|
|
16
|
-
calculateChecksum: boolean;
|
|
17
|
-
appendNullToServiceString: boolean;
|
|
35
|
+
readonly options: AdbPacketDispatcherOptions;
|
|
18
36
|
private _disconnected;
|
|
19
37
|
get disconnected(): Promise<void>;
|
|
20
|
-
private
|
|
21
|
-
get onIncomingSocket(): {
|
|
22
|
-
(listener: import("@yume-chan/event").EventListener<AdbIncomingSocketEventArgs, unknown, [], unknown>): import("@yume-chan/event").RemoveEventListener;
|
|
23
|
-
<TThis, TArgs extends unknown[]>(listener: import("@yume-chan/event").EventListener<AdbIncomingSocketEventArgs, TThis, TArgs, unknown>, thisArg: TThis, ...args: TArgs): import("@yume-chan/event").RemoveEventListener;
|
|
24
|
-
};
|
|
25
|
-
private readonly errorEvent;
|
|
26
|
-
get onError(): {
|
|
27
|
-
(listener: import("@yume-chan/event").EventListener<Error, unknown, [], unknown>): import("@yume-chan/event").RemoveEventListener;
|
|
28
|
-
<TThis, TArgs extends unknown[]>(listener: import("@yume-chan/event").EventListener<Error, TThis, TArgs, unknown>, thisArg: TThis, ...args: TArgs): import("@yume-chan/event").RemoveEventListener;
|
|
29
|
-
};
|
|
38
|
+
private _incomingSocketHandlers;
|
|
30
39
|
private _abortController;
|
|
31
|
-
constructor(connection: ReadableWritablePair<
|
|
40
|
+
constructor(connection: ReadableWritablePair<AdbPacketData, AdbPacketInit>, options: AdbPacketDispatcherOptions);
|
|
32
41
|
private handleOk;
|
|
33
42
|
private handleClose;
|
|
43
|
+
addIncomingSocketHandler(handler: AdbIncomingSocketHandler): RemoveEventListener;
|
|
34
44
|
private handleOpen;
|
|
35
45
|
createSocket(serviceString: string): Promise<AdbSocket>;
|
|
36
46
|
sendPacket(packet: AdbPacketInit): Promise<void>;
|
|
37
47
|
sendPacket(command: AdbCommand, arg0: number, arg1: number, payload?: string | Uint8Array): Promise<void>;
|
|
38
|
-
|
|
48
|
+
close(): Promise<void>;
|
|
49
|
+
private dispose;
|
|
39
50
|
}
|
|
40
51
|
//# 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,KAAK,EAAE,cAAc,EAAE,MAAM,mBAAmB,CAAC;AAExD,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;AAI7D,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,OAAO,CAAC,QAAQ,CAAC,OAAO,CAA0C;IAElE,OAAO,CAAC,OAAO,CAA8C;IAE7D,SAAgB,OAAO,EAAE,0BAA0B,CAAC;IAEpD,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;IAmDvC,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;IAqCH,KAAK;IAqBlB,OAAO,CAAC,OAAO;CASlB"}
|
package/esm/socket/dispatcher.js
CHANGED
|
@@ -1,67 +1,73 @@
|
|
|
1
1
|
import { AsyncOperationManager, PromiseResolver } from '@yume-chan/async';
|
|
2
|
-
import { AutoDisposable, EventEmitter } from '@yume-chan/event';
|
|
3
2
|
import { AdbCommand, calculateChecksum } from '../packet.js';
|
|
4
3
|
import { AbortController, WritableStream } from '../stream/index.js';
|
|
5
4
|
import { decodeUtf8, encodeUtf8 } from '../utils/index.js';
|
|
6
|
-
import {
|
|
5
|
+
import { AdbSocketController } from './socket.js';
|
|
7
6
|
const EmptyUint8Array = new Uint8Array(0);
|
|
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);
|
|
12
21
|
sockets = new Map();
|
|
13
22
|
_writer;
|
|
14
|
-
|
|
15
|
-
calculateChecksum = true;
|
|
16
|
-
appendNullToServiceString = true;
|
|
23
|
+
options;
|
|
17
24
|
_disconnected = new PromiseResolver();
|
|
18
25
|
get disconnected() { return this._disconnected.promise; }
|
|
19
|
-
|
|
20
|
-
get onIncomingSocket() { return this.incomingSocketEvent.event; }
|
|
21
|
-
errorEvent = this.addDisposable(new EventEmitter());
|
|
22
|
-
get onError() { return this.errorEvent.event; }
|
|
26
|
+
_incomingSocketHandlers = new Set();
|
|
23
27
|
_abortController = new AbortController();
|
|
24
|
-
constructor(connection) {
|
|
25
|
-
|
|
28
|
+
constructor(connection, options) {
|
|
29
|
+
this.options = options;
|
|
26
30
|
connection.readable
|
|
27
31
|
.pipeTo(new WritableStream({
|
|
28
32
|
write: async (packet) => {
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
// Throw error here will stop the pipe
|
|
53
|
-
// But won't close `readable` because of `preventCancel: true`
|
|
54
|
-
throw e;
|
|
33
|
+
switch (packet.command) {
|
|
34
|
+
case AdbCommand.OK:
|
|
35
|
+
this.handleOk(packet);
|
|
36
|
+
break;
|
|
37
|
+
case AdbCommand.Close:
|
|
38
|
+
await this.handleClose(packet);
|
|
39
|
+
break;
|
|
40
|
+
case AdbCommand.Write:
|
|
41
|
+
if (this.sockets.has(packet.arg1)) {
|
|
42
|
+
await this.sockets.get(packet.arg1).enqueue(packet.payload);
|
|
43
|
+
await this.sendPacket(AdbCommand.OK, packet.arg1, packet.arg0);
|
|
44
|
+
break;
|
|
45
|
+
}
|
|
46
|
+
throw new Error(`Unknown local socket id: ${packet.arg1}`);
|
|
47
|
+
case AdbCommand.Open:
|
|
48
|
+
await this.handleOpen(packet);
|
|
49
|
+
break;
|
|
50
|
+
default:
|
|
51
|
+
// Junk data may only appear in the authentication phase,
|
|
52
|
+
// since the dispatcher only works after authentication,
|
|
53
|
+
// all packets should have a valid command.
|
|
54
|
+
// (although it's possible that Adb added new commands in the future)
|
|
55
|
+
throw new Error(`Unknown command: ${packet.command.toString(16)}`);
|
|
55
56
|
}
|
|
56
57
|
},
|
|
57
58
|
}), {
|
|
59
|
+
// There are multiple reasons for the pipe to stop,
|
|
60
|
+
// including device disconnection, protocol error, or user abort,
|
|
61
|
+
// if the underlying streams are still open,
|
|
62
|
+
// it's still possible to create another ADB connection.
|
|
63
|
+
// So don't close `readable` here.
|
|
58
64
|
preventCancel: false,
|
|
59
65
|
signal: this._abortController.signal,
|
|
60
66
|
})
|
|
61
67
|
.then(() => {
|
|
62
68
|
this.dispose();
|
|
63
|
-
}, () => {
|
|
64
|
-
|
|
69
|
+
}, (e) => {
|
|
70
|
+
this._disconnected.reject(e);
|
|
65
71
|
this.dispose();
|
|
66
72
|
});
|
|
67
73
|
this._writer = connection.writable.getWriter();
|
|
@@ -88,12 +94,17 @@ export class AdbPacketDispatcher extends AutoDisposable {
|
|
|
88
94
|
* versions, CLOSE(0, remote-id, "") was also used for normal
|
|
89
95
|
* CLOSE() operations.
|
|
90
96
|
*/
|
|
91
|
-
//
|
|
97
|
+
// If the socket is still pending
|
|
92
98
|
if (packet.arg0 === 0 &&
|
|
93
99
|
this.initializers.reject(packet.arg1, new Error('Socket open failed'))) {
|
|
94
100
|
// Device failed to create the socket
|
|
101
|
+
// (unknown service string, failed to execute command, etc.)
|
|
102
|
+
// it doesn't break the connection,
|
|
103
|
+
// so only reject the socket creation promise,
|
|
104
|
+
// don't throw an error here.
|
|
95
105
|
return;
|
|
96
106
|
}
|
|
107
|
+
// Ignore `arg0` and search for the socket
|
|
97
108
|
const socket = this.sockets.get(packet.arg1);
|
|
98
109
|
if (socket) {
|
|
99
110
|
// The device want to close the socket
|
|
@@ -104,8 +115,17 @@ export class AdbPacketDispatcher extends AutoDisposable {
|
|
|
104
115
|
this.sockets.delete(packet.arg1);
|
|
105
116
|
return;
|
|
106
117
|
}
|
|
107
|
-
//
|
|
108
|
-
//
|
|
118
|
+
// TODO: adb: is double closing an socket a catastrophic error?
|
|
119
|
+
// If the client sends two `CLSE` packets for one socket,
|
|
120
|
+
// the device may also respond with two `CLSE` packets.
|
|
121
|
+
}
|
|
122
|
+
addIncomingSocketHandler(handler) {
|
|
123
|
+
this._incomingSocketHandlers.add(handler);
|
|
124
|
+
const remove = () => {
|
|
125
|
+
this._incomingSocketHandlers.delete(handler);
|
|
126
|
+
};
|
|
127
|
+
remove.dispose = remove;
|
|
128
|
+
return remove;
|
|
109
129
|
}
|
|
110
130
|
async handleOpen(packet) {
|
|
111
131
|
// AsyncOperationManager doesn't support get and skip an ID
|
|
@@ -114,44 +134,39 @@ export class AdbPacketDispatcher extends AutoDisposable {
|
|
|
114
134
|
this.initializers.resolve(localId, undefined);
|
|
115
135
|
const remoteId = packet.arg0;
|
|
116
136
|
const serviceString = decodeUtf8(packet.payload);
|
|
117
|
-
const
|
|
137
|
+
const controller = new AdbSocketController({
|
|
118
138
|
dispatcher: this,
|
|
119
139
|
localId,
|
|
120
140
|
remoteId,
|
|
121
141
|
localCreated: false,
|
|
122
142
|
serviceString,
|
|
123
143
|
});
|
|
124
|
-
const
|
|
125
|
-
|
|
126
|
-
|
|
127
|
-
|
|
128
|
-
|
|
129
|
-
|
|
130
|
-
this.incomingSocketEvent.fire(args);
|
|
131
|
-
if (args.handled) {
|
|
132
|
-
this.sockets.set(localId, socket);
|
|
133
|
-
await this.sendPacket(AdbCommand.OK, localId, remoteId);
|
|
134
|
-
}
|
|
135
|
-
else {
|
|
136
|
-
await this.sendPacket(AdbCommand.Close, 0, remoteId);
|
|
144
|
+
for (const handler of this._incomingSocketHandlers) {
|
|
145
|
+
if (await handler(controller.socket)) {
|
|
146
|
+
this.sockets.set(localId, controller);
|
|
147
|
+
await this.sendPacket(AdbCommand.OK, localId, remoteId);
|
|
148
|
+
return;
|
|
149
|
+
}
|
|
137
150
|
}
|
|
151
|
+
await this.sendPacket(AdbCommand.Close, 0, remoteId);
|
|
138
152
|
}
|
|
139
153
|
async createSocket(serviceString) {
|
|
140
|
-
if (this.appendNullToServiceString) {
|
|
154
|
+
if (this.options.appendNullToServiceString) {
|
|
141
155
|
serviceString += '\0';
|
|
142
156
|
}
|
|
143
157
|
const [localId, initializer] = this.initializers.add();
|
|
144
158
|
await this.sendPacket(AdbCommand.Open, localId, 0, serviceString);
|
|
159
|
+
// Fulfilled by `handleOk`
|
|
145
160
|
const remoteId = await initializer;
|
|
146
|
-
const
|
|
161
|
+
const controller = new AdbSocketController({
|
|
147
162
|
dispatcher: this,
|
|
148
163
|
localId,
|
|
149
164
|
remoteId,
|
|
150
165
|
localCreated: true,
|
|
151
166
|
serviceString,
|
|
152
167
|
});
|
|
153
|
-
this.sockets.set(localId,
|
|
154
|
-
return socket;
|
|
168
|
+
this.sockets.set(localId, controller);
|
|
169
|
+
return controller.socket;
|
|
155
170
|
}
|
|
156
171
|
async sendPacket(packetOrCommand, arg0, arg1, payload = EmptyUint8Array) {
|
|
157
172
|
let init;
|
|
@@ -170,10 +185,10 @@ export class AdbPacketDispatcher extends AutoDisposable {
|
|
|
170
185
|
};
|
|
171
186
|
}
|
|
172
187
|
if (init.payload &&
|
|
173
|
-
init.payload.byteLength > this.maxPayloadSize) {
|
|
188
|
+
init.payload.byteLength > this.options.maxPayloadSize) {
|
|
174
189
|
throw new Error('payload too large');
|
|
175
190
|
}
|
|
176
|
-
if (this.calculateChecksum) {
|
|
191
|
+
if (this.options.calculateChecksum) {
|
|
177
192
|
calculateChecksum(init);
|
|
178
193
|
}
|
|
179
194
|
else {
|
|
@@ -181,19 +196,26 @@ export class AdbPacketDispatcher extends AutoDisposable {
|
|
|
181
196
|
}
|
|
182
197
|
await this._writer.write(init);
|
|
183
198
|
}
|
|
184
|
-
|
|
185
|
-
|
|
186
|
-
|
|
187
|
-
|
|
188
|
-
|
|
199
|
+
async close() {
|
|
200
|
+
// Send `CLSE` packets for all sockets
|
|
201
|
+
await Promise.all(Array.from(this.sockets.values(), socket => socket.close()));
|
|
202
|
+
// Stop receiving
|
|
203
|
+
// It's possible that we haven't received all `CLSE` confirm packets,
|
|
204
|
+
// but it doesn't matter, the next connection can cope with them.
|
|
189
205
|
try {
|
|
190
|
-
// Stop pipes
|
|
191
206
|
this._abortController.abort();
|
|
192
207
|
}
|
|
193
208
|
catch { }
|
|
209
|
+
// Adb connection doesn't have a method to confirm closing,
|
|
210
|
+
// so call `dispose` immediately
|
|
211
|
+
this.dispose();
|
|
212
|
+
}
|
|
213
|
+
dispose() {
|
|
214
|
+
for (const socket of this.sockets.values()) {
|
|
215
|
+
socket.dispose();
|
|
216
|
+
}
|
|
194
217
|
this._writer.releaseLock();
|
|
195
218
|
this._disconnected.resolve();
|
|
196
|
-
super.dispose();
|
|
197
219
|
}
|
|
198
220
|
}
|
|
199
221
|
//# 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,20 +1,17 @@
|
|
|
1
|
-
import {
|
|
2
|
-
import type
|
|
1
|
+
import type { Disposable } from "@yume-chan/event";
|
|
2
|
+
import { type ReadableStream, type ReadableWritablePair, type WritableStream } 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;
|
|
6
7
|
localCreated: boolean;
|
|
7
8
|
serviceString: string;
|
|
8
9
|
}
|
|
9
|
-
export interface AdbSocketConstructionOptions {
|
|
10
|
+
export interface AdbSocketConstructionOptions extends AdbSocketInfo {
|
|
10
11
|
dispatcher: AdbPacketDispatcher;
|
|
11
|
-
localId: number;
|
|
12
|
-
remoteId: number;
|
|
13
|
-
localCreated: boolean;
|
|
14
|
-
serviceString: string;
|
|
15
12
|
highWaterMark?: number | undefined;
|
|
16
13
|
}
|
|
17
|
-
export declare class
|
|
14
|
+
export declare class AdbSocketController implements AdbSocketInfo, ReadableWritablePair<Uint8Array, Uint8Array>, Closeable, Disposable {
|
|
18
15
|
private readonly dispatcher;
|
|
19
16
|
readonly localId: number;
|
|
20
17
|
readonly remoteId: number;
|
|
@@ -28,7 +25,31 @@ export declare class AdbSocket implements AdbSocketInfo {
|
|
|
28
25
|
readonly writable: WritableStream<Uint8Array>;
|
|
29
26
|
private _closed;
|
|
30
27
|
get closed(): boolean;
|
|
28
|
+
private _socket;
|
|
29
|
+
get socket(): AdbSocket;
|
|
31
30
|
constructor(options: AdbSocketConstructionOptions);
|
|
31
|
+
enqueue(packet: Uint8Array): Promise<void>;
|
|
32
|
+
ack(): void;
|
|
33
|
+
close(): Promise<void>;
|
|
34
|
+
dispose(): void;
|
|
35
|
+
}
|
|
36
|
+
/**
|
|
37
|
+
* AdbSocket is a duplex stream.
|
|
38
|
+
*
|
|
39
|
+
* To close it, call either `socket.close()`,
|
|
40
|
+
* `socket.readable.cancel()`, `socket.readable.getReader().cancel()`,
|
|
41
|
+
* `socket.writable.abort()`, `socket.writable.getWriter().abort()`,
|
|
42
|
+
* `socket.writable.close()` or `socket.writable.getWriter().close()`.
|
|
43
|
+
*/
|
|
44
|
+
export declare class AdbSocket implements AdbSocketInfo, ReadableWritablePair<Uint8Array, Uint8Array> {
|
|
45
|
+
private _controller;
|
|
46
|
+
get localId(): number;
|
|
47
|
+
get remoteId(): number;
|
|
48
|
+
get localCreated(): boolean;
|
|
49
|
+
get serviceString(): string;
|
|
50
|
+
get readable(): ReadableStream<Uint8Array>;
|
|
51
|
+
get writable(): WritableStream<Uint8Array>;
|
|
52
|
+
constructor(controller: AdbSocketController);
|
|
32
53
|
close(): Promise<void>;
|
|
33
54
|
}
|
|
34
55
|
//# sourceMappingURL=socket.d.ts.map
|
|
@@ -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,EAAqG,KAAK,cAAc,EAAE,KAAK,oBAAoB,EAAE,KAAK,cAAc,EAAE,MAAM,oBAAoB,CAAC;AAC5M,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,QAAQ,CAA8C;IAE9D,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,IAAW,MAAM,YAA2B;IAE5C,OAAO,CAAC,OAAO,CAAY;IAC3B,IAAW,MAAM,cAA2B;gBAEzB,OAAO,EAAE,4BAA4B;IAuD3C,OAAO,CAAC,MAAM,EAAE,UAAU;IAIhC,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,7 +1,7 @@
|
|
|
1
1
|
import { PromiseResolver } from "@yume-chan/async";
|
|
2
2
|
import { AdbCommand } from '../packet.js';
|
|
3
|
-
import { ChunkStream, DuplexStreamFactory, pipeFrom } from '../stream/index.js';
|
|
4
|
-
export class
|
|
3
|
+
import { ChunkStream, DuplexStreamFactory, pipeFrom, PushReadableStream } from '../stream/index.js';
|
|
4
|
+
export class AdbSocketController {
|
|
5
5
|
dispatcher;
|
|
6
6
|
localId;
|
|
7
7
|
remoteId;
|
|
@@ -15,6 +15,8 @@ export class AdbSocket {
|
|
|
15
15
|
writable;
|
|
16
16
|
_closed = false;
|
|
17
17
|
get closed() { return this._closed; }
|
|
18
|
+
_socket;
|
|
19
|
+
get socket() { return this._socket; }
|
|
18
20
|
constructor(options) {
|
|
19
21
|
Object.assign(this, options);
|
|
20
22
|
// Check this image to help you understand the stream graph
|
|
@@ -22,15 +24,22 @@ export class AdbSocket {
|
|
|
22
24
|
// https://www.plantuml.com/plantuml/png/TL0zoeGm4ErpYc3l5JxyS0yWM6mX5j4C6p4cxcJ25ejttuGX88ZftizxUKmJI275pGhXl0PP_UkfK_CAz5Z2hcWsW9Ny2fdU4C1f5aSchFVxA8vJjlTPRhqZzDQMRB7AklwJ0xXtX0ZSKH1h24ghoKAdGY23FhxC4nS2pDvxzIvxb-8THU0XlEQJ-ZB7SnXTAvc_LhOckhMdLBnbtndpb-SB7a8q2SRD_W00
|
|
23
25
|
this._factory = new DuplexStreamFactory({
|
|
24
26
|
close: async () => {
|
|
25
|
-
await this.
|
|
27
|
+
await this.dispatcher.sendPacket(AdbCommand.Close, this.localId, this.remoteId);
|
|
28
|
+
// Don't `dispose` here, we need to wait for `CLSE` response packet.
|
|
29
|
+
return false;
|
|
30
|
+
},
|
|
31
|
+
dispose: () => {
|
|
32
|
+
this._closed = true;
|
|
33
|
+
// Error out the pending writes
|
|
34
|
+
this._writePromise?.reject(new Error('Socket closed'));
|
|
26
35
|
},
|
|
27
36
|
});
|
|
28
|
-
this._readable = this._factory.
|
|
37
|
+
this._readable = this._factory.wrapReadable(new PushReadableStream(controller => {
|
|
29
38
|
this._readableController = controller;
|
|
30
39
|
}, {
|
|
31
40
|
highWaterMark: options.highWaterMark ?? 16 * 1024,
|
|
32
41
|
size(chunk) { return chunk.byteLength; }
|
|
33
|
-
});
|
|
42
|
+
}));
|
|
34
43
|
this.writable = pipeFrom(this._factory.createWritable({
|
|
35
44
|
write: async (chunk) => {
|
|
36
45
|
// Wait for an ack packet
|
|
@@ -38,38 +47,43 @@ export class AdbSocket {
|
|
|
38
47
|
await this.dispatcher.sendPacket(AdbCommand.Write, this.localId, this.remoteId, chunk);
|
|
39
48
|
await this._writePromise.promise;
|
|
40
49
|
},
|
|
41
|
-
}), new ChunkStream(this.dispatcher.maxPayloadSize));
|
|
50
|
+
}), new ChunkStream(this.dispatcher.options.maxPayloadSize));
|
|
51
|
+
this._socket = new AdbSocket(this);
|
|
42
52
|
}
|
|
43
|
-
/**
|
|
44
|
-
* @internal
|
|
45
|
-
*/
|
|
46
53
|
async enqueue(packet) {
|
|
47
54
|
await this._readableController.enqueue(packet);
|
|
48
55
|
}
|
|
49
|
-
/**
|
|
50
|
-
* @internal
|
|
51
|
-
*/
|
|
52
56
|
ack() {
|
|
53
57
|
this._writePromise?.resolve();
|
|
54
58
|
}
|
|
55
59
|
async close() {
|
|
56
|
-
|
|
57
|
-
this._writePromise?.reject(new Error('Socket closed'));
|
|
58
|
-
if (!this._closed) {
|
|
59
|
-
this._closed = true;
|
|
60
|
-
// Only send close packet when `close` is called before `dispose`
|
|
61
|
-
// (the client initiated the close)
|
|
62
|
-
await this.dispatcher.sendPacket(AdbCommand.Close, this.localId, this.remoteId);
|
|
63
|
-
}
|
|
60
|
+
this._factory.close();
|
|
64
61
|
}
|
|
65
|
-
/**
|
|
66
|
-
* @internal
|
|
67
|
-
*/
|
|
68
62
|
dispose() {
|
|
69
|
-
this.
|
|
70
|
-
|
|
71
|
-
|
|
72
|
-
|
|
63
|
+
this._factory.dispose();
|
|
64
|
+
}
|
|
65
|
+
}
|
|
66
|
+
/**
|
|
67
|
+
* AdbSocket is a duplex stream.
|
|
68
|
+
*
|
|
69
|
+
* To close it, call either `socket.close()`,
|
|
70
|
+
* `socket.readable.cancel()`, `socket.readable.getReader().cancel()`,
|
|
71
|
+
* `socket.writable.abort()`, `socket.writable.getWriter().abort()`,
|
|
72
|
+
* `socket.writable.close()` or `socket.writable.getWriter().close()`.
|
|
73
|
+
*/
|
|
74
|
+
export class AdbSocket {
|
|
75
|
+
_controller;
|
|
76
|
+
get localId() { return this._controller.localId; }
|
|
77
|
+
get remoteId() { return this._controller.remoteId; }
|
|
78
|
+
get localCreated() { return this._controller.localCreated; }
|
|
79
|
+
get serviceString() { return this._controller.serviceString; }
|
|
80
|
+
get readable() { return this._controller.readable; }
|
|
81
|
+
get writable() { return this._controller.writable; }
|
|
82
|
+
constructor(controller) {
|
|
83
|
+
this._controller = controller;
|
|
84
|
+
}
|
|
85
|
+
close() {
|
|
86
|
+
return this._controller.close();
|
|
73
87
|
}
|
|
74
88
|
}
|
|
75
89
|
//# sourceMappingURL=socket.js.map
|
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/detect.d.ts
CHANGED
|
@@ -1,18 +1,2 @@
|
|
|
1
|
-
|
|
2
|
-
export * from 'web-streams-polyfill';
|
|
3
|
-
/** A controller object that allows you to abort one or more DOM requests as and when desired. */
|
|
4
|
-
export interface AbortController {
|
|
5
|
-
/**
|
|
6
|
-
* Returns the AbortSignal object associated with this object.
|
|
7
|
-
*/
|
|
8
|
-
readonly signal: AbortSignal;
|
|
9
|
-
/**
|
|
10
|
-
* Invoking this method will set this object's AbortSignal's aborted flag and signal to any observers that the associated activity is to be aborted.
|
|
11
|
-
*/
|
|
12
|
-
abort(): void;
|
|
13
|
-
}
|
|
14
|
-
export declare let AbortController: {
|
|
15
|
-
prototype: AbortController;
|
|
16
|
-
new (): AbortController;
|
|
17
|
-
};
|
|
1
|
+
export * from './detect.polyfill.js';
|
|
18
2
|
//# sourceMappingURL=detect.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"detect.d.ts","sourceRoot":"","sources":["../../src/stream/detect.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"detect.d.ts","sourceRoot":"","sources":["../../src/stream/detect.ts"],"names":[],"mappings":"AAIA,cAAc,sBAAsB,CAAC"}
|
package/esm/stream/detect.js
CHANGED
|
@@ -1,6 +1,5 @@
|
|
|
1
|
-
// cspell: ignore
|
|
2
|
-
//
|
|
3
|
-
|
|
4
|
-
export
|
|
5
|
-
({ AbortController } = globalThis);
|
|
1
|
+
// cspell: ignore vercel
|
|
2
|
+
// Always use polyfilled version because
|
|
3
|
+
// Vercel doesn't support Node.js 16 (`streams/web` module) yet
|
|
4
|
+
export * from './detect.polyfill.js';
|
|
6
5
|
//# sourceMappingURL=detect.js.map
|
package/esm/stream/detect.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"detect.js","sourceRoot":"","sources":["../../src/stream/detect.ts"],"names":[],"mappings":"AAAA,
|
|
1
|
+
{"version":3,"file":"detect.js","sourceRoot":"","sources":["../../src/stream/detect.ts"],"names":[],"mappings":"AAAA,wBAAwB;AAExB,wCAAwC;AACxC,+DAA+D;AAC/D,cAAc,sBAAsB,CAAC"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"detect.polyfill.d.ts","sourceRoot":"","sources":["../../src/stream/detect.polyfill.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,sBAAsB,CAAC;
|
|
1
|
+
{"version":3,"file":"detect.polyfill.d.ts","sourceRoot":"","sources":["../../src/stream/detect.polyfill.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,sBAAsB,CAAC;AAKxD,cAAc,sBAAsB,CAAC;AAErC,iGAAiG;AACjG,MAAM,WAAW,eAAe;IAC5B;;OAEG;IAEH,QAAQ,CAAC,MAAM,EAAE,WAAW,CAAC;IAC7B;;OAEG;IACH,KAAK,IAAI,IAAI,CAAC;CACjB;AAED,eAAO,IAAI,eAAe,EAAE;IACxB,SAAS,EAAE,eAAe,CAAC;IAC3B,QAAO,eAAe,CAAC;CAC1B,CAAC"}
|