@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.
Files changed (29) hide show
  1. package/android/build.gradle +1 -1
  2. package/android/src/main/java/com/npaw/forge/reactnative/ForgeDtoMapper.java +6 -1
  3. package/android/src/main/java/com/npaw/forge/reactnative/NPAWForgeModule.java +10 -0
  4. package/android/src/test/java/com/npaw/forge/reactnative/ForgeDtoMapperTest.java +4 -0
  5. package/ios/ForgeApple/ForgeKernelFFI.xcframework/Info.plist +11 -11
  6. package/ios/ForgeApple/ForgeKernelFFI.xcframework/ios-arm64/Headers/forge_kernelFFI.h +11 -0
  7. package/ios/ForgeApple/ForgeKernelFFI.xcframework/ios-arm64/libForgeKernelFFI.a +0 -0
  8. package/ios/ForgeApple/ForgeKernelFFI.xcframework/ios-arm64_x86_64-simulator/Headers/forge_kernelFFI.h +11 -0
  9. package/ios/ForgeApple/ForgeKernelFFI.xcframework/ios-arm64_x86_64-simulator/libForgeKernelFFI.a +0 -0
  10. package/ios/ForgeApple/ForgeKernelFFI.xcframework/tvos-arm64/Headers/forge_kernelFFI.h +11 -0
  11. package/ios/ForgeApple/ForgeKernelFFI.xcframework/tvos-arm64/libForgeKernelFFI.a +0 -0
  12. package/ios/ForgeApple/ForgeKernelFFI.xcframework/tvos-arm64-simulator/Headers/forge_kernelFFI.h +11 -0
  13. package/ios/ForgeApple/ForgeKernelFFI.xcframework/tvos-arm64-simulator/libForgeKernelFFI.a +0 -0
  14. package/ios/ForgeApple/Sources/ForgeKernelUniFFI/forge_kernel.swift +206 -13
  15. package/ios/ForgeApple/Sources/ForgeKernelUniFFI/forge_kernelFFI.h +11 -0
  16. package/ios/ForgeApple/Sources/NPAWForgeCore/ForgeApple.swift +48 -8
  17. package/ios/ForgeApple/Sources/NPAWForgeCore/ForgeRuntime.swift +22 -2
  18. package/ios/ForgeApple/Sources/NPAWForgeCore/NPAWForge.swift +34 -2
  19. package/ios/ForgeApple/Sources/NPAWForgeCore/NativeUniFFIRuntime.swift +43 -7
  20. package/ios/ForgeApple/Sources/NPAWForgeCore/NetworkRequestRecord.swift +5 -0
  21. package/ios/ForgeApple/Sources/NPAWForgeCore/ObjectiveCWrappers.swift +14 -0
  22. package/ios/ForgeApple/Sources/NPAWForgeCore/VideoAdapter.swift +5 -5
  23. package/ios/ForgeApple/Sources/NPAWForgeCore/WireValue.swift +207 -0
  24. package/ios/ForgeModuleImpl.swift +34 -0
  25. package/ios/NPAWForgeTurboModule.mm +10 -0
  26. package/package.json +1 -1
  27. package/src/NPAWForge.ts +22 -0
  28. package/src/specs/NativeNPAWForge.ts +3 -0
  29. 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": "9.7.5",
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
  };