kkamkou/node-akamai-http-api

View on GitHub
README.md

Summary

Maintainability
Test Coverage
node-akamai-http-api
====================
Akamai NetStorage HTTP API for Node.js (Unofficial).  

[![Build Status](https://travis-ci.org/kkamkou/node-akamai-http-api.svg?branch=master)](https://travis-ci.org/kkamkou/node-akamai-http-api)
[![Coverage Status](https://coveralls.io/repos/github/kkamkou/node-akamai-http-api/badge.svg?branch=master)](https://coveralls.io/github/kkamkou/node-akamai-http-api?branch=master)
[![Code Climate](https://codeclimate.com/github/kkamkou/node-akamai-http-api/badges/gpa.svg)](https://codeclimate.com/github/kkamkou/node-akamai-http-api)

* Official library [might be found here](https://github.com/akamai-open/NetStorageKit-Node)  
(though, the quality of this library is suspicious).

## Installation
```
"dependencies": {
  "akamai-http-api": "0.6.*" // see the "releases" section
}
```
```npm update```

## Initialization
```javascript
var akamai = require('akamai-http-api');
akamai.setConfig({
  keyName: 'keyName',
  key: 'aLongString',
  host: 'changeme.akamaihd.net',
  ssl: true, // optional, default: false
  verbose: false, // optional, default: false
  request: { // optional, request.js options, see: https://github.com/request/request#requestoptions-callback
    timeout: 20000 // 20s is the dafault value
  }
});
```

### Notices
1. You have to [enable the netstorage HTTP API](https://control.akamai.com/dl/customers/NS/NetStrgHttpCM.pdf) access using the control.akamai.com website
2. Ensure there are no more than 15 operations/second on netstorage, otherwise you can expect netstorage to serve 500 errors.
3. Double check the `host` value. In case of typo (fe: `test.upload.akamai.com`), the client just sits there trying to open up a socket. Default timeout is `20s`.

## API
### Advanced
#### upload
```javascript
var fs = require('fs'),
  stream = fs.createReadStream('cool/file.jpg');
akamai.upload(stream, '/12345/MyFolder/MyFile.jpg', function (err, data) {});
```
#### download
```javascript
var fs = require('fs'),
  stream = fs.createWriteStream('cool/file_download.jpg');
akamai.download(pathRemoteFile, stream, function (err, data) {});
```
#### mtime
```javascript
akamai.mtime('/12345/MyFolder/MyFile.jpg', new Date(), function (err, data) {});
```

### Basic
#### du
```javascript
akamai.du('/12345/MyFolder', function (err, data) {});
```
#### dir
```javascript
akamai.dir('/12345/MyFolder', function (err, data) {});
```
#### stat
```javascript
akamai.stat('/12345/MyFolder', function (err, data) {});
```
#### delete
```javascript
akamai.delete('/12345/MyFolder/MyFile.jpg', function (err, data) {});
```
#### mkdir
```javascript
akamai.mkdir('/12345/MyFolder', function (err, data) {});
```
#### rmdir
```javascript
akamai.rmdir('/12345/MyFolder', function (err, data) {});
```
#### rename
```javascript
akamai.rename('/12345/MyFile.jpg', '/12345/MyFileNew.jpg', function (err, data) {});
```
#### symlink
```javascript
akamai.symlink('/12345/MyFile.jpg', '/12345/MyFileSymlink.jpg', function (err, data) {});
```

### Helpers
#### fileExists
```javascript
akamai.fileExists('/12345/MyFile.jpg', function (err, boolFlag) {});
```

### Exceptions
For the communication netstorage HTTP API uses [HTTP codes](http://www.w3.org/Protocols/rfc2616/rfc2616-sec10.html).
Hence, a number of methods may trigger an exception. For example `mkdir` in case the target already exists.
Or `symlink` in case the target doesn't exist.

To handle these exceptions the `err` object has an abnormal `code` attribute.

```javascript
akamai.mkdir('...', function (err, data) {
  if (err.code === 409) { } // it already exists
  if (err.message.indexOf(409) !== -1) // the same
});
```

### How to extend it?
```javascript
var akamai = require('akamai-http-api'),
  _ = require('lodash'),
  myAkamai = Object.create(akamai);

// custom headers for the upload function
myAkamai.upload = function (stream, path, custHeaders, cb) {
  var options = {
    request: {method: 'put'},
    headers: _.extend({action: 'upload', 'upload-type': 'binary'}, custHeaders)
  };
  stream.pipe(this.getRequestObject(path, options, cb));
  return this;
};

// quick-delete function (you should enable it first!)
myAkamai.quickDelete = function (path, cb) {
  var options = {
    request: {method: 'put'},
    headers: {action: 'quick-delete', 'quick-delete': 'imreallyreallysure'}
  };
  this.getRequestObject(path, options, cb);
  return this;
};

// exporting outside
module.exports = myAkamai;
```

# Tests
## Docker
```sh
# modify test/akamai.js#19-21 first
[sudo] docker build -t node-akamai-http-api .
[sudo] docker run -ti --rm node-akamai-http-api
```

## NVM
```sh
export AKAMAI_KEY_NAME="key_name"
export AKAMAI_KEY="key"
export AKAMAI_HOST="domain.akamaihd.net"
nvm install [6, 8, 10, 12, etc.]
npm install
npm test
```

#### License

[MIT](LICENSE)