com-tapp-so-sdk 0.1.0 → 0.1.1

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.
@@ -23,6 +23,7 @@ import kotlinx.coroutines.CoroutineScope
23
23
  import kotlinx.coroutines.Dispatchers
24
24
  import kotlinx.coroutines.launch
25
25
  import kotlinx.coroutines.withContext
26
+ import java.util.concurrent.ConcurrentLinkedQueue
26
27
 
27
28
  @ReactModule(name = ComTappSoSdkModule.NAME)
28
29
  class ComTappSoSdkModule(reactContext: ReactApplicationContext) :
@@ -33,13 +34,73 @@ class ComTappSoSdkModule(reactContext: ReactApplicationContext) :
33
34
  }
34
35
 
35
36
  private lateinit var tapp: Tapp
37
+ private var listenerCount = 0
38
+ private val eventQueue = ConcurrentLinkedQueue<Pair<String, WritableMap?>>()
36
39
 
37
40
  init {
38
41
  Log.i(NAME, "IS_NEW_ARCHITECTURE_ENABLED: ${BuildConfig.IS_NEW_ARCHITECTURE_ENABLED}")
39
42
  }
40
-
41
43
  override fun getName(): String = NAME
42
44
 
45
+ // Required by NativeEventEmitter
46
+ @ReactMethod
47
+ fun addListener(eventName: String) {
48
+ listenerCount++
49
+ flushEvents()
50
+ }
51
+
52
+ // Required by NativeEventEmitter
53
+ @ReactMethod
54
+ fun removeListeners(count: Int) {
55
+ listenerCount -= count
56
+ if (listenerCount < 0) {
57
+ listenerCount = 0
58
+ }
59
+ }
60
+
61
+ private fun emitOrBuffer(eventName: String, params: WritableMap?) {
62
+ // If we have listeners and the React context is active, emit immediately
63
+ if (listenerCount > 0 && reactApplicationContext.hasActiveCatalystInstance()) {
64
+ reactApplicationContext.runOnUiQueueThread {
65
+ emitNow(eventName, params)
66
+ }
67
+ } else {
68
+ // Otherwise buffer
69
+ try {
70
+ eventQueue.add(Pair(eventName, params))
71
+ // Cap buffer size at 10 to avoid memory leaks
72
+ if (eventQueue.size > 10) {
73
+ eventQueue.poll()
74
+ }
75
+ } catch (e: Exception) {
76
+ Log.e(NAME, "Error buffering event: ${e.message}")
77
+ }
78
+ }
79
+ }
80
+
81
+ private fun flushEvents() {
82
+ reactApplicationContext.runOnUiQueueThread {
83
+ while (listenerCount > 0 && reactApplicationContext.hasActiveCatalystInstance() && !eventQueue.isEmpty()) {
84
+ val event = eventQueue.poll()
85
+ if (event != null) {
86
+ emitNow(event.first, event.second)
87
+ }
88
+ }
89
+ }
90
+ }
91
+
92
+ private fun emitNow(eventName: String, params: WritableMap?) {
93
+ try {
94
+ if (reactApplicationContext.hasActiveCatalystInstance()) {
95
+ reactApplicationContext
96
+ .getJSModule(DeviceEventManagerModule.RCTDeviceEventEmitter::class.java)
97
+ .emit(eventName, params)
98
+ }
99
+ } catch (e: Exception) {
100
+ Log.e(NAME, "Error emitting event $eventName: ${e.message}")
101
+ }
102
+ }
103
+
43
104
 
44
105
  @ReactMethod
45
106
  fun start(authToken: String, env: String, tappToken: String) {
@@ -298,9 +359,7 @@ class ComTappSoSdkModule(reactContext: ReactApplicationContext) :
298
359
  putString("url", response.url)
299
360
  putString("error", response.error.ifEmpty { "" })
300
361
  }
301
- reactApplicationContext
302
- .getJSModule(DeviceEventManagerModule.RCTDeviceEventEmitter::class.java)
303
- .emit("onDidFailResolvingURL", map)
362
+ emitOrBuffer("onDidFailResolvingURL", map)
304
363
  }
305
364
 
306
365
 
@@ -322,18 +381,14 @@ class ComTappSoSdkModule(reactContext: ReactApplicationContext) :
322
381
  }
323
382
  putMap("data", dataMap)
324
383
  }
325
- reactApplicationContext
326
- .getJSModule(DeviceEventManagerModule.RCTDeviceEventEmitter::class.java)
327
- .emit("onDeferredLinkReceived", map)
384
+ emitOrBuffer("onDeferredLinkReceived", map)
328
385
  }
329
386
 
330
387
  private fun sendTestEvent(test: String) {
331
388
  val map: WritableMap = Arguments.createMap().apply {
332
389
  putString("test", test)
333
390
  }
334
- reactApplicationContext
335
- .getJSModule(DeviceEventManagerModule.RCTDeviceEventEmitter::class.java)
336
- .emit("onTestListener", map)
391
+ emitOrBuffer("onTestListener", map)
337
392
  }
338
393
 
339
394
  private fun convertResponseToMap(response: RequestModels.TappLinkDataResponse): WritableMap {
@@ -18,28 +18,31 @@
18
18
  #endif
19
19
 
20
20
  //-------------------------------------------------------------
21
- // MARK: - Internal EventEmitter
21
+ // MARK: - Internal TappEventEmitter
22
22
  // This module sends events from native to JS.
23
23
  //-------------------------------------------------------------
24
- @interface EventEmitter : RCTEventEmitter <RCTBridgeModule>
24
+ @interface TappEventEmitter : RCTEventEmitter <RCTBridgeModule>
25
25
  + (instancetype)shared;
26
+ - (void)emitOrBuffer:(NSString *)eventName body:(id)body;
26
27
  @end
27
28
 
28
29
  static NSString * const kOnDeferredLinkReceived = @"onDeferredLinkReceived";
29
30
  static NSString * const kOnDidFailResolvingURL = @"onDidFailResolvingURL";
30
31
  static NSString * const kOnTestListener = @"onTestListener";
31
- static EventEmitter *sharedInstance = nil;
32
+ static TappEventEmitter *sharedInstance = nil;
32
33
 
33
- @implementation EventEmitter
34
+ @implementation TappEventEmitter {
35
+ BOOL _hasListeners;
36
+ NSMutableArray<NSDictionary *> *_pendingEvents;
37
+ }
34
38
 
35
- RCT_EXPORT_MODULE(EventEmitter);
39
+ RCT_EXPORT_MODULE(TappEventEmitter);
36
40
 
37
41
  - (instancetype)init {
38
42
  if ((self = [super init])) {
39
43
  sharedInstance = self;
40
- [self addListener:kOnDeferredLinkReceived];
41
- [self addListener:kOnDidFailResolvingURL];
42
- [self addListener:kOnTestListener];
44
+ _pendingEvents = [NSMutableArray new];
45
+ _hasListeners = NO;
43
46
  }
44
47
  return self;
45
48
  }
@@ -56,8 +59,38 @@ RCT_EXPORT_MODULE(EventEmitter);
56
59
  return @[kOnDeferredLinkReceived, kOnDidFailResolvingURL, kOnTestListener];
57
60
  }
