Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Modify functions emulator to invoke RTDB emulator triggers #1347

Merged
merged 21 commits into from
Jun 5, 2019
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
21 commits
Select commit Hold shift + click to select a range
edb03ac
Add RTDB emulator support to the functions emulator
jmwski May 28, 2019
ae0ffe4
Add auth header to function trigger setup request
jmwski May 29, 2019
783d764
Fix lint errors
jmwski May 30, 2019
17edb2d
Use regex to extract database-root-relative paths for trigger creation
jmwski May 30, 2019
04cbfa3
Merge branch 'master' into wyszynski/rtdb-emulator-functions
jmwski May 30, 2019
fceb7f2
Make path extractor regex a constant, enforce non-empty instance and …
jmwski May 30, 2019
75375b5
Merge branch 'master' into wyszynski/rtdb-emulator-functions
jmwski May 30, 2019
0485229
Pass functions emulator arguments to database emulator when present
jmwski May 30, 2019
cad56b2
Merge branch 'wyszynski/rtdb-emulator-functions' of https://github.co…
jmwski May 30, 2019
324f073
Add trigger definition name to invocation payload topicName
jmwski May 31, 2019
425b373
Use snake-case in database emulator args
jmwski May 31, 2019
2646aa1
Add RTDB emulator support to the functions emulator
jmwski May 28, 2019
70b443c
Add auth header to function trigger setup request
jmwski May 29, 2019
4ca8b4d
Fix lint errors
jmwski May 30, 2019
a830f41
Use regex to extract database-root-relative paths for trigger creation
jmwski May 30, 2019
2cdc215
Make path extractor regex a constant, enforce non-empty instance and …
jmwski May 30, 2019
2cbd0eb
Pass functions emulator arguments to database emulator when present
jmwski May 30, 2019
cba83e2
Add trigger definition name to invocation payload topicName
jmwski May 31, 2019
db05600
Use snake-case in database emulator args
jmwski May 31, 2019
b3ae92e
Merge branch 'wyszynski/rtdb-emulator-functions' of https://github.co…
jmwski Jun 4, 2019
f4010dd
Release database emulator v4.0.0
jmwski Jun 4, 2019
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Jump to
Jump to file
Failed to load files.
Diff view
Diff view
3 changes: 3 additions & 0 deletions changelog.txt
Original file line number Diff line number Diff line change
@@ -1 +1,4 @@
* **BREAKING** The CLI no longer supports being run in Node 6 environments.
* **BREAKING** RTDB Emulator comes up with open rules by default
* Modify RTDB emulator to publish triggers to the functions emulator
* Modify functions emulator to invoke RTDB emulator triggers
1 change: 1 addition & 0 deletions src/emulator/constants.ts
Original file line number Diff line number Diff line change
Expand Up @@ -13,6 +13,7 @@ const DEFAULT_HOST = "localhost";

