container.ts
Version:
Modular application framework
68 lines • 2.52 kB
JavaScript
"use strict";
Object.defineProperty(exports, "__esModule", { value: true });
/// <reference types="node" />
const assert = require("assert");
const path = require("path");
const fs = require("fs");
const Observable_1 = require("rxjs/Observable");
require("rxjs/add/observable/of");
require("rxjs/add/observable/throw");
require("rxjs/add/observable/bindNodeCallback");
require("rxjs/add/operator/do");
require("rxjs/add/operator/map");
const container_1 = require("../../container");
// TODO: Split caches.
// TODO: Validation library.
exports.ENV_ASSETS_PATH = "ASSETS_PATH";
/** Assets read only files interface. */
class Assets extends container_1.ContainerModule {
constructor(name, opts) {
super(name, opts);
this._cache = {};
// Get assets directory path from environment.
const assetsPath = this.environment.get(exports.ENV_ASSETS_PATH);
assert(assetsPath != null, "Assets path is undefined");
this._path = path.resolve(assetsPath);
this.debug(`path '${this.path}'`);
}
get path() { return this._path; }
get cache() { return this._cache; }
/** Read assets file contents with optional encoding. */
readFile(target, encoding) {
return this.read(target, encoding)
.do((data) => {
// Save to cache.
this.cache[target] = data;
});
}
/** Read assets file contents and parse JSON object. */
readJson(target, encoding = "utf8") {
return this.read(target, encoding)
.map((data) => {
try {
// Parse JSON and save to cache.
const json = JSON.parse(data);
this.cache[target] = json;
return json;
}
catch (error) {
return Observable_1.Observable.throw(error);
}
});
}
/** Read assets file contents. */
read(target, encoding) {
// Assets are read only, if contents defined in cache, return now.
if (this.cache[target] != null) {
const value = this.cache[target];
return Observable_1.Observable.of(value);
}
// Read file contents asynchronously.
const filePath = path.resolve(this.path, target);
const readFileCallback = fs.readFile.bind(this, filePath, encoding);
const readFile = Observable_1.Observable.bindNodeCallback(readFileCallback);
return readFile();
}
}
exports.Assets = Assets;
//# sourceMappingURL=Assets.js.map