Confirmed users
764
edits
(propose API for checking for the existence of values) |
(Big changes to reflect bug 499871) |
||
| Line 4: | Line 4: | ||
* Author: Atul Varma <atul at mozilla dot com> | * Author: Atul Varma <atul at mozilla dot com> | ||
* | * Editors: Drew Willcoxon <adw at mozilla dot com> | ||
* Status: | * Champion: Atul Varma | ||
* Status: Implementing | |||
* Type: API Track | * Type: API Track | ||
* Created: 27 May 2009 | * Created: 27 May 2009 | ||
* Reference Implementation: None | * Reference Implementation: None | ||
* Relevant Bugs: {{bug|496694}}, {{bug|499871}} | |||
* [[Labs/Jetpack/JEPs|JEP Index]] | * [[Labs/Jetpack/JEPs|JEP Index]] | ||
| Line 23: | Line 25: | ||
=== Proposal === | === Proposal === | ||
Persistent storage will live at <code>jetpack.storage.simple</code>. The <code>jetpack.storage</code> namespace will provide access to any other available storage systems, such as | Persistent storage will live at <code>jetpack.storage.simple</code>. The <code>jetpack.storage</code> namespace will provide access to any other available storage systems, such as SQLite, secure/password storage, and so on. The current <code>jetpack.sessionStorage</code> object, which allows arbitrary JS objects (they need not be JSON-able) to be stored between reloads of a Jetpack within the same Firefox session, will be renamed to <code>jetpack.storage.session</code>. | ||
==== Callbacks ==== | ==== Callbacks ==== | ||
| Line 31: | Line 33: | ||
In this proposal, <code>onResult</code> refers to either the function form or the <code>object.onResult</code> form. Since there is only one form for errors, <code>onError</code> refers to the <code>object.onError</code> form. | In this proposal, <code>onResult</code> refers to either the function form or the <code>object.onResult</code> form. Since there is only one form for errors, <code>onError</code> refers to the <code>object.onError</code> form. | ||
<code>onResult</code> | The arguments passed to <code>onResult</code> and <code>onError</code> depend on the API method to which the callback is passed. Each method's description below indicates how it calls its callback. | ||
Callbacks are optional, but callers should never assume that an operation completes successfully if it is important that it actually does so. | |||
==== Storing a Single Item ==== | |||
<pre class="brush:js;toolbar:false;"> | <pre class="brush:js;toolbar:false;"> | ||
jetpack.storage.simple.set(key, value, callback) | |||
</pre> | </pre> | ||
<code>onError</code> | ''Arguments'' | ||
<code>key</code>: A string uniquely identifying the data to be placed into persistent storage. | |||
<code>value</code>: A JS primitive or JSON-able JS object that represents the data to be stored in persistent storage. If some other data with the given <code>key</code> is already being stored, it is overwritten by <code>value</code>. If <code>value</code> is <code>undefined</code>, this method is equivalent to <code>jetpack.storage.simple.remove</code>. | |||
<code>callback</code>: A callback. <code>onResult</code> and <code>onError</code> are called as follows: | |||
* <code>onResult(key, value)</code> | |||
* <code>onError(errorMessage, key, value)</code> | |||
''Return value'' | |||
This method has no return value. | |||
==== Storing Multiple Items ==== | |||
<pre class="brush:js;toolbar:false;"> | <pre class="brush:js;toolbar:false;"> | ||
jetpack.storage.simple.set(itemsObject, callback) | |||
</pre> | </pre> | ||
''Arguments'' | |||
<code>itemsObject</code>: An object whose properties and their values identify the data to be placed into persistent storage. As in the single item form of this method, if some other data with a given key is already being stored, it is overwritten by the value in <code>itemsObject</code>. If a given value is <code>undefined</code>, its key is removed from the store. | |||
<code>callback</code>: A callback. <code>onResult</code> and <code>onError</code> are called as follows: | |||
* <code>onResult(itemsObject)</code> | |||
* <code>onError(errorMessage, itemsObject)</code> | |||
''Return value'' | |||
This method has no return value. | |||
==== | ==== Retrieving a Single Item ==== | ||
<pre class="brush:js;toolbar:false;"> | <pre class="brush:js;toolbar:false;"> | ||
jetpack.storage.simple. | jetpack.storage.simple.get(key, callback) | ||
</pre> | </pre> | ||
''Arguments'' | ''Arguments'' | ||
<code>key</code>: A string uniquely identifying the data to be | <code>key</code>: A string uniquely identifying the data to be retrieved from persistent storage. | ||
<code> | <code>callback</code>: A callback. <code>onResult</code> and <code>onError</code> are called as follows: | ||
<code> | * <code>onResult(key, value)</code> | ||
** <code>value</code> is <code>key</code>'s associated data. | |||
** If <code>key</code> does not exist in the store, <code>value</code> is <code>undefined</code>. | |||
* <code>onError(errorMessage, key)</code> | |||
''Return value'' | ''Return value'' | ||
This | This method has no return value. | ||
==== Retrieving | ==== Retrieving Multiple Items ==== | ||
<pre class="brush:js;toolbar:false;"> | <pre class="brush:js;toolbar:false;"> | ||
jetpack.storage.simple.get( | jetpack.storage.simple.get(keyArray, callback) | ||
</pre> | </pre> | ||
''Arguments'' | ''Arguments'' | ||
<code> | <code>keyArray</code>: An array of strings, each of which uniquely identifies data to be retrieved from persistent storage. | ||
<code>callback</code>: A callback. <code>onResult</code> and <code>onError</code> are called as follows: | |||
* <code>onResult(itemsObject)</code> | |||
** The properties and values of <code>itemsObject</code> are the key-value pairs corresponding to the keys in <code>keyArray</code>. | |||
** If a key does not exist in the store, its associated value in <code>itemsObject</code> is <code>undefined</code>. | |||
* <code>onError(errorMessage, keyArray)</code> | |||
''Return value'' | |||
This method has no return value. | |||
==== Retrieving All Items ==== | |||
<pre class="brush:js;toolbar:false;"> | |||
jetpack.storage.simple.get(callback) | |||
</pre> | |||
''Arguments'' | |||
<code>callback</code>: A callback. <code>onResult</code> and <code>onError</code> are called as follows: | |||
* <code>onResult(allItemsObject)</code> | |||
** The properties and values of <code>allItemsObject</code> are all of the key-value pairs in the store. | |||
* <code>onError(errorMessage)</code> | |||
''Return value'' | ''Return value'' | ||
This | This method has no return value. | ||
==== Removing | ==== Removing a Single Item ==== | ||
<pre class="brush:js;toolbar:false;"> | <pre class="brush:js;toolbar:false;"> | ||
| Line 95: | Line 147: | ||
''Arguments'' | ''Arguments'' | ||
<code>key</code>: The string uniquely identifying the data to be removed from persistent storage | <code>key</code>: The string uniquely identifying the data to be removed from persistent storage. | ||
<code>callback</code>: A callback. | <code>callback</code>: A callback. <code>onResult</code> and <code>onError</code> are called as follows: | ||
* <code>onResult(key)</code> | |||
* <code>onError(errorMessage, key)</code> | |||
''Return value'' | ''Return value'' | ||
This | This method has no return value. | ||
==== | ==== Removing Multiple Items ==== | ||
<pre class="brush:js;toolbar:false;"> | |||
jetpack.storage.simple.remove(keyArray, callback) | |||
</pre> | |||
''Arguments'' | |||
<code>key</code>: An array of strings, each of which uniquely identifies data to be removed from persistent storage. | |||
<code>callback</code>: A callback. <code>onResult</code> and <code>onError</code> are called as follows: | |||
* <code>onResult(keyArray)</code> | |||
* <code>onError(errorMessage, keyArray)</code> | |||
''Return value'' | |||
This method has no return value. | |||
==== Removing All Items ==== | |||
<pre class="brush:js;toolbar:false;"> | |||
jetpack.storage.simple.clear(callback) | |||
</pre> | |||
''Arguments'' | |||
<code>callback</code>: A callback. <code>onResult</code> and <code>onError</code> are called as follows: | |||
* <code>onResult()</code> | |||
* <code>onError(errorMessage)</code> | |||
''Return value'' | |||
This method has no return value. | |||
==== Testing the Existence of a Single Item ==== | |||
<pre class="brush:js;toolbar:false;"> | <pre class="brush:js;toolbar:false;"> | ||
| Line 111: | Line 202: | ||
''Arguments'' | ''Arguments'' | ||
<code>key</code>: A string uniquely identifying the data whose existence in persistent storage is to be checked, | <code>key</code>: A string uniquely identifying the data whose existence in persistent storage is to be checked. | ||
<code>callback</code>: A callback. <code>onResult</code> and <code>onError</code> are called as follows: | |||
* <code>onResult(key, exists)</code> | |||
** <code>exists</code> is <code>true</code> if <code>key</code> exists in the store and <code>false</code> otherwise. | |||
* <code>onError(errorMessage, key)</code> | |||
''Return value'' | |||
This method has no return value. | |||
==== Testing the Existence of Multiple Items ==== | |||
<pre class="brush:js;toolbar:false;"> | |||
jetpack.storage.simple.has(keyArray, callback) | |||
</pre> | |||
''Arguments'' | |||
<code>keyArray</code>: An array of strings, each of which uniquely identifies data whose existence in persistent storage is to be checked. | |||
<code>callback</code>: A callback. <code>onResult</code> and <code>onError</code> are called as follows: | |||
* <code>onResult(keyArray, existsObject)</code> | |||
** <code>existsObject</code> is a JS object whose properties map to the keys in <code>keyArray</code> and whose values are <code>true</code> if their associated keys exist and <code>false</code> otherwise. | |||
* <code>onError(errorMessage, keyArray)</code> | |||
''Return value'' | |||
This method has no return value. | |||
==== Enumerating Specific Items ==== | |||
<pre class="brush:js;toolbar:false;"> | |||
jetpack.storage.simple.forEachItem(keyArray, callback) | |||
</pre> | |||
''Arguments'' | |||
<code>keyArray</code>: An array of strings, each of which uniquely identifies data to retrieve from the store. | |||
<code>callback</code>: A callback. <code>onResult</code> and <code>onError</code> are called as follows: | |||
* <code>onResult(key, value)</code> | |||
** <code>onResult(key, value)</code> is called for each key given in <code>keyArray</code>. If a given key does not exist in the store, <code>value</code> will be <code>undefined</code>. Items are enumerated in the same order that their keys are given in <code>keyArray</code>. | |||
* <code>onResult(null, null)</code> | |||
** When all items are exhausted, <code>onResult(null, null)</code> is called to signal that enumeration is complete. | |||
* <code>onError(errorMessage, keyArray)</code> | |||
''Return value'' | |||
This method has no return value. | |||
==== Enumerating All Items ==== | |||
<pre class="brush:js;toolbar:false;"> | |||
jetpack.storage.simple.forEachItem(callback) | |||
</pre> | |||
''Arguments'' | |||
<code>callback</code>: A callback. <code>onResult</code> and <code>onError</code> are called as follows: | |||
* <code>onResult(key, value)</code> | |||
** <code>onResult(key, value)</code> is called for each key-value pair in the store. The order of enumeration is arbitrary. | |||
* <code>onResult(null, null)</code> | |||
** When all items are exhausted, <code>onResult(null, null)</code> is called to signal that enumeration is complete. | |||
* <code>onError(errorMessage)</code> | |||
''Return value'' | ''Return value'' | ||
This | This method has no return value. | ||
==== Enumerating Keys ==== | |||
<pre class="brush:js;toolbar:false;"> | |||
jetpack.storage.simple.forEachKey(callback) | |||
</pre> | |||
''Arguments'' | |||
<code>callback</code>: A callback. <code>onResult</code> and <code>onError</code> are called as follows: | |||
* <code>onResult(key)</code> | |||
** <code>onResult(key)</code> is called for each key in the store. The order of enumeration is arbitrary. | |||
* <code>onResult(null)</code> | |||
** When all keys are exhausted, <code>onResult(null)</code> is called to signal that enumeration is complete. | |||
* <code>onError(errorMessage)</code> | |||
''Return value'' | |||
This method has no return value. | |||
==== Enumerating Specific Values ==== | |||
<pre class="brush:js;toolbar:false;"> | |||
jetpack.storage.simple.forEachValue(keyArray, callback) | |||
</pre> | |||
''Arguments'' | |||
<code>keyArray</code>: An array of strings, each of which uniquely identifies data to retrieve from the store. | |||
<code>callback</code>: A callback. <code>onResult</code> and <code>onError</code> are called as follows: | |||
* <code>onResult(value)</code> | |||
** <code>onResult(value)</code> is called for each key given in <code>keyArray</code>. If a given key does not exist in the store, <code>value</code> will be <code>undefined</code>. Values are enumerated in the same order that their keys are given in <code>keyArray</code>. | |||
* <code>onResult(null)</code> | |||
** When all values are exhausted, <code>onResult(null)</code> is called to signal that enumeration is complete. | |||
* <code>onError(errorMessage, keyArray)</code> | |||
''Return value'' | |||
This method has no return value. | |||
==== Enumerating All Values ==== | |||
<pre class="brush:js;toolbar:false;"> | |||
jetpack.storage.simple.forEachValue(callback) | |||
</pre> | |||
''Arguments'' | |||
<code>callback</code>: A callback. <code>onResult</code> and <code>onError</code> are called as follows: | |||
* <code>onResult(value)</code> | |||
** <code>onResult(value)</code> is called for each value in the store. The order of enumeration is arbitrary. | |||
* <code>onResult(null)</code> | |||
** When all values are exhausted, <code>onResult(null)</code> is called to signal that enumeration is complete. | |||
* <code>onError(errorMessage)</code> | |||
''Return value'' | |||
This method has no return value. | |||
==== Retrieving All Keys ==== | |||
<pre class="brush:js;toolbar:false;"> | |||
jetpack.storage.simple.keys(callback) | |||
</pre> | |||
''Arguments'' | |||
<code>callback</code>: A callback. <code>onResult</code> and <code>onError</code> are called as follows: | |||
* <code>onResult(keyArray)</code> | |||
** <code>keyArray</code> contains all the keys of the store in an unordered array. | |||
* <code>onError(errorMessage)</code> | |||
''Return value'' | |||
This method has no return value. | |||
==== Retrieving All Values ==== | |||
<pre class="brush:js;toolbar:false;"> | |||
jetpack.storage.simple.values(callback) | |||
</pre> | |||
''Arguments'' | |||
<code>callback</code>: A callback. <code>onResult</code> and <code>onError</code> are called as follows: | |||
* <code>onResult(valueArray)</code> | |||
** <code>valueArray</code> contains all the values of the store in an unordered array. | |||
* <code>onError(errorMessage)</code> | |||
''Return value'' | |||
This method has no return value. | |||
==== Retrieving the Number of Items ==== | |||
<pre class="brush:js;toolbar:false;"> | |||
jetpack.storage.simple.size(callback) | |||
</pre> | |||
''Arguments'' | |||
<code>callback</code>: A callback. <code>onResult</code> and <code>onError</code> are called as follows: | |||
* <code>onResult(numItems)</code> | |||
** <code>numItems</code> is the number of key-value pairs in the store. | |||
* <code>onError(errorMessage)</code> | |||
''Return value'' | |||
This method has no return value. | |||
==== Errors and Legal Keys and Values ==== | |||
A key must be a string. The empty string is a legal key. If an illegal key is passed to any method, that method will throw an <code>IllegalKeyError</code>. The prototype of <code>IllegalKeyError</code> is <code>TypeError</code>. | |||
A value must be a non-null JS primitive or JSON-able object. If an illegal value is passed to any method, that method will throw an <code>IllegalValueError</code>. The prototype of <code>IllegalValueError</code> is <code>TypeError</code>. | |||
Because of the polymorphic nature of this API, if any method is passed an unexpected argument, that method will throw an <code>ArgumentError</code>. The prototype of <code>ArgumentError</code> is <code>TypeError</code>. | |||
==== Other Notes ==== | ==== Other Notes ==== | ||