58
61
 
59
- - (void)startObserving {}
60
- - (void)stopObserving {}
62
+ - (void)startObserving {
63
+ _hasListeners = YES;
64
+ [self flushEvents];
65
+ }
66
+
67
+ - (void)stopObserving {
68
+ _hasListeners = NO;
69
+ }
70
+
71
+ - (void)emitOrBuffer:(NSString *)eventName body:(id)body {
72
+ // Ensure main thread for safety, as listeners are JS-side
73
+ dispatch_async(dispatch_get_main_queue(), ^{
74
+ if (self->_hasListeners) {
75
+ [self sendEventWithName:eventName body:body];
76
+ } else {
77
+ [self->_pendingEvents addObject:@{@"name": eventName, @"body": body ?: [NSNull null]}];
78
+ // Keep buffer small (last 5 events) to avoid memory issues if listeners never attach
79
+ if (self->_pendingEvents.count > 5) {
80
+ [self->_pendingEvents removeObjectAtIndex:0];
81
+ }
82
+ }
83
+ });
84
+ }
85
+
86
+ - (void)flushEvents {
87
+ dispatch_async(dispatch_get_main_queue(), ^{
88
+ for (NSDictionary *event in self->_pendingEvents) {
89
+ [self sendEventWithName:event[@"name"] body:event[@"body"]];
90
+ }
91
+ [self->_pendingEvents removeAllObjects];
92
+ });
93
+ }
61
94
 
62
95
  @end
63
96
 
