Azure / azure-sdk-for-js

This repository is for active development of the Azure SDK for JavaScript (NodeJS & Browser). For consumers of the SDK we recommend visiting our public developer docs at https://docs.microsoft.com/javascript/azure/ or our versioned developer docs at https://azure.github.io/azure-sdk-for-js.
MIT License
2.09k stars 1.2k forks source link

Support for using sdk in React-Native #5771

Closed ehvattum closed 7 months ago

ehvattum commented 5 years ago

My issue is regards to blob storage, but is suspect the issue is universal to the sdk.

It is impossible to use this client, or to generate a working client from the spec that can run in react native.

There are always incompatible dependencies included, especially from this projects' core-http. Compounding the problem: the spec is not valid swagger, so using a different generator does not work at all.

Updates:

ramya-rao-a commented 5 years ago

Thanks for reporting @ehvattum

Can you elaborate on the kind of incompatible dependencies that you have encountered when using the libraries that depend on core-http?

Or if you can point us to a sample app using react-native and say the blob library with steps to replicate the problem, that would be helpful too.

ehvattum commented 5 years ago

@ramya-rao-a Issue updated: This is a related issue: #4917 - mentions xmlbuilder and xml2js as examples.

AndriiDidkivsky commented 4 years ago

Is there any updates/plans on this issue ?

jeremymeng commented 4 years ago

@AndriiDidkivsky sorry we don't have any concrete plan yet on the timeline. We know that one of our dependencies xml2js has circular dependency issue which prevents it from being used in reactive-native. However, we don't yet have a replacement xml parser. We are also working on separating out the xml parser dependency to a separate package, so it would not cause problems for users that don't depend on storage. Again, no ETA yet on when that would be available.

sabrimev commented 4 years ago

I am receiving this error while bundling the react native project. Sharing this as it may help for integration.

error: Error: While trying to resolve module@azure/loggerfrom fileC:\Users\xxx\source\xxx\node_modules\@azure\storage- blob\dist\index.js, the packageC:\Users\xxx\source\xxx\node_modules\@azure\logger\package.jsonwas successfully found. H owever, this package itself specifies amainmodule field that could not be resolved (C:\Users\xxx\source\xxx\node_module s\@azure\logger\browser\logger.js`. Indeed, none of these files exist:

ewfian commented 4 years ago

@jeremymeng Is there any new update? I saw it was tagged with milestones.

chradek commented 3 years ago

I've been investigating what it would take to support react native with our SDKs today and with some changes I've been able to use some @azure/storage-blob and @azure/app-configuration APIs.

Here's what I've found so far.

package.json#react-native field

The react native bundler (metro) respects the browser and react-native mappings in package.json, but does not look at the module field. This means that for packages that have runtime specific logic (which is most of them), we need to at a minimum include a mapping from main to module. In practice this looks like:

{
  "react-native": {
    "./dist/index.js": "./dist-esm/src/index.js"
  }
}

Lack of Node.js and Browser APIs

react native uses JavaScriptCore for executing JavaScript code, and includes shims for a few APIs like fetch and XMLHttpRequest. However, it does not expose APIs like crypto, Text(Encoder|Decoder), or atob/btoa. It also doesn't include any node.js modules.

This means we really need to treat react native as a 3rd runtime, and many places where we have node and browser files today, we may need a react-native version as well.

crypto

The @azure/cosmos library uses isomorphic-webcrypto when running in react-native, and requires the user to install it themselves. This may be something we can depend on for our libraries that require signing (e.g. AppConfiguration).

DOMParser

React Native doesn't provide a way to build or parse XML. In node.js we use xml2js to handle building and parsing XML, but this package doesn't work in react native because it depends on some native node modules.

I did find another library - xmldom that exposes DOMParser and XMLSerializer with APIs that match those found in browsers, but it has not yet reached version 1.0.0. It has some subtle differences from the DOMParser in browsers, and doesn't expose everything that'd be nice to have as part of its public API (e.g. enums.) However I was able to get it working with storage-blob with some minor changes to the browser version of the xml utilities.

base64

React Native doesn't include a utility to do base64 encoding/decoding (e.g. atob/btoa). It appears that they used to have a utility package that was removed sometime prior to 0.60.x. However this can be solved by relying on the buffer module much like we do for browser builds.

Lack of some language-level features

for...await

The react-native toolchain handles TypeScript compilation itself. It currently lacks support for for...await loops, so operations that return AsyncIterableIterators can't be looped over this way. They do still work if you call next on the iterator. There may be a way to configure either the metro bundler or babel to support for...await but this is not strictly an SDK issue (since users can't write code that uses for...await.)

Authentication

Currently the credentials available in @azure/identity won't work in react-native and msal does not (yet?) support react-native either.

It is possible to use the react-native-app-auth package and create a custom TokenCredential to use with our packages.

Rough example:

import { authorize } from "react-native-app-auth";
import { TokenCredential } from "@azure/core-auth";

export class ReactNativeAadTokenCredential implements TokenCredential {
  constructor(private clientId: string, private redirectUrl: string, private tenant: string) {}

  getToken(scopes: string | string[]) {
    if (!Array.isArray(scopes)) {
      scopes = [scopes];
    }
    return authorize({
      clientId: this.clientId,
      redirectUrl: this.redirectUrl,
      issuer: `https://login.microsoftonline.com/${tenant}/v2.0`,
      scopes: scopes,
    }).then((result) => {
      const expiry = new Date(result.accessTokenExpirationDate).getTime();
      return {
        token: result.accessToken,
        expiresOnTimestamp: expiry,
      };
    });
  }
}

