@npaw/forge-react-native 9.7.5 → 10.0.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/build.gradle +1 -1
- package/android/src/main/java/com/npaw/forge/reactnative/ForgeDtoMapper.java +6 -1
- package/android/src/main/java/com/npaw/forge/reactnative/NPAWForgeModule.java +10 -0
- package/android/src/test/java/com/npaw/forge/reactnative/ForgeDtoMapperTest.java +4 -0
- package/ios/ForgeApple/ForgeKernelFFI.xcframework/Info.plist +11 -11
- package/ios/ForgeApple/ForgeKernelFFI.xcframework/ios-arm64/Headers/forge_kernelFFI.h +11 -0
- package/ios/ForgeApple/ForgeKernelFFI.xcframework/ios-arm64/libForgeKernelFFI.a +0 -0
- package/ios/ForgeApple/ForgeKernelFFI.xcframework/ios-arm64_x86_64-simulator/Headers/forge_kernelFFI.h +11 -0
- package/ios/ForgeApple/ForgeKernelFFI.xcframework/ios-arm64_x86_64-simulator/libForgeKernelFFI.a +0 -0
- package/ios/ForgeApple/ForgeKernelFFI.xcframework/tvos-arm64/Headers/forge_kernelFFI.h +11 -0
- package/ios/ForgeApple/ForgeKernelFFI.xcframework/tvos-arm64/libForgeKernelFFI.a +0 -0
- package/ios/ForgeApple/ForgeKernelFFI.xcframework/tvos-arm64-simulator/Headers/forge_kernelFFI.h +11 -0
- package/ios/ForgeApple/ForgeKernelFFI.xcframework/tvos-arm64-simulator/libForgeKernelFFI.a +0 -0
- package/ios/ForgeApple/Sources/ForgeKernelUniFFI/forge_kernel.swift +206 -13
- package/ios/ForgeApple/Sources/ForgeKernelUniFFI/forge_kernelFFI.h +11 -0
- package/ios/ForgeApple/Sources/NPAWForgeCore/ForgeApple.swift +48 -8
- package/ios/ForgeApple/Sources/NPAWForgeCore/ForgeRuntime.swift +22 -2
- package/ios/ForgeApple/Sources/NPAWForgeCore/NPAWForge.swift +34 -2
- package/ios/ForgeApple/Sources/NPAWForgeCore/NativeUniFFIRuntime.swift +43 -7
- package/ios/ForgeApple/Sources/NPAWForgeCore/NetworkRequestRecord.swift +5 -0
- package/ios/ForgeApple/Sources/NPAWForgeCore/ObjectiveCWrappers.swift +14 -0
- package/ios/ForgeApple/Sources/NPAWForgeCore/VideoAdapter.swift +5 -5
- package/ios/ForgeApple/Sources/NPAWForgeCore/WireValue.swift +207 -0
- package/ios/ForgeModuleImpl.swift +34 -0
- package/ios/NPAWForgeTurboModule.mm +10 -0
- package/package.json +1 -1
- package/src/NPAWForge.ts +22 -0
- package/src/specs/NativeNPAWForge.ts +3 -0
- package/src/types.ts +15 -0
|
@@ -194,6 +194,37 @@ public final class ForgeModuleImpl: NSObject {
|
|
|
194
194
|
}
|
|
195
195
|
}
|
|
196
196
|
|
|
197
|
+
// MARK: - Session updates
|
|
198
|
+
|
|
199
|
+
@objc public func updateSession(
|
|
200
|
+
_ instanceId: String,
|
|
201
|
+
metadata: [String: Any]?,
|
|
202
|
+
resolve: @escaping ForgeResolveBlock,
|
|
203
|
+
reject: @escaping ForgeRejectBlock
|
|
204
|
+
) {
|
|
205
|
+
withInstance(instanceId, resolve: resolve, reject: reject) {
|
|
206
|
+
$0.updateSession(metadata ?? [:])
|
|
207
|
+
}
|
|
208
|
+
}
|
|
209
|
+
|
|
210
|
+
@objc public func updateSessionMetrics(
|
|
211
|
+
_ instanceId: String,
|
|
212
|
+
metrics: [String: Any]?,
|
|
213
|
+
resolve: @escaping ForgeResolveBlock,
|
|
214
|
+
reject: @escaping ForgeRejectBlock
|
|
215
|
+
) {
|
|
216
|
+
var converted: [String: Double] = [:]
|
|
217
|
+
for (key, value) in metrics ?? [:] {
|
|
218
|
+
if let number = value as? NSNumber {
|
|
219
|
+
converted[key] = number.doubleValue
|
|
220
|
+
}
|
|
221
|
+
}
|
|
222
|
+
let numeric = converted
|
|
223
|
+
withInstance(instanceId, resolve: resolve, reject: reject) {
|
|
224
|
+
$0.updateSessionMetrics(numeric)
|
|
225
|
+
}
|
|
226
|
+
}
|
|
227
|
+
|
|
197
228
|
// MARK: - Identity
|
|
198
229
|
|
|
199
230
|
@objc public func loginSuccess(
|
|
@@ -1045,6 +1076,8 @@ public final class ForgeModuleImpl: NSObject {
|
|
|
1045
1076
|
builder.setPreSessionEventQueueLimitEvents((value as? NSNumber)?.intValue ?? 100)
|
|
1046
1077
|
case "preSessionEventQueueMaxAgeMs":
|
|
1047
1078
|
builder.setPreSessionEventQueueMaxAgeMs((value as? NSNumber)?.int64Value ?? 0)
|
|
1079
|
+
case "logoutSessionGuardMs":
|
|
1080
|
+
builder.setLogoutSessionGuardMs((value as? NSNumber)?.int64Value ?? 30_000)
|
|
1048
1081
|
case "allowLocalHttpForTesting":
|
|
1049
1082
|
builder.setLocalPlaintextTransportForTesting(value as? Bool ?? false)
|
|
1050
1083
|
case "deviceUuid":
|
|
@@ -1086,6 +1119,7 @@ public final class ForgeModuleImpl: NSObject {
|
|
|
1086
1119
|
record.redirectDurationMs = int64(map["redirectDurationMs"])
|
|
1087
1120
|
record.redirectCount = int64(map["redirectCount"])
|
|
1088
1121
|
record.networkProtocol = map["protocol"] as? String
|
|
1122
|
+
record.requestType = map["requestType"] as? String
|
|
1089
1123
|
record.requestBytes = int64(map["requestBytes"])
|
|
1090
1124
|
record.responseBytes = int64(map["responseBytes"])
|
|
1091
1125
|
return record
|
|
@@ -135,6 +135,16 @@ RCT_EXPORT_METHOD(trackSessionError : (NSString *)instanceId errorCode : (NSStri
|
|
|
135
135
|
[ForgeModuleImpl.shared trackSessionError:instanceId errorCode:errorCode errorMessage:errorMessage metadata:metadata resolve:resolve reject:ForgeMakeReject(reject)];
|
|
136
136
|
}
|
|
137
137
|
|
|
138
|
+
RCT_EXPORT_METHOD(updateSession : (NSString *)instanceId metadata : (NSDictionary *)metadata resolve : (RCTPromiseResolveBlock)resolve reject : (RCTPromiseRejectBlock)reject)
|
|
139
|
+
{
|
|
140
|
+
[ForgeModuleImpl.shared updateSession:instanceId metadata:metadata resolve:resolve reject:ForgeMakeReject(reject)];
|
|
141
|
+
}
|
|
142
|
+
|
|
143
|
+
RCT_EXPORT_METHOD(updateSessionMetrics : (NSString *)instanceId metrics : (NSDictionary *)metrics resolve : (RCTPromiseResolveBlock)resolve reject : (RCTPromiseRejectBlock)reject)
|
|
144
|
+
{
|
|
145
|
+
[ForgeModuleImpl.shared updateSessionMetrics:instanceId metrics:metrics resolve:resolve reject:ForgeMakeReject(reject)];
|
|
146
|
+
}
|
|
147
|
+
|
|
138
148
|
RCT_EXPORT_METHOD(loginSuccess : (NSString *)instanceId userId : (NSString *)userId options : (NSDictionary *)options resolve : (RCTPromiseResolveBlock)resolve reject : (RCTPromiseRejectBlock)reject)
|
|
139
149
|
{
|
|
140
150
|
[ForgeModuleImpl.shared loginSuccess:instanceId userId:userId options:options resolve:resolve reject:ForgeMakeReject(reject)];
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@npaw/forge-react-native",
|
|
3
|
-
"version": "
|
|
3
|
+
"version": "10.0.1",
|
|
4
4
|
"description": "NPAW Forge analytics for React Native: New Architecture TurboModule facade over the native Forge Android/Apple SDKs.",
|
|
5
5
|
"license": "SEE LICENSE IN LICENSE",
|
|
6
6
|
"author": "Victor Soto <victor.soto@nicepeopleatwork.com>",
|
package/src/NPAWForge.ts
CHANGED
|
@@ -77,6 +77,28 @@ export class NPAWForge {
|
|
|
77
77
|
return asOutcome(NativeNPAWForge.trackSessionError(this.instanceId, errorCode, errorMessage, metadata));
|
|
78
78
|
}
|
|
79
79
|
|
|
80
|
+
/**
|
|
81
|
+
* Hot-updates session-level dimensions without a session boundary:
|
|
82
|
+
* `param1`..`param20` extraparams, `screenName`, or any dimension the NQS
|
|
83
|
+
* parameter registry marks updatable — new backend dimensions work without
|
|
84
|
+
* an SDK release. Identity keys are rejected (use the typed identity API);
|
|
85
|
+
* blank values are dropped because NQS never erases a session value.
|
|
86
|
+
* Requires the account's remote config to enable session updates.
|
|
87
|
+
*/
|
|
88
|
+
updateSession(metadata: ForgeParams): Promise<ForgeOutcome> {
|
|
89
|
+
return asOutcome(NativeNPAWForge.updateSession(this.instanceId, metadata));
|
|
90
|
+
}
|
|
91
|
+
|
|
92
|
+
/**
|
|
93
|
+
* Reports numeric session metrics (account-registered custom metrics).
|
|
94
|
+
* Values aggregate server-side per the account's registered operation and
|
|
95
|
+
* settle on the session close row; re-sending an unchanged value is a
|
|
96
|
+
* no-op. Same remote-config gating as `updateSession`.
|
|
97
|
+
*/
|
|
98
|
+
updateSessionMetrics(metrics: Record<string, number>): Promise<ForgeOutcome> {
|
|
99
|
+
return asOutcome(NativeNPAWForge.updateSessionMetrics(this.instanceId, metrics));
|
|
100
|
+
}
|
|
101
|
+
|
|
80
102
|
// ---- identity ----
|
|
81
103
|
|
|
82
104
|
loginSuccess(userId: string, options: ForgeParams = {}): Promise<ForgeOutcome> {
|
|
@@ -35,6 +35,9 @@ export interface Spec extends TurboModule {
|
|
|
35
35
|
metadata: UnsafeObject
|
|
36
36
|
): Promise<UnsafeObject>;
|
|
37
37
|
|
|
38
|
+
updateSession(instanceId: string, metadata: UnsafeObject): Promise<UnsafeObject>;
|
|
39
|
+
updateSessionMetrics(instanceId: string, metrics: UnsafeObject): Promise<UnsafeObject>;
|
|
40
|
+
|
|
38
41
|
// ---- identity ----
|
|
39
42
|
loginSuccess(instanceId: string, userId: string, options: UnsafeObject): Promise<UnsafeObject>;
|
|
40
43
|
loginFailed(instanceId: string, options: UnsafeObject): Promise<UnsafeObject>;
|
package/src/types.ts
CHANGED
|
@@ -83,6 +83,14 @@ export type ForgeConfig = {
|
|
|
83
83
|
processEventsBeforeSessionStart?: boolean;
|
|
84
84
|
preSessionEventQueueLimitEvents?: number;
|
|
85
85
|
preSessionEventQueueMaxAgeMs?: number;
|
|
86
|
+
/**
|
|
87
|
+
* Logout guard window in milliseconds (session-update mode only): after
|
|
88
|
+
* `logout()` closes the session, the kernel holds the replacement session
|
|
89
|
+
* back for this long so a follow-up `loginSuccess` attaches its own
|
|
90
|
+
* session directly; events raised inside the window are buffered with
|
|
91
|
+
* their original timestamps. `0` disables the guard. Default 30 000.
|
|
92
|
+
*/
|
|
93
|
+
logoutSessionGuardMs?: number;
|
|
86
94
|
allowLocalHttpForTesting?: boolean;
|
|
87
95
|
deviceUuid?: string;
|
|
88
96
|
autoDeviceIdentityEnabled?: boolean;
|
|
@@ -128,6 +136,13 @@ export type ForgeNetworkRequestRecord = {
|
|
|
128
136
|
redirectDurationMs?: number;
|
|
129
137
|
redirectCount?: number;
|
|
130
138
|
protocol?: string;
|
|
139
|
+
/**
|
|
140
|
+
* Resource class of the request as reported by the observing host, e.g. a
|
|
141
|
+
* player adapter classifying its SDK's own downloads. Canonical lowercase
|
|
142
|
+
* tokens (`manifest`, `media_video`, `drm_license`, ...); the kernel caps
|
|
143
|
+
* it at 32 chars on the wire.
|
|
144
|
+
*/
|
|
145
|
+
requestType?: string;
|
|
131
146
|
requestBytes?: number;
|
|
132
147
|
responseBytes?: number;
|
|
133
148
|
};
|