93 lines
2.9 KiB
JavaScript
93 lines
2.9 KiB
JavaScript
|
|
'use strict';
|
|||
|
|
|
|||
|
|
module.exports = exports;
|
|||
|
|
|
|||
|
|
const url = require('url');
|
|||
|
|
|
|||
|
|
module.exports.detect = function(opts) {
|
|||
|
|
const config = {};
|
|||
|
|
|
|||
|
|
const to = opts.hosted_path;
|
|||
|
|
const uri = url.parse(to);
|
|||
|
|
|
|||
|
|
if (opts.bucket && opts.region) {
|
|||
|
|
// use user defined settings for host, region, bucket
|
|||
|
|
config.endpoint = opts.host;
|
|||
|
|
config.bucket = opts.bucket;
|
|||
|
|
config.region = opts.region;
|
|||
|
|
config.s3ForcePathStyle = opts.s3ForcePathStyle;
|
|||
|
|
|
|||
|
|
// if using s3ForcePathStyle the bucket is part of the http object path
|
|||
|
|
// but not the S3 key prefix path.
|
|||
|
|
// remove it
|
|||
|
|
const bucketPath = config.s3ForcePathStyle ? `/${config.bucket}/` : '/';
|
|||
|
|
config.prefix = (!uri.pathname || uri.pathname === bucketPath) ? '' : uri.pathname.replace(bucketPath, '');
|
|||
|
|
} else {
|
|||
|
|
// auto detect region and bucket from url
|
|||
|
|
// only virtual-hosted–style access can be auto detected
|
|||
|
|
// the uri will have the following format:
|
|||
|
|
// https://bucket-name.s3.Region.amazonaws.com/key-name (dash Region)
|
|||
|
|
// or in some legacy region of this format:
|
|||
|
|
// https://bucket-name.s3-Region.amazonaws.com/key-name (dot Region)
|
|||
|
|
const parts = uri.hostname.split('.s3');
|
|||
|
|
|
|||
|
|
// there is nothing before the .s3
|
|||
|
|
// not a valid s3 virtual host bucket url
|
|||
|
|
if (parts.length === 1) {
|
|||
|
|
throw new Error('Could not parse s3 bucket name from virtual host url.');
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
// everything before .s3 is the bucket
|
|||
|
|
config.bucket = parts[0];
|
|||
|
|
|
|||
|
|
// from everything that comes after the s3
|
|||
|
|
// first char is connecting dot or dash
|
|||
|
|
// everything up to the domain should be the region name
|
|||
|
|
const region = parts[1].slice(1).split('.')[0];
|
|||
|
|
// if user provided url does not include region, default to us-east-1.
|
|||
|
|
if (region === 'amazonaws') {
|
|||
|
|
config.region = 'us-east-1';
|
|||
|
|
} else {
|
|||
|
|
config.region = region;
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
config.prefix = (!uri.pathname || uri.pathname === '/') ? '' : uri.pathname.replace('/', '');
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
return config;
|
|||
|
|
};
|
|||
|
|
|
|||
|
|
module.exports.get_s3 = function(config) {
|
|||
|
|
// setting an environment variable: node_pre_gyp_mock_s3 to any value
|
|||
|
|
// enables intercepting outgoing http requests to s3 (using nock) and
|
|||
|
|
// serving them from a mocked S3 file system (using mock-aws-s3)
|
|||
|
|
if (process.env.node_pre_gyp_mock_s3) {
|
|||
|
|
return require('../mock/s3')();
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
// if not mocking then setup real s3.
|
|||
|
|
const AWS = require('aws-sdk');
|
|||
|
|
|
|||
|
|
AWS.config.update(config);
|
|||
|
|
const s3 = new AWS.S3();
|
|||
|
|
|
|||
|
|
// need to change if additional options need to be specified.
|
|||
|
|
return {
|
|||
|
|
listObjects(params, callback) {
|
|||
|
|
return s3.listObjects(params, callback);
|
|||
|
|
},
|
|||
|
|
headObject(params, callback) {
|
|||
|
|
return s3.headObject(params, callback);
|
|||
|
|
},
|
|||
|
|
deleteObject(params, callback) {
|
|||
|
|
return s3.deleteObject(params, callback);
|
|||
|
|
},
|
|||
|
|
putObject(params, callback) {
|
|||
|
|
return s3.putObject(params, callback);
|
|||
|
|
},
|
|||
|
|
getObject(params, callback) {
|
|||
|
|
return s3.getObject(params, callback);
|
|||
|
|
}
|
|||
|
|
};
|
|||
|
|
};
|