jenkins-bot has submitted this change and it was merged.

Change subject: Customizable headers, custom vega, doc cleanup
......................................................................


Customizable headers, custom vega, doc cleanup

* Allow header customization in config.yaml, for example:

  headers:
    'Cache-Control': 'public, s-maxage=200, max-age=200'
  errorHeaders:
    'Cache-Control': 'public, s-maxage=30, max-age=30'

* Minimum Vega ver requirement is now 2.5.2,
  and it will be a custom build to ensure same version as
  the one used by the Graph extension in the browser.

* Cleaned up documentation

Bug: T134542
Bug: T134575
Change-Id: Ic5b91408accac73dcd53f9f67010e8aff1e44b49
---
M config.dev.yaml
M lib/vega.js
M package.json
M routes/graphoid-v1.js
M routes/graphoid-v2.js
5 files changed, 84 insertions(+), 32 deletions(-)

Approvals:
  Yurik: Looks good to me, approved
  jenkins-bot: Verified



diff --git a/config.dev.yaml b/config.dev.yaml
index 2a946f6..03a2db1 100644
--- a/config.dev.yaml
+++ b/config.dev.yaml
@@ -56,3 +56,11 @@
 
       # Error if it takes longer than this to handle the request
       timeout: -1
+
+      # Headers to send in all replies
+      headers:
+        'Cache-Control': 'public, s-maxage=200, max-age=200'
+
+      # Headers to send in case of an error. If not set, will use headers from 
above
+      errorHeaders:
+        'Cache-Control': 'public, s-maxage=30, max-age=30'
diff --git a/lib/vega.js b/lib/vega.js
index 3b4c83c..7ad93a9 100644
--- a/lib/vega.js
+++ b/lib/vega.js
@@ -27,10 +27,10 @@
  * @param spec graph specification
  * @param format string format - png or svg
  * @param response object to send/stream the results to.  If not given, 
returns [value, isLegacy]
- * @param cache string to set 'Cache-Control' header
+ * @param {Object} headers sets response headers like 'Cache-Control'
  * @returns {*} promise
  */
