toss-expo-sdk 1.0.1 → 1.0.2

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 (36) hide show
  1. package/README.md +58 -56
  2. package/lib/module/client/NonceAccountManager.js +2 -2
  3. package/lib/module/client/NonceAccountManager.js.map +1 -1
  4. package/lib/module/examples/enhancedFeaturesFlow.js +233 -0
  5. package/lib/module/examples/enhancedFeaturesFlow.js.map +1 -0
  6. package/lib/module/examples/offlinePaymentFlow.js +27 -27
  7. package/lib/module/examples/offlinePaymentFlow.js.map +1 -1
  8. package/lib/module/index.js +6 -0
  9. package/lib/module/index.js.map +1 -1
  10. package/lib/module/qr.js +2 -2
  11. package/lib/module/reconciliation.js +4 -4
  12. package/lib/module/reconciliation.js.map +1 -1
  13. package/lib/module/services/authService.js +3 -3
  14. package/lib/module/services/authService.js.map +1 -1
  15. package/lib/module/utils/compression.js +210 -0
  16. package/lib/module/utils/compression.js.map +1 -0
  17. package/lib/module/wifi.js +311 -0
  18. package/lib/module/wifi.js.map +1 -0
  19. package/lib/typescript/src/examples/enhancedFeaturesFlow.d.ts +45 -0
  20. package/lib/typescript/src/examples/enhancedFeaturesFlow.d.ts.map +1 -0
  21. package/lib/typescript/src/index.d.ts +2 -0
  22. package/lib/typescript/src/index.d.ts.map +1 -1
  23. package/lib/typescript/src/utils/compression.d.ts +52 -0
  24. package/lib/typescript/src/utils/compression.d.ts.map +1 -0
  25. package/lib/typescript/src/wifi.d.ts +116 -0
  26. package/lib/typescript/src/wifi.d.ts.map +1 -0
  27. package/package.json +1 -1
  28. package/src/client/NonceAccountManager.ts +2 -2
  29. package/src/examples/enhancedFeaturesFlow.ts +272 -0
  30. package/src/examples/offlinePaymentFlow.ts +27 -27
  31. package/src/index.tsx +12 -0
  32. package/src/qr.tsx +2 -2
  33. package/src/reconciliation.ts +4 -4
  34. package/src/services/authService.ts +3 -3
  35. package/src/utils/compression.ts +247 -0
  36. package/src/wifi.ts +401 -0
