mirror of
https://github.com/scratchfoundation/scratch-www.git
synced 2025-07-10 19:56:43 -04:00
Move some fastly-specific stuff into a module
This commit is contained in:
parent
de5f36b649
commit
87da93f9ea
2 changed files with 100 additions and 79 deletions
|
@ -1,11 +1,12 @@
|
||||||
var defaults = require('lodash.defaults');
|
var defaults = require('lodash.defaults');
|
||||||
var fastly = require('fastly')(process.env.FASTLY_API_KEY);
|
|
||||||
var glob = require('glob');
|
var glob = require('glob');
|
||||||
var path = require('path');
|
var path = require('path');
|
||||||
|
|
||||||
var routes = require('../server/routes.json');
|
var routes = require('../server/routes.json');
|
||||||
var serviceId = process.env.FASTLY_SERVICE_ID;
|
var serviceId = process.env.FASTLY_SERVICE_ID
|
||||||
var s3Bucket = process.env.AWS_S3_BUCKET_NAME;
|
var s3Bucket = process.env.S3_BUCKET_NAME;
|
||||||
|
|
||||||
|
var fastly = require('./lib/fastly-extended')(process.env.FASTLY_API_KEY, serviceId);
|
||||||
|
|
||||||
var extraAppRoutes = [
|
var extraAppRoutes = [
|
||||||
// Homepage with querystring.
|
// Homepage with querystring.
|
||||||
|
@ -15,11 +16,7 @@ var extraAppRoutes = [
|
||||||
'/version\.txt$',
|
'/version\.txt$',
|
||||||
// View html
|
// View html
|
||||||
'^/[^\/]*\.html'
|
'^/[^\/]*\.html'
|
||||||
]
|
];
|
||||||
|
|
||||||
var getFastlyAPIPrefix = function (serviceId, version) {
|
|
||||||
return '/service/' + encodeURIComponent(serviceId) + '/version/' + version;
|
|
||||||
}
|
|
||||||
|
|
||||||
var getStaticPaths = function (pathToStatic) {
|
var getStaticPaths = function (pathToStatic) {
|
||||||
// Given the relative path to the static directory, return an array of
|
// Given the relative path to the static directory, return an array of
|
||||||
|
@ -56,10 +53,6 @@ var getAppRouteCondition = function (pathToStatic, routes, additionalPaths) {
|
||||||
return pathsToCondition(allPaths);
|
return pathsToCondition(allPaths);
|
||||||
}
|
}
|
||||||
|
|
||||||
var negateCondition = function (condition) {
|
|
||||||
return '!(' + condition + ')';
|
|
||||||
}
|
|
||||||
|
|
||||||
var getConditionNameForView = function (view) {
|
var getConditionNameForView = function (view) {
|
||||||
return 'routes/' + view;
|
return 'routes/' + view;
|
||||||
};
|
};
|
||||||
|
@ -103,48 +96,6 @@ var getRouteHeaderConditionPairs = function (routes) {
|
||||||
});
|
});
|
||||||
};
|
};
|
||||||
|
|
||||||
var getLatestVersion = function (serviceId, cb) {
|
|
||||||
var url = '/service/'+ encodeURIComponent(serviceId) +'/version';
|
|
||||||
fastly.request('GET', url, function (err, versions) {
|
|
||||||
if (err) return cb(err);
|
|
||||||
var latestVersion = versions.reduce(function (latestVersion, version) {
|
|
||||||
if (!latestVersion) return version;
|
|
||||||
if (version.number > latestVersion.number) return version;
|
|
||||||
return latestVersion;
|
|
||||||
});
|
|
||||||
return cb(null, latestVersion);
|
|
||||||
});
|
|
||||||
};
|
|
||||||
|
|
||||||
|
|
||||||
var getHeaders = function (serviceId, version, cb) {
|
|
||||||
var url = getFastlyAPIPrefix(serviceId, version) + '/header';
|
|
||||||
fastly.request('GET', url, function (err, headers) {
|
|
||||||
if (err) return cb(err);
|
|
||||||
return cb(null, headers);
|
|
||||||
});
|
|
||||||
};
|
|
||||||
|
|
||||||
var setCondition = function (serviceId, version, name, condition, callback) {
|
|
||||||
var putUrl = getFastlyAPIPrefix(serviceId, version) + '/condition/' + encodeURIComponent(name);
|
|
||||||
var postUrl = getFastlyAPIPrefix(serviceId, version) + '/condition';
|
|
||||||
var cb = callback;
|
|
||||||
return fastly.request('PUT', putUrl, condition, function (err, response) {
|
|
||||||
if (err && err.statusCode === 404) return fastly.request('POST', postUrl, condition, cb);
|
|
||||||
return cb(err, response);
|
|
||||||
});
|
|
||||||
};
|
|
||||||
|
|
||||||
var setHeader = function (serviceId, version, name, header, callback) {
|
|
||||||
var putUrl = getFastlyAPIPrefix(serviceId, version) + '/header/' + encodeURIComponent(name);
|
|
||||||
var postUrl = getFastlyAPIPrefix(serviceId, version) + '/header';
|
|
||||||
var cb = callback
|
|
||||||
return fastly.request('PUT', putUrl, header, function (err, response) {
|
|
||||||
if (err && err.statusCode === 404) return fastly.request('POST', postUrl, header, cb);
|
|
||||||
return cb(err, response);
|
|
||||||
});
|
|
||||||
};
|
|
||||||
|
|
||||||
var notPassCondition = {
|
var notPassCondition = {
|
||||||
name: getNotPassRequestConditionName(),
|
name: getNotPassRequestConditionName(),
|
||||||
statement: getAppRouteCondition('../static/*', routes, extraAppRoutes),
|
statement: getAppRouteCondition('../static/*', routes, extraAppRoutes),
|
||||||
|
@ -154,30 +105,30 @@ var notPassCondition = {
|
||||||
|
|
||||||
var passCondition = {
|
var passCondition = {
|
||||||
name: getPassRequestConditionName(),
|
name: getPassRequestConditionName(),
|
||||||
statement: negateCondition(notPassCondition.statement),
|
statement: fastly.negateConditionStatement(notPassCondition.statement),
|
||||||
type: 'REQUEST',
|
type: 'REQUEST',
|
||||||
priority: 10
|
priority: 10
|
||||||
};
|
};
|
||||||
|
|
||||||
var routeHeaderConditionPairs = getRouteHeaderConditionPairs(routes);
|
var routeHeaderConditionPairs = getRouteHeaderConditionPairs(routes);
|
||||||
|
|
||||||
getLatestVersion(serviceId, function (err, version) {
|
fastly.getLatestVersion(function (err, version) {
|
||||||
if (err) return console.error(err);
|
if (err) return console.error(err);
|
||||||
if (version.active) return console.error('Latest version is active. Will not modify.');
|
if (version.active) return console.error('Latest version is active. Will not modify.');
|
||||||
if (version.locked) return console.error('Latest version is locked. Cannot modify.');
|
if (version.locked) return console.error('Latest version is locked. Cannot modify.');
|
||||||
setCondition(
|
fastly.setCondition(
|
||||||
serviceId, version.number, notPassCondition.name, notPassCondition,
|
version.number, notPassCondition.name, notPassCondition,
|
||||||
function (err) {
|
function (err) {
|
||||||
if (err) {
|
if (err) {
|
||||||
console.error('Failed to set !(Pass) request condition:');
|
console.error('Failed to set !(Pass) request condition:');
|
||||||
console.dir(err);
|
console.dir(err);
|
||||||
console.error('Could not set bucket header without setting !(Pass) condition');
|
console.error('Could not set bucket header without setting !(Pass) condition');
|
||||||
return;
|
process.exit(1);
|
||||||
}
|
}
|
||||||
|
|
||||||
var bucketNameHeaderName = 'Bucket name';
|
var bucketNameHeaderName = 'Bucket name';
|
||||||
setHeader(
|
fastly.setHeader(
|
||||||
serviceId, version.number, bucketNameHeaderName,
|
version.number, bucketNameHeaderName,
|
||||||
{
|
{
|
||||||
name: bucketNameHeaderName,
|
name: bucketNameHeaderName,
|
||||||
action: 'set',
|
action: 'set',
|
||||||
|
@ -189,44 +140,59 @@ getLatestVersion(serviceId, function (err, version) {
|
||||||
priority: 1
|
priority: 1
|
||||||
},
|
},
|
||||||
function (err) {
|
function (err) {
|
||||||
if (err) return console.error('Failed to set Bucket name header:', err);
|
if (err) {
|
||||||
|
console.error('Failed to set Bucket name header:', err);
|
||||||
|
process.exit(1);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
);
|
);
|
||||||
setCondition(
|
fastly.setCondition(
|
||||||
serviceId, version.number, passCondition.name, passCondition,
|
version.number, passCondition.name, passCondition,
|
||||||
function (err) {
|
function (err) {
|
||||||
if (err) return console.error('Failed to set Pass condition:', err);
|
if (err) return console.error('Failed to set Pass condition:', err);
|
||||||
fastly.request(
|
fastly.request(
|
||||||
'PUT',
|
'PUT',
|
||||||
getFastlyAPIPrefix(serviceId, version.number) + '/backend/femto',
|
fastly.getFastlyAPIPrefix(serviceId, version.number) + '/backend/femto',
|
||||||
{request_condition: passCondition.name},
|
{request_condition: passCondition.name},
|
||||||
function (err) {
|
function (err) {
|
||||||
if (err) return console.error('Failed to set femto backend to use Pass condition.', err)
|
if (err) {
|
||||||
|
console.error('Failed to set femto backend to use Pass condition.', err);
|
||||||
|
process.exit(1);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
);
|
);
|
||||||
fastly.request(
|
fastly.request(
|
||||||
'PUT',
|
'PUT',
|
||||||
getFastlyAPIPrefix(serviceId, version.number) + '/request_settings/Pass',
|
fastly.getFastlyAPIPrefix(serviceId, version.number) + '/request_settings/Pass',
|
||||||
{request_condition: passCondition.name},
|
{request_condition: passCondition.name},
|
||||||
function (err) {
|
function (err) {
|
||||||
if (err) return console.error('Failed to set Pass request setting to use Pass condition.', err);
|
if (err) {
|
||||||
|
console.error('Failed to set Pass request setting to use Pass condition.', err);
|
||||||
|
process.exit(1);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
);
|
);
|
||||||
var passCacheCondition = defaults({name: getPassCacheConditionName(), type: 'CACHE'}, passCondition);
|
var passCacheCondition = defaults({name: getPassCacheConditionName(), type: 'CACHE'}, passCondition);
|
||||||
setCondition(
|
fastly.setCondition(
|
||||||
serviceId, version.number, getPassCacheConditionName(), passCacheCondition,
|
version.number, getPassCacheConditionName(), passCacheCondition,
|
||||||
function (err) {
|
function (err) {
|
||||||
if (err) return console.error('Failed to set Cache Pass condition:', err, passCacheCondition);
|
if (err) {
|
||||||
|
console.error('Failed to set Cache Pass condition:', err, passCacheCondition);
|
||||||
|
process.exit(1);
|
||||||
|
}
|
||||||
fastly.request(
|
fastly.request(
|
||||||
'PUT',
|
'PUT',
|
||||||
getFastlyAPIPrefix(serviceId, version.number),
|
fastly.getFastlyAPIPrefix(serviceId, version.number),
|
||||||
{cache_condition: getPassCacheConditionName()},
|
{cache_condition: getPassCacheConditionName()},
|
||||||
function (err) {
|
function (err) {
|
||||||
if (err) return console.error('Failed to set Pass cache setting to use Cache Pass condition', err, cachePassCondition);
|
if (err) {
|
||||||
|
console.error('Failed to set Pass cache setting to use Cache Pass condition', err);
|
||||||
|
process.exit(1);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
@ -234,14 +200,20 @@ getLatestVersion(serviceId, function (err, version) {
|
||||||
routeHeaderConditionPairs.forEach(function (pair) {
|
routeHeaderConditionPairs.forEach(function (pair) {
|
||||||
var condition = pair.condition;
|
var condition = pair.condition;
|
||||||
var header = pair.header;
|
var header = pair.header;
|
||||||
setCondition(
|
fastly.setCondition(
|
||||||
serviceId, version.number, condition.name, condition,
|
version.number, condition.name, condition,
|
||||||
function (err, response) {
|
function (err, response) {
|
||||||
if (err) return console.error('Failed to set route condition', condition.name, err);
|
if (err) {
|
||||||
setHeader(
|
console.error('Failed to set route condition', condition.name, err);
|
||||||
serviceId, version.number, header.name, header,
|
process.exit(1);
|
||||||
|
}
|
||||||
|
fastly.setHeader(
|
||||||
|
version.number, header.name, header,
|
||||||
function (err) {
|
function (err) {
|
||||||
if (err) return console.error('Failed to set route rewrite header', header.name, err);
|
if (err) {
|
||||||
|
console.error('Failed to set route rewrite header', header.name, err);
|
||||||
|
process.exit(1);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
)
|
)
|
||||||
}
|
}
|
||||||
|
|
49
bin/lib/fastly-extended.js
Normal file
49
bin/lib/fastly-extended.js
Normal file
|
@ -0,0 +1,49 @@
|
||||||
|
var Fastly = require('fastly');
|
||||||
|
|
||||||
|
module.exports = function (apiKey, serviceId) {
|
||||||
|
var fastly = Fastly(apiKey);
|
||||||
|
fastly.serviceId = serviceId;
|
||||||
|
|
||||||
|
fastly.negateConditionStatement = function (statement) {
|
||||||
|
return '!(' + statement + ')';
|
||||||
|
};
|
||||||
|
|
||||||
|
fastly.getFastlyAPIPrefix = function (serviceId, version) {
|
||||||
|
return '/service/' + encodeURIComponent(serviceId) + '/version/' + version;
|
||||||
|
};
|
||||||
|
|
||||||
|
fastly.getLatestVersion = function (cb) {
|
||||||
|
if (!this.serviceId) return cb('No serviceId configured');
|
||||||
|
var url = '/service/'+ encodeURIComponent(this.serviceId) +'/version';
|
||||||
|
this.request('GET', url, function (err, versions) {
|
||||||
|
if (err) return cb(err);
|
||||||
|
var latestVersion = versions.reduce(function (latestVersion, version) {
|
||||||
|
if (!latestVersion) return version;
|
||||||
|
if (version.number > latestVersion.number) return version;
|
||||||
|
return latestVersion;
|
||||||
|
});
|
||||||
|
return cb(null, latestVersion);
|
||||||
|
});
|
||||||
|
};
|
||||||
|
|
||||||
|
fastly.setCondition = function (version, name, condition, cb) {
|
||||||
|
if (!this.serviceId) return callback('No serviceId configured');
|
||||||
|
var putUrl = this.getFastlyAPIPrefix(this.serviceId, version) + '/condition/' + encodeURIComponent(name);
|
||||||
|
var postUrl = this.getFastlyAPIPrefix(this.serviceId, version) + '/condition';
|
||||||
|
return this.request('PUT', putUrl, condition, function (err, response) {
|
||||||
|
if (err && err.statusCode === 404) return this.request('POST', postUrl, condition, cb);
|
||||||
|
return cb(err, response);
|
||||||
|
}.bind(this));
|
||||||
|
};
|
||||||
|
|
||||||
|
fastly.setHeader = function (version, name, header, cb) {
|
||||||
|
var putUrl = this.getFastlyAPIPrefix(this.serviceId, version) + '/header/' + encodeURIComponent(name);
|
||||||
|
var postUrl = this.getFastlyAPIPrefix(this.serviceId, version) + '/header';
|
||||||
|
return this.request('PUT', putUrl, header, function (err, response) {
|
||||||
|
if (err && err.statusCode === 404) return this.request('POST', postUrl, header, cb);
|
||||||
|
return cb(err, response);
|
||||||
|
}.bind(this));
|
||||||
|
};
|
||||||
|
|
||||||
|
return fastly;
|
||||||
|
};
|
Loading…
Add table
Add a link
Reference in a new issue