export class Constants {
static SERVICE_FIRESTORE = "firestore.googleapis.com";
static SERVICE_REALTIME_DATABASE = "firebaseio.com";
jmwski marked this conversation as resolved.
Show resolved Hide resolved

static getDefaultHost(emulator: Emulators): string {
return DEFAULT_HOST;
Expand Down
25 changes: 15 additions & 10 deletions src/emulator/controller.ts
Original file line number Diff line number Diff line change
Expand Up @@ -154,17 +154,22 @@ export async function startAll(options: any): Promise<void> {

if (targets.indexOf(Emulators.DATABASE) > -1) {
const databaseAddr = Constants.getAddress(Emulators.DATABASE, options);
const databaseEmulator = new DatabaseEmulator({
host: databaseAddr.host,
port: databaseAddr.port,
});
let databaseEmulator;
if (targets.indexOf(Emulators.FUNCTIONS) > -1) {
const functionsAddr = Constants.getAddress(Emulators.FUNCTIONS, options);
databaseEmulator = new DatabaseEmulator({
host: databaseAddr.host,
port: databaseAddr.port,
functions_emulator_host: functionsAddr.host,
functions_emulator_port: functionsAddr.port,
});
} else {
databaseEmulator = new DatabaseEmulator({
host: databaseAddr.host,
port: databaseAddr.port,
});
}
await startEmulator(databaseEmulator);

// TODO: When the database emulator is integrated with the Functions
// emulator, we will need to pass the port in and remove this warning
utils.logWarning(
`Note: the database emulator is not currently integrated with the functions emulator.`
);
}

if (targets.indexOf(Emulators.HOSTING) > -1) {
Expand Down
2 changes: 2 additions & 0 deletions src/emulator/databaseEmulator.ts
Original file line number Diff line number Diff line change
Expand Up @@ -5,6 +5,8 @@ import { Constants } from "./constants";
interface DatabaseEmulatorArgs {
port?: number;
host?: string;
functions_emulator_port?: number;
functions_emulator_host?: string;
jmwski marked this conversation as resolved.
Show resolved Hide resolved
}

export class DatabaseEmulator implements EmulatorInstance {
Expand Down
79 changes: 79 additions & 0 deletions src/emulator/functionsEmulator.ts
Original file line number Diff line number Diff line change
Expand Up @@ -32,6 +32,14 @@ import { EmulatorLogger, Verbosity } from "./emulatorLogger";

const EVENT_INVOKE = "functions:invoke";

/*
* The Realtime Database emulator expects the `path` field in its trigger
* definition to be relative to the database root. This regex is used to extract
* that path from the `resource` member in the trigger definition used by the
* functions emulator.
*/
const DATABASE_PATH_PATTERN = new RegExp("^projects/[^/]+/instances/[^/]+/refs(/.*)$");

export interface FunctionsEmulatorArgs {
port?: number;
host?: string;
Expand Down Expand Up @@ -490,6 +498,9 @@ You can probably fix this by running "npm install ${
case Constants.SERVICE_FIRESTORE:
await this.addFirestoreTrigger(this.projectId, definition);
break;
case Constants.SERVICE_REALTIME_DATABASE:
await this.addRealtimeDatabaseTrigger(this.projectId, definition);
break;
default:
EmulatorLogger.log("DEBUG", `Unsupported trigger: ${JSON.stringify(definition)}`);
EmulatorLogger.log(
Expand All @@ -514,6 +525,74 @@ You can probably fix this by running "npm install ${
return loadTriggers();
}

addRealtimeDatabaseTrigger(
projectId: string,
definition: EmulatedTriggerDefinition
): Promise<any> {
const databasePort = EmulatorRegistry.getPort(Emulators.DATABASE);
if (!databasePort) {
EmulatorLogger.log(
"INFO",
`Ignoring trigger "${
definition.name
}" because the Realtime Database emulator is not running.`
);
return Promise.resolve();
}
if (definition.eventTrigger === undefined) {
EmulatorLogger.log(
"WARN",
`Event trigger "${definition.name}" has undefined "eventTrigger" member`
);
return Promise.reject();
}

const result: string[] | null = DATABASE_PATH_PATTERN.exec(definition.eventTrigger.resource);
if (result === null || result.length !== 2) {
EmulatorLogger.log(
"WARN",
`Event trigger "${definition.name}" has malformed "resource" member. ` +
`${definition.eventTrigger.resource}`
);
return Promise.reject();
}

const bundle = JSON.stringify([
{
name: `projects/${projectId}/locations/_/functions/${definition.name}`,
path: result[1], // path stored in the first capture group
event: definition.eventTrigger.eventType,
topic: `projects/${projectId}/topics/${definition.name}`,
},
]);

EmulatorLogger.logLabeled(
"BULLET",
"functions",
`Setting up Realtime Database trigger "${definition.name}"`
);
logger.debug(`addDatabaseTrigger`, JSON.stringify(bundle));
return new Promise((resolve, reject) => {
request.put(
`http://localhost:${databasePort}/.settings/functionTriggers.json`,
{
auth: {
bearer: "owner",
},
body: bundle,
},
(err, res, body) => {
if (err) {
EmulatorLogger.log("WARN", "Error adding trigger: " + err);
reject();
return;
}
resolve();
}
);
});
}

addFirestoreTrigger(projectId: string, definition: EmulatedTriggerDefinition): Promise<any> {
const firestorePort = EmulatorRegistry.getPort(Emulators.FIRESTORE);
if (!firestorePort) {
Expand Down
8 changes: 4 additions & 4 deletions src/serve/javaEmulators.ts
Original file line number Diff line number Diff line change
Expand Up @@ -25,10 +25,10 @@ const EmulatorDetails: { [s in JavaEmulators]: JavaEmulatorDetails } = {
stdout: null,
cacheDir: CACHE_DIR,
remoteUrl:
"https://storage.googleapis.com/firebase-preview-drop/emulator/firebase-database-emulator-v3.5.0.jar",
expectedSize: 17013124,
expectedChecksum: "4bc8a67bc2a11d3e7ed226eda1b1a986",
localPath: path.join(CACHE_DIR, "firebase-database-emulator-v3.5.0.jar"),
"https://storage.googleapis.com/firebase-preview-drop/emulator/firebase-database-emulator-v4.0.0.jar",
expectedSize: 17097803,
expectedChecksum: "102c8de422db81933a0f29fede5a80a0",
localPath: path.join(CACHE_DIR, "firebase-database-emulator-v4.0.0.jar"),
},
firestore: {
name: Emulators.FIRESTORE,
Expand Down