Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Original file line number Diff line number Diff line change
@@ -1,5 +1,5 @@
import { runExecutable } from '../../core/data-access/run-executable.ts'
import type { AdbDependencies, AdbReverseEntry } from './localnet-types.ts'
import type { AdbDependencies, AdbReverseEntry } from './device-types.ts'

export async function listAdbReverses(
serial: string,
Expand Down
20 changes: 19 additions & 1 deletion src/device/data-access/device-types.ts
Original file line number Diff line number Diff line change
@@ -1,4 +1,22 @@
import type { AdbDevice } from '../../localnet/data-access/localnet-types.ts'
import type { CommandRunner } from '../../core/data-access/command-types.ts'

export interface AdbDependencies {
runCommand?: CommandRunner
}

export type AdbDeviceState = 'device' | 'offline' | 'unauthorized' | (string & {})

export interface AdbDevice {
serial: string
state: AdbDeviceState
}

export interface AdbReverseEntry {
/** Port the device listens on. This is the key `adb reverse --remove` takes. */
devicePort: number
/** Port the connection is forwarded to on the host. */
hostPort: number
}

export interface ApplyDeviceTweaksOptions {
/** Defaults to every tweak in `DEVICE_TWEAKS`. */
Expand Down
2 changes: 1 addition & 1 deletion src/device/data-access/install-apk.ts
Original file line number Diff line number Diff line change
@@ -1,5 +1,5 @@
import { runExecutable } from '../../core/data-access/run-executable.ts'
import type { AdbDependencies } from '../../localnet/data-access/localnet-types.ts'
import type { AdbDependencies } from './device-types.ts'

export interface AdbInstallOptions {
downgrade?: boolean
Expand Down
Original file line number Diff line number Diff line change
@@ -1,5 +1,5 @@
import { runExecutable } from '../../core/data-access/run-executable.ts'
import type { AdbDependencies, AdbDevice } from './localnet-types.ts'
import type { AdbDependencies, AdbDevice } from './device-types.ts'

/**
* Lists every adb device, unlike `listRunningEmulators`, which is deliberately limited to `emulator-*`
Expand Down
5 changes: 2 additions & 3 deletions src/device/data-access/list-connected-devices.ts
Original file line number Diff line number Diff line change
@@ -1,8 +1,7 @@
import { runExecutable } from '../../core/data-access/run-executable.ts'
import { parseRunningEmulatorName } from '../../emulator/data-access/list-running-emulators.ts'
import { isUsableDevice, listAdbDevices } from '../../localnet/data-access/list-adb-devices.ts'
import type { AdbDependencies } from '../../localnet/data-access/localnet-types.ts'
import type { ConnectedDevice } from './device-types.ts'
import type { AdbDependencies, ConnectedDevice } from './device-types.ts'
import { isUsableDevice, listAdbDevices } from './list-adb-devices.ts'

/**
* Every adb device with a human-readable name attached: the AVD name for emulators, the product model
Expand Down
14 changes: 14 additions & 0 deletions src/device/data-access/open-url-on-device.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,14 @@
import { runExecutable } from '../../core/data-access/run-executable.ts'
import type { AdbDependencies } from './device-types.ts'

/**
* Best-effort visual proof: opens a URL in the device browser. Not a programmatic check — on a fresh
* emulator the browser's first-run screen intercepts the intent.
*/
export async function openUrlOnDevice(
serial: string,
url: string,
{ runCommand = runExecutable }: AdbDependencies = {},
): Promise<void> {
await runCommand(['adb', '-s', serial, 'shell', 'am', 'start', '-a', 'android.intent.action.VIEW', '-d', url])
}
9 changes: 7 additions & 2 deletions src/device/data-access/tune-device.ts
Original file line number Diff line number Diff line change
@@ -1,6 +1,11 @@
import { runExecutable } from '../../core/data-access/run-executable.ts'
import type { AdbDependencies } from '../../localnet/data-access/localnet-types.ts'
import type { AppliedDeviceTweaks, ApplyDeviceTweaksOptions, DeviceTweak, SkippedDeviceTweak } from './device-types.ts'
import type {
AdbDependencies,
AppliedDeviceTweaks,
ApplyDeviceTweaksOptions,
DeviceTweak,
SkippedDeviceTweak,
} from './device-types.ts'

export const DEVICE_TWEAKS: readonly DeviceTweak[] = [
{
Expand Down
5 changes: 2 additions & 3 deletions src/device/device-feature-install.ts
Original file line number Diff line number Diff line change
Expand Up @@ -3,12 +3,11 @@ import { cancel, log as clackLog, intro, note, outro } from '@clack/prompts'
import { runExecutable } from '../core/data-access/run-executable.ts'
import type { PromptDependencies } from '../core/ui/core-ui-prompt-types.ts'
import { formatCliCommand } from '../core/util/format-cli-command.ts'
import { isUsableDevice } from '../localnet/data-access/list-adb-devices.ts'
import type { AdbDependencies } from '../localnet/data-access/localnet-types.ts'
import { APK_CATALOG, findApkCatalogEntry, githubReleaseDownloadUrl } from './data-access/apk-catalog.ts'
import type { DeviceInstallCommandOptions } from './data-access/device-types.ts'
import type { AdbDependencies, DeviceInstallCommandOptions } from './data-access/device-types.ts'
import { type DownloadApkDependencies, ensureApkDownloaded } from './data-access/download-apk.ts'
import { installApk } from './data-access/install-apk.ts'
import { isUsableDevice } from './data-access/list-adb-devices.ts'
import { connectedDeviceLabel, listConnectedDevices } from './data-access/list-connected-devices.ts'
import {
type ApkInstallItem,
Expand Down
3 changes: 1 addition & 2 deletions src/device/device-feature-list.ts
Original file line number Diff line number Diff line change
@@ -1,6 +1,5 @@
import { runExecutable } from '../core/data-access/run-executable.ts'
import type { AdbDependencies } from '../localnet/data-access/localnet-types.ts'
import type { DeviceListCommandOptions } from './data-access/device-types.ts'
import type { AdbDependencies, DeviceListCommandOptions } from './data-access/device-types.ts'
import { listConnectedDevices } from './data-access/list-connected-devices.ts'
import { renderConnectedDevices } from './ui/device-ui-render-connected-devices.ts'

Expand Down
9 changes: 4 additions & 5 deletions src/device/device-feature-open.ts
Original file line number Diff line number Diff line change
Expand Up @@ -2,12 +2,11 @@ import { cancel, log as clackLog, intro, note, outro } from '@clack/prompts'
import { runExecutable } from '../core/data-access/run-executable.ts'
import type { PromptDependencies } from '../core/ui/core-ui-prompt-types.ts'
import { formatCliCommand } from '../core/util/format-cli-command.ts'
import { createAdbReverse, listAdbReverses } from '../localnet/data-access/adb-reverse.ts'
import { isUsableDevice } from '../localnet/data-access/list-adb-devices.ts'
import type { AdbDependencies, AdbReverseEntry } from '../localnet/data-access/localnet-types.ts'
import { openUrlOnDevice } from '../localnet/data-access/probe-device-port.ts'
import type { DeviceOpenCommandOptions } from './data-access/device-types.ts'
import { createAdbReverse, listAdbReverses } from './data-access/adb-reverse.ts'
import type { AdbDependencies, AdbReverseEntry, DeviceOpenCommandOptions } from './data-access/device-types.ts'
import { isUsableDevice } from './data-access/list-adb-devices.ts'
import { connectedDeviceLabel, listConnectedDevices } from './data-access/list-connected-devices.ts'
import { openUrlOnDevice } from './data-access/open-url-on-device.ts'
import { localhostPort, resolveOpenUrl } from './data-access/resolve-open-url.ts'
import { NO_CONNECTED_DEVICES_MESSAGE } from './ui/device-ui-messages.ts'
import { resolveTargetDevice } from './ui/device-ui-resolve-target-device.ts'
Expand Down
5 changes: 2 additions & 3 deletions src/device/device-feature-tune.ts
Original file line number Diff line number Diff line change
Expand Up @@ -2,9 +2,8 @@ import { cancel, log as clackLog, intro, note, outro } from '@clack/prompts'
import { runExecutable } from '../core/data-access/run-executable.ts'
import type { PromptDependencies } from '../core/ui/core-ui-prompt-types.ts'
import { formatCliCommand } from '../core/util/format-cli-command.ts'
import { isUsableDevice } from '../localnet/data-access/list-adb-devices.ts'
import type { AdbDependencies } from '../localnet/data-access/localnet-types.ts'
import type { DeviceTuneCommandOptions } from './data-access/device-types.ts'
import type { AdbDependencies, DeviceTuneCommandOptions } from './data-access/device-types.ts'
import { isUsableDevice } from './data-access/list-adb-devices.ts'
import { connectedDeviceLabel, listConnectedDevices } from './data-access/list-connected-devices.ts'
import { applyDeviceTweaks } from './data-access/tune-device.ts'
import { formatAppliedTweaks } from './ui/device-ui-format-applied-tweaks.ts'
Expand Down
2 changes: 1 addition & 1 deletion src/device/ui/device-ui-select-open-url.ts
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
import { select, text } from '@clack/prompts'
import { resolvePromptCancellation, type SelectPrompt, type TextPrompt } from '../../core/ui/core-ui-prompt-types.ts'
import type { AdbReverseEntry } from '../../localnet/data-access/localnet-types.ts'
import type { AdbReverseEntry } from '../data-access/device-types.ts'
import { resolveOpenUrl, validateOpenUrlInput } from '../data-access/resolve-open-url.ts'
import { describeReverse } from './device-ui-messages.ts'

Expand Down
14 changes: 4 additions & 10 deletions src/localnet/data-access/apply-forwards.ts
Original file line number Diff line number Diff line change
@@ -1,14 +1,8 @@
import { runExecutable } from '../../core/data-access/run-executable.ts'
import { createAdbReverse, listAdbReverses, removeAdbReverse } from './adb-reverse.ts'
import { isUsableDevice, listAdbDevices } from './list-adb-devices.ts'
import type {
AdbDependencies,
AdbDevice,
AdbReverseEntry,
ForwardAction,
OwnedForward,
ResolvedLocalnetPort,
} from './localnet-types.ts'
import { createAdbReverse, listAdbReverses, removeAdbReverse } from '../../device/data-access/adb-reverse.ts'
import type { AdbDependencies, AdbDevice, AdbReverseEntry } from '../../device/data-access/device-types.ts'
import { isUsableDevice, listAdbDevices } from '../../device/data-access/list-adb-devices.ts'
import type { ForwardAction, OwnedForward, ResolvedLocalnetPort } from './localnet-types.ts'
import { ownedForwards, pendingForwards, planForwards } from './plan-forwards.ts'

export async function collectExistingReverses(
Expand Down
19 changes: 1 addition & 18 deletions src/localnet/data-access/localnet-types.ts
Original file line number Diff line number Diff line change
@@ -1,4 +1,5 @@
import type { CommandRunner } from '../../core/data-access/command-types.ts'
import type { AdbDeviceState, AdbReverseEntry } from '../../device/data-access/device-types.ts'

export type LocalnetEngineId = 'surfpool' | 'test-validator'

Expand Down Expand Up @@ -39,20 +40,6 @@ export interface ResolvedLocalnet {
ports: ResolvedLocalnetPort[]
}

export type AdbDeviceState = 'device' | 'offline' | 'unauthorized' | (string & {})

export interface AdbDevice {
serial: string
state: AdbDeviceState
}

export interface AdbReverseEntry {
/** Port the device listens on. This is the key `adb reverse --remove` takes. */
devicePort: number
/** Port the connection is forwarded to on the host. */
hostPort: number
}

export type ForwardActionKind = 'create' | 'keep' | 'replace'

export interface ForwardAction {
Expand Down Expand Up @@ -165,10 +152,6 @@ export interface OwnedForward {
serial: string
}

export interface AdbDependencies {
runCommand?: CommandRunner
}

export interface DockerDependencies {
/**
* Container to operate on. Defaults to the one localnet manages; the integration tests override it so
Expand Down
5 changes: 3 additions & 2 deletions src/localnet/data-access/plan-forwards.ts
Original file line number Diff line number Diff line change
@@ -1,5 +1,6 @@
import { isUsableDevice } from './list-adb-devices.ts'
import type { AdbDevice, AdbReverseEntry, ForwardAction, OwnedForward, ResolvedLocalnetPort } from './localnet-types.ts'
import type { AdbDevice, AdbReverseEntry } from '../../device/data-access/device-types.ts'
import { isUsableDevice } from '../../device/data-access/list-adb-devices.ts'
import type { ForwardAction, OwnedForward, ResolvedLocalnetPort } from './localnet-types.ts'

export interface PlanForwardsInput {
devices: readonly AdbDevice[]
Expand Down
15 changes: 2 additions & 13 deletions src/localnet/data-access/probe-device-port.ts
Original file line number Diff line number Diff line change
@@ -1,5 +1,6 @@
import { runExecutable } from '../../core/data-access/run-executable.ts'
import type { AdbDependencies, DevicePortProbeResult, ResolvedLocalnetPort } from './localnet-types.ts'
import type { AdbDependencies } from '../../device/data-access/device-types.ts'
import type { DevicePortProbeResult, ResolvedLocalnetPort } from './localnet-types.ts'

/**
* Device-side leg of the check.
Expand Down Expand Up @@ -65,15 +66,3 @@ export function parseProbeExitCode(output: string): number | undefined {

return Number(last)
}

/**
* Best-effort visual proof: opens a URL in the device browser. Not a programmatic check — on a fresh
* emulator the browser's first-run screen intercepts the intent.
*/
export async function openUrlOnDevice(
serial: string,
url: string,
{ runCommand = runExecutable }: AdbDependencies = {},
): Promise<void> {
await runCommand(['adb', '-s', serial, 'shell', 'am', 'start', '-a', 'android.intent.action.VIEW', '-d', url])
}
3 changes: 2 additions & 1 deletion src/localnet/data-access/watch-forwards.ts
Original file line number Diff line number Diff line change
@@ -1,6 +1,7 @@
import { runExecutable } from '../../core/data-access/run-executable.ts'
import type { AdbDependencies } from '../../device/data-access/device-types.ts'
import { type SyncForwardsResult, syncForwards } from './apply-forwards.ts'
import type { AdbDependencies, OwnedForward, ResolvedLocalnetPort } from './localnet-types.ts'
import type { OwnedForward, ResolvedLocalnetPort } from './localnet-types.ts'

export interface WatchForwardsOptions {
devices?: readonly string[]
Expand Down
8 changes: 4 additions & 4 deletions src/localnet/localnet-feature-check.ts
Original file line number Diff line number Diff line change
@@ -1,12 +1,12 @@
import { cancel, intro, outro } from '@clack/prompts'
import { runExecutable } from '../core/data-access/run-executable.ts'
import type { AdbDependencies, AdbReverseEntry } from '../device/data-access/device-types.ts'
import { isUsableDevice, listAdbDevices } from '../device/data-access/list-adb-devices.ts'
import { openUrlOnDevice } from '../device/data-access/open-url-on-device.ts'
import { collectExistingReverses } from './data-access/apply-forwards.ts'
import { inspectLocalnetContainer } from './data-access/docker-engine.ts'
import { isUsableDevice, listAdbDevices } from './data-access/list-adb-devices.ts'
import { findLocalnetPort, localnetRpcUrl, resolveLocalnetForContainer } from './data-access/localnet-engines.ts'
import type {
AdbDependencies,
AdbReverseEntry,
DeviceCheckResult,
DevicePortProbeResult,
JsonRpcFetcher,
Expand All @@ -16,7 +16,7 @@ import type {
ResolvedLocalnetPort,
} from './data-access/localnet-types.ts'
import { matchReverse } from './data-access/plan-forwards.ts'
import { openUrlOnDevice, probeDevicePort } from './data-access/probe-device-port.ts'
import { probeDevicePort } from './data-access/probe-device-port.ts'
import { defaultJsonRpcFetcher, probeRpc } from './data-access/probe-rpc.ts'
import { renderLocalnetCheck } from './ui/localnet-ui-render-check.ts'

Expand Down
3 changes: 2 additions & 1 deletion src/localnet/localnet-feature-forward.ts
Original file line number Diff line number Diff line change
@@ -1,9 +1,10 @@
import { cancel, log as clackLog, intro, note, outro } from '@clack/prompts'
import { runExecutable } from '../core/data-access/run-executable.ts'
import type { AdbDependencies } from '../device/data-access/device-types.ts'
import { syncForwards } from './data-access/apply-forwards.ts'
import { inspectLocalnetContainer } from './data-access/docker-engine.ts'
import { localnetEndpoints, resolveLocalnetForContainer } from './data-access/localnet-engines.ts'
import type { AdbDependencies, LocalnetForwardCommandOptions } from './data-access/localnet-types.ts'
import type { LocalnetForwardCommandOptions } from './data-access/localnet-types.ts'
import { createInterruptSignal, watchForwards } from './data-access/watch-forwards.ts'
import { DEVICES_HEADING, devicesMessage, endpointsMessage } from './ui/localnet-ui-messages.ts'
import { renderDevicesHeading, renderForwards } from './ui/localnet-ui-render-forwards.ts'
Expand Down
2 changes: 1 addition & 1 deletion src/localnet/localnet-feature-start.ts
Original file line number Diff line number Diff line change
@@ -1,6 +1,7 @@
import { cancel, log as clackLog, intro, note, outro, spinner } from '@clack/prompts'
import { runExecutable } from '../core/data-access/run-executable.ts'
import { formatCliCommand } from '../core/util/format-cli-command.ts'
import type { AdbDependencies } from '../device/data-access/device-types.ts'
import { syncForwards } from './data-access/apply-forwards.ts'
import {
inspectLocalnetContainer,
Expand All @@ -16,7 +17,6 @@ import {
resolveLocalnetForContainer,
} from './data-access/localnet-engines.ts'
import type {
AdbDependencies,
JsonRpcFetcher,
LocalnetStartCommandOptions,
OwnedForward,
Expand Down
9 changes: 3 additions & 6 deletions src/localnet/localnet-feature-status.ts
Original file line number Diff line number Diff line change
@@ -1,14 +1,11 @@
import { cancel, intro, outro } from '@clack/prompts'
import { runExecutable } from '../core/data-access/run-executable.ts'
import type { AdbDependencies } from '../device/data-access/device-types.ts'
import { listAdbDevices } from '../device/data-access/list-adb-devices.ts'
import { collectExistingReverses } from './data-access/apply-forwards.ts'
import { inspectLocalnetContainer } from './data-access/docker-engine.ts'
import { listAdbDevices } from './data-access/list-adb-devices.ts'
import { localnetRpcUrl, resolveLocalnetForContainer } from './data-access/localnet-engines.ts'
import type {
AdbDependencies,
LocalnetStatusCommandOptions,
LocalnetStatusReport,
} from './data-access/localnet-types.ts'
import type { LocalnetStatusCommandOptions, LocalnetStatusReport } from './data-access/localnet-types.ts'
import { renderLocalnetStatus } from './ui/localnet-ui-render-forwards.ts'

export interface RunLocalnetStatusDependencies extends AdbDependencies {
Expand Down
12 changes: 4 additions & 8 deletions src/localnet/localnet-feature-stop.ts
Original file line number Diff line number Diff line change
@@ -1,16 +1,12 @@
import { cancel, log as clackLog, intro, outro } from '@clack/prompts'
import { runExecutable } from '../core/data-access/run-executable.ts'
import { removeAdbReverse } from './data-access/adb-reverse.ts'
import { removeAdbReverse } from '../device/data-access/adb-reverse.ts'
import type { AdbDependencies } from '../device/data-access/device-types.ts'
import { listAdbDevices } from '../device/data-access/list-adb-devices.ts'
import { collectExistingReverses } from './data-access/apply-forwards.ts'
import { inspectLocalnetContainer, isManagedContainer, removeLocalnetContainer } from './data-access/docker-engine.ts'
import { listAdbDevices } from './data-access/list-adb-devices.ts'
import { resolveLocalnetForContainer } from './data-access/localnet-engines.ts'
import type {
AdbDependencies,
LocalnetStopCommandOptions,
OwnedForward,
ResolvedLocalnetPort,
} from './data-access/localnet-types.ts'
import type { LocalnetStopCommandOptions, OwnedForward, ResolvedLocalnetPort } from './data-access/localnet-types.ts'
import { clearOwnedForwards, readOwnedForwards } from './data-access/owned-forwards-store.ts'
import { planRemovals } from './data-access/plan-forwards.ts'
import { unmanagedContainerMessage } from './ui/localnet-ui-messages.ts'
Expand Down
3 changes: 2 additions & 1 deletion src/localnet/ui/localnet-ui-render-forwards.ts
Original file line number Diff line number Diff line change
@@ -1,5 +1,6 @@
import { log } from '@clack/prompts'
import type { AdbDevice, ForwardAction, LocalnetStatusReport } from '../data-access/localnet-types.ts'
import type { AdbDevice } from '../../device/data-access/device-types.ts'
import type { ForwardAction, LocalnetStatusReport } from '../data-access/localnet-types.ts'
import { DEVICES_HEADING, NO_DEVICES_MESSAGE, VALIDATOR_HEADING } from './localnet-ui-messages.ts'

/** Marks a re-sync during `--watch`, so a table appearing later has a visible reason. */
Expand Down
8 changes: 4 additions & 4 deletions src/playground/playground-feature-serve.ts
Original file line number Diff line number Diff line change
Expand Up @@ -2,14 +2,14 @@ import { cancel, log as clackLog, intro, note, outro } from '@clack/prompts'
import { runExecutable } from '../core/data-access/run-executable.ts'
import type { PromptDependencies } from '../core/ui/core-ui-prompt-types.ts'
import { formatCliCommand } from '../core/util/format-cli-command.ts'
import { createAdbReverse, listAdbReverses, removeAdbReverse } from '../device/data-access/adb-reverse.ts'
import type { AdbDependencies } from '../device/data-access/device-types.ts'
import { isUsableDevice } from '../device/data-access/list-adb-devices.ts'
import { connectedDeviceLabel, listConnectedDevices } from '../device/data-access/list-connected-devices.ts'
import { openUrlOnDevice } from '../device/data-access/open-url-on-device.ts'
import { NO_CONNECTED_DEVICES_MESSAGE } from '../device/ui/device-ui-messages.ts'
import { resolveTargetDevice } from '../device/ui/device-ui-resolve-target-device.ts'
import { createAdbReverse, listAdbReverses, removeAdbReverse } from '../localnet/data-access/adb-reverse.ts'
import { isUsableDevice } from '../localnet/data-access/list-adb-devices.ts'
import { localnetRpcUrl, resolveLocalnet } from '../localnet/data-access/localnet-engines.ts'
import type { AdbDependencies } from '../localnet/data-access/localnet-types.ts'
import { openUrlOnDevice } from '../localnet/data-access/probe-device-port.ts'
import { probeRpc } from '../localnet/data-access/probe-rpc.ts'
import {
PLAYGROUND_DEVICE_PORT,
Expand Down
Loading
Loading