@@ -278,11 +311,37 @@ RCT_EXPORT_METHOD(simulateTestEvent) {
278
311
  // ----------------------------------------------------------------------
279
312
 
280
313
 
314
+ #pragma mark - TappDelegate Methods
315
+
316
+ // Helper to ensure we get a valid emitter instance, even if JS hasn't initialized it yet.
317
+ // This prevents dropped events during cold start race conditions.
318
+ - (TappEventEmitter *)ensureEmitter {
319
+ TappEventEmitter *emitter = [TappEventEmitter shared];
320
+ if (emitter) {
321
+ return emitter;
322
+ }
323
+ if (!self.bridge) {
324
+ return nil;
325
+ }
326
+ id module = [self.bridge moduleForClass:[TappEventEmitter class]];
327
+ if ([module isKindOfClass:[TappEventEmitter class]]) {
328
+ return (TappEventEmitter *)module;
329
+ }
330
+ return nil;
331
+ }
332
+
281
333
  #pragma mark - TappDelegate Methods
282
334
 
283
335
  - (void)didOpenApplicationWith:(TappDeferredLinkData *)data {
284
336
  NSDictionary *result = [self dictionaryFromLinkData:data];
285
- [[EventEmitter shared] sendEventWithName:@"onDeferredLinkReceived" body:result];
337
+ dispatch_async(dispatch_get_main_queue(), ^{
338
+ TappEventEmitter *emitter = [self ensureEmitter];
339
+ if (emitter) {
340
+ [emitter emitOrBuffer:kOnDeferredLinkReceived body:result];
341
+ } else {
342
+ NSLog(@"[ComTappSoSdk] ERROR: TappEventEmitter unavailable, event dropped");
343
+ }
344
+ });
286
345
  }
287
346
 
288
347
  - (void)didFailResolvingURLWithUrl:(NSURL *)url error:(NSError *)error {
@@ -290,7 +349,14 @@ RCT_EXPORT_METHOD(simulateTestEvent) {
290
349
  @"url": url.absoluteString ?: @"",
291
350
  @"error": error.localizedDescription ?: @""
292
351
  };
293
- [[EventEmitter shared] sendEventWithName:@"onDidFailResolvingURL" body:result];
352
+ dispatch_async(dispatch_get_main_queue(), ^{
353
+ TappEventEmitter *emitter = [self ensureEmitter];
354
+ if (emitter) {
355
+ [emitter emitOrBuffer:kOnDidFailResolvingURL body:result];
356
+ } else {
357
+ NSLog(@"[ComTappSoSdk] ERROR: TappEventEmitter unavailable, event dropped");
358
+ }
359
+ });
294
360
  }
295
361
 
296
362
  - (NSString *)mapEventAction:(double)eventAction {
@@ -54,6 +54,14 @@ namespace facebook::react {
54
54
  return static_cast<ObjCTurboModule&>(turboModule).invokeObjCMethod(rt, VoidKind, "simulateTestEvent", @selector(simulateTestEvent), args, count);
55
55
  }
56
56
 
57
+ static facebook::jsi::Value __hostFunction_NativeComTappSoSdkSpecJSI_addListener(facebook::jsi::Runtime& rt, TurboModule &turboModule, const facebook::jsi::Value* args, size_t count) {
58
+ return static_cast<ObjCTurboModule&>(turboModule).invokeObjCMethod(rt, VoidKind, "addListener", @selector(addListener:), args, count);
59
+ }
60
+
61
+ static facebook::jsi::Value __hostFunction_NativeComTappSoSdkSpecJSI_removeListeners(facebook::jsi::Runtime& rt, TurboModule &turboModule, const facebook::jsi::Value* args, size_t count) {
62
+ return static_cast<ObjCTurboModule&>(turboModule).invokeObjCMethod(rt, VoidKind, "removeListeners", @selector(removeListeners:), args, count);
63
+ }
64
+
57
65
  NativeComTappSoSdkSpecJSI::NativeComTappSoSdkSpecJSI(const ObjCTurboModule::InitParams &params)
58
66
  : ObjCTurboModule(params) {
59
67
 
@@ -77,5 +85,11 @@ namespace facebook::react {
77
85
 
78
86
  methodMap_["simulateTestEvent"] = MethodMetadata {0, __hostFunction_NativeComTappSoSdkSpecJSI_simulateTestEvent};
79
87
 
88
+
89
+ methodMap_["addListener"] = MethodMetadata {1, __hostFunction_NativeComTappSoSdkSpecJSI_addListener};
90
+
91
+
92
+ methodMap_["removeListeners"] = MethodMetadata {1, __hostFunction_NativeComTappSoSdkSpecJSI_removeListeners};
93
+
80
94
  }
81
95
  } // namespace facebook::react
@@ -58,6 +58,8 @@ NS_ASSUME_NONNULL_BEGIN
58
58
  - (void)fetchOriginLinkData:(RCTPromiseResolveBlock)resolve
59
59
  reject:(RCTPromiseRejectBlock)reject;
60
60
  - (void)simulateTestEvent;
61
+ - (void)addListener:(NSString *)eventName;
62
+ - (void)removeListeners:(double)count;
61
63
 
62
64
  @end
63
65
 
@@ -60,6 +60,20 @@ static jsi::Value __hostFunction_NativeComTappSoSdkCxxSpecJSI_simulateTestEvent(
60
60
  );
61
61
  return jsi::Value::undefined();
62
62
  }
63
+ static jsi::Value __hostFunction_NativeComTappSoSdkCxxSpecJSI_addListener(jsi::Runtime &rt, TurboModule &turboModule, const jsi::Value* args, size_t count) {
64
+ static_cast<NativeComTappSoSdkCxxSpecJSI *>(&turboModule)->addListener(
65
+ rt,
66
+ count <= 0 ? throw jsi::JSError(rt, "Expected argument in position 0 to be passed") : args[0].asString(rt)
67
+ );
68
+ return jsi::Value::undefined();
69
+ }
70
+ static jsi::Value __hostFunction_NativeComTappSoSdkCxxSpecJSI_removeListeners(jsi::Runtime &rt, TurboModule &turboModule, const jsi::Value* args, size_t count) {
71
+ static_cast<NativeComTappSoSdkCxxSpecJSI *>(&turboModule)->removeListeners(
72
+ rt,
73
+ count <= 0 ? throw jsi::JSError(rt, "Expected argument in position 0 to be passed") : args[0].asNumber()
74
+ );
75
+ return jsi::Value::undefined();
76
+ }
63
77
 
64
78
  NativeComTappSoSdkCxxSpecJSI::NativeComTappSoSdkCxxSpecJSI(std::shared_ptr<CallInvoker> jsInvoker)
65
79
  : TurboModule("ComTappSoSdk", jsInvoker) {
@@ -70,6 +84,8 @@ NativeComTappSoSdkCxxSpecJSI::NativeComTappSoSdkCxxSpecJSI(std::shared_ptr<CallI
70
84
  methodMap_["shouldProcess"] = MethodMetadata {1, __hostFunction_NativeComTappSoSdkCxxSpecJSI_shouldProcess};
71
85
  methodMap_["fetchOriginLinkData"] = MethodMetadata {0, __hostFunction_NativeComTappSoSdkCxxSpecJSI_fetchOriginLinkData};
72
86
  methodMap_["simulateTestEvent"] = MethodMetadata {0, __hostFunction_NativeComTappSoSdkCxxSpecJSI_simulateTestEvent};
87
+ methodMap_["addListener"] = MethodMetadata {1, __hostFunction_NativeComTappSoSdkCxxSpecJSI_addListener};
88
+ methodMap_["removeListeners"] = MethodMetadata {1, __hostFunction_NativeComTappSoSdkCxxSpecJSI_removeListeners};
73
89
  }
74
90
 
75
91
 
@@ -27,6 +27,8 @@ public:
27
27
  virtual jsi::Value shouldProcess(jsi::Runtime &rt, jsi::String deepLink) = 0;
28
28
  virtual jsi::Value fetchOriginLinkData(jsi::Runtime &rt) = 0;
29
29
  virtual void simulateTestEvent(jsi::Runtime &rt) = 0;
30
+ virtual void addListener(jsi::Runtime &rt, jsi::String eventName) = 0;
31
+ virtual void removeListeners(jsi::Runtime &rt, double count) = 0;
30
32
 
31
33
  };
32
34
 
@@ -113,6 +115,22 @@ private:
113
115
  return bridging::callFromJs<void>(
114
116
  rt, &T::simulateTestEvent, jsInvoker_, instance_);
115
117
  }
118
+ void addListener(jsi::Runtime &rt, jsi::String eventName) override {
119
+ static_assert(
120
+ bridging::getParameterCount(&T::addListener) == 2,
121
+ "Expected addListener(...) to have 2 parameters");
122
+
123
+ return bridging::callFromJs<void>(
124
+ rt, &T::addListener, jsInvoker_, instance_, std::move(eventName));
125
+ }
126
+ void removeListeners(jsi::Runtime &rt, double count) override {
127
+ static_assert(
128
+ bridging::getParameterCount(&T::removeListeners) == 2,
129
+ "Expected removeListeners(...) to have 2 parameters");
130
+
131
+ return bridging::callFromJs<void>(
132
+ rt, &T::removeListeners, jsInvoker_, instance_, std::move(count));
133
+ }
116
134
 
117
135
  private:
118
136
  friend class NativeComTappSoSdkCxxSpec;
