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];