From e0c653bebb3aba4eb8922df8b30ad2c7ab8d8052 Mon Sep 17 00:00:00 2001 From: denihs Date: Tue, 18 Oct 2022 15:29:21 -0300 Subject: [PATCH] Updating migration guide --- guide/source/2.8-migration.md | 82 ++++++++++++++++++- .../.npm/package/npm-shrinkwrap.json | 41 ++++++---- 2 files changed, 101 insertions(+), 22 deletions(-) diff --git a/guide/source/2.8-migration.md b/guide/source/2.8-migration.md index bc9c96f09e..376ee4f88b 100644 --- a/guide/source/2.8-migration.md +++ b/guide/source/2.8-migration.md @@ -78,12 +78,42 @@ Meteor.callAsync('removeByIDAsync', { id }).then(result => { More examples can be retrieved from [this commit](https://github.com/fredmaiaarantes/simpletasks/compare/main...mongodb-async-api). +

The new callAsync

+ +As said before, the `callAsync` should be used to call async methods. + +We do not consider this version of the `callAsync` as the final product. It has its limitations when your methods have a [stub](https://docs.meteor.com/api/methods.html#:~:text=was%20received%20on.-,Calling,and%20you%E2%80%99ll%20have%20to%20wait%20for%20the%20results%20from%20the%20server.,-If%20you%20do), and it should be used where you know it won't affect other parts of your application. + +We'll continue working on it to find a solution where these limitations don't exist. +

The callAsync limitations

-You should never call a method if another method is still running, you need to be sure that only one method is running each time. So, for example: +If you have two methods with a [stub](https://docs.meteor.com/api/methods.html#:~:text=was%20received%20on.-,Calling,and%20you%E2%80%99ll%20have%20to%20wait%20for%20the%20results%20from%20the%20server.,-If%20you%20do), you should never call the second method if the stub of the first one is still running. You need to be sure that only one stub is running each time. So, for example: ```js -// This is ok: +// This is ok, because methodWithoutStubAsync and methodWithoutStub +// does not have a stub inside them: +Meteor.callAsync('methodWithoutStubAsync', { id }).then(result => { + // do something +}); + +Meteor.call('methodWithoutStub', { id }, (error, result) => { + // do something +}) + +// This is ok as well, because even though removeByIDAsync has a stub, +// methodWithoutStub does not have one, so both methods can run +// at the same time: +Meteor.callAsync('removeByIDAsync', { id }).then(result => { + // do something +}); +Meteor.call('methodWithoutStub', { id }, (error, result) => { + // do something +}) + +// This is also ok, because even though removeByID has a stub +// (SomeCollection.remove({ _id: id })), it is a sync method, +// so by the time removeByIDAsync runs, not stub will be running: Meteor.call('removeByID', { id }, (error, result) => { // do something @@ -92,8 +122,8 @@ Meteor.callAsync('removeByIDAsync', { id }).then(result => { // do something }); -// This is NOT ok: +// But, this is NOT ok, because you would have two alive stubs at the same time: Meteor.callAsync('removeByIDAsync', { id }).then(result => { // do something }); @@ -118,10 +148,12 @@ Meteor.callAsync('removeByIDAsync', { id }).then(result => { }); ``` -As `callAsync` returns a promise, it'll be solved in the future. So you need to wait until it finishes before calling another method (async or not). +As `callAsync` returns a promise, it'll be solved in the future. So you need to wait until it finishes before calling another method (async or not), if the other method has a stub. > If you wish to understand why this limitation exist, you can read [this comment](https://github.com/meteor/meteor/pull/12196#issue-1386273927) in the PR that created the `callAsync`. +

Calling an async method with `Meteor.call` and vice versa

+ It's also important to understand what will happen if you call an async method with `Meteor.call`, and vice versa. If you can an async method with `Meteor.call` in the client, and you don't have the package `insecure` on your project, an error like this will be thrown: @@ -136,10 +168,52 @@ In the server it's fine to call an async method using `Meteor.call()`. About `Meteor.callAsync()`, is fine to call it with a sync method either from the client or server. + +

In what cases using this could be a problem

+ +Right now it's hard to say. Meteor can be used in many ways. But one case we can see will be pretty common, it's when you have two different components that call two methods, like so: + +```jsx +// this is a React example +const MyComponent1 = () => { + ... + // If the user do not type anything in 5 seconds + // set its status to offile + useEffect(() => { + const interval = setInterval(() => { + const now = new Date(); + const timeWithoutTexting = now.getTime() - lastType.getTime(); + if (isUserOn && timeWithoutTexting >= 5000) { + Meteor.callAsync("changeUserStatus", 'OFFLINE'); + } + }, 1000); + return () => clearInterval(interval); + }, [isUserOn, lastTyped]); + + return
+ { + // Every time the use type something, save the value in database, + // change the user status to online, and set a new lastTyped: + await Meteor.callAsync("updateText", value); + if (userStatus === 'OFFLINE') { + Meteor.callAsync("changeUserStatus", 'ONLINE'); + } + setLastTyped(new Date()); + }}/> +
+} +``` + +To summarize this example, every time the user types something, a method is called to save the new value in the database, and change another one to change their status if they were offline. A job will also check every second if the user didn't type anything in the last 5 seconds. + +In this example, depending on how fast the user types, you could end up calling both methods at the same time or calling one of them while the stub of another is still alive. Meaning that your code won't work property. +

Our recommendation for the future

We recommend that you start to write new methods and publications using async from this version forward, forcing internal APIs to also be async with time. And, of course, also updating your current ones. As soon you start, the better. +But do it with caution, and keeping in mind the cases mentioned above. +

Can I update to this version without changing my app?

Yes. You can update to this version without changing your app. diff --git a/packages/minifier-css/.npm/package/npm-shrinkwrap.json b/packages/minifier-css/.npm/package/npm-shrinkwrap.json index f267ad83cb..d1ded8a586 100644 --- a/packages/minifier-css/.npm/package/npm-shrinkwrap.json +++ b/packages/minifier-css/.npm/package/npm-shrinkwrap.json @@ -62,9 +62,9 @@ "integrity": "sha512-bsTwuIg/BZZK/vreVTYYbSWoe2F+71P7K5QGEX+pT250DZbfU1MQ5prOKpPR+LL6uWKK3KMwMCAS74QB3Um1uw==" }, "caniuse-lite": { - "version": "1.0.30001409", - "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001409.tgz", - "integrity": "sha512-V0mnJ5dwarmhYv8/MzhJ//aW68UpvnQBXv8lJ2QUsvn2pHcmAuNtu8hQEDz37XnA1iE+lRR9CIfGWWpgJ5QedQ==" + "version": "1.0.30001420", + "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001420.tgz", + "integrity": "sha512-OnyeJ9ascFA9roEj72ok2Ikp7PHJTKubtEJIQ/VK3fdsS50q4KWy+Z5X0A1/GswEItKX0ctAp8n4SYDE7wTu6A==" }, "chalk": { "version": "2.4.2", @@ -264,9 +264,9 @@ "integrity": "sha512-QM8q3zDe58hqUqjraQOmzZ1LIH9SWQJTlEKCH4kJ2oQvLZk7RbQXvtDM2XEq3fwkV9CCvvH4LA0AV+ogFsBM2Q==" }, "electron-to-chromium": { - "version": "1.4.257", - "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.4.257.tgz", - "integrity": "sha512-C65sIwHqNnPC2ADMfse/jWTtmhZMII+x6ADI9gENzrOiI7BpxmfKFE84WkIEl5wEg+7+SfIkwChDlsd1Erju2A==" + "version": "1.4.283", + "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.4.283.tgz", + "integrity": "sha512-g6RQ9zCOV+U5QVHW9OpFR7rdk/V7xfopNXnyAamdpFgCHgZ1sjI8VuR1+zG2YG/TZk+tQ8mpNkug4P8FU0fuOA==" }, "entities": { "version": "2.2.0", @@ -279,9 +279,9 @@ "integrity": "sha512-7dFHNmqeFSEt2ZBsCriorKnn3Z2pj+fd9kmI6QoWw4//DL+icEBfc0U7qJCisqrTsKTjw4fNFy2pW9OqStD84g==" }, "es-abstract": { - "version": "1.20.2", - "resolved": "https://registry.npmjs.org/es-abstract/-/es-abstract-1.20.2.tgz", - "integrity": "sha512-XxXQuVNrySBNlEkTYJoDNFe5+s2yIOpzq80sUHEdPdQr0S5nTLz4ZPPPswNIpKseDDUS5yghX1gfLIHQZ1iNuQ==" + "version": "1.20.4", + "resolved": "https://registry.npmjs.org/es-abstract/-/es-abstract-1.20.4.tgz", + "integrity": "sha512-0UtvRN79eMe2L+UNEF1BwRe364sj/DXhQ/k5FmivgoSdpM90b8Jc0mDzKMGo7QS0BVbOP/bTwBKNnDc9rNzaPA==" }, "es-array-method-boxes-properly": { "version": "1.0.0", @@ -414,9 +414,9 @@ "integrity": "sha512-gDYaKHJmnj4aWxyj6YHyXVpdQawtVLHU5cb+eztPGczf6cjuTdwve5ZIEfgXqH4e57An1D1AKf8CZ3kYrQRqYA==" }, "is-callable": { - "version": "1.2.6", - "resolved": "https://registry.npmjs.org/is-callable/-/is-callable-1.2.6.tgz", - "integrity": "sha512-krO72EO2NptOGAX2KYyqbP9vYMlNAXdB53rq6f8LXY6RY7JdSR/3BD6wLUlPHSAesmY9vstNrjvqGaCiRK/91Q==" + "version": "1.2.7", + "resolved": "https://registry.npmjs.org/is-callable/-/is-callable-1.2.7.tgz", + "integrity": "sha512-1BC0BVFhS/p0qtw6enp8e+8OD0UrK0oFLztSjNzhcKA3WDuJxxAPXzPuPtKkjEY9UUoEWlX/8fgKeu2S8i9JTA==" }, "is-color-stop": { "version": "1.1.0", @@ -504,9 +504,9 @@ "integrity": "sha512-iV3XNKw06j5Q7mi6h+9vbx23Tv7JkjEVgKHW4pimwyDGWm0OIQntJJ+u1C6mg6mK1EaTv42XQ7w76yuzH7M2cA==" }, "minimist": { - "version": "1.2.6", - "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.6.tgz", - "integrity": "sha512-Jsjnk4bw3YJqYzbdyBiNsPWHPfO++UGG749Cxs6peCu5Xg4nrena6OVxOYxrQTqww0Jmwt+Ref8rggumkTLz9Q==" + "version": "1.2.7", + "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.7.tgz", + "integrity": "sha512-bzfL1YUZsP41gmu/qjrEk0Q6i2ix/cVeAhbCbqH9u3zYutS1cLg00qhrD0M2MVdCcx4Sc0UpP2eBWo9rotpq6g==" }, "mkdirp": { "version": "0.5.6", @@ -1162,6 +1162,11 @@ "resolved": "https://registry.npmjs.org/rgba-regex/-/rgba-regex-1.0.0.tgz", "integrity": "sha512-zgn5OjNQXLUTdq8m17KdaicF6w89TZs8ZU8y0AYENIU6wG8GG6LLm0yLSiPY8DmaYmHdgRW8rnApjoT0fQRfMg==" }, + "safe-regex-test": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/safe-regex-test/-/safe-regex-test-1.0.0.tgz", + "integrity": "sha512-JBUUzyOgEwXQY1NuPtvcj/qcBDbDmEvWufhlnXZIm75DEHp+afM1r1ujJpJsV/gSM4t59tpDyPi1sd6ZaPFfsA==" + }, "sax": { "version": "1.2.4", "resolved": "https://registry.npmjs.org/sax/-/sax-1.2.4.tgz", @@ -1272,9 +1277,9 @@ "integrity": "sha512-vRCqFv6UhXpWxZPyGDh/F3ZpNv8/qo7w6iufLpQg9aKnQ71qM4B5KiI7Mia9COcjEhrO9LueHpMYjYzsWH3OIg==" }, "update-browserslist-db": { - "version": "1.0.9", - "resolved": "https://registry.npmjs.org/update-browserslist-db/-/update-browserslist-db-1.0.9.tgz", - "integrity": "sha512-/xsqn21EGVdXI3EXSum1Yckj3ZVZugqyOZQ/CxYPBD/R+ko9NSUScf8tFF4dOKY+2pvSSJA/S+5B8s4Zr4kyvg==" + "version": "1.0.10", + "resolved": "https://registry.npmjs.org/update-browserslist-db/-/update-browserslist-db-1.0.10.tgz", + "integrity": "sha512-OztqDenkfFkbSG+tRxBeAnCVPckDBcvibKd35yDONx6OU8N7sqgwc7rCbkJ/WcYtVRZ4ba68d6byhC21GFh7sQ==" }, "util-deprecate": { "version": "1.0.2",