@@ -0,0 +1,210 @@
1
+ "use strict";
2
+
3
+ /**
4
+ * Compression Utilities for TOSS
5
+ *
6
+ * Implements safe, deterministic compression for metadata only.
7
+ * Transaction bytes are NEVER compressed to preserve determinism.
8
+ *
9
+ * Production-ready with official APIs.
10
+ */
11
+
12
+ import { Buffer } from 'buffer';
13
+
14
+ /**
15
+ * Simple DEFLATE-based compression using native zlib
16
+ * (Available in Node.js and via polyfills in React Native)
17
+ *
18
+ * For metadata compression: memos, recipient names, etc.
19
+ * NOT for transaction signatures or amounts!
20
+ */
21
+
22
+ /**
23
+ * Compress metadata safely
24
+ * Only compresses if compression saves >10% and data >200 bytes
25
+ *
26
+ * Safe for: memo text, user names, descriptions
27
+ * UNSAFE for: signatures, amounts, transaction data
28
+ */
29
+ export async function compressMetadata(data) {
30
+ try {
31
+ const originalBuffer = Buffer.from(data, 'utf-8');
32
+ const originalSize = originalBuffer.length;
33
+
34
+ // Only compress if it's worth it
35
+ if (originalSize < 200) {
36
+ return {
37
+ compressed: false,
38
+ data: new Uint8Array(originalBuffer),
39
+ originalSize,
40
+ compressedSize: originalSize,
41
+ compressionRatio: 1.0
42
+ };
43
+ }
44
+
45
+ // Use native compression if available (Node.js)
46
+ // For React Native, this will use a polyfill
47
+ const zlib = await importZlib();
48
+ const compressed = await new Promise((resolve, reject) => {
49
+ zlib.deflate(originalBuffer, (err, result) => {
50
+ if (err) reject(err);else resolve(result);
51
+ });
52
+ });
53
+ const compressedSize = compressed.length;
54
+ const compressionRatio = compressedSize / originalSize;
55
+
56
+ // Only use compression if it saves >10%
57
+ if (compressionRatio > 0.9) {
58
+ return {
59
+ compressed: false,
60
+ data: new Uint8Array(originalBuffer),
61
+ originalSize,
62
+ compressedSize: originalSize,
63
+ compressionRatio: 1.0
64
+ };
65
+ }
66
+ return {
67
+ compressed: true,
68
+ data: new Uint8Array(compressed),
69
+ originalSize,
70
+ compressedSize,
71
+ compressionRatio
72
+ };
73
+ } catch (error) {
74
+ // Graceful fallback: if compression fails, return uncompressed
75
+ console.warn('Compression failed, returning uncompressed:', error);
76
+ const buffer = Buffer.from(data, 'utf-8');
77
+ return {
78
+ compressed: false,
79
+ data: new Uint8Array(buffer),
80
+ originalSize: buffer.length,
81
+ compressedSize: buffer.length,
82
+ compressionRatio: 1.0
83
+ };
84
+ }
85
+ }
86
+
87
+ /**
88
+ * Decompress metadata
89
+ */
90
+ export async function decompressMetadata(data) {
91
+ try {
92
+ const zlib = await importZlib();
93
+ const decompressed = await new Promise((resolve, reject) => {
94
+ zlib.inflate(Buffer.from(data), (err, result) => {
95
+ if (err) reject(err);else resolve(result);
96
+ });
97
+ });
98
+ return decompressed.toString('utf-8');
99
+ } catch (error) {
100
+ console.warn('Decompression failed:', error);
101
+ // Assume data was not compressed
102
+ return Buffer.from(data).toString('utf-8');
103
+ }
104
+ }
105
+
106
+ /**
107
+ * Compress intent metadata for efficient transmission
108
+ * Returns the original intent with compressed metadata
109
+ */
110
+ export async function compressIntentMetadata(intentMetadata) {
111
+ const compressed = {};
112
+ let totalOriginal = 0;
113
+ let totalCompressed = 0;
114
+ for (const [key, value] of Object.entries(intentMetadata)) {
115
+ if (typeof value === 'string') {
116
+ const result = await compressMetadata(value);
117
+ totalOriginal += result.originalSize;
118
+ totalCompressed += result.compressedSize;
119
+ if (result.compressed) {
120
+ compressed[key] = {
121
+ __compressed: true,
122
+ data: Array.from(result.data)
123
+ };
124
+ } else {
125
+ compressed[key] = value;
126
+ }
127
+ } else {
128
+ compressed[key] = value;
129
+ }
130
+ }
131
+ const savings = totalOriginal > 0 ? (totalOriginal - totalCompressed) / totalOriginal * 100 : 0;
132
+ return {
133
+ original: intentMetadata,
134
+ compressed,
135
+ savings: Math.round(savings)
136
+ };
137
+ }
138
+
139
+ /**
140
+ * Decompress intent metadata
141
+ */
142
+ export async function decompressIntentMetadata(compressedMetadata) {
143
+ const decompressed = {};
144
+ for (const [key, value] of Object.entries(compressedMetadata)) {
145
+ if (typeof value === 'object' && value !== null && value.__compressed === true) {
146
+ const buffer = new Uint8Array(value.data);
147
+ decompressed[key] = await decompressMetadata(buffer);
148
+ } else {
149
+ decompressed[key] = value;
150
+ }
151
+ }
152
+ return decompressed;
153
+ }
154
+
155
+ /**
156
+ * Lazy-load zlib to avoid breaking in environments without it
157
+ */
158
+ async function importZlib() {
159
+ // In Node.js, use native zlib
160
+ if (typeof require !== 'undefined') {
161
+ try {
162
+ return require('zlib');
163
+ } catch {
164
+ // Fall through to polyfill
165
+ }
166
+ }
167
+
168
+ // For React Native, try to use a polyfill
169
+ // This can be pako (pako-zlib) or similar
170
+ try {
171
+ // eslint-disable-next-line @typescript-eslint/no-explicit-any
172
+ const pako = await import('pako');
173
+ return {
174
+ deflate: (data, callback) => {
175
+ try {
176
+ const compressed = pako.deflate(data);
177
+ callback(null, Buffer.from(compressed));
178
+ } catch (err) {
179
+ callback(err);
180
+ }
181
+ },
182
+ inflate: (data, callback) => {
183
+ try {
184
+ const decompressed = pako.inflate(data);
185
+ callback(null, Buffer.from(decompressed));
186
+ } catch (err) {
187
+ callback(err);
188
+ }
189
+ }
190
+ };
191
+ } catch {
192
+ throw new Error('Compression not available in this environment. Install pako or use Node.js.');
193
+ }
194
+ }
195
+
196
+ /**
197
+ * Calculate size savings for a metadata object
198
+ */
199
+ export function estimateCompressionSavings(metadata) {
200
+ let totalSize = 0;
201
+ for (const value of Object.values(metadata)) {
202
+ if (typeof value === 'string') {
203
+ totalSize += value.length;
204
+ }
205
+ }
206
+
207
+ // Conservative estimate: ~35% savings on text (typical for DEFLATE)
208
+ return Math.round(totalSize * 0.35);
209
+ }
210
+ //# sourceMappingURL=compression.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"names":["Buffer","compressMetadata","data","originalBuffer","from","originalSize","length","compressed","Uint8Array","compressedSize","compressionRatio","zlib","importZlib","Promise","resolve","reject","deflate","err","result","error","console","warn","buffer","decompressMetadata","decompressed","inflate","toString","compressIntentMetadata","intentMetadata","totalOriginal","totalCompressed","key","value","Object","entries","__compressed","Array","savings","original","Math","round","decompressIntentMetadata","compressedMetadata","require","pako","callback","Error","estimateCompressionSavings","metadata","totalSize","values"],"sourceRoot":"../../../src","sources":["utils/compression.ts"],"mappings":"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","ignoreList":[]}
@@ -0,0 +1,311 @@
1
+ "use strict";
2
+
3
+ /**
4
+ * WiFi Direct Transport for TOSS
5
+ *
6
+ * Higher-bandwidth alternative to BLE for device-to-device communication
7
+ * Fallback to BLE if WiFi Direct unavailable
8
+ *
9
+ * Uses native React Native APIs for production-ready implementation
10
+ */
11
+
12
+ import { NativeModules, Platform } from 'react-native';
13
+ import { TossError } from "./errors.js";
14
+ const {
15
+ WiFiDirect
16
+ } = NativeModules;
17
+
18
+ /**
19
+ * WiFi Direct connection state
20
+ */
21
+
22
+ /**
23
+ * WiFi Direct socket for data transmission
24
+ */
25
+
26
+ /**
27
+ * WiFi Direct Transport Handler
28
+ * Wrapper around native WiFi Direct capabilities
29
+ *
30
+ * Supports higher MTU (1200+ bytes) than BLE (480 bytes)
31
+ * Useful for batch transmission of intents
32
+ */
33
+ export class WiFiDirectTransport {
34
+ connectedPeers = new Map();
35
+ SOCKET_TIMEOUT = 30000; // 30 seconds
36
+ WIFI_MTU = 1200; // Conservative MTU for WiFi packets
37
+
38
+ constructor(_platform = 'android') {
39
+ if (!WiFiDirect) {
40
+ console.warn('WiFi Direct not available in this environment (requires native module)');
41
+ }
42
+ }
43
+
44
+ /**
45
+ * Check if WiFi Direct is available on device
46
+ */
47
+ async isAvailable() {
48
+ if (!WiFiDirect) {
49
+ return false;
50
+ }
51
+ try {
52
+ if (Platform.OS === 'android') {
53
+ return await WiFiDirect.isAvailable();
54
+ }
55
+ // iOS uses different APIs (Bonjour, Multipeer Connectivity)
56
+ return true;
57
+ } catch (error) {
58
+ console.warn('Error checking WiFi Direct availability:', error);
59
+ return false;
60
+ }
61
+ }
62
+
63
+ /**
64
+ * Enable WiFi Direct on device
65
+ */
66
+ async enable() {
67
+ if (!WiFiDirect) {
68
+ throw new TossError('WiFi Direct native module not available', 'WIFI_DIRECT_UNAVAILABLE');
69
+ }
70
+ try {
71
+ if (Platform.OS === 'android') {
72
+ await WiFiDirect.enable();
73
+ }
74
+ } catch (error) {
75
+ throw new TossError(`Failed to enable WiFi Direct: ${error instanceof Error ? error.message : String(error)}`, 'WIFI_DIRECT_ERROR');
76
+ }
77
+ }
78
+
79
+ /**
80
+ * Discover nearby WiFi Direct peers
81
+ */
82
+ async discoverPeers(timeoutSeconds = 10) {
83
+ if (!WiFiDirect) {
84
+ return [];
85
+ }
86
+ try {
87
+ const peers = await WiFiDirect.discoverPeers(timeoutSeconds * 1000);
88
+ return peers.map(p => ({
89
+ deviceName: p.deviceName,
90
+ deviceAddress: p.deviceAddress,
91
+ isGroupOwner: p.isGroupOwner,
92
+ signalStrength: p.signalStrength
93
+ }));
94
+ } catch (error) {
95
+ console.warn('Peer discovery failed:', error);
96
+ return [];
97
+ }
98
+ }
99
+
100
+ /**
101
+ * Connect to a specific WiFi Direct peer
102
+ */
103
+ async connectToPeer(deviceAddress) {
104
+ if (!WiFiDirect) {
105
+ throw new TossError('WiFi Direct not available', 'WIFI_DIRECT_UNAVAILABLE');
106
+ }
107
+ try {
108
+ const socket = {
109
+ peerId: deviceAddress,
110
+ connected: false,
111
+ bytesTransferred: 0,
112
+ lastActivityTime: Date.now()
113
+ };
114
+ await WiFiDirect.connect(deviceAddress);
115
+ socket.connected = true;
116
+ this.connectedPeers.set(deviceAddress, socket);
117
+ return socket;
118
+ } catch (error) {
119
+ throw new TossError(`Failed to connect to WiFi Direct peer: ${error instanceof Error ? error.message : String(error)}`, 'WIFI_DIRECT_CONNECT_ERROR');
120
+ }
121
+ }
122
+
123
+ /**
124
+ * Send intent via WiFi Direct connection
125
+ * Uses larger MTU than BLE for efficiency
126
+ */
127
+ async sendIntent(socket, intent) {
128
+ if (!socket.connected) {
129
+ throw new TossError('WiFi Direct socket not connected', 'WIFI_DIRECT_DISCONNECTED');
130
+ }
131
+ try {
132
+ const intentBuffer = Buffer.from(JSON.stringify(intent), 'utf-8');
133
+ const chunks = Math.ceil(intentBuffer.length / this.WIFI_MTU);
134
+ let totalTransferred = 0;
135
+ for (let i = 0; i < chunks; i++) {
136
+ const start = i * this.WIFI_MTU;
137
+ const end = Math.min(start + this.WIFI_MTU, intentBuffer.length);
138
+ const chunk = intentBuffer.slice(start, end);
139
+
140
+ // Send with simple header: chunk number + total chunks
141
+ const chunkHeader = Buffer.allocUnsafe(2);
142
+ chunkHeader.writeUInt8(i, 0);
143
+ chunkHeader.writeUInt8(chunks, 1);
144
+ const packet = Buffer.concat([chunkHeader, chunk]);
145
+ await WiFiDirect.sendData(socket.peerId, packet);
146
+ totalTransferred += chunk.length;
147
+
148
+ // Update socket stats
149
+ socket.bytesTransferred += chunk.length;
150
+ socket.lastActivityTime = Date.now();
151
+
152
+ // Small delay between chunks to avoid congestion
153
+ await new Promise(resolve => setTimeout(resolve, 10));
154
+ }
155
+ return {
156
+ success: true,
157
+ bytesTransferred: totalTransferred,
158
+ chunks
159
+ };
160
+ } catch (error) {
161
+ throw new TossError(`Failed to send intent via WiFi Direct: ${error instanceof Error ? error.message : String(error)}`, 'WIFI_DIRECT_SEND_ERROR');
162
+ }
163
+ }
164
+
165
+ /**
166
+ * Send offline transaction via WiFi Direct
167
+ */
168
+ async sendOfflineTransaction(socket, transaction) {
169
+ const txBuffer = Buffer.from(JSON.stringify(transaction), 'utf-8');
170
+ const chunks = Math.ceil(txBuffer.length / this.WIFI_MTU);
171
+ let totalTransferred = 0;
172
+ for (let i = 0; i < chunks; i++) {
173
+ const start = i * this.WIFI_MTU;
174
+ const end = Math.min(start + this.WIFI_MTU, txBuffer.length);
175
+ const chunk = txBuffer.slice(start, end);
176
+ const chunkHeader = Buffer.allocUnsafe(2);
177
+ chunkHeader.writeUInt8(i, 0);
178
+ chunkHeader.writeUInt8(chunks, 1);
179
+ const packet = Buffer.concat([chunkHeader, chunk]);
180
+ await WiFiDirect.sendData(socket.peerId, packet);
181
+ totalTransferred += chunk.length;
182
+ socket.bytesTransferred += chunk.length;
183
+ socket.lastActivityTime = Date.now();
184
+ await new Promise(resolve => setTimeout(resolve, 10));
185
+ }
186
+ return {
187
+ success: true,
188
+ bytesTransferred: totalTransferred,
189
+ chunks
190
+ };
191
+ }
192
+
193
+ /**
194
+ * Receive data from WiFi Direct peer
195
+ */
196
+ async receiveData(socket, expectedChunks) {
197
+ const chunks = [];
198
+ const receivedChunks = new Set();
199
+ try {
200
+ while (receivedChunks.size < expectedChunks) {
201
+ const packet = await WiFiDirect.receiveData(socket.peerId, 5000); // 5 second timeout
202
+
203
+ if (packet) {
204
+ const chunkNumber = packet[0];
205
+ // Header byte (not used in reassembly)
206
+ const chunkData = packet.slice(2);
207
+ chunks[chunkNumber] = chunkData;
208
+ receivedChunks.add(chunkNumber);
209
+ socket.lastActivityTime = Date.now();
210
+ }
211
+
212
+ // Check timeout
213
+ if (Date.now() - socket.lastActivityTime > this.SOCKET_TIMEOUT) {
214
+ throw new TossError('WiFi Direct socket timeout', 'WIFI_DIRECT_TIMEOUT');
215
+ }
216
+ }
217
+ return Buffer.concat(chunks);
218
+ } catch (error) {
219
+ throw new TossError(`Failed to receive data via WiFi Direct: ${error instanceof Error ? error.message : String(error)}`, 'WIFI_DIRECT_RECEIVE_ERROR');
220
+ }
221
+ }
222
+
223
+ /**
224
+ * Disconnect from WiFi Direct peer
225
+ */
226
+ async disconnect(peerId) {
227
+ try {
228
+ const socket = this.connectedPeers.get(peerId);
229
+ if (socket) {
230
+ socket.connected = false;
231
+ this.connectedPeers.delete(peerId);
232
+ }
233
+ if (WiFiDirect) {
234
+ await WiFiDirect.disconnect(peerId);
235
+ }
236
+ } catch (error) {
237
+ console.warn(`Error disconnecting from ${peerId}:`, error);
238
+ }
239
+ }
240
+
241
+ /**
242
+ * Get all connected peers
243
+ */
244
+ getConnectedPeers() {
245
+ return Array.from(this.connectedPeers.values()).filter(socket => socket.connected);
246
+ }
247
+
248
+ /**
249
+ * Get MTU size for this transport
250
+ */
251
+ getMTU() {
252
+ return this.WIFI_MTU;
253
+ }
254
+
255
+ /**
256
+ * Clean up expired connections
257
+ */
258
+ cleanupExpiredConnections() {
259
+ const now = Date.now();
260
+ for (const [peerId, socket] of this.connectedPeers.entries()) {
261
+ if (now - socket.lastActivityTime > this.SOCKET_TIMEOUT) {
262
+ this.disconnect(peerId).catch(() => {});
263
+ }
264
+ }
265
+ }
266
+ }
267
+
268
+ /**
269
+ * Smart transport selector
270
+ * Automatically chooses best transport for given context
271
+ */
272
+ export class SmartTransportSelector {
273
+ constructor() {
274
+ this.wifiDirect = new WiFiDirectTransport();
275
+ }
276
+
277
+ /**
278
+ * Select best available transport for intent transmission
279
+ *
280
+ * Preference order:
281
+ * 1. WiFi Direct (fastest, 1200 MTU)
282
+ * 2. BLE (fallback, 480 MTU)
283
+ */
284
+ async selectTransport() {
285
+ const wifiAvailable = await this.wifiDirect.isAvailable();
286
+ if (wifiAvailable) {
287
+ return 'wifi';
288
+ }
289
+ return 'ble';
290
+ }
291
+
292
+ /**
293
+ * Check if WiFi Direct should be used
294
+ * Factors: availability, proximity, battery level
295
+ */
296
+ async shouldUseWiFi(checkBattery = false) {
297
+ const available = await this.wifiDirect.isAvailable();
298
+ if (!available) {
299
+ return false;
300
+ }
301
+
302
+ // Optional: check battery level
303
+ if (checkBattery) {
304
+ // In production, query Battery API
305
+ // For now, assume battery OK
306
+ return true;
307
+ }
308
+ return true;
309
+ }
310
+ }
311
+ //# sourceMappingURL=wifi.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"names":["NativeModules","Platform","TossError","WiFiDirect","WiFiDirectTransport","connectedPeers","Map","SOCKET_TIMEOUT","WIFI_MTU","constructor","_platform","console","warn","isAvailable","OS","error","enable","Error","message","String","discoverPeers","timeoutSeconds","peers","map","p","deviceName","deviceAddress","isGroupOwner","signalStrength","connectToPeer","socket","peerId","connected","bytesTransferred","lastActivityTime","Date","now","connect","set","sendIntent","intent","intentBuffer","Buffer","from","JSON","stringify","chunks","Math","ceil","length","totalTransferred","i","start","end","min","chunk","slice","chunkHeader","allocUnsafe","writeUInt8","packet","concat","sendData","Promise","resolve","setTimeout","success","sendOfflineTransaction","transaction","txBuffer","receiveData","expectedChunks","receivedChunks","Set","size","chunkNumber","chunkData","add","disconnect","get","delete","getConnectedPeers","Array","values","filter","getMTU","cleanupExpiredConnections","entries","catch","SmartTransportSelector","wifiDirect","selectTransport","wifiAvailable","shouldUseWiFi","checkBattery","available"],"sourceRoot":"../../src","sources":["wifi.ts"],"mappings":"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","ignoreList":[]}
@@ -0,0 +1,45 @@
1
+ /**
2
+ * Complete Example: Enhanced TOSS Flow with Compression, Incentives & WiFi
3
+ *
4
+ * Demonstrates:
5
+ * 1. Compression of intent metadata
6
+ * 2. Smart transport selection (WiFi > BLE)
7
+ * 3. Relay incentive tracking
8
+ * 4. Mesh clustering for optimal routing
9
+ */
10
+ import { Connection, Keypair, PublicKey } from '@solana/web3.js';
11
+ /**
12
+ * Example 1: Metadata Compression Flow
13
+ *
14
+ * Compress large memo text before transmission
15
+ */
16
+ export declare function exampleCompressedIntentFlow(sender: Keypair, recipient: PublicKey, amount: number, connection: Connection): Promise<void>;
17
+ /**
18
+ * Example 2: Smart Transport Selection
19
+ *
20
+ * Automatically choose WiFi Direct if available, fallback to BLE
21
+ */
22
+ export declare function exampleSmartTransportFlow(): Promise<void>;
23
+ /**
24
+ * Example 3: Relay Incentive Tracking
25
+ *
26
+ * Calculate and track rewards for devices relaying transactions
27
+ */
28
+ export declare function exampleRelayIncentiveFlow(): Promise<void>;
29
+ /**
30
+ * Example 4: Mesh Clustering & Smart Routing
31
+ *
32
+ * Use signal strength to form clusters and find optimal paths
33
+ */
34
+ export declare function exampleMeshClusteringFlow(): Promise<void>;
35
+ /**
36
+ * Example 5: Complete Production Flow
37
+ *
38
+ * Integrates compression + WiFi transport + incentives + optimal routing
39
+ */
40
+ export declare function exampleCompleteEnhancedFlow(sender: Keypair, recipient: PublicKey, amount: number, connection: Connection, _feePayer: PublicKey): Promise<void>;
41
+ /**
42
+ * Run all examples
43
+ */
44
+ export declare function runAllExamples(connection: Connection): Promise<void>;
45
+ //# sourceMappingURL=enhancedFeaturesFlow.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"enhancedFeaturesFlow.d.ts","sourceRoot":"","sources":["../../../../src/examples/enhancedFeaturesFlow.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AAEH,OAAO,EAAE,UAAU,EAAE,OAAO,EAAE,SAAS,EAAE,MAAM,iBAAiB,CAAC;AAQjE;;;;GAIG;AACH,wBAAsB,2BAA2B,CAC/C,MAAM,EAAE,OAAO,EACf,SAAS,EAAE,SAAS,EACpB,MAAM,EAAE,MAAM,EACd,UAAU,EAAE,UAAU,GACrB,OAAO,CAAC,IAAI,CAAC,CAsCf;AAED;;;;GAIG;AACH,wBAAsB,yBAAyB,IAAI,OAAO,CAAC,IAAI,CAAC,CAsB/D;AAED;;;;GAIG;AACH,wBAAsB,yBAAyB,IAAI,OAAO,CAAC,IAAI,CAAC,CA6B/D;AAED;;;;GAIG;AACH,wBAAsB,yBAAyB,IAAI,OAAO,CAAC,IAAI,CAAC,CAwB/D;AAED;;;;GAIG;AACH,wBAAsB,2BAA2B,CAC/C,MAAM,EAAE,OAAO,EACf,SAAS,EAAE,SAAS,EACpB,MAAM,EAAE,MAAM,EACd,UAAU,EAAE,UAAU,EACtB,SAAS,EAAE,SAAS,GACnB,OAAO,CAAC,IAAI,CAAC,CA0Df;AAED;;GAEG;AACH,wBAAsB,cAAc,CAAC,UAAU,EAAE,UAAU,GAAG,OAAO,CAAC,IAAI,CAAC,CAiC1E"}
@@ -17,4 +17,6 @@ export { AuthService } from './services/authService';
17
17
  export { syncToChain, checkSyncStatus, type SyncResult } from './sync';
