mirror of
				https://github.com/mickael-kerjean/filestash.git
				synced 2025-10-31 01:58:11 +08:00 
			
		
		
		
	
		
			
				
	
	
		
			247 lines
		
	
	
		
			9.2 KiB
		
	
	
	
		
			JavaScript
		
	
	
	
	
	
			
		
		
	
	
			247 lines
		
	
	
		
			9.2 KiB
		
	
	
	
		
			JavaScript
		
	
	
	
	
	
| // https://www.npmjs.com/package/aws-sdk
 | |
| var AWS = require('aws-sdk');
 | |
| 
 | |
| 
 | |
| function decode(path){
 | |
|     let tmp = path.split('/');
 | |
|     return {
 | |
|         bucket: tmp.splice(0, 2)[1] || null,
 | |
|         path: tmp.join('/')
 | |
|     }
 | |
| }
 | |
| 
 | |
| function connect(params){
 | |
|     let config = {
 | |
|         apiVersion: '2006-03-01',
 | |
|         accessKeyId: params.access_key_id,
 | |
|         secretAccessKey: params.secret_access_key,
 | |
|         signatureVersion: 'v4',
 | |
|         s3ForcePathStyle: true,
 | |
|         //sslEnabled: true
 | |
|     };
 | |
|     if(params.endpoint){
 | |
|         config.endpoint = new AWS.Endpoint(params.endpoint);
 | |
|     }
 | |
|     var s3 = new AWS.S3(config);
 | |
|     return Promise.resolve(s3);
 | |
| }
 | |
| 
 | |
