DamLess
DamLess help you to create a NodeJS stream api (with http chunk).
Develop your http server like a gulp script.
!NPMnpm-imagenpm-url
!Build Statustravis-imagetravis-url
.config({ http: { port: 3000 }})
.inject("info", "./services/info")
.inject("user", "./services/user")
.get("/helloworld", "info", "helloworld")
.post("/user", "user", "insertOne")
.start();
```
```./services/info.js
class Info {
// helloworld is declare as GET:/helloworld
helloworld(context, stream, headers) {
stream.write("Hello");
stream.end("world");
}
}
```
```./services/user.js
const { Transform } = require("stream");
class User {
insertOne(context, stream, headers) {
// Read a JSON stream request and write a response as a JSON stream.
stream
.pipe(new Transform({
objectMode: true,
transform(chunk, enc, callback) {
// save the chunk (user) in the database
callback(null, chunk);
}
}))
.pipe(stream);
}
}
```
```shell
npm install damless --save
```
Features
Dependency Injection
(context, stream, headers) like http2 interface
Services/info.js
```services/info.js class ServiceInfo { }; text(context, stream, headers) { stream.write("Hello"); stream.end("world") }; json(context, stream, headers) { stream.write({ name: "peter" }); stream.end({ name: "folk" }); }; exports = module.exports = ServiceInfo; ```Dependency Injection
DamLess use givemetheservice to inject all services. You can override all damless functions or inject your new services. It's is easier to test your api.(context, stream, headers) -> http2 interface
DamLess has been inspired by the http2 syntax. The request and response are wrap by an unique duplex stream. This stream automatically stringify, gzip or deflate your response. It is useless to pipe a compressor.Extend services
Use the power of ES6 to easily extends services. ```json.js const { Json } = require("damless"); const moment = require("moment"); const { ObjectID } = require("bson"); class CustomJson extends Json {constructor() {
super();
}
// override the default onValue to deserialize mongo ObjectID
onValue(key, value) {
if (/\d{2}-\d{2}-\d{2}/.test(value)) return moment(value, "YYYY-MM-DD").toDate();
if (ObjectID.isValid(value)) return new ObjectID(value);
return super.onValue(key, value);
}
}
exports = module.exports = CustomJson;
```
The default json serializer is declared in the DI as "json". Replace it to load your service.
```server.js
damless
.inject("json", "./custom-json.js")
```
Develop faster
mongo nodemailerConfiguration manager (damless.json)
You can configure damless in javascript or via json file. ```server.js damless.config("./damless.json")
.config({ http: { port: 3000 }})
.config(config => {
config.env = "dev"
})
```
```damless.json
{
"services": "./services.json",
"http": {
"port": 3000
}
}
```
You can declare your services in an other json file.
```services.json
{
"services": [
{
"name": "info",
"location": "./services/info"
}
],
"http-routes": [
{
"get": "/",
"service": "info",
"method": "text"
}
]
}
```
Retrieve the config object in your service.
```.js
class ServiceInfo {
// config will be injected by our DI
constructor(config) {
console.log(config.http.port);
}
};
```