diff --git a/docs/client/api.html b/docs/client/api.html
index 38b583df43..1e985aa502 100644
--- a/docs/client/api.html
+++ b/docs/client/api.html
@@ -953,10 +953,9 @@ order of the documents in the result set. They are more efficient than
Before `observe` returns, `added` (or `addedAt`) will be called zero
or more times to deliver the initial results of the query.
-`observe` returns a live query handle, which is an object with a
-`stop` method. Call this function with no arguments to stop calling
-the callback functions and tear down the query. **The query will run
-forever until you call this.**
+`observe` returns a live query handle, which is an object with a `stop` method.
+Call `stop` with no arguments to stop calling the callback functions and tear
+down the query. **The query will run forever until you call this.**
{{> api_box cursor_observe_changes}}
@@ -1004,10 +1003,9 @@ The document identified by `id` was removed from the result set.
Before `observeChanges` returns, `added` (or `addedBefore`) will be called
zero or more times to deliver the initial results of the query.
-`observeChanges` returns a live query handle, which is an object with
-a `stop` method. Call this function with no arguments to stop calling
-the callback functions and tear down the query. **The query will run
-forever until you call this.**
+`observeChanges` returns a live query handle, which is an object with a `stop`
+method. Call `stop` with no arguments to stop calling the callback functions
+and tear down the query. **The query will run forever until you call this.**
{{#note}}
Unlike `observe`, `observeChanges` does not provide absolute position
@@ -2480,7 +2478,8 @@ When you add a type to EJSON, Meteor will be able to use that type in:
MongoDB cannot store most user-defined types natively on the server. Your
type will work in Minimongo, and you can send it to the client using a custom
- publisher, but MongoDB only knows about the types defined in [BSON](http://bsonspec.org/).
+ publisher, but MongoDB can only store the types defined in
+ [BSON](http://bsonspec.org/).
{{/note}}
diff --git a/docs/client/api.js b/docs/client/api.js
index fc23118bdb..c58142f6d6 100644
--- a/docs/client/api.js
+++ b/docs/client/api.js
@@ -71,7 +71,7 @@ Template.api.ejsonParse = {
name: "EJSON.parse(str)",
locus: "Anywhere",
args: [ {name: "str", type: "String", descr: "A string to parse into an EJSON value."} ],
- descr: ["Parse a string into an EJSON value."]
+ descr: ["Parse a string into an EJSON value. Throws an error if the string is not valid EJSON."]
},
Template.api.ejsonStringify = {
@@ -79,7 +79,9 @@ Template.api.ejsonStringify = {
name: "EJSON.stringify(val)",
locus: "Anywhere",
args: [ {name: "val", type: "EJSON-compatible value", descr: "A value to stringify."} ],
- descr: ["Serialize an object to a string."]
+ descr: ["Serialize a value to a string.\n\nFor EJSON values, the serialization " +
+ "fully represents the value. For non-EJSON values, serializes the " +
+ "same way as `JSON.stringify`."]
},
diff --git a/packages/ejson/base64.js b/packages/ejson/base64.js
index 7eaf2fcc53..78dc411af0 100644
--- a/packages/ejson/base64.js
+++ b/packages/ejson/base64.js
@@ -7,7 +7,7 @@ var BASE_64_CHARS = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456
var BASE_64_VALS = {};
for (var i = 0; i < BASE_64_CHARS.length; i++) {
- BASE_64_VALS[BASE_64_CHARS.substr(i, 1)] = i;
+ BASE_64_VALS[BASE_64_CHARS.charAt(i)] = i;
};
EJSON._base64Encode = function (array) {
@@ -54,7 +54,7 @@ EJSON._base64Encode = function (array) {
};
var getChar = function (val) {
- return BASE_64_CHARS.substr(val, 1);
+ return BASE_64_CHARS.charAt(val);
};
var getVal = function (ch) {
@@ -78,9 +78,9 @@ EJSON.newBinary = function (len) {
EJSON._base64Decode = function (str) {
var len = Math.floor((str.length*3)/4);
- if (str.substr(str.length - 1) == '=') {
+ if (str.charAt(str.length - 1) == '=') {
len--;
- if (str.substr(str.length - 2, 1) == '=')
+ if (str.charAt(str.length - 2) == '=')
len--;
}
var arr = EJSON.newBinary(len);
@@ -92,7 +92,7 @@ EJSON._base64Decode = function (str) {
var j = 0;
for (var i = 0; i < str.length; i++) {
- var c = str.substr(i, 1);
+ var c = str.charAt(i);
var v = getVal(c);
switch (i % 4) {
case 0:
diff --git a/packages/livedata/DDP.md b/packages/livedata/DDP.md
index 164f34d085..dc59ece7c9 100644
--- a/packages/livedata/DDP.md
+++ b/packages/livedata/DDP.md
@@ -156,7 +156,8 @@ the server having been upgraded.
example, if subscription A says document `x` has fields `{foo: 1, bar: 2}`
and subscription B says document `x` has fields `{foo: 1, baz:3}`, then the
client will be informed that document `x` has fields `{foo: 1, bar: 2, baz:
- 3}`
+ 3}`. If field values from different subscriptions conflict with each other,
+ the server should send one of the possible field values.
* When one or more subscriptions have finished sending their initial batch of
data, the server will send a `ready` message with their IDs.
@@ -234,7 +235,9 @@ supports all types built into JSON as plain JSON, plus the following:
{"$binary": BASE_64_STRING}
-Escaped things that might otherwise look like EJSON types:
+(The base 64 string has `+` and `/` as characters 62 and 63, and has no maximum line length)
+
+**Escaped things** that might otherwise look like EJSON types:
{"$escape": THING}
@@ -252,4 +255,8 @@ to a Date object:
{"$type": TYPENAME, "$value": VALUE}
-Implementations of EJSON should try to preserve key order where they can.
+Implementations of EJSON should try to preserve key order where they can. Users
+of EJSON should not rely on key order, if possible.
+
+> MongoDB relies on key order. When using EJSON with MongoDB, the
+> implementation of EJSON must preserve key order.
diff --git a/packages/livedata/livedata_server.js b/packages/livedata/livedata_server.js
index 288daaf08a..2bafd5952f 100644
--- a/packages/livedata/livedata_server.js
+++ b/packages/livedata/livedata_server.js
@@ -7,6 +7,8 @@ var Fiber = __meteor_bootstrap__.require('fibers');
(function () {
+
+// Represents a single document in a SessionCollectionView
Meteor._SessionDocumentView = function () {
var self = this;
self.existsIn = {}; // set of subscriptionHandle
@@ -88,6 +90,7 @@ _.extend(Meteor._SessionDocumentView.prototype, {
}
});
+// Represents a client's view of a single collection
Meteor._SessionCollectionView = function (collectionName, sessionCallbacks) {
var self = this;
self.collectionName = collectionName;
diff --git a/packages/minimongo/diff.js b/packages/minimongo/diff.js
index 9da981e243..32d94ba7e7 100644
--- a/packages/minimongo/diff.js
+++ b/packages/minimongo/diff.js
@@ -23,7 +23,6 @@ LocalCollection._diffQueryUnorderedChanges = function (oldResults, newResults,
throw new Error("_diffQueryUnordered called with a moved observer!");
}
- // "maybe deepcopy"
_.each(newResults, function (newDoc) {
if (_.has(oldResults, newDoc._id)) {
var oldDoc = oldResults[newDoc._id];