@@ -1 +1 @@
1
- {"version":3,"names":["TurboModuleRegistry","getEnforcing"],"sourceRoot":"../../src","sources":["NativeComTappSoSdk.ts"],"mappings":";;AAAA,SAASA,mBAAmB,QAA0B,cAAc;AA6CpE,eAAeA,mBAAmB,CAACC,YAAY,CAAO,cAAc,CAAC","ignoreList":[]}
1
+ {"version":3,"names":["TurboModuleRegistry","getEnforcing"],"sourceRoot":"../../src","sources":["NativeComTappSoSdk.ts"],"mappings":";;AAAA,SAASA,mBAAmB,QAA0B,cAAc;AAgDpE,eAAeA,mBAAmB,CAACC,YAAY,CAAO,cAAc,CAAC","ignoreList":[]}
@@ -1,10 +1,15 @@
1
1
  "use strict";
2
2
 
3
- import { NativeEventEmitter, NativeModules } from 'react-native';
3
+ import { NativeEventEmitter, NativeModules, Platform } from 'react-native';
4
4
  const {
5
- EventEmitter
5
+ TappEventEmitter
6
6
  } = NativeModules;
7
- const eventEmitter = new NativeEventEmitter(EventEmitter);
7
+ import ComTappSoSdkTurbo from './NativeComTappSoSdk';
8
+ const eventEmitterModule = Platform.OS === 'ios' ? TappEventEmitter : Platform.OS === 'android' ? ComTappSoSdkTurbo : undefined;
9
+ if (!eventEmitterModule) {
10
+ console.warn(`[TappSDK] Event emitter module is undefined for platform: ${Platform.OS}. Events will not be received.`);
11
+ }
12
+ const eventEmitter = new NativeEventEmitter(eventEmitterModule);
8
13
  export function addDeferredLinkListener(listener) {
9
14
  return eventEmitter.addListener('onDeferredLinkReceived', listener);
10
15
  }
@@ -1 +1 @@
1
- {"version":3,"names":["NativeEventEmitter","NativeModules","EventEmitter","eventEmitter","addDeferredLinkListener","listener","addListener","addDidFailResolvingURLListener","addTestListener"],"sourceRoot":"../../src","sources":["events.ts"],"mappings":";;AAAA,SAASA,kBAAkB,EAAEC,aAAa,QAAQ,cAAc;AAGhE,MAAM;EAAEC;AAAa,CAAC,GAAGD,aAAa;AACtC,MAAME,YAAY,GAAG,IAAIH,kBAAkB,CAACE,YAAY,CAAC;AAEzD,OAAO,SAASE,uBAAuBA,CACrCC,QAAkD,EAClD;EACA,OAAOF,YAAY,CAACG,WAAW,CAAC,wBAAwB,EAAED,QAAQ,CAAC;AACrE;AAEA,OAAO,SAASE,8BAA8BA,CAC5CF,QAA4D,EAC5D;EACA,OAAOF,YAAY,CAACG,WAAW,CAAC,uBAAuB,EAAED,QAAQ,CAAC;AACpE;AAEA,OAAO,SAASG,eAAeA,CAACH,QAA0C,EAAE;EAC1E,OAAOF,YAAY,CAACG,WAAW,CAAC,gBAAgB,EAAED,QAAQ,CAAC;AAC7D","ignoreList":[]}
1
+ {"version":3,"names":["NativeEventEmitter","NativeModules","Platform","TappEventEmitter","ComTappSoSdkTurbo","eventEmitterModule","OS","undefined","console","warn","eventEmitter","addDeferredLinkListener","listener","addListener","addDidFailResolvingURLListener","addTestListener"],"sourceRoot":"../../src","sources":["events.ts"],"mappings":";;AAAA,SAASA,kBAAkB,EAAEC,aAAa,EAAEC,QAAQ,QAAQ,cAAc;AAG1E,MAAM;EAAEC;AAAiB,CAAC,GAAGF,aAAa;AAC1C,OAAOG,iBAAiB,MAAM,sBAAsB;AAEpD,MAAMC,kBAAkB,GACtBH,QAAQ,CAACI,EAAE,KAAK,KAAK,GACjBH,gBAAgB,GAChBD,QAAQ,CAACI,EAAE,KAAK,SAAS,GACvBF,iBAAiB,GACjBG,SAAS;AAEjB,IAAI,CAACF,kBAAkB,EAAE;EACvBG,OAAO,CAACC,IAAI,CACV,6DAA6DP,QAAQ,CAACI,EAAE,gCAC1E,CAAC;AACH;AAEA,MAAMI,YAAY,GAAG,IAAIV,kBAAkB,CAACK,kBAAkB,CAAC;AAE/D,OAAO,SAASM,uBAAuBA,CACrCC,QAAkD,EAClD;EACA,OAAOF,YAAY,CAACG,WAAW,CAAC,wBAAwB,EAAED,QAAQ,CAAC;AACrE;AAEA,OAAO,SAASE,8BAA8BA,CAC5CF,QAA4D,EAC5D;EACA,OAAOF,YAAY,CAACG,WAAW,CAAC,uBAAuB,EAAED,QAAQ,CAAC;AACpE;AAEA,OAAO,SAASG,eAAeA,CAACH,QAA0C,EAAE;EAC1E,OAAOF,YAAY,CAACG,WAAW,CAAC,gBAAgB,EAAED,QAAQ,CAAC;AAC7D","ignoreList":[]}
@@ -1,7 +1,7 @@
1
1
  "use strict";
2
2
 
3
3
  import ComTappSoSdk from './NativeComTappSoSdk';
4
- import { Platform } from 'react-native';
4
+ import { Platform, NativeModules } from 'react-native';
5
5
  import { EventAction } from './Types';
6
6
 
7
7
  // Helper to handle unsupported platforms
@@ -12,6 +12,15 @@ export function start(config) {
12
12
  if (Platform.OS === 'web') {
13
13
  unsupportedPlatformMessage('start');
14
14
  }
15
+ // Force-init the event emitter module to prevent race conditions
16
+ if (Platform.OS === 'ios') {
17
+ const {
18
+ TappEventEmitter
19
+ } = NativeModules;
20
+ if (TappEventEmitter) {
21
+ /* no-op access to trigger init */
22
+ }
23
+ }
15
24
  ComTappSoSdk.start(config.authToken, config.env, config.tappToken);
16
25
  }
