Skip to content

Commit

Permalink
Merge branch 'master' into hsinpei/storage-emulator-multiple-targets-3
Browse files Browse the repository at this point in the history
  • Loading branch information
tohhsinpei committed Mar 16, 2022
2 parents 6ed793c + 1322164 commit 0c8c165
Show file tree
Hide file tree
Showing 5 changed files with 8 additions and 196 deletions.
4 changes: 2 additions & 2 deletions npm-shrinkwrap.json

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

2 changes: 1 addition & 1 deletion package.json
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
{
"name": "firebase-tools",
"version": "10.3.0",
"version": "10.3.1",
"description": "Command-Line Interface for Firebase",
"main": "./lib/index.js",
"bin": {
Expand Down
10 changes: 5 additions & 5 deletions scripts/storage-emulator-integration/run.sh
Original file line number Diff line number Diff line change
Expand Up @@ -9,8 +9,8 @@ firebase setup:emulators:storage

mocha scripts/storage-emulator-integration/rules/*.test.ts

# mocha \
# --require ts-node/register \
# --require source-map-support/register \
# --require src/test/helpers/mocha-bootstrap.ts \
# scripts/storage-emulator-integration/tests.ts
mocha \
--require ts-node/register \
--require source-map-support/register \
--require src/test/helpers/mocha-bootstrap.ts \
scripts/storage-emulator-integration/tests.ts
8 changes: 0 additions & 8 deletions src/emulator/storage/apis/firebase.ts
Original file line number Diff line number Diff line change
Expand Up @@ -68,15 +68,7 @@ export function createFirebaseEndpoints(emulator: StorageEmulator): Router {
firebaseStorageAPI.use(/.*\/b\/(.+?)\/.*/, (req, res, next) => {
const bucketId = req.params[0];
storageLayer.createBucket(bucketId);
<<<<<<< HEAD
<<<<<<< HEAD
if (!emulator.rulesManager.getRuleset(bucketId)) {
=======
if (!emulator.getRules(bucketId)) {
>>>>>>> eff938c0 (Make StorageRulesManager an interface; add StorageRulesManagerRegistry)
=======
if (!emulator.rulesManager.getRuleset(bucketId)) {
>>>>>>> f54e03ec (Change emulator arg to take SourceFile only)
EmulatorLogger.forEmulator(Emulators.STORAGE).log(
"WARN",
"Permission denied because no Storage ruleset is currently loaded, check your rules for syntax errors."
Expand Down
180 changes: 0 additions & 180 deletions src/emulator/storage/rules/manager.ts
Original file line number Diff line number Diff line change
Expand Up @@ -3,8 +3,6 @@ import { EmulatorLogger } from "../../emulatorLogger";
import { Emulators } from "../../types";
import { SourceFile } from "./types";
import { StorageRulesIssues, StorageRulesRuntime, StorageRulesetInstance } from "./runtime";
<<<<<<< HEAD
<<<<<<< HEAD
import { RulesConfig } from "..";

/**
Expand Down Expand Up @@ -51,163 +49,39 @@ export function createStorageRulesManager(
return Array.isArray(rules)
? new ResourceBasedStorageRulesManager(rules, runtime)
: new DefaultStorageRulesManager(rules, runtime);
=======
import { readFile } from "../../../fsutils";
import { RulesConfig, RulesType } from "..";
=======
import { RulesConfig } from "..";
>>>>>>> f54e03ec (Change emulator arg to take SourceFile only)

/**
* Keeps track of the rules source file and maintains a generated ruleset for one or more storage
* resources.
*
* Example usage:
*
* ```
* const rulesManager = createStorageRulesManager(initialRules);
* rulesManager.start();
* rulesManager.updateSourceFile(newRules);
* rulesManager.stop();
* ```
*/
export interface StorageRulesManager {
/** Sets source file for each resource using the rules previously passed in the constructor. */
start(): Promise<StorageRulesIssues>;

/**
* Retrieves the generated ruleset for the resource. Returns undefined if the resource is invalid
* or if the ruleset has not been generated.
*/
getRuleset(resource: string): StorageRulesetInstance | undefined;

/**
* Updates the source file and, correspondingly, the file watcher and ruleset for the resource.
* Returns an array of errors and/or warnings that arise from loading the ruleset.
*/
updateSourceFile(rules: SourceFile, resource: string): Promise<StorageRulesIssues>;

/** Removes listeners from all files for all resources. */
stop(): Promise<void>;
}

/**
* Creates either a {@link DefaultStorageRulesManager} to manage rules for a single resource
* or a {@link ResourceBasedStorageRulesManager} for multiple resources.
*/
export function createStorageRulesManager(
rules: SourceFile | RulesConfig[],
runtime: StorageRulesRuntime
): StorageRulesManager {
return Array.isArray(rules)
<<<<<<< HEAD
? new StorageRulesManagerRegistry(rules, runtime)
: new StorageRulesManagerImplementation(rules, runtime);
>>>>>>> eff938c0 (Make StorageRulesManager an interface; add StorageRulesManagerRegistry)
=======
? new ResourceBasedStorageRulesManager(rules, runtime)
: new DefaultStorageRulesManager(rules, runtime);
>>>>>>> c196f790 (PR feedback, mostly re: API usage)
}

/**
* Maintains a {@link StorageRulesetInstance} for a given source file. Listens for changes to the
* file and updates the ruleset accordingly.
*/
<<<<<<< HEAD
<<<<<<< HEAD
class DefaultStorageRulesManager implements StorageRulesManager {
private _rules: SourceFile;
=======
class StorageRulesManagerImplementation implements StorageRulesManager {
private _sourceFile?: SourceFile;
>>>>>>> eff938c0 (Make StorageRulesManager an interface; add StorageRulesManagerRegistry)
=======
class DefaultStorageRulesManager implements StorageRulesManager {
private _rules: SourceFile;
>>>>>>> c196f790 (PR feedback, mostly re: API usage)
private _ruleset?: StorageRulesetInstance;
private _watcher = new chokidar.FSWatcher();
private _logger = EmulatorLogger.forEmulator(Emulators.STORAGE);

<<<<<<< HEAD
<<<<<<< HEAD
<<<<<<< HEAD
constructor(_rules: SourceFile, private _runtime: StorageRulesRuntime) {
this._rules = _rules;
}

start(): Promise<StorageRulesIssues> {
return this.updateSourceFile(this._rules);
=======
constructor(private _initRules: RulesType, private _runtime: StorageRulesRuntime) {}
=======
constructor(private _initRules: SourceFile, private _runtime: StorageRulesRuntime) {}
>>>>>>> f54e03ec (Change emulator arg to take SourceFile only)

async start(): Promise<StorageRulesIssues> {
return this.setSourceFile(this._initRules);
>>>>>>> eff938c0 (Make StorageRulesManager an interface; add StorageRulesManagerRegistry)
=======
constructor(_rules: SourceFile, private _runtime: StorageRulesRuntime) {
this._rules = _rules;
}

start(): Promise<StorageRulesIssues> {
return this.updateSourceFile(this._rules);
>>>>>>> c196f790 (PR feedback, mostly re: API usage)
}

getRuleset(): StorageRulesetInstance | undefined {
return this._ruleset;
}

<<<<<<< HEAD
<<<<<<< HEAD
<<<<<<< HEAD
async updateSourceFile(rules: SourceFile): Promise<StorageRulesIssues> {
const prevRulesFile = this._rules.name;
this._rules = rules;
=======
async setSourceFile(rules: RulesType): Promise<StorageRulesIssues> {
const prevRulesFile = this._sourceFile?.name;
let rulesFile: string;
if (typeof rules === "string") {
this._sourceFile = { name: rules, content: readFile(rules) };
rulesFile = rules;
} else {
// Allow invalid file path here for testing
this._sourceFile = rules;
rulesFile = rules.name;
}

>>>>>>> eff938c0 (Make StorageRulesManager an interface; add StorageRulesManagerRegistry)
=======
async setSourceFile(rules: SourceFile): Promise<StorageRulesIssues> {
const prevRulesFile = this._sourceFile?.name;
this._sourceFile = rules;
>>>>>>> f54e03ec (Change emulator arg to take SourceFile only)
=======
async updateSourceFile(rules: SourceFile): Promise<StorageRulesIssues> {
const prevRulesFile = this._rules.name;
this._rules = rules;
>>>>>>> c196f790 (PR feedback, mostly re: API usage)
const issues = await this.loadRuleset();
this.updateWatcher(rules.name, prevRulesFile);
return issues;
}

<<<<<<< HEAD
<<<<<<< HEAD
async stop(): Promise<void> {
=======
async close(): Promise<void> {
delete this._sourceFile;
delete this._ruleset;
>>>>>>> eff938c0 (Make StorageRulesManager an interface; add StorageRulesManagerRegistry)
=======
async stop(): Promise<void> {
>>>>>>> c196f790 (PR feedback, mostly re: API usage)
await this._watcher.close();
}

Expand Down Expand Up @@ -259,8 +133,6 @@ class DefaultStorageRulesManager implements StorageRulesManager {
}

/**
<<<<<<< HEAD
<<<<<<< HEAD
* Maintains a mapping from storage resource to {@link DefaultStorageRulesManager} and
* directs calls to the appropriate instance.
*/
Expand All @@ -269,25 +141,6 @@ class ResourceBasedStorageRulesManager implements StorageRulesManager {

constructor(_rulesConfig: RulesConfig[], private _runtime: StorageRulesRuntime) {
for (const { resource, rules } of _rulesConfig) {
=======
* Maintains a mapping from storage resource to {@link StorageRulesManagerImplementation} and
=======
* Maintains a mapping from storage resource to {@link DefaultStorageRulesManager} and
>>>>>>> c196f790 (PR feedback, mostly re: API usage)
* directs calls to the appropriate instance.
*/
class ResourceBasedStorageRulesManager implements StorageRulesManager {
private _rulesManagers = new Map<string, DefaultStorageRulesManager>();

<<<<<<< HEAD
constructor(_initRules: RulesConfig[], private _runtime: StorageRulesRuntime) {
this._rulesManagers = new Map<string, StorageRulesManagerImplementation>();
for (const { resource, rules } of _initRules) {
>>>>>>> eff938c0 (Make StorageRulesManager an interface; add StorageRulesManagerRegistry)
=======
constructor(_rulesConfig: RulesConfig[], private _runtime: StorageRulesRuntime) {
for (const { resource, rules } of _rulesConfig) {
>>>>>>> c196f790 (PR feedback, mostly re: API usage)
this.createRulesManager(resource, rules);
}
}
Expand All @@ -304,31 +157,7 @@ class ResourceBasedStorageRulesManager implements StorageRulesManager {
return this._rulesManagers.get(resource)?.getRuleset();
}

<<<<<<< HEAD
<<<<<<< HEAD
<<<<<<< HEAD
updateSourceFile(rules: SourceFile, resource: string): Promise<StorageRulesIssues> {
const rulesManager =
this._rulesManagers.get(resource) || this.createRulesManager(resource, rules);
return rulesManager.updateSourceFile(rules);
}

async stop(): Promise<void> {
await Promise.all(
Array.from(this._rulesManagers.values(), async (rulesManager) => await rulesManager.stop())
);
}

private createRulesManager(resource: string, rules: SourceFile): DefaultStorageRulesManager {
const rulesManager = new DefaultStorageRulesManager(rules, this._runtime);
=======
async setSourceFile(rules: RulesType, resource: string): Promise<StorageRulesIssues> {
=======
async setSourceFile(rules: SourceFile, resource: string): Promise<StorageRulesIssues> {
>>>>>>> f54e03ec (Change emulator arg to take SourceFile only)
=======
updateSourceFile(rules: SourceFile, resource: string): Promise<StorageRulesIssues> {
>>>>>>> c196f790 (PR feedback, mostly re: API usage)
const rulesManager =
this._rulesManagers.get(resource) || this.createRulesManager(resource, rules);
return rulesManager.updateSourceFile(rules);
Expand All @@ -340,17 +169,8 @@ class ResourceBasedStorageRulesManager implements StorageRulesManager {
);
}

<<<<<<< HEAD
private createRulesManager(
resource: string,
rules: SourceFile
): StorageRulesManagerImplementation {
const rulesManager = new StorageRulesManagerImplementation(rules, this._runtime);
>>>>>>> eff938c0 (Make StorageRulesManager an interface; add StorageRulesManagerRegistry)
=======
private createRulesManager(resource: string, rules: SourceFile): DefaultStorageRulesManager {
const rulesManager = new DefaultStorageRulesManager(rules, this._runtime);
>>>>>>> c196f790 (PR feedback, mostly re: API usage)
this._rulesManagers.set(resource, rulesManager);
return rulesManager;
}
Expand Down

0 comments on commit 0c8c165

Please sign in to comment.