
Research
Security News
Lazarus Strikes npm Again with New Wave of Malicious Packages
The Socket Research Team has discovered six new malicious npm packages linked to North Korea’s Lazarus Group, designed to steal credentials and deploy backdoors.
hyper-sdk-expo-plugin
Advanced tools
An Expo config plugin for automating Android & iOS integration changes for [`hyper-sdk-react`](https://www.npmjs.com/package/hyper-sdk-react) with apps using Expo.
An Expo config plugin for automating Android & iOS integration changes for hyper-sdk-react
with apps using Expo.
npm install hyper-sdk-expo-plugin
OR
yarn add hyper-sdk-expo-plugin
Note: Please install hyper-sdk-react
before doing this.
npm install hyper-sdk-react
Expo config plugin takes some parameters which are needed to setup hyper-sdk-react.
Add following parameters in app.json
{
"expo": {
// Others
"extra": {
// ...
"clientId": "<clientId shared by Juspay team>", // Mandatory
"hyperSDKVersion": "2.1.33", // Optional: Override for base SDK version present in plugin (the newer version among both would be considered)
"juspayMavenUrls": [
"https://maven.juspay.in/jp-build-packages/hyper-sdk/"
] // Optional
},
"plugins": [
// Other plugins
"hyper-sdk-expo-plugin"
]
// ...
}
}
The expo config plugin is configured to execute while running npx expo prebuild
OR npx expo prebuild --clean
Note: You must run npx expo prebuild --clean
after making any change in plugin parameters defined in app.json.
pod install
to install pods.Use APIs exposed by hyper-sdk-react
here
type HyperSdkReactType = {
HyperEvent: string;
preFetch(data: string): void;
createHyperServices(): void;
initiate(data: string): void;
process(data: string): void;
processWithActivity(data: string): void;
terminate(): void;
onBackPressed(): boolean;
isNull(): boolean;
isInitialised(): Promise<boolean>;
updateBaseViewController(): void;
};
const { HyperSdkReact } = NativeModules;
export default HyperSdkReact as HyperSdkReactType;
import HyperSdkReact from 'hyper-sdk-react';
To keep the SDK up to date with the latest changes, it is highly recommended to call preFetch
as early as possible. It takes a stringified JSON
as its argument.
HyperSdkReact.preFetch(JSON.stringify(preFetchPayload));
This method creates an instance of HyperServices
class in the React Bridge Module on which all the HyperSDK
APIs / methods are triggered. It internally uses the current activity as an argument.
Note: This method is mandatory and is required to call any other subsequent methods from HyperSDK
.
HyperSdkReact.createHyperServices();
This method should be called on the render of the host screen. This will boot up the SDK and start the Hyper engine. It takes a stringified JSON
as its argument which will contain the base parameters for the entire session and remains static throughout one SDK instance lifetime.
Initiate is an asynchronous call and its result (whether success or failure) is provided in the Hyper Event listener
, later discussed in step-4.
Note: It is highly recommended to initiate SDK from the order summary page (at least 5 seconds before opening your payment page) for seamless user experience.
HyperSdkReact.initiate(JSON.stringify(initiatePayload));
This API should be triggered for all operations required from HyperSDK
. The operation may be related to:
The result of the process call is provided in the Hyper Event listener
, later discussed in step-4.
HyperSdkReact.process(JSON.stringify(processPayload));
If any of the react-native library is impacting the UI/UX, please use processWithActivity
instead, which starts a new Activity for opening the Payment Page, isolated of react native.
HyperSdkReact.processWithActivity(JSON.stringify(processPayload));
Hyper SDK
Native Module will be emitting all the relevant events to JS via RCTDeviceEventEmitter
and JavaScript modules can then register to receive events by invoking addListener
on the NativeEventEmitter
class in the componentDidMount()
method with the event name 'HyperEvent'
(You can use the HyperSdkReact.HyperEvent
as well). The listener will return a stringified JSON
response (resp
).
The following events should be handled here:
show_loader
: To show a loader for the processing state.hide_loader
: To hide the previously shown loader.initiate_result
: Result of initiate done in step-2.process_result
: Result of the process operation done in step-3.Note: The listener can be removed when the React component unmounts in componentWillUnmount()
method.
componentDidMount() {
...
const eventEmitter = new NativeEventEmitter(NativeModules.HyperSdkReact);
this.eventListener = eventEmitter.addListener(HyperSdkReact.HyperEvent, (resp) => {
var data = JSON.parse(resp);
var event: string = data.event || '';
switch (event) {
case 'show_loader':
// show some loader here
break;
case 'hide_loader':
// hide the loader
break;
case 'initiate_result':
var payload = data.payload || {};
console.log('initiate_result: ', payload);
// merchant code
...
break;
case 'process_result':
var payload = data.payload || {};
console.log('process_result: ', payload);
// merchant code
...
break;
default:
console.log('Unknown Event', data);
}
...
});
...
}
componentWillUnmount() {
...
this.eventListener.remove();
...
}
Hyper SDK
internally uses an android fragment for opening the bank page and will need the control to hardware back press when the bank page is active. This can be done by invoking addEventListener
on the BackHandler
provided by React-Native.
If the blocking asynchronous call HyperSdkReact.onBackPressed()
returns true, Hyper SDK
will handle the back press, else merchant can handle it.
Note: HyperSdkReact.isNull()
(refer here) can also be called before calling onBackPressed()
to ensure that the HyperServices object is not null.
componentDidMount() {
...
BackHandler.addEventListener('hardwareBackPress', () => {
return !HyperSdkReact.isNull() && HyperSdkReact.onBackPressed();
});
...
}
componentWillUnmount() {
...
BackHandler.removeEventListener('hardwareBackPress', () => null);
...
}
Hyper SDK needs to listen to the response of permissions asked to the user for handling auto SMS reading (wherever applicable). To do so, the merchant's activity should delegate the response to Hyper SDK once it is received from the user. This can be done by adding the following snippet in merchant's react activity (MainActivity
):
@Override
public void onRequestPermissionsResult(int requestCode, String[] permissions, int[] grantResults) {
if (HyperSdkReactModule.getPermissionRequestCodes().contains(requestCode)) {
HyperSdkReactModule.onRequestPermissionsResult(requestCode, permissions, grantResults);
} else {
super.onRequestPermissionsResult(requestCode, permissions, grantResults);
}
}
This method shall be triggered when HyperSDK
is no longer required.
HyperSdkReact.terminate();
This is a helper method and can be used to check whether the HyperServices
object is null
at any particular moment. It is a blocking synchronous method and returns a boolean
value.
var isNull: boolean = HyperSdkReact.isNull();
console.log('is HyperSDK null: ', isNull);
This is a helper / optional method to check whether SDK has been initialised after step-2. It returns a JS Promise
with a boolean
value.
HyperSdkReact.isInitialised().then((init: boolean) => {
console.log('isInitialised:', init);
});
This is an optional method to update the base view controller in case if any new view controller is presented over top view controller after the SDK initiation. This method should be called before making HyperSdkReact.process()
call.
HyperSdkReact.updateBaseViewController();
This sections helps to attach custom views inside designated sections in the payment page. You will need to register the component to be attached under one of the following names, based on where the component is attached.
You can follow the below syntax to attach the component.
HyperSdkReact.notifyAboutRegisterComponent(HyperSdkReact.JuspayHeaderAttached)
AppRegistry.registerComponent(HyperSdkReact.JuspayHeaderAttached, () => CustomComponent);
Please note component must be registered before calling process call of the sdk.
Note: In iOS we are not able to infer the height of the component being rendered.
Therefore the component must fire HyperSdkReact.updateMerchantViewHeight(<section_name>, <height>);
For example
HyperSdkReact.updateMerchantViewHeight(HyperSdkReact.JuspayHeader, 200);
If your view dynamically computes height. Height can be obtained by adding the following property to the root of component registered
onLayout={(event) => {
const { height } = event.nativeEvent.layout;
HyperSdkReact.updateMerchantViewHeight(HyperSdkReact.JuspayHeader, height);
}}
hyper-sdk-expo-plugin is distributed under AGPL-3.0-only license.
1.0.0
FAQs
An Expo config plugin for automating Android & iOS integration changes for [`hyper-sdk-react`](https://www.npmjs.com/package/hyper-sdk-react) with apps using Expo.
The npm package hyper-sdk-expo-plugin receives a total of 35 weekly downloads. As such, hyper-sdk-expo-plugin popularity was classified as not popular.
We found that hyper-sdk-expo-plugin demonstrated a healthy version release cadence and project activity because the last version was released less than a year ago. It has 0 open source maintainers collaborating on the project.
Did you know?
Socket for GitHub automatically highlights issues in each pull request and monitors the health of all your open source dependencies. Discover the contents of your packages and block harmful activity before you install or update your dependencies.
Research
Security News
The Socket Research Team has discovered six new malicious npm packages linked to North Korea’s Lazarus Group, designed to steal credentials and deploy backdoors.
Security News
Socket CEO Feross Aboukhadijeh discusses the open web, open source security, and how Socket tackles software supply chain attacks on The Pair Program podcast.
Security News
Opengrep continues building momentum with the alpha release of its Playground tool, demonstrating the project's rapid evolution just two months after its initial launch.