17
26
  export function url(influencer, adGroup, creative, data) {
@@ -1 +1 @@
1
- {"version":3,"names":["ComTappSoSdk","Platform","EventAction","unsupportedPlatformMessage","methodName","console","log","OS","start","config","authToken","env","tappToken","url","influencer","adGroup","creative","data","handleTappEvent","event","value","customValue","eventAction","CUSTOM","undefined","metadata","fetchLinkData","deepLink","shouldProcess","fetchOriginLinkData","simulateTestEvent"],"sourceRoot":"../../src","sources":["index.tsx"],"mappings":";;AAAA,OAAOA,YAAY,MAAM,sBAAsB;AAC/C,SAASC,QAAQ,QAAQ,cAAc;AACvC,SACEC,WAAW,QAIN,SAAS;;AAEhB;AACA,MAAMC,0BAA0B,GAAIC,UAAkB,IAAK;EACzDC,OAAO,CAACC,GAAG,CAAC,IAAIL,QAAQ,CAACM,EAAE,aAAaH,UAAU,qBAAqB,CAAC;AAC1E,CAAC;AAED,OAAO,SAASI,KAAKA,CAACC,MAAkB,EAAQ;EAC9C,IAAIR,QAAQ,CAACM,EAAE,KAAK,KAAK,EAAE;IACzBJ,0BAA0B,CAAC,OAAO,CAAC;EACrC;EACAH,YAAY,CAACQ,KAAK,CAACC,MAAM,CAACC,SAAS,EAAED,MAAM,CAACE,GAAG,EAAEF,MAAM,CAACG,SAAS,CAAC;AACpE;AAEA,OAAO,SAASC,GAAGA,CACjBC,UAAkB,EAClBC,OAAgB,EAChBC,QAAiB,EACjBC,IAAgC,EACf;EACjB,IAAIhB,QAAQ,CAACM,EAAE,KAAK,KAAK,EAAE;IACzBJ,0BAA0B,CAAC,KAAK,CAAC;EACnC;EACA,OAAOH,YAAY,CAACa,GAAG,CAACC,UAAU,EAAEC,OAAO,EAAEC,QAAQ,EAAEC,IAAI,CAAC;AAC9D;AAEA,OAAO,SAASC,eAAeA,CAACC,KAAoB,EAAmB;EACrE,IAAIlB,QAAQ,CAACM,EAAE,KAAK,KAAK,EAAE;IACzBJ,0BAA0B,CAAC,iBAAiB,CAAC;EAC/C;EAEA,MAAMiB,KAAK,GAAGD,KAAK,CAACE,WAAW,IAAI,4BAA4B;EAC/D,MAAMA,WAAW,GACfF,KAAK,CAACG,WAAW,KAAKpB,WAAW,CAACqB,MAAM,GAAGH,KAAK,GAAGI,SAAS;EAE9D,MAAMC,QAAQ,GAAGN,KAAK,CAACM,QAAQ;EAE/B,OAAOzB,YAAY,CAACkB,eAAe,CACjCC,KAAK,CAACG,WAAW,EACjBD,WAAW,EACXI,QACF,CAAC;AACH;AAEA,OAAO,SAASC,aAAaA,CAACC,QAAgB,EAAiC;EAC7E,IAAI1B,QAAQ,CAACM,EAAE,KAAK,KAAK,EAAE;IACzBJ,0BAA0B,CAAC,eAAe,CAAC;EAC7C;EACA,OAAOH,YAAY,CAAC0B,aAAa,CAACC,QAAQ,CAAC;AAC7C;AAEA,OAAO,SAASC,aAAaA,CAACD,QAAgB,EAAoB;EAChE,IAAI1B,QAAQ,CAACM,EAAE,KAAK,KAAK,EAAE;IACzBJ,0BAA0B,CAAC,eAAe,CAAC;EAC7C;EACA,OAAOH,YAAY,CAAC4B,aAAa,CAACD,QAAQ,CAAC;AAC7C;AAEA,OAAO,SAASE,mBAAmBA,CAAA,EAAkC;EACnE,IAAI5B,QAAQ,CAACM,EAAE,KAAK,KAAK,EAAE;IACzBJ,0BAA0B,CAAC,qBAAqB,CAAC;EACnD;EACA,OAAOH,YAAY,CAAC6B,mBAAmB,CAAC,CAAC;AAC3C;AAEA,OAAO,SAASC,iBAAiBA,CAAA,EAAS;EACxC,IAAI7B,QAAQ,CAACM,EAAE,KAAK,KAAK,IAAIN,QAAQ,CAACM,EAAE,KAAK,KAAK,EAAE;IAClDJ,0BAA0B,CAAC,mBAAmB,CAAC;EACjD;EACA,OAAOH,YAAY,CAAC8B,iBAAiB,CAAC,CAAC;AACzC;AAEA,cAAc,SAAS;AACvB,cAAc,UAAU","ignoreList":[]}
1
+ {"version":3,"names":["ComTappSoSdk","Platform","NativeModules","EventAction","unsupportedPlatformMessage","methodName","console","log","OS","start","config","TappEventEmitter","authToken","env","tappToken","url","influencer","adGroup","creative","data","handleTappEvent","event","value","customValue","eventAction","CUSTOM","undefined","metadata","fetchLinkData","deepLink","shouldProcess","fetchOriginLinkData","simulateTestEvent"],"sourceRoot":"../../src","sources":["index.tsx"],"mappings":";;AAAA,OAAOA,YAAY,MAAM,sBAAsB;AAC/C,SAASC,QAAQ,EAAEC,aAAa,QAAQ,cAAc;AACtD,SACEC,WAAW,QAIN,SAAS;;AAEhB;AACA,MAAMC,0BAA0B,GAAIC,UAAkB,IAAK;EACzDC,OAAO,CAACC,GAAG,CAAC,IAAIN,QAAQ,CAACO,EAAE,aAAaH,UAAU,qBAAqB,CAAC;AAC1E,CAAC;AAED,OAAO,SAASI,KAAKA,CAACC,MAAkB,EAAQ;EAC9C,IAAIT,QAAQ,CAACO,EAAE,KAAK,KAAK,EAAE;IACzBJ,0BAA0B,CAAC,OAAO,CAAC;EACrC;EACA;EACA,IAAIH,QAAQ,CAACO,EAAE,KAAK,KAAK,EAAE;IACzB,MAAM;MAAEG;IAAiB,CAAC,GAAGT,aAAa;IAC1C,IAAIS,gBAAgB,EAAE;MACpB;IAAA;EAEJ;EACAX,YAAY,CAACS,KAAK,CAACC,MAAM,CAACE,SAAS,EAAEF,MAAM,CAACG,GAAG,EAAEH,MAAM,CAACI,SAAS,CAAC;AACpE;AAEA,OAAO,SAASC,GAAGA,CACjBC,UAAkB,EAClBC,OAAgB,EAChBC,QAAiB,EACjBC,IAAgC,EACf;EACjB,IAAIlB,QAAQ,CAACO,EAAE,KAAK,KAAK,EAAE;IACzBJ,0BAA0B,CAAC,KAAK,CAAC;EACnC;EACA,OAAOJ,YAAY,CAACe,GAAG,CAACC,UAAU,EAAEC,OAAO,EAAEC,QAAQ,EAAEC,IAAI,CAAC;AAC9D;AAEA,OAAO,SAASC,eAAeA,CAACC,KAAoB,EAAmB;EACrE,IAAIpB,QAAQ,CAACO,EAAE,KAAK,KAAK,EAAE;IACzBJ,0BAA0B,CAAC,iBAAiB,CAAC;EAC/C;EAEA,MAAMkB,KAAK,GAAGD,KAAK,CAACE,WAAW,IAAI,4BAA4B;EAC/D,MAAMA,WAAW,GACfF,KAAK,CAACG,WAAW,KAAKrB,WAAW,CAACsB,MAAM,GAAGH,KAAK,GAAGI,SAAS;EAE9D,MAAMC,QAAQ,GAAGN,KAAK,CAACM,QAAQ;EAE/B,OAAO3B,YAAY,CAACoB,eAAe,CACjCC,KAAK,CAACG,WAAW,EACjBD,WAAW,EACXI,QACF,CAAC;AACH;AAEA,OAAO,SAASC,aAAaA,CAACC,QAAgB,EAAiC;EAC7E,IAAI5B,QAAQ,CAACO,EAAE,KAAK,KAAK,EAAE;IACzBJ,0BAA0B,CAAC,eAAe,CAAC;EAC7C;EACA,OAAOJ,YAAY,CAAC4B,aAAa,CAACC,QAAQ,CAAC;AAC7C;AAEA,OAAO,SAASC,aAAaA,CAACD,QAAgB,EAAoB;EAChE,IAAI5B,QAAQ,CAACO,EAAE,KAAK,KAAK,EAAE;IACzBJ,0BAA0B,CAAC,eAAe,CAAC;EAC7C;EACA,OAAOJ,YAAY,CAAC8B,aAAa,CAACD,QAAQ,CAAC;AAC7C;AAEA,OAAO,SAASE,mBAAmBA,CAAA,EAAkC;EACnE,IAAI9B,QAAQ,CAACO,EAAE,KAAK,KAAK,EAAE;IACzBJ,0BAA0B,CAAC,qBAAqB,CAAC;EACnD;EACA,OAAOJ,YAAY,CAAC+B,mBAAmB,CAAC,CAAC;AAC3C;AAEA,OAAO,SAASC,iBAAiBA,CAAA,EAAS;EACxC,IAAI/B,QAAQ,CAACO,EAAE,KAAK,KAAK,IAAIP,QAAQ,CAACO,EAAE,KAAK,KAAK,EAAE;IAClDJ,0BAA0B,CAAC,mBAAmB,CAAC;EACjD;EACA,OAAOJ,YAAY,CAACgC,iBAAiB,CAAC,CAAC;AACzC;AAEA,cAAc,SAAS;AACvB,cAAc,UAAU","ignoreList":[]}
@@ -31,6 +31,8 @@ export interface Spec extends TurboModule {
31
31
  isFirstSession?: boolean;
32
32
  }>;
33
33
  simulateTestEvent(): void;
34
+ addListener(eventName: string): void;
35
+ removeListeners(count: number): void;
34
36
  }