AMQP

Currently the biggest blocker for AMQP-based services (service-bus/event-hubs) is lack of react-native support in rhea. More investigation is needed here.

yahorsi commented 3 years ago

Today we've got such a bad surprise when realized generated by the Autorest client does not work on the react-native ((

Taking in to account how popular react-native it can have higher priority, but, since it's hanging from 2019 I think we have no chance ((

ramya-rao-a commented 3 years ago

Thanks for sharing the feedback @yahorsi!

@chradek had taken some initial steps towards this in this semester, see #13232, but I agree that we did not get time to do anything more that. We are investing more time in this in the new semester (July-Dec 2021) and you should see more progress here.

prakashbask commented 3 years ago

@chradek I am looking to use @azure/app-configuration in react-native. You have mentioned that you are able to get it working. Are these changes available in any release? I used used version 1.3.0 of @azure/app-configuration. However, I get issue with resolving node modules like 'crypto', 'http', 'https', etc.

egemenuzunali commented 2 years ago

Hi All, is there any update on this matter? The milestone keeps being pushed forward since 2019, is there any progress?

jeremymeng commented 2 years ago

@prakashbask @egemenuzunali we were able to use app-configure in a proof-of-concept prototype. I plan to look into this issue in February and will update here.

egemenuzunali commented 2 years ago

@jeremymeng amazing!! Thanks for the insights

jeremymeng commented 2 years ago

@egemenuzunali just an update. I am waiting for the work to move app-configuration to our newer version of core libraries #https://github.com/Azure/azure-sdk-for-js/issues/15809 first which should remove the need of hacky workaround. I should have an update before April.

egemenuzunali commented 2 years ago

@jeremymeng Thanks a lot for the update 👍 , looking forward to taking it for a spin here at the Municipality of Amsterdam.

jeremymeng commented 2 years ago

Some (late) updates: at this time, I was able to run some samples of Storage blob/file share/file datalake/queue, Text Analytics, App Configuration, Data Tables in a React Native Expo project on the Android Emulator. Connection Strings/keys are used in testing. @azure/identity does not work at the moment. However, if an AAD access token is available via third party plugins/libraries, they can be used via a wrapper credential that implements the TokenCredential interface

For reference, if anyone is interested to give a try:

jeremymeng commented 2 years ago

@prakashbask @egemenuzunali Please see this PR for a react-native (Expo) sample of using AppConfig SDK https://github.com/Azure/azure-sdk-for-js/pull/21907

yahorsi commented 2 years ago

any news?

thank you

jeremymeng commented 2 years ago

@yahorsi which package(s) are you trying to use in react-native?

jeremymeng commented 1 year ago

Update: I just merged PR https://github.com/Azure/azure-sdk-for-js/pull/23610, which adds a sample showing Event Hubs and Service Bus JS SDK usage in React-Native.

Now we have samples show the usage of

AndriiDidkivsky commented 1 year ago

Great, will check and migrate to SDK in the next App release if everything is ok

github-actions[bot] commented 7 months ago

Hi @ehvattum, we deeply appreciate your input into this project. Regrettably, this issue has remained inactive for over 2 years, leading us to the decision to close it. We've implemented this policy to maintain the relevance of our issue queue and facilitate easier navigation for new contributors. If you still believe this topic requires attention, please feel free to create a new issue, referencing this one. Thank you for your understanding and ongoing support.