18
18
  export { reconcilePendingIntents, settleIntent, validateIntentOnchain, buildTransactionFromIntent, submitTransactionToChain, detectConflicts, getReconciliationState, type SettlementResult, type ReconciliationState, } from './reconciliation';
19
19
  export { DeviceDiscoveryService, IntentExchangeProtocol, IntentRoutingService, MultiDeviceConflictResolver, deviceDiscovery, intentExchange, intentRouting, type PeerDevice, type IntentExchangeRequest, type IntentExchangeResponse, } from './discovery';
20
+ export { compressMetadata, decompressMetadata, compressIntentMetadata, decompressIntentMetadata, estimateCompressionSavings, } from './utils/compression';
21
+ export { WiFiDirectTransport, SmartTransportSelector } from './wifi';
20
22
  //# sourceMappingURL=index.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/index.tsx"],"names":[],"mappings":"AACA,OAAO,EACL,YAAY,EACZ,gBAAgB,EAChB,kBAAkB,EAClB,mBAAmB,EACnB,KAAK,YAAY,EACjB,KAAK,YAAY,GAClB,MAAM,UAAU,CAAC;AAGlB,OAAO,EAAE,mBAAmB,EAAE,MAAM,8BAA8B,CAAC;AACnE,YAAY,EACV,gBAAgB,EAChB,sBAAsB,EACtB,yBAAyB,EACzB,kBAAkB,GACnB,MAAM,sBAAsB,CAAC;AAG9B,OAAO,EAAE,qBAAqB,EAAE,MAAM,gCAAgC,CAAC;AACvE,YAAY,EACV,WAAW,EACX,mBAAmB,EACnB,YAAY,GACb,MAAM,gCAAgC,CAAC;AAGxC,OAAO,EACL,qBAAqB,EACrB,6BAA6B,EAC7B,yBAAyB,GAC1B,MAAM,mCAAmC,CAAC;AAC3C,YAAY,EACV,oBAAoB,EACpB,uBAAuB,GACxB,MAAM,mCAAmC,CAAC;AAG3C,OAAO,EACL,qBAAqB,EACrB,eAAe,EACf,kBAAkB,EAClB,cAAc,EACd,qBAAqB,EACrB,oBAAoB,GACrB,MAAM,iBAAiB,CAAC;AAGzB,OAAO,EACL,kBAAkB,EAClB,iBAAiB,EACjB,mBAAmB,GACpB,MAAM,WAAW,CAAC;AAGnB,OAAO,EACL,aAAa,EACb,qBAAqB,EACrB,gCAAgC,EAChC,iCAAiC,EACjC,eAAe,EACf,eAAe,GAChB,MAAM,OAAO,CAAC;AACf,OAAO,EAAE,OAAO,EAAE,WAAW,EAAE,cAAc,EAAE,gBAAgB,EAAE,MAAM,OAAO,CAAC;AAC/E,OAAO,EAAE,SAAS,EAAE,MAAM,MAAM,CAAC;AAGjC,OAAO,EAAE,UAAU,EAAE,KAAK,UAAU,EAAE,MAAM,qBAAqB,CAAC;AAClE,YAAY,EAAE,QAAQ,EAAE,MAAM,kBAAkB,CAAC;AACjD,OAAO,EAAE,cAAc,EAAE,SAAS,EAAE,MAAM,0BAA0B,CAAC;AAGrE,OAAO,EAAE,WAAW,EAAE,MAAM,wBAAwB,CAAC;AAErD,OAAO,EAAE,WAAW,EAAE,eAAe,EAAE,KAAK,UAAU,EAAE,MAAM,QAAQ,CAAC;AAGvE,OAAO,EACL,uBAAuB,EACvB,YAAY,EACZ,qBAAqB,EACrB,0BAA0B,EAC1B,wBAAwB,EACxB,eAAe,EACf,sBAAsB,EACtB,KAAK,gBAAgB,EACrB,KAAK,mBAAmB,GACzB,MAAM,kBAAkB,CAAC;AAG1B,OAAO,EACL,sBAAsB,EACtB,sBAAsB,EACtB,oBAAoB,EACpB,2BAA2B,EAC3B,eAAe,EACf,cAAc,EACd,aAAa,EACb,KAAK,UAAU,EACf,KAAK,qBAAqB,EAC1B,KAAK,sBAAsB,GAC5B,MAAM,aAAa,CAAC"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/index.tsx"],"names":[],"mappings":"AACA,OAAO,EACL,YAAY,EACZ,gBAAgB,EAChB,kBAAkB,EAClB,mBAAmB,EACnB,KAAK,YAAY,EACjB,KAAK,YAAY,GAClB,MAAM,UAAU,CAAC;AAGlB,OAAO,EAAE,mBAAmB,EAAE,MAAM,8BAA8B,CAAC;AACnE,YAAY,EACV,gBAAgB,EAChB,sBAAsB,EACtB,yBAAyB,EACzB,kBAAkB,GACnB,MAAM,sBAAsB,CAAC;AAG9B,OAAO,EAAE,qBAAqB,EAAE,MAAM,gCAAgC,CAAC;AACvE,YAAY,EACV,WAAW,EACX,mBAAmB,EACnB,YAAY,GACb,MAAM,gCAAgC,CAAC;AAGxC,OAAO,EACL,qBAAqB,EACrB,6BAA6B,EAC7B,yBAAyB,GAC1B,MAAM,mCAAmC,CAAC;AAC3C,YAAY,EACV,oBAAoB,EACpB,uBAAuB,GACxB,MAAM,mCAAmC,CAAC;AAG3C,OAAO,EACL,qBAAqB,EACrB,eAAe,EACf,kBAAkB,EAClB,cAAc,EACd,qBAAqB,EACrB,oBAAoB,GACrB,MAAM,iBAAiB,CAAC;AAGzB,OAAO,EACL,kBAAkB,EAClB,iBAAiB,EACjB,mBAAmB,GACpB,MAAM,WAAW,CAAC;AAGnB,OAAO,EACL,aAAa,EACb,qBAAqB,EACrB,gCAAgC,EAChC,iCAAiC,EACjC,eAAe,EACf,eAAe,GAChB,MAAM,OAAO,CAAC;AACf,OAAO,EAAE,OAAO,EAAE,WAAW,EAAE,cAAc,EAAE,gBAAgB,EAAE,MAAM,OAAO,CAAC;AAC/E,OAAO,EAAE,SAAS,EAAE,MAAM,MAAM,CAAC;AAGjC,OAAO,EAAE,UAAU,EAAE,KAAK,UAAU,EAAE,MAAM,qBAAqB,CAAC;AAClE,YAAY,EAAE,QAAQ,EAAE,MAAM,kBAAkB,CAAC;AACjD,OAAO,EAAE,cAAc,EAAE,SAAS,EAAE,MAAM,0BAA0B,CAAC;AAGrE,OAAO,EAAE,WAAW,EAAE,MAAM,wBAAwB,CAAC;AAErD,OAAO,EAAE,WAAW,EAAE,eAAe,EAAE,KAAK,UAAU,EAAE,MAAM,QAAQ,CAAC;AAGvE,OAAO,EACL,uBAAuB,EACvB,YAAY,EACZ,qBAAqB,EACrB,0BAA0B,EAC1B,wBAAwB,EACxB,eAAe,EACf,sBAAsB,EACtB,KAAK,gBAAgB,EACrB,KAAK,mBAAmB,GACzB,MAAM,kBAAkB,CAAC;AAG1B,OAAO,EACL,sBAAsB,EACtB,sBAAsB,EACtB,oBAAoB,EACpB,2BAA2B,EAC3B,eAAe,EACf,cAAc,EACd,aAAa,EACb,KAAK,UAAU,EACf,KAAK,qBAAqB,EAC1B,KAAK,sBAAsB,GAC5B,MAAM,aAAa,CAAC;AAGrB,OAAO,EACL,gBAAgB,EAChB,kBAAkB,EAClB,sBAAsB,EACtB,wBAAwB,EACxB,0BAA0B,GAC3B,MAAM,qBAAqB,CAAC;AAG7B,OAAO,EAAE,mBAAmB,EAAE,sBAAsB,EAAE,MAAM,QAAQ,CAAC"}
