@arenahito/droid-webscr 0.0.0 → 0.1.0
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/android/droid-webscr-server-android.jar +0 -0
- package/dist/bin.js +81 -73
- package/dist/bin.js.map +1 -1
- package/dist/index.js +42 -48
- package/dist/index.js.map +1 -1
- package/dist/main.js +76 -72
- package/dist/main.js.map +1 -1
- package/package.json +5 -1
|
Binary file
|
package/dist/bin.js
CHANGED
|
@@ -8,7 +8,7 @@ var __export = (target, all) => {
|
|
|
8
8
|
// package.json
|
|
9
9
|
var package_default = {
|
|
10
10
|
name: "@arenahito/droid-webscr",
|
|
11
|
-
version: "0.
|
|
11
|
+
version: "0.1.0",
|
|
12
12
|
private: false,
|
|
13
13
|
license: "MIT",
|
|
14
14
|
repository: {
|
|
@@ -48,37 +48,29 @@ var package_default = {
|
|
|
48
48
|
pino: "10.3.1"
|
|
49
49
|
},
|
|
50
50
|
devDependencies: {
|
|
51
|
+
"@droid-webscr/adb": "workspace:*",
|
|
52
|
+
"@droid-webscr/config": "workspace:*",
|
|
53
|
+
"@droid-webscr/protocol": "workspace:*",
|
|
54
|
+
"@droid-webscr/transport": "workspace:*",
|
|
51
55
|
"@types/ws": "8.18.1"
|
|
52
56
|
}
|
|
53
57
|
};
|
|
54
58
|
|
|
55
|
-
// ../../packages/adb/
|
|
59
|
+
// ../../packages/adb/src/provider.ts
|
|
56
60
|
import { Readable } from "stream";
|
|
57
|
-
var AdbAuthorizationState;
|
|
58
|
-
(function(AdbAuthorizationState2) {
|
|
59
|
-
AdbAuthorizationState2["Authorized"] = "authorized";
|
|
60
|
-
AdbAuthorizationState2["Offline"] = "offline";
|
|
61
|
-
AdbAuthorizationState2["Unauthorized"] = "unauthorized";
|
|
62
|
-
})(AdbAuthorizationState || (AdbAuthorizationState = {}));
|
|
63
|
-
var AdbTransportKind;
|
|
64
|
-
(function(AdbTransportKind2) {
|
|
65
|
-
AdbTransportKind2["Emulator"] = "emulator";
|
|
66
|
-
AdbTransportKind2["Network"] = "network";
|
|
67
|
-
AdbTransportKind2["Usb"] = "usb";
|
|
68
|
-
})(AdbTransportKind || (AdbTransportKind = {}));
|
|
69
61
|
function isUsableDevice(device) {
|
|
70
|
-
return device.authorizationState ===
|
|
62
|
+
return device.authorizationState === "authorized" /* Authorized */ && device.serial.length > 0;
|
|
71
63
|
}
|
|
72
64
|
|
|
73
|
-
// ../../packages/adb/
|
|
65
|
+
// ../../packages/adb/src/system-adb-provider.ts
|
|
74
66
|
import { spawn } from "child_process";
|
|
75
67
|
import { createConnection, Server } from "net";
|
|
76
68
|
import { Readable as Readable2 } from "stream";
|
|
77
69
|
var SystemAdbProvider = class _SystemAdbProvider {
|
|
78
|
-
adbPath;
|
|
79
70
|
constructor(adbPath = "adb") {
|
|
80
71
|
this.adbPath = adbPath;
|
|
81
72
|
}
|
|
73
|
+
adbPath;
|
|
82
74
|
/* v8 ignore next 4 -- external adb process boundary; deterministic parsing is unit-tested */
|
|
83
75
|
async listDevices() {
|
|
84
76
|
const output = await runAndCollect(this.adbPath, ["devices", "-l"]);
|
|
@@ -117,16 +109,16 @@ var SystemAdbProvider = class _SystemAdbProvider {
|
|
|
117
109
|
}
|
|
118
110
|
};
|
|
119
111
|
var SystemAdbDeviceSession = class {
|
|
112
|
+
constructor(adbPath, serial) {
|
|
113
|
+
this.adbPath = adbPath;
|
|
114
|
+
this.serial = serial;
|
|
115
|
+
}
|
|
120
116
|
adbPath;
|
|
121
117
|
serial;
|
|
122
118
|
forwards = /* @__PURE__ */ new Set();
|
|
123
119
|
sockets = /* @__PURE__ */ new Set();
|
|
124
120
|
shellChildren = /* @__PURE__ */ new Set();
|
|
125
121
|
shellCloses = /* @__PURE__ */ new Map();
|
|
126
|
-
constructor(adbPath, serial) {
|
|
127
|
-
this.adbPath = adbPath;
|
|
128
|
-
this.serial = serial;
|
|
129
|
-
}
|
|
130
122
|
async push(localPath, remotePath) {
|
|
131
123
|
await runAndCollect(this.adbPath, ["-s", this.serial, "push", localPath, remotePath]);
|
|
132
124
|
}
|
|
@@ -172,10 +164,16 @@ var SystemAdbDeviceSession = class {
|
|
|
172
164
|
this.forwards.add(forward.local);
|
|
173
165
|
try {
|
|
174
166
|
const socket = await connectLocalPortWithRetry(localPort);
|
|
175
|
-
const forwardedSocket = new ForwardedAdbSocket(
|
|
176
|
-
this.
|
|
177
|
-
this.
|
|
178
|
-
|
|
167
|
+
const forwardedSocket = new ForwardedAdbSocket(
|
|
168
|
+
this.adbPath,
|
|
169
|
+
this.serial,
|
|
170
|
+
forward.local,
|
|
171
|
+
socket,
|
|
172
|
+
() => {
|
|
173
|
+
this.forwards.delete(forward.local);
|
|
174
|
+
this.sockets.delete(forwardedSocket);
|
|
175
|
+
}
|
|
176
|
+
);
|
|
179
177
|
this.sockets.add(forwardedSocket);
|
|
180
178
|
return forwardedSocket;
|
|
181
179
|
} catch (error51) {
|
|
@@ -191,7 +189,9 @@ var SystemAdbDeviceSession = class {
|
|
|
191
189
|
await Promise.allSettled([
|
|
192
190
|
...this.shellCloses.values(),
|
|
193
191
|
...[...this.sockets].map((socket) => socket.close()),
|
|
194
|
-
...[...this.forwards].map(
|
|
192
|
+
...[...this.forwards].map(
|
|
193
|
+
(forward) => runAndCollect(this.adbPath, ["-s", this.serial, "forward", "--remove", forward])
|
|
194
|
+
)
|
|
195
195
|
]);
|
|
196
196
|
this.forwards.clear();
|
|
197
197
|
}
|
|
@@ -220,24 +220,24 @@ function parseDeviceLine(line) {
|
|
|
220
220
|
}
|
|
221
221
|
function parseAuthorizationState(state) {
|
|
222
222
|
if (state === "device") {
|
|
223
|
-
return
|
|
223
|
+
return "authorized" /* Authorized */;
|
|
224
224
|
}
|
|
225
225
|
if (state === "unauthorized") {
|
|
226
|
-
return
|
|
226
|
+
return "unauthorized" /* Unauthorized */;
|
|
227
227
|
}
|
|
228
|
-
return
|
|
228
|
+
return "offline" /* Offline */;
|
|
229
229
|
}
|
|
230
230
|
function inferTransportKind(serial, fields) {
|
|
231
231
|
if (serial.startsWith("emulator-")) {
|
|
232
|
-
return
|
|
232
|
+
return "emulator" /* Emulator */;
|
|
233
233
|
}
|
|
234
234
|
if (serial.includes(":")) {
|
|
235
|
-
return
|
|
235
|
+
return "network" /* Network */;
|
|
236
236
|
}
|
|
237
237
|
if (fields.some((field) => field.startsWith("usb:"))) {
|
|
238
|
-
return
|
|
238
|
+
return "usb" /* Usb */;
|
|
239
239
|
}
|
|
240
|
-
return
|
|
240
|
+
return "usb" /* Usb */;
|
|
241
241
|
}
|
|
242
242
|
function parseField(fields, key) {
|
|
243
243
|
const prefix = `${key}:`;
|
|
@@ -260,7 +260,9 @@ async function runAndCollect(command, args) {
|
|
|
260
260
|
return stdout;
|
|
261
261
|
}
|
|
262
262
|
async function startLogcatTail(command, serial) {
|
|
263
|
-
const epoch = Number(
|
|
263
|
+
const epoch = Number(
|
|
264
|
+
(await runAndCollect(command, ["-s", serial, "shell", "date", "+%s"])).trim()
|
|
265
|
+
);
|
|
264
266
|
if (!Number.isFinite(epoch)) {
|
|
265
267
|
throw new Error("Failed to read device logcat start time.");
|
|
266
268
|
}
|
|
@@ -369,12 +371,6 @@ function delay(ms) {
|
|
|
369
371
|
return new Promise((resolve) => setTimeout(resolve, ms));
|
|
370
372
|
}
|
|
371
373
|
var ForwardedAdbSocket = class {
|
|
372
|
-
adbPath;
|
|
373
|
-
serial;
|
|
374
|
-
localForward;
|
|
375
|
-
socket;
|
|
376
|
-
onClose;
|
|
377
|
-
chunks;
|
|
378
374
|
constructor(adbPath, serial, localForward, socket, onClose = () => {
|
|
379
375
|
}) {
|
|
380
376
|
this.adbPath = adbPath;
|
|
@@ -384,6 +380,12 @@ var ForwardedAdbSocket = class {
|
|
|
384
380
|
this.onClose = onClose;
|
|
385
381
|
this.chunks = socket;
|
|
386
382
|
}
|
|
383
|
+
adbPath;
|
|
384
|
+
serial;
|
|
385
|
+
localForward;
|
|
386
|
+
socket;
|
|
387
|
+
onClose;
|
|
388
|
+
chunks;
|
|
387
389
|
async write(chunk) {
|
|
388
390
|
await new Promise((resolve, reject) => {
|
|
389
391
|
this.socket.write(chunk, (error51) => {
|
|
@@ -411,7 +413,7 @@ var ForwardedAdbSocket = class {
|
|
|
411
413
|
}
|
|
412
414
|
};
|
|
413
415
|
|
|
414
|
-
// ../../packages/shared/
|
|
416
|
+
// ../../packages/shared/src/index.ts
|
|
415
417
|
var AppError = class extends Error {
|
|
416
418
|
code;
|
|
417
419
|
constructor(code, message) {
|
|
@@ -14941,7 +14943,7 @@ function date4(params) {
|
|
|
14941
14943
|
// ../../node_modules/.pnpm/zod@4.4.3/node_modules/zod/v4/classic/external.js
|
|
14942
14944
|
config(en_default());
|
|
14943
14945
|
|
|
14944
|
-
// ../../packages/config/
|
|
14946
|
+
// ../../packages/config/src/schema.ts
|
|
14945
14947
|
var defaultAgentConfig = {
|
|
14946
14948
|
authToken: void 0,
|
|
14947
14949
|
bindHost: "127.0.0.1",
|
|
@@ -14964,7 +14966,9 @@ function validateAgentConfig(input) {
|
|
|
14964
14966
|
return err(new ConfigError("CONFIG_INVALID", parsed.error.message));
|
|
14965
14967
|
}
|
|
14966
14968
|
if (!isLocalBind(parsed.data.bindHost) && !parsed.data.authToken) {
|
|
14967
|
-
return err(
|
|
14969
|
+
return err(
|
|
14970
|
+
new ConfigError("CONFIG_UNSAFE_BIND", "Non-local bind addresses require authToken.")
|
|
14971
|
+
);
|
|
14968
14972
|
}
|
|
14969
14973
|
return ok(parsed.data);
|
|
14970
14974
|
}
|
|
@@ -15196,33 +15200,26 @@ async function collectTextUntil(chunks, expected) {
|
|
|
15196
15200
|
// src/server/create-fastify-app.ts
|
|
15197
15201
|
import websocket from "@fastify/websocket";
|
|
15198
15202
|
|
|
15199
|
-
// ../../packages/protocol/
|
|
15200
|
-
var StreamId
|
|
15201
|
-
(function(StreamId2) {
|
|
15203
|
+
// ../../packages/protocol/src/streams.ts
|
|
15204
|
+
var StreamId = /* @__PURE__ */ ((StreamId2) => {
|
|
15202
15205
|
StreamId2[StreamId2["Session"] = 1] = "Session";
|
|
15203
15206
|
StreamId2[StreamId2["Device"] = 2] = "Device";
|
|
15204
15207
|
StreamId2[StreamId2["Video"] = 3] = "Video";
|
|
15205
15208
|
StreamId2[StreamId2["Control"] = 4] = "Control";
|
|
15206
15209
|
StreamId2[StreamId2["Log"] = 5] = "Log";
|
|
15207
|
-
|
|
15208
|
-
|
|
15210
|
+
return StreamId2;
|
|
15211
|
+
})(StreamId || {});
|
|
15212
|
+
var knownStreams = new Set(
|
|
15213
|
+
Object.values(StreamId).filter((value) => typeof value === "number")
|
|
15214
|
+
);
|
|
15209
15215
|
|
|
15210
|
-
// ../../packages/protocol/
|
|
15216
|
+
// ../../packages/protocol/src/frame.ts
|
|
15211
15217
|
var FRAME_MAGIC = 1146573635;
|
|
15212
15218
|
var FRAME_HEADER_LENGTH = 40;
|
|
15213
15219
|
var WIRE_VERSION = 1;
|
|
15214
15220
|
var DEFAULT_MAX_PAYLOAD_LENGTH = 16 * 1024 * 1024;
|
|
15215
15221
|
|
|
15216
|
-
// ../../packages/protocol/
|
|
15217
|
-
var ProtocolErrorCode;
|
|
15218
|
-
(function(ProtocolErrorCode2) {
|
|
15219
|
-
ProtocolErrorCode2["FrameTooShort"] = "FRAME_TOO_SHORT";
|
|
15220
|
-
ProtocolErrorCode2["InvalidMagic"] = "INVALID_MAGIC";
|
|
15221
|
-
ProtocolErrorCode2["UnsupportedVersion"] = "UNSUPPORTED_VERSION";
|
|
15222
|
-
ProtocolErrorCode2["UnsupportedHeaderLength"] = "UNSUPPORTED_HEADER_LENGTH";
|
|
15223
|
-
ProtocolErrorCode2["PayloadLengthMismatch"] = "PAYLOAD_LENGTH_MISMATCH";
|
|
15224
|
-
ProtocolErrorCode2["PayloadTooLarge"] = "PAYLOAD_TOO_LARGE";
|
|
15225
|
-
})(ProtocolErrorCode || (ProtocolErrorCode = {}));
|
|
15222
|
+
// ../../packages/protocol/src/errors.ts
|
|
15226
15223
|
var ProtocolError = class extends Error {
|
|
15227
15224
|
code;
|
|
15228
15225
|
constructor(code, message) {
|
|
@@ -15232,7 +15229,7 @@ var ProtocolError = class extends Error {
|
|
|
15232
15229
|
}
|
|
15233
15230
|
};
|
|
15234
15231
|
|
|
15235
|
-
// ../../packages/protocol/
|
|
15232
|
+
// ../../packages/protocol/src/codec.ts
|
|
15236
15233
|
function encodeFrame(frame) {
|
|
15237
15234
|
const payloadLength = frame.payload.byteLength;
|
|
15238
15235
|
const output = new Uint8Array(FRAME_HEADER_LENGTH + payloadLength);
|
|
@@ -15253,28 +15250,37 @@ function encodeFrame(frame) {
|
|
|
15253
15250
|
function decodeFrame(bytes, options = {}) {
|
|
15254
15251
|
const maxPayloadLength = options.maxPayloadLength ?? DEFAULT_MAX_PAYLOAD_LENGTH;
|
|
15255
15252
|
if (bytes.byteLength < FRAME_HEADER_LENGTH) {
|
|
15256
|
-
return failure(
|
|
15253
|
+
return failure("FRAME_TOO_SHORT" /* FrameTooShort */, "Frame is shorter than the protocol header.");
|
|
15257
15254
|
}
|
|
15258
15255
|
const view = new DataView(bytes.buffer, bytes.byteOffset, bytes.byteLength);
|
|
15259
15256
|
const magic = view.getUint32(0, false);
|
|
15260
15257
|
if (magic !== FRAME_MAGIC) {
|
|
15261
|
-
return failure(
|
|
15258
|
+
return failure("INVALID_MAGIC" /* InvalidMagic */, "Frame magic does not match DWSC.");
|
|
15262
15259
|
}
|
|
15263
15260
|
const version2 = view.getUint16(4, false);
|
|
15264
15261
|
if (version2 !== WIRE_VERSION) {
|
|
15265
|
-
return failure(
|
|
15262
|
+
return failure("UNSUPPORTED_VERSION" /* UnsupportedVersion */, `Unsupported wire version: ${version2}.`);
|
|
15266
15263
|
}
|
|
15267
15264
|
const headerLength = view.getUint16(6, false);
|
|
15268
15265
|
if (headerLength !== FRAME_HEADER_LENGTH) {
|
|
15269
|
-
return failure(
|
|
15266
|
+
return failure(
|
|
15267
|
+
"UNSUPPORTED_HEADER_LENGTH" /* UnsupportedHeaderLength */,
|
|
15268
|
+
`Unsupported header length: ${headerLength}.`
|
|
15269
|
+
);
|
|
15270
15270
|
}
|
|
15271
15271
|
const payloadLength = view.getUint32(16, false);
|
|
15272
15272
|
if (payloadLength > maxPayloadLength) {
|
|
15273
|
-
return failure(
|
|
15273
|
+
return failure(
|
|
15274
|
+
"PAYLOAD_TOO_LARGE" /* PayloadTooLarge */,
|
|
15275
|
+
`Payload length ${payloadLength} exceeds limit ${maxPayloadLength}.`
|
|
15276
|
+
);
|
|
15274
15277
|
}
|
|
15275
15278
|
const expectedLength = FRAME_HEADER_LENGTH + payloadLength;
|
|
15276
15279
|
if (bytes.byteLength !== expectedLength) {
|
|
15277
|
-
return failure(
|
|
15280
|
+
return failure(
|
|
15281
|
+
"PAYLOAD_LENGTH_MISMATCH" /* PayloadLengthMismatch */,
|
|
15282
|
+
`Frame length ${bytes.byteLength} does not match declared length ${expectedLength}.`
|
|
15283
|
+
);
|
|
15278
15284
|
}
|
|
15279
15285
|
return {
|
|
15280
15286
|
ok: true,
|
|
@@ -15302,9 +15308,8 @@ function failure(code, message) {
|
|
|
15302
15308
|
};
|
|
15303
15309
|
}
|
|
15304
15310
|
|
|
15305
|
-
// ../../packages/protocol/
|
|
15306
|
-
var MessageType
|
|
15307
|
-
(function(MessageType2) {
|
|
15311
|
+
// ../../packages/protocol/src/messages.ts
|
|
15312
|
+
var MessageType = /* @__PURE__ */ ((MessageType2) => {
|
|
15308
15313
|
MessageType2[MessageType2["SessionHello"] = 1] = "SessionHello";
|
|
15309
15314
|
MessageType2[MessageType2["SessionHelloAck"] = 2] = "SessionHelloAck";
|
|
15310
15315
|
MessageType2[MessageType2["SessionStart"] = 3] = "SessionStart";
|
|
@@ -15321,10 +15326,13 @@ var MessageType;
|
|
|
15321
15326
|
MessageType2[MessageType2["ControlSystem"] = 772] = "ControlSystem";
|
|
15322
15327
|
MessageType2[MessageType2["ControlClipboard"] = 773] = "ControlClipboard";
|
|
15323
15328
|
MessageType2[MessageType2["LogRecord"] = 1025] = "LogRecord";
|
|
15324
|
-
|
|
15325
|
-
|
|
15329
|
+
return MessageType2;
|
|
15330
|
+
})(MessageType || {});
|
|
15331
|
+
var knownMessageTypes = new Set(
|
|
15332
|
+
Object.values(MessageType).filter((value) => typeof value === "number")
|
|
15333
|
+
);
|
|
15326
15334
|
|
|
15327
|
-
// ../../packages/transport/
|
|
15335
|
+
// ../../packages/transport/src/stream.ts
|
|
15328
15336
|
var DEFAULT_MAX_BUFFERED_BYTES = 16 * 1024 * 1024;
|
|
15329
15337
|
var FrameAssembler = class {
|
|
15330
15338
|
buffer = new Uint8Array();
|
|
@@ -15393,7 +15401,7 @@ function readPayloadLength(bytes) {
|
|
|
15393
15401
|
return view.getUint32(16, false);
|
|
15394
15402
|
}
|
|
15395
15403
|
|
|
15396
|
-
// ../../packages/transport/
|
|
15404
|
+
// ../../packages/transport/src/backpressure.ts
|
|
15397
15405
|
var VIDEO_KEYFRAME_FLAG = 1 << 0;
|
|
15398
15406
|
|
|
15399
15407
|
// src/server/create-fastify-app.ts
|