@yume-chan/adb 3.0.0-beta.0 → 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.
Files changed (134) hide show
  1. package/esm/adb.d.ts +7 -2
  2. package/esm/adb.d.ts.map +1 -1
  3. package/esm/adb.js +2 -2
  4. package/esm/adb.js.map +1 -1
  5. package/esm/banner.spec.d.ts +2 -0
  6. package/esm/banner.spec.d.ts.map +1 -0
  7. package/esm/daemon/auth/packet-processor.spec.d.ts +2 -0
  8. package/esm/daemon/auth/packet-processor.spec.d.ts.map +1 -0
  9. package/esm/daemon/auth/public-key.spec.d.ts +2 -0
  10. package/esm/daemon/auth/public-key.spec.d.ts.map +1 -0
  11. package/esm/daemon/crypto.spec.d.ts +2 -0
  12. package/esm/daemon/crypto.spec.d.ts.map +1 -0
  13. package/esm/server/client.d.ts +4 -3
  14. package/esm/server/client.d.ts.map +1 -1
  15. package/esm/server/client.js +13 -12
  16. package/esm/server/client.js.map +1 -1
  17. package/esm/server/client.spec.d.ts +2 -0
  18. package/esm/server/client.spec.d.ts.map +1 -0
  19. package/esm/server/transport.d.ts +1 -1
  20. package/esm/server/transport.d.ts.map +1 -1
  21. package/esm/server/transport.js +2 -2
  22. package/esm/server/transport.js.map +1 -1
  23. package/esm/service/reverse/response.spec.d.ts +2 -0
  24. package/esm/service/reverse/response.spec.d.ts.map +1 -0
  25. package/esm/service/subprocess/none/process.spec.d.ts +2 -0
  26. package/esm/service/subprocess/none/process.spec.d.ts.map +1 -0
  27. package/esm/service/subprocess/none/spawner.d.ts.map +1 -1
  28. package/esm/service/subprocess/none/spawner.js +10 -5
  29. package/esm/service/subprocess/none/spawner.js.map +1 -1
  30. package/esm/service/subprocess/none/spawner.spec.d.ts +2 -0
  31. package/esm/service/subprocess/none/spawner.spec.d.ts.map +1 -0
  32. package/esm/service/subprocess/shell/process.d.ts.map +1 -1
  33. package/esm/service/subprocess/shell/process.js +7 -9
  34. package/esm/service/subprocess/shell/process.js.map +1 -1
  35. package/esm/service/subprocess/shell/process.spec.d.ts +2 -0
  36. package/esm/service/subprocess/shell/process.spec.d.ts.map +1 -0
  37. package/esm/service/subprocess/shell/shared.spec.d.ts +2 -0
  38. package/esm/service/subprocess/shell/shared.spec.d.ts.map +1 -0
  39. package/esm/service/subprocess/shell/spawner.d.ts.map +1 -1
  40. package/esm/service/subprocess/shell/spawner.js +16 -11
  41. package/esm/service/subprocess/shell/spawner.js.map +1 -1
  42. package/esm/service/subprocess/shell/spawner.spec.d.ts +2 -0
  43. package/esm/service/subprocess/shell/spawner.spec.d.ts.map +1 -0
  44. package/esm/service/subprocess/utils.spec.d.ts +2 -0
  45. package/esm/service/subprocess/utils.spec.d.ts.map +1 -0
  46. package/esm/service/sync/compression/adapters.d.ts +16 -0
  47. package/esm/service/sync/compression/adapters.d.ts.map +1 -0
  48. package/esm/service/sync/compression/adapters.js +84 -0
  49. package/esm/service/sync/compression/adapters.js.map +1 -0
  50. package/esm/service/sync/compression/format-ns.d.ts.map +1 -1
  51. package/esm/service/sync/compression/format-ns.js +1 -0
  52. package/esm/service/sync/compression/format-ns.js.map +1 -1
  53. package/esm/service/sync/compression/format.d.ts +1 -0
  54. package/esm/service/sync/compression/format.d.ts.map +1 -1
  55. package/esm/service/sync/compression/format.js +1 -0
  56. package/esm/service/sync/compression/format.js.map +1 -1
  57. package/esm/service/sync/compression/index.d.ts +1 -1
  58. package/esm/service/sync/compression/index.d.ts.map +1 -1
  59. package/esm/service/sync/compression/index.js +1 -1
  60. package/esm/service/sync/compression/index.js.map +1 -1
  61. package/esm/service/sync/compression/mode.d.ts +6 -0
  62. package/esm/service/sync/compression/mode.d.ts.map +1 -0
  63. package/esm/service/sync/compression/mode.js +5 -0
  64. package/esm/service/sync/compression/mode.js.map +1 -0
  65. package/esm/service/sync/compression/native.d.ts +8 -0
  66. package/esm/service/sync/compression/native.d.ts.map +1 -0
  67. package/esm/service/sync/compression/native.js +53 -0
  68. package/esm/service/sync/compression/native.js.map +1 -0
  69. package/esm/service/sync/id/request.d.ts +1 -0
  70. package/esm/service/sync/id/request.d.ts.map +1 -1
  71. package/esm/service/sync/id/request.js +1 -0
  72. package/esm/service/sync/id/request.js.map +1 -1
  73. package/esm/service/sync/request/flag.d.ts +9 -0
  74. package/esm/service/sync/request/flag.d.ts.map +1 -0
  75. package/esm/service/sync/request/flag.js +8 -0
  76. package/esm/service/sync/request/flag.js.map +1 -0
  77. package/esm/service/sync/request/pull.d.ts +25 -2
  78. package/esm/service/sync/request/pull.d.ts.map +1 -1
  79. package/esm/service/sync/request/pull.js +76 -16
  80. package/esm/service/sync/request/pull.js.map +1 -1
  81. package/esm/service/sync/request/push.d.ts +36 -14
  82. package/esm/service/sync/request/push.d.ts.map +1 -1
  83. package/esm/service/sync/request/push.js +176 -60
  84. package/esm/service/sync/request/push.js.map +1 -1
  85. package/esm/service/sync/service.d.ts +32 -16
  86. package/esm/service/sync/service.d.ts.map +1 -1
  87. package/esm/service/sync/service.js +58 -13
  88. package/esm/service/sync/service.js.map +1 -1
  89. package/esm/service/sync/socket-pool.d.ts +1 -0
  90. package/esm/service/sync/socket-pool.d.ts.map +1 -1
  91. package/esm/service/sync/socket-pool.js +45 -9
  92. package/esm/service/sync/socket-pool.js.map +1 -1
  93. package/esm/service/sync/socket-pool.spec.d.ts +2 -0
  94. package/esm/service/sync/socket-pool.spec.d.ts.map +1 -0
  95. package/esm/service/sync/socket.d.ts +4 -0
  96. package/esm/service/sync/socket.d.ts.map +1 -1
  97. package/esm/service/sync/socket.js +16 -0
  98. package/esm/service/sync/socket.js.map +1 -1
  99. package/esm/service/sync/socket.spec.d.ts +2 -0
  100. package/esm/service/sync/socket.spec.d.ts.map +1 -0
  101. package/esm/utils/base64.spec.d.ts +2 -0
  102. package/esm/utils/base64.spec.d.ts.map +1 -0
  103. package/esm/utils/md5.spec.d.ts +2 -0
  104. package/esm/utils/md5.spec.d.ts.map +1 -0
  105. package/esm/utils/ref.d.ts +3 -5
  106. package/esm/utils/ref.d.ts.map +1 -1
  107. package/esm/utils/ref.js +12 -6
  108. package/esm/utils/ref.js.map +1 -1
  109. package/package.json +7 -7
  110. package/src/adb.ts +15 -3
  111. package/src/server/client.ts +18 -11
  112. package/src/server/transport.ts +5 -1
  113. package/src/service/subprocess/none/spawner.ts +9 -5
  114. package/src/service/subprocess/shell/process.ts +7 -10
  115. package/src/service/subprocess/shell/spawner.ts +15 -11
  116. package/src/service/sync/compression/adapters.ts +137 -0
  117. package/src/service/sync/compression/format-ns.ts +2 -0
  118. package/src/service/sync/compression/format.ts +5 -0
  119. package/src/service/sync/compression/index.ts +1 -1
  120. package/src/service/sync/compression/mode.ts +6 -0
  121. package/src/service/sync/compression/native.ts +73 -0
  122. package/src/service/sync/id/request.ts +1 -0
  123. package/src/service/sync/request/flag.ts +9 -0
  124. package/src/service/sync/request/pull.ts +135 -27
  125. package/src/service/sync/request/push.ts +241 -91
  126. package/src/service/sync/service.ts +87 -27
  127. package/src/service/sync/socket-pool.ts +50 -9
  128. package/src/service/sync/socket.ts +23 -1
  129. package/src/utils/ref.ts +17 -7
  130. package/esm/service/sync/compression/compression.d.ts +0 -17
  131. package/esm/service/sync/compression/compression.d.ts.map +0 -1
  132. package/esm/service/sync/compression/compression.js +0 -92
  133. package/esm/service/sync/compression/compression.js.map +0 -1
  134. package/src/service/sync/compression/compression.ts +0 -126
