@padosoft/react-native-ecr17 0.0.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.
Files changed (107) hide show
  1. package/Ecr17.podspec +39 -0
  2. package/README.md +348 -0
  3. package/android/CMakeLists.txt +41 -0
  4. package/android/build.gradle +149 -0
  5. package/android/fix-prefab.gradle +51 -0
  6. package/android/gradle.properties +5 -0
  7. package/android/src/main/AndroidManifest.xml +2 -0
  8. package/android/src/main/cpp/cpp-adapter.cpp +9 -0
  9. package/android/src/main/java/com/margelo/nitro/ecr17/HybridEcr17Transport.kt +233 -0
  10. package/android/src/main/java/com/padosoft/ecr17/Ecr17Package.kt +30 -0
  11. package/cpp/Ecr17.cpp +1 -0
  12. package/cpp/Ecr17.hpp +2 -0
  13. package/cpp/Ecr17Client/HybridEcr17Client.cpp +598 -0
  14. package/cpp/Ecr17Client/HybridEcr17Client.hpp +85 -0
  15. package/cpp/Ecr17Protocol/Ecr17Protocol.cpp +277 -0
  16. package/cpp/Ecr17Protocol/Ecr17Protocol.hpp +103 -0
  17. package/cpp/Ecr17Response/Ecr17Response.cpp +155 -0
  18. package/cpp/Ecr17Response/Ecr17Response.hpp +113 -0
  19. package/cpp/Lcr/Lcr.cpp +42 -0
  20. package/cpp/Lcr/Lcr.hpp +22 -0
  21. package/cpp/PacketCodec/PacketCodec.cpp +146 -0
  22. package/cpp/PacketCodec/PacketCodec.hpp +48 -0
  23. package/cpp/Session/Ecr17Session.cpp +260 -0
  24. package/cpp/Session/Ecr17Session.hpp +97 -0
  25. package/cpp/Session/RetryPolicy.hpp +23 -0
  26. package/cpp/Transport/FakeTransport.hpp +95 -0
  27. package/cpp/Transport/NativeTransportAdapter.cpp +42 -0
  28. package/cpp/Transport/NativeTransportAdapter.hpp +32 -0
  29. package/cpp/Transport/Transport.hpp +31 -0
  30. package/cpp/tests/CMakeLists.txt +55 -0
  31. package/cpp/tests/PosixTcpTransport.hpp +105 -0
  32. package/cpp/tests/stubs/LrcMode.hpp +25 -0
  33. package/cpp/tests/test_flows.cpp +148 -0
  34. package/cpp/tests/test_integration_terminal.cpp +72 -0
  35. package/cpp/tests/test_lrc.cpp +66 -0
  36. package/cpp/tests/test_packet_codec.cpp +164 -0
  37. package/cpp/tests/test_protocol.cpp +102 -0
  38. package/cpp/tests/test_protocol_commands.cpp +190 -0
  39. package/cpp/tests/test_response.cpp +164 -0
  40. package/cpp/tests/test_retry_policy.cpp +28 -0
  41. package/cpp/tests/test_session.cpp +262 -0
  42. package/ios/Bridge.h +1 -0
  43. package/ios/HybridEcr17Transport.swift +103 -0
  44. package/nitro.json +30 -0
  45. package/nitrogen/generated/.gitattributes +1 -0
  46. package/nitrogen/generated/android/Ecr17+autolinking.cmake +82 -0
  47. package/nitrogen/generated/android/Ecr17+autolinking.gradle +27 -0
  48. package/nitrogen/generated/android/Ecr17OnLoad.cpp +68 -0
  49. package/nitrogen/generated/android/Ecr17OnLoad.hpp +34 -0
  50. package/nitrogen/generated/android/c++/JFunc_void.hpp +75 -0
  51. package/nitrogen/generated/android/c++/JFunc_void_std__shared_ptr_ArrayBuffer_.hpp +77 -0
  52. package/nitrogen/generated/android/c++/JHybridEcr17TransportSpec.cpp +93 -0
  53. package/nitrogen/generated/android/c++/JHybridEcr17TransportSpec.hpp +68 -0
  54. package/nitrogen/generated/android/kotlin/com/margelo/nitro/ecr17/Ecr17OnLoad.kt +35 -0
  55. package/nitrogen/generated/android/kotlin/com/margelo/nitro/ecr17/Func_void.kt +80 -0
  56. package/nitrogen/generated/android/kotlin/com/margelo/nitro/ecr17/Func_void_std__shared_ptr_ArrayBuffer_.kt +80 -0
  57. package/nitrogen/generated/android/kotlin/com/margelo/nitro/ecr17/HybridEcr17TransportSpec.kt +86 -0
  58. package/nitrogen/generated/ios/Ecr17+autolinking.rb +62 -0
  59. package/nitrogen/generated/ios/Ecr17-Swift-Cxx-Bridge.cpp +57 -0
  60. package/nitrogen/generated/ios/Ecr17-Swift-Cxx-Bridge.hpp +154 -0
  61. package/nitrogen/generated/ios/Ecr17-Swift-Cxx-Umbrella.hpp +47 -0
  62. package/nitrogen/generated/ios/Ecr17Autolinking.mm +43 -0
  63. package/nitrogen/generated/ios/Ecr17Autolinking.swift +26 -0
  64. package/nitrogen/generated/ios/c++/HybridEcr17TransportSpecSwift.cpp +11 -0
  65. package/nitrogen/generated/ios/c++/HybridEcr17TransportSpecSwift.hpp +119 -0
  66. package/nitrogen/generated/ios/swift/Func_void.swift +46 -0
  67. package/nitrogen/generated/ios/swift/Func_void_std__exception_ptr.swift +46 -0
  68. package/nitrogen/generated/ios/swift/Func_void_std__shared_ptr_ArrayBuffer_.swift +46 -0
  69. package/nitrogen/generated/ios/swift/HybridEcr17TransportSpec.swift +60 -0
  70. package/nitrogen/generated/ios/swift/HybridEcr17TransportSpec_cxx.swift +211 -0
  71. package/nitrogen/generated/shared/c++/CardType.hpp +84 -0
  72. package/nitrogen/generated/shared/c++/CardVerificationRequest.hpp +97 -0
  73. package/nitrogen/generated/shared/c++/CardVerificationResult.hpp +136 -0
  74. package/nitrogen/generated/shared/c++/CloseSessionResult.hpp +106 -0
  75. package/nitrogen/generated/shared/c++/ConnectionState.hpp +80 -0
  76. package/nitrogen/generated/shared/c++/CurrencyExchange.hpp +100 -0
  77. package/nitrogen/generated/shared/c++/Ecr17Config.hpp +138 -0
  78. package/nitrogen/generated/shared/c++/HybridEcr17ClientSpec.cpp +42 -0
  79. package/nitrogen/generated/shared/c++/HybridEcr17ClientSpec.hpp +138 -0
  80. package/nitrogen/generated/shared/c++/HybridEcr17TransportSpec.cpp +26 -0
  81. package/nitrogen/generated/shared/c++/HybridEcr17TransportSpec.hpp +70 -0
  82. package/nitrogen/generated/shared/c++/IncrementalAuthRequest.hpp +96 -0
  83. package/nitrogen/generated/shared/c++/LrcMode.hpp +84 -0
  84. package/nitrogen/generated/shared/c++/PaymentCardType.hpp +84 -0
  85. package/nitrogen/generated/shared/c++/PaymentRequest.hpp +109 -0
  86. package/nitrogen/generated/shared/c++/PaymentResult.hpp +139 -0
  87. package/nitrogen/generated/shared/c++/PosStatusResponse.hpp +96 -0
  88. package/nitrogen/generated/shared/c++/PreAuthClosureRequest.hpp +96 -0
  89. package/nitrogen/generated/shared/c++/PreAuthRequest.hpp +109 -0
  90. package/nitrogen/generated/shared/c++/PreAuthResult.hpp +144 -0
  91. package/nitrogen/generated/shared/c++/ProgressEvent.hpp +83 -0
  92. package/nitrogen/generated/shared/c++/ReceiptLine.hpp +83 -0
  93. package/nitrogen/generated/shared/c++/ReversalRequest.hpp +88 -0
  94. package/nitrogen/generated/shared/c++/ReversalResult.hpp +132 -0
  95. package/nitrogen/generated/shared/c++/TokenizationRequest.hpp +89 -0
  96. package/nitrogen/generated/shared/c++/TokenizationService.hpp +76 -0
  97. package/nitrogen/generated/shared/c++/TotalsResult.hpp +93 -0
  98. package/nitrogen/generated/shared/c++/TransactionEntryMode.hpp +92 -0
  99. package/nitrogen/generated/shared/c++/TransactionOutcome.hpp +88 -0
  100. package/nitrogen/generated/shared/c++/VasResult.hpp +96 -0
  101. package/package.json +102 -0
  102. package/react-native.config.js +18 -0
  103. package/src/index.ts +4 -0
  104. package/src/specs/client.nitro.ts +102 -0
  105. package/src/specs/transport.nitro.ts +25 -0
  106. package/src/types/client.ts +196 -0
  107. package/src/utils/client.ts +10 -0
