@capacitor-community/stripe-terminal 7.2.0-0 → 7.2.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/README.md CHANGED
@@ -283,12 +283,12 @@ initialize(options: { tokenProviderEndpoint?: string; isTest: boolean; }) => Pro
283
283
  ### discoverReaders(...)
284
284
 
285
285
  ```typescript
286
- discoverReaders(options: { type: TerminalConnectTypes; locationId?: string; }) => Promise<{ readers: ReaderInterface[]; }>
286
+ discoverReaders(options: DiscoverReadersOptions) => Promise<{ readers: ReaderInterface[]; }>
287
287
  ```
288
288
 
289
- | Param | Type |
290
- | ------------- | ----------------------------------------------------------------------------------------------------- |
291
- | **`options`** | <code>{ type: <a href="#terminalconnecttypes">TerminalConnectTypes</a>; locationId?: string; }</code> |
289
+ | Param | Type |
290
+ | ------------- | ------------------------------------------------------------------------- |
291
+ | **`options`** | <code><a href="#discoverreadersoptions">DiscoverReadersOptions</a></code> |
292
292
 
293
293
  **Returns:** <code>Promise&lt;{ readers: ReaderInterface[]; }&gt;</code>
294
294
 
@@ -492,6 +492,9 @@ addListener(eventName: TerminalEventsEnum.RequestedConnectionToken, listenerFunc
492
492
  addListener(eventName: TerminalEventsEnum.DiscoveredReaders, listenerFunc: ({ readers }: { readers: ReaderInterface[]; }) => void) => Promise<PluginListenerHandle>
493
493
  ```
494
494
 
495
+ When searching for iOS Bluetooth, this will be executed multiple times.
496
+ https://docs.stripe.com/terminal/payments/connect-reader?terminal-sdk-platform=ios&reader-type=bluetooth
497
+
495
498
  | Param | Type |
496
499
  | ------------------ | ----------------------------------------------------------------------------------- |
497
500
  | **`eventName`** | <code><a href="#terminaleventsenum">TerminalEventsEnum.DiscoveredReaders</a></code> |
@@ -923,6 +926,15 @@ addListener(eventName: TerminalEventsEnum.ReaderReconnectFailed, listenerFunc: (
923
926
  ### Interfaces
924
927
 
925
928
 
929
+ #### DiscoverReadersOptions
930
+
931
+ | Prop | Type | Description |
932
+ | --------------------------- | --------------------------------------------------------------------- | ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
933
+ | **`type`** | <code><a href="#terminalconnecttypes">TerminalConnectTypes</a></code> | |
934
+ | **`locationId`** | <code>string</code> | |
935
+ | **`bluetoothScanWaitTime`** | <code>number</code> | Only applies to Bluetooth scan discovery (iOS only). During discovery, readers are reported via DiscoveryDelegate.didUpdateDiscoveredReaders. This timeout controls how long to wait before resolving the `discoverReaders` method with the current list. If this setting is not specified or is set to 0, the initial scan results will be returned. |
936
+
937
+
926
938
  #### PluginListenerHandle
927
939
 
928
940
  | Prop | Type |
package/dist/docs.json CHANGED
@@ -24,12 +24,12 @@
24
24
  },
25
25
  {
26
26
  "name": "discoverReaders",
27
- "signature": "(options: { type: TerminalConnectTypes; locationId?: string; }) => Promise<{ readers: ReaderInterface[]; }>",
27
+ "signature": "(options: DiscoverReadersOptions) => Promise<{ readers: ReaderInterface[]; }>",
28
28
  "parameters": [
29
29
  {
30
30
  "name": "options",
31
31
  "docs": "",
32
- "type": "{ type: TerminalConnectTypes; locationId?: string | undefined; }"
32
+ "type": "DiscoverReadersOptions"
33
33
  }
34
34
  ],
35
35
  "returns": "Promise<{ readers: ReaderInterface[]; }>",
@@ -37,7 +37,7 @@
37
37
  "docs": "",
38
38
  "complexTypes": [
39
39
  "ReaderInterface",
40
- "TerminalConnectTypes"
40
+ "DiscoverReadersOptions"
41
41
  ],
42
42
  "slug": "discoverreaders"
43
43
  },
@@ -300,7 +300,7 @@
300
300
  ],
301
301
  "returns": "Promise<PluginListenerHandle>",
302
302
  "tags": [],
303
- "docs": "",
303
+ "docs": "When searching for iOS Bluetooth, this will be executed multiple times.\nhttps://docs.stripe.com/terminal/payments/connect-reader?terminal-sdk-platform=ios&reader-type=bluetooth",
304
304
  "complexTypes": [
305
305
  "PluginListenerHandle",
306
306
  "TerminalEventsEnum",
@@ -806,6 +806,39 @@
806
806
  "properties": []
807
807
  },
808
808
  "interfaces": [
809
+ {
810
+ "name": "DiscoverReadersOptions",
811
+ "slug": "discoverreadersoptions",
812
+ "docs": "",
813
+ "tags": [],
814
+ "extends": [],
815
+ "methods": [],
816
+ "properties": [
817
+ {
818
+ "name": "type",
819
+ "tags": [],
820
+ "docs": "",
821
+ "complexTypes": [
822
+ "TerminalConnectTypes"
823
+ ],
824
+ "type": "TerminalConnectTypes"
825
+ },
826
+ {
827
+ "name": "locationId",
828
+ "tags": [],
829
+ "docs": "",
830
+ "complexTypes": [],
831
+ "type": "string | undefined"
832
+ },
833
+ {
834
+ "name": "bluetoothScanWaitTime",
835
+ "tags": [],
836
+ "docs": "Only applies to Bluetooth scan discovery (iOS only).\nDuring discovery, readers are reported via DiscoveryDelegate.didUpdateDiscoveredReaders.\nThis timeout controls how long to wait before resolving the `discoverReaders` method with the current list.\n\nIf this setting is not specified or is set to 0, the initial scan results will be returned.",
837
+ "complexTypes": [],
838
+ "type": "number | undefined"
839
+ }
840
+ ]
841
+ },
809
842
  {
810
843
  "name": "PluginListenerHandle",
811
844
  "slug": "pluginlistenerhandle",
@@ -67,6 +67,18 @@ export declare type Cart = {
67
67
  total: number;
68
68
  lineItems: CartLineItem[];
69
69
  };
70
+ export interface DiscoverReadersOptions {
71
+ type: TerminalConnectTypes;
72
+ locationId?: string;
73
+ /**
74
+ * Only applies to Bluetooth scan discovery (iOS only).
75
+ * During discovery, readers are reported via DiscoveryDelegate.didUpdateDiscoveredReaders.
76
+ * This timeout controls how long to wait before resolving the `discoverReaders` method with the current list.
77
+ *
78
+ * If this setting is not specified or is set to 0, the initial scan results will be returned.
79
+ */
80
+ bluetoothScanWaitTime?: number;
81
+ }
70
82
  export * from './events.enum';
71
83
  export * from './stripe.enum';
72
84
  export interface StripeTerminalPlugin {
@@ -74,10 +86,7 @@ export interface StripeTerminalPlugin {
74
86
  tokenProviderEndpoint?: string;
75
87
  isTest: boolean;
76
88
  }): Promise<void>;
77
- discoverReaders(options: {
78
- type: TerminalConnectTypes;
79
- locationId?: string;
80
- }): Promise<{
89
+ discoverReaders(options: DiscoverReadersOptions): Promise<{
81
90
  readers: ReaderInterface[];
82
91
  }>;
83
92
  setConnectionToken(options: {
@@ -125,6 +134,10 @@ export interface StripeTerminalPlugin {
125
134
  cancelReaderReconnection(): Promise<void>;
126
135
  addListener(eventName: TerminalEventsEnum.Loaded, listenerFunc: () => void): Promise<PluginListenerHandle>;
127
136
  addListener(eventName: TerminalEventsEnum.RequestedConnectionToken, listenerFunc: () => void): Promise<PluginListenerHandle>;
137
+ /**
138
+ * When searching for iOS Bluetooth, this will be executed multiple times.
139
+ * https://docs.stripe.com/terminal/payments/connect-reader?terminal-sdk-platform=ios&reader-type=bluetooth
140
+ */
128
141
  addListener(eventName: TerminalEventsEnum.DiscoveredReaders, listenerFunc: ({ readers }: {
129
142
  readers: ReaderInterface[];
130
143
  }) => void): Promise<PluginListenerHandle>;
@@ -1 +1 @@
1
- {"version":3,"file":"definitions.js","sourceRoot":"","sources":["../../src/definitions.ts"],"names":[],"mappings":"AA6FA,cAAc,eAAe,CAAC;AAC9B,cAAc,eAAe,CAAC","sourcesContent":["import type { PluginListenerHandle } from '@capacitor/core';\n\nimport type { TerminalEventsEnum } from './events.enum';\nimport type {\n TerminalConnectTypes,\n UpdateTimeEstimate,\n SimulateReaderUpdate,\n SimulatedCardType,\n BatteryStatus,\n ReaderEvent,\n ReaderDisplayMessage,\n ReaderInputOption,\n PaymentStatus,\n DisconnectReason,\n ConnectionStatus,\n NetworkStatus,\n LocationStatus,\n DeviceType,\n} from './stripe.enum';\n\nexport type ReaderInterface = {\n /**\n * The unique serial number is primary identifier inner plugin.\n */\n serialNumber: string;\n\n label: string;\n batteryLevel: number;\n batteryStatus: BatteryStatus;\n simulated: boolean;\n id: number;\n availableUpdate: ReaderSoftwareUpdateInterface | undefined;\n locationId: string;\n ipAddress: string;\n status: NetworkStatus;\n location: LocationInterface | undefined;\n locationStatus: LocationStatus;\n deviceType: DeviceType;\n deviceSoftwareVersion: string | null;\n\n /**\n * iOS Only properties. These properties are not available on Android.\n */\n isCharging: number;\n\n /**\n * Android Only properties. These properties are not available on iOS.\n */\n baseUrl: string;\n bootloaderVersion: string;\n configVersion: string;\n emvKeyProfileId: string;\n firmwareVersion: string;\n hardwareVersion: string;\n macKeyProfileId: string;\n pinKeyProfileId: string;\n trackKeyProfileId: string;\n settingsVersion: string;\n pinKeysetId: string;\n};\nexport type LocationInterface = {\n id: string;\n displayName: string;\n address: {\n city: string;\n country: string;\n postalCode: string;\n line1: string;\n line2: string;\n state: string;\n };\n ipAddress: string;\n};\n\nexport type ReaderSoftwareUpdateInterface = {\n deviceSoftwareVersion: string;\n estimatedUpdateTime: UpdateTimeEstimate;\n requiredAt: number;\n};\n\nexport type CartLineItem = {\n displayName: string;\n quantity: number;\n amount: number;\n};\n\nexport type Cart = {\n currency: string;\n tax: number;\n total: number;\n lineItems: CartLineItem[];\n};\n\nexport * from './events.enum';\nexport * from './stripe.enum';\nexport interface StripeTerminalPlugin {\n initialize(options: { tokenProviderEndpoint?: string; isTest: boolean }): Promise<void>;\n discoverReaders(options: { type: TerminalConnectTypes; locationId?: string }): Promise<{\n readers: ReaderInterface[];\n }>;\n setConnectionToken(options: { token: string }): Promise<void>;\n /**\n * [*Stripe docs reference*](https://stripe.dev/stripe-terminal-android/external/com.stripe.stripeterminal.external.models/-simulator-configuration/index.html)\n */\n setSimulatorConfiguration(options: {\n update?: SimulateReaderUpdate;\n simulatedCard?: SimulatedCardType;\n simulatedTipAmount?: number;\n }): Promise<void>;\n\n /**\n * @param options.autoReconnectOnUnexpectedDisconnect If true, the SDK will automatically attempt to reconnect to the reader. default is false.\n */\n connectReader(options: {\n reader: ReaderInterface;\n autoReconnectOnUnexpectedDisconnect?: boolean;\n\n /**\n * iOS and LocalMobileReader only. Android needs to be set to PaymentIntent only.\n */\n merchantDisplayName?: string;\n\n /**\n * iOS and LocalMobileReader only. Android needs to be set to PaymentIntent only.\n * The Stripe account ID for which these funds are intended.\n */\n onBehalfOf?: string;\n }): Promise<void>;\n getConnectedReader(): Promise<{ reader: ReaderInterface | null }>;\n disconnectReader(): Promise<void>;\n cancelDiscoverReaders(): Promise<void>;\n collectPaymentMethod(options: { paymentIntent: string }): Promise<void>;\n cancelCollectPaymentMethod(): Promise<void>;\n confirmPaymentIntent(): Promise<void>;\n installAvailableUpdate(): Promise<void>;\n cancelInstallUpdate(): Promise<void>;\n setReaderDisplay(options: Cart): Promise<void>;\n clearReaderDisplay(): Promise<void>;\n rebootReader(): Promise<void>;\n cancelReaderReconnection(): Promise<void>;\n\n addListener(eventName: TerminalEventsEnum.Loaded, listenerFunc: () => void): Promise<PluginListenerHandle>;\n\n addListener(\n eventName: TerminalEventsEnum.RequestedConnectionToken,\n listenerFunc: () => void,\n ): Promise<PluginListenerHandle>;\n\n addListener(\n eventName: TerminalEventsEnum.DiscoveredReaders,\n listenerFunc: ({ readers }: { readers: ReaderInterface[] }) => void,\n ): Promise<PluginListenerHandle>;\n\n addListener(eventName: TerminalEventsEnum.ConnectedReader, listenerFunc: () => void): Promise<PluginListenerHandle>;\n\n /**\n * Emitted when the reader is disconnected, either in response to [`disconnectReader()`](#disconnectreader)\n * or some connection error.\n *\n * For all reader types, this is emitted in response to [`disconnectReader()`](#disconnectreader)\n * without a `reason` property.\n *\n * For Bluetooth and USB readers, this is emitted with a `reason` property when the reader disconnects.\n *\n * **Note:** For Bluetooth and USB readers, when you call [`disconnectReader()`](#disconnectreader), this event\n * will be emitted twice: one without a `reason` in acknowledgement of your call, and again with a `reason` when the reader\n * finishes disconnecting.\n */\n addListener(\n eventName: TerminalEventsEnum.DisconnectedReader,\n listenerFunc: ({ reason }: { reason?: DisconnectReason }) => void,\n ): Promise<PluginListenerHandle>;\n\n /**\n * Emitted when the Terminal's connection status changed.\n *\n * Note: You should *not* use this method to detect when a reader unexpectedly disconnects from your app,\n * as it cannot be used to accurately distinguish between expected and unexpected disconnect events.\n *\n * To detect unexpected disconnects (e.g. to automatically notify your user), you should instead use\n * the UnexpectedReaderDisconnect event.\n *\n * [*Stripe docs reference*](https://stripe.dev/stripe-terminal-android/external/com.stripe.stripeterminal.external.callable/-terminal-listener/on-connection-status-change.html)\n */\n addListener(\n eventName: TerminalEventsEnum.ConnectionStatusChange,\n listenerFunc: ({ status }: { status: ConnectionStatus }) => void,\n ): Promise<PluginListenerHandle>;\n\n /**\n * The Terminal disconnected unexpectedly from the reader.\n *\n * In your implementation of this method, you may want to notify your user that the reader disconnected.\n * You may also call [`discoverReaders()`](#discoverreaders) to begin scanning for readers, and attempt\n * to automatically reconnect to the disconnected reader. Be sure to either set a timeout or make it\n * possible to cancel calls to `discoverReaders()`\n *\n * When connected to a Bluetooth or USB reader, you can get more information about the disconnect by\n * implementing the DisconnectedReader event.\n *\n * [*Stripe docs reference*](https://stripe.dev/stripe-terminal-android/external/com.stripe.stripeterminal.external.callable/-terminal-listener/on-unexpected-reader-disconnect.html)\n */\n addListener(\n eventName: TerminalEventsEnum.UnexpectedReaderDisconnect,\n listenerFunc: ({ reader }: { reader: ReaderInterface }) => void,\n ): Promise<PluginListenerHandle>;\n\n addListener(\n eventName: TerminalEventsEnum.ConfirmedPaymentIntent,\n listenerFunc: () => void,\n ): Promise<PluginListenerHandle>;\n\n addListener(\n eventName: TerminalEventsEnum.CollectedPaymentIntent,\n listenerFunc: () => void,\n ): Promise<PluginListenerHandle>;\n\n /**\n * Emitted when [`cancelCollectPaymentMethod()`](#cancelcollectpaymentmethod) is called and succeeds.\n * The Promise returned by `cancelCollectPaymentMethod()` will also be resolved.\n */\n addListener(eventName: TerminalEventsEnum.Canceled, listenerFunc: () => void): Promise<PluginListenerHandle>;\n\n /**\n * Emitted when either [`collectPaymentMethod()`](#collectpaymentmethod) or [`confirmPaymentIntent()`](#confirmpaymentintent)\n * fails. The Promise returned by the relevant call will also be rejected.\n */\n addListener(\n eventName: TerminalEventsEnum.Failed,\n listenerFunc: (info: { message: string; code?: string; declineCode?: string }) => void,\n ): Promise<PluginListenerHandle>;\n\n /**\n * Emitted when a software update is available for the connected reader.\n */\n addListener(\n eventName: TerminalEventsEnum.ReportAvailableUpdate,\n listenerFunc: ({ update }: { update: ReaderSoftwareUpdateInterface }) => void,\n ): Promise<PluginListenerHandle>;\n\n /**\n * **Only applicable to Bluetooth and USB readers.**\n *\n * Emitted when the connected reader begins installing a software update.\n * If a mandatory software update is available when a reader first connects, that update is\n * automatically installed. The update will be installed before ConnectedReader is emitted and\n * before the Promise returned by [`connectReader()`](#connectreader) resolves.\n * In this case, you will receive this sequence of events:\n *\n * 1. StartInstallingUpdate\n * 2. ReaderSoftwareUpdateProgress (repeatedly)\n * 3. FinishInstallingUpdates\n * 4. ConnectedReader\n * 5. `connectReader()` Promise resolves\n *\n * Your app should show UI to the user indiciating that a software update is being installed\n * to explain why connecting is taking longer than usual.\n *\n * [*Stripe docs reference*](https://stripe.dev/stripe-terminal-android/external/com.stripe.stripeterminal.external.callable/-reader-listener/on-start-installing-update.html)\n */\n addListener(\n eventName: TerminalEventsEnum.StartInstallingUpdate,\n listenerFunc: ({ update }: { update: ReaderSoftwareUpdateInterface }) => void,\n ): Promise<PluginListenerHandle>;\n\n /**\n * **Only applicable to Bluetooth and USB readers.**\n *\n * Emitted periodically while reader software is updating to inform of the installation progress.\n * `progress` is a float between 0 and 1.\n *\n * [*Stripe docs reference*](https://stripe.dev/stripe-terminal-android/external/com.stripe.stripeterminal.external.callable/-reader-listener/on-report-reader-software-update-progress.html)\n */\n addListener(\n eventName: TerminalEventsEnum.ReaderSoftwareUpdateProgress,\n listenerFunc: ({ progress }: { progress: number }) => void,\n ): Promise<PluginListenerHandle>;\n\n /**\n * **Only applicable to Bluetooth and USB readers.**\n *\n * [*Stripe docs reference*](https://stripe.dev/stripe-terminal-android/external/com.stripe.stripeterminal.external.callable/-reader-listener/on-finish-installing-update.html)\n */\n addListener(\n eventName: TerminalEventsEnum.FinishInstallingUpdate,\n listenerFunc: (\n args:\n | {\n update: ReaderSoftwareUpdateInterface;\n }\n | {\n error: string;\n },\n ) => void,\n ): Promise<PluginListenerHandle>;\n\n /**\n * **Only applicable to Bluetooth and USB readers.**\n *\n * Emitted upon connection and every 10 minutes.\n *\n * [*Stripe docs reference*](https://stripe.dev/stripe-terminal-android/external/com.stripe.stripeterminal.external.callable/-reader-listener/on-battery-level-update.html)\n */\n addListener(\n eventName: TerminalEventsEnum.BatteryLevel,\n listenerFunc: ({ level, charging, status }: { level: number; charging: boolean; status: BatteryStatus }) => void,\n ): Promise<PluginListenerHandle>;\n\n /**\n * **Only applicable to Bluetooth and USB readers.**\n *\n * [*Stripe docs reference*](https://stripe.dev/stripe-terminal-android/external/com.stripe.stripeterminal.external.callable/-reader-listenable/on-report-reader-event.html)\n */\n addListener(\n eventName: TerminalEventsEnum.ReaderEvent,\n listenerFunc: ({ event }: { event: ReaderEvent }) => void,\n ): Promise<PluginListenerHandle>;\n\n /**\n * **Only applicable to Bluetooth and USB readers.**\n *\n * Emitted when the Terminal requests that a message be displayed in your app.\n *\n * [*Stripe docs reference*](https://stripe.dev/stripe-terminal-android/external/com.stripe.stripeterminal.external.callable/-reader-listener/on-request-reader-display-message.html)\n */\n addListener(\n eventName: TerminalEventsEnum.RequestDisplayMessage,\n listenerFunc: ({ messageType, message }: { messageType: ReaderDisplayMessage; message: string }) => void,\n ): Promise<PluginListenerHandle>;\n\n /**\n * **Only applicable to Bluetooth and USB readers.**\n *\n * Emitted when the reader begins waiting for input. Your app should prompt the customer\n * to present a source using one of the given input options. If the reader emits a message,\n * the RequestDisplayMessage event will be emitted.\n *\n * [*Stripe docs reference*](https://stripe.dev/stripe-terminal-android/external/com.stripe.stripeterminal.external.callable/-reader-listener/on-request-reader-input.html)\n */\n addListener(\n eventName: TerminalEventsEnum.RequestReaderInput,\n listenerFunc: ({ options, message }: { options: ReaderInputOption[]; message: string }) => void,\n ): Promise<PluginListenerHandle>;\n\n /**\n * [*Stripe docs reference*](https://stripe.dev/stripe-terminal-android/external/com.stripe.stripeterminal.external.callable/-terminal-listener/on-payment-status-change.html)\n */\n addListener(\n eventName: TerminalEventsEnum.PaymentStatusChange,\n listenerFunc: ({ status }: { status: PaymentStatus }) => void,\n ): Promise<PluginListenerHandle>;\n\n addListener(\n eventName: TerminalEventsEnum.ReaderReconnectStarted,\n listenerFunc: ({ reader, reason }: { reader: ReaderInterface; reason: string }) => void,\n ): Promise<PluginListenerHandle>;\n\n addListener(\n eventName: TerminalEventsEnum.ReaderReconnectSucceeded,\n listenerFunc: ({ reader }: { reader: ReaderInterface }) => void,\n ): Promise<PluginListenerHandle>;\n\n addListener(\n eventName: TerminalEventsEnum.ReaderReconnectFailed,\n listenerFunc: ({ reader }: { reader: ReaderInterface }) => void,\n ): Promise<PluginListenerHandle>;\n}\n"]}
1
+ {"version":3,"file":"definitions.js","sourceRoot":"","sources":["../../src/definitions.ts"],"names":[],"mappings":"AA2GA,cAAc,eAAe,CAAC;AAC9B,cAAc,eAAe,CAAC","sourcesContent":["import type { PluginListenerHandle } from '@capacitor/core';\n\nimport type { TerminalEventsEnum } from './events.enum';\nimport type {\n TerminalConnectTypes,\n UpdateTimeEstimate,\n SimulateReaderUpdate,\n SimulatedCardType,\n BatteryStatus,\n ReaderEvent,\n ReaderDisplayMessage,\n ReaderInputOption,\n PaymentStatus,\n DisconnectReason,\n ConnectionStatus,\n NetworkStatus,\n LocationStatus,\n DeviceType,\n} from './stripe.enum';\n\nexport type ReaderInterface = {\n /**\n * The unique serial number is primary identifier inner plugin.\n */\n serialNumber: string;\n\n label: string;\n batteryLevel: number;\n batteryStatus: BatteryStatus;\n simulated: boolean;\n id: number;\n availableUpdate: ReaderSoftwareUpdateInterface | undefined;\n locationId: string;\n ipAddress: string;\n status: NetworkStatus;\n location: LocationInterface | undefined;\n locationStatus: LocationStatus;\n deviceType: DeviceType;\n deviceSoftwareVersion: string | null;\n\n /**\n * iOS Only properties. These properties are not available on Android.\n */\n isCharging: number;\n\n /**\n * Android Only properties. These properties are not available on iOS.\n */\n baseUrl: string;\n bootloaderVersion: string;\n configVersion: string;\n emvKeyProfileId: string;\n firmwareVersion: string;\n hardwareVersion: string;\n macKeyProfileId: string;\n pinKeyProfileId: string;\n trackKeyProfileId: string;\n settingsVersion: string;\n pinKeysetId: string;\n};\nexport type LocationInterface = {\n id: string;\n displayName: string;\n address: {\n city: string;\n country: string;\n postalCode: string;\n line1: string;\n line2: string;\n state: string;\n };\n ipAddress: string;\n};\n\nexport type ReaderSoftwareUpdateInterface = {\n deviceSoftwareVersion: string;\n estimatedUpdateTime: UpdateTimeEstimate;\n requiredAt: number;\n};\n\nexport type CartLineItem = {\n displayName: string;\n quantity: number;\n amount: number;\n};\n\nexport type Cart = {\n currency: string;\n tax: number;\n total: number;\n lineItems: CartLineItem[];\n};\n\nexport interface DiscoverReadersOptions {\n type: TerminalConnectTypes;\n locationId?: string;\n\n /**\n * Only applies to Bluetooth scan discovery (iOS only).\n * During discovery, readers are reported via DiscoveryDelegate.didUpdateDiscoveredReaders.\n * This timeout controls how long to wait before resolving the `discoverReaders` method with the current list.\n *\n * If this setting is not specified or is set to 0, the initial scan results will be returned.\n */\n bluetoothScanWaitTime?: number;\n}\n\nexport * from './events.enum';\nexport * from './stripe.enum';\nexport interface StripeTerminalPlugin {\n initialize(options: { tokenProviderEndpoint?: string; isTest: boolean }): Promise<void>;\n discoverReaders(options: DiscoverReadersOptions): Promise<{\n readers: ReaderInterface[];\n }>;\n setConnectionToken(options: { token: string }): Promise<void>;\n /**\n * [*Stripe docs reference*](https://stripe.dev/stripe-terminal-android/external/com.stripe.stripeterminal.external.models/-simulator-configuration/index.html)\n */\n setSimulatorConfiguration(options: {\n update?: SimulateReaderUpdate;\n simulatedCard?: SimulatedCardType;\n simulatedTipAmount?: number;\n }): Promise<void>;\n\n /**\n * @param options.autoReconnectOnUnexpectedDisconnect If true, the SDK will automatically attempt to reconnect to the reader. default is false.\n */\n connectReader(options: {\n reader: ReaderInterface;\n autoReconnectOnUnexpectedDisconnect?: boolean;\n\n /**\n * iOS and LocalMobileReader only. Android needs to be set to PaymentIntent only.\n */\n merchantDisplayName?: string;\n\n /**\n * iOS and LocalMobileReader only. Android needs to be set to PaymentIntent only.\n * The Stripe account ID for which these funds are intended.\n */\n onBehalfOf?: string;\n }): Promise<void>;\n getConnectedReader(): Promise<{ reader: ReaderInterface | null }>;\n disconnectReader(): Promise<void>;\n cancelDiscoverReaders(): Promise<void>;\n collectPaymentMethod(options: { paymentIntent: string }): Promise<void>;\n cancelCollectPaymentMethod(): Promise<void>;\n confirmPaymentIntent(): Promise<void>;\n installAvailableUpdate(): Promise<void>;\n cancelInstallUpdate(): Promise<void>;\n setReaderDisplay(options: Cart): Promise<void>;\n clearReaderDisplay(): Promise<void>;\n rebootReader(): Promise<void>;\n cancelReaderReconnection(): Promise<void>;\n\n addListener(eventName: TerminalEventsEnum.Loaded, listenerFunc: () => void): Promise<PluginListenerHandle>;\n\n addListener(\n eventName: TerminalEventsEnum.RequestedConnectionToken,\n listenerFunc: () => void,\n ): Promise<PluginListenerHandle>;\n\n /**\n * When searching for iOS Bluetooth, this will be executed multiple times.\n * https://docs.stripe.com/terminal/payments/connect-reader?terminal-sdk-platform=ios&reader-type=bluetooth\n */\n addListener(\n eventName: TerminalEventsEnum.DiscoveredReaders,\n listenerFunc: ({ readers }: { readers: ReaderInterface[] }) => void,\n ): Promise<PluginListenerHandle>;\n\n addListener(eventName: TerminalEventsEnum.ConnectedReader, listenerFunc: () => void): Promise<PluginListenerHandle>;\n\n /**\n * Emitted when the reader is disconnected, either in response to [`disconnectReader()`](#disconnectreader)\n * or some connection error.\n *\n * For all reader types, this is emitted in response to [`disconnectReader()`](#disconnectreader)\n * without a `reason` property.\n *\n * For Bluetooth and USB readers, this is emitted with a `reason` property when the reader disconnects.\n *\n * **Note:** For Bluetooth and USB readers, when you call [`disconnectReader()`](#disconnectreader), this event\n * will be emitted twice: one without a `reason` in acknowledgement of your call, and again with a `reason` when the reader\n * finishes disconnecting.\n */\n addListener(\n eventName: TerminalEventsEnum.DisconnectedReader,\n listenerFunc: ({ reason }: { reason?: DisconnectReason }) => void,\n ): Promise<PluginListenerHandle>;\n\n /**\n * Emitted when the Terminal's connection status changed.\n *\n * Note: You should *not* use this method to detect when a reader unexpectedly disconnects from your app,\n * as it cannot be used to accurately distinguish between expected and unexpected disconnect events.\n *\n * To detect unexpected disconnects (e.g. to automatically notify your user), you should instead use\n * the UnexpectedReaderDisconnect event.\n *\n * [*Stripe docs reference*](https://stripe.dev/stripe-terminal-android/external/com.stripe.stripeterminal.external.callable/-terminal-listener/on-connection-status-change.html)\n */\n addListener(\n eventName: TerminalEventsEnum.ConnectionStatusChange,\n listenerFunc: ({ status }: { status: ConnectionStatus }) => void,\n ): Promise<PluginListenerHandle>;\n\n /**\n * The Terminal disconnected unexpectedly from the reader.\n *\n * In your implementation of this method, you may want to notify your user that the reader disconnected.\n * You may also call [`discoverReaders()`](#discoverreaders) to begin scanning for readers, and attempt\n * to automatically reconnect to the disconnected reader. Be sure to either set a timeout or make it\n * possible to cancel calls to `discoverReaders()`\n *\n * When connected to a Bluetooth or USB reader, you can get more information about the disconnect by\n * implementing the DisconnectedReader event.\n *\n * [*Stripe docs reference*](https://stripe.dev/stripe-terminal-android/external/com.stripe.stripeterminal.external.callable/-terminal-listener/on-unexpected-reader-disconnect.html)\n */\n addListener(\n eventName: TerminalEventsEnum.UnexpectedReaderDisconnect,\n listenerFunc: ({ reader }: { reader: ReaderInterface }) => void,\n ): Promise<PluginListenerHandle>;\n\n addListener(\n eventName: TerminalEventsEnum.ConfirmedPaymentIntent,\n listenerFunc: () => void,\n ): Promise<PluginListenerHandle>;\n\n addListener(\n eventName: TerminalEventsEnum.CollectedPaymentIntent,\n listenerFunc: () => void,\n ): Promise<PluginListenerHandle>;\n\n /**\n * Emitted when [`cancelCollectPaymentMethod()`](#cancelcollectpaymentmethod) is called and succeeds.\n * The Promise returned by `cancelCollectPaymentMethod()` will also be resolved.\n */\n addListener(eventName: TerminalEventsEnum.Canceled, listenerFunc: () => void): Promise<PluginListenerHandle>;\n\n /**\n * Emitted when either [`collectPaymentMethod()`](#collectpaymentmethod) or [`confirmPaymentIntent()`](#confirmpaymentintent)\n * fails. The Promise returned by the relevant call will also be rejected.\n */\n addListener(\n eventName: TerminalEventsEnum.Failed,\n listenerFunc: (info: { message: string; code?: string; declineCode?: string }) => void,\n ): Promise<PluginListenerHandle>;\n\n /**\n * Emitted when a software update is available for the connected reader.\n */\n addListener(\n eventName: TerminalEventsEnum.ReportAvailableUpdate,\n listenerFunc: ({ update }: { update: ReaderSoftwareUpdateInterface }) => void,\n ): Promise<PluginListenerHandle>;\n\n /**\n * **Only applicable to Bluetooth and USB readers.**\n *\n * Emitted when the connected reader begins installing a software update.\n * If a mandatory software update is available when a reader first connects, that update is\n * automatically installed. The update will be installed before ConnectedReader is emitted and\n * before the Promise returned by [`connectReader()`](#connectreader) resolves.\n * In this case, you will receive this sequence of events:\n *\n * 1. StartInstallingUpdate\n * 2. ReaderSoftwareUpdateProgress (repeatedly)\n * 3. FinishInstallingUpdates\n * 4. ConnectedReader\n * 5. `connectReader()` Promise resolves\n *\n * Your app should show UI to the user indiciating that a software update is being installed\n * to explain why connecting is taking longer than usual.\n *\n * [*Stripe docs reference*](https://stripe.dev/stripe-terminal-android/external/com.stripe.stripeterminal.external.callable/-reader-listener/on-start-installing-update.html)\n */\n addListener(\n eventName: TerminalEventsEnum.StartInstallingUpdate,\n listenerFunc: ({ update }: { update: ReaderSoftwareUpdateInterface }) => void,\n ): Promise<PluginListenerHandle>;\n\n /**\n * **Only applicable to Bluetooth and USB readers.**\n *\n * Emitted periodically while reader software is updating to inform of the installation progress.\n * `progress` is a float between 0 and 1.\n *\n * [*Stripe docs reference*](https://stripe.dev/stripe-terminal-android/external/com.stripe.stripeterminal.external.callable/-reader-listener/on-report-reader-software-update-progress.html)\n */\n addListener(\n eventName: TerminalEventsEnum.ReaderSoftwareUpdateProgress,\n listenerFunc: ({ progress }: { progress: number }) => void,\n ): Promise<PluginListenerHandle>;\n\n /**\n * **Only applicable to Bluetooth and USB readers.**\n *\n * [*Stripe docs reference*](https://stripe.dev/stripe-terminal-android/external/com.stripe.stripeterminal.external.callable/-reader-listener/on-finish-installing-update.html)\n */\n addListener(\n eventName: TerminalEventsEnum.FinishInstallingUpdate,\n listenerFunc: (\n args:\n | {\n update: ReaderSoftwareUpdateInterface;\n }\n | {\n error: string;\n },\n ) => void,\n ): Promise<PluginListenerHandle>;\n\n /**\n * **Only applicable to Bluetooth and USB readers.**\n *\n * Emitted upon connection and every 10 minutes.\n *\n * [*Stripe docs reference*](https://stripe.dev/stripe-terminal-android/external/com.stripe.stripeterminal.external.callable/-reader-listener/on-battery-level-update.html)\n */\n addListener(\n eventName: TerminalEventsEnum.BatteryLevel,\n listenerFunc: ({ level, charging, status }: { level: number; charging: boolean; status: BatteryStatus }) => void,\n ): Promise<PluginListenerHandle>;\n\n /**\n * **Only applicable to Bluetooth and USB readers.**\n *\n * [*Stripe docs reference*](https://stripe.dev/stripe-terminal-android/external/com.stripe.stripeterminal.external.callable/-reader-listenable/on-report-reader-event.html)\n */\n addListener(\n eventName: TerminalEventsEnum.ReaderEvent,\n listenerFunc: ({ event }: { event: ReaderEvent }) => void,\n ): Promise<PluginListenerHandle>;\n\n /**\n * **Only applicable to Bluetooth and USB readers.**\n *\n * Emitted when the Terminal requests that a message be displayed in your app.\n *\n * [*Stripe docs reference*](https://stripe.dev/stripe-terminal-android/external/com.stripe.stripeterminal.external.callable/-reader-listener/on-request-reader-display-message.html)\n */\n addListener(\n eventName: TerminalEventsEnum.RequestDisplayMessage,\n listenerFunc: ({ messageType, message }: { messageType: ReaderDisplayMessage; message: string }) => void,\n ): Promise<PluginListenerHandle>;\n\n /**\n * **Only applicable to Bluetooth and USB readers.**\n *\n * Emitted when the reader begins waiting for input. Your app should prompt the customer\n * to present a source using one of the given input options. If the reader emits a message,\n * the RequestDisplayMessage event will be emitted.\n *\n * [*Stripe docs reference*](https://stripe.dev/stripe-terminal-android/external/com.stripe.stripeterminal.external.callable/-reader-listener/on-request-reader-input.html)\n */\n addListener(\n eventName: TerminalEventsEnum.RequestReaderInput,\n listenerFunc: ({ options, message }: { options: ReaderInputOption[]; message: string }) => void,\n ): Promise<PluginListenerHandle>;\n\n /**\n * [*Stripe docs reference*](https://stripe.dev/stripe-terminal-android/external/com.stripe.stripeterminal.external.callable/-terminal-listener/on-payment-status-change.html)\n */\n addListener(\n eventName: TerminalEventsEnum.PaymentStatusChange,\n listenerFunc: ({ status }: { status: PaymentStatus }) => void,\n ): Promise<PluginListenerHandle>;\n\n addListener(\n eventName: TerminalEventsEnum.ReaderReconnectStarted,\n listenerFunc: ({ reader, reason }: { reader: ReaderInterface; reason: string }) => void,\n ): Promise<PluginListenerHandle>;\n\n addListener(\n eventName: TerminalEventsEnum.ReaderReconnectSucceeded,\n listenerFunc: ({ reader }: { reader: ReaderInterface }) => void,\n ): Promise<PluginListenerHandle>;\n\n addListener(\n eventName: TerminalEventsEnum.ReaderReconnectFailed,\n listenerFunc: ({ reader }: { reader: ReaderInterface }) => void,\n ): Promise<PluginListenerHandle>;\n}\n"]}
@@ -58,9 +58,27 @@ public class StripeTerminal: NSObject, DiscoveryDelegate, TerminalDelegate, Read
58
58
  return
59
59
  }
60
60
 
61
- self.discoverCall = call
62
61
  self.plugin?.notifyListeners(TerminalEvents.DiscoveringReaders.rawValue, data: [:])
63
62
 
63
+
64
+ let bluetoothScanWaitTime = call.getDouble("bluetoothScanWaitTime") ?? 0
65
+ if (self.type == .bluetoothScan && bluetoothScanWaitTime != 0) {
66
+ // When bluetoothScanWaitTime is non-zero, we defer the resolution of the call
67
+ // using a timer. In this case, discoverCall is not assigned because the resolution
68
+ // logic is handled asynchronously after the wait time.
69
+ DispatchQueue.main.asyncAfter(deadline: .now() + bluetoothScanWaitTime / 1000.0) {
70
+ var readersJSObject: JSArray = []
71
+ for reader in self.discoveredReadersList ?? [] {
72
+ readersJSObject.append(self.convertReaderInterface(reader: reader))
73
+ }
74
+ call.resolve([
75
+ "readers": readersJSObject
76
+ ])
77
+ }
78
+ } else {
79
+ self.discoverCall = call
80
+ }
81
+
64
82
  self.discoverCancelable = Terminal.shared.discoverReaders(config, delegate: self) { error in
65
83
  if let error = error {
66
84
  print("discoverReaders failed: \(error)")
@@ -80,6 +98,8 @@ public class StripeTerminal: NSObject, DiscoveryDelegate, TerminalDelegate, Read
80
98
  self.discoveredReadersList = readers
81
99
 
82
100
  self.plugin?.notifyListeners(TerminalEvents.DiscoveredReaders.rawValue, data: ["readers": readersJSObject])
101
+
102
+ // If self.type == .bluetoothScan, discoverCall is nil
83
103
  self.discoverCall?.resolve([
84
104
  "readers": readersJSObject
85
105
  ])
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@capacitor-community/stripe-terminal",
3
- "version": "7.2.0-0",
3
+ "version": "7.2.0",
4
4
  "engines": {
5
5
  "node": ">=20.0.0"
6
6
  },