@@ -1,83 +1,199 @@
1
- import { AbortController, DistributionStream, MaybeConsumable, } from "@yume-chan/stream-extra";
1
+ import { PromiseResolver } from "@yume-chan/async";
2
+ import { DistributionStream, MaybeConsumable } from "@yume-chan/stream-extra";
2
3
  import { struct, u32 } from "@yume-chan/struct";
3
- import { NOOP } from "../../../utils/index.js";
4
+ import { NOOP } from "../../../utils/no-op.js";
4
5
  import { LinuxFileType } from "../android.js";
5
6
  import { Compression } from "../compression/index.js";
6
7
  import { RequestId, ResponseId } from "../id/index.js";
7
8
  import { Error as AdbSyncError } from "../socket.js";
9
+ import { SyncFlag } from "./flag.js";
8
10
  export const MaxPacketSize = 64 * 1024;
9
11
  export const OkResponse = struct({ unused: u32 }, { littleEndian: true });
10
- // eslint-disable-next-line @typescript-eslint/max-params
11
- async function pipeFileData(socket, file, packetSize, mtime, compression) {
12
- if (compression !== Compression.Format.None) {
13
- const stream = Compression.createCompressionStream(compression);
14
- void file
15
- .pipeTo(new MaybeConsumable.WrapWritableStream(stream.writable))
16
- .catch(NOOP);
17
- file = stream.readable;
12
+ class SendWritableStream extends MaybeConsumable.WritableStream {
13
+ #pool;
14
+ #socket;
15
+ #resolver = new PromiseResolver();
16
+ #controller;
17
+ #bytesWritten = 0;
18
+ get bytesWritten() {
19
+ return this.#bytesWritten;
18
20
  }
19
- // Read and write in parallel,
20
- // allow error response to abort the write.
21
- const abortController = new AbortController();
22
- file.pipeThrough(new DistributionStream(packetSize, true))
23
- .pipeTo(new MaybeConsumable.WritableStream({
24
- write(chunk) {
25
- return socket.writeRequest(RequestId.Data, chunk);
26
- },
27
- }), { signal: abortController.signal })
28
- .then(async () => {
29
- await socket.writeRequest(RequestId.Done, mtime);
30
- await socket.flush();
31
- }, NOOP);
21
+ constructor(pool, socket, mtime) {
22
+ let controller;
23
+ super({
24
+ start: (controller_) => {
25
+ controller = controller_;
26
+ // Start reading response immediately,
27
+ // the server can send error response before the whole file is sent.
28
+ socket.readResponse(ResponseId.Ok, OkResponse).then(() => this.#finish(), (e) => this.#finish(e));
29
+ },
30
+ write: async (chunk) => {
31
+ try {
32
+ this.#bytesWritten += chunk.length;
33
+ await socket.writeRequest(RequestId.Data, chunk);
34
+ }
35
+ catch (e) {
36
+ await this.#finish(e);
37
+ }
38
+ },
39
+ close: async () => {
40
+ try {
41
+ await socket.writeRequest(RequestId.Done, mtime);
42
+ await socket.flush();
43
+ }
44
+ catch (e) {
45
+ await this.#finish(e);
46
+ return;
47
+ }
48
+ await this.#resolver.promise;
49
+ },
50
+ abort: async (reason) => {
51
+ // Write anything other than `Data` or `Done`
52
+ // will cause the server to delete the file.
53
+ await socket.writeRequest(ResponseId.Fail, 0);
54
+ // Socket not reusable after aborting, so discard it.
55
+ await this.#finish(reason);
56
+ },
57
+ });
58
+ this.#pool = pool;
59
+ this.#socket = socket;
60
+ this.#controller = controller;
61
+ // Suppress unhandled rejection warning when the promise is not awaited.
62
+ this.#resolver.promise.catch(NOOP);
63
+ }
64
+ #trySetError(reason) {
65
+ try {
66
+ this.#controller.error(reason);
67
+ }
68
+ catch {
69
+ // Ignore if controller is already closed or errored
70
+ }
71
+ }
72
+ async #finish(error) {
73
+ try {
74
+ await this.#pool.release(this.#socket, !(error instanceof AdbSyncError));
75
+ if (error) {
76
+ this.#trySetError(error);
77
+ this.#resolver.reject(error);
78
+ }
79
+ else {
80
+ this.#resolver.resolve();
81
+ }
82
+ }
83
+ catch (e) {
84
+ // TOOD: use `SuppressedError` when universally supported
85
+ this.#trySetError(e);
86
+ this.#resolver.reject(e);
87
+ }
88
+ }
89
+ }
90
+ export async function sendV1({ pool, path, type = LinuxFileType.File, permission = 0o666, mtime = (Date.now() / 1000) | 0, packetSize = MaxPacketSize, }) {
91
+ const mode = (type << 12) | permission;
92
+ const request = path + "," + mode;
93
+ const socket = await pool.acquire();
32
94
  try {
33
- await socket.readResponse(ResponseId.Ok, OkResponse);
95
+ await socket.writeRequest(RequestId.Send, request);
34
96
  }
35
97
  catch (e) {
36
- abortController.abort(e);
98
+ await pool.release(socket, !(e instanceof AdbSyncError));
37
99
  throw e;
38
100
  }
101
+ const distributeStream = new DistributionStream(packetSize, true);
102
+ const sendStream = new SendWritableStream(pool, socket, mtime);
103
+ void distributeStream.readable.pipeTo(sendStream).catch(NOOP);
104
+ return {
105
+ writable: distributeStream.writable,
106
+ get bytesWritten() {
107
+ return sendStream.bytesWritten;
108
+ },
109
+ get bytesCompressed() {
110
+ return sendStream.bytesWritten;
111
+ },
112
+ };
39
113
  }
40
- export function sendV1({ pool, filename, file, type = LinuxFileType.File, permission = 0o666, mtime = (Date.now() / 1000) | 0, packetSize = MaxPacketSize, }) {
41
- return pool.withSocket(async (socket) => {
42
- const mode = (type << 12) | permission;
43
- const pathAndMode = `${filename},${mode.toString()}`;
44
- await socket.writeRequest(RequestId.Send, pathAndMode);
45
- await pipeFileData(socket, file, packetSize, mtime, Compression.Format.None);
46
- });
47
- }
48
- export const SendV2Flags = {
49
- None: 0,
50
- Brotli: 1,
51
- Lz4: 2,
52
- Zstd: 4,
53
- DryRun: 0x80000000,
54
- };
55
114
  export const SendV2Request = struct({ id: u32, mode: u32, flags: u32 }, { littleEndian: true });
56
- export function sendV2({ pool, filename, file, type = LinuxFileType.File, permission = 0o666, mtime = (Date.now() / 1000) | 0, packetSize = MaxPacketSize, compression = Compression.Format.None, dryRun = false, }) {
57
- return pool.withSocket(async (socket) => {
58
- let flags = SendV2Flags.None;
59
- switch (compression) {
60
- case Compression.Format.Brotli:
61
- flags |= SendV2Flags.Brotli;
62
- break;
63
- case Compression.Format.Lz4:
64
- flags |= SendV2Flags.Lz4;
65
- break;
66
- case Compression.Format.Zstd:
67
- flags |= SendV2Flags.Zstd;
68
- break;
69
- }
70
- if (dryRun) {
71
- flags |= SendV2Flags.DryRun;
72
- }
73
- await socket.writeRequest(RequestId.SendV2, filename);
115
+ export async function sendV2({ pool, path, type = LinuxFileType.File, permission = 0o666, mtime = (Date.now() / 1000) | 0, packetSize = MaxPacketSize, compression = Compression.Format.None, dryRun = false, }) {
116
+ let flags = SyncFlag.None;
117
+ let compressStream;
118
+ // Validate `compression` before acquiring the socket
119
+ switch (compression) {
120
+ case Compression.Format.Brotli:
121
+ flags |= SyncFlag.Brotli;
122
+ compressStream = Compression.createCompressionStream(Compression.Format.Brotli);
123
+ break;
124
+ case Compression.Format.Lz4:
125
+ flags |= SyncFlag.Lz4;
126
+ compressStream = Compression.createCompressionStream(Compression.Format.Lz4);
127
+ break;
128
+ case Compression.Format.Zstd:
129
+ flags |= SyncFlag.Zstd;
130
+ compressStream = Compression.createCompressionStream(Compression.Format.Zstd);
131
+ break;
132
+ }
133
+ if (dryRun) {
134
+ flags |= SyncFlag.DryRun;
135
+ }
136
+ const socket = await pool.acquire();
137
+ try {
138
+ await socket.writeRequest(RequestId.SendV2, path);
74
139
  await socket.write(SendV2Request.serialize({
75
140
  id: RequestId.SendV2,
76
141
  mode: (type << 12) | permission,
77
142
  flags,
78
143
  }));
79
- await pipeFileData(socket, file, packetSize, mtime, compression);
80
- });
144
+ }
145
+ catch (e) {
146
+ await pool.release(socket, !(e instanceof AdbSyncError));
147
+ throw e;
148
+ }
149
+ const distributeStream = new DistributionStream(packetSize, true);
150
+ const sendStream = new SendWritableStream(pool, socket, mtime);
151
+ if (!compressStream) {
152
+ const pipe = distributeStream.readable.pipeTo(sendStream);
153
+ const writer = distributeStream.writable.getWriter();
154
+ return {
155
+ writable: new MaybeConsumable.WritableStream({
156
+ write(chunk) {
157
+ return writer.write(chunk);
158
+ },
159
+ async close() {
160
+ await writer.close();
161
+ await pipe;
162
+ },
163
+ }),
164
+ get bytesWritten() {
165
+ return sendStream.bytesWritten;
166
+ },
167
+ compression: Compression.Format.None,
168
+ get bytesCompressed() {
169
+ return sendStream.bytesWritten;
170
+ },
171
+ };
172
+ }
173
+ const pipe = compressStream.readable
174
+ .pipeThrough(distributeStream)
175
+ .pipeTo(sendStream);
176
+ const writer = compressStream.writable.getWriter();
177
+ let bytesWritten = 0;
178
+ return {
179
+ writable: new MaybeConsumable.WritableStream({
180
+ write(chunk) {
181
+ bytesWritten += chunk.length;
182
+ return writer.write(chunk);
183
+ },
184
+ async close() {
185
+ await writer.close();
186
+ await pipe;
187
+ },
188
+ }),
189
+ get bytesWritten() {
190
+ return bytesWritten;
191
+ },
192
+ compression,
193
+ get bytesCompressed() {
194
+ return sendStream.bytesWritten;
195
+ },
196
+ };
81
197
  }
82
198
  export function send(options) {
83
199
  if (options.version === 2) {
@@ -1 +1 @@
1
- {"version":3,"file":"push.js","sourceRoot":"","sources":["../../../../src/service/sync/request/push.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"push.js","sourceRoot":"","sources":["../../../../src/service/sync/request/push.ts"],"names":[],"mappings":"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"}
@@ -1,8 +1,9 @@
1
- import type { AbortSignal, MaybeConsumable, ReadableStream } from "@yume-chan/stream-extra";
1
+ import type { AbortSignal, ReadableStream } from "@yume-chan/stream-extra";
2
+ import { MaybeConsumable } from "@yume-chan/stream-extra";
2
3
  import type { Adb } from "../../adb.js";
3
4
  import type { LinuxFileType } from "./android.js";
4
5
  import { Compression } from "./compression/index.js";
5
- import { OpenDir, Stat } from "./request/index.js";
6
+ import { OpenDir, Receive, Send, Stat } from "./request/index.js";
6
7
  import type { Socket } from "./socket.js";
7
8
  export interface ServiceOptions {
8
9
  /**
@@ -29,20 +30,20 @@ export interface ServiceOptions {
29
30
  */
30
31
  export declare function dirname(path: string): string;
31
32
  export interface WriteOptions {
32
- filename: string;
33
- file: ReadableStream<MaybeConsumable<Uint8Array>>;
33
+ path: string;
34
34
  type?: LinuxFileType | undefined;
35
35
  permission?: number | undefined;
36
36
  mtime?: number | undefined;
37
37
  /**
38
38
  * The format to compress the file stream for sending.
39
39
  *
40
- * If the device doesn't support compressed sending, it will be ignored.
40
+ * If the device doesn't support compressed sending, the value will be ignored.
41
41
  *
42
- * If the device or current runtime doesn't support the specified format,
42
+ * Otherwise, if the device or current runtime doesn't support the specified format,
43
43
  * an Error will be thrown.
44
- * {@link Compression.canUseFormat} can be used to check if
45
- * the device and current runtime both supports the format.
44
+ *
45
+ * If `undefined` is specified, automatically choose the best format
46
+ * supported by both device and current runtime.
46
47
  */
47
48
  compression?: Compression.Format | undefined;
48
49
  dryRun?: boolean | undefined;
@@ -107,17 +108,32 @@ export declare class Service {
107
108
  opendir(path: string): AsyncGenerator<OpenDir.Entry, void, void>;
108
109
  readdir(path: string): Promise<OpenDir.Entry[]>;
109
110
  /**
110
- * Reads the content of a file on device.
111
- *
112
- * @param filename The full path of the file on device to read.
113
- * @returns A `ReadableStream` that contains the file content.
111
+ * Creates a readable stream to read the content of a file on device.
112
+ * @param path The full path of the file on device to read.
113
+ * @param compression The compression format to use for reading the file. If the device doesn't support compressed reading, the value will be ignored.
114
+ * @returns A {@link Receive.ReceiveSession} object that contains a readable stream to read the file content.
114
115
  */
115
- read(filename: string): ReadableStream<Uint8Array>;
116
+ createReadable(path: string, compression?: Compression.Format): Receive.ReceiveSession;
116
117
  /**
117
- * Writes a file on device. If the file name already exists, it will be overwritten.
118
+ * Creates a readable stream to read the content of a file on device.
118
119
  *
119
- * @param options The content and options of the file to write.
120
+ * @param path The full path of the file on device to read.
121
+ * @returns A readable stream to read the file content.
122
+ */
123
+ read(path: string): ReadableStream<Uint8Array>;
124
+ /**
125
+ * Creates a writable stream to write a file
126
+ * @param options The options for writing the file, including the path, type, permission, mtime, and compression format.
127
+ * @returns A {@link SendSession} object that contains a writable stream to write the file content.
128
+ */
129
+ createWritable(options: WriteOptions): Promise<Send.SendSession>;
130
+ /**
131
+ * Writes a file to the device using a readable stream.
132
+ * @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.
133
+ * @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).
120
134
  */
121
- write(options: WriteOptions): Promise<void>;
135
+ write(options: WriteOptions & {
136
+ readable: ReadableStream<MaybeConsumable<Uint8Array>>;
137
+ }): Promise<Omit<Send.SendSession, "writable">>;
122
138
  }
123
139
  //# sourceMappingURL=service.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"service.d.ts","sourceRoot":"","sources":["../../../src/service/sync/service.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EACR,WAAW,EACX,eAAe,EACf,cAAc,EACjB,MAAM,yBAAyB,CAAC;AAEjC,OAAO,KAAK,EAAE,GAAG,EAAE,MAAM,cAAc,CAAC;AAIxC,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,cAAc,CAAC;AAClD,OAAO,EAAE,WAAW,EAAE,MAAM,wBAAwB,CAAC;AACrD,OAAO,EAAE,OAAO,EAAiB,IAAI,EAAE,MAAM,oBAAoB,CAAC;AAElE,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,aAAa,CAAC;AAG1C,MAAM,WAAW,cAAc;IAC3B;;;;OAIG;IACH,WAAW,CAAC,EAAE,MAAM,GAAG,SAAS,CAAC;IAEjC;;;;OAIG;IACH,WAAW,CAAC,EAAE,MAAM,GAAG,SAAS,CAAC;IAEjC;;OAEG;IACH,MAAM,CAAC,EAAE,WAAW,GAAG,SAAS,CAAC;CACpC;AAED;;;;GAIG;AACH,wBAAgB,OAAO,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,CAS5C;AAED,MAAM,WAAW,YAAY;IACzB,QAAQ,EAAE,MAAM,CAAC;IACjB,IAAI,EAAE,cAAc,CAAC,eAAe,CAAC,UAAU,CAAC,CAAC,CAAC;IAClD,IAAI,CAAC,EAAE,aAAa,GAAG,SAAS,CAAC;IACjC,UAAU,CAAC,EAAE,MAAM,GAAG,SAAS,CAAC;IAChC,KAAK,CAAC,EAAE,MAAM,GAAG,SAAS,CAAC;IAC3B;;;;;;;;;OASG;IACH,WAAW,CAAC,EAAE,WAAW,CAAC,MAAM,GAAG,SAAS,CAAC;IAC7C,MAAM,CAAC,EAAE,OAAO,GAAG,SAAS,CAAC;CAChC;AAED,qBAAa,OAAO;;IAChB,SAAS,CAAC,IAAI,EAAE,GAAG,CAAC;IASpB,IAAI,aAAa,IAAI,OAAO,CAE3B;IAED,IAAI,WAAW,IAAI,OAAO,CAEzB;IAED,IAAI,cAAc,IAAI,OAAO,CAE5B;IAED,IAAI,oBAAoB,IAAI,OAAO,CAElC;IAED,IAAI,uBAAuB,IAAI,OAAO,CAErC;gBAEW,GAAG,EAAE,GAAG,EAAE,OAAO,CAAC,EAAE,cAAc;IAsB9C;;;;;;OAMG;IACG,aAAa;IAInB;;;;;OAKG;IACG,aAAa,CAAC,MAAM,EAAE,MAAM,EAAE,OAAO,UAAQ;IAInD;;;;OAIG;IACH,KAAK,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,IAAI,CAAC;IAMvC;;;;OAIG;IACH,IAAI,CAAC,IAAI,EAAE,MAAM;;;;;;;;;;;;;;;;IAQjB;;;;OAIG;IACG,WAAW,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC;IAajD,OAAO,CAAC,IAAI,EAAE,MAAM,GAAG,cAAc,CAAC,OAAO,CAAC,KAAK,EAAE,IAAI,EAAE,IAAI,CAAC;IAM1D,OAAO,CAAC,IAAI,EAAE,MAAM;IAS1B;;;;;OAKG;IACH,IAAI,CAAC,QAAQ,EAAE,MAAM,GAAG,cAAc,CAAC,UAAU,CAAC;IAIlD;;;;OAIG;IACG,KAAK,CAAC,OAAO,EAAE,YAAY,GAAG,OAAO,CAAC,IAAI,CAAC;CAmCpD"}
1
+ {"version":3,"file":"service.d.ts","sourceRoot":"","sources":["../../../src/service/sync/service.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,WAAW,EAAE,cAAc,EAAE,MAAM,yBAAyB,CAAC;AAC3E,OAAO,EAAE,eAAe,EAAE,MAAM,yBAAyB,CAAC;AAE1D,OAAO,KAAK,EAAE,GAAG,EAAE,MAAM,cAAc,CAAC;AAIxC,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,cAAc,CAAC;AAClD,OAAO,EAAE,WAAW,EAAE,MAAM,wBAAwB,CAAC;AACrD,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,IAAI,EAAE,IAAI,EAAE,MAAM,oBAAoB,CAAC;AAElE,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,aAAa,CAAC;AAG1C,MAAM,WAAW,cAAc;IAC3B;;;;OAIG;IACH,WAAW,CAAC,EAAE,MAAM,GAAG,SAAS,CAAC;IAEjC;;;;OAIG;IACH,WAAW,CAAC,EAAE,MAAM,GAAG,SAAS,CAAC;IAEjC;;OAEG;IACH,MAAM,CAAC,EAAE,WAAW,GAAG,SAAS,CAAC;CACpC;AAED;;;;GAIG;AACH,wBAAgB,OAAO,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,CAS5C;AAED,MAAM,WAAW,YAAY;IACzB,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,CAAC,EAAE,aAAa,GAAG,SAAS,CAAC;IACjC,UAAU,CAAC,EAAE,MAAM,GAAG,SAAS,CAAC;IAChC,KAAK,CAAC,EAAE,MAAM,GAAG,SAAS,CAAC;IAC3B;;;;;;;;;;OAUG;IACH,WAAW,CAAC,EAAE,WAAW,CAAC,MAAM,GAAG,SAAS,CAAC;IAC7C,MAAM,CAAC,EAAE,OAAO,GAAG,SAAS,CAAC;CAChC;AAED,qBAAa,OAAO;;IAChB,SAAS,CAAC,IAAI,EAAE,GAAG,CAAC;IASpB,IAAI,aAAa,IAAI,OAAO,CAE3B;IAED,IAAI,WAAW,IAAI,OAAO,CAEzB;IAED,IAAI,cAAc,IAAI,OAAO,CAE5B;IAED,IAAI,oBAAoB,IAAI,OAAO,CAElC;IAED,IAAI,uBAAuB,IAAI,OAAO,CAErC;gBAEW,GAAG,EAAE,GAAG,EAAE,OAAO,CAAC,EAAE,cAAc;IAsB9C;;;;;;OAMG;IACG,aAAa;IAInB;;;;;OAKG;IACG,aAAa,CAAC,MAAM,EAAE,MAAM,EAAE,OAAO,UAAQ;IAInD;;;;OAIG;IACH,KAAK,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,IAAI,CAAC;IAMvC;;;;OAIG;IACH,IAAI,CAAC,IAAI,EAAE,MAAM;;;;;;;;;;;;;;;;IAQjB;;;;OAIG;IACG,WAAW,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC;IAajD,OAAO,CAAC,IAAI,EAAE,MAAM,GAAG,cAAc,CAAC,OAAO,CAAC,KAAK,EAAE,IAAI,EAAE,IAAI,CAAC;IAM1D,OAAO,CAAC,IAAI,EAAE,MAAM;IAS1B;;;;;OAKG;IACH,cAAc,CACV,IAAI,EAAE,MAAM,EACZ,WAAW,CAAC,EAAE,WAAW,CAAC,MAAM,GACjC,OAAO,CAAC,cAAc;IAwBzB;;;;;OAKG;IACH,IAAI,CAAC,IAAI,EAAE,MAAM,GAAG,cAAc,CAAC,UAAU,CAAC;IAK9C;;;;OAIG;IACG,cAAc,CAAC,OAAO,EAAE,YAAY,GAAG,OAAO,CAAC,IAAI,CAAC,WAAW,CAAC;IA4CtE;;;;OAIG;IACG,KAAK,CACP,OAAO,EAAE,YAAY,GAAG;QACpB,QAAQ,EAAE,cAAc,CAAC,eAAe,CAAC,UAAU,CAAC,CAAC,CAAC;KACzD,GACF,OAAO,CAAC,IAAI,CAAC,IAAI,CAAC,WAAW,EAAE,UAAU,CAAC,CAAC;CAWjD"}
@@ -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
- * Reads the content of a file on device.
134
- *
135
- * @param filename The full path of the file on device to read.
136
- * @returns A `ReadableStream` that contains the file content.
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
- read(filename) {
139
- return Receive.stream(this.#socketPool, filename);
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
- * Writes a file on device. If the file name already exists, it will be overwritten.
154
+ * Creates a readable stream to read the content of a file on device.
143
155
  *
144
- * @param options The content and options of the file to write.
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
- async write(options) {
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.filename))])
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.compression = Compression.chooseFormat(this._adb, Compression.Mode.Compress);
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
- await Send.send({
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":"AAOA,OAAO,EAAE,UAAU,EAAE,MAAM,mBAAmB,CAAC;AAC/C,OAAO,EAAE,SAAS,EAAE,MAAM,wBAAwB,CAAC;AAGnD,OAAO,EAAE,WAAW,EAAE,MAAM,wBAAwB,CAAC;AACrD,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,IAAI,EAAE,IAAI,EAAE,MAAM,oBAAoB,CAAC;AAClE,OAAO,EAAE,UAAU,EAAE,MAAM,kBAAkB,CAAC;AAE9C,OAAO,EAAE,KAAK,IAAI,YAAY,EAAE,MAAM,aAAa,CAAC;AAuBpD;;;;GAIG;AACH,MAAM,UAAU,OAAO,CAAC,IAAY;IAChC,MAAM,GAAG,GAAG,IAAI,CAAC,WAAW,CAAC,GAAG,CAAC,CAAC;IAClC,IAAI,GAAG,KAAK,CAAC,CAAC,EAAE,CAAC;QACb,MAAM,IAAI,KAAK,CAAC,+BAA+B,IAAI,EAAE,CAAC,CAAC;IAC3D,CAAC;IACD,IAAI,GAAG,KAAK,CAAC,EAAE,CAAC;QACZ,OAAO,GAAG,CAAC;IACf,CAAC;IACD,OAAO,IAAI,CAAC,SAAS,CAAC,CAAC,EAAE,GAAG,CAAC,CAAC;AAClC,CAAC;AAsBD,MAAM,OAAO,OAAO;IACN,IAAI,CAAM;IACX,WAAW,CAAa;IAExB,cAAc,CAAU;IACxB,YAAY,CAAU;IACtB,eAAe,CAAU;IACzB,qBAAqB,CAAU;IAC/B,wBAAwB,CAAU;IAE3C,IAAI,aAAa;QACb,OAAO,IAAI,CAAC,cAAc,CAAC;IAC/B,CAAC;IAED,IAAI,WAAW;QACX,OAAO,IAAI,CAAC,YAAY,CAAC;IAC7B,CAAC;IAED,IAAI,cAAc;QACd,OAAO,IAAI,CAAC,eAAe,CAAC;IAChC,CAAC;IAED,IAAI,oBAAoB;QACpB,OAAO,IAAI,CAAC,qBAAqB,CAAC;IACtC,CAAC;IAED,IAAI,uBAAuB;QACvB,OAAO,IAAI,CAAC,wBAAwB,CAAC;IACzC,CAAC;IAED,YAAY,GAAQ,EAAE,OAAwB;QAC1C,IAAI,CAAC,IAAI,GAAG,GAAG,CAAC;QAChB,IAAI,CAAC,WAAW,GAAG,IAAI,UAAU,CAC7B,GAAG,EACH,OAAO,EAAE,WAAW,EACpB,OAAO,EAAE,WAAW,CACvB,CAAC;QAEF,6DAA6D;QAC7D,OAAO,EAAE,MAAM,EAAE,gBAAgB,CAAC,OAAO,EAAE,GAAG,EAAE;YAC5C,KAAK,IAAI,CAAC,WAAW,CAAC,OAAO,EAAE,CAAC;QACpC,CAAC,CAAC,CAAC;QAEH,IAAI,CAAC,cAAc,GAAG,GAAG,CAAC,aAAa,CAAC,UAAU,CAAC,KAAK,CAAC,CAAC;QAC1D,IAAI,CAAC,YAAY,GAAG,GAAG,CAAC,aAAa,CAAC,UAAU,CAAC,GAAG,CAAC,CAAC;QACtD,IAAI,CAAC,eAAe,GAAG,GAAG,CAAC,aAAa,CAAC,UAAU,CAAC,cAAc,CAAC,CAAC;QACpE,IAAI,CAAC,qBAAqB,GAAG,GAAG,CAAC,aAAa,CAAC,UAAU,CAAC,YAAY,CAAC,CAAC;QACxE,6IAA6I;QAC7I,IAAI,CAAC,wBAAwB;YACzB,IAAI,CAAC,IAAI,CAAC,aAAa,CAAC,UAAU,CAAC,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC,cAAc,CAAC;IAC3E,CAAC;IAED;;;;;;OAMG;IACH,KAAK,CAAC,aAAa;QACf,OAAO,MAAM,IAAI,CAAC,WAAW,CAAC,OAAO,EAAE,CAAC;IAC5C,CAAC;IAED;;;;;OAKG;IACH,KAAK,CAAC,aAAa,CAAC,MAAc,EAAE,OAAO,GAAG,KAAK;QAC/C,MAAM,IAAI,CAAC,WAAW,CAAC,OAAO,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IACpD,CAAC;IAED;;;;OAIG;IACH,KAAK,CAAC,IAAY;QACd,OAAO,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,WAAW,EAAE,IAAI,EAAE;YACtC,OAAO,EAAE,IAAI,CAAC,cAAc,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;SACvC,CAAC,CAAC;IACP,CAAC;IAED;;;;OAIG;IACH,IAAI,CAAC,IAAY;QACb,IAAI,CAAC,IAAI,CAAC,cAAc,EAAE,CAAC;YACvB,MAAM,IAAI,KAAK,CAAC,eAAe,CAAC,CAAC;QACrC,CAAC;QAED,OAAO,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,WAAW,EAAE,IAAI,CAAC,CAAC;IAC7C,CAAC;IAED;;;;OAIG;IACH,KAAK,CAAC,WAAW,CAAC,IAAY;QAC1B,IAAI,CAAC;YACD,MAAM,IAAI,CAAC,KAAK,CAAC,IAAI,GAAG,GAAG,CAAC,CAAC;YAC7B,OAAO,IAAI,CAAC;QAChB,CAAC;QAAC,OAAO,CAAC,EAAE,CAAC;YACT,IAAI,CAAC,YAAY,YAAY,EAAE,CAAC;gBAC5B,OAAO,KAAK,CAAC;YACjB,CAAC;iBAAM,CAAC;gBACJ,MAAM,CAAC,CAAC;YACZ,CAAC;QACL,CAAC;IACL,CAAC;IAED,OAAO,CAAC,IAAY;QAChB,OAAO,OAAO,CAAC,OAAO,CAAC,IAAI,CAAC,WAAW,EAAE,IAAI,EAAE;YAC3C,OAAO,EAAE,IAAI,CAAC,WAAW,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;SACpC,CAAC,CAAC;IACP,CAAC;IAED,KAAK,CAAC,OAAO,CAAC,IAAY;QACtB,qCAAqC;QACrC,MAAM,OAAO,GAAoB,EAAE,CAAC;QACpC,IAAI,KAAK,EAAE,MAAM,KAAK,IAAI,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,EAAE,CAAC;YAC3C,OAAO,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;QACxB,CAAC;QACD,OAAO,OAAO,CAAC;IACnB,CAAC;IAED;;;;;OAKG;IACH,IAAI,CAAC,QAAgB;QACjB,OAAO,OAAO,CAAC,MAAM,CAAC,IAAI,CAAC,WAAW,EAAE,QAAQ,CAAC,CAAC;IACtD,CAAC;IAED;;;;OAIG;IACH,KAAK,CAAC,KAAK,CAAC,OAAqB;QAC7B,IAAI,IAAI,CAAC,uBAAuB,EAAE,CAAC;YAC/B,4CAA4C;YAC5C,qBAAqB;YACrB,oEAAoE;YACpE,MAAM,IAAI,CAAC,IAAI,CAAC,UAAU,CAAC,YAAY;iBAClC,KAAK,CAAC,CAAC,OAAO,EAAE,IAAI,EAAE,SAAS,CAAC,OAAO,CAAC,OAAO,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC;iBAC5D,IAAI,EAAE,CAAC;QAChB,CAAC;QAED,IAAI,IAAI,CAAC,oBAAoB,EAAE,CAAC;YAC5B,IAAI,OAAO,CAAC,WAAW,KAAK,SAAS,EAAE,CAAC;gBACpC,OAAO,CAAC,WAAW,GAAG,WAAW,CAAC,YAAY,CAC1C,IAAI,CAAC,IAAI,EACT,WAAW,CAAC,IAAI,CAAC,QAAQ,CAC5B,CAAC;YACN,CAAC;iBAAM,IACH,CAAC,WAAW,CAAC,YAAY,CACrB,IAAI,CAAC,IAAI,EACT,OAAO,CAAC,WAAW,EACnB,WAAW,CAAC,IAAI,CAAC,QAAQ,CAC5B,EACH,CAAC;gBACC,MAAM,IAAI,KAAK,CACX,oBAAoB,OAAO,CAAC,WAAW,mBAAmB,CAC7D,CAAC;YACN,CAAC;QACL,CAAC;QAED,MAAM,IAAI,CAAC,IAAI,CAAC;YACZ,OAAO,EAAE,IAAI,CAAC,oBAAoB,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;YAC1C,IAAI,EAAE,IAAI,CAAC,WAAW;YACtB,GAAG,OAAO;SACb,CAAC,CAAC;IACP,CAAC;CACJ"}
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;AAExC,OAAO,EAAyB,MAAM,EAAE,MAAM,aAAa,CAAC;AAE5D,qBAAa,UAAU;;gBAQP,GAAG,EAAE,GAAG,EAAE,OAAO,SAAI,EAAE,WAAW,SAAQ;IAMhD,OAAO,IAAI,OAAO,CAAC,MAAM,CAAC;IAwB1B,UAAU,CAAC,CAAC,EAAE,EAAE,EAAE,CAAC,MAAM,EAAE,MAAM,KAAK,OAAO,CAAC,CAAC,CAAC,GAAG,OAAO,CAAC,CAAC,CAAC;IAY7D,OAAO,CAAC,MAAM,EAAE,MAAM,EAAE,OAAO,UAAQ,GAAG,OAAO,CAAC,IAAI,CAAC;IAyBvD,OAAO,IAAI,OAAO,CAAC,IAAI,CAAC;CAiBjC"}
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
- // Create a new socket
27
- const adbSocket = await this.#adb.createSocket("sync:");
28
- if (this.#closed) {
29
- await adbSocket.close();
30
- throw new Error("SocketPool is closed");
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
  }