package/package.json ADDED
@@ -0,0 +1,102 @@
1
+ {
2
+ "name": "@padosoft/react-native-ecr17",
3
+ "version": "0.0.0",
4
+ "description": "react-native-ecr17 is a RN package built with Nitro for the ECR17 protocol, allowing integration with POS terminals.",
5
+ "main": "./lib/commonjs/index.js",
6
+ "module": "./lib/module/index.js",
7
+ "types": "./lib/typescript/src/index.d.ts",
8
+ "react-native": "src/index",
9
+ "source": "src/index",
10
+ "scripts": {
11
+ "typecheck": "tsc --noEmit",
12
+ "clean": "git clean -dfX",
13
+ "build": "bob build",
14
+ "codegen": "nitrogen --logLevel=\"debug\" && bun run build"
15
+ },
16
+ "keywords": [
17
+ "react-native",
18
+ "react-native-ecr17",
19
+ "ecr17"
20
+ ],
21
+ "files": [
22
+ "src",
23
+ "react-native.config.js",
24
+ "lib",
25
+ "nitrogen",
26
+ "cpp",
27
+ "nitro.json",
28
+ "android/build.gradle",
29
+ "android/fix-prefab.gradle",
30
+ "android/gradle.properties",
31
+ "android/CMakeLists.txt",
32
+ "android/src",
33
+ "ios/**/*.h",
34
+ "ios/**/*.m",
35
+ "ios/**/*.mm",
36
+ "ios/**/*.cpp",
37
+ "ios/**/*.swift",
38
+ "*.podspec",
39
+ "README.md"
40
+ ],
41
+ "workspaces": [
42
+ "example"
43
+ ],
44
+ "repository": "https://github.com/padosoft/react-native-ecr17.git",
45
+ "author": "padosoft",
46
+ "license": "MIT",
47
+ "bugs": "https://github.com/padosoft/react-native-ecr17/issues",
48
+ "homepage": "https://github.com/padosoft/react-native-ecr17#readme",
49
+ "publishConfig": {
50
+ "access": "public",
51
+ "registry": "https://registry.npmjs.org/"
52
+ },
53
+ "devDependencies": {
54
+ "@types/react": "19.2.0",
55
+ "nitrogen": "0.35.8",
56
+ "react": "19.2.3",
57
+ "react-native-builder-bob": "^0.41.0",
58
+ "react-native-nitro-modules": "0.35.8",
59
+ "typescript": "^6.0.3"
60
+ },
61
+ "peerDependencies": {
62
+ "react": "*",
63
+ "react-native": "*",
64
+ "react-native-nitro-modules": "*"
65
+ },
66
+ "eslintConfig": {
67
+ "root": true,
68
+ "extends": [
69
+ "@react-native",
70
+ "prettier"
71
+ ],
72
+ "plugins": [
73
+ "prettier"
74
+ ],
75
+ "rules": {
76
+ "prettier/prettier": [
77
+ "warn",
78
+ {
79
+ "quoteProps": "consistent",
80
+ "singleQuote": true,
81
+ "tabWidth": 2,
82
+ "trailingComma": "es5",
83
+ "useTabs": false
84
+ }
85
+ ]
86
+ }
87
+ },
88
+ "react-native-builder-bob": {
89
+ "source": "src",
90
+ "output": "lib",
91
+ "targets": [
92
+ "commonjs",
93
+ "module",
94
+ [
95
+ "typescript",
96
+ {
97
+ "project": "tsconfig.json"
98
+ }
99
+ ]
100
+ ]
101
+ }
102
+ }
@@ -0,0 +1,18 @@
1
+ // React Native CLI autolinking config for this native module.
2
+ // https://github.com/react-native-community/cli/blob/main/docs/dependencies.md
3
+ //
4
+ // Declaring the android/ios platforms makes the CLI treat this package as a
5
+ // native dependency and autolink it. On Android that registers Ecr17Package,
6
+ // whose static initializer loads libEcr17.so (System.loadLibrary) so the Nitro
7
+ // HybridObjects are registered before JS creates them.
8
+
9
+ module.exports = {
10
+ dependency: {
11
+ platforms: {
12
+ /** @type {import('@react-native-community/cli-types').IOSDependencyParams} */
13
+ ios: {},
14
+ /** @type {import('@react-native-community/cli-types').AndroidDependencyParams} */
15
+ android: {},
16
+ },
17
+ },
18
+ };
package/src/index.ts ADDED
@@ -0,0 +1,4 @@
1
+ export * from "./specs/client.nitro";
2
+ export * from "./specs/transport.nitro";
3
+ export * from "./types/client";
4
+ export * from "./utils/client";
@@ -0,0 +1,102 @@
1
+ import type { HybridObject } from "react-native-nitro-modules";
2
+ import type {
3
+ CardVerificationRequest,
4
+ CardVerificationResult,
5
+ CloseSessionResult,
6
+ ConnectionState,
7
+ IncrementalAuthRequest,
8
+ LrcMode,
9
+ PaymentRequest,
10
+ PaymentResult,
11
+ PreAuthClosureRequest,
12
+ PreAuthRequest,
13
+ PreAuthResult,
14
+ ProgressEvent,
15
+ ReceiptLine,
16
+ ReversalRequest,
17
+ ReversalResult,
18
+ TotalsResult,
19
+ VasResult,
20
+ } from "../types/client";
21
+
22
+ export interface Ecr17Config {
23
+ host: string;
24
+ port?: number;
25
+
26
+ terminalId: string;
27
+ cashRegisterId: string;
28
+
29
+ lrcMode?: LrcMode;
30
+
31
+ keepAlive?: boolean;
32
+ autoReconnect?: boolean;
33
+
34
+ connectionTimeoutMs?: number;
35
+ responseTimeoutMs?: number;
36
+ ackTimeoutMs?: number;
37
+
38
+ // After a transaction result, keep forwarding 'S' receipt lines (onReceiptLine)
39
+ // until this many ms of silence. 0/undefined = off. Set when ECR-printing is on.
40
+ receiptDrainMs?: number;
41
+
42
+ retryCount?: number;
43
+ retryDelayMs?: number;
44
+
45
+ debug?: boolean;
46
+ }
47
+
48
+ export const PosTerminalStatusMessage = {
49
+ 0: "Terminal not configured",
50
+ 1: "Terminal configured, no DLL",
51
+ 2: "Terminal operative (after a DLL)",
52
+ 3: "Terminal not aligned (first DLL requested)",
53
+ 4: "KMPB/KPOS key corrupted (first DLL requested)",
54
+ 5: "DLL solicited by GT pending",
55
+ 6: "Remote SW updated request pending",
56
+ [-1]: "Unknown",
57
+ } as const;
58
+
59
+ export type PosTerminalStatus = keyof typeof PosTerminalStatusMessage;
60
+
61
+ export interface PosStatusResponse {
62
+ terminalId: string;
63
+ terminalDateTime: Date;
64
+ status: PosTerminalStatus;
65
+ softwareRelease: string;
66
+ }
67
+
68
+ export interface Ecr17Client
69
+ extends HybridObject<{
70
+ ios: "c++";
71
+ android: "c++";
72
+ }> {
73
+ // --- Configuration (synchronous) ---
74
+ configure(config: Ecr17Config): void;
75
+ configuration(): Ecr17Config;
76
+
77
+ // --- Connection ---
78
+ connect(): Promise<void>;
79
+ disconnect(): void;
80
+ isConnected(): boolean;
81
+
82
+ // --- Commands (asynchronous: each performs a full request/response exchange) ---
83
+ status(): Promise<PosStatusResponse>; // 's'
84
+ pay(request: PaymentRequest): Promise<PaymentResult>; // 'P'
85
+ payExtended(request: PaymentRequest): Promise<PaymentResult>; // 'X'
86
+ reverse(request: ReversalRequest): Promise<ReversalResult>; // 'S'
87
+ preAuth(request: PreAuthRequest): Promise<PreAuthResult>; // 'p'
88
+ incrementalAuth(request: IncrementalAuthRequest): Promise<PreAuthResult>; // 'i'
89
+ preAuthClosure(request: PreAuthClosureRequest): Promise<PaymentResult>; // 'c'
90
+ verifyCard(request: CardVerificationRequest): Promise<CardVerificationResult>; // 'H'
91
+ closeSession(): Promise<CloseSessionResult>; // 'C'
92
+ totals(): Promise<TotalsResult>; // 'T'
93
+ sendLastResult(): Promise<PaymentResult>; // 'G'
94
+ enableEcrPrinting(enabled: boolean): Promise<void>; // 'E'
95
+ reprint(toEcr: boolean): Promise<void>; // 'R'
96
+ vas(xmlRequest: string): Promise<VasResult>; // 'K'
97
+
98
+ // --- Events ---
99
+ setOnProgress(callback: (event: ProgressEvent) => void): void;
100
+ setOnReceiptLine(callback: (line: ReceiptLine) => void): void;
101
+ setOnConnectionStateChange(callback: (state: ConnectionState) => void): void;
102
+ }
@@ -0,0 +1,25 @@
1
+ import type { HybridObject } from "react-native-nitro-modules";
2
+
3
+ // Low-level byte transport for the ECR17 LAN connection.
4
+ //
5
+ // Implemented natively (Swift on iOS, Kotlin on Android) so it can use the
6
+ // platform networking stacks. The C++ protocol core consumes it through a thin
7
+ // adapter; all ECR17 framing/orchestration stays in shared C++.
8
+ //
9
+ // Received bytes are delivered via setOnData (called from a native reader
10
+ // thread). `send` is fire-and-forget; back-pressure/ordering is the transport's
11
+ // responsibility.
12
+ export interface Ecr17Transport
13
+ extends HybridObject<{
14
+ ios: "swift";
15
+ android: "kotlin";
16
+ }> {
17
+ connect(host: string, port: number, timeoutMs: number): Promise<void>;
18
+ disconnect(): void;
19
+ isConnected(): boolean;
20
+
21
+ send(bytes: ArrayBuffer): void;
22
+
23
+ setOnData(callback: (bytes: ArrayBuffer) => void): void;
24
+ setOnDisconnect(callback: () => void): void;
25
+ }
@@ -0,0 +1,196 @@
1
+ // LRC scope selector. Which framing bytes are folded into the LRC (base 0x7F):
2
+ // - "stx": STX + payload + ETX
3
+ // - "std": payload only
4
+ // - "noext": payload + ETX
5
+ // - "stx_noext": STX + payload
6
+ export type LrcMode = "stx" | "std" | "noext" | "stx_noext";
7
+
8
+ // Transport connection lifecycle.
9
+ export type ConnectionState = "disconnected" | "connecting" | "connected";
10
+
11
+ // Normalized transaction outcome (mapped from the raw 2-digit result code).
12
+ // "00" -> ok, "01" -> ko, "05" -> cardNotPresent, "09" -> unknownTag.
13
+ export type TransactionOutcome = "ok" | "ko" | "cardNotPresent" | "unknownTag" | "unknown";
14
+
15
+ // Card category reported by the terminal (response "Card type": 1/2/3).
16
+ export type CardType = "debit" | "credit" | "other" | "unknown";
17
+
18
+ // How the card was read (response "Transaction type": ICC/MAG/MAN/CLM/CLI).
19
+ export type TransactionEntryMode = "icc" | "mag" | "manual" | "clessMag" | "clessIcc" | "unknown";
20
+
21
+ // Requested card handling for a payment (request "Payment type": 0..3).
22
+ export type PaymentCardType = "auto" | "debit" | "credit" | "other";
23
+
24
+ // Tokenization service requested alongside a payment/preauth/verification (command "U").
25
+ export type TokenizationService = "recurring" | "unscheduledOrOneClick";
26
+
27
+ export interface TokenizationRequest {
28
+ service: TokenizationService;
29
+ // Unique contract code at merchant level, alphanumeric, up to 18 chars.
30
+ contractCode: string;
31
+ }
32
+
33
+ // ---------------------------------------------------------------------------
34
+ // Requests
35
+ // ---------------------------------------------------------------------------
36
+
37
+ export interface PaymentRequest {
38
+ amountCents: number;
39
+ // Defaults to the configured cashRegisterId when omitted.
40
+ cashRegisterId?: string;
41
+ paymentType?: PaymentCardType;
42
+ // true => start with the card already inserted in the terminal.
43
+ cardAlreadyPresent?: boolean;
44
+ // Text (e.g. contract code) printed at the end of the receipt (max 128 chars).
45
+ receiptText?: string;
46
+ // Attach tokenization additional data ("U") to this transaction.
47
+ tokenization?: TokenizationRequest;
48
+ }
49
+
50
+ export interface ReversalRequest {
51
+ cashRegisterId?: string;
52
+ // STAN of the transaction to reverse; "000000" (default) reverses the last
53
+ // payment with no STAN check.
54
+ stan?: string;
55
+ }
56
+
57
+ export interface PreAuthRequest {
58
+ amountCents: number;
59
+ cashRegisterId?: string;
60
+ paymentType?: PaymentCardType;
61
+ cardAlreadyPresent?: boolean;
62
+ receiptText?: string;
63
+ tokenization?: TokenizationRequest;
64
+ }
65
+
66
+ export interface IncrementalAuthRequest {
67
+ amountCents: number;
68
+ // Unique pre-authorization code from the original pre-auth response.
69
+ originalPreAuthCode: string;
70
+ cashRegisterId?: string;
71
+ receiptText?: string;
72
+ }
73
+
74
+ export interface PreAuthClosureRequest {
75
+ amountCents: number;
76
+ originalPreAuthCode: string;
77
+ cashRegisterId?: string;
78
+ receiptText?: string;
79
+ }
80
+
81
+ export interface CardVerificationRequest {
82
+ cashRegisterId?: string;
83
+ paymentType?: PaymentCardType;
84
+ tokenization?: TokenizationRequest;
85
+ }
86
+
87
+ // ---------------------------------------------------------------------------
88
+ // Results
89
+ // ---------------------------------------------------------------------------
90
+
91
+ // DCC / currency-exchange block (only meaningful when applied === true).
92
+ export interface CurrencyExchange {
93
+ applied: boolean;
94
+ rate?: number;
95
+ currencyCode?: string;
96
+ amountCents?: number;
97
+ precision?: number;
98
+ }
99
+
100
+ export interface PaymentResult {
101
+ outcome: TransactionOutcome;
102
+ resultCode: string; // raw "00"/"01"/"05"/"09"
103
+ pan?: string;
104
+ entryMode?: TransactionEntryMode;
105
+ authCode?: string;
106
+ hostDateTime?: string; // raw DDDHHMM as received from host
107
+ cardType?: CardType;
108
+ acquirerId?: string;
109
+ stan?: string;
110
+ onlineId?: string;
111
+ errorDescription?: string;
112
+ currencyExchange?: CurrencyExchange;
113
+ }
114
+
115
+ export interface ReversalResult {
116
+ outcome: TransactionOutcome;
117
+ resultCode: string;
118
+ pan?: string;
119
+ entryMode?: TransactionEntryMode;
120
+ hostDateTime?: string;
121
+ cardType?: CardType;
122
+ acquirerId?: string;
123
+ stan?: string;
124
+ onlineId?: string;
125
+ actionCode?: string;
126
+ errorDescription?: string;
127
+ }
128
+
129
+ export interface PreAuthResult {
130
+ outcome: TransactionOutcome;
131
+ resultCode: string;
132
+ pan?: string;
133
+ entryMode?: TransactionEntryMode;
134
+ authCode?: string;
135
+ preAuthorizedAmountCents?: number;
136
+ preAuthCode?: string;
137
+ actionCode?: string;
138
+ hostDateTime?: string;
139
+ cardType?: CardType;
140
+ acquirerId?: string;
141
+ stan?: string;
142
+ onlineId?: string;
143
+ errorDescription?: string;
144
+ }
145
+
146
+ export interface CardVerificationResult {
147
+ outcome: TransactionOutcome;
148
+ resultCode: string;
149
+ pan?: string;
150
+ entryMode?: TransactionEntryMode;
151
+ authCode?: string;
152
+ hostDateTime?: string;
153
+ cardType?: CardType;
154
+ acquirerId?: string;
155
+ stan?: string;
156
+ onlineId?: string;
157
+ actionCode?: string;
158
+ errorDescription?: string;
159
+ }
160
+
161
+ export interface TotalsResult {
162
+ outcome: TransactionOutcome;
163
+ resultCode: string;
164
+ posTotalCents: number;
165
+ }
166
+
167
+ export interface CloseSessionResult {
168
+ outcome: TransactionOutcome;
169
+ resultCode: string;
170
+ posTotalCents?: number;
171
+ hostTotalCents?: number;
172
+ actionCode?: string;
173
+ errorDescription?: string;
174
+ }
175
+
176
+ export interface VasResult {
177
+ responseId: string; // RESPID ("0" = OK)
178
+ responseMessage: string; // RESPMSG
179
+ orderId?: string; // ORDER_ID when present
180
+ rawXml: string; // full concatenated XML response
181
+ }
182
+
183
+ // ---------------------------------------------------------------------------
184
+ // Events
185
+ // ---------------------------------------------------------------------------
186
+
187
+ // Progress-update message shown on the ECR display during a procedure (SOH frame).
188
+ export interface ProgressEvent {
189
+ message: string;
190
+ }
191
+
192
+ // A single receipt line streamed by the terminal ("S" message) when ECR
193
+ // printing is enabled.
194
+ export interface ReceiptLine {
195
+ text: string;
196
+ }
@@ -0,0 +1,10 @@
1
+ import { NitroModules } from "react-native-nitro-modules";
2
+ import type { Ecr17Client, Ecr17Config } from "../specs/client.nitro";
3
+
4
+ export function createEcr17Client(config: Ecr17Config): Ecr17Client {
5
+ const client = NitroModules.createHybridObject<Ecr17Client>("Ecr17Client");
6
+
7
+ client.configure(config);
8
+
9
+ return client;
10
+ }