Skip to content

Commit

Permalink
feat(terminal): add reconnection functions
Browse files Browse the repository at this point in the history
  • Loading branch information
rdlabo committed Aug 12, 2024
1 parent de2457b commit 4d9f0c5
Show file tree
Hide file tree
Showing 6 changed files with 73 additions and 20 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -279,31 +279,31 @@ private void connectLocalMobileReader(final PluginCall call) {
return;
}

Boolean autoReconnectOnUnexpectedDisconnect = call.getBoolean("autoReconnectOnUnexpectedDisconnect", false);

LocalMobileConnectionConfiguration config = new LocalMobileConnectionConfiguration(
this.locationId,
true,
this.localMobileReaderReconnectionListener
autoReconnectOnUnexpectedDisconnect,
this.readerReconnectionListener
);
Terminal.getInstance().connectLocalMobileReader(this.readers.get(reader.getInteger("index")), config, this.readerCallback(call));
}

ReaderReconnectionListener localMobileReaderReconnectionListener = new ReaderReconnectionListener() {
@Override
public void onReaderReconnectStarted(@NonNull Reader reader, @NonNull Cancelable cancelReconnect) {
// 1. Notified at the start of a reconnection attempt
// Use cancelable to stop reconnection at any time
}

ReaderReconnectionListener readerReconnectionListener = new ReaderReconnectionListener() {
@Override
public void onReaderReconnectSucceeded(@NonNull Reader reader) {
// 2. Notified when reader reconnection succeeds
// App is now connected
notifyListeners(
TerminalEnumEvent.ReaderReconnectSucceeded.getWebEventName(),
new JSObject().put("reader", convertReaderInterface(reader))
);
}

@Override
public void onReaderReconnectFailed(@NonNull Reader reader) {
// 3. Notified when reader reconnection fails
// App is now disconnected
notifyListeners(
TerminalEnumEvent.ReaderReconnectFailed.getWebEventName(),
new JSObject().put("reader", convertReaderInterface(reader))
);
}
};

Expand All @@ -323,7 +323,13 @@ private void connectUsbReader(final PluginCall call) {

private void connectBluetoothReader(final PluginCall call) {
JSObject reader = call.getObject("reader");
BluetoothConnectionConfiguration config = new BluetoothConnectionConfiguration(this.locationId);
Boolean autoReconnectOnUnexpectedDisconnect = call.getBoolean("autoReconnectOnUnexpectedDisconnect", false);

BluetoothConnectionConfiguration config = new BluetoothConnectionConfiguration(
this.locationId,
autoReconnectOnUnexpectedDisconnect,
this.readerReconnectionListener
);
Terminal
.getInstance()
.connectBluetoothReader(this.readers.get(reader.getInteger("index")), config, this.readerListener(), this.readerCallback(call));
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -22,4 +22,6 @@ enum class TerminalEnumEvent(val webEventName: String) {
RequestDisplayMessage("terminalRequestDisplayMessage"),
RequestReaderInput("terminalRequestReaderInput"),
PaymentStatusChange("terminalPaymentStatusChange"),
ReaderReconnectSucceeded("terminalReaderReconnectSucceeded"),
ReaderReconnectFailed("terminalReaderReconnectFailed"),
}
34 changes: 29 additions & 5 deletions packages/terminal/ios/Plugin/StripeTerminal.swift
Original file line number Diff line number Diff line change
Expand Up @@ -2,7 +2,7 @@ import Foundation
import Capacitor
import StripeTerminal

public class StripeTerminal: NSObject, DiscoveryDelegate, LocalMobileReaderDelegate, BluetoothReaderDelegate, TerminalDelegate {
public class StripeTerminal: NSObject, DiscoveryDelegate, LocalMobileReaderDelegate, BluetoothReaderDelegate, TerminalDelegate, ReconnectionDelegate {

weak var plugin: StripeTerminalPlugin?
private let apiClient = APIClient()
Expand Down Expand Up @@ -143,10 +143,15 @@ public class StripeTerminal: NSObject, DiscoveryDelegate, LocalMobileReaderDeleg
}

private func connectLocalMobileReader(_ call: CAPPluginCall) {
let connectionConfig = try! LocalMobileConnectionConfigurationBuilder.init(locationId: self.locationId!).build()
let reader: JSObject = call.getObject("reader")!
let autoReconnectOnUnexpectedDisconnect = call.getBool("autoReconnectOnUnexpectedDisconnect", false)
let index: Int = reader["index"] as! Int

let connectionConfig = try! LocalMobileConnectionConfigurationBuilder.init(locationId: self.locationId!)
.setAutoReconnectOnUnexpectedDisconnect(autoReconnectOnUnexpectedDisconnect)
.setAutoReconnectionDelegate(autoReconnectOnUnexpectedDisconnect ? self : nil)
.build()

Terminal.shared.connectLocalMobileReader(self.readers![index], delegate: self, connectionConfig: connectionConfig) { reader, error in
if let reader = reader {
self.plugin?.notifyListeners(TerminalEvents.ConnectedReader.rawValue, data: [:])
Expand All @@ -158,11 +163,12 @@ public class StripeTerminal: NSObject, DiscoveryDelegate, LocalMobileReaderDeleg
}

private func connectInternetReader(_ call: CAPPluginCall) {
let reader: JSObject = call.getObject("reader")!
let index: Int = reader["index"] as! Int

let config = try! InternetConnectionConfigurationBuilder()
.setFailIfInUse(true)
.build()
let reader: JSObject = call.getObject("reader")!
let index: Int = reader["index"] as! Int

Terminal.shared.connectInternetReader(self.readers![index], connectionConfig: config) { reader, error in
if let reader = reader {
Expand All @@ -175,9 +181,13 @@ public class StripeTerminal: NSObject, DiscoveryDelegate, LocalMobileReaderDeleg
}

private func connectBluetoothReader(_ call: CAPPluginCall) {
let config = try! BluetoothConnectionConfigurationBuilder(locationId: self.locationId!).build()
let reader: JSObject = call.getObject("reader")!
let index: Int = reader["index"] as! Int
let autoReconnectOnUnexpectedDisconnect = call.getBool("autoReconnectOnUnexpectedDisconnect", false)
let config = try! BluetoothConnectionConfigurationBuilder(locationId: self.locationId!)
.setAutoReconnectOnUnexpectedDisconnect(autoReconnectOnUnexpectedDisconnect)
.setAutoReconnectionDelegate(autoReconnectOnUnexpectedDisconnect ? self : nil)
.build()

Terminal.shared.connectBluetoothReader(self.readers![index], delegate: self, connectionConfig: config) { reader, error in
if let reader = reader {
Expand Down Expand Up @@ -444,6 +454,20 @@ public class StripeTerminal: NSObject, DiscoveryDelegate, LocalMobileReaderDeleg
])
}

/*
* Reconnection
*/
public func readerDidSucceedReconnect(_ reader: Reader) {
self.plugin?.notifyListeners(TerminalEvents.ReaderReconnectSucceeded.rawValue, data: ["reader": self.convertReaderInterface(reader: reader)])
}

public func readerDidFailReconnect(_ reader: Reader) {
self.plugin?.notifyListeners(TerminalEvents.ReaderReconnectFailed.rawValue, data: ["reader": self.convertReaderInterface(reader: reader)])
}

/*
* Private
*/
private func convertReaderInterface(reader: Reader) -> [String: String] {
return ["serialNumber": reader.serialNumber]
}
Expand Down
2 changes: 2 additions & 0 deletions packages/terminal/ios/Plugin/TerminalEvents.swift
Original file line number Diff line number Diff line change
Expand Up @@ -19,4 +19,6 @@ public enum TerminalEvents: String {
case RequestDisplayMessage = "terminalRequestDisplayMessage"
case RequestReaderInput = "terminalRequestReaderInput"
case PaymentStatusChange = "terminalPaymentStatusChange"
case ReaderReconnectSucceeded = "terminalReaderReconnectSucceeded"
case ReaderReconnectFailed = "terminalReaderReconnectFailed"
}
19 changes: 18 additions & 1 deletion packages/terminal/src/definitions.ts
Original file line number Diff line number Diff line change
Expand Up @@ -55,7 +55,14 @@ export interface StripeTerminalPlugin {
simulatedCard?: SimulatedCardType;
simulatedTipAmount?: number;
}): Promise<void>;
connectReader(options: { reader: ReaderInterface }): Promise<void>;

/**
* @param options.autoReconnectOnUnexpectedDisconnect If true, the SDK will automatically attempt to reconnect to the reader. default is false.
*/
connectReader(options: {
reader: ReaderInterface;
autoReconnectOnUnexpectedDisconnect: boolean;
}): Promise<void>;
getConnectedReader(): Promise<{ reader: ReaderInterface | null }>;
disconnectReader(): Promise<void>;
cancelDiscoverReaders(): Promise<void>;
Expand Down Expand Up @@ -316,6 +323,16 @@ export interface StripeTerminalPlugin {
listenerFunc: ({ status }: { status: PaymentStatus }) => void,
): Promise<PluginListenerHandle>;

addListener(
eventName: TerminalEventsEnum.ReaderReconnectSucceeded,
listenerFunc: ({ reader }: { reader: ReaderInterface }) => void,
): Promise<PluginListenerHandle>;

addListener(
eventName: TerminalEventsEnum.ReaderReconnectFailed,
listenerFunc: ({ reader }: { reader: ReaderInterface }) => void,
): Promise<PluginListenerHandle>;

/**
* @deprecated
* This method has been deprecated and replaced by the `collectPaymentMethod`.
Expand Down
2 changes: 2 additions & 0 deletions packages/terminal/src/events.enum.ts
Original file line number Diff line number Diff line change
Expand Up @@ -20,6 +20,8 @@ export enum TerminalEventsEnum {
RequestDisplayMessage = 'terminalRequestDisplayMessage',
RequestReaderInput = 'terminalRequestReaderInput',
PaymentStatusChange = 'terminalPaymentStatusChange',
ReaderReconnectSucceeded = 'terminalReaderReconnectSucceeded',
ReaderReconnectFailed = 'terminalReaderReconnectFailed',
}

export type TerminalResultInterface =
Expand Down

0 comments on commit 4d9f0c5

Please sign in to comment.