@@ -0,0 +1,52 @@
1
+ /**
2
+ * Compression Utilities for TOSS
3
+ *
4
+ * Implements safe, deterministic compression for metadata only.
5
+ * Transaction bytes are NEVER compressed to preserve determinism.
6
+ *
7
+ * Production-ready with official APIs.
8
+ */
9
+ /**
10
+ * Simple DEFLATE-based compression using native zlib
11
+ * (Available in Node.js and via polyfills in React Native)
12
+ *
13
+ * For metadata compression: memos, recipient names, etc.
14
+ * NOT for transaction signatures or amounts!
15
+ */
16
+ export interface CompressionResult {
17
+ compressed: boolean;
18
+ data: Uint8Array;
19
+ originalSize: number;
20
+ compressedSize: number;
21
+ compressionRatio: number;
22
+ }
23
+ /**
24
+ * Compress metadata safely
25
+ * Only compresses if compression saves >10% and data >200 bytes
26
+ *
27
+ * Safe for: memo text, user names, descriptions
28
+ * UNSAFE for: signatures, amounts, transaction data
29
+ */
30
+ export declare function compressMetadata(data: string): Promise<CompressionResult>;
31
+ /**
32
+ * Decompress metadata
33
+ */
34
+ export declare function decompressMetadata(data: Uint8Array): Promise<string>;
35
+ /**
36
+ * Compress intent metadata for efficient transmission
37
+ * Returns the original intent with compressed metadata
38
+ */
39
+ export declare function compressIntentMetadata(intentMetadata: Record<string, any>): Promise<{
40
+ original: Record<string, any>;
41
+ compressed: Record<string, any>;
42
+ savings: number;
43
+ }>;
44
+ /**
45
+ * Decompress intent metadata
46
+ */
47
+ export declare function decompressIntentMetadata(compressedMetadata: Record<string, any>): Promise<Record<string, any>>;
48
+ /**
49
+ * Calculate size savings for a metadata object
50
+ */
51
+ export declare function estimateCompressionSavings(metadata: Record<string, any>): number;
52
+ //# sourceMappingURL=compression.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"compression.d.ts","sourceRoot":"","sources":["../../../../src/utils/compression.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAIH;;;;;;GAMG;AACH,MAAM,WAAW,iBAAiB;IAChC,UAAU,EAAE,OAAO,CAAC;IACpB,IAAI,EAAE,UAAU,CAAC;IACjB,YAAY,EAAE,MAAM,CAAC;IACrB,cAAc,EAAE,MAAM,CAAC;IACvB,gBAAgB,EAAE,MAAM,CAAC;CAC1B;AAED;;;;;;GAMG;AACH,wBAAsB,gBAAgB,CACpC,IAAI,EAAE,MAAM,GACX,OAAO,CAAC,iBAAiB,CAAC,CA4D5B;AAED;;GAEG;AACH,wBAAsB,kBAAkB,CAAC,IAAI,EAAE,UAAU,GAAG,OAAO,CAAC,MAAM,CAAC,CAiB1E;AAED;;;GAGG;AACH,wBAAsB,sBAAsB,CAC1C,cAAc,EAAE,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,GAClC,OAAO,CAAC;IACT,QAAQ,EAAE,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,CAAC;IAC9B,UAAU,EAAE,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,CAAC;IAChC,OAAO,EAAE,MAAM,CAAC;CACjB,CAAC,CAgCD;AAED;;GAEG;AACH,wBAAsB,wBAAwB,CAC5C,kBAAkB,EAAE,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,GACtC,OAAO,CAAC,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,CAAC,CAiB9B;AA6CD;;GAEG;AACH,wBAAgB,0BAA0B,CACxC,QAAQ,EAAE,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,GAC5B,MAAM,CAWR"}