35
37
  declare const _default: Spec;
36
38
  export default _default;
@@ -1 +1 @@
1
- {"version":3,"file":"NativeComTappSoSdk.d.ts","sourceRoot":"","sources":["../../../src/NativeComTappSoSdk.ts"],"names":[],"mappings":"AAAA,OAAO,EAAuB,KAAK,WAAW,EAAE,MAAM,cAAc,CAAC;AACrE,OAAO,EAAE,KAAK,YAAY,EAAE,MAAM,2CAA2C,CAAC;AAE9E,MAAM,WAAW,IAAK,SAAQ,WAAW;IACvC,KAAK,CAAC,SAAS,EAAE,MAAM,EAAE,GAAG,EAAE,MAAM,EAAE,SAAS,EAAE,MAAM,GAAG,IAAI,CAAC;IAE/D,GAAG,CACD,UAAU,EAAE,MAAM,EAClB,OAAO,CAAC,EAAE,MAAM,EAChB,QAAQ,CAAC,EAAE,MAAM,EACjB,IAAI,CAAC,EAAE;QAAE,CAAC,GAAG,EAAE,MAAM,GAAG,MAAM,CAAA;KAAE,GAC/B,OAAO,CAAC,MAAM,CAAC,CAAC;IAEnB,eAAe,CACb,WAAW,EAAE,MAAM,EACnB,WAAW,CAAC,EAAE,MAAM,EACpB,QAAQ,CAAC,EAAE,YAAY,GACtB,OAAO,CAAC,MAAM,CAAC,CAAC;IAEnB,aAAa,CAAC,QAAQ,EAAE,MAAM,GAAG,OAAO,CAAC;QACvC,KAAK,EAAE,OAAO,CAAC;QACf,OAAO,CAAC,EAAE,MAAM,CAAC;QACjB,OAAO,CAAC,EAAE,MAAM,CAAC;QACjB,WAAW,CAAC,EAAE,MAAM,CAAC;QACrB,UAAU,CAAC,EAAE,MAAM,CAAC;QACpB,IAAI,CAAC,EAAE;YAAE,CAAC,GAAG,EAAE,MAAM,GAAG,MAAM,CAAA;SAAE,CAAC;QACjC,cAAc,CAAC,EAAE,OAAO,CAAC;QACzB,QAAQ,CAAC,EAAE,MAAM,CAAC;KACnB,CAAC,CAAC;IAEH,aAAa,CAAC,QAAQ,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC,CAAC;IAElD,mBAAmB,IAAI,OAAO,CAAC;QAC7B,KAAK,EAAE,OAAO,CAAC;QACf,OAAO,CAAC,EAAE,MAAM,CAAC;QACjB,OAAO,CAAC,EAAE,MAAM,CAAC;QACjB,WAAW,CAAC,EAAE,MAAM,CAAC;QACrB,UAAU,CAAC,EAAE,MAAM,CAAC;QACpB,IAAI,CAAC,EAAE;YAAE,CAAC,GAAG,EAAE,MAAM,GAAG,MAAM,CAAA;SAAE,CAAC;QACjC,cAAc,CAAC,EAAE,OAAO,CAAC;KAC1B,CAAC,CAAC;IAEH,iBAAiB,IAAI,IAAI,CAAC;CAC3B;;AAED,wBAAsE"}
1
+ {"version":3,"file":"NativeComTappSoSdk.d.ts","sourceRoot":"","sources":["../../../src/NativeComTappSoSdk.ts"],"names":[],"mappings":"AAAA,OAAO,EAAuB,KAAK,WAAW,EAAE,MAAM,cAAc,CAAC;AACrE,OAAO,EAAE,KAAK,YAAY,EAAE,MAAM,2CAA2C,CAAC;AAE9E,MAAM,WAAW,IAAK,SAAQ,WAAW;IACvC,KAAK,CAAC,SAAS,EAAE,MAAM,EAAE,GAAG,EAAE,MAAM,EAAE,SAAS,EAAE,MAAM,GAAG,IAAI,CAAC;IAE/D,GAAG,CACD,UAAU,EAAE,MAAM,EAClB,OAAO,CAAC,EAAE,MAAM,EAChB,QAAQ,CAAC,EAAE,MAAM,EACjB,IAAI,CAAC,EAAE;QAAE,CAAC,GAAG,EAAE,MAAM,GAAG,MAAM,CAAA;KAAE,GAC/B,OAAO,CAAC,MAAM,CAAC,CAAC;IAEnB,eAAe,CACb,WAAW,EAAE,MAAM,EACnB,WAAW,CAAC,EAAE,MAAM,EACpB,QAAQ,CAAC,EAAE,YAAY,GACtB,OAAO,CAAC,MAAM,CAAC,CAAC;IAEnB,aAAa,CAAC,QAAQ,EAAE,MAAM,GAAG,OAAO,CAAC;QACvC,KAAK,EAAE,OAAO,CAAC;QACf,OAAO,CAAC,EAAE,MAAM,CAAC;QACjB,OAAO,CAAC,EAAE,MAAM,CAAC;QACjB,WAAW,CAAC,EAAE,MAAM,CAAC;QACrB,UAAU,CAAC,EAAE,MAAM,CAAC;QACpB,IAAI,CAAC,EAAE;YAAE,CAAC,GAAG,EAAE,MAAM,GAAG,MAAM,CAAA;SAAE,CAAC;QACjC,cAAc,CAAC,EAAE,OAAO,CAAC;QACzB,QAAQ,CAAC,EAAE,MAAM,CAAC;KACnB,CAAC,CAAC;IAEH,aAAa,CAAC,QAAQ,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC,CAAC;IAElD,mBAAmB,IAAI,OAAO,CAAC;QAC7B,KAAK,EAAE,OAAO,CAAC;QACf,OAAO,CAAC,EAAE,MAAM,CAAC;QACjB,OAAO,CAAC,EAAE,MAAM,CAAC;QACjB,WAAW,CAAC,EAAE,MAAM,CAAC;QACrB,UAAU,CAAC,EAAE,MAAM,CAAC;QACpB,IAAI,CAAC,EAAE;YAAE,CAAC,GAAG,EAAE,MAAM,GAAG,MAAM,CAAA;SAAE,CAAC;QACjC,cAAc,CAAC,EAAE,OAAO,CAAC;KAC1B,CAAC,CAAC;IAEH,iBAAiB,IAAI,IAAI,CAAC;IAE1B,WAAW,CAAC,SAAS,EAAE,MAAM,GAAG,IAAI,CAAC;IACrC,eAAe,CAAC,KAAK,EAAE,MAAM,GAAG,IAAI,CAAC;CACtC;;AAED,wBAAsE"}
@@ -1 +1 @@
1
- {"version":3,"file":"events.d.ts","sourceRoot":"","sources":["../../../src/events.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,oBAAoB,EAAE,MAAM,SAAS,CAAC;AAKpD,wBAAgB,uBAAuB,CACrC,QAAQ,EAAE,CAAC,QAAQ,EAAE,oBAAoB,KAAK,IAAI,8CAGnD;AAED,wBAAgB,8BAA8B,CAC5C,QAAQ,EAAE,CAAC,QAAQ,EAAE;IAAE,GAAG,EAAE,MAAM,CAAC;IAAC,KAAK,EAAE,MAAM,CAAA;CAAE,KAAK,IAAI,8CAG7D;AAED,wBAAgB,eAAe,CAAC,QAAQ,EAAE,CAAC,IAAI,EAAE;IAAE,IAAI,EAAE,MAAM,CAAA;CAAE,KAAK,IAAI,8CAEzE"}
1
+ {"version":3,"file":"events.d.ts","sourceRoot":"","sources":["../../../src/events.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,oBAAoB,EAAE,MAAM,SAAS,CAAC;AAoBpD,wBAAgB,uBAAuB,CACrC,QAAQ,EAAE,CAAC,QAAQ,EAAE,oBAAoB,KAAK,IAAI,8CAGnD;AAED,wBAAgB,8BAA8B,CAC5C,QAAQ,EAAE,CAAC,QAAQ,EAAE;IAAE,GAAG,EAAE,MAAM,CAAC;IAAC,KAAK,EAAE,MAAM,CAAA;CAAE,KAAK,IAAI,8CAG7D;AAED,wBAAgB,eAAe,CAAC,QAAQ,EAAE,CAAC,IAAI,EAAE;IAAE,IAAI,EAAE,MAAM,CAAA;CAAE,KAAK,IAAI,8CAEzE"}
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/index.tsx"],"names":[],"mappings":"AAEA,OAAO,EAEL,KAAK,UAAU,EACf,KAAK,aAAa,EAClB,KAAK,oBAAoB,EAC1B,MAAM,SAAS,CAAC;AAOjB,wBAAgB,KAAK,CAAC,MAAM,EAAE,UAAU,GAAG,IAAI,CAK9C;AAED,wBAAgB,GAAG,CACjB,UAAU,EAAE,MAAM,EAClB,OAAO,CAAC,EAAE,MAAM,EAChB,QAAQ,CAAC,EAAE,MAAM,EACjB,IAAI,CAAC,EAAE;IAAE,CAAC,GAAG,EAAE,MAAM,GAAG,MAAM,CAAA;CAAE,GAC/B,OAAO,CAAC,MAAM,CAAC,CAKjB;AAED,wBAAgB,eAAe,CAAC,KAAK,EAAE,aAAa,GAAG,OAAO,CAAC,MAAM,CAAC,CAgBrE;AAED,wBAAgB,aAAa,CAAC,QAAQ,EAAE,MAAM,GAAG,OAAO,CAAC,oBAAoB,CAAC,CAK7E;AAED,wBAAgB,aAAa,CAAC,QAAQ,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC,CAKhE;AAED,wBAAgB,mBAAmB,IAAI,OAAO,CAAC,oBAAoB,CAAC,CAKnE;AAED,wBAAgB,iBAAiB,IAAI,IAAI,CAKxC;AAED,cAAc,SAAS,CAAC;AACxB,cAAc,UAAU,CAAC"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/index.tsx"],"names":[],"mappings":"AAEA,OAAO,EAEL,KAAK,UAAU,EACf,KAAK,aAAa,EAClB,KAAK,oBAAoB,EAC1B,MAAM,SAAS,CAAC;AAOjB,wBAAgB,KAAK,CAAC,MAAM,EAAE,UAAU,GAAG,IAAI,CAY9C;AAED,wBAAgB,GAAG,CACjB,UAAU,EAAE,MAAM,EAClB,OAAO,CAAC,EAAE,MAAM,EAChB,QAAQ,CAAC,EAAE,MAAM,EACjB,IAAI,CAAC,EAAE;IAAE,CAAC,GAAG,EAAE,MAAM,GAAG,MAAM,CAAA;CAAE,GAC/B,OAAO,CAAC,MAAM,CAAC,CAKjB;AAED,wBAAgB,eAAe,CAAC,KAAK,EAAE,aAAa,GAAG,OAAO,CAAC,MAAM,CAAC,CAgBrE;AAED,wBAAgB,aAAa,CAAC,QAAQ,EAAE,MAAM,GAAG,OAAO,CAAC,oBAAoB,CAAC,CAK7E;AAED,wBAAgB,aAAa,CAAC,QAAQ,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC,CAKhE;AAED,wBAAgB,mBAAmB,IAAI,OAAO,CAAC,oBAAoB,CAAC,CAKnE;AAED,wBAAgB,iBAAiB,IAAI,IAAI,CAKxC;AAED,cAAc,SAAS,CAAC;AACxB,cAAc,UAAU,CAAC"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "com-tapp-so-sdk",
3
- "version": "0.1.0",
3
+ "version": "0.1.1",
4
4
  "description": "react native tapp sdk",
5
5
  "sideEffects": false,
6
6
  "engines": {
@@ -166,4 +166,4 @@
166
166
  "type": "turbo-module",
167
167
  "version": "0.54.8"
168
168
  }
169
- }
169
+ }
@@ -41,6 +41,9 @@ export interface Spec extends TurboModule {
41
41
  }>;