-module.exports.render = function(domain, spec, format, response, cache) {
+module.exports.render = function(domain, spec, format, response, headers) {
     var isSvg = format === 'svg',
         resultVersion;
 
@@ -57,8 +57,8 @@
             return [result, resultVersion];
         }
         response.status(200).type(format);
-        if (cache) {
-            response.header('Cache-Control', cache);
+        if (headers) {
+            response.header(headers);
         }
         response.header('VegaVersion', resultVersion);
         if (isSvg) {
diff --git a/package.json b/package.json
index daf9eaa..f999dd5 100644
--- a/package.json
+++ b/package.json
@@ -44,7 +44,7 @@
     "underscore": "^1.8.3",
     "vega-1x": "git+http://[email protected]/nyurik/vega-1x";,
     "graph-shared": "git+http://[email protected]/nyurik/graph-shared";,
-    "vega": "^2.4.0"
+    "vega": "git+http://[email protected]/nyurik/vega";
   },
   "devDependencies": {
     "extend": "^3.0.0",
diff --git a/routes/graphoid-v1.js b/routes/graphoid-v1.js
index 6dfc25d..8c457da 100644
--- a/routes/graphoid-v1.js
+++ b/routes/graphoid-v1.js
@@ -1,15 +1,10 @@
 'use strict';
 
-var BBPromise = require('bluebird');
+var Promise = require('bluebird');
 var preq = require('preq');
 var sUtil = require('../lib/util');
 var vega = require('../lib/vega');
 
-
-/**
- * The main router object
- */
-var router = sUtil.router();
 
 /**
  * Main log function
@@ -25,6 +20,18 @@
  * Limit request to 10 seconds by default
  */
 var timeout = 10000;
+
+/**
+ * Cache header to set on the responses
+ * @type {Object}
+ */
+var headers;
+
+/**
+ * Cache header to set on the responses
+ * @type {Object}
+ */
+var errorHeaders;
 
 
 /*
@@ -54,14 +61,14 @@
 
 // Adapted from https://www.promisejs.org/patterns/
 function delay(time) {
-    return new BBPromise(function (fulfill) {
+    return new Promise(function (fulfill) {
         setTimeout(fulfill, time);
     });
 }
 
 function failOnTimeout(promise, time) {
     return time <= 0 ? promise :
-       BBPromise.race([promise, delay(time).then(function () {
+        Promise.race([promise, delay(time).then(function () {
             throw 'timeout'; // we later compare on this value
         })]);
 }
@@ -172,7 +179,7 @@
 function renderOnCanvas(state) {
     var start = Date.now();
     return vega
-        .render(state.domain, state.graphData, 'png', state.response, 'public, 
s-maxage=30, max-age=30')
+        .render(state.domain, state.graphData, 'png', state.response, headers)
         .then(function () {
             metrics.endTiming('total.vega', start);
         })
@@ -190,7 +197,7 @@
     var start = Date.now();
     var state = {request: req, response: res};
 
-    var render = BBPromise
+    var render = Promise
         .resolve(state)
         .then(validateRequest)
         .then(downloadGraphDef)
@@ -225,16 +232,27 @@
 
             res
                 .status(400)
-                .header('Cache-Control', 'public, s-maxage=30, max-age=30')
+                .header(errorHeaders)
                 .json(msg);
             metrics.increment(mx);
             req.logger.log(msg, l);
         });
 }
 
-router.get('/:format/:title/:revid/:id', renderByHash);
-
-function init(app) {
+/**
+ * Initialize a route
+ * @param {Object} app
+ * @param {Object} app.logger
+ * @param {function} app.logger.log
+ * @param {Object} app.conf
+ * @param {number} app.conf.timeout
+ * @param {Object} app.conf.headers
+ * @param {Object} app.conf.errorHeaders
+ * @param {Object} app.metrics
+ * @param {function} app.metrics.increment
+ * @returns {{path: string, api_version: number, router: Router}}
+ */
+module.exports = function(app) {
 
     // The very first operation should set up our logger
     log = app.logger.log.bind(app.logger);
@@ -245,14 +263,13 @@
 
     var conf = app.conf;
     timeout = conf.timeout || timeout;
+    headers = conf.headers || {'Cache-Control': 'public, s-maxage=300, 
max-age=300'};
+    errorHeaders = conf.errorHeaders || headers;
 
     vega.initVega(log, conf);
-}
 
-
-module.exports = function(app) {
-
-    init(app);
+    var router = sUtil.router();
+    router.get('/:format/:title/:revid/:id', renderByHash);
 
     return {
         path: '/',
diff --git a/routes/graphoid-v2.js b/routes/graphoid-v2.js
index bf5a854..f01fe77 100644
--- a/routes/graphoid-v2.js
+++ b/routes/graphoid-v2.js
@@ -1,7 +1,7 @@
 'use strict';
 
 var _ = require('underscore');
-var BBPromise = require('bluebird');
+var Promise = require('bluebird');
 var preq = require('preq');
 var sUtil = require('../lib/util');
 var vega = require('../lib/vega');
@@ -24,9 +24,15 @@
 
 /**
  * Cache header to set on the responses
- * @type {string}
+ * @type {Object}
  */
-var cacheControlHdr = 'public, s-maxage=30, max-age=30';
+var headers;
+
+/**
+ * Cache header to set on the responses
+ * @type {Object}
+ */
+var errorHeaders;
 
 /*
  * Utility functions
@@ -41,14 +47,14 @@
 
 // Adapted from https://www.promisejs.org/patterns/
 function delay(time) {
-    return new BBPromise(function (fulfill) {
+    return new Promise(function (fulfill) {
         setTimeout(fulfill, time);
     });
 }
 
 function failOnTimeout(promise, time) {
     return time <= 0 ? promise :
-        BBPromise.race([promise, delay(time).then(function () {
+        Promise.race([promise, delay(time).then(function () {
             throw 'timeout'; // we later compare on this value
         })]);
 }
@@ -94,6 +100,12 @@
     return state;
 }
 
+/**
+ *
+ * @param {String} state.request.headers.title
+ * @param {String} state.request.headers.revisionid
+ * @returns {*|{value, done}}
+ */
 function renderRequest(state) {
     var start = Date.now();
     // headers always received in lower case
@@ -104,7 +116,7 @@
         state.response.header('RevisionId', state.request.headers.revisionid);
     }
     return vega
-        .render(state.domain, state.graphData, state.format, state.response, 
cacheControlHdr)
+        .render(state.domain, state.graphData, state.format, state.response, 
headers)
         .then(function () {
             metrics.endTiming('total.vega', start);
         }).catch(function (err) {
@@ -122,7 +134,7 @@
     var start = Date.now();
     var state = {request: req, response: res};
 
-    var render = BBPromise
+    var render = Promise
         .resolve(state)
         .then(validateRequest)
         .then(renderRequest);
@@ -154,13 +166,26 @@
 
             res
                 .status(400)
-                .header('Cache-Control', cacheControlHdr)
+                .header(errorHeaders)
                 .json(msg);
             metrics.increment(mx);
             req.logger.log(msg, l);
         });
 }
 
+/**
+ * Initialize a route
+ * @param {Object} app
+ * @param {Object} app.logger
+ * @param {function} app.logger.log
+ * @param {Object} app.conf
+ * @param {number} app.conf.timeout
+ * @param {Object} app.conf.headers
+ * @param {Object} app.conf.errorHeaders
+ * @param {Object} app.metrics
+ * @param {function} app.metrics.increment
+ * @returns {{path: string, api_version: number, router: Router}}
+ */
 module.exports = function(app) {
 
     // The very first operation should set up our logger
@@ -172,6 +197,8 @@
 
     var conf = app.conf;
     timeout = conf.timeout || timeout;
+    headers = conf.headers || {'Cache-Control': 'public, s-maxage=300, 
max-age=300'};
+    errorHeaders = conf.errorHeaders || headers;
 
     vega.initVega(log, conf);
 

-- 
To view, visit https://gerrit.wikimedia.org/r/287231
To unsubscribe, visit https://gerrit.wikimedia.org/r/settings

Gerrit-MessageType: merged
Gerrit-Change-Id: Ic5b91408accac73dcd53f9f67010e8aff1e44b49
Gerrit-PatchSet: 4
Gerrit-Project: mediawiki/services/graphoid
Gerrit-Branch: master
Gerrit-Owner: Yurik <[email protected]>
Gerrit-Reviewer: Yurik <[email protected]>
Gerrit-Reviewer: jenkins-bot <>

_______________________________________________
MediaWiki-commits mailing list
[email protected]
https://lists.wikimedia.org/mailman/listinfo/mediawiki-commits

Reply via email to