diff --git a/Dockerfile b/Dockerfile
index 09650cd7..d71e03cf 100644
--- a/Dockerfile
+++ b/Dockerfile
@@ -1,3 +1,24 @@
-FROM node:6-onbuild
+FROM alpine:edge
+# Build-time metadata as defined at http://label-schema.org
+ARG BUILD_DATE
+ARG VCS_REF
+ARG VCS_URL
+ARG VERSION
+LABEL org.label-schema.build-date=$BUILD_DATE \
+ org.label-schema.name="Gun - Offline First, Javascript Graph Database" \
+# org.label-schema.description="Let it be pulled from Readme.md..." \
+ org.label-schema.url="http://gun.js.org" \
+ org.label-schema.vcs-ref=$VCS_REF \
+ org.label-schema.vcs-url=$VCS_URL \
+ org.label-schema.vendor="Pinnacle Digital" \
+ org.label-schema.version=$VERSION \
+ org.label-schema.schema-version="1.0"
+WORKDIR /app
+ADD . .
ENV NPM_CONFIG_LOGLEVEL warn
+RUN apk update && apk upgrade \
+ && apk add --no-cache ca-certificates nodejs \
+ && npm install \
+ && rm -rf /var/cache/* -rf /tmp/npm*
EXPOSE 8080
+CMD ["npm","start"]
diff --git a/README.md b/README.md
index b5beea73..0b0ea210 100644
--- a/README.md
+++ b/README.md
@@ -1,4 +1,12 @@
-# gun [](https://npmjs.org/package/gun) [](https://travis-ci.org/amark/gun) [](https://gitter.im/amark/gun?utm_source=badge&utm_medium=badge&utm_campaign=pr-badge&utm_content=badge)
+
+[](https://npmjs.org/package/gun) [](https://travis-ci.org/amark/gun) [](https://gitter.im/amark/gun?utm_source=badge&utm_medium=badge&utm_campaign=pr-badge&utm_content=badge)
+[](https://hub.docker.com/r/gundb/gun/) [](https://microbadger.com/images/gundb/gun "Get your own image badge on microbadger.com") [](https://hub.docker.com/r/gundb/gun/) [](https://hub.docker.com/r/gundb/gun/)
GUN is a realtime, distributed, offline-first, graph database engine. Lightweight and powerful, at just **~9KB** gzipped.
@@ -47,16 +55,23 @@ Try the [interactive tutorial](http://gun.js.org/think.html) in the browser (**5
- To quickly spin up a Gun test server for your development team, uilize eiher [Heroku](http://heroku.com) or [Docker](http://docker.com) or any variant thereof ([Dokku](http://dokku.viewdocs.io/dokku/), [Flynn.io](http://flynn.io), [now.sh](https://zeit.co/now), etc)
-### Docker
- ```bash
+### [Docker](https://www.docker.com/)
+ - Either (fastest) from the [Docker Hub](https://hub.docker.com/r/gundb/gun/):
+
+```bash
+ docker run -p 8080:8080 gundb/gun
+```
+ - Or build the [Docker](https://docs.docker.com/engine/installation/) image locally:
+
+```bash
git clone https://github.com/amark/gun.git
cd gun
docker build -t myrepo/gundb:v1 .
docker run -p 8080:8080 myrepo/gundb:v1
- ```
+```
Then visit [http://localhost:8080](http://localhost:8080) in your browser.
-### Heroku
+### [Heroku](https://www.heroku.com/)
```bash
git clone https://github.com/amark/gun.git
cd gun
@@ -65,7 +80,7 @@ Try the [interactive tutorial](http://gun.js.org/think.html) in the browser (**5
```
Then visit the URL in the output of the 'heroku create' step, in your browser.
-### Now.sh
+### [Now.sh](https://zeit.co/now/)
```bash
npm install -g now
git clone https://github.com/amark/gun.git
diff --git a/gun.js b/gun.js
index 49daa5e8..00c635e2 100644
--- a/gun.js
+++ b/gun.js
@@ -908,7 +908,9 @@
Gun.chain.opt = function(opt){
opt = opt || {};
var gun = this, at = gun._, tmp, u;
- if(!at.root){ root(at) }
+ at.root = at.root || gun;
+ at.graph = at.graph || {};
+ at.dedup = new Dedup();
at.opt = at.opt || {};
if(text_is(opt)){ opt = {peers: opt} }
else if(list_is(opt)){ opt = {peers: opt} }
@@ -922,15 +924,13 @@
this[f] = v;
}, at.opt);
Gun.on('opt', at);
+ if(!at.once){
+ gun.on('in', input, at);
+ gun.on('out', output, at);
+ }
+ at.once = true;
return gun;
}
- function root(at){
- var gun = at.gun;
- at.root = gun;
- at.graph = {};
- gun.on('in', input, at);
- gun.on('out', output, at);
- }
function output(at){
var cat = this, gun = cat.gun, tmp;
// TODO: BUG! Outgoing `get` to read from in memory!!!
@@ -939,7 +939,7 @@
cat.on('in', obj_to(at, {gun: cat.gun})); // TODO: PERF! input now goes to output so it would be nice to reduce the circularity here for perf purposes.
//}
if(at['#']){
- dedup.track(at['#']);
+ cat.dedup.track(at['#']);
}
if(!at.gun){
at = Gun.obj.to(at, {gun: gun});
@@ -974,12 +974,12 @@
if(!at['#'] && at['@']){
at['#'] = Gun.text.random(); // TODO: Use what is used other places instead.
Gun.on.ack(at['@'], at);
- dedup.track(at['#']);
+ cat.dedup.track(at['#']);
cat.on('out', at);
return;
}
- if(at['#'] && dedup.check(at['#'])){ return }
- dedup.track(at['#']);
+ if(at['#'] && cat.dedup.check(at['#'])){ return }
+ cat.dedup.track(at['#']);
Gun.on.ack(at['@'], at);
if(at.put){
if(cat.graph){
@@ -1011,40 +1011,41 @@
via: this.at
});
}
- function dedup(){}
- dedup.cache = {};
- dedup.track = function (id) {
- dedup.cache[id] = Gun.time.is();
+ function Dedup(){
+ this.cache = {};
+ }
+ Dedup.prototype.track = function (id) {
+ this.cache[id] = Gun.time.is();
// Engage GC.
- if (!dedup.to) {
- dedup.gc();
+ if (!this.to) {
+ this.gc();
}
return id;
};
- dedup.check = function(id){
+ Dedup.prototype.check = function(id){
// Have we seen this ID recently?
- return Gun.obj.has(dedup.cache, id);
+ return Gun.obj.has(this.cache, id);
}
- dedup.gc = function(){
+ Dedup.prototype.gc = function(){
var now = Gun.time.is();
var oldest = now;
var maxAge = 5 * 60 * 1000;
// TODO: Gun.scheduler already does this? Reuse that.
- Gun.obj.map(dedup.cache, function (time, id) {
+ Gun.obj.map(this.cache, function (time, id) {
oldest = Math.min(now, time);
if ((now - time) < maxAge) {
return;
}
- delete dedup.cache[id];
+ delete this.cache[id];
});
- var done = Gun.obj.empty(dedup.cache);
+ var done = Gun.obj.empty(this.cache);
// Disengage GC.
if (done) {
- dedup.to = null;
+ this.to = null;
return;
}
@@ -1055,7 +1056,8 @@
var nextGC = maxAge - elapsed;
// Schedule the next GC event.
- dedup.to = setTimeout(dedup.gc, nextGC);
+ var dedup = this;
+ this.to = setTimeout(function(){ dedup.gc() }, nextGC);
}
}());
var text = Type.text, text_is = text.is, text_random = text.random;
@@ -2484,4 +2486,4 @@
})(require, './adapters/wsp');
-}());
+}());
\ No newline at end of file
diff --git a/hooks/build b/hooks/build
new file mode 100755
index 00000000..fdf5be51
--- /dev/null
+++ b/hooks/build
@@ -0,0 +1,5 @@
+#!/bin/bash
+docker build --build-arg BUILD_DATE=`date -u +"%Y-%m-%dT%H:%M:%SZ"` \
+ --build-arg VCS_REF=`git rev-parse --short HEAD` \
+ --build-arg VCS_URL=`git remote get-url origin` \
+ --build-arg VERSION=$SOURCE_BRANCH -t $IMAGE_NAME .
diff --git a/hooks/post_push b/hooks/post_push
new file mode 100755
index 00000000..38af73a6
--- /dev/null
+++ b/hooks/post_push
@@ -0,0 +1,3 @@
+#!/bin/bash
+docker tag $IMAGE_NAME $DOCKER_REPO:latest
+docker push $DOCKER_REPO:latest