sitepong 0.2.2 → 0.2.4

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 (57) hide show
  1. package/android/build.gradle +39 -0
  2. package/android/src/main/java/com/sitepong/deviceid/DeviceIdHelper.kt +45 -0
  3. package/android/src/main/java/com/sitepong/deviceid/DeviceIdModule.kt +45 -0
  4. package/android/src/main/java/com/sitepong/screenrecorder/ChunkUploader.kt +78 -0
  5. package/android/src/main/java/com/sitepong/screenrecorder/H264Encoder.kt +163 -0
  6. package/android/src/main/java/com/sitepong/screenrecorder/ScreenCapture.kt +103 -0
  7. package/android/src/main/java/com/sitepong/screenrecorder/ScreenRecorderModule.kt +80 -0
  8. package/android/src/main/java/com/sitepong/screenrecorder/SensitiveViewManager.kt +19 -0
  9. package/app.plugin.js +426 -0
  10. package/dist/cdn/sitepong.min.js +5 -5
  11. package/dist/cdn/sitepong.min.js.map +1 -1
  12. package/dist/entries/rn.d.ts +188 -16
  13. package/dist/entries/rn.js +188 -35
  14. package/dist/entries/rn.js.map +1 -1
  15. package/dist/entries/web.js +2 -1
  16. package/dist/entries/web.js.map +1 -1
  17. package/dist/entries/web.mjs +2 -1
  18. package/dist/entries/web.mjs.map +1 -1
  19. package/dist/index.d.mts +1 -1
  20. package/dist/index.d.ts +1 -1
  21. package/dist/index.js +2 -1
  22. package/dist/index.js.map +1 -1
  23. package/dist/index.mjs +2 -1
  24. package/dist/index.mjs.map +1 -1
  25. package/dist/react/index.js +2 -1
  26. package/dist/react/index.js.map +1 -1
  27. package/dist/react/index.mjs +2 -1
  28. package/dist/react/index.mjs.map +1 -1
  29. package/expo-module.config.json +16 -0
  30. package/ios/DeviceId/DeviceIdModule.swift +55 -0
  31. package/ios/DeviceId/KeychainHelper.swift +68 -0
  32. package/ios/LiveActivity/ConfigStore.swift +43 -0
  33. package/ios/LiveActivity/DSLNode.swift +188 -0
  34. package/ios/LiveActivity/SitePongActivityAttributes.swift +112 -0
  35. package/ios/LiveActivity/SitePongLiveActivityModule.swift +250 -0
  36. package/ios/LiveActivity/widget/ColorHex.swift +30 -0
  37. package/ios/LiveActivity/widget/DSLAnimations.swift +128 -0
  38. package/ios/LiveActivity/widget/DSLRenderer.swift +538 -0
  39. package/ios/LiveActivity/widget/SitePongLiveActivityWidget.swift +393 -0
  40. package/ios/LiveActivity/widget/SitePongWidgetBundle.swift +84 -0
  41. package/ios/ScreenRecorder/ChunkUploader.swift +52 -0
  42. package/ios/ScreenRecorder/H264Encoder.swift +229 -0
  43. package/ios/ScreenRecorder/ScreenCapture.swift +149 -0
  44. package/ios/ScreenRecorder/ScreenRecorderModule.swift +179 -0
  45. package/ios/ScreenRecorder/SensitiveViewManager.swift +63 -0
  46. package/ios/Sitepong.podspec +57 -0
  47. package/ios/WatchtowerCore/Screenshotter.swift +163 -0
  48. package/ios/WatchtowerCore/SwiftUIModifiers.swift +78 -0
  49. package/ios/WatchtowerCore/Swizzling.swift +59 -0
  50. package/ios/WatchtowerCore/TapEvent.swift +61 -0
  51. package/ios/WatchtowerCore/Transport.swift +136 -0
  52. package/ios/WatchtowerCore/UIViewExtensions.swift +31 -0
  53. package/ios/WatchtowerCore/Watchtower.swift +80 -0
  54. package/ios/WatchtowerCore/WatchtowerEngine.swift +565 -0
  55. package/ios/WatchtowerCore/WatchtowerHash.swift +120 -0
  56. package/ios/WatchtowerCore/WatchtowerRegistry.swift +87 -0
  57. package/package.json +19 -8