| module.exports = {
 | |
|     test: function(params){
 | |
|         return connect(params)
 | |
|             .then((s3) => {
 | |
|                 return new Promise((done, err) => {
 | |
|                     s3.listBuckets(function(error, data) {
 | |
|                         if(error){ err(error) }
 | |
|                         else{ done(params) }
 | |
|                     });
 | |
|                 });
 | |
|             });
 | |
|     },
 | |
|     cat: function(path, params, res){
 | |
|         path = decode(path);
 | |
|         return connect(params)
 | |
|             .then((s3) => {
 | |
|                 return Promise.resolve(s3.getObject({
 | |
|                     Bucket: path.bucket,
 | |
|                     Key: path.path
 | |
|                 }).on('httpHeaders', function (statusCode, headers) {
 | |
|                     res.set('content-type', headers['content-type']);
 | |
|                     res.set('content-length', headers['content-length']);
 | |
|                     res.set('last-modified', headers['last-modified']);
 | |
|                 }).createReadStream())
 | |
|             });
 | |
|     },
 | |
|     ls: function(path, params){
 | |
|         if(/\/$/.test(path) === false) path += '/';
 | |
|         path = decode(path);
 | |
|         return connect(params)
 | |
|             .then((s3) => {
 | |
|                 if(path.bucket === null){
 | |
|                     return new Promise((done, err) => {
 | |
|                         s3.listBuckets(function(error, data) {
 | |
|                             if(error){ err(error) }
 | |
|                             else{
 | |
|                                 let buckets = data.Buckets.map((bucket) => {
 | |
|                                     return {
 | |
|                                         name: bucket.Name,
 | |
|                                         type: 'bucket',
 | |
|                                         time: new Date(bucket.CreationDate).getTime(),
 | |
|                                         can_read: true,
 | |
|                                         can_delete: true,
 | |
|                                         can_move: false
 | |
|                                     }
 | |
|                                 });
 | |
|                                 buckets.push({type: 'metadata', name: './', can_create_file: false, can_create_directory: true});
 | |
|                                 done(buckets)
 | |
|                             }
 | |
|                         });
 | |
|                     });
 | |
|                 }else{
 | |
|                     return new Promise((done, err) => {
 | |
|                         s3.listObjects({
 | |
|                             Bucket: path.bucket,
 | |
|                             Prefix: path.path,
 | |
|                             Delimiter: '/'
 | |
|                         }, function(error, data) {
 | |
|                             if(error){ err(error) }
 | |
|                             else{
 | |
|                                 let content = data.Contents
 | |
|                                     .filter((file) => {
 | |
|                                         return file.Key === path.path? false : true;
 | |
|                                     })
 | |
|                                     .map((file) => {
 | |
|                                         return {
 | |
|                                             type: 'file',
 | |
|                                             size: file.Size,
 | |
|                                             time: new Date(file.LastModified).getTime(),
 | |
|                                             name: file.Key.split('/').pop()
 | |
|                                         }
 | |
|                                     });
 | |
|                                 let folders = data.CommonPrefixes.map((prefix) => {
 | |
|                                     return {
 | |
|                                         type: 'directory',
 | |
|                                         size: 0,
 | |
|                                         time: null,
 | |
|                                         name: prefix.Prefix.split('/').slice(-2)[0]
 | |
|                                     }
 | |
|                                 });
 | |
|                                 return done([].concat(folders, content));
 | |
|                             }
 | |
|                         });
 | |
|                     });
 | |
|                 }
 | |
|             });
 | |
|     },
 | |
|     write: function(path, stream, params){
 | |
|         path = decode(path);
 | |
|         return connect(params)
 | |
|             .then((s3) => {
 | |
|                 return new Promise((done, err) => {
 | |
|                     s3.upload({
 | |
|                         Bucket: path.bucket,
 | |
|                         Key: path.path,
 | |
|                         Body: stream,
 | |
|                         ContentLength: stream.byteCount
 | |
|                     }, function(error, data) {
 | |
|                         if(error){ err(error) }
 | |
|                         else{
 | |
|                             done('ok');
 | |
|                         }
 | |
|                     });
 | |
|                 });
 | |
|             });
 | |
|     },
 | |
|     rm: function(path, params){
 | |
|         path = decode(path);
 | |
|         return connect(params)
 | |
|             .then((s3) => {
 | |
|                 return new Promise((done, err) => {
 | |
|                     s3.listObjects({
 | |
|                         Bucket: path.bucket,
 | |
|                         Prefix: path.path
 | |
|                     }, function(error, obj){
 | |
|                         if(error){ err(error); }
 | |
|                         else{
 | |
|                             Promise.all(obj.Contents.map((file) => {
 | |
|                                 return deleteObject(s3, path.bucket, file.Key)
 | |
|                             })).then(function(){
 | |
|                                 if(path.path === ''){
 | |
|                                     s3.deleteBucket({
 | |
|                                         Bucket: path.bucket
 | |
|                                     }, function(error){
 | |
|                                         if(error){ err(error)}
 | |
|                                         else{ done('ok'); }
 | |
|                                     });
 | |
|                                 }else{
 | |
|                                     done('ok');
 | |
|                                 }
 | |
|                             })
 | |
|                         }
 | |
|                     })
 | |
|                 });                
 | |
|             });
 | |
| 
 | |
|         function deleteObject(s3, bucket, key){
 | |
|             return new Promise((done, err) => {
 | |
|                 s3.deleteObject({
 | |
|                     Bucket: bucket,
 | |
|                     Key: key
 | |
|                 }, function(error, data) {
 | |
|                     if(error){ err(error) }
 | |
|                     else{ done('ok') }
 | |
|                 });                        
 | |
|             })
 | |
|         }
 | |
|     },
 | |
|     mv: function(from, to, params){
 | |
|         from = decode(from);
 | |
|         to = decode(to);
 | |
|      
 | |
|         return connect(params)
 | |
|             .then((s3) => {
 | |
|                 return new Promise((done, err) => {
 | |
|                     s3.copyObject({
 | |
|                         Bucket: to.bucket,
 | |
|                         CopySource: from.bucket+'/'+from.path,
 | |
|                         Key: to.path
 | |
|                     }, function(error, data) {
 | |
|                         if(error){ err(error) }
 | |
|                         else{
 | |
|                             s3.deleteObject({
 | |
|                                 Bucket: from.bucket,
 | |
|                                 Key: from.path
 | |
|                             }, function(error){
 | |
|                                 if(error){ err(error) }
 | |
|                                 else{
 | |
|                                     done('ok');
 | |
|                                 }
 | |
|                             })
 | |
|                         }
 | |
|                     });
 | |
|                 });
 | |
|             });
 | |
|     },
 | |
|     mkdir: function(path, params){
 | |
|         if(/\/$/.test(path) === false) path += '/';
 | |
|         path = decode(path);
 | |
|         return connect(params)
 | |
|             .then((s3) => {
 | |
|                 return new Promise((done, err) => {
 | |
|                     if(path.path === ''){
 | |
|                         s3.createBucket({
 | |
|                             Bucket: path.bucket
 | |
|                         }, function(error, data){
 | |
|                             if(error){ err(error) }
 | |
|                             else{ done('ok') }
 | |
|                         });
 | |
|                     }else{
 | |
|                         s3.putObject({
 | |
|                             Bucket: path.bucket,
 | |
|                             Key: path.path
 | |
|                         }, function(error, data) {
 | |
|                             if(error){ err(error) }
 | |
|                             else{ done('ok') }
 | |
|                         });
 | |
|                     }
 | |
|                 });
 | |
|             })
 | |
|     },
 | |
|     touch: function(path, params){
 | |
|         path = decode(path);
 | |
|         return connect(params)
 | |
|             .then((s3) => {
 | |
|                 return new Promise((done, err) => {
 | |
|                     s3.putObject({
 | |
|                         Bucket: path.bucket,
 | |
|                         Key: path.path,
 | |
|                         Body: ''
 | |
|                     }, function(error, data) {
 | |
|                         if(error){ err(error) }
 | |
|                         else{ done('ok') }
 | |
|                     });
 | |
|                 });
 | |
|             })
 | |
|     }
 | |
| }
 | 
