diff --git a/src/emulator/databaseEmulator.ts b/src/emulator/databaseEmulator.ts index 9404fb342dd..c69477f28f8 100644 --- a/src/emulator/databaseEmulator.ts +++ b/src/emulator/databaseEmulator.ts @@ -5,7 +5,7 @@ import * as path from "path"; import * as api from "../api"; import * as utils from "../utils"; -import * as javaEmulators from "../serve/javaEmulators"; +import * as downloadableEmulators from "./downloadableEmulators"; import { EmulatorInfo, EmulatorInstance, Emulators } from "../emulator/types"; import { Constants } from "./constants"; import { FirebaseError } from "../error"; @@ -45,7 +45,7 @@ export class DatabaseEmulator implements EmulatorInstance { }); } - return javaEmulators.start(Emulators.DATABASE, this.args); + return downloadableEmulators.start(Emulators.DATABASE, this.args); } async connect(): Promise { @@ -53,7 +53,7 @@ export class DatabaseEmulator implements EmulatorInstance { } async stop(): Promise { - return javaEmulators.stop(Emulators.DATABASE); + return downloadableEmulators.stop(Emulators.DATABASE); } getInfo(): EmulatorInfo { diff --git a/src/emulator/download.ts b/src/emulator/download.ts index 57d9ec980bd..9f2810feec4 100644 --- a/src/emulator/download.ts +++ b/src/emulator/download.ts @@ -5,7 +5,7 @@ import * as ProgressBar from "progress"; import { FirebaseError } from "../error"; import * as utils from "../utils"; import { Emulators, EmulatorDownloadDetails } from "./types"; -import * as javaEmulators from "../serve/javaEmulators"; +import * as downloadableEmulators from "./downloadableEmulators"; import * as tmp from "tmp"; import * as fs from "fs-extra"; import * as path from "path"; @@ -16,7 +16,7 @@ tmp.setGracefulCleanup(); type DownloadableEmulator = Emulators.FIRESTORE | Emulators.DATABASE | Emulators.PUBSUB; module.exports = async (name: DownloadableEmulator) => { - const emulator = javaEmulators.getDownloadDetails(name); + const emulator = downloadableEmulators.getDownloadDetails(name); utils.logLabeledBullet(name, `downloading ${path.basename(emulator.downloadPath)}...`); fs.ensureDirSync(emulator.opts.cacheDir); diff --git a/src/serve/javaEmulators.ts b/src/emulator/downloadableEmulators.ts similarity index 88% rename from src/serve/javaEmulators.ts rename to src/emulator/downloadableEmulators.ts index c7082271649..2c4fa427726 100644 --- a/src/serve/javaEmulators.ts +++ b/src/emulator/downloadableEmulators.ts @@ -1,11 +1,11 @@ import { Emulators, - JavaEmulators, - JavaEmulatorCommand, - JavaEmulatorDetails, + DownloadableEmulators, + DownloadableEmulatorCommand, + DownloadableEmulatorDetails, EmulatorDownloadDetails, -} from "../emulator/types"; -import { Constants } from "../emulator/constants"; +} from "./types"; +import { Constants } from "./constants"; import { FirebaseError } from "../error"; import * as childProcess from "child_process"; @@ -25,7 +25,7 @@ const EMULATOR_INSTANCE_KILL_TIMEOUT = 2000; /* ms */ const CACHE_DIR = process.env.FIREBASE_EMULATORS_PATH || path.join(os.homedir(), ".cache", "firebase", "emulators"); -const DownloadDetails: { [s in JavaEmulators]: EmulatorDownloadDetails } = { +const DownloadDetails: { [s in DownloadableEmulators]: EmulatorDownloadDetails } = { database: { downloadPath: path.join(CACHE_DIR, "firebase-database-emulator-v4.4.0.jar"), version: "4.4.0", @@ -83,7 +83,7 @@ const DownloadDetails: { [s in JavaEmulators]: EmulatorDownloadDetails } = { }, }; -const EmulatorDetails: { [s in JavaEmulators]: JavaEmulatorDetails } = { +const EmulatorDetails: { [s in DownloadableEmulators]: DownloadableEmulatorDetails } = { database: { name: Emulators.DATABASE, instance: null, @@ -106,7 +106,7 @@ const EmulatorDetails: { [s in JavaEmulators]: JavaEmulatorDetails } = { }, }; -const Commands: { [s in JavaEmulators]: JavaEmulatorCommand } = { +const Commands: { [s in DownloadableEmulators]: DownloadableEmulatorCommand } = { database: { binary: "java", args: ["-Duser.language=en", "-jar", getExecPath(Emulators.DATABASE)], @@ -140,7 +140,7 @@ const Commands: { [s in JavaEmulators]: JavaEmulatorCommand } = { }, }; -function getExecPath(name: JavaEmulators): string { +function getExecPath(name: DownloadableEmulators): string { const details = getDownloadDetails(name); return details.binaryPath || details.downloadPath; } @@ -154,7 +154,10 @@ function _getLogFileName(name: string): string { * @param emulator - string identifier for the emulator to start. * @param args - map of addittional args */ -function _getCommand(emulator: JavaEmulators, args: { [s: string]: any }): JavaEmulatorCommand { +function _getCommand( + emulator: DownloadableEmulators, + args: { [s: string]: any } +): DownloadableEmulatorCommand { const baseCmd = Commands[emulator]; const defaultPort = Constants.getDefaultPort(emulator); @@ -193,7 +196,7 @@ function _getCommand(emulator: JavaEmulators, args: { [s: string]: any }): JavaE }; } -function _fatal(emulator: JavaEmulatorDetails, errorMsg: string): void { +function _fatal(emulator: DownloadableEmulatorDetails, errorMsg: string): void { if (emulator.instance) { emulator.instance.kill("SIGINT"); } @@ -201,8 +204,8 @@ function _fatal(emulator: JavaEmulatorDetails, errorMsg: string): void { } async function _runBinary( - emulator: JavaEmulatorDetails, - command: JavaEmulatorCommand, + emulator: DownloadableEmulatorDetails, + command: DownloadableEmulatorCommand, extraEnv: NodeJS.ProcessEnv ): Promise { return new Promise((resolve) => { @@ -267,15 +270,15 @@ async function _runBinary( }); } -export function getDownloadDetails(emulator: JavaEmulators): EmulatorDownloadDetails { +export function getDownloadDetails(emulator: DownloadableEmulators): EmulatorDownloadDetails { return DownloadDetails[emulator]; } -export function get(emulator: JavaEmulators): JavaEmulatorDetails { +export function get(emulator: DownloadableEmulators): DownloadableEmulatorDetails { return EmulatorDetails[emulator]; } -export async function stop(targetName: JavaEmulators): Promise { +export async function stop(targetName: DownloadableEmulators): Promise { const emulator = EmulatorDetails[targetName]; return new Promise((resolve, reject) => { if (emulator.instance) { @@ -298,7 +301,7 @@ export async function stop(targetName: JavaEmulators): Promise { }); } -export async function downloadIfNecessary(targetName: JavaEmulators): Promise { +export async function downloadIfNecessary(targetName: DownloadableEmulators): Promise { const hasEmulator = fs.existsSync(getExecPath(targetName)); if (hasEmulator) { @@ -309,7 +312,7 @@ export async function downloadIfNecessary(targetName: JavaEmulators): Promise { diff --git a/src/emulator/firestoreEmulator.ts b/src/emulator/firestoreEmulator.ts index 26d93185440..7eccba207e6 100644 --- a/src/emulator/firestoreEmulator.ts +++ b/src/emulator/firestoreEmulator.ts @@ -6,7 +6,7 @@ import * as pf from "portfinder"; import * as api from "../api"; import * as utils from "../utils"; -import * as javaEmulators from "../serve/javaEmulators"; +import * as downloadableEmulators from "./downloadableEmulators"; import { EmulatorInfo, EmulatorInstance, Emulators, Severity } from "../emulator/types"; import { EmulatorRegistry } from "./registry"; import { Constants } from "./constants"; @@ -85,7 +85,7 @@ export class FirestoreEmulator implements EmulatorInstance { // serve WebChannel on the main port anyway. } - return javaEmulators.start(Emulators.FIRESTORE, this.args); + return downloadableEmulators.start(Emulators.FIRESTORE, this.args); } async connect(): Promise { @@ -97,7 +97,7 @@ export class FirestoreEmulator implements EmulatorInstance { this.rulesWatcher.close(); } - return javaEmulators.stop(Emulators.FIRESTORE); + return downloadableEmulators.stop(Emulators.FIRESTORE); } getInfo(): EmulatorInfo { diff --git a/src/emulator/gui.ts b/src/emulator/gui.ts index 95746f8964a..5b75028a96e 100644 --- a/src/emulator/gui.ts +++ b/src/emulator/gui.ts @@ -1,5 +1,5 @@ import { EmulatorInstance, EmulatorInfo, Emulators } from "./types"; -import * as javaEmulators from "../serve/javaEmulators"; +import * as downloadableEmulators from "./downloadableEmulators"; import { EmulatorRegistry } from "./registry"; import { EmulatorHub } from "./hub"; import { FirebaseError } from "../error"; @@ -32,7 +32,7 @@ export class EmulatorGUI implements EmulatorInstance { [EmulatorHub.EMULATOR_HUB_ENV]: `${hubInfo.host}:${hubInfo.port}`, }; - return javaEmulators.start(Emulators.GUI, { auto_download }, env); + return downloadableEmulators.start(Emulators.GUI, { auto_download }, env); } async connect(): Promise { @@ -40,7 +40,7 @@ export class EmulatorGUI implements EmulatorInstance { } stop(): Promise { - return javaEmulators.stop(Emulators.GUI); + return downloadableEmulators.stop(Emulators.GUI); } getInfo(): EmulatorInfo { diff --git a/src/emulator/hubExport.ts b/src/emulator/hubExport.ts index ab2bcd8b40d..4ab57edd548 100644 --- a/src/emulator/hubExport.ts +++ b/src/emulator/hubExport.ts @@ -6,7 +6,7 @@ import { IMPORT_EXPORT_EMULATORS, Emulators, ALL_EMULATORS } from "./types"; import { EmulatorRegistry } from "./registry"; import { FirebaseError } from "../error"; import { EmulatorHub } from "./hub"; -import { getDownloadDetails } from "../serve/javaEmulators"; +import { getDownloadDetails } from "./downloadableEmulators"; export interface ExportMetadata { version: string; diff --git a/src/emulator/pubsubEmulator.ts b/src/emulator/pubsubEmulator.ts index 85842ef90e6..4b68e0e6782 100644 --- a/src/emulator/pubsubEmulator.ts +++ b/src/emulator/pubsubEmulator.ts @@ -2,7 +2,7 @@ import * as uuid from "uuid"; import { PubSub, Subscription, Message } from "@google-cloud/pubsub"; import * as api from "../api"; -import * as javaEmulators from "../serve/javaEmulators"; +import * as downloadableEmulators from "./downloadableEmulators"; import { EmulatorLogger } from "./emulatorLogger"; import { EmulatorInfo, EmulatorInstance, Emulators } from "../emulator/types"; import { Constants } from "./constants"; @@ -37,7 +37,7 @@ export class PubsubEmulator implements EmulatorInstance { } async start(): Promise { - return javaEmulators.start(Emulators.PUBSUB, this.args); + return downloadableEmulators.start(Emulators.PUBSUB, this.args); } async connect(): Promise { @@ -45,7 +45,7 @@ export class PubsubEmulator implements EmulatorInstance { } async stop(): Promise { - await javaEmulators.stop(Emulators.PUBSUB); + await downloadableEmulators.stop(Emulators.PUBSUB); } getInfo(): EmulatorInfo { diff --git a/src/emulator/types.ts b/src/emulator/types.ts index 1c97e72efd4..234f1d217dc 100644 --- a/src/emulator/types.ts +++ b/src/emulator/types.ts @@ -11,12 +11,12 @@ export enum Emulators { GUI = "gui", } -export type JavaEmulators = +export type DownloadableEmulators = | Emulators.FIRESTORE | Emulators.DATABASE | Emulators.PUBSUB | Emulators.GUI; -export const JAVA_EMULATORS = [ +export const DOWNLOADABLE_EMULATORS = [ Emulators.FIRESTORE, Emulators.DATABASE, Emulators.PUBSUB, @@ -39,8 +39,8 @@ export const EMULATORS_SUPPORTED_BY_GUI = [Emulators.DATABASE]; // TODO: Is there a way we can just allow iteration over the enum? export const ALL_EMULATORS = [Emulators.HUB, Emulators.GUI, ...ALL_SERVICE_EMULATORS]; -export function isJavaEmulator(value: string): value is JavaEmulators { - return isEmulator(value) && JAVA_EMULATORS.indexOf(value) >= 0; +export function isDownloadableEmulator(value: string): value is DownloadableEmulators { + return isEmulator(value) && DOWNLOADABLE_EMULATORS.indexOf(value) >= 0; } export function isEmulator(value: string): value is Emulators { @@ -84,7 +84,7 @@ export interface EmulatorInfo { port: number; } -export interface JavaEmulatorCommand { +export interface DownloadableEmulatorCommand { binary: string; args: string[]; optionalArgs: string[]; @@ -117,7 +117,7 @@ export interface EmulatorDownloadDetails { binaryPath?: string; } -export interface JavaEmulatorDetails { +export interface DownloadableEmulatorDetails { name: Emulators; instance: ChildProcess | null; stdout: any | null; diff --git a/src/init/features/emulators.ts b/src/init/features/emulators.ts index 24efc16ca1c..f0b0c5bead3 100644 --- a/src/init/features/emulators.ts +++ b/src/init/features/emulators.ts @@ -2,9 +2,9 @@ import * as clc from "cli-color"; import * as _ from "lodash"; import * as utils from "../../utils"; import { prompt } from "../../prompt"; -import { Emulators, ALL_SERVICE_EMULATORS, isJavaEmulator } from "../../emulator/types"; +import { Emulators, ALL_SERVICE_EMULATORS, isDownloadableEmulator } from "../../emulator/types"; import { Constants } from "../../emulator/constants"; -import { downloadIfNecessary } from "../../serve/javaEmulators"; +import { downloadIfNecessary } from "../../emulator/downloadableEmulators"; interface EmulatorsInitSelections { emulators?: Emulators[]; @@ -68,7 +68,7 @@ export async function doSetup(setup: any, config: any) { if (selections.download) { for (const selected of selections.emulators) { - if (isJavaEmulator(selected)) { + if (isDownloadableEmulator(selected)) { await downloadIfNecessary(selected); } } diff --git a/src/test/serve/javaEmulators.spec.ts b/src/test/emulators/downloadableEmulators.spec.ts similarity index 80% rename from src/test/serve/javaEmulators.spec.ts rename to src/test/emulators/downloadableEmulators.spec.ts index 3fb82d6dcef..551381a6078 100644 --- a/src/test/serve/javaEmulators.spec.ts +++ b/src/test/emulators/downloadableEmulators.spec.ts @@ -1,13 +1,13 @@ import { expect } from "chai"; import * as path from "path"; -import * as javaEmulators from "../../serve/javaEmulators"; +import * as downloadableEmulators from "../../emulator/downloadableEmulators"; import { Emulators } from "../../emulator/types"; type DownloadableEmulator = Emulators.FIRESTORE | Emulators.DATABASE | Emulators.PUBSUB; function checkDownloadPath(name: DownloadableEmulator): void { - const emulator = javaEmulators.getDownloadDetails(name); + const emulator = downloadableEmulators.getDownloadDetails(name); expect(path.basename(emulator.opts.remoteUrl)).to.eq(path.basename(emulator.downloadPath)); }