42
42
 
43
43
  simulateTestEvent(): void;
44
+
45
+ addListener(eventName: string): void;
46
+ removeListeners(count: number): void;
44
47
  }
45
48
 
46
49
  export default TurboModuleRegistry.getEnforcing<Spec>('ComTappSoSdk');
package/src/events.ts CHANGED
@@ -1,8 +1,23 @@
1
- import { NativeEventEmitter, NativeModules } from 'react-native';
1
+ import { NativeEventEmitter, NativeModules, Platform } from 'react-native';
2
2
  import type { TappLinkDataResponse } from './Types';
3
3
 
4
- const { EventEmitter } = NativeModules;
5
- const eventEmitter = new NativeEventEmitter(EventEmitter);
4
+ const { TappEventEmitter } = NativeModules;
5
+ import ComTappSoSdkTurbo from './NativeComTappSoSdk';
6
+
7
+ const eventEmitterModule =
8
+ Platform.OS === 'ios'
9
+ ? TappEventEmitter
10
+ : Platform.OS === 'android'
11
+ ? ComTappSoSdkTurbo
12
+ : undefined;
13
+
14
+ if (!eventEmitterModule) {
15
+ console.warn(
16
+ `[TappSDK] Event emitter module is undefined for platform: ${Platform.OS}. Events will not be received.`
17
+ );
18
+ }
19
+
20
+ const eventEmitter = new NativeEventEmitter(eventEmitterModule);
6
21
 
7
22
  export function addDeferredLinkListener(
8
23
  listener: (response: TappLinkDataResponse) => void
package/src/index.tsx CHANGED
@@ -1,5 +1,5 @@
1
1
  import ComTappSoSdk from './NativeComTappSoSdk';
2
- import { Platform } from 'react-native';
2
+ import { Platform, NativeModules } from 'react-native';
3
3
  import {
4
4
  EventAction,
5
5
  type InitConfig,
@@ -16,6 +16,13 @@ export function start(config: InitConfig): void {
16
16
  if (Platform.OS === 'web') {
17
17
  unsupportedPlatformMessage('start');
18
18
  }
19
+ // Force-init the event emitter module to prevent race conditions
20
+ if (Platform.OS === 'ios') {
21
+ const { TappEventEmitter } = NativeModules;
22
+ if (TappEventEmitter) {
23
+ /* no-op access to trigger init */
24
+ }
25
+ }
19
26
  ComTappSoSdk.start(config.authToken, config.env, config.tappToken);
20
27
  }
21
28