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.
- package/android/src/main/java/com/comtappsosdk/ComTappSoSdkModule.kt +65 -10
- package/ios/ComTappSoSdk.mm +78 -12
- package/ios/generated/ComTappSoSdkSpec/ComTappSoSdkSpec-generated.mm +14 -0
- package/ios/generated/ComTappSoSdkSpec/ComTappSoSdkSpec.h +2 -0
- package/ios/generated/ComTappSoSdkSpecJSI-generated.cpp +16 -0
- package/ios/generated/ComTappSoSdkSpecJSI.h +18 -0
- package/lib/module/NativeComTappSoSdk.js.map +1 -1
- package/lib/module/events.js +8 -3
- package/lib/module/events.js.map +1 -1
- package/lib/module/index.js +10 -1
- package/lib/module/index.js.map +1 -1
- package/lib/typescript/src/NativeComTappSoSdk.d.ts +2 -0
- package/lib/typescript/src/NativeComTappSoSdk.d.ts.map +1 -1
- package/lib/typescript/src/events.d.ts.map +1 -1
- package/lib/typescript/src/index.d.ts.map +1 -1
- package/package.json +2 -2
- package/src/NativeComTappSoSdk.ts +3 -0
- package/src/events.ts +18 -3
- package/src/index.tsx +8 -1
|
@@ -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
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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 {
|
package/ios/ComTappSoSdk.mm
CHANGED
|
@@ -18,28 +18,31 @@
|
|
|
18
18
|
#endif
|
|
19
19
|
|
|
20
20
|
//-------------------------------------------------------------
|
|
21
|
-
// MARK: - Internal
|
|
21
|
+
// MARK: - Internal TappEventEmitter
|
|
22
22
|
// This module sends events from native to JS.
|
|
23
23
|
//-------------------------------------------------------------
|
|
24
|
-
@interface
|
|
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
|
|
32
|
+
static TappEventEmitter *sharedInstance = nil;
|
|
32
33
|
|
|
33
|
-
@implementation
|
|
34
|
+
@implementation TappEventEmitter {
|
|
35
|
+
BOOL _hasListeners;
|
|
36
|
+
NSMutableArray<NSDictionary *> *_pendingEvents;
|
|
37
|
+
}
|
|
34
38
|
|
|
35
|
-
RCT_EXPORT_MODULE(
|
|
39
|
+
RCT_EXPORT_MODULE(TappEventEmitter);
|
|
36
40
|
|
|
37
41
|
- (instancetype)init {
|
|
38
42
|
if ((self = [super init])) {
|
|
39
43
|
sharedInstance = self;
|
|
40
|
-
[
|
|
41
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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 ¶ms)
|
|
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
|
|
@@ -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;
|
|
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":[]}
|
package/lib/module/events.js
CHANGED
|
@@ -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
|
-
|
|
5
|
+
TappEventEmitter
|
|
6
6
|
} = NativeModules;
|
|
7
|
-
|
|
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
|
}
|
package/lib/module/events.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"names":["NativeEventEmitter","NativeModules","
|
|
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":[]}
|
package/lib/module/index.js
CHANGED
|
@@ -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) {
|
package/lib/module/index.js.map
CHANGED
|
@@ -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;
|
|
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":[]}
|
|
@@ -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;
|
|
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;
|
|
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,
|
|
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
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 {
|
|
5
|
-
|
|
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
|
|