@@ -0,0 +1,87 @@
1
+ #if canImport(UIKit)
2
+ import UIKit
3
+
4
+ /// A tagged region registered by a SwiftUI `.watchtowerTag` / `.watchtowerScreen`
5
+ /// / `.watchtowerSensitive` modifier. Frames are stored in window (screen) space
6
+ /// and resolved at touch / capture time.
7
+ final class TaggedRegion {
8
+ let id: String? // watchtowerTag element id
9
+ let screenName: String? // watchtowerScreen identity
10
+ let sensitive: Bool
11
+ var frameInWindow: CGRect
12
+ weak var window: UIWindow?
13
+
14
+ init(id: String?, screenName: String?, sensitive: Bool, frameInWindow: CGRect, window: UIWindow?) {
15
+ self.id = id
16
+ self.screenName = screenName
17
+ self.sensitive = sensitive
18
+ self.frameInWindow = frameInWindow
19
+ self.window = window
20
+ }
21
+ }
22
+
23
+ /// Shared registry the swizzle consults to resolve SwiftUI element identity,
24
+ /// screen identity, and sensitive rects. Thread-confined to main (touches and
25
+ /// SwiftUI layout both run on main).
26
+ final class WatchtowerRegistry {
27
+ static let shared = WatchtowerRegistry()
28
+
29
+ private var regions: [ObjectIdentifier: TaggedRegion] = [:]
30
+
31
+ func update(token: ObjectIdentifier, region: TaggedRegion) {
32
+ regions[token] = region
33
+ }
34
+
35
+ func remove(token: ObjectIdentifier) {
36
+ regions.removeValue(forKey: token)
37
+ }
38
+
39
+ /// Deepest (smallest-area) tag region containing `point` in the given window.
40
+ func tag(at point: CGPoint, in window: UIWindow) -> TaggedRegion? {
41
+ var best: TaggedRegion?
42
+ var bestArea = CGFloat.greatestFiniteMagnitude
43
+ for r in regions.values where r.id != nil {
44
+ guard r.window === window else { continue }
45
+ if r.frameInWindow.contains(point) {
46
+ let area = r.frameInWindow.width * r.frameInWindow.height
47
+ if area < bestArea { bestArea = area; best = r }
48
+ }
49
+ }
50
+ return best
51
+ }
52
+
53
+ /// Nearest enclosing screen-name region for a point.
54
+ func screenName(at point: CGPoint, in window: UIWindow) -> String? {
55
+ var best: TaggedRegion?
56
+ var bestArea = CGFloat.greatestFiniteMagnitude
57
+ for r in regions.values where r.screenName != nil {
58
+ guard r.window === window else { continue }
59
+ if r.frameInWindow.contains(point) {
60
+ let area = r.frameInWindow.width * r.frameInWindow.height
61
+ if area < bestArea { bestArea = area; best = r }
62
+ }
63
+ }
64
+ return best?.screenName
65
+ }
66
+
67
+ /// Most recently laid-out screen-name region in this window (for capture
68
+ /// when no specific point is relevant).
69
+ func topScreenName(in window: UIWindow) -> String? {
70
+ var best: TaggedRegion?
71
+ var bestArea: CGFloat = -1
72
+ for r in regions.values where r.screenName != nil {
73
+ guard r.window === window else { continue }
74
+ let area = r.frameInWindow.width * r.frameInWindow.height
75
+ if area > bestArea { bestArea = area; best = r }
76
+ }
77
+ return best?.screenName
78
+ }
79
+
80
+ /// All sensitive rects in window space for the given window.
81
+ func sensitiveRects(in window: UIWindow) -> [CGRect] {
82
+ regions.values
83
+ .filter { $0.sensitive && $0.window === window }
84
+ .map { $0.frameInWindow }
85
+ }
86
+ }
87
+ #endif
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "sitepong",
3
- "version": "0.2.2",
3
+ "version": "0.2.4",
4
4
  "description": "Official SitePong SDK for error tracking and monitoring",
5
5
  "main": "dist/index.js",
6
6
  "module": "dist/index.mjs",
@@ -53,7 +53,10 @@
53
53
  "types": "./dist/nextjs/index.d.ts",
54
54
  "import": "./dist/nextjs/index.mjs",
55
55
  "require": "./dist/nextjs/index.js"
56
- }
56
+ },
57
+ "./app.plugin.js": "./app.plugin.js",
58
+ "./expo-module.config.json": "./expo-module.config.json",
59
+ "./package.json": "./package.json"
57
60
  },
58
61
  "typesVersions": {
59
62
  "*": {
@@ -81,7 +84,11 @@
81
84
  }
82
85
  },
83
86
  "files": [
84
- "dist"
87
+ "dist",
88
+ "ios",
89
+ "android",
90
+ "expo-module.config.json",
91
+ "app.plugin.js"
85
92
  ],
86
93
  "scripts": {
87
94
  "build": "rm -rf dist && tsup",
@@ -114,9 +121,10 @@
114
121
  "react-native": ">=0.70.0",
115
122
  "@react-native-async-storage/async-storage": ">=1.0.0",
116
123
  "@react-navigation/native": ">=6.0.0",
124
+ "expo": ">=51.0.0",
125
+ "expo-modules-core": ">=1.11.0",
117
126
  "expo-device": ">=5.0.0",
118
127
  "expo-application": ">=5.0.0",
119
- "@sitepong/device-id": ">=0.1.0",
120
128
  "expo-sqlite": ">=14.0.0"
121
129
  },
122
130
  "peerDependenciesMeta": {
@@ -129,13 +137,16 @@
129
137
  "@react-navigation/native": {
130
138
  "optional": true
131
139
  },
132
- "expo-device": {
140
+ "expo": {
133
141
  "optional": true
134
142
  },
135
- "expo-application": {
143
+ "expo-modules-core": {
136
144
  "optional": true
137
145
  },
138
- "@sitepong/device-id": {
146
+ "expo-device": {
147
+ "optional": true
148
+ },
149
+ "expo-application": {
139
150
  "optional": true
140
151
  },
141
152
  "expo-sqlite": {
@@ -160,7 +171,7 @@
160
171
  "react-native": "0.83.2",
161
172
  "@react-native-async-storage/async-storage": "^2.2.0",
162
173
  "expo-sqlite": "~16.0.4",
163
- "@sitepong/screen-recorder": "*",
174
+ "expo-modules-core": "~3.0.0",
164
175
  "@sitepong/capture-core": "*"
165
176
  },
166
177
  "engines": {