diff --git a/packages/ddp-client/client/queueStubsHelpers.js b/packages/ddp-client/client/queueStubsHelpers.js index aba0358400..bb649f81af 100644 --- a/packages/ddp-client/client/queueStubsHelpers.js +++ b/packages/ddp-client/client/queueStubsHelpers.js @@ -224,15 +224,19 @@ export const loadAsyncStubHelpers = () => { }; let oldSend = Connection.prototype._send; - Connection.prototype._send = function () { - if (!queueSend) { + Connection.prototype._send = function (params, shouldQueue) { + if (this._stream._neverQueued) { return oldSend.apply(this, arguments); } + if (!queueSend && !shouldQueue) { + return oldSend.call(this, params); + } + queueSend = false; queueFunction((resolve) => { try { - oldSend.apply(this, arguments); + oldSend.call(this, params); } finally { resolve(); } diff --git a/packages/ddp-client/common/livedata_connection.js b/packages/ddp-client/common/livedata_connection.js index b5c406c7a5..ac1d168420 100644 --- a/packages/ddp-client/common/livedata_connection.js +++ b/packages/ddp-client/common/livedata_connection.js @@ -456,7 +456,7 @@ export class Connection { this.ready && this.readyDeps.changed(); }, stop() { - this.connection._send({ msg: 'unsub', id: id }); + this.connection._sendQueued({ msg: 'unsub', id: id }); this.remove(); if (callbacks.onStop) { @@ -1031,6 +1031,13 @@ export class Connection { this._stream.send(DDPCommon.stringifyDDP(obj)); } + // Always queues the call before sending the message + // Used, for example, on subscription.[id].stop() to make sure a "sub" message is always called before an "unsub" message + // https://github.com/meteor/meteor/issues/13212 + _sendQueued(obj) { + this._send(obj, true); + } + // We detected via DDP-level heartbeats that we've lost the // connection. Unlike `disconnect` or `close`, a lost connection // will be automatically retried. diff --git a/packages/ddp-client/test/livedata_connection_tests.js b/packages/ddp-client/test/livedata_connection_tests.js index 1d20334e7b..b2f5fd647a 100644 --- a/packages/ddp-client/test/livedata_connection_tests.js +++ b/packages/ddp-client/test/livedata_connection_tests.js @@ -2509,6 +2509,47 @@ if (Meteor.isClient) { test.equal((await coll.findOneAsync('aaa')).method, 222); test.equal((await coll.findOneAsync('aaa')).subscription, 112); }); + + Tinytest.addAsync( + "livedata connection - make sure the sub and unsub run in the correct order", + async function (test, onComplete) { + const stream = new StubStream(); + // Make sure to disable this flag so the subscribe and unsubscribe are queued + stream._neverQueued = false; + const conn = newConnection(stream); + + const sub = conn.subscribe("test_data"); + + // the subscribe message is still in the queue + test.isFalse(conn._readyToMigrate()); + test.length(stream.sent, 0); + + // unsubscribe + sub.stop(); + + // the queue still holds the data and no message arrived yet + test.isFalse(conn._readyToMigrate()); + test.length(stream.sent, 0); + + // waits until the queue is empty + await waitUntil(conn._readyToMigrate); + + // the first message is the sub message + let subMessage = JSON.parse(stream.sent.shift()); + test.equal(subMessage, { + msg: "sub", + name: "test_data", + params: [], + id: subMessage.id, + }); + test.length(stream.sent, 1); + + // the second message is the unsub + subMessage = JSON.parse(stream.sent.shift()); + test.equal(subMessage, { msg: "unsub", id: subMessage.id }); + test.length(stream.sent, 0); + } + ); } // XXX also test: diff --git a/packages/deprecated/stylus/.npm/plugin/compileStylusBatch/npm-shrinkwrap.json b/packages/deprecated/stylus/.npm/plugin/compileStylusBatch/npm-shrinkwrap.json index 55fc3418b4..4bc9ce2a15 100644 --- a/packages/deprecated/stylus/.npm/plugin/compileStylusBatch/npm-shrinkwrap.json +++ b/packages/deprecated/stylus/.npm/plugin/compileStylusBatch/npm-shrinkwrap.json @@ -32,9 +32,9 @@ "integrity": "sha512-fKSWtyNQTclfi1A+s2KU91/r1mfANG1ZibxTdCwJGfV1J9UwcV22plFOm0wkaq4WzqW87zxiAkyp2Ho1Wn1NnA==" }, "caniuse-db": { - "version": "1.0.30001620", - "resolved": "https://registry.npmjs.org/caniuse-db/-/caniuse-db-1.0.30001620.tgz", - "integrity": "sha512-dYQIgCcUpy2l/IfiEA6xgNHCgr5jmDWF4i89MRv6DqCiEt4MNJguYsVeVZSxyqWfb8GfhWEZEMkjI3vhIYRrvw==" + "version": "1.0.30001640", + "resolved": "https://registry.npmjs.org/caniuse-db/-/caniuse-db-1.0.30001640.tgz", + "integrity": "sha512-K8/5iWoH/NULlqJz/iaopQJraQCHGcFGvs8dmTpAH7GyvoQu2Xq8ht3jq2c+wNck4bgQu/PHu2GN2mJfUj9qtw==" }, "concat-map": { "version": "0.0.1", @@ -47,9 +47,9 @@ "integrity": "sha512-OI38lO4JQQX2GSisTqwiSFxiWNmLajXdW4tCCxAuiwGKjusHALQadSHBSxGlU8lrFp47IkLuU2AfSYz31qpETQ==" }, "debug": { - "version": "4.3.4", - "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz", - "integrity": "sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==" + "version": "4.3.5", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.5.tgz", + "integrity": "sha512-pt0bNEmneDIvdL1Xsd9oDQ/wrQRkXDT4AUWlNZNPKvW5x/jyO9VFXkJUP07vQ2upmw5PlaITaPKc31jK13V+jg==" }, "fs.realpath": { "version": "1.0.0", diff --git a/packages/npm-mongo/.npm/package/npm-shrinkwrap.json b/packages/npm-mongo/.npm/package/npm-shrinkwrap.json index 9e5578d359..cdfcaed4e8 100644 --- a/packages/npm-mongo/.npm/package/npm-shrinkwrap.json +++ b/packages/npm-mongo/.npm/package/npm-shrinkwrap.json @@ -56,9 +56,9 @@ } }, "@aws-sdk/client-cognito-identity": { - "version": "3.613.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/client-cognito-identity/-/client-cognito-identity-3.613.0.tgz", - "integrity": "sha512-it0EObqPTyHjcSxIcY4d/FMcDemgoH1IU2BUpputWkTjiJrXitv6r1kZUGNhUsDnTyD3KEZEvh0/OkeNpXhEEA==" + "version": "3.609.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/client-cognito-identity/-/client-cognito-identity-3.609.0.tgz", + "integrity": "sha512-3kDTpia1iN/accayoH3MbZRbDvX2tzrKrBTU7wNNoazVrh+gOMS8KCOWrOB72F0V299l4FsfQhnl9BDMVrc1iw==" }, "@aws-sdk/client-sso": { "version": "3.609.0", @@ -66,14 +66,14 @@ "integrity": "sha512-gqXGFDkIpKHCKAbeJK4aIDt3tiwJ26Rf5Tqw9JS6BYXsdMeOB8FTzqD9R+Yc1epHd8s5L94sdqXT5PapgxFZrg==" }, "@aws-sdk/client-sso-oidc": { - "version": "3.613.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/client-sso-oidc/-/client-sso-oidc-3.613.0.tgz", - "integrity": "sha512-VINgHA30f6Itjtj6ZAxkx86XhyFYa7UBfv2Ju+9QGcAr2Y3HU+Mh9g6QaTwDqIM5QG6Pgss24NaAItWGJHFf5A==" + "version": "3.609.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/client-sso-oidc/-/client-sso-oidc-3.609.0.tgz", + "integrity": "sha512-0bNPAyPdkWkS9EGB2A9BZDkBNrnVCBzk5lYRezoT4K3/gi9w1DTYH5tuRdwaTZdxW19U1mq7CV0YJJARKO1L9Q==" }, "@aws-sdk/client-sts": { - "version": "3.613.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/client-sts/-/client-sts-3.613.0.tgz", - "integrity": "sha512-S+KvQI4XEivY3vyIY+IPY7Fw8vFvX/q3pkNC9qEhnAs+/w7vT6vhVBHsaugYVlsMuNtNvmyc8P+Q/gzOEtLCTw==" + "version": "3.609.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/client-sts/-/client-sts-3.609.0.tgz", + "integrity": "sha512-A0B3sDKFoFlGo8RYRjDBWHXpbgirer2bZBkCIzhSPHc1vOFHt/m2NcUoE2xnBKXJFrptL1xDkvo1P+XYp/BfcQ==" }, "@aws-sdk/core": { "version": "3.609.0", @@ -81,9 +81,9 @@ "integrity": "sha512-ptqw+DTxLr01+pKjDUuo53SEDzI+7nFM3WfQaEo0yhDg8vWw8PER4sWj1Ysx67ksctnZesPUjqxd5SHbtdBxiA==" }, "@aws-sdk/credential-provider-cognito-identity": { - "version": "3.613.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-cognito-identity/-/credential-provider-cognito-identity-3.613.0.tgz", - "integrity": "sha512-kyzVox9VzIqUmu0TDl+Xdu+qHz5lUyVsggmewbmhlsk3BwE30jojXS+sQGTUPoTKcipU7xGH2bSENwIc53JrZg==" + "version": "3.609.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-cognito-identity/-/credential-provider-cognito-identity-3.609.0.tgz", + "integrity": "sha512-BqrpAXRr64dQ/uZsRB2wViGKTkVRlfp8Q+Zd7Bc8Ikk+YXjPtl+IyWXKtdKQ3LBO255KwAcPmra5oFC+2R1GOQ==" }, "@aws-sdk/credential-provider-env": { "version": "3.609.0", @@ -91,19 +91,19 @@ "integrity": "sha512-v69ZCWcec2iuV9vLVJMa6fAb5xwkzN4jYIT8yjo2c4Ia/j976Q+TPf35Pnz5My48Xr94EFcaBazrWedF+kwfuQ==" }, "@aws-sdk/credential-provider-http": { - "version": "3.613.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-http/-/credential-provider-http-3.613.0.tgz", - "integrity": "sha512-MCiUFxowFzprzIXFXsqbp/3DViJ7nFmBW+XJkoRQWqNmThbkz/E8sb40WmL9UFdZHJph2KDjzABKYH5f0lHZaA==" + "version": "3.609.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-http/-/credential-provider-http-3.609.0.tgz", + "integrity": "sha512-GQQfB9Mk4XUZwaPsk4V3w8MqleS6ApkZKVQn3vTLAKa8Y7B2Imcpe5zWbKYjDd8MPpMWjHcBGFTVlDRFP4zwSQ==" }, "@aws-sdk/credential-provider-ini": { - "version": "3.613.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-ini/-/credential-provider-ini-3.613.0.tgz", - "integrity": "sha512-scHV7K0YpllYMWxPnqxssWU+7S3WNXH1m5Rw8Ax96pfcfnaoatiWXps2XSSdGlChdF9gNVnewjRKFOTLyyzdAw==" + "version": "3.609.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-ini/-/credential-provider-ini-3.609.0.tgz", + "integrity": "sha512-hwaBfXuBTv6/eAdEsDfGcteYUW6Km7lvvubbxEdxIuJNF3vswR7RMGIXaEC37hhPkTTgd3H0TONammhwZIfkog==" }, "@aws-sdk/credential-provider-node": { - "version": "3.613.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-node/-/credential-provider-node-3.613.0.tgz", - "integrity": "sha512-n3yd0CDuUKcQFhjRLAQfQpZyZ2ddrHC7QOKQqE+Fkx+Fs5zoG+NRLK1EBkBW/G9zk8Ck4+rG3OOI3CuNpJ2PCw==" + "version": "3.609.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-node/-/credential-provider-node-3.609.0.tgz", + "integrity": "sha512-4J8/JRuqfxJDGD9jTHVCBxCvYt7/Vgj2Stlhj930mrjFPO/yRw8ilAAZxBWe0JHPX3QwepCmh4ErZe53F5ysxQ==" }, "@aws-sdk/credential-provider-process": { "version": "3.609.0", @@ -121,9 +121,9 @@ "integrity": "sha512-U+PG8NhlYYF45zbr1km3ROtBMYqyyj/oK8NRp++UHHeuavgrP+4wJ4wQnlEaKvJBjevfo3+dlIBcaeQ7NYejWg==" }, "@aws-sdk/credential-providers": { - "version": "3.613.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/credential-providers/-/credential-providers-3.613.0.tgz", - "integrity": "sha512-HsE68oJuhh7w4AFWuXk1avWuKXUKsNLOakZ4SnejEl77iFA+NywsGt1nm4VI/zsnjln4qrL32OnJ1fX3K+Xt0Q==" + "version": "3.609.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/credential-providers/-/credential-providers-3.609.0.tgz", + "integrity": "sha512-bJKMY4QwRVderh8R2s9kukoZhuNZew/xzwPa9DRRFVOIsznsS0faAdmAAFrKb8e06YyQq6DiZP0BfFyVHAXE2A==" }, "@aws-sdk/middleware-host-header": { "version": "3.609.0",