Skip to content
Projects
Groups
Snippets
Help
Loading...
Help
Support
Keyboard shortcuts
?
Submit feedback
Contribute to GitLab
Sign in / Register
Toggle navigation
jio
Project overview
Project overview
Details
Activity
Releases
Repository
Repository
Files
Commits
Branches
Tags
Contributors
Graph
Compare
Issues
0
Issues
0
List
Boards
Labels
Milestones
Merge Requests
0
Merge Requests
0
Analytics
Analytics
Repository
Value Stream
Wiki
Wiki
Snippets
Snippets
Members
Members
Collapse sidebar
Close sidebar
Activity
Graph
Create a new issue
Commits
Issue Boards
Open sidebar
Yaxel Perez
jio
Commits
e862dbff
Commit
e862dbff
authored
Dec 26, 2012
by
Tristan Cavelier
Browse files
Options
Browse Files
Download
Plain Diff
Merge branch 'attachments' into revision_storage
parents
3635597f
4a43816a
Changes
25
Hide whitespace changes
Inline
Side-by-side
Showing
25 changed files
with
877 additions
and
1173 deletions
+877
-1173
examples/complex_example.html
examples/complex_example.html
+8
-17
examples/example.html
examples/example.html
+35
-13
grunt/30_gruntJIO/grunt.js
grunt/30_gruntJIO/grunt.js
+1
-0
lib/md5/md5.js
lib/md5/md5.js
+379
-0
src/jio.storage/intro.js
src/jio.storage/intro.js
+1
-376
src/jio.storage/localstorage.js
src/jio.storage/localstorage.js
+209
-264
src/jio.storage/outro.js
src/jio.storage/outro.js
+1
-1
src/jio/activityUpdater.js
src/jio/activityUpdater.js
+1
-2
src/jio/commands/_allDocsCommand.js
src/jio/commands/_allDocsCommand.js
+0
-24
src/jio/commands/_getCommand.js
src/jio/commands/_getCommand.js
+0
-32
src/jio/commands/_postCommand.js
src/jio/commands/_postCommand.js
+0
-18
src/jio/commands/_putAttachmentCommand.js
src/jio/commands/_putAttachmentCommand.js
+0
-27
src/jio/commands/_putCommand.js
src/jio/commands/_putCommand.js
+0
-26
src/jio/commands/_removeCommand.js
src/jio/commands/_removeCommand.js
+0
-16
src/jio/commands/command.js
src/jio/commands/command.js
+62
-25
src/jio/commands/getCommand.js
src/jio/commands/getCommand.js
+18
-4
src/jio/commands/postCommand.js
src/jio/commands/postCommand.js
+15
-0
src/jio/commands/putAttachmentCommand.js
src/jio/commands/putAttachmentCommand.js
+16
-4
src/jio/commands/putCommand.js
src/jio/commands/putCommand.js
+23
-6
src/jio/commands/removeCommand.js
src/jio/commands/removeCommand.js
+26
-0
src/jio/intro.js
src/jio/intro.js
+36
-1
src/jio/jio.outro.js
src/jio/jio.outro.js
+25
-15
src/jio/jobs/jobManager.js
src/jio/jobs/jobManager.js
+10
-10
src/jio/outro.js
src/jio/outro.js
+4
-2
src/jio/storages/storage.js
src/jio/storages/storage.js
+7
-290
No files found.
examples/complex_example.html
View file @
e862dbff
...
...
@@ -138,6 +138,7 @@ var clearlog = function () {
<div
id=
"log"
>
</div>
<script
type=
"text/javascript"
src=
"../localorcookiestorage.js"
></script>
<script
type=
"text/javascript"
src=
"../lib/md5/md5.js"
></script>
<script
type=
"text/javascript"
src=
"../jio.js"
></script>
<script
type=
"text/javascript"
src=
"../lib/jquery/jquery.min.js"
></script>
<script
type=
"text/javascript"
src=
"../lib/base64/base64.js"
></script>
...
...
@@ -217,7 +218,7 @@ var callback = function (err,val,begin_date) {
log
(
'
return :
'
+
JSON
.
stringify
(
val
));
};
var
command
=
function
(
method
)
{
var
begin_date
=
Date
.
now
(),
doc
=
{},
opts
=
{}
,
other
=
{}
;
var
begin_date
=
Date
.
now
(),
doc
=
{},
opts
=
{};
log
(
method
);
if
(
!
my_jio
)
{
return
error
(
'
no jio set
'
);
...
...
@@ -230,14 +231,11 @@ var command = function (method) {
switch
(
method
)
{
case
'
putAttachment
'
:
other
.
docid
=
$
(
'
#document_id
'
).
attr
(
'
value
'
);
other
.
revision
=
$
(
'
#prev_rev
'
).
attr
(
'
value
'
);
other
.
content
=
$
(
'
#content
'
).
attr
(
'
value
'
);
other
.
mimetype
=
$
(
'
#mimetype
'
).
attr
(
'
value
'
);
log
(
'
docid:
'
+
other
.
docid
);
log
(
'
revision:
'
+
other
.
revision
);
log
(
'
content:
'
+
other
.
content
);
log
(
'
mimetype:
'
+
other
.
mimetype
);
doc
.
id
=
$
(
'
#document_id
'
).
attr
(
'
value
'
);
doc
.
rev
=
$
(
'
#prev_rev
'
).
attr
(
'
value
'
);
doc
.
data
=
$
(
'
#content
'
).
attr
(
'
value
'
);
doc
.
mimetype
=
$
(
'
#mimetype
'
).
attr
(
'
value
'
);
log
(
'
attachment:
'
+
JSON
.
stringify
(
doc
));
break
;
case
'
post
'
:
case
'
put
'
:
...
...
@@ -260,6 +258,7 @@ var command = function (method) {
log
(
'
opts:
'
+
JSON
.
stringify
(
opts
));
switch
(
method
)
{
case
"
putAttachment
"
:
case
'
remove
'
:
case
'
post
'
:
case
'
put
'
:
...
...
@@ -273,14 +272,6 @@ var command = function (method) {
callback
(
err
,
val
,
begin_date
);
});
break
;
case
'
putAttachment
'
:
my_jio
[
method
](
other
.
docid
,
other
.
revision
,
other
.
content
,
other
.
mimetype
,
opts
,
function
(
err
,
val
)
{
callback
(
err
,
val
,
begin_date
);
}
);
break
;
}
};
var
post
=
function
()
{
...
...
examples/example.html
View file @
e862dbff
...
...
@@ -17,6 +17,7 @@ var log = function (o) {
<div
id=
"log"
>
</div>
<script
type=
"text/javascript"
src=
"../localorcookiestorage.js"
></script>
<script
type=
"text/javascript"
src=
"../lib/md5/md5.js"
></script>
<script
type=
"text/javascript"
src=
"../jio.js"
></script>
<script
type=
"text/javascript"
src=
"../lib/jquery/jquery.min.js"
></script>
<script
type=
"text/javascript"
src=
"../lib/base64/base64.js"
></script>
...
...
@@ -28,29 +29,50 @@ var log = function (o) {
var
my_jio
=
null
;
log
(
'
Welcome to the jIO example.html!
'
)
log
(
'
-
-
> Create jIO instance
'
);
log
(
'
-> Create jIO instance
'
);
my_jio
=
jIO
.
newJio
({
type
:
'
local
'
,
username
:
'
jIOtest
'
,
applicationname
:
'
example
'
});
log
(
'
--> put "hello" document to localStorage
'
);
// careful ! asynchronous method
my_jio
.
put
({
_id
:
'
hello
'
,
content
:
'
world
'
},
function
(
val
)
{
log
(
'
done
'
);
// careful ! asynchronous methods
log
(
'
-> post "video" document metadata to localStorage
'
);
my_jio
.
post
({
_id
:
'
video
'
,
title
:
'
My Video Title
'
,
codec
:
'
vorbis
'
,
language
:
'
en
'
,
description
:
'
Image compilation
'
},
function
(
val
)
{
log
(
'
-> put "thumbnail" attachment to localStorage
'
);
my_jio
.
putAttachment
({
id
:
"
video/thumb.jpg
"
,
data
:
"
BASE64DATA
"
,
mimetype
:
'
image/jpeg
'
},
function
(
val
)
{
log
(
'
-> put "video" attachment to localStorage
'
);
my_jio
.
putAttachment
({
id
:
"
video/myvideo.ogg
"
,
data
:
"
BASE64DATATOO
"
,
mimetype
:
'
video/ogg
'
},
function
(
val
)
{
log
(
'
Done! Refresh the page to see get and remove command.
'
);
},
function
(
err
)
{
log
(
'
Error!
'
+
err
.
reason
);
});
},
function
(
err
)
{
log
(
'
Error!
'
+
err
.
reason
);
});
},
function
(
err
)
{
log
(
'
error!
'
);
});
log
(
'
Error!
'
+
err
.
reason
);
log
(
'
-> get "video" document metadata from localStorage
'
);
my_jio
.
get
(
'
video
'
,
function
(
val
)
{
log
(
'
Title is: "
'
+
val
[
"
title
"
]
+
'
"
'
);
setTimeout
(
function
()
{
log
(
'
--> get "hello" document from localStorage
'
);
log
(
'
-> remove "video" document from localStorage
'
);
my_jio
.
remove
({
_id
:
'
video
'
},
function
(
val
)
{
log
(
'
Done! Refresh the page to see post and putAttachment command.
'
);
},
function
(
err
)
{
log
(
'
Error!
'
+
err
.
reason
);
});
my_jio
.
get
(
'
hello
'
,
function
(
val
)
{
log
(
'
done, content:
'
+
val
.
content
);
},
function
(
err
)
{
log
(
'
error!
'
);
log
(
'
Error!
'
+
err
.
reason
);
});
},
500
);
});
//-->
</script>
</body>
...
...
grunt/30_gruntJIO/grunt.js
View file @
e862dbff
...
...
@@ -88,6 +88,7 @@ module.exports = function(grunt) {
},
globals
:
{
LocalOrCookieStorage
:
true
,
hex_md5
:
true
,
console
:
true
,
unescape
:
true
,
// Needed to avoid "not defined error" with requireJs
...
...
lib/md5/md5.js
0 → 100644
View file @
e862dbff
/*
* A JavaScript implementation of the RSA Data Security, Inc. MD5 Message
* Digest Algorithm, as defined in RFC 1321.
* Version 2.2 Copyright (C) Paul Johnston 1999 - 2009
* Other contributors: Greg Holt, Andrew Kepert, Ydnar, Lostinet
* Distributed under the BSD License
* See http://pajhome.org.uk/crypt/md5 for more info.
*/
/*
* Configurable variables. You may need to tweak these to be compatible with
* the server-side, but the defaults work in most cases.
*/
var
hexcase
=
0
;
/* hex output format. 0 - lowercase; 1 - uppercase */
var
b64pad
=
""
;
/* base-64 pad character. "=" for strict RFC compliance */
/*
* These are the functions you'll usually want to call
* They take string arguments and return either hex or base-64 encoded strings
*/
function
hex_md5
(
s
)
{
return
rstr2hex
(
rstr_md5
(
str2rstr_utf8
(
s
)));
}
function
b64_md5
(
s
)
{
return
rstr2b64
(
rstr_md5
(
str2rstr_utf8
(
s
)));
}
function
any_md5
(
s
,
e
)
{
return
rstr2any
(
rstr_md5
(
str2rstr_utf8
(
s
)),
e
);
}
function
hex_hmac_md5
(
k
,
d
)
{
return
rstr2hex
(
rstr_hmac_md5
(
str2rstr_utf8
(
k
),
str2rstr_utf8
(
d
)));
}
function
b64_hmac_md5
(
k
,
d
)
{
return
rstr2b64
(
rstr_hmac_md5
(
str2rstr_utf8
(
k
),
str2rstr_utf8
(
d
)));
}
function
any_hmac_md5
(
k
,
d
,
e
)
{
return
rstr2any
(
rstr_hmac_md5
(
str2rstr_utf8
(
k
),
str2rstr_utf8
(
d
)),
e
);
}
/*
* Perform a simple self-test to see if the VM is working
*/
function
md5_vm_test
()
{
return
hex_md5
(
"
abc
"
).
toLowerCase
()
==
"
900150983cd24fb0d6963f7d28e17f72
"
;
}
/*
* Calculate the MD5 of a raw string
*/
function
rstr_md5
(
s
)
{
return
binl2rstr
(
binl_md5
(
rstr2binl
(
s
),
s
.
length
*
8
));
}
/*
* Calculate the HMAC-MD5, of a key and some data (raw strings)
*/
function
rstr_hmac_md5
(
key
,
data
)
{
var
bkey
=
rstr2binl
(
key
);
if
(
bkey
.
length
>
16
)
bkey
=
binl_md5
(
bkey
,
key
.
length
*
8
);
var
ipad
=
Array
(
16
),
opad
=
Array
(
16
);
for
(
var
i
=
0
;
i
<
16
;
i
++
)
{
ipad
[
i
]
=
bkey
[
i
]
^
0x36363636
;
opad
[
i
]
=
bkey
[
i
]
^
0x5C5C5C5C
;
}
var
hash
=
binl_md5
(
ipad
.
concat
(
rstr2binl
(
data
)),
512
+
data
.
length
*
8
);
return
binl2rstr
(
binl_md5
(
opad
.
concat
(
hash
),
512
+
128
));
}
/*
* Convert a raw string to a hex string
*/
function
rstr2hex
(
input
)
{
try
{
hexcase
}
catch
(
e
)
{
hexcase
=
0
;
}
var
hex_tab
=
hexcase
?
"
0123456789ABCDEF
"
:
"
0123456789abcdef
"
;
var
output
=
""
;
var
x
;
for
(
var
i
=
0
;
i
<
input
.
length
;
i
++
)
{
x
=
input
.
charCodeAt
(
i
);
output
+=
hex_tab
.
charAt
((
x
>>>
4
)
&
0x0F
)
+
hex_tab
.
charAt
(
x
&
0x0F
);
}
return
output
;
}
/*
* Convert a raw string to a base-64 string
*/
function
rstr2b64
(
input
)
{
try
{
b64pad
}
catch
(
e
)
{
b64pad
=
''
;
}
var
tab
=
"
ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/
"
;
var
output
=
""
;
var
len
=
input
.
length
;
for
(
var
i
=
0
;
i
<
len
;
i
+=
3
)
{
var
triplet
=
(
input
.
charCodeAt
(
i
)
<<
16
)
|
(
i
+
1
<
len
?
input
.
charCodeAt
(
i
+
1
)
<<
8
:
0
)
|
(
i
+
2
<
len
?
input
.
charCodeAt
(
i
+
2
)
:
0
);
for
(
var
j
=
0
;
j
<
4
;
j
++
)
{
if
(
i
*
8
+
j
*
6
>
input
.
length
*
8
)
output
+=
b64pad
;
else
output
+=
tab
.
charAt
((
triplet
>>>
6
*
(
3
-
j
))
&
0x3F
);
}
}
return
output
;
}
/*
* Convert a raw string to an arbitrary string encoding
*/
function
rstr2any
(
input
,
encoding
)
{
var
divisor
=
encoding
.
length
;
var
i
,
j
,
q
,
x
,
quotient
;
/* Convert to an array of 16-bit big-endian values, forming the dividend */
var
dividend
=
Array
(
Math
.
ceil
(
input
.
length
/
2
));
for
(
i
=
0
;
i
<
dividend
.
length
;
i
++
)
{
dividend
[
i
]
=
(
input
.
charCodeAt
(
i
*
2
)
<<
8
)
|
input
.
charCodeAt
(
i
*
2
+
1
);
}
/*
* Repeatedly perform a long division. The binary array forms the dividend,
* the length of the encoding is the divisor. Once computed, the quotient
* forms the dividend for the next step. All remainders are stored for later
* use.
*/
var
full_length
=
Math
.
ceil
(
input
.
length
*
8
/
(
Math
.
log
(
encoding
.
length
)
/
Math
.
log
(
2
)));
var
remainders
=
Array
(
full_length
);
for
(
j
=
0
;
j
<
full_length
;
j
++
)
{
quotient
=
Array
();
x
=
0
;
for
(
i
=
0
;
i
<
dividend
.
length
;
i
++
)
{
x
=
(
x
<<
16
)
+
dividend
[
i
];
q
=
Math
.
floor
(
x
/
divisor
);
x
-=
q
*
divisor
;
if
(
quotient
.
length
>
0
||
q
>
0
)
quotient
[
quotient
.
length
]
=
q
;
}
remainders
[
j
]
=
x
;
dividend
=
quotient
;
}
/* Convert the remainders to the output string */
var
output
=
""
;
for
(
i
=
remainders
.
length
-
1
;
i
>=
0
;
i
--
)
output
+=
encoding
.
charAt
(
remainders
[
i
]);
return
output
;
}
/*
* Encode a string as utf-8.
* For efficiency, this assumes the input is valid utf-16.
*/
function
str2rstr_utf8
(
input
)
{
var
output
=
""
;
var
i
=
-
1
;
var
x
,
y
;
while
(
++
i
<
input
.
length
)
{
/* Decode utf-16 surrogate pairs */
x
=
input
.
charCodeAt
(
i
);
y
=
i
+
1
<
input
.
length
?
input
.
charCodeAt
(
i
+
1
)
:
0
;
if
(
0xD800
<=
x
&&
x
<=
0xDBFF
&&
0xDC00
<=
y
&&
y
<=
0xDFFF
)
{
x
=
0x10000
+
((
x
&
0x03FF
)
<<
10
)
+
(
y
&
0x03FF
);
i
++
;
}
/* Encode output as utf-8 */
if
(
x
<=
0x7F
)
output
+=
String
.
fromCharCode
(
x
);
else
if
(
x
<=
0x7FF
)
output
+=
String
.
fromCharCode
(
0xC0
|
((
x
>>>
6
)
&
0x1F
),
0x80
|
(
x
&
0x3F
));
else
if
(
x
<=
0xFFFF
)
output
+=
String
.
fromCharCode
(
0xE0
|
((
x
>>>
12
)
&
0x0F
),
0x80
|
((
x
>>>
6
)
&
0x3F
),
0x80
|
(
x
&
0x3F
));
else
if
(
x
<=
0x1FFFFF
)
output
+=
String
.
fromCharCode
(
0xF0
|
((
x
>>>
18
)
&
0x07
),
0x80
|
((
x
>>>
12
)
&
0x3F
),
0x80
|
((
x
>>>
6
)
&
0x3F
),
0x80
|
(
x
&
0x3F
));
}
return
output
;
}
/*
* Encode a string as utf-16
*/
function
str2rstr_utf16le
(
input
)
{
var
output
=
""
;
for
(
var
i
=
0
;
i
<
input
.
length
;
i
++
)
output
+=
String
.
fromCharCode
(
input
.
charCodeAt
(
i
)
&
0xFF
,
(
input
.
charCodeAt
(
i
)
>>>
8
)
&
0xFF
);
return
output
;
}
function
str2rstr_utf16be
(
input
)
{
var
output
=
""
;
for
(
var
i
=
0
;
i
<
input
.
length
;
i
++
)
output
+=
String
.
fromCharCode
((
input
.
charCodeAt
(
i
)
>>>
8
)
&
0xFF
,
input
.
charCodeAt
(
i
)
&
0xFF
);
return
output
;
}
/*
* Convert a raw string to an array of little-endian words
* Characters >255 have their high-byte silently ignored.
*/
function
rstr2binl
(
input
)
{
var
output
=
Array
(
input
.
length
>>
2
);
for
(
var
i
=
0
;
i
<
output
.
length
;
i
++
)
output
[
i
]
=
0
;
for
(
var
i
=
0
;
i
<
input
.
length
*
8
;
i
+=
8
)
output
[
i
>>
5
]
|=
(
input
.
charCodeAt
(
i
/
8
)
&
0xFF
)
<<
(
i
%
32
);
return
output
;
}
/*
* Convert an array of little-endian words to a string
*/
function
binl2rstr
(
input
)
{
var
output
=
""
;
for
(
var
i
=
0
;
i
<
input
.
length
*
32
;
i
+=
8
)
output
+=
String
.
fromCharCode
((
input
[
i
>>
5
]
>>>
(
i
%
32
))
&
0xFF
);
return
output
;
}
/*
* Calculate the MD5 of an array of little-endian words, and a bit length.
*/
function
binl_md5
(
x
,
len
)
{
/* append padding */
x
[
len
>>
5
]
|=
0x80
<<
((
len
)
%
32
);
x
[(((
len
+
64
)
>>>
9
)
<<
4
)
+
14
]
=
len
;
var
a
=
1732584193
;
var
b
=
-
271733879
;
var
c
=
-
1732584194
;
var
d
=
271733878
;
for
(
var
i
=
0
;
i
<
x
.
length
;
i
+=
16
)
{
var
olda
=
a
;
var
oldb
=
b
;
var
oldc
=
c
;
var
oldd
=
d
;
a
=
md5_ff
(
a
,
b
,
c
,
d
,
x
[
i
+
0
],
7
,
-
680876936
);
d
=
md5_ff
(
d
,
a
,
b
,
c
,
x
[
i
+
1
],
12
,
-
389564586
);
c
=
md5_ff
(
c
,
d
,
a
,
b
,
x
[
i
+
2
],
17
,
606105819
);
b
=
md5_ff
(
b
,
c
,
d
,
a
,
x
[
i
+
3
],
22
,
-
1044525330
);
a
=
md5_ff
(
a
,
b
,
c
,
d
,
x
[
i
+
4
],
7
,
-
176418897
);
d
=
md5_ff
(
d
,
a
,
b
,
c
,
x
[
i
+
5
],
12
,
1200080426
);
c
=
md5_ff
(
c
,
d
,
a
,
b
,
x
[
i
+
6
],
17
,
-
1473231341
);
b
=
md5_ff
(
b
,
c
,
d
,
a
,
x
[
i
+
7
],
22
,
-
45705983
);
a
=
md5_ff
(
a
,
b
,
c
,
d
,
x
[
i
+
8
],
7
,
1770035416
);
d
=
md5_ff
(
d
,
a
,
b
,
c
,
x
[
i
+
9
],
12
,
-
1958414417
);
c
=
md5_ff
(
c
,
d
,
a
,
b
,
x
[
i
+
10
],
17
,
-
42063
);
b
=
md5_ff
(
b
,
c
,
d
,
a
,
x
[
i
+
11
],
22
,
-
1990404162
);
a
=
md5_ff
(
a
,
b
,
c
,
d
,
x
[
i
+
12
],
7
,
1804603682
);
d
=
md5_ff
(
d
,
a
,
b
,
c
,
x
[
i
+
13
],
12
,
-
40341101
);
c
=
md5_ff
(
c
,
d
,
a
,
b
,
x
[
i
+
14
],
17
,
-
1502002290
);
b
=
md5_ff
(
b
,
c
,
d
,
a
,
x
[
i
+
15
],
22
,
1236535329
);
a
=
md5_gg
(
a
,
b
,
c
,
d
,
x
[
i
+
1
],
5
,
-
165796510
);
d
=
md5_gg
(
d
,
a
,
b
,
c
,
x
[
i
+
6
],
9
,
-
1069501632
);
c
=
md5_gg
(
c
,
d
,
a
,
b
,
x
[
i
+
11
],
14
,
643717713
);
b
=
md5_gg
(
b
,
c
,
d
,
a
,
x
[
i
+
0
],
20
,
-
373897302
);
a
=
md5_gg
(
a
,
b
,
c
,
d
,
x
[
i
+
5
],
5
,
-
701558691
);
d
=
md5_gg
(
d
,
a
,
b
,
c
,
x
[
i
+
10
],
9
,
38016083
);
c
=
md5_gg
(
c
,
d
,
a
,
b
,
x
[
i
+
15
],
14
,
-
660478335
);
b
=
md5_gg
(
b
,
c
,
d
,
a
,
x
[
i
+
4
],
20
,
-
405537848
);
a
=
md5_gg
(
a
,
b
,
c
,
d
,
x
[
i
+
9
],
5
,
568446438
);
d
=
md5_gg
(
d
,
a
,
b
,
c
,
x
[
i
+
14
],
9
,
-
1019803690
);
c
=
md5_gg
(
c
,
d
,
a
,
b
,
x
[
i
+
3
],
14
,
-
187363961
);
b
=
md5_gg
(
b
,
c
,
d
,
a
,
x
[
i
+
8
],
20
,
1163531501
);
a
=
md5_gg
(
a
,
b
,
c
,
d
,
x
[
i
+
13
],
5
,
-
1444681467
);
d
=
md5_gg
(
d
,
a
,
b
,
c
,
x
[
i
+
2
],
9
,
-
51403784
);
c
=
md5_gg
(
c
,
d
,
a
,
b
,
x
[
i
+
7
],
14
,
1735328473
);
b
=
md5_gg
(
b
,
c
,
d
,
a
,
x
[
i
+
12
],
20
,
-
1926607734
);
a
=
md5_hh
(
a
,
b
,
c
,
d
,
x
[
i
+
5
],
4
,
-
378558
);
d
=
md5_hh
(
d
,
a
,
b
,
c
,
x
[
i
+
8
],
11
,
-
2022574463
);
c
=
md5_hh
(
c
,
d
,
a
,
b
,
x
[
i
+
11
],
16
,
1839030562
);
b
=
md5_hh
(
b
,
c
,
d
,
a
,
x
[
i
+
14
],
23
,
-
35309556
);
a
=
md5_hh
(
a
,
b
,
c
,
d
,
x
[
i
+
1
],
4
,
-
1530992060
);
d
=
md5_hh
(
d
,
a
,
b
,
c
,
x
[
i
+
4
],
11
,
1272893353
);
c
=
md5_hh
(
c
,
d
,
a
,
b
,
x
[
i
+
7
],
16
,
-
155497632
);
b
=
md5_hh
(
b
,
c
,
d
,
a
,
x
[
i
+
10
],
23
,
-
1094730640
);
a
=
md5_hh
(
a
,
b
,
c
,
d
,
x
[
i
+
13
],
4
,
681279174
);
d
=
md5_hh
(
d
,
a
,
b
,
c
,
x
[
i
+
0
],
11
,
-
358537222
);
c
=
md5_hh
(
c
,
d
,
a
,
b
,
x
[
i
+
3
],
16
,
-
722521979
);
b
=
md5_hh
(
b
,
c
,
d
,
a
,
x
[
i
+
6
],
23
,
76029189
);
a
=
md5_hh
(
a
,
b
,
c
,
d
,
x
[
i
+
9
],
4
,
-
640364487
);
d
=
md5_hh
(
d
,
a
,
b
,
c
,
x
[
i
+
12
],
11
,
-
421815835
);
c
=
md5_hh
(
c
,
d
,
a
,
b
,
x
[
i
+
15
],
16
,
530742520
);
b
=
md5_hh
(
b
,
c
,
d
,
a
,
x
[
i
+
2
],
23
,
-
995338651
);
a
=
md5_ii
(
a
,
b
,
c
,
d
,
x
[
i
+
0
],
6
,
-
198630844
);
d
=
md5_ii
(
d
,
a
,
b
,
c
,
x
[
i
+
7
],
10
,
1126891415
);
c
=
md5_ii
(
c
,
d
,
a
,
b
,
x
[
i
+
14
],
15
,
-
1416354905
);
b
=
md5_ii
(
b
,
c
,
d
,
a
,
x
[
i
+
5
],
21
,
-
57434055
);
a
=
md5_ii
(
a
,
b
,
c
,
d
,
x
[
i
+
12
],
6
,
1700485571
);
d
=
md5_ii
(
d
,
a
,
b
,
c
,
x
[
i
+
3
],
10
,
-
1894986606
);
c
=
md5_ii
(
c
,
d
,
a
,
b
,
x
[
i
+
10
],
15
,
-
1051523
);
b
=
md5_ii
(
b
,
c
,
d
,
a
,
x
[
i
+
1
],
21
,
-
2054922799
);
a
=
md5_ii
(
a
,
b
,
c
,
d
,
x
[
i
+
8
],
6
,
1873313359
);
d
=
md5_ii
(
d
,
a
,
b
,
c
,
x
[
i
+
15
],
10
,
-
30611744
);
c
=
md5_ii
(
c
,
d
,
a
,
b
,
x
[
i
+
6
],
15
,
-
1560198380
);
b
=
md5_ii
(
b
,
c
,
d
,
a
,
x
[
i
+
13
],
21
,
1309151649
);
a
=
md5_ii
(
a
,
b
,
c
,
d
,
x
[
i
+
4
],
6
,
-
145523070
);
d
=
md5_ii
(
d
,
a
,
b
,
c
,
x
[
i
+
11
],
10
,
-
1120210379
);
c
=
md5_ii
(
c
,
d
,
a
,
b
,
x
[
i
+
2
],
15
,
718787259
);
b
=
md5_ii
(
b
,
c
,
d
,
a
,
x
[
i
+
9
],
21
,
-
343485551
);
a
=
safe_add
(
a
,
olda
);
b
=
safe_add
(
b
,
oldb
);
c
=
safe_add
(
c
,
oldc
);
d
=
safe_add
(
d
,
oldd
);
}
return
Array
(
a
,
b
,
c
,
d
);
}
/*
* These functions implement the four basic operations the algorithm uses.
*/
function
md5_cmn
(
q
,
a
,
b
,
x
,
s
,
t
)
{
return
safe_add
(
bit_rol
(
safe_add
(
safe_add
(
a
,
q
),
safe_add
(
x
,
t
)),
s
),
b
);
}
function
md5_ff
(
a
,
b
,
c
,
d
,
x
,
s
,
t
)
{
return
md5_cmn
((
b
&
c
)
|
((
~
b
)
&
d
),
a
,
b
,
x
,
s
,
t
);
}
function
md5_gg
(
a
,
b
,
c
,
d
,
x
,
s
,
t
)
{
return
md5_cmn
((
b
&
d
)
|
(
c
&
(
~
d
)),
a
,
b
,
x
,
s
,
t
);
}
function
md5_hh
(
a
,
b
,
c
,
d
,
x
,
s
,
t
)
{
return
md5_cmn
(
b
^
c
^
d
,
a
,
b
,
x
,
s
,
t
);
}
function
md5_ii
(
a
,
b
,
c
,
d
,
x
,
s
,
t
)
{
return
md5_cmn
(
c
^
(
b
|
(
~
d
)),
a
,
b
,
x
,
s
,
t
);
}
/*
* Add integers, wrapping at 2^32. This uses 16-bit operations internally
* to work around bugs in some JS interpreters.
*/
function
safe_add
(
x
,
y
)
{
var
lsw
=
(
x
&
0xFFFF
)
+
(
y
&
0xFFFF
);
var
msw
=
(
x
>>
16
)
+
(
y
>>
16
)
+
(
lsw
>>
16
);
return
(
msw
<<
16
)
|
(
lsw
&
0xFFFF
);
}
/*
* Bitwise rotate a 32-bit number to the left.
*/
function
bit_rol
(
num
,
cnt
)
{
return
(
num
<<
cnt
)
|
(
num
>>>
(
32
-
cnt
));
}
src/jio.storage/intro.js
View file @
e862dbff
...
...
@@ -7,381 +7,6 @@
* - CryptedStorage ('crypted')
* - ConflictManagerStorage ('conflictmanager')
*
* @module cross-storage methods
*/
var
utilities
=
{
/**
* Generates a hash code of a string
* @method hashCode
* @param {string} string The string to hash
* @return {string} The string hash code
*/
hashCode
:
function
(
string
)
{
return
hex_sha256
(
string
);
},
/**
* Generates the next revision of [previous_revision]. [string] helps us
* to generate a hash code.
* @methode generateNextRev
* @param {string} previous_revision The previous revision
* @param {string} string String to help generate hash code
* @return {array} 0:The next revision number and 1:the hash code
*/
generateNextRevision
:
function
(
previous_revision
,
string
)
{
return
[
parseInt
(
previous_revision
.
split
(
'
-
'
)[
0
],
10
)
+
1
,
utilities
.
hashCode
(
previous_revision
+
string
)];
},
/**
* Replace substrings to others substring following a [list_of_replacement].
* It will be executed recusively to replace substrings which are not
* replaced substrings.
* It starts from the last element of the list of replacement.
* @method replaceSubString
* @param {string} string The string to replace
* @param {array} list_of_replacement A list containing arrays with 2
* values:
* - {string} The substring to replace
* - {string} The new substring
* ex: [['b', 'abc'], ['abc', 'cba']]
* @return {string} The new string
*/
replaceSubString
:
function
(
string
,
list_of_replacement
)
{
var
i
,
split_string
=
string
.
split
(
list_of_replacement
[
0
][
0
]);
if
(
list_of_replacement
[
1
])
{
for
(
i
=
0
;
i
<
split_string
.
length
;
i
+=
1
)
{
split_string
[
i
]
=
utilities
.
replaceSubString
(
split_string
[
i
],
list_of_replacement
.
slice
(
1
)
);
}
}
return
split_string
.
join
(
list_of_replacement
[
0
][
1
]);
},
/**
* It secures the [string] replacing all '%' by '%%' and '/' by '%2F'.
* @method secureString
* @param {string} string The string to secure
* @return {string} The secured string
*/
secureString
:
function
(
string
)
{
return
utilities
.
replaceSubString
(
string
,
[[
'
/
'
,
'
%2F
'
],[
'
%
'
,
'
%%
'
]]);
},
/**
* It replaces all '%2F' by '/' and '%%' by '%'.
* @method unsecureString
* @param {string} string The string to convert
* @return {string} The converted string
*/
unsecureString
:
function
(
string
)
{
return
utilities
.
replaceSubString
(
string
,
[[
'
%%
'
,
'
%
'
],[
'
%2F
'
,
'
/
'
]]);
},
// ============================ CREATE/UPDATE DOCUMENT =====================
/**
* @method createDocument - Creates a new document
* @info - docid POST = "" for POST, PUT = string
* @param {docid} string - id for the new document
* @stored - 'jio/local/USR/APP/FILE_NAME'
* @returns {doc} object - document object
*/
createDocument
:
function
(
docId
)
{
var
now
=
Date
.
now
(),
doc
=
{},
hash
=
utilities
.
hashCode
(
''
+
doc
+
'
'
+
now
+
''
);
doc
.
_id
=
docId
;
doc
.
_rev
=
'
1-
'
+
hash
;
doc
.
_revisions
=
{
start
:
1
,
ids
:
[
hash
]
};
doc
.
_revs_info
=
[{
rev
:
'
1-
'
+
hash
,
status
:
'
available
'
}];
return
doc
;
},
/**
* @method updateDocument - updates a document
* @info - called from PUT or PUTATTACHMENT
* @info - deletes old document (purge & replace)
* @param {docid} string - id for the new document
* @param {docpath} string - the path where to store the document
* @param {previousRevision} string - the previous revision
* @param {attachmentId} - string - in case attachments are handled
* @returns {doc} object - new document
*/
updateDocument
:
function
(
doc
,
docPath
,
previousRevision
,
attachmentId
)
{
var
now
=
Date
.
now
(),
rev
=
utilities
.
generateNextRevision
(
previousRevision
,
''
+
doc
+
'
'
+
now
+
''
);
// in case the update is made because of an attachment
if
(
attachmentId
!==
undefined
)
{
// create _attachments
if
(
doc
.
_attachments
===
undefined
){
doc
.
_attachments
=
{};
}
// create _attachments object for this attachment
if
(
doc
.
_attachments
[
attachmentId
]
===
undefined
){
doc
.
_attachments
[
attachmentId
]
=
{};
}
// set revpos
doc
.
_attachments
[
attachmentId
].
revpos
=
parseInt
(
doc
.
_rev
.
split
(
'
-
'
)[
0
],
10
);
}
// update document
doc
.
_rev
=
rev
.
join
(
'
-
'
);
doc
.
_revisions
.
ids
.
unshift
(
rev
[
1
]);
doc
.
_revisions
.
start
=
rev
[
0
];
doc
.
_revs_info
[
0
].
status
=
'
deleted
'
;
doc
.
_revs_info
.
unshift
({
"
rev
"
:
rev
.
join
(
'
-
'
),
"
status
"
:
"
available
"
});
return
doc
;
},
/**
* @method updateDocumentTree- update a document tree
* @param {docTreeNode} object - document tree
* @param {old_rev} string - revision of the tree node to set to "branch"
* @param {new_rev } string - revison of the tree node to add as leaf
* @param {revs_info} object- history of new_rev to merge with remote tree
*/
updateDocumentTree
:
function
(
docTreeNode
,
old_rev
,
new_rev
,
revs_info
,
deletedLeaf
)
{
if
(
typeof
revs_info
===
"
object
"
)
{
// a new document version is being stored from another storage
utilities
.
mergeRemoteTree
(
docTreeNode
,
docTreeNode
,
old_rev
,
new_rev
,
revs_info
,
[],
false
,
deletedLeaf
);
}
else
{
// update an existing version of document = add a node to the tree
utilities
.
setTreeNode
(
docTreeNode
,
old_rev
,
new_rev
,
'
available
'
);
}
return
docTreeNode
;
},
// ==================== SET/MERGE/CHECK TREE NODES ==================
/**
* @method setTreeNode - adds a new tree node/changes leaf to branch
* @param {docTreeNode} object - document tree
* @param {old_rev} string - revision of the tree node to set to "branch"
* @param {new_rev } string - revison of the tree node to add as leaf
* @param {new_status}string- status the new node should have
* @info - status is necessary, because we may also
* add deleted nodes to the tree from a
* remote storage
*/
setTreeNode
:
function
(
docTreeNode
,
old_rev
,
new_rev
,
new_status
){
var
kids
=
docTreeNode
[
'
kids
'
],
rev
=
docTreeNode
[
'
rev
'
],
numberOfKids
,
i
,
key
;
for
(
key
in
docTreeNode
){
if
(
key
===
"
rev
"
){
// grow the tree
if
(
old_rev
===
rev
&&
new_rev
!==
rev
)
{
docTreeNode
.
type
=
'
branch
'
;
docTreeNode
.
status
=
'
deleted
'
;
docTreeNode
.
kids
.
push
({
type
:
'
leaf
'
,
status
:
new_status
,
rev
:
new_rev
,
kids
:[]
});
}
else
{
// traverse until correct node is found!
if
(
utilities
.
isObjectEmpty
(
kids
)
===
false
)
{
numberOfKids
=
utilities
.
isObjectSize
(
kids
);
for
(
i
=
0
;
i
<
numberOfKids
;
i
+=
1
){
utilities
.
setTreeNode
(
kids
[
i
],
old_rev
,
new_rev
,
new_status
);
}
}
}
}
}
return
docTreeNode
;
},
/**
* Merges document object trees
* @method mergeDocumentTree
* @param {object} document_tree_list The document tree array
*/
mergeDocumentTree
:
function
(
document_tree_list
)
{
var
arrayConcat
,
each
,
synchronizeFrom
,
tree_list
;
// arrayConcat([1,2], [3,4]) = [1,2,3,4]
arrayConcat
=
function
()
{
var
i
,
newlist
=
[];
for
(
j
=
0
;
j
<
arguments
.
length
;
++
j
)
{
for
(
i
=
0
;
i
<
arguments
[
j
].
length
;
++
i
)
{
newlist
.
push
(
arguments
[
j
][
i
]);
}
}
return
newlist
;
};
// "each" executes "fun" on each values of "array"
// if return false, then stop browsing
each
=
function
(
array
,
fun
,
start
)
{
var
i
;
for
(
i
=
start
||
0
;
i
<
array
.
length
;
i
+=
1
)
{
if
(
fun
(
array
[
i
],
i
)
===
false
)
{
return
false
;
}
}
return
true
;
};
// merges all trees
synchronize
=
function
(
tree_list
)
{
var
new_children
;
new_children
=
[];
each
(
tree_list
,
function
(
tree
,
tree_index
)
{
var
res
;
if
(
new_children
.
length
===
0
)
{
new_children
.
push
(
tree
);
return
;
}
res
=
each
(
new_children
,
function
(
child
,
child_index
)
{
if
(
tree
.
rev
===
child
.
rev
)
{
new_children
[
child_index
].
children
=
synchronize
(
arrayConcat
(
tree
.
children
,
child
.
children
)
)
return
false
;
}
});
if
(
res
===
true
)
{
new_children
.
push
(
tree
);
}
});
return
new_children
;
};
tree_list
=
[];
each
(
document_tree_list
,
function
(
tree
)
{
tree_list
=
arrayConcat
(
tree_list
,
tree
.
children
);
});
return
{
"
children
"
:
synchronize
(
tree_list
)};
},
/**
* Gets the winner revision from a document tree.
* The winner is the deeper revision on the left.
* @method getWinnerRevisionFromDocumentTree
* @param {object} document_tree The document tree
* @return {string} The winner revision
*/
getWinnerRevisionFromDocumentTree
:
function
(
document_tree
)
{
var
i
,
result
,
search
;
result
=
{
"
deep
"
:
-
1
,
"
revision
"
:
''
};
// search method fills "result" with the winner revision
search
=
function
(
document_tree
,
deep
)
{
var
i
;
if
(
document_tree
.
children
.
length
===
0
)
{
// This node is a leaf
if
(
result
.
deep
<
deep
)
{
// The leaf is deeper than result
result
=
{
"
deep
"
:
deep
,
"
revision
"
:
document_tree
.
rev
};
}
return
;
}
// This node has children
for
(
i
=
0
;
i
<
document_tree
.
children
.
length
;
i
+=
1
)
{
// searching deeper to find the deeper leaf
search
(
document_tree
.
children
[
i
],
deep
+
1
);
}
};
search
(
document_tree
,
0
);
return
result
.
rev
;
},
/**
* Gets an array of leaves revisions from document tree
* @method getLeavesFromDocumentTree
* @param {object} document_tree The document tree
* @return {array} The array of leaves revisions
*/
getLeavesFromDocumentTree
:
function
(
document_tree
)
{
var
i
,
result
,
search
;
result
=
[];
// search method fills [result] with the winner revision
search
=
function
(
document_tree
)
{
var
i
;
if
(
document_tree
.
children
.
length
===
0
)
{
// This node is a leaf
result
.
push
(
document_tree
.
rev
);
return
;
}
// This node has children
for
(
i
=
0
;
i
<
document_tree
.
children
.
length
;
i
+=
1
)
{
// searching deeper to find the deeper leaf
search
(
document_tree
.
children
[
i
]);
}
};
search
(
document_tree
);
return
result
;
},
/**
* @method isDeadLeaf - Check if revision is branch or status deleted
* @param {node} string - revision
* @param {tree} object - active leaves (versions of a document)
* @returns - true/false
*/
isDeadLeaf
:
function
(
prev_rev
,
docTreeNode
){
var
type
=
docTreeNode
[
'
type
'
],
status
=
docTreeNode
[
'
status
'
],
kids
=
docTreeNode
[
'
kids
'
],
rev
=
docTreeNode
[
'
rev
'
],
result
=
false
,
numberOfKids
,
i
,
key
;
for
(
key
in
docTreeNode
){
if
(
key
===
"
rev
"
){
// if prev_rev is found, check if deleted or branch
if
(
prev_rev
===
rev
&&
(
type
===
'
branch
'
||
status
===
'
deleted
'
)
){
result
=
true
;
}
if
(
utilities
.
isObjectEmpty
(
kids
)
===
false
){
numberOfKids
=
utilities
.
isObjectSize
(
kids
);
for
(
i
=
0
;
i
<
numberOfKids
;
i
+=
1
){
// recurse
if
(
utilities
.
isDeadLeaf
(
prev_rev
,
kids
[
i
]
)
===
true
){
result
=
true
;
}
}
}
return
result
;
}
}
}
};
/*
* @module JIOStorages
*/
(
function
(
LocalOrCookieStorage
,
$
,
Base64
,
sjcl
,
hex_sha256
,
jIO
)
{
(
function
(
jIO
,
$
,
Base64
,
sjcl
,
hex_sha256
)
{
src/jio.storage/localstorage.js
View file @
e862dbff
...
...
@@ -5,127 +5,34 @@
var
newLocalStorage
=
function
(
spec
,
my
)
{
spec
=
spec
||
{};
var
that
=
my
.
basicStorage
(
spec
,
my
),
priv
=
{},
var
that
,
priv
,
localstorage
;
that
=
my
.
basicStorage
(
spec
,
my
);
priv
=
{};
/*
* Wrapper for the localStorage used to simplify instion of any kind of
* values
*/
localstorage
=
{
getItem
:
function
(
item
)
{
return
JSON
.
parse
(
localStorage
.
getItem
(
item
));
},
setItem
:
function
(
item
,
value
)
{
return
localStorage
.
setItem
(
item
,
JSON
.
stringify
(
value
));
},
deleteItem
:
function
(
item
)
{
delete
localStorage
[
item
];
}
/*
* Wrapper for the localStorage used to simplify instion of any kind of
* values
*/
localstorage
=
{
getItem
:
function
(
item
)
{
return
JSON
.
parse
(
localStorage
.
getItem
(
item
));
},
setItem
:
function
(
item
,
value
)
{
return
localStorage
.
setItem
(
item
,
JSON
.
stringify
(
value
));
},
storage_user_array_name
,
storage_file_array_name
;
deleteItem
:
function
(
item
)
{
delete
localStorage
[
item
];
}
};
// attributes
// attributes
priv
.
username
=
spec
.
username
||
''
;
priv
.
applicationname
=
spec
.
applicationname
||
'
untitled
'
;
storage_user_array_name
=
'
jio/local_user_array
'
;
storage_file_array_name
=
'
jio/local_file_name_array/
'
+
priv
.
localpath
=
'
jio/localstorage/
'
+
priv
.
username
+
'
/
'
+
priv
.
applicationname
;
/**
* Returns a list of users.
* @method getUserArray
* @return {array} The list of users.
*/
priv
.
getUserArray
=
function
()
{
return
localstorage
.
getItem
(
storage_user_array_name
)
||
[];
};
/**
* Adds a user to the user list.
* @method addUser
* @param {string} user_name The user name.
*/
priv
.
addUser
=
function
(
user_name
)
{
var
user_array
=
priv
.
getUserArray
();
user_array
.
push
(
user_name
);
localstorage
.
setItem
(
storage_user_array_name
,
user_array
);
};
/**
* checks if a user exists in the user array.
* @method doesUserExist
* @param {string} user_name The user name
* @return {boolean} true if exist, else false
*/
priv
.
doesUserExist
=
function
(
user_name
)
{
var
user_array
=
priv
.
getUserArray
(),
i
,
l
;
for
(
i
=
0
,
l
=
user_array
.
length
;
i
<
l
;
i
+=
1
)
{
if
(
user_array
[
i
]
===
user_name
)
{
return
true
;
}
}
return
false
;
};
/**
* Returns the file names of all existing files owned by the user.
* @method getFileNameArray
* @return {array} All the existing file paths.
*/
priv
.
getFileNameArray
=
function
()
{
return
localstorage
.
getItem
(
storage_file_array_name
)
||
[];
};
/**
* Adds a file name to the local file name array.
* @method addFileName
* @param {string} file_name The new file name.
*/
priv
.
addFileName
=
function
(
file_name
)
{
var
file_name_array
=
priv
.
getFileNameArray
();
file_name_array
.
push
(
file_name
);
localstorage
.
setItem
(
storage_file_array_name
,
file_name_array
);
};
/**
* Removes a file name from the local file name array.
* @method removeFileName
* @param {string} file_name The file name to remove.
*/
priv
.
removeFileName
=
function
(
file_name
)
{
var
i
,
l
,
array
=
priv
.
getFileNameArray
(),
new_array
=
[];
for
(
i
=
0
,
l
=
array
.
length
;
i
<
l
;
i
+=
1
)
{
if
(
array
[
i
]
!==
file_name
)
{
new_array
.
push
(
array
[
i
]);
}
}
localstorage
.
setItem
(
storage_file_array_name
,
new_array
);
};
/**
* Extends [obj] adding 0 to 3 values according to [command] options.
* @method manageOptions
* @param {object} obj The obj to extend
* @param {object} command The JIO command
* @param {object} doc The document object
*/
priv
.
manageOptions
=
function
(
obj
,
command
,
doc
)
{
obj
=
obj
||
{};
if
(
command
.
getOption
(
'
revs
'
))
{
obj
.
revisions
=
doc
.
_revisions
;
}
if
(
command
.
getOption
(
'
revs_info
'
))
{
obj
.
revs_info
=
doc
.
_revs_info
;
}
if
(
command
.
getOption
(
'
conflicts
'
))
{
obj
.
conflicts
=
{
total_rows
:
0
,
rows
:[]};
}
return
obj
;
};
// ==================== Tools ====================
/**
* Update [doc] the document object and remove [doc] keys
* which are not in [new_doc]. It only changes [doc] keys not starting
...
...
@@ -151,72 +58,17 @@ var newLocalStorage = function (spec, my) {
};
/**
* C
reate a new document
* @method
setDocument
* @param {object}
command Command
object
* @
param {string} trigger Put/Post
* C
hecks if an object has no enumerable keys
* @method
objectIsEmpty
* @param {object}
obj The
object
* @
return {boolean} true if empty, else false
*/
priv
.
setDocument
=
function
(
command
,
trigger
)
{
var
doc
=
command
.
getDoc
(),
document_id
=
doc
.
_id
,
document_rev
=
doc
.
_rev
,
document_path
=
'
jio/local/
'
+
priv
.
username
+
'
/
'
+
priv
.
applicationname
+
'
/
'
+
document_id
+
'
/
'
+
document_rev
;
if
(
trigger
===
'
put
'
){
priv
.
documentObjectUpdate
(
doc
,
command
.
cloneDoc
());
}
localstorage
.
setItem
(
document_path
,
doc
);
if
(
trigger
===
'
post
'
){
if
(
!
priv
.
doesUserExist
(
priv
.
username
))
{
priv
.
addUser
(
priv
.
username
);
}
priv
.
addFileName
(
document_id
);
priv
.
objectIsEmpty
=
function
(
obj
)
{
var
k
;
for
(
k
in
obj
)
{
return
false
;
}
return
priv
.
manageOptions
(
{
ok
:
true
,
id
:
document_id
,
rev
:
document_rev
},
command
,
doc
);
};
/**
* get a document or attachment
* @method getDocument
* @param {object} command Command object
*/
priv
.
getDocument
=
function
(
command
)
{
var
doc
=
command
.
getDoc
();
document_id
=
doc
.
_id
;
document_rev
=
doc
.
_rev
;
document_path
=
'
jio/local/
'
+
priv
.
username
+
'
/
'
+
priv
.
applicationname
+
'
/
'
+
document_id
+
'
/
'
+
document_rev
;
localStorage
.
getItem
(
document_path
);
return
priv
.
manageOptions
(
{
ok
:
true
,
id
:
document_id
,
rev
:
document_rev
},
command
,
doc
);
};
/**
* delete a document or attachment
* @method getDocument
* @param {object} command Command object
*/
priv
.
deleteDocument
=
function
(
command
)
{
var
doc
=
command
.
getDoc
();
document_id
=
doc
.
_id
;
document_rev
=
doc
.
_rev
;
document_path
=
'
jio/local/
'
+
priv
.
username
+
'
/
'
+
priv
.
applicationname
+
'
/
'
+
document_id
+
'
/
'
+
document_rev
;
localStorage
.
deleteItem
(
document_path
);
return
priv
.
manageOptions
(
{
ok
:
true
,
id
:
document_id
,
rev
:
document_rev
},
command
,
doc
);
return
true
;
};
// ===================== overrides ======================
...
...
@@ -228,144 +80,237 @@ var newLocalStorage = function (spec, my) {
};
that
.
validateState
=
function
()
{
if
(
priv
.
username
)
{
if
(
typeof
priv
.
username
===
"
string
"
&&
priv
.
username
!==
''
)
{
return
''
;
}
return
'
Need at least one parameter: "username".
'
;
};
// ==================== commands ====================
/**
* Create a document in local storage.
* @method
_
post
* @method post
* @param {object} command The JIO command
*
* Available options:
* - {boolean} conflicts Add a conflicts object to the response
* - {boolean} revs Add the revisions history of the document
* - {boolean} revs_info Add revisions informations
*
*/
that
.
_
post
=
function
(
command
)
{
that
.
post
=
function
(
command
)
{
setTimeout
(
function
()
{
that
.
success
(
priv
.
setDocument
(
command
,
'
post
'
));
var
doc
=
command
.
getDocId
();
if
(
!
(
typeof
doc
===
"
string
"
&&
doc
!==
""
))
{
that
.
error
({
"
status
"
:
405
,
"
statusText
"
:
"
Method Not Allowed
"
,
"
error
"
:
"
method_not_allowed
"
,
"
message
"
:
"
Cannot create document which id is undefined
"
,
"
reason
"
:
"
Document id is undefined
"
});
return
;
}
doc
=
localstorage
.
getItem
(
priv
.
localpath
+
"
/
"
+
doc
);
if
(
doc
===
null
)
{
// the document does not exists
localstorage
.
setItem
(
priv
.
localpath
+
"
/
"
+
command
.
getDocId
(),
command
.
cloneDoc
());
that
.
success
({
"
ok
"
:
true
,
"
id
"
:
command
.
getDocId
()});
}
else
{
// the document already exists
that
.
error
({
"
status
"
:
409
,
"
statusText
"
:
"
Conflicts
"
,
"
error
"
:
"
conflicts
"
,
"
message
"
:
"
Cannot create a new document
"
,
"
reason
"
:
"
Document already exists
"
});
}
});
};
/**
* Create or update a document in local storage.
* @method
_
put
* @method put
* @param {object} command The JIO command
*
* Available options:
* - {boolean} conflicts Add a conflicts object to the response
* - {boolean} revs Add the revisions history of the document
* - {boolean} revs_info Add revisions informations
*
*/
that
.
_
put
=
function
(
command
)
{
that
.
put
=
function
(
command
)
{
setTimeout
(
function
()
{
var
docid
=
command
.
getDocId
(),
path
=
'
jio/local/
'
+
priv
.
username
+
'
/
'
+
priv
.
applicationname
+
'
/
'
+
docid
,
doc
=
localstorage
.
getItem
(
path
);
if
(
!
doc
)
{
that
.
success
(
priv
.
setDocument
(
command
,
'
post
'
));
var
doc
;
doc
=
localstorage
.
getItem
(
priv
.
localpath
+
"
/
"
+
command
.
getDocId
());
if
(
doc
===
null
)
{
// the document does not exists
doc
=
command
.
cloneDoc
();
}
else
{
that
.
success
(
priv
.
documentUpdate
(
command
,
'
put
'
));
// the document already exists
priv
.
documentObjectUpdate
(
doc
,
command
.
cloneDoc
());
}
// write
localstorage
.
setItem
(
priv
.
localpath
+
"
/
"
+
command
.
getDocId
(),
doc
);
that
.
success
({
"
ok
"
:
true
,
"
id
"
:
command
.
getDocId
()});
});
};
/**
* Add an attachment to a document
* @method
_
putAttachment
* @method putAttachment
* @param {object} command The JIO command
*
* Available options:
* - {boolean} conflicts Add a conflicts object to the response
* - {boolean} revs Add the revisions history of the document
* - {boolean} revs_info Add revisions informations
*/
that
.
_
putAttachment
=
function
(
command
)
{
that
.
putAttachment
=
function
(
command
)
{
setTimeout
(
function
()
{
that
.
success
(
priv
.
setDocument
(
command
,
'
put
'
);
var
doc
;
doc
=
localstorage
.
getItem
(
priv
.
localpath
+
"
/
"
+
command
.
getDocId
());
if
(
doc
===
null
)
{
// the document does not exists
that
.
error
({
"
status
"
:
404
,
"
statusText
"
:
"
Not Found
"
,
"
error
"
:
"
not_found
"
,
"
message
"
:
"
Impossible to add attachment
"
,
"
reason
"
:
"
Document not found
"
});
return
;
}
else
{
// the document already exists
doc
[
"
_attachments
"
]
=
doc
[
"
_attachments
"
]
||
{};
doc
[
"
_attachments
"
][
command
.
getAttachmentId
()]
=
{
"
content_type
"
:
command
.
getAttachmentMimeType
(),
"
digest
"
:
"
md5-
"
+
command
.
md5SumAttachmentData
(),
"
length
"
:
command
.
getAttachmentLength
()
};
}
// upload data
localstorage
.
setItem
(
priv
.
localpath
+
"
/
"
+
command
.
getDocId
()
+
"
/
"
+
command
.
getAttachmentId
(),
command
.
getAttachmentData
()
);
// write document
localstorage
.
setItem
(
priv
.
localpath
+
"
/
"
+
command
.
getDocId
(),
doc
);
that
.
success
({
"
ok
"
:
true
,
"
_id
"
:
command
.
getDocId
()
+
"
/
"
+
command
.
getAttachmentId
()
});
});
};
/**
* Get a document or attachment
* @method
get
* @method get
* @param {object} command The JIO command
*
* Available options:
* - {boolean} conflicts Add a conflicts object to the response
* - {boolean} revs Add the revisions history of the document
* - {boolean} revs_info Add revisions informations
*/
that
.
_
get
=
function
(
command
)
{
that
.
get
=
function
(
command
)
{
setTimeout
(
function
()
{
that
.
success
(
priv
.
getDocument
(
command
)
);
var
doc
;
if
(
typeof
command
.
getAttachmentId
()
===
"
string
"
)
{
// seeking for an attachment
doc
=
localstorage
.
getItem
(
priv
.
localpath
+
"
/
"
+
command
.
getDocId
()
+
"
/
"
+
command
.
getAttachmentId
());
if
(
doc
!==
null
)
{
that
.
success
(
doc
);
}
else
{
that
.
error
({
"
status
"
:
404
,
"
statusText
"
:
"
Not Found
"
,
"
error
"
:
"
not_found
"
,
"
message
"
:
"
Cannot find the attachment
"
,
"
reason
"
:
"
attachment does not exists
"
});
}
}
else
{
// seeking for a document
doc
=
localstorage
.
getItem
(
priv
.
localpath
+
"
/
"
+
command
.
getDocId
());
if
(
doc
!==
null
)
{
that
.
success
(
doc
);
}
else
{
that
.
error
({
"
status
"
:
404
,
"
statusText
"
:
"
Not Found
"
,
"
error
"
:
"
not_found
"
,
"
message
"
:
"
Cannot find the document
"
,
"
reason
"
:
"
Document does not exists
"
});
}
}
});
};
/**
* Remove a document or attachment
* @method
remove
* @method remove
* @param {object} command The JIO command
*
* Available options:
* - {boolean} conflicts Add a conflicts object to the response
* - {boolean} revs Add the revisions history of the document
* - {boolean} revs_info Add revisions informations
*/
that
.
_
remove
=
function
(
command
)
{
that
.
remove
=
function
(
command
)
{
setTimeout
(
function
()
{
that
.
success
(
priv
.
deleteDocument
(
command
)
);
var
doc
;
doc
=
localstorage
.
getItem
(
priv
.
localpath
+
"
/
"
+
command
.
getDocId
());
if
(
typeof
command
.
getAttachmentId
()
===
"
string
"
)
{
// seeking for an attachment
localstorage
.
deleteItem
(
priv
.
localpath
+
"
/
"
+
command
.
getDocId
()
+
"
/
"
+
command
.
getAttachmentId
());
// remove attachment from document
if
(
doc
!==
null
&&
typeof
doc
===
"
object
"
&&
typeof
doc
[
"
_attachments
"
]
===
"
object
"
)
{
delete
doc
[
"
_attachments
"
][
command
.
getAttachmentId
()];
if
(
priv
.
objectIsEmpty
(
doc
[
"
_attachments
"
]))
{
delete
doc
[
"
_attachments
"
];
}
localstorage
.
setItem
(
priv
.
localpath
+
"
/
"
+
command
.
getDocId
(),
doc
);
}
that
.
success
({
"
ok
"
:
true
,
"
id
"
:
command
.
getDocId
()
+
"
/
"
+
command
.
getAttachmentId
()
});
}
else
{
// seeking for a document
var
attachment_list
=
[],
i
;
if
(
doc
!==
null
&&
typeof
doc
===
"
object
"
&&
typeof
doc
[
"
_attachments
"
]
===
"
object
"
)
{
// prepare list of attachments
for
(
i
in
doc
[
"
_attachments
"
])
{
attachment_list
.
push
(
i
);
}
}
localstorage
.
deleteItem
(
priv
.
localpath
+
"
/
"
+
command
.
getDocId
());
// delete all attachments
for
(
i
=
0
;
i
<
attachment_list
.
length
;
i
+=
1
)
{
localstorage
.
deleteItem
(
priv
.
localpath
+
"
/
"
+
command
.
getDocId
()
+
"
/
"
+
attachment_list
[
i
]);
}
that
.
success
({
"
ok
"
:
true
,
"
id
"
:
command
.
getDocId
()
});
}
});
};
/**
*
g
et all filenames belonging to a user from the document index
* @method
allDocs
*
G
et all filenames belonging to a user from the document index
* @method allDocs
* @param {object} command The JIO command
*
* Available options:
* - {boolean} conflicts Add a conflicts object to the response
* - {boolean} revs Add the revisions history of the document
* - {boolean} revs_info Add revisions informations
* - {boolean} include_docs Include documents with index
*/
that
.
_
allDocs
=
function
(
command
)
{
that
.
allDocs
=
function
(
command
)
{
setTimeout
(
function
()
{
var
new_array
=
[],
array
=
priv
.
getFileNameArray
(),
i
,
l
,
path
=
'
jio/local/
'
+
priv
.
username
+
'
/
'
+
priv
.
applicationname
,
include_docs
=
command
.
getOption
(
'
include_docs
'
),
doc
,
item
;
for
(
i
=
0
,
l
=
array
.
length
;
i
<
l
;
i
+=
1
)
{
item
=
array
[
i
];
if
(
include_docs
===
true
){
doc
=
that
.
_get
(
path
+
'
/
'
+
item
.
id
+
'
/
'
+
item
.
value
.
key
);
new_array
.
push
({
"
id
"
:
item
.
id
,
"
key
"
:
item
.
key
,
"
value
"
:
item
.
value
,
"
doc
"
:
doc
});
}
else
{
new_array
.
push
({
"
id
"
:
item
.
id
,
"
key
"
:
item
.
key
,
"
value
"
:
item
.
value
});
}
}
that
.
success
({
total_rows
:
new_array
.
length
,
rows
:
new_array
});
that
.
error
({
"
status
"
:
405
,
"
statusText
"
:
"
Method Not Allowed
"
,
"
error
"
:
"
method_not_allowed
"
,
"
message
"
:
"
Your are not allowed to use this command
"
,
"
reason
"
:
"
LocalStorage forbids AllDocs command executions
"
});
});
};
...
...
src/jio.storage/outro.js
View file @
e862dbff
}(
LocalOrCookieStorage
,
jQuery
,
Base64
,
sjcl
,
hex_sha256
,
jIO
));
}(
jIO
,
jQuery
,
Base64
,
sjcl
,
hex_sha256
));
src/jio/activityUpdater.js
View file @
e862dbff
...
...
@@ -14,7 +14,7 @@ var activityUpdater = (function(spec, my) {
* @method touch
*/
priv
.
touch
=
function
()
{
LocalOrCookieS
torage
.
setItem
(
'
jio/id/
'
+
priv
.
id
,
Date
.
now
());
locals
torage
.
setItem
(
'
jio/id/
'
+
priv
.
id
,
Date
.
now
());
};
/**
...
...
@@ -72,4 +72,3 @@ var activityUpdater = (function(spec, my) {
return
that
;
}());
src/jio/commands/_allDocsCommand.js
deleted
100644 → 0
View file @
3635597f
var
_allDocsCommand
=
function
(
spec
,
my
)
{
var
that
=
command
(
spec
,
my
);
spec
=
spec
||
{};
my
=
my
||
{};
// Attributes //
// Methods //
that
.
getLabel
=
function
()
{
return
'
_allDocs
'
;
};
that
.
executeOn
=
function
(
storage
)
{
storage
.
_allDocs
(
that
);
};
that
.
canBeRestored
=
function
()
{
return
false
;
};
that
.
validateState
=
function
()
{
return
true
;
};
return
that
;
};
src/jio/commands/_getCommand.js
deleted
100644 → 0
View file @
3635597f
var
_getCommand
=
function
(
spec
,
my
)
{
var
that
=
command
(
spec
,
my
);
spec
=
spec
||
{};
my
=
my
||
{};
// Attributes //
// Methods //
that
.
getLabel
=
function
()
{
return
'
_get
'
;
};
that
.
validateState
=
function
()
{
if
(
!
that
.
getDocId
())
{
that
.
error
({
status
:
20
,
statusText
:
'
Document Id Required
'
,
error
:
'
document_id_required
'
,
message
:
'
No document id.
'
,
reason
:
'
no document id
'
});
return
false
;
}
return
true
;
};
that
.
executeOn
=
function
(
storage
)
{
storage
.
_get
(
that
);
};
that
.
canBeRestored
=
function
()
{
return
false
;
};
return
that
;
};
src/jio/commands/_postCommand.js
deleted
100644 → 0
View file @
3635597f
var
_postCommand
=
function
(
spec
,
my
)
{
var
that
=
command
(
spec
,
my
);
spec
=
spec
||
{};
my
=
my
||
{};
// Attributes //
var
priv
=
{};
// Methods //
that
.
getLabel
=
function
()
{
return
'
_post
'
;
};
that
.
executeOn
=
function
(
storage
)
{
storage
.
_post
(
that
);
};
return
that
;
};
src/jio/commands/_putAttachmentCommand.js
deleted
100644 → 0
View file @
3635597f
var
_putAttachmentCommand
=
function
(
spec
,
my
)
{
var
that
=
command
(
spec
,
my
);
spec
=
spec
||
{};
my
=
my
||
{};
// Attributes //
// Methods //
that
.
getLabel
=
function
()
{
return
'
_putAttachment
'
;
};
that
.
executeOn
=
function
(
storage
)
{
storage
.
_putAttachment
(
that
);
};
that
.
validateState
=
function
()
{
if
(
typeof
that
.
getContent
()
!==
'
string
'
)
{
that
.
error
({
status
:
22
,
statusText
:
'
Content Required
'
,
error
:
'
content_required
'
,
message
:
'
No data to put.
'
,
reason
:
'
no data to put
'
});
return
false
;
}
return
true
;
};
return
that
;
};
src/jio/commands/_putCommand.js
deleted
100644 → 0
View file @
3635597f
var
_putCommand
=
function
(
spec
,
my
)
{
var
that
=
command
(
spec
,
my
);
spec
=
spec
||
{};
my
=
my
||
{};
// Attributes //
var
priv
=
{};
// Methods //
that
.
getLabel
=
function
()
{
return
'
_put
'
;
};
/**
* Validates the storage handler.
* @param {object} handler The storage handler
*/
that
.
validate
=
function
()
{
return
that
.
validateState
();
};
that
.
executeOn
=
function
(
storage
)
{
storage
.
_put
(
that
);
};
return
that
;
};
src/jio/commands/_removeCommand.js
deleted
100644 → 0
View file @
3635597f
var
_removeCommand
=
function
(
spec
,
my
)
{
var
that
=
command
(
spec
,
my
);
spec
=
spec
||
{};
my
=
my
||
{};
// Attributes //
// Methods //
that
.
getLabel
=
function
()
{
return
'
_remove
'
;
};
that
.
executeOn
=
function
(
storage
)
{
storage
.
_remove
(
that
);
};
return
that
;
};
src/jio/commands/command.js
View file @
e862dbff
...
...
@@ -11,12 +11,6 @@ var command = function(spec, my) {
'
remove
'
:
removeCommand
,
'
allDocs
'
:
allDocsCommand
,
'
putAttachment
'
:
putAttachmentCommand
'
_post
'
:
_postCommand
,
'
_put
'
:
_putCommand
,
'
_get
'
:
_getCommand
,
'
_remove
'
:
_removeCommand
,
'
_allDocs
'
:
_allDocsCommand
,
'
_putAttachment
'
:
_putAttachmentCommand
};
// creates the good command thanks to his label
if
(
spec
.
label
&&
priv
.
commandlist
[
spec
.
label
])
{
...
...
@@ -27,7 +21,7 @@ var command = function(spec, my) {
priv
.
tried
=
0
;
priv
.
doc
=
spec
.
doc
||
{};
priv
.
docid
=
spec
.
docid
||
spec
.
doc
.
_id
||
''
;
priv
.
docid
=
spec
.
docid
||
priv
.
doc
.
_id
;
priv
.
option
=
spec
.
options
||
{};
priv
.
callbacks
=
spec
.
callbacks
||
{};
priv
.
success
=
priv
.
callbacks
.
success
||
function
(){};
...
...
@@ -42,6 +36,20 @@ var command = function(spec, my) {
priv
.
on_going
=
false
;
// Methods //
/**
* Returns a serialized version of this command.
* @method super_serialized
* @return {object} The serialized command.
*/
that
.
super_serialized
=
function
()
{
var
o
=
that
.
serialized
()
||
{};
o
[
"
label
"
]
=
that
.
getLabel
();
o
[
"
tried
"
]
=
priv
.
tried
;
o
[
"
doc
"
]
=
that
.
cloneDoc
();
o
[
"
option
"
]
=
that
.
cloneOption
();
return
o
;
};
/**
* Returns a serialized version of this command.
* Override this function.
...
...
@@ -49,10 +57,7 @@ var command = function(spec, my) {
* @return {object} The serialized command.
*/
that
.
serialized
=
function
()
{
return
{
label
:
that
.
getLabel
(),
tried
:
priv
.
tried
,
doc
:
that
.
cloneDoc
(),
option
:
that
.
cloneOption
()};
return
{};
};
/**
...
...
@@ -70,6 +75,9 @@ var command = function(spec, my) {
* @return {string} The document id
*/
that
.
getDocId
=
function
()
{
if
(
typeof
priv
.
docid
!==
"
string
"
)
{
return
undefined
;
}
return
priv
.
docid
.
split
(
'
/
'
)[
0
];
};
...
...
@@ -79,6 +87,9 @@ var command = function(spec, my) {
* @return {string} The attachment id
*/
that
.
getAttachmentId
=
function
()
{
if
(
typeof
priv
.
docid
!==
"
string
"
)
{
return
undefined
;
}
return
priv
.
docid
.
split
(
'
/
'
)[
1
];
};
...
...
@@ -91,6 +102,42 @@ var command = function(spec, my) {
return
priv
.
doc
;
};
/**
* Returns the data of the attachment
* @method getAttachmentData
* @return {string} The data
*/
that
.
getAttachmentData
=
function
()
{
return
priv
.
doc
.
_data
;
};
/**
* Returns the data length of the attachment
* @method getAttachmentLength
* @return {number} The length
*/
that
.
getAttachmentLength
=
function
()
{
return
priv
.
doc
.
_data
.
length
;
};
/**
* Returns the mimetype of the attachment
* @method getAttachmentMimeType
* @return {string} The mimetype
*/
that
.
getAttachmentMimeType
=
function
()
{
return
priv
.
doc
.
_mimetype
;
};
/**
* Generate the md5sum of the attachment data
* @method md5SumAttachmentData
* @return {string} The md5sum
*/
that
.
md5SumAttachmentData
=
function
()
{
return
hex_md5
(
priv
.
doc
.
_data
);
};
/**
* Returns an information about the document.
* @method getDocInfo
...
...
@@ -116,7 +163,8 @@ var command = function(spec, my) {
* @param {object} storage The storage.
*/
that
.
validate
=
function
(
storage
)
{
if
(
!
(
priv
.
docid
||
priv
.
doc
.
_id
).
match
(
/^
[^\/]
+
([\/][^\/]
+
)?
$/
))
{
if
(
typeof
priv
.
docid
===
"
string
"
&&
!
priv
.
docid
.
match
(
/^
[^\/]
+
([\/][^\/]
+
)?
$/
))
{
that
.
error
({
status
:
21
,
statusText
:
'
Invalid Document Id
'
,
error
:
'
invalid_document_id
'
,
...
...
@@ -253,11 +301,7 @@ var command = function(spec, my) {
* @return {object} The clone of the command options.
*/
that
.
cloneOption
=
function
()
{
var
k
,
o
=
{};
for
(
k
in
priv
.
option
)
{
o
[
k
]
=
priv
.
option
[
k
];
}
return
o
;
return
JSON
.
parse
(
JSON
.
stringify
(
priv
.
option
));
};
/**
...
...
@@ -266,14 +310,7 @@ var command = function(spec, my) {
* @return {object} The clone of the document.
*/
that
.
cloneDoc
=
function
()
{
if
(
priv
.
docid
)
{
return
priv
.
docid
;
}
var
k
,
o
=
{};
for
(
k
in
priv
.
doc
)
{
o
[
k
]
=
priv
.
doc
[
k
];
}
return
o
;
return
JSON
.
parse
(
JSON
.
stringify
(
priv
.
doc
));
};
return
that
;
...
...
src/jio/commands/getCommand.js
View file @
e862dbff
...
...
@@ -9,14 +9,28 @@ var getCommand = function(spec, my) {
};
that
.
validateState
=
function
()
{
if
(
!
that
.
getDocId
(
))
{
if
(
!
(
typeof
that
.
getDocId
()
===
"
string
"
&&
that
.
getDocId
()
!==
""
))
{
that
.
error
({
status
:
20
,
statusText
:
'
Document Id Required
'
,
error
:
'
document_id_required
'
,
message
:
'
No document id.
'
,
reason
:
'
no document id
'
"
status
"
:
20
,
"
statusText
"
:
"
Document Id Required
"
,
"
error
"
:
"
document_id_required
"
,
"
message
"
:
"
The document id is not provided
"
,
"
reason
"
:
"
Document id is undefined
"
});
return
false
;
}
if
(
typeof
that
.
getAttachmentId
()
===
"
string
"
)
{
if
(
that
.
getAttachmentId
()
===
""
)
{
that
.
error
({
"
status
"
:
23
,
"
statusText
"
:
"
Invalid Attachment Id
"
,
"
error
"
:
"
invalid_attachment_id
"
,
"
message
"
:
"
The attachment id must not be an empty string
"
,
"
reason
"
:
"
Attachment id is empty
"
});
}
return
false
;
}
return
true
;
};
...
...
src/jio/commands/postCommand.js
View file @
e862dbff
...
...
@@ -10,6 +10,21 @@ var postCommand = function(spec, my) {
return
'
post
'
;
};
that
.
validateState
=
function
()
{
if
(
typeof
that
.
getAttachmentId
()
!==
"
undefined
"
)
{
that
.
error
({
"
status
"
:
21
,
"
statusText
"
:
"
Invalid Document Id
"
,
"
error
"
:
"
invalid_document_id
"
,
"
message
"
:
"
The document id contains '/' characters
"
+
"
which are forbidden
"
,
"
reason
"
:
"
Document id contains '/' character(s)
"
});
return
false
;
}
return
true
;
};
that
.
executeOn
=
function
(
storage
)
{
storage
.
post
(
that
);
};
...
...
src/jio/commands/putAttachmentCommand.js
View file @
e862dbff
...
...
@@ -11,15 +11,27 @@ var putAttachmentCommand = function(spec, my) {
that
.
executeOn
=
function
(
storage
)
{
storage
.
putAttachment
(
that
);
};
that
.
validateState
=
function
()
{
if
(
typeof
that
.
get
Content
()
!==
'
string
'
)
{
if
(
typeof
that
.
get
AttachmentId
()
!==
"
string
"
)
{
that
.
error
({
status
:
22
,
statusText
:
'
Content Required
'
,
error
:
'
content_required
'
,
message
:
'
No data to put.
'
,
reason
:
'
no data to put
'
"
status
"
:
22
,
"
statusText
"
:
"
Attachment Id Required
"
,
"
error
"
:
"
attachment_id_required
"
,
"
message
"
:
"
The attachment id must be set
"
,
"
reason
"
:
"
Attachment id not set
"
});
return
false
;
}
if
(
that
.
getAttachmentId
()
===
""
)
{
that
.
error
({
"
status
"
:
23
,
"
statusText
"
:
"
Invalid Attachment Id
"
,
"
error
"
:
"
invalid_attachment_id
"
,
"
message
"
:
"
The attachment id must not be an empty string
"
,
"
reason
"
:
"
Attachment id is empty
"
});
}
return
true
;
};
...
...
src/jio/commands/putCommand.js
View file @
e862dbff
...
...
@@ -10,12 +10,29 @@ var putCommand = function(spec, my) {
return
'
put
'
;
};
/**
* Validates the storage handler.
* @param {object} handler The storage handler
*/
that
.
validate
=
function
()
{
return
that
.
validateState
();
that
.
validateState
=
function
()
{
if
(
!
(
typeof
that
.
getDocId
()
===
"
string
"
&&
that
.
getDocId
()
!==
""
))
{
that
.
error
({
"
status
"
:
20
,
"
statusText
"
:
"
Document Id Required
"
,
"
error
"
:
"
document_id_required
"
,
"
message
"
:
"
The document id is not provided
"
,
"
reason
"
:
"
Document id is undefined
"
});
return
false
;
}
if
(
typeof
that
.
getAttachmentId
()
!==
"
undefined
"
)
{
that
.
error
({
"
status
"
:
21
,
"
statusText
"
:
"
Invalid Document Id
"
,
"
error
"
:
"
invalid_document_id
"
,
"
message
"
:
"
The document id contains '/' characters
"
+
"
which are forbidden
"
,
"
reason
"
:
"
Document id contains '/' character(s)
"
});
return
false
;
}
return
true
;
};
that
.
executeOn
=
function
(
storage
)
{
...
...
src/jio/commands/removeCommand.js
View file @
e862dbff
...
...
@@ -8,6 +8,32 @@ var removeCommand = function(spec, my) {
return
'
remove
'
;
};
that
.
validateState
=
function
()
{
if
(
!
(
typeof
that
.
getDocId
()
===
"
string
"
&&
that
.
getDocId
()
!==
""
))
{
that
.
error
({
"
status
"
:
20
,
"
statusText
"
:
"
Document Id Required
"
,
"
error
"
:
"
document_id_required
"
,
"
message
"
:
"
The document id is not provided
"
,
"
reason
"
:
"
Document id is undefined
"
});
return
false
;
}
if
(
typeof
that
.
getAttachmentId
()
===
"
string
"
)
{
if
(
that
.
getAttachmentId
()
===
""
)
{
that
.
error
({
"
status
"
:
23
,
"
statusText
"
:
"
Invalid Attachment Id
"
,
"
error
"
:
"
invalid_attachment_id
"
,
"
message
"
:
"
The attachment id must not be an empty string
"
,
"
reason
"
:
"
Attachment id is empty
"
});
}
return
false
;
}
return
true
;
};
that
.
executeOn
=
function
(
storage
)
{
storage
.
remove
(
that
);
};
...
...
src/jio/intro.js
View file @
e862dbff
var
jIO
=
(
function
(
)
{
(
function
(
scope
,
hex_md5
)
{
"
use strict
"
;
var
localstorage
;
if
(
typeof
localStorage
!==
"
undefined
"
)
{
localstorage
=
{
getItem
:
function
(
item
)
{
return
JSON
.
parse
(
localStorage
.
getItem
(
item
));
},
setItem
:
function
(
item
,
value
)
{
return
localStorage
.
setItem
(
item
,
JSON
.
stringify
(
value
));
},
deleteItem
:
function
(
item
)
{
delete
localStorage
[
item
];
},
clone
:
function
()
{
return
JSON
.
parse
(
JSON
.
stringify
(
localStorage
));
}
};
}
else
{
(
function
()
{
var
pseudo_localStorage
=
{};
localstorage
=
{
getItem
:
function
(
item
)
{
return
JSON
.
parse
(
pseudo_localStorage
[
item
]);
},
setItem
:
function
(
item
,
value
)
{
return
pseudo_localStorage
[
item
]
=
JSON
.
stringify
(
value
);
},
deleteItem
:
function
(
item
)
{
delete
pseudo_localStorage
[
item
];
},
clone
:
function
()
{
return
JSON
.
parse
(
JSON
.
stringify
(
pseudo_localStorage
));
}
};
}());
}
src/jio/jio.outro.js
View file @
e862dbff
...
...
@@ -12,7 +12,7 @@
// Initialize the jio id and add the new id to the list
if
(
priv
.
id
===
null
)
{
var
i
,
jio_id_a
=
LocalOrCookieS
torage
.
getItem
(
jio_id_array_name
)
||
[];
locals
torage
.
getItem
(
jio_id_array_name
)
||
[];
priv
.
id
=
1
;
for
(
i
=
0
;
i
<
jio_id_a
.
length
;
i
+=
1
)
{
if
(
jio_id_a
[
i
]
>=
priv
.
id
)
{
...
...
@@ -20,7 +20,7 @@
}
}
jio_id_a
.
push
(
priv
.
id
);
LocalOrCookieS
torage
.
setItem
(
jio_id_array_name
,
jio_id_a
);
locals
torage
.
setItem
(
jio_id_array_name
,
jio_id_a
);
activityUpdater
.
setId
(
priv
.
id
);
jobManager
.
setId
(
priv
.
id
);
}
...
...
@@ -143,6 +143,8 @@
}
else
{
param
.
callback
=
callback1
;
}
}
else
{
param
.
callback
=
function
()
{};
}
};
...
...
@@ -176,7 +178,8 @@
/**
* Post a document.
* @method post
* @param {object} doc The document {"content":}.
* @param {object} doc The document object. Contains at least:
* - {string} _id The document id (optional), "/" are forbidden
* @param {object} options (optional) Contains some options:
* - {number} max_retry The number max of retries, 0 = infinity.
* - {boolean} revs Include revision history of the document.
...
...
@@ -206,7 +209,8 @@
/**
* Put a document.
* @method put
* @param {object} doc The document {"_id":,"_rev":,"content":}.
* @param {object} doc The document object. Contains at least:
* - {string} _id The document id, "/" are forbidden
* @param {object} options (optional) Contains some options:
* - {number} max_retry The number max of retries, 0 = infinity.
* - {boolean} revs Include revision history of the document.
...
...
@@ -236,7 +240,7 @@
/**
* Get a document.
* @method get
* @param {string} docid The document id
(the path)
.
* @param {string} docid The document id
: "doc_id" or "doc_id/attachmt_id"
.
* @param {object} options (optional) Contains some options:
* - {number} max_retry The number max of retries, 0 = infinity.
* - {string} rev The revision we want to get.
...
...
@@ -267,7 +271,8 @@
/**
* Remove a document.
* @method remove
* @param {object} doc The document {"_id":,"_rev":}.
* @param {object} doc The document object. Contains at least:
* - {string} _id The document id: "doc_id" or "doc_id/attachment_id"
* @param {object} options (optional) Contains some options:
* - {number} max_retry The number max of retries, 0 = infinity.
* - {boolean} revs Include revision history of the document.
...
...
@@ -312,7 +317,7 @@
configurable
:
false
,
enumerable
:
false
,
writable
:
false
,
value
:
function
(
options
,
success
,
error
)
{
var
param
=
priv
.
parametersToObject
(
[
options
,
success
.
error
],
[
options
,
success
,
error
],
{
max_retry
:
3
}
);
...
...
@@ -326,10 +331,11 @@
/**
* Put an attachment to a document.
* @method putAttachment
* @param {string} id The attachment id ("document/attachment").
* @param {string} rev The document revision.
* @param {string} doc Base64 attachment content.
* @param {string} mimetype The attachment mimetype
* @param {object} doc The document object. Contains at least:
* - {string} id The document id: "doc_id/attchment_id"
* - {string} data Base64 attachment data
* - {string} mimetype The attachment mimetype
* - {string} rev The attachment revision
* @param {object} options (optional) Contains some options:
* - {number} max_retry The number max of retries, 0 = infinity.
* - {boolean} revs Include revision history of the document.
...
...
@@ -342,14 +348,18 @@
*/
Object
.
defineProperty
(
that
,
"
putAttachment
"
,{
configurable
:
false
,
enumerable
:
false
,
writable
:
false
,
value
:
function
(
id
,
rev
,
doc
,
mimetype
,
options
,
success
,
error
)
{
var
param
=
priv
.
parametersToObject
(
function
(
doc
,
options
,
success
,
error
)
{
var
param
,
k
,
doc_with_underscores
=
{};
param
=
priv
.
parametersToObject
(
[
options
,
success
,
error
],
{
max_retry
:
0
}
);
for
(
k
in
doc
)
{
doc_with_underscores
[
"
_
"
+
k
]
=
doc
[
k
];
}
console
.
log
(
doc_with_underscores
);
priv
.
addJob
(
putAttachmentCommand
,{
doc
:
{
_id
:
id
,
content
:
doc
,
_rev
:
rev
,
mimetype
:
mimetype
}
,
doc
:
doc_with_underscores
,
options
:
param
.
options
,
callbacks
:{
success
:
param
.
success
,
error
:
param
.
error
}
});
...
...
src/jio/jobs/jobManager.js
View file @
e862dbff
...
...
@@ -25,7 +25,7 @@ var jobManager = (function(spec) {
* @return {array} The job array.
*/
priv
.
getJobArray
=
function
()
{
return
LocalOrCookieS
torage
.
getItem
(
priv
.
getJobArrayName
())
||
[];
return
locals
torage
.
getItem
(
priv
.
getJobArrayName
())
||
[];
};
/**
...
...
@@ -37,7 +37,7 @@ var jobManager = (function(spec) {
for
(
i
=
0
;
i
<
priv
.
job_array
.
length
;
i
+=
1
)
{
new_a
.
push
(
priv
.
job_array
[
i
].
serialized
());
}
LocalOrCookieS
torage
.
setItem
(
priv
.
getJobArrayName
(),
new_a
);
locals
torage
.
setItem
(
priv
.
getJobArrayName
(),
new_a
);
};
/**
...
...
@@ -90,7 +90,7 @@ var jobManager = (function(spec) {
clearInterval
(
priv
.
interval_id
);
priv
.
interval_id
=
null
;
if
(
priv
.
job_array
.
length
===
0
)
{
LocalOrCookieS
torage
.
deleteItem
(
priv
.
getJobArrayName
());
locals
torage
.
deleteItem
(
priv
.
getJobArrayName
());
}
}
};
...
...
@@ -105,7 +105,7 @@ var jobManager = (function(spec) {
var
i
,
jio_id_a
;
priv
.
lastrestore
=
priv
.
lastrestore
||
0
;
if
(
priv
.
lastrestore
>
(
Date
.
now
())
-
2000
)
{
return
;
}
jio_id_a
=
LocalOrCookieS
torage
.
getItem
(
'
jio/id_array
'
)
||
[];
jio_id_a
=
locals
torage
.
getItem
(
'
jio/id_array
'
)
||
[];
for
(
i
=
0
;
i
<
jio_id_a
.
length
;
i
+=
1
)
{
priv
.
restoreOldJioId
(
jio_id_a
[
i
]);
}
...
...
@@ -119,7 +119,7 @@ var jobManager = (function(spec) {
*/
priv
.
restoreOldJioId
=
function
(
id
)
{
var
jio_date
;
jio_date
=
LocalOrCookieS
torage
.
getItem
(
'
jio/id/
'
+
id
)
||
0
;
jio_date
=
locals
torage
.
getItem
(
'
jio/id/
'
+
id
)
||
0
;
if
(
new
Date
(
jio_date
).
getTime
()
<
(
Date
.
now
()
-
10000
))
{
// 10 sec
priv
.
restoreOldJobFromJioId
(
id
);
priv
.
removeOldJioId
(
id
);
...
...
@@ -134,7 +134,7 @@ var jobManager = (function(spec) {
*/
priv
.
restoreOldJobFromJioId
=
function
(
id
)
{
var
i
,
jio_job_array
;
jio_job_array
=
LocalOrCookieS
torage
.
getItem
(
'
jio/job_array/
'
+
id
)
||
[];
jio_job_array
=
locals
torage
.
getItem
(
'
jio/job_array/
'
+
id
)
||
[];
for
(
i
=
0
;
i
<
jio_job_array
.
length
;
i
+=
1
)
{
var
command_object
=
command
(
jio_job_array
[
i
].
command
);
if
(
command_object
.
canBeRestored
())
{
...
...
@@ -152,14 +152,14 @@ var jobManager = (function(spec) {
*/
priv
.
removeOldJioId
=
function
(
id
)
{
var
i
,
jio_id_array
,
new_array
=
[];
jio_id_array
=
LocalOrCookieS
torage
.
getItem
(
'
jio/id_array
'
)
||
[];
jio_id_array
=
locals
torage
.
getItem
(
'
jio/id_array
'
)
||
[];
for
(
i
=
0
;
i
<
jio_id_array
.
length
;
i
+=
1
)
{
if
(
jio_id_array
[
i
]
!==
id
)
{
new_array
.
push
(
jio_id_array
[
i
]);
}
}
LocalOrCookieS
torage
.
setItem
(
'
jio/id_array
'
,
new_array
);
LocalOrCookieS
torage
.
deleteItem
(
'
jio/id/
'
+
id
);
locals
torage
.
setItem
(
'
jio/id_array
'
,
new_array
);
locals
torage
.
deleteItem
(
'
jio/id/
'
+
id
);
};
/**
...
...
@@ -168,7 +168,7 @@ var jobManager = (function(spec) {
* @param {number} id The jio id.
*/
priv
.
removeJobArrayFromJioId
=
function
(
id
)
{
LocalOrCookieS
torage
.
deleteItem
(
'
jio/job_array/
'
+
id
);
locals
torage
.
deleteItem
(
'
jio/job_array/
'
+
id
);
};
/**
...
...
src/jio/outro.js
View file @
e862dbff
return
jioNamespace
;
}());
Object
.
defineProperty
(
scope
,
"
jIO
"
,{
configurable
:
false
,
enumerable
:
false
,
writable
:
false
,
value
:
jioNamespace
});
}(
window
,
hex_md5
));
src/jio/storages/storage.js
View file @
e862dbff
...
...
@@ -14,214 +14,6 @@ var storage = function(spec, my) {
}
});
/**
* Generate a new uuid
* @method generateUuid
* @return {string} The new uuid
*/
that
.
generateUuid
=
function
()
{
var
S4
=
function
()
{
var
i
,
string
=
Math
.
floor
(
Math
.
random
()
*
0x10000
/* 65536 */
).
toString
(
16
);
for
(
i
=
string
.
length
;
i
<
4
;
i
+=
1
)
{
string
=
'
0
'
+
string
;
}
return
string
;
};
return
S4
()
+
S4
()
+
"
-
"
+
S4
()
+
"
-
"
+
S4
()
+
"
-
"
+
S4
()
+
"
-
"
+
S4
()
+
S4
()
+
S4
();
};
/**
* Generates a hash code of a string
* @method hashCode
* @param {string} string The string to hash
* @return {string} The string hash code
*/
that
.
hashCode
=
function
(
string
)
{
return
hex_sha256
(
string
);
};
/**
* Returns an array version of a revision string
* @method revisionToArray
* @param {string} revision The revision string
* @return {array} Array containing a revision number and a hash
*/
that
.
revisionToArray
=
function
(
revision
)
{
if
(
typeof
revision
===
"
string
"
)
{
return
[
parseInt
(
revision
.
split
(
'
-
'
)[
0
],
10
),
revision
.
split
(
'
-
'
)[
1
]]
}
return
revision
;
};
/**
* Generates the next revision of [previous_revision]. [string] helps us
* to generate a hash code.
* @methode generateNextRev
* @param {string} previous_revision The previous revision
* @param {string} string String to help generate hash code
* @return {array} 0:The next revision number and 1:the hash code
*/
that
.
generateNextRevision
=
function
(
previous_revision
,
string
)
{
if
(
typeof
previous_revision
===
"
number
"
)
{
return
[
previous_revision
+
1
,
that
.
hashCode
(
string
)];
}
previous_revision
=
that
.
revisionToArray
(
previous_revision
);
return
[
previous_revision
[
0
]
+
1
,
that
.
hashCode
(
string
)];
};
/**
* Checks a revision format
* @method checkRevisionFormat
* @param {string} revision The revision string
* @return {boolean} True if ok, else false
*/
that
.
checkRevisionFormat
=
function
(
revision
)
{
return
/^
[
0-9
]
+-
[
0-9a-zA-Z
]
+$/
.
test
(
revision
);
};
/**
* Creates the error object for all errors
* @method createErrorObject
* @param {number} error_code The error code
* @param {string} error_name The error name
* @param {string} message The error message
* @param {object} error_object The error object (optional)
* @return {object} Error object
*/
that
.
createErrorObject
=
function
(
error_code
,
error_name
,
message
,
error_object
)
{
error_object
=
error_object
||
{};
error_okject
[
"
status
"
]
=
error_code
||
0
;
error_object
[
"
statusText
"
]
=
error_name
;
error_object
[
"
error
"
]
=
error_name
.
toLowerCase
().
split
(
'
'
).
join
(
'
_
'
);
error_object
[
"
message
"
]
=
error_object
[
"
error
"
]
=
message
;
return
error_object
;
};
/**
* Creates an empty document tree
* @method createDocumentTree
* @param {array} children An array of children (optional)
* @return {object} The new document tree
*/
that
.
createDocumentTree
=
function
(
children
)
{
return
{
"
children
"
:
children
||
[]};
};
/**
* Creates a new document tree node
* @method createDocumentTreeNode
* @param {string} revision The node revision
* @param {string} status The node status
* @param {array} children An array of children (optional)
* @return {object} The new document tree node
*/
that
.
createDocumentTreeNode
=
function
(
revision
,
status
,
children
)
{
return
{
"
rev
"
:
revision
,
"
status
"
:
status
,
"
children
"
:
children
||
[]};
};
/**
* Gets the winner revision from a document tree.
* The winner is the deeper revision on the left.
* @method getWinnerRevisionFromDocumentTree
* @param {object} document_tree The document tree
* @return {string} The winner revision
*/
that
.
getWinnerRevisionFromDocumentTree
=
function
(
document_tree
)
{
var
i
,
result
,
search
;
result
=
{
"
deep
"
:
-
1
,
"
revision
"
:
''
};
// search method fills "result" with the winner revision
search
=
function
(
document_tree
,
deep
)
{
var
i
;
if
(
document_tree
.
children
.
length
===
0
)
{
// This node is a leaf
if
(
result
.
deep
<
deep
)
{
// The leaf is deeper than result
result
=
{
"
deep
"
:
deep
,
"
revision
"
:
document_tree
.
rev
};
}
return
;
}
// This node has children
for
(
i
=
0
;
i
<
document_tree
.
children
.
length
;
i
+=
1
)
{
// searching deeper to find the deeper leaf
search
(
document_tree
.
children
[
i
],
deep
+
1
);
}
};
search
(
document_tree
,
0
);
return
result
.
rev
;
};
/**
* Gets an array of leaves revisions from document tree
* @method getLeavesFromDocumentTree
* @param {object} document_tree The document tree
* @return {array} The array of leaves revisions
*/
that
.
getLeavesFromDocumentTree
=
function
(
document_tree
)
{
var
i
,
result
,
search
;
result
=
[];
// search method fills [result] with the winner revision
search
=
function
(
document_tree
)
{
var
i
;
if
(
document_tree
.
children
.
length
===
0
)
{
// This node is a leaf
result
.
push
(
document_tree
.
rev
);
return
;
}
// This node has children
for
(
i
=
0
;
i
<
document_tree
.
children
.
length
;
i
+=
1
)
{
// searching deeper to find the deeper leaf
search
(
document_tree
.
children
[
i
]);
}
};
search
(
document_tree
);
return
result
;
};
that
.
createDocument
=
function
(
doc
,
id
,
prev_rev
)
{
var
hash
,
rev
;
if
(
typeof
prev_rev
===
"
undefined
"
)
{
hash
=
that
.
hashCode
(
doc
);
doc
.
_rev
=
"
1-
"
+
hash
;
doc
.
_id
=
id
;
doc
.
_revisions
=
{
"
start
"
:
1
,
"
ids
"
:
[
hash
]
};
doc
.
_revs_info
=
[{
"
rev
"
:
"
1-
"
+
hash
,
"
status
"
:
"
available
"
}];
return
doc
;
}
else
{
// xxx do not hash _key of doc!
prev_rev
=
that
.
revisionToArray
(
prev_rev
);
rev
=
that
.
generateNextRevision
(
prev_rev
,
doc
);
doc
.
_rev
=
rev
.
join
(
'
-
'
);
doc
.
_id
=
id
;
doc
.
_revisions
=
{
"
start
"
:
rev
[
0
],
"
ids
"
:
[
rev
[
1
],
prev_rev
[
1
]]
};
doc
.
_revs_info
=
[{
"
rev
"
:
rev
.
join
(
'
-
'
),
"
status
"
:
"
available
"
},{
"
rev
"
:
prev_rev
.
join
(
'
-
'
),
"
status
"
:
"
missing
"
}];
return
doc
;
}
};
/**
* Execute the command on this storage.
* @method execute
...
...
@@ -278,7 +70,7 @@ var storage = function(spec, my) {
*/
that
.
serialized
=
function
()
{
return
{};
}
}
;
/**
* Validate the storage state. It returns a empty string all is ok.
...
...
@@ -289,82 +81,7 @@ var storage = function(spec, my) {
return
''
;
};
that
.
post
=
function
(
command
)
{
setTimeout
(
function
()
{
var
f
,
options
,
document_tree
,
doc
,
prev_rev
;
f
=
{};
options
=
command
.
cloneOption
();
options
[
"
max_retry
"
]
=
options
[
"
max_retry
"
]
||
3
;
f
.
begin
=
function
()
{
prev_rev
=
command
.
getDocInfo
(
"
_rev
"
);
if
(
typeof
prev_rev
===
"
string
"
&&
!
that
.
checkRevisionFormat
(
prev_rev
))
{
// if the previous revision given is bad
that
.
error
(
that
.
createErrorObject
(
400
,
"
Bad Request
"
,
"
Invalid rev format
"
));
return
;
}
doc
=
that
.
createDocument
(
command
.
getDoc
()
||
{},
command
.
getDocId
()
||
that
.
generateUuid
(),
prev_rev
);
// the previous revision is correct
prev_rev
=
that
.
revisionToArray
(
prev_rev
);
f
.
getDocumentTree
();
};
// check if the tree already exists
f
.
getDocumentTree
=
function
()
{
that
.
addJob
(
'
_get
'
,
that
.
serialized
(),
doc
.
_id
+
'
.tree.json
'
,
options
,
function
(
response
)
{
// if the tree exists
document_tree
=
response
;
f
.
postDocument
();
},
function
(
error
)
{
if
(
error
.
status
===
404
)
{
// if the tree does not exists yet
document_tree
=
that
.
createDocumentTree
();
f
.
postDocument
();
}
else
{
that
.
error
(
that
.
createErrorObject
(
error
.
status
,
error
.
statusText
,
"
Unable to get the revision tree
"
));
}
}
);
};
f
.
postDocument
=
function
()
{
that
.
addJob
(
'
_post
'
,
that
.
serialized
(),
doc
.
_id
+
'
.
'
+
doc
.
_rev
,
options
,
function
(
response
)
{
f
.
putDocumentTree
()
},
function
(
error
)
{
that
.
error
(
that
.
createErrorObject
(
error
.
status
,
error
.
statusText
,
error
));
}
);
};
f
.
putDocumentTree
=
function
()
{
if
(
!
that
.
addDocumentToDocumentTree
(
doc
))
{
// conflict!
}
// xxx
};
f
.
begin
();
});
};
that
.
_post
=
function
()
{
that
.
post
=
function
()
{
setTimeout
(
function
()
{
that
.
error
(
that
.
createErrorObject
(
0
,
"
Not Implemented Yet
"
,
"
\"
Post
\"
command is not implemented
"
...
...
@@ -372,7 +89,7 @@ var storage = function(spec, my) {
});
};
that
.
_
put
=
function
()
{
that
.
put
=
function
()
{
setTimeout
(
function
()
{
that
.
error
(
that
.
createErrorObject
(
0
,
"
Not Implemented Yet
"
,
"
\"
Put
\"
command is not implemented
"
...
...
@@ -380,7 +97,7 @@ var storage = function(spec, my) {
});
};
that
.
_
putAttachment
=
function
()
{
that
.
putAttachment
=
function
()
{
setTimeout
(
function
()
{
that
.
error
(
that
.
createErrorObject
(
0
,
"
Not Implemented Yet
"
,
...
...
@@ -389,7 +106,7 @@ var storage = function(spec, my) {
});
};
that
.
_
get
=
function
()
{
that
.
get
=
function
()
{
setTimeout
(
function
()
{
that
.
error
(
that
.
createErrorObject
(
0
,
"
Not Implemented Yet
"
,
"
\"
Get
\"
command is not implemented
"
...
...
@@ -397,7 +114,7 @@ var storage = function(spec, my) {
});
};
that
.
_
allDocs
=
function
()
{
that
.
allDocs
=
function
()
{
setTimeout
(
function
()
{
that
.
error
(
that
.
createErrorObject
(
0
,
"
Not Implemented Yet
"
,
...
...
@@ -406,7 +123,7 @@ var storage = function(spec, my) {
});
};
that
.
_
remove
=
function
()
{
that
.
remove
=
function
()
{
setTimeout
(
function
()
{
that
.
error
(
that
.
createErrorObject
(
0
,
"
Not Implemented Yet
"
,
...
...
Write
Preview
Markdown
is supported
0%
Try again
or
attach a new file
Attach a file
Cancel
You are about to add
0
people
to the discussion. Proceed with caution.
Finish editing this message first!
Cancel
Please
register
or
sign in
to comment