mirror of
https://github.com/amark/gun.git
synced 2025-03-30 15:08:33 +00:00
merged stash
This commit is contained in:
parent
22aea79838
commit
13f6e287fa
5
gun.js
5
gun.js
@ -418,9 +418,7 @@
|
||||
if(err){ return cb(err) }
|
||||
return cb(null);
|
||||
});
|
||||
} else {
|
||||
Gun.log.call(gun, "Warning! You have no persistence layer to save to!");
|
||||
}
|
||||
});
|
||||
});
|
||||
if(!gun.back){
|
||||
gun.shot('then').fire(set);
|
||||
@ -458,6 +456,7 @@
|
||||
});
|
||||
return gun;
|
||||
}
|
||||
*/
|
||||
// Union is different than set. Set casts non-gun style of data into a gun compatible data.
|
||||
// Union takes already gun compatible data and validates it for a merge.
|
||||
// Meaning it is more low level, such that even set uses union internally.
|
||||
|
923
index.html
923
index.html
@ -1,491 +1,492 @@
|
||||
<!DOCTYPE html>
|
||||
<html>
|
||||
<head>
|
||||
<meta name="viewport" content="width=device-width, initial-scale=1">
|
||||
<script src="https://ajax.googleapis.com/ajax/libs/jquery/1.11.1/jquery.min.js"></script>
|
||||
<!--
|
||||
<script src="../gun.js"></script>
|
||||
<link id="style" rel="stylesheet" href="https://yandex.st/highlightjs/8.0/styles/sunburst.min.css">
|
||||
<script src="https://yandex.st/highlightjs/8.0/highlight.min.js"></script>
|
||||
<script src="https://dl.dropboxusercontent.com/u/4374976/random/phrase.js"></script>
|
||||
-->
|
||||
</head>
|
||||
<body>
|
||||
<style>
|
||||
@import url(https://fonts.googleapis.com/css?family=Dosis|Poiret+One|Oxygen);
|
||||
html, body {
|
||||
margin: 0;
|
||||
padding: 0;
|
||||
height: 100%;
|
||||
font-family: 'Oxygen', Candara, Calibri, Segoe, "Segoe UI", Optima, Arial, sans-serif;
|
||||
}
|
||||
.center {
|
||||
text-align: center;
|
||||
}
|
||||
.lean {
|
||||
font-family: 'Poiret One', Candara, Calibri, Segoe, "Segoe UI", Optima, Arial, sans-serif;
|
||||
}
|
||||
.clean {
|
||||
font-family: 'Dosis', Candara, Calibri, Segoe, "Segoe UI", Optima, Arial, sans-serif;
|
||||
}
|
||||
.crisp {
|
||||
font-family: 'Oxygen', Candara, Calibri, Segoe, "Segoe UI", Optima, Arial, sans-serif;
|
||||
}
|
||||
pre {
|
||||
background-color: black;
|
||||
border: 1px dashed white;
|
||||
color: white;
|
||||
line-height: 1.5em;
|
||||
padding: 1em;
|
||||
overflow: hidden;
|
||||
}
|
||||
button {
|
||||
border: none;
|
||||
color: white;
|
||||
background: skyblue;
|
||||
padding: 1em;
|
||||
cursor: pointer;
|
||||
}
|
||||
input {
|
||||
background: transparent;
|
||||
border: 2px dashed grey;
|
||||
padding: 1em;
|
||||
}
|
||||
.step {
|
||||
display: none;
|
||||
}
|
||||
.step:target {
|
||||
display: block;
|
||||
}
|
||||
.grid {
|
||||
text-align: center;
|
||||
}
|
||||
.unit {
|
||||
display: inline-block;
|
||||
}
|
||||
.learn {
|
||||
min-width: 250px;
|
||||
max-width: 400px;
|
||||
width: 30%;
|
||||
padding: 2em;
|
||||
}
|
||||
.svg {
|
||||
background: white url('./web/img/devices.svg') no-repeat 50% 50%;
|
||||
height: 40em;
|
||||
}
|
||||
.GUN {
|
||||
background: transparent url('./web/img/gun.svg') no-repeat 50% 50%;
|
||||
background-size: 60%;
|
||||
}
|
||||
.dull {
|
||||
background-color: #EEE;
|
||||
-webkit-transition: background-color 600ms linear;
|
||||
-moz-transition: background-color 600ms linear;
|
||||
transition: background-color 600ms linear;
|
||||
}
|
||||
.blue {
|
||||
background-color: skyblue;
|
||||
-webkit-transition: background-color 600ms linear;
|
||||
-moz-transition: background-color 600ms linear;
|
||||
transition: background-color 600ms linear;
|
||||
}
|
||||
.red {
|
||||
background-color: red;
|
||||
-webkit-transition: background-color 600ms linear;
|
||||
-moz-transition: background-color 600ms linear;
|
||||
transition: background-color 600ms linear;
|
||||
}
|
||||
.green {
|
||||
background-color: MediumSpringGreen;
|
||||
-webkit-transition: background-color 600ms linear;
|
||||
-moz-transition: background-color 600ms linear;
|
||||
transition: background-color 600ms linear;
|
||||
}
|
||||
.fold {
|
||||
width: 100%;
|
||||
height: 100%;
|
||||
min-height: 450px;
|
||||
position: relative;
|
||||
}
|
||||
.grid {
|
||||
display: inline-block;
|
||||
}
|
||||
@media (max-width: 760px) {
|
||||
body {
|
||||
font-siz----e: 10pt;
|
||||
}
|
||||
}
|
||||
@media (max-width: 1279px) {
|
||||
.wide {
|
||||
display: none;
|
||||
}
|
||||
}
|
||||
</style>
|
||||
<head>
|
||||
<meta name="viewport" content="width=device-width, initial-scale=1">
|
||||
<script src="https://ajax.googleapis.com/ajax/libs/jquery/1.11.1/jquery.min.js"></script>
|
||||
<!--
|
||||
<script src="../gun.js"></script>
|
||||
<link id="style" rel="stylesheet" href="https://yandex.st/highlightjs/8.0/styles/sunburst.min.css">
|
||||
<script src="https://yandex.st/highlightjs/8.0/highlight.min.js"></script>
|
||||
<script src="https://dl.dropboxusercontent.com/u/4374976/random/phrase.js"></script>
|
||||
-->
|
||||
</head>
|
||||
<body>
|
||||
<style>
|
||||
@import url(https://fonts.googleapis.com/css?family=Dosis|Poiret+One|Oxygen);
|
||||
html, body {
|
||||
margin: 0;
|
||||
padding: 0;
|
||||
height: 100%;
|
||||
font-family: 'Oxygen', Candara, Calibri, Segoe, "Segoe UI", Optima, Arial, sans-serif;
|
||||
}
|
||||
.center {
|
||||
text-align: center;
|
||||
}
|
||||
.lean {
|
||||
font-family: 'Poiret One', Candara, Calibri, Segoe, "Segoe UI", Optima, Arial, sans-serif;
|
||||
}
|
||||
.clean {
|
||||
font-family: 'Dosis', Candara, Calibri, Segoe, "Segoe UI", Optima, Arial, sans-serif;
|
||||
}
|
||||
.crisp {
|
||||
font-family: 'Oxygen', Candara, Calibri, Segoe, "Segoe UI", Optima, Arial, sans-serif;
|
||||
}
|
||||
pre {
|
||||
background-color: black;
|
||||
border: 1px dashed white;
|
||||
color: white;
|
||||
line-height: 1.5em;
|
||||
padding: 1em;
|
||||
overflow: hidden;
|
||||
}
|
||||
button {
|
||||
border: none;
|
||||
color: white;
|
||||
background: skyblue;
|
||||
padding: 1em;
|
||||
cursor: pointer;
|
||||
}
|
||||
input {
|
||||
background: transparent;
|
||||
border: 2px dashed grey;
|
||||
padding: 1em;
|
||||
}
|
||||
.step {
|
||||
display: none;
|
||||
}
|
||||
.step:target {
|
||||
display: block;
|
||||
}
|
||||
.grid {
|
||||
text-align: center;
|
||||
}
|
||||
.unit {
|
||||
display: inline-block;
|
||||
}
|
||||
.learn {
|
||||
min-width: 250px;
|
||||
max-width: 400px;
|
||||
width: 30%;
|
||||
padding: 2em;
|
||||
}
|
||||
.svg {
|
||||
background: white url('./web/img/devices.svg') no-repeat 50% 50%;
|
||||
height: 40em;
|
||||
}
|
||||
.GUN {
|
||||
background: transparent url('./web/img/gun.svg') no-repeat 50% 50%;
|
||||
background-size: 60%;
|
||||
}
|
||||
.dull {
|
||||
background-color: #EEE;
|
||||
-webkit-transition: background-color 600ms linear;
|
||||
-moz-transition: background-color 600ms linear;
|
||||
transition: background-color 600ms linear;
|
||||
}
|
||||
.blue {
|
||||
background-color: skyblue;
|
||||
-webkit-transition: background-color 600ms linear;
|
||||
-moz-transition: background-color 600ms linear;
|
||||
transition: background-color 600ms linear;
|
||||
}
|
||||
.red {
|
||||
background-color: red;
|
||||
-webkit-transition: background-color 600ms linear;
|
||||
-moz-transition: background-color 600ms linear;
|
||||
transition: background-color 600ms linear;
|
||||
}
|
||||
.green {
|
||||
background-color: MediumSpringGreen;
|
||||
-webkit-transition: background-color 600ms linear;
|
||||
-moz-transition: background-color 600ms linear;
|
||||
transition: background-color 600ms linear;
|
||||
}
|
||||
.fold {
|
||||
width: 100%;
|
||||
height: 800px;
|
||||
min-height: 800px;
|
||||
position: relative;
|
||||
}
|
||||
.grid {
|
||||
display: inline-block;
|
||||
}
|
||||
@media (max-width: 760px) {
|
||||
body {
|
||||
font-siz----e: 10pt;
|
||||
}
|
||||
}
|
||||
@media (max-width: 1279px) {
|
||||
.wide {
|
||||
display: none;
|
||||
}
|
||||
}
|
||||
</style>
|
||||
|
||||
<div class="fold">
|
||||
<div class="fold">
|
||||
|
||||
<div class="behold" style="overflow: hidden; position: relative; width: 100%; min-height 400px; margin: -200px 0 0; padding:0; top: 40%; text-align: center;">
|
||||
<div class="behold" style="overflow: hidden; position: relative; width: 100%; min-height 400px; margin: -200px 0 0; padding:0; top: 40%; text-align: center;">
|
||||
|
||||
<div class="graphic grid" style="min-width: 300px; max-width: 600px; height: 400px;
|
||||
position: relative; margin:0 auto; padding:0;">
|
||||
<div class="graphic grid" style="min-width: 300px; max-width: 600px; height: 400px;
|
||||
position: relative; margin:0 auto; padding:0;">
|
||||
|
||||
<img src="./web/img/server.png" class="server" style="position: absolute; top: 2%; left: 35%; wid-th: 50%;">
|
||||
<img src="./web/img/server.png" class="server" style="position: absolute; top: 2%; left: 35%; wid-th: 50%;">
|
||||
|
||||
<div class="desktop" style="height: 10em; width: 17em; position: absolute; top: 36%; left: 3%;">
|
||||
<div class="monitor" style="height: 100%; width: 100%; background: #222; padding: .75em; margin-left: -.75em; border-radius: 1em;">
|
||||
<div class="dull screen GUN" style="height: 100%; width: 100%;">
|
||||
</div>
|
||||
</div>
|
||||
<div class="stand" style="margin: 1px auto 0px;
|
||||
border-bottom: 2.75em solid #888;
|
||||
border-left: .5em solid transparent;
|
||||
border-right: .5em solid transparent;
|
||||
height: 0;
|
||||
width: 3.2em;">
|
||||
</div>
|
||||
<div class="stand" style="width: 6em; height: .5em; background: #888; margin: 0px auto"></div>
|
||||
</div>
|
||||
|
||||
<div class="laptop" style="height: 7em; width: 12em; position: absolute; top: 60%; left: 48%;">
|
||||
<div class="lid" style="height: 100%; width: 100%; background: #222; padding: .6em; margin-left: -.6em; border-radius: .6em .6em 0em 0em;">
|
||||
<div class="dull screen GUN" style="height: 100%; width: 100%;">
|
||||
</div>
|
||||
</div>
|
||||
<div class="case" style="height: .75em; width: 140%; margin-left: -20%; background: #999; border-radius: 0em 0em 5em 5em;">
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<div class="phone" style="height: 3.75em; width: 2.25em; position: absolute; top: 35%; left: 70%;">
|
||||
<div class="case" style="height: 100%; width: 100%; background: #222; padding: .5em .2em; margin-left: -.2em; border-radius: 0.25em;">
|
||||
<div class="dull screen GUN" style="height: 100%; width: 100%;">
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<div class="arrow desktop-server" style="width: 52px; height: 52px; border: dashed 0px FireBrick; border-radius: 50px 0 0 0;
|
||||
position: absolute; left: 20%; top: 15%; border-width: 3px 0px 0px 3px;">
|
||||
<div class="rarr" style="position: absolute; top: -.59em; right: -.7em;
|
||||
width: 0;
|
||||
height: 0;
|
||||
border-top: .5em solid transparent;
|
||||
border-left: 1em solid FireBrick;
|
||||
border-bottom: .5em solid transparent;">
|
||||
</div>
|
||||
<div class="darr" style="position: absolute; bottom: -.75em; left: -.59em;
|
||||
width: 0;
|
||||
height: 0;
|
||||
border-left: .5em solid transparent;
|
||||
border-right: .5em solid transparent;
|
||||
border-top: 1em solid FireBrick;">
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<div class="arrow phone-server" style="width: 26px; height: 52px; border: dashed 0px FireBrick; border-radius: 0 0 50px 0;
|
||||
position: absolute; left: 80%; top: 35%; border-width: 0px 3px 3px 0px;">
|
||||
<div class="uarr" style="position: absolute; top: -.9em; right: -.59em;
|
||||
width: 0;
|
||||
height: 0;
|
||||
border-left: .5em solid transparent;
|
||||
border-right: .5em solid transparent;
|
||||
border-bottom: 1em solid FireBrick;">
|
||||
</div>
|
||||
<div class="larr" style="position: absolute; bottom: -.55em; left: -.59em;
|
||||
width: 0;
|
||||
height: 0;
|
||||
border-top: .5em solid transparent;
|
||||
border-right: 1em solid FireBrick;
|
||||
border-bottom: .5em solid transparent;">
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<div class="arrow updown laptop-server" style="height: 50px; border: dashed 0px FireBrick; border-radius: 0;
|
||||
position: absolute; left: 60%; top: 40%; border-width: 0px 3px 0px 0px;">
|
||||
<div class="uarr" style="position: absolute; top: -1em; left: -.45em;
|
||||
width: 0;
|
||||
height: 0;
|
||||
border-left: .5em solid transparent;
|
||||
border-right: .5em solid transparent;
|
||||
border-bottom: 1em solid FireBrick;">
|
||||
</div>
|
||||
<div class="darr" style="position: absolute; bottom: -1em; left: -.45em;
|
||||
width: 0;
|
||||
height: 0;
|
||||
border-left: .5em solid transparent;
|
||||
border-right: .5em solid transparent;
|
||||
border-top: 1em solid FireBrick;">
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<span style="color: transparent">Distributed embedded graph database engine. The no pain, no cost, no backend, NoDB database, gun.</span>
|
||||
<div class="desktop" style="height: 10em; width: 17em; position: absolute; top: 36%; left: 3%;">
|
||||
<div class="monitor" style="height: 100%; width: 100%; background: #222; padding: .75em; margin-left: -.75em; border-radius: 1em;">
|
||||
<div class="dull screen GUN" style="height: 100%; width: 100%;">
|
||||
</div>
|
||||
<div class="graphic wide grid" style="min-width: 300px; max-width: 600px; height: 400px;
|
||||
position: relative; margin:0 auto; padding:0;">
|
||||
|
||||
<div class="arrow server-server" style="width: 100px; height: 0px; border: dashed 0px FireBrick; border-radius: 0;
|
||||
position: absolute; left: -9%; top: 15%; border-width: 3px 0px 0px 0px;">
|
||||
<div class="rarr" style="position: absolute; top: -.59em; left: -.5em;
|
||||
width: 0;
|
||||
height: 0;
|
||||
border-top: .5em solid transparent;
|
||||
border-right: 1em solid FireBrick;
|
||||
border-bottom: .5em solid transparent;">
|
||||
</div>
|
||||
<div class="larr" style="position: absolute; top: -.59em; right: -.6em;
|
||||
width: 0;
|
||||
height: 0;
|
||||
border-left: 1em solid FireBrick;
|
||||
border-bottom: .5em solid transparent;
|
||||
border-top: .5em solid transparent;">
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<img src="./web/img/server.png" class="server" style="position: absolute; top: 2%; right: 35%;">
|
||||
|
||||
<div class="desktop" style="height: 10em; width: 17em; position: absolute; top: 36%; right: 3%;">
|
||||
<div class="monitor" style="height: 100%; width: 100%; background: #222; padding: .75em; margin-left: -.75em; border-radius: 1em;">
|
||||
<div class="dull screen GUN" style="height: 100%; width: 100%;">
|
||||
</div>
|
||||
</div>
|
||||
<div class="stand" style="margin: 1px auto 0px;
|
||||
border-bottom: 2.75em solid #888;
|
||||
border-left: .5em solid transparent;
|
||||
border-right: .5em solid transparent;
|
||||
height: 0;
|
||||
width: 3.2em;">
|
||||
</div>
|
||||
<div class="stand" style="width: 6em; height: .5em; background: #888; margin: 0px auto"></div>
|
||||
</div>
|
||||
|
||||
<div class="laptop" style="height: 7em; width: 12em; position: absolute; top: 60%; right: 48%;">
|
||||
<div class="lid" style="height: 100%; width: 100%; background: #222; padding: .6em; margin-left: -.6em; border-radius: .6em .6em 0em 0em;">
|
||||
<div class="dull screen GUN" style="height: 100%; width: 100%;">
|
||||
</div>
|
||||
</div>
|
||||
<div class="case" style="height: .75em; width: 140%; margin-left: -20%; background: #999; border-radius: 0em 0em 5em 5em;">
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<div class="phone" style="height: 3.75em; width: 2.25em; position: absolute; top: 35%; right: 70%;">
|
||||
<div class="case" style="height: 100%; width: 100%; background: #222; padding: .5em .2em; margin-left: -.2em; border-radius: 0.25em;">
|
||||
<div class="dull screen GUN" style="height: 100%; width: 100%;">
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<div class="arrow desktop-server" style="width: 52px; height: 52px; border: dashed 0px FireBrick; border-radius: 0 50px 0 0;
|
||||
position: absolute; right: 20%; top: 15%; border-width: 3px 3px 0px 0px;">
|
||||
<div class="rarr" style="position: absolute; top: -.59em; left: -.5em;
|
||||
width: 0;
|
||||
height: 0;
|
||||
border-top: .5em solid transparent;
|
||||
border-right: 1em solid FireBrick;
|
||||
border-bottom: .5em solid transparent;">
|
||||
</div>
|
||||
<div class="darr" style="position: absolute; bottom: -.75em; right: -.59em;
|
||||
width: 0;
|
||||
height: 0;
|
||||
border-left: .5em solid transparent;
|
||||
border-right: .5em solid transparent;
|
||||
border-top: 1em solid FireBrick;">
|
||||
</div>
|
||||
</div>
|
||||
|
||||
|
||||
<div class="arrow phone-server" style="width: 26px; height: 52px; border: dashed 0px FireBrick; border-radius: 0 0 0px 50px;
|
||||
position: absolute; right: 80.3%; top: 34.3%; border-width: 0px 0px 3px 3px;">
|
||||
<div class="uarr" style="position: absolute; top: -.8em; left: -.59em;
|
||||
width: 0;
|
||||
height: 0;
|
||||
border-left: .5em solid transparent;
|
||||
border-right: .5em solid transparent;
|
||||
border-bottom: 1em solid FireBrick;">
|
||||
</div>
|
||||
<div class="rarr" style="position: absolute; bottom: -.55em; right: -.7em;
|
||||
width: 0;
|
||||
height: 0;
|
||||
border-top: .5em solid transparent;
|
||||
border-left: 1em solid FireBrick;
|
||||
border-bottom: .5em solid transparent;">
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<div class="arrow updown laptop-server" style="height: 50px; border: dashed 0px FireBrick; border-radius: 0;
|
||||
position: absolute; right: 60%; top: 40%; border-width: 0px 3px 0px 0px;">
|
||||
<div class="uarr" style="position: absolute; top: -1em; left: -.45em;
|
||||
width: 0;
|
||||
height: 0;
|
||||
border-left: .5em solid transparent;
|
||||
border-right: .5em solid transparent;
|
||||
border-bottom: 1em solid FireBrick;">
|
||||
</div>
|
||||
<div class="darr" style="position: absolute; bottom: -1em; left: -.45em;
|
||||
width: 0;
|
||||
height: 0;
|
||||
border-left: .5em solid transparent;
|
||||
border-right: .5em solid transparent;
|
||||
border-top: 1em solid FireBrick;">
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<span style="color: transparent">Distributed embedded graph database engine. The no pain, no cost, no backend, NoDB database, gun.</span>
|
||||
</div>
|
||||
|
||||
<script>
|
||||
$(function(){
|
||||
var c = ['dull', 'blue', 'green']
|
||||
, a = 'dull blue red green';
|
||||
$(".screen").click(function(){
|
||||
c.push(c.shift());
|
||||
var to = c[0];
|
||||
$(this).removeClass(a).addClass(to);
|
||||
$('.screen').not(this).each(function(){
|
||||
var t = $(this);
|
||||
setTimeout(function(){
|
||||
t.removeClass(a).addClass(to);
|
||||
}, rand(400,700));
|
||||
});
|
||||
});
|
||||
function rand(min, max) {
|
||||
return Math.floor(Math.random() * (max - min + 1)) + min;
|
||||
}
|
||||
})
|
||||
</script>
|
||||
|
||||
<div class="center" style="margin-top: 2%;">
|
||||
<div class="lean" style="font-size: 400%;">Easiest Database Ever</div>
|
||||
<div class="lean" style="font-size: 225%;">Sync state in a cinch at a distributed system scale.</div>
|
||||
</div>
|
||||
|
||||
</div>
|
||||
|
||||
<div class="stand" style="margin: 1px auto 0px;
|
||||
border-bottom: 2.75em solid #888;
|
||||
border-left: .5em solid transparent;
|
||||
border-right: .5em solid transparent;
|
||||
height: 0;
|
||||
width: 3.2em;">
|
||||
</div>
|
||||
<a href="https://github.com/amark/gun" target="_blank" class="wide"><img style="position: absolute; top: 0; right: 0; border: 0;" src="https://camo.githubusercontent.com/365986a132ccd6a44c23a9169022c0b5c890c387/68747470733a2f2f73332e616d617a6f6e6177732e636f6d2f6769746875622f726962626f6e732f666f726b6d655f72696768745f7265645f6161303030302e706e67" alt="Fork me on GitHub" data-canonical-src="https://s3.amazonaws.com/github/ribbons/forkme_right_red_aa0000.png"></a>
|
||||
<!-- END FOLD -->
|
||||
<div class="stand" style="width: 6em; height: .5em; background: #888; margin: 0px auto"></div>
|
||||
</div>
|
||||
|
||||
<div class="laptop" style="height: 7em; width: 12em; position: absolute; top: 60%; left: 48%;">
|
||||
<div class="lid" style="height: 100%; width: 100%; background: #222; padding: .6em; margin-left: -.6em; border-radius: .6em .6em 0em 0em;">
|
||||
<div class="dull screen GUN" style="height: 100%; width: 100%;">
|
||||
</div>
|
||||
</div>
|
||||
<div class="case" style="height: .75em; width: 140%; margin-left: -20%; background: #999; border-radius: 0em 0em 5em 5em;">
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<div class="phone" style="height: 3.75em; width: 2.25em; position: absolute; top: 35%; left: 70%;">
|
||||
<div class="case" style="height: 100%; width: 100%; background: #222; padding: .5em .2em; margin-left: -.2em; border-radius: 0.25em;">
|
||||
<div class="dull screen GUN" style="height: 100%; width: 100%;">
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<div class="arrow desktop-server" style="width: 52px; height: 52px; border: dashed 0px FireBrick; border-radius: 50px 0 0 0;
|
||||
position: absolute; left: 20%; top: 15%; border-width: 3px 0px 0px 3px;">
|
||||
<div class="rarr" style="position: absolute; top: -.59em; right: -.7em;
|
||||
width: 0;
|
||||
height: 0;
|
||||
border-top: .5em solid transparent;
|
||||
border-left: 1em solid FireBrick;
|
||||
border-bottom: .5em solid transparent;">
|
||||
</div>
|
||||
<div class="darr" style="position: absolute; bottom: -.75em; left: -.59em;
|
||||
width: 0;
|
||||
height: 0;
|
||||
border-left: .5em solid transparent;
|
||||
border-right: .5em solid transparent;
|
||||
border-top: 1em solid FireBrick;">
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<div class="arrow phone-server" style="width: 26px; height: 52px; border: dashed 0px FireBrick; border-radius: 0 0 50px 0;
|
||||
position: absolute; left: 80%; top: 35%; border-width: 0px 3px 3px 0px;">
|
||||
<div class="uarr" style="position: absolute; top: -.9em; right: -.59em;
|
||||
width: 0;
|
||||
height: 0;
|
||||
border-left: .5em solid transparent;
|
||||
border-right: .5em solid transparent;
|
||||
border-bottom: 1em solid FireBrick;">
|
||||
</div>
|
||||
<div class="larr" style="position: absolute; bottom: -.55em; left: -.59em;
|
||||
width: 0;
|
||||
height: 0;
|
||||
border-top: .5em solid transparent;
|
||||
border-right: 1em solid FireBrick;
|
||||
border-bottom: .5em solid transparent;">
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<div class="arrow updown laptop-server" style="height: 50px; border: dashed 0px FireBrick; border-radius: 0;
|
||||
position: absolute; left: 60%; top: 40%; border-width: 0px 3px 0px 0px;">
|
||||
<div class="uarr" style="position: absolute; top: -1em; left: -.45em;
|
||||
width: 0;
|
||||
height: 0;
|
||||
border-left: .5em solid transparent;
|
||||
border-right: .5em solid transparent;
|
||||
border-bottom: 1em solid FireBrick;">
|
||||
</div>
|
||||
<div class="darr" style="position: absolute; bottom: -1em; left: -.45em;
|
||||
width: 0;
|
||||
height: 0;
|
||||
border-left: .5em solid transparent;
|
||||
border-right: .5em solid transparent;
|
||||
border-top: 1em solid FireBrick;">
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<span style="color: transparent">Distributed embedded graph database engine. The no pain, no cost, no backend, NoDB database, gun.</span>
|
||||
</div>
|
||||
<div class="graphic wide grid" style="min-width: 300px; max-width: 600px; height: 400px;
|
||||
position: relative; margin:0 auto; padding:0;">
|
||||
|
||||
<div class="arrow server-server" style="width: 100px; height: 0px; border: dashed 0px FireBrick; border-radius: 0;
|
||||
position: absolute; left: -9%; top: 15%; border-width: 3px 0px 0px 0px;">
|
||||
<div class="rarr" style="position: absolute; top: -.59em; left: -.5em;
|
||||
width: 0;
|
||||
height: 0;
|
||||
border-top: .5em solid transparent;
|
||||
border-right: 1em solid FireBrick;
|
||||
border-bottom: .5em solid transparent;">
|
||||
</div>
|
||||
<div class="larr" style="position: absolute; top: -.59em; right: -.6em;
|
||||
width: 0;
|
||||
height: 0;
|
||||
border-left: 1em solid FireBrick;
|
||||
border-bottom: .5em solid transparent;
|
||||
border-top: .5em solid transparent;">
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<img src="./web/img/server.png" class="server" style="position: absolute; top: 2%; right: 35%;">
|
||||
|
||||
<div class="desktop" style="height: 10em; width: 17em; position: absolute; top: 36%; right: 3%;">
|
||||
<div class="monitor" style="height: 100%; width: 100%; background: #222; padding: .75em; margin-left: -.75em; border-radius: 1em;">
|
||||
<div class="dull screen GUN" style="height: 100%; width: 100%;">
|
||||
</div>
|
||||
</div>
|
||||
<div class="stand" style="margin: 1px auto 0px;
|
||||
border-bottom: 2.75em solid #888;
|
||||
border-left: .5em solid transparent;
|
||||
border-right: .5em solid transparent;
|
||||
height: 0;
|
||||
width: 3.2em;">
|
||||
</div>
|
||||
<div class="stand" style="width: 6em; height: .5em; background: #888; margin: 0px auto"></div>
|
||||
</div>
|
||||
|
||||
<div class="laptop" style="height: 7em; width: 12em; position: absolute; top: 60%; right: 48%;">
|
||||
<div class="lid" style="height: 100%; width: 100%; background: #222; padding: .6em; margin-left: -.6em; border-radius: .6em .6em 0em 0em;">
|
||||
<div class="dull screen GUN" style="height: 100%; width: 100%;">
|
||||
</div>
|
||||
</div>
|
||||
<div class="case" style="height: .75em; width: 140%; margin-left: -20%; background: #999; border-radius: 0em 0em 5em 5em;">
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<div class="phone" style="height: 3.75em; width: 2.25em; position: absolute; top: 35%; right: 70%;">
|
||||
<div class="case" style="height: 100%; width: 100%; background: #222; padding: .5em .2em; margin-left: -.2em; border-radius: 0.25em;">
|
||||
<div class="dull screen GUN" style="height: 100%; width: 100%;">
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<div class="arrow desktop-server" style="width: 52px; height: 52px; border: dashed 0px FireBrick; border-radius: 0 50px 0 0;
|
||||
position: absolute; right: 20%; top: 15%; border-width: 3px 3px 0px 0px;">
|
||||
<div class="rarr" style="position: absolute; top: -.59em; left: -.5em;
|
||||
width: 0;
|
||||
height: 0;
|
||||
border-top: .5em solid transparent;
|
||||
border-right: 1em solid FireBrick;
|
||||
border-bottom: .5em solid transparent;">
|
||||
</div>
|
||||
<div class="darr" style="position: absolute; bottom: -.75em; right: -.59em;
|
||||
width: 0;
|
||||
height: 0;
|
||||
border-left: .5em solid transparent;
|
||||
border-right: .5em solid transparent;
|
||||
border-top: 1em solid FireBrick;">
|
||||
</div>
|
||||
</div>
|
||||
|
||||
|
||||
<div class="arrow phone-server" style="width: 26px; height: 52px; border: dashed 0px FireBrick; border-radius: 0 0 0px 50px;
|
||||
position: absolute; right: 80.3%; top: 34.3%; border-width: 0px 0px 3px 3px;">
|
||||
<div class="uarr" style="position: absolute; top: -.8em; left: -.59em;
|
||||
width: 0;
|
||||
height: 0;
|
||||
border-left: .5em solid transparent;
|
||||
border-right: .5em solid transparent;
|
||||
border-bottom: 1em solid FireBrick;">
|
||||
</div>
|
||||
<div class="rarr" style="position: absolute; bottom: -.55em; right: -.7em;
|
||||
width: 0;
|
||||
height: 0;
|
||||
border-top: .5em solid transparent;
|
||||
border-left: 1em solid FireBrick;
|
||||
border-bottom: .5em solid transparent;">
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<div class="arrow updown laptop-server" style="height: 50px; border: dashed 0px FireBrick; border-radius: 0;
|
||||
position: absolute; right: 60%; top: 40%; border-width: 0px 3px 0px 0px;">
|
||||
<div class="uarr" style="position: absolute; top: -1em; left: -.45em;
|
||||
width: 0;
|
||||
height: 0;
|
||||
border-left: .5em solid transparent;
|
||||
border-right: .5em solid transparent;
|
||||
border-bottom: 1em solid FireBrick;">
|
||||
</div>
|
||||
<div class="darr" style="position: absolute; bottom: -1em; left: -.45em;
|
||||
width: 0;
|
||||
height: 0;
|
||||
border-left: .5em solid transparent;
|
||||
border-right: .5em solid transparent;
|
||||
border-top: 1em solid FireBrick;">
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<span style="color: transparent">Distributed embedded graph database engine. The no pain, no cost, no backend, NoDB database, gun.</span>
|
||||
</div>
|
||||
|
||||
<script>
|
||||
console.log("hi!1");
|
||||
$(function(){
|
||||
var c = ['dull', 'blue', 'green']
|
||||
, a = 'dull blue red green';
|
||||
$(".screen").click(function(){
|
||||
c.push(c.shift());
|
||||
var to = c[0];
|
||||
$(this).removeClass(a).addClass(to);
|
||||
$('.screen').not(this).each(function(){
|
||||
var t = $(this);
|
||||
setTimeout(function(){
|
||||
t.removeClass(a).addClass(to);
|
||||
}, rand(400,700));
|
||||
});
|
||||
});
|
||||
function rand(min, max) {
|
||||
return Math.floor(Math.random() * (max - min + 1)) + min;
|
||||
}
|
||||
})
|
||||
</script>
|
||||
|
||||
<div class="center" style="margin-top: 2%;">
|
||||
<div class="lean" style="font-size: 400%;">Easiest Database Ever</div>
|
||||
<div class="lean" style="font-size: 225%;">Sync state in a cinch at a distributed system scale.</div>
|
||||
</div>
|
||||
|
||||
</div>
|
||||
|
||||
</div>
|
||||
<a href="https://github.com/amark/gun" target="_blank"><img style="position: absolute; top: 0; right: 0; border: 0;" src="https://camo.githubusercontent.com/365986a132ccd6a44c23a9169022c0b5c890c387/68747470733a2f2f73332e616d617a6f6e6177732e636f6d2f6769746875622f726962626f6e732f666f726b6d655f72696768745f7265645f6161303030302e706e67" alt="Fork me on GitHub" data-canonical-src="https://s3.amazonaws.com/github/ribbons/forkme_right_red_aa0000.png"></a>
|
||||
<!-- END FOLD -->
|
||||
|
||||
<! OLD BLOG POST HERE -->
|
||||
|
||||
<style>
|
||||
#main {
|
||||
min-width: 250px;
|
||||
max-width: 700px;
|
||||
width: 75%;
|
||||
margin: 7% auto;
|
||||
padding: 2% 5%;
|
||||
background: white;
|
||||
background: rgba(100%,100%,100%,.6);
|
||||
font-family: Arial;
|
||||
font-size: 18pt;
|
||||
text-shadow: 0px 0px 7px #DDD;
|
||||
line-height: 20pt;
|
||||
}
|
||||
#main p {
|
||||
text-indent: 2em;
|
||||
}
|
||||
#main {
|
||||
min-width: 250px;
|
||||
max-width: 700px;
|
||||
width: 75%;
|
||||
margin: 7% auto;
|
||||
padding: 2% 5%;
|
||||
background: white;
|
||||
background: rgba(100%,100%,100%,.6);
|
||||
font-family: Arial;
|
||||
font-size: 18pt;
|
||||
text-shadow: 0px 0px 7px #DDD;
|
||||
line-height: 20pt;
|
||||
}
|
||||
#main p {
|
||||
text-indent: 2em;
|
||||
}
|
||||
</style>
|
||||
<div id="main">
|
||||
<h3>The blog that started it all...</h3>
|
||||
<p>
|
||||
Gun is a persisted distributed cache, part of a NoDB movement.
|
||||
It requires zero maintenance and runs on your own infrastructure.
|
||||
Think of it as <i>"Dropbox for Databases"</i> or a <i>"Self-hosted Firebase"</i>.
|
||||
This is an early preview, so check out the <a href="http://github.com/amark/gun">github</a> and read on.
|
||||
</p>
|
||||
<p>
|
||||
Everything gets cached, so your users experience lightning fast response times.
|
||||
Since gun can be embedded anywhere javascript can run,
|
||||
that cache can optionally be right inside your user's browser using localstorage fallbacks.
|
||||
Updates are then pushed up to the servers when the network is available.
|
||||
</p>
|
||||
<p>
|
||||
All conflict resolution happens locally in each peer using a deterministic algorithm.
|
||||
Such that eventual consistency is guaranteed across all writes within the mesh,
|
||||
with fault tolerant retries built in at each step. Data integrity is now a breeze.
|
||||
</p>
|
||||
<p>
|
||||
Gun also establishes and repairs server to server communication across geographically separated machines,
|
||||
with just the help of an initial IP from you.
|
||||
It bridges the distance with a realtime connection,
|
||||
so updates propagate at the speed of the raw pipes linking them.
|
||||
However each server is intelligent enough to only subscribe to the necessary subsection of your data set that is in its working memory,
|
||||
keeping things nimble for its connected users.
|
||||
</p>
|
||||
<p>
|
||||
Data is then persisted to any S3 like service,
|
||||
allowing you to save a truly webscale amount of "big data" without breaking your wallet.
|
||||
Consistency across concurrency is achieved at this layer
|
||||
by each parallel snapshot going through an idempotent transformation that is agreed upon.
|
||||
The granularity and frequency of these snapshots can be tweaked by you,
|
||||
easily tailor fitting it to your data needs and budget concerns.
|
||||
</p>
|
||||
<p>
|
||||
<b>In summary,</b> this marks an important progression in web technologies.
|
||||
Memory is getting cheap enough that we can now front load each connected user's active data
|
||||
right into the application layer and manipulate it directly.
|
||||
Networks are fast enough that if we get too many connected users we can just horizontally
|
||||
redistribute them across different machines.
|
||||
Conflict resolution algorithms are sophisticated enough to handle things immediately
|
||||
in the majority of data cases, with the remaining few as transactions performed ontop.
|
||||
<h3>The blog that started it all...</h3>
|
||||
<p>
|
||||
This is will be a win for both developers and users,
|
||||
because it makes things easier to build and faster to respond.
|
||||
We are excited about this and working hard to finish the first release.
|
||||
Gun is a persisted distributed cache, part of a NoDB movement.
|
||||
It requires zero maintenance and runs on your own infrastructure.
|
||||
Think of it as <i>"Dropbox for Databases"</i> or a <i>"Self-hosted Firebase"</i>.
|
||||
This is an early preview, so check out the <a href="http://github.com/amark/gun">github</a> and read on.
|
||||
</p>
|
||||
<p>
|
||||
If you would like to learn more, email <a href="mailto:hi@gunDB.io">hi@gunDB.io</a> -
|
||||
or join the <a href="http://groups.google.com/forum/#!forum/g-u-n" target="_blank">Google Group</a>.
|
||||
Plus we're hiring, so contact us!
|
||||
</p>
|
||||
<h2>FAQ</h2>
|
||||
<h4>Why did you build this thing?</h4>
|
||||
<p>
|
||||
1. I love databases, especially new ones that keep the working set in memory.
|
||||
But I was horrified to realize that if I use a Database as a Service (DaaS)
|
||||
then I would have to rely on a network call to get that data, which is horribly slow.
|
||||
I wanted something faster, and if possible, cheaper - because they start charging you
|
||||
outrageous prices if you get past their incredibly tiny free tier.
|
||||
Everything gets cached, so your users experience lightning fast response times.
|
||||
Since gun can be embedded anywhere javascript can run,
|
||||
that cache can optionally be right inside your user's browser using localstorage fallbacks.
|
||||
Updates are then pushed up to the servers when the network is available.
|
||||
</p>
|
||||
<p>
|
||||
2. Hosting your own database is a pain because you have to maintain the hard drives.
|
||||
Even the basic setup and configuration is nasty...
|
||||
having to create a bunch of EBS volumes, attaching them, then mounting, formatting,
|
||||
MDADM and LVM, striping, mirroring, and keeping fstab from locking on boot.
|
||||
This is ignoring having to figure out how to resize them.
|
||||
Even with SSDs you have problems that they are bound to one instance and
|
||||
you get charged for the total volume size, not the amount used.
|
||||
All conflict resolution happens locally in each peer using a deterministic algorithm.
|
||||
Such that eventual consistency is guaranteed across all writes within the mesh,
|
||||
with fault tolerant retries built in at each step. Data integrity is now a breeze.
|
||||
</p>
|
||||
<p>
|
||||
I wanted something easy, needing no maintenance and be extremely portable
|
||||
- allowing me to spin up an ephemeral server anywhere, on any cloud,
|
||||
and my data "just work" there.
|
||||
</p>
|
||||
<h4>How are you different from every other database that is trying to reinvent the wheel?</h4>
|
||||
<p>
|
||||
1. Because gun is not a database (NoDB), it is a persisted distributed cache.
|
||||
The fatal flaw with databases is that they assume some centralized authority.
|
||||
While this may be the case initially when you are small,
|
||||
it always ceases to be true when you become large enough that concurrency is unavoidable.
|
||||
No amount of leader election and consensus algorithms can patch this
|
||||
without facing an unjustified amount of complexity.
|
||||
Gun resolves all this by biting the bullet -
|
||||
it solves the hard problems first, not last.
|
||||
It gets data synchronization and conflict resolution right from the beginning,
|
||||
so it never has to rely on vulnerable leader election or consensus locking.
|
||||
Gun also establishes and repairs server to server communication across geographically separated machines,
|
||||
with just the help of an initial IP from you.
|
||||
It bridges the distance with a realtime connection,
|
||||
so updates propagate at the speed of the raw pipes linking them.
|
||||
However each server is intelligent enough to only subscribe to the necessary subsection of your data set that is in its working memory,
|
||||
keeping things nimble for its connected users.
|
||||
</p>
|
||||
<p>
|
||||
2. Plus it embeds directly into your application,
|
||||
so you can do your own custom queries with just pure programming logic.
|
||||
Meaning you never have to learn some silly separate query language again.
|
||||
A query language which just attempts to be some DSL to RPC another machine
|
||||
into doing the same query you could have already written in half the time
|
||||
it took to learn the query language. Because face it, any sufficiently capable
|
||||
query language has to be Turing complete, and at that point -
|
||||
why aren't you just writing your entire application logic in it?
|
||||
Your app is nothing without your data.
|
||||
Data is then persisted to any S3 like service,
|
||||
allowing you to save a truly webscale amount of "big data" without breaking your wallet.
|
||||
Consistency across concurrency is achieved at this layer
|
||||
by each parallel snapshot going through an idempotent transformation that is agreed upon.
|
||||
The granularity and frequency of these snapshots can be tweaked by you,
|
||||
easily tailor fitting it to your data needs and budget concerns.
|
||||
</p>
|
||||
</div>
|
||||
<p>
|
||||
<b>In summary,</b> this marks an important progression in web technologies.
|
||||
Memory is getting cheap enough that we can now front load each connected user's active data
|
||||
right into the application layer and manipulate it directly.
|
||||
Networks are fast enough that if we get too many connected users we can just horizontally
|
||||
redistribute them across different machines.
|
||||
Conflict resolution algorithms are sophisticated enough to handle things immediately
|
||||
in the majority of data cases, with the remaining few as transactions performed ontop.
|
||||
<p>
|
||||
This is will be a win for both developers and users,
|
||||
because it makes things easier to build and faster to respond.
|
||||
We are excited about this and working hard to finish the first release.
|
||||
</p>
|
||||
<p>
|
||||
If you would like to learn more, email <a href="mailto:hi@gunDB.io">hi@gunDB.io</a> -
|
||||
or join the <a href="http://groups.google.com/forum/#!forum/g-u-n" target="_blank">Google Group</a>.
|
||||
Plus we're hiring, so contact us!
|
||||
</p>
|
||||
<h2>FAQ</h2>
|
||||
<h4>Why did you build this thing?</h4>
|
||||
<p>
|
||||
1. I love databases, especially new ones that keep the working set in memory.
|
||||
But I was horrified to realize that if I use a Database as a Service (DaaS)
|
||||
then I would have to rely on a network call to get that data, which is horribly slow.
|
||||
I wanted something faster, and if possible, cheaper - because they start charging you
|
||||
outrageous prices if you get past their incredibly tiny free tier.
|
||||
</p>
|
||||
<p>
|
||||
2. Hosting your own database is a pain because you have to maintain the hard drives.
|
||||
Even the basic setup and configuration is nasty...
|
||||
having to create a bunch of EBS volumes, attaching them, then mounting, formatting,
|
||||
MDADM and LVM, striping, mirroring, and keeping fstab from locking on boot.
|
||||
This is ignoring having to figure out how to resize them.
|
||||
Even with SSDs you have problems that they are bound to one instance and
|
||||
you get charged for the total volume size, not the amount used.
|
||||
</p>
|
||||
<p>
|
||||
I wanted something easy, needing no maintenance and be extremely portable
|
||||
- allowing me to spin up an ephemeral server anywhere, on any cloud,
|
||||
and my data "just work" there.
|
||||
</p>
|
||||
<h4>How are you different from every other database that is trying to reinvent the wheel?</h4>
|
||||
<p>
|
||||
1. Because gun is not a database (NoDB), it is a persisted distributed cache.
|
||||
The fatal flaw with databases is that they assume some centralized authority.
|
||||
While this may be the case initially when you are small,
|
||||
it always ceases to be true when you become large enough that concurrency is unavoidable.
|
||||
No amount of leader election and consensus algorithms can patch this
|
||||
without facing an unjustified amount of complexity.
|
||||
Gun resolves all this by biting the bullet -
|
||||
it solves the hard problems first, not last.
|
||||
It gets data synchronization and conflict resolution right from the beginning,
|
||||
so it never has to rely on vulnerable leader election or consensus locking.
|
||||
</p>
|
||||
<p>
|
||||
2. Plus it embeds directly into your application,
|
||||
so you can do your own custom queries with just pure programming logic.
|
||||
Meaning you never have to learn some silly separate query language again.
|
||||
A query language which just attempts to be some DSL to RPC another machine
|
||||
into doing the same query you could have already written in half the time
|
||||
it took to learn the query language. Because face it, any sufficiently capable
|
||||
query language has to be Turing complete, and at that point -
|
||||
why aren't you just writing your entire application logic in it?
|
||||
Your app is nothing without your data.
|
||||
</p>
|
||||
</div>
|
||||
|
||||
|
||||
<!-- END OLD BLOG POST -->
|
||||
<!-- END OLD BLOG POST -->
|
||||
|
||||
</body>
|
||||
</body>
|
||||
</html>
|
||||
|
@ -1,4 +1,5 @@
|
||||
// This was written by the wonderful Forrest Tait
|
||||
// modified by Mark to be part of core for convenience
|
||||
// twas not designed for production use
|
||||
// only simple local development.
|
||||
|
||||
@ -9,7 +10,7 @@ Gun.on('opt').event(function(gun, opts){
|
||||
|
||||
var fs = file.fs = file.fs || require('fs');
|
||||
var raw = file.raw = file.raw || fs.existsSync(opts.file || data.txt)?
|
||||
fs.readFileSync(opts.file || 'data.txt').toString()
|
||||
fs.readFileSync(opts.file || 'data.json').toString()
|
||||
: null;
|
||||
var all = file.all = file.all || Gun.obj.ify(raw || {nodes: {}, keys: {}});
|
||||
|
||||
@ -29,11 +30,11 @@ Gun.on('opt').event(function(gun, opts){
|
||||
}
|
||||
}
|
||||
}
|
||||
fs.writeFile(opts.file || 'data.txt', Gun.text.ify(all), cb);
|
||||
fs.writeFile(opts.file || 'data.json', Gun.text.ify(all), cb);
|
||||
}
|
||||
,key: function(key, soul, cb){
|
||||
all.keys[key] = soul;
|
||||
fs.writeFile(opts.file || 'data.txt', Gun.text.ify(all), cb);
|
||||
fs.writeFile(opts.file || 'data.json', Gun.text.ify(all), cb);
|
||||
}
|
||||
}}, true);
|
||||
|
||||
|
@ -1,6 +1,7 @@
|
||||
describe('Gun', function(){
|
||||
var Gun = require('../gun')
|
||||
, t = {};
|
||||
require(__dirname + '/../lib/file');
|
||||
describe('Utility', function(){
|
||||
describe('Type Check', function(){
|
||||
it('binary', function(){
|
||||
@ -43,7 +44,7 @@ describe('Gun', function(){
|
||||
expect(Gun.text.is({})).to.be(false);
|
||||
expect(Gun.text.is({a:1})).to.be(false);
|
||||
expect(Gun.text.is(function(){})).to.be(false);
|
||||
});
|
||||
});
|
||||
it('list',function(){
|
||||
expect(Gun.list.is([])).to.be(true);
|
||||
expect(Gun.list.is([1])).to.be(true);
|
||||
@ -140,7 +141,7 @@ describe('Gun', function(){
|
||||
it('ify',function(){
|
||||
expect(Gun.obj.ify('[0,1]')).to.eql([0,1]);
|
||||
expect(Gun.obj.ify('{"a":false,"b":1,"c":"d","e":[0,1],"f":{"g":"h"}}')).to.eql({"a":false,"b":1,"c":"d","e":[0,1],"f":{"g":"h"}});
|
||||
});
|
||||
});
|
||||
it('map',function(){
|
||||
expect(Gun.obj.map({a:'z',b:'y',c:'x'},function(v,i,t){ t(v,i) })).to.eql({x:'c',y:'b',z:'a'});
|
||||
expect(Gun.obj.map({a:'z',b:false,c:'x'},function(v,i,t){ if(!v){ return } t(i,v) })).to.eql({a:'z',c:'x'});
|
||||
@ -163,7 +164,7 @@ describe('Gun', function(){
|
||||
}));
|
||||
});
|
||||
});
|
||||
|
||||
|
||||
describe('Gun Safety', function(){
|
||||
var gun = Gun();
|
||||
it('is',function(){
|
||||
@ -256,14 +257,14 @@ describe('Gun', function(){
|
||||
});
|
||||
});
|
||||
});
|
||||
|
||||
|
||||
it('ify', function(){
|
||||
var data, test;
|
||||
|
||||
|
||||
data = {a: false, b: true, c: 0, d: 1, e: '', f: 'g', h: null};
|
||||
test = Gun.ify(data);
|
||||
expect(test.err).to.not.be.ok();
|
||||
|
||||
|
||||
data = {};
|
||||
data.a = {x: 1, y: 2, z: 3}
|
||||
data.b = {m: 'n', o: 'p', q: 'r', s: 't'};
|
||||
@ -272,54 +273,54 @@ describe('Gun', function(){
|
||||
data.loop = [data.b, data.a.kid, data];
|
||||
test = Gun.ify(data);
|
||||
expect(test.err).to.not.be.ok();
|
||||
|
||||
|
||||
data = {_: {'#': 'shhh', meta: {yay: 1}}, sneak: true};
|
||||
test = Gun.ify(data);
|
||||
expect(test.err).to.not.be.ok(); // metadata needs to be stored, but it can't be used for data.
|
||||
|
||||
|
||||
data = {};
|
||||
data.sneak = false;
|
||||
data.both = {inside: 'meta data'};
|
||||
data._ = {'#': 'shhh', data: {yay: 1}, spin: data.both};
|
||||
test = Gun.ify(data);
|
||||
expect(test.err.meta).to.be.ok(); // TODO: Fail: this passes, somehow? Fix ify code!
|
||||
|
||||
|
||||
data = {one: {two: [9, 8, 7, 6, 5]}};
|
||||
test = Gun.ify(data);
|
||||
expect(test.err.array).to.be.ok();
|
||||
|
||||
|
||||
data = {z: undefined, x: 'bye'};
|
||||
test = Gun.ify(data);
|
||||
expect(test.err.invalid).to.be.ok();
|
||||
|
||||
|
||||
data = {a: NaN, b: 2};
|
||||
test = Gun.ify(data);
|
||||
expect(test.err.invalid).to.be.ok();
|
||||
|
||||
|
||||
data = {a: 1, b: Infinity};
|
||||
test = Gun.ify(data);
|
||||
expect(test.err.invalid).to.be.ok();
|
||||
|
||||
|
||||
data = {c: function(){}, d: 'hi'};
|
||||
test = Gun.ify(data);
|
||||
expect(test.err.invalid).to.be.ok();
|
||||
|
||||
|
||||
console.log(test.nodes);
|
||||
});
|
||||
|
||||
|
||||
it('union', function(){
|
||||
var graph, prime;
|
||||
|
||||
|
||||
graph = Gun.ify({a: false, b: true, c: 0, d: 1, e: '', f: 'g', h: null}).nodes;
|
||||
prime = Gun.ify({h: 9, i: 'foo', j: 'k', l: 'bar', m: 'Mark', n: 'Nadal'}).nodes;
|
||||
|
||||
Gun.union(graph, prime);
|
||||
|
||||
Gun.union(graph, prime); // TODO: BUG! Where is the expect???
|
||||
});
|
||||
|
||||
|
||||
it('path', function(done){
|
||||
console.log("fix path!");
|
||||
return done(); // TODO: FIX! This is broken because of API changes, fix it!
|
||||
|
||||
|
||||
this.timeout(9000);
|
||||
var gun = require('gun')({
|
||||
s3: require('./shotgun') // replace this with your own keys!
|
||||
@ -332,5 +333,16 @@ describe('Gun', function(){
|
||||
});
|
||||
console.log("________________________");
|
||||
});
|
||||
|
||||
});
|
||||
|
||||
it('set key get', function(done){
|
||||
var gun = require('gun/gun')();
|
||||
|
||||
gun.set({hello: "world"}).key('hello/world').get(function(val){
|
||||
console.log("?", val);
|
||||
expect(val.hello).to.be('world');
|
||||
done();
|
||||
}).blank(function(){ console.log("nothing"); })
|
||||
.err(function(){ console.log("err"); })
|
||||
});
|
||||
|
||||
});
|
||||
|
@ -1,5 +1,9 @@
|
||||
NOTES FROM FORREST:
|
||||
|
||||
-3. `gun.path('players').path(id).set({x:0, y:0});` doesn't trigger `gun.path('players').on()`
|
||||
-2. gun.on() needs to be chainable with map and stuff.
|
||||
-1. Maybe make the map module core to gun?
|
||||
|
||||
1 make raw HTTP work and document it, document that attach needs to be BEFORE listen. (talk to AJ)
|
||||
2 make sure you SUPPRESS your comments, Mark.
|
||||
3 .get doesn't work on subsequent closures. WHYYY??
|
||||
|
Loading…
x
Reference in New Issue
Block a user