@mentra/acs-meeting 3.2.0-dev.222 → 3.2.0-dev.225

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 (106) hide show
  1. package/README.md +14 -3
  2. package/android/build.gradle +1 -0
  3. package/android/src/main/java/com/mentra/acsmeeting/AcsMeetingModule.kt +10 -10
  4. package/android/src/main/java/com/mentra/acsmeeting/AcsMeetingSession.kt +37 -37
  5. package/android/src/main/java/com/mentra/acsmeeting/audio/UplinkSender.kt +4 -4
  6. package/android/src/main/java/com/mentra/acsmeeting/source/MeetingVideoSourceSpec.kt +3 -0
  7. package/android/src/main/java/com/mentra/acsmeeting/video/AcsFrameSender.kt +12 -10
  8. package/android/src/main/java/com/mentra/acsmeeting/video/I420FormatSpec.kt +2 -0
  9. package/android/src/main/java/com/mentra/acsmeeting/video/Nv12Packer.kt +2 -0
  10. package/android/src/test/java/com/mentra/acsmeeting/source/{AcsInvestigationTest.kt → MediaDiagnosticsTest.kt} +10 -10
  11. package/android/src/test/java/com/mentra/acsmeeting/source/MeetingVideoSourceSpecTest.kt +3 -0
  12. package/android/src/test/java/com/mentra/acsmeeting/telemetry/VideoQualityTest.kt +2 -2
  13. package/android/src/test/java/com/mentra/acsmeeting/video/I420FormatSpecTest.kt +2 -0
  14. package/android/src/test/java/com/mentra/acsmeeting/video/VideoProfileTest.kt +2 -2
  15. package/build/AcsMeeting.types.d.ts +10 -1
  16. package/build/AcsMeeting.types.d.ts.map +1 -1
  17. package/build/AcsMeeting.types.js.map +1 -1
  18. package/build/AcsMeetingModule.d.ts +2 -2
  19. package/build/AcsMeetingModule.d.ts.map +1 -1
  20. package/build/AcsMeetingModule.js.map +1 -1
  21. package/ios/AcsMeeting.podspec +1 -1
  22. package/ios/AcsMeetingModule.swift +284 -148
  23. package/ios/PolicyKit/Package.swift +2 -1
  24. package/ios/PolicyKit/Sources/AcsAudioPolicy/CallbackOperation.swift +60 -0
  25. package/ios/PolicyKit/Sources/AcsAudioPolicy/CapturePolicy.swift +5 -0
  26. package/ios/PolicyKit/Tests/AcsAudioPolicyTests/AcsAudioPolicyTests.swift +1 -0
  27. package/ios/PolicyKit/Tests/AcsAudioPolicyTests/CallAgentRetirementTests.swift +113 -0
  28. package/package.json +3 -2
  29. package/src/AcsMeeting.types.ts +4 -1
  30. package/src/AcsMeetingModule.ts +2 -2
  31. package/android/src/androidTest/java/com/mentra/acsmeeting/network/SoftApFeasibilityGateTest.kt +0 -291
  32. package/android/src/main/java/com/mentra/acsmeeting/network/InternetHold.kt +0 -501
  33. package/android/src/main/java/com/mentra/acsmeeting/network/Ipv4Prefix.kt +0 -51
  34. package/android/src/main/java/com/mentra/acsmeeting/network/NetworkFacts.kt +0 -81
  35. package/android/src/main/java/com/mentra/acsmeeting/network/ScopedNetworkChangeDetector.kt +0 -355
  36. package/android/src/main/java/com/mentra/acsmeeting/network/ScopedNetworkError.kt +0 -109
  37. package/android/src/main/java/com/mentra/acsmeeting/network/ScopedNetworkObserver.kt +0 -160
  38. package/android/src/main/java/com/mentra/acsmeeting/network/ScopedNetworkReadiness.kt +0 -103
  39. package/android/src/main/java/com/mentra/acsmeeting/network/ScopedNetworkRequestSpec.kt +0 -53
  40. package/android/src/main/java/com/mentra/acsmeeting/network/ScopedNetworkState.kt +0 -127
  41. package/android/src/main/java/com/mentra/acsmeeting/network/ScopedSoftApNetwork.kt +0 -573
  42. package/android/src/main/java/com/mentra/acsmeeting/source/BitmapFont.kt +0 -99
  43. package/android/src/main/java/com/mentra/acsmeeting/source/CloudflareWhepSource.kt +0 -487
  44. package/android/src/main/java/com/mentra/acsmeeting/source/DecodedTrackRelay.kt +0 -147
  45. package/android/src/main/java/com/mentra/acsmeeting/source/FirstFrameGate.kt +0 -45
  46. package/android/src/main/java/com/mentra/acsmeeting/source/GlassesMediaSource.kt +0 -143
  47. package/android/src/main/java/com/mentra/acsmeeting/source/LocalWhipIngestSource.kt +0 -772
  48. package/android/src/main/java/com/mentra/acsmeeting/source/MediaListeners.kt +0 -57
  49. package/android/src/main/java/com/mentra/acsmeeting/source/SdpAdapter.kt +0 -17
  50. package/android/src/main/java/com/mentra/acsmeeting/source/SelectedIcePair.kt +0 -139
  51. package/android/src/main/java/com/mentra/acsmeeting/source/SoftApIceDiagnosis.kt +0 -144
  52. package/android/src/main/java/com/mentra/acsmeeting/source/SoftApIcePolicy.kt +0 -46
  53. package/android/src/main/java/com/mentra/acsmeeting/source/SoftApSdpGuard.kt +0 -160
  54. package/android/src/main/java/com/mentra/acsmeeting/source/SyntheticFrameFactory.kt +0 -205
  55. package/android/src/main/java/com/mentra/acsmeeting/source/SyntheticI420Source.kt +0 -214
  56. package/android/src/main/java/com/mentra/acsmeeting/source/TrackRegistry.kt +0 -33
  57. package/android/src/main/java/com/mentra/acsmeeting/source/VideoSourceArm.kt +0 -110
  58. package/android/src/main/java/com/mentra/acsmeeting/source/WhipIngestProtocol.kt +0 -207
  59. package/android/src/main/java/com/mentra/acsmeeting/source/WhipIngestServer.kt +0 -356
  60. package/android/src/main/java/com/mentra/acsmeeting/telemetry/AvSyncProbe.kt +0 -155
  61. package/android/src/main/java/com/mentra/acsmeeting/telemetry/ChromaProbe.kt +0 -78
  62. package/android/src/main/java/com/mentra/acsmeeting/telemetry/PipelineStats.kt +0 -372
  63. package/android/src/main/java/com/mentra/acsmeeting/telemetry/PipelineTicker.kt +0 -79
  64. package/android/src/main/java/com/mentra/acsmeeting/telemetry/ProcessCpu.kt +0 -15
  65. package/android/src/main/java/com/mentra/acsmeeting/telemetry/RingPercentile.kt +0 -48
  66. package/android/src/main/java/com/mentra/acsmeeting/telemetry/VideoQuality.kt +0 -178
  67. package/android/src/main/java/com/mentra/acsmeeting/telemetry/VideoRateVerdict.kt +0 -145
  68. package/android/src/main/java/com/mentra/acsmeeting/trace/SoftApTrace.kt +0 -143
  69. package/android/src/main/java/com/mentra/acsmeeting/video/FrameGeometry.kt +0 -22
  70. package/android/src/main/java/com/mentra/acsmeeting/video/I420Packer.kt +0 -72
  71. package/android/src/test/java/com/mentra/acsmeeting/network/InternetHoldLifecycleTest.kt +0 -102
  72. package/android/src/test/java/com/mentra/acsmeeting/network/InternetHoldTest.kt +0 -148
  73. package/android/src/test/java/com/mentra/acsmeeting/network/Ipv4PrefixTest.kt +0 -59
  74. package/android/src/test/java/com/mentra/acsmeeting/network/NetworkFactsTest.kt +0 -59
  75. package/android/src/test/java/com/mentra/acsmeeting/network/ScopedLocalNetworkPermissionTest.kt +0 -35
  76. package/android/src/test/java/com/mentra/acsmeeting/network/ScopedNetworkChangeDetectorTest.kt +0 -165
  77. package/android/src/test/java/com/mentra/acsmeeting/network/ScopedNetworkErrorTest.kt +0 -96
  78. package/android/src/test/java/com/mentra/acsmeeting/network/ScopedNetworkLifecycleTest.kt +0 -187
  79. package/android/src/test/java/com/mentra/acsmeeting/network/ScopedNetworkObserverTest.kt +0 -172
  80. package/android/src/test/java/com/mentra/acsmeeting/network/ScopedNetworkReadinessTest.kt +0 -141
  81. package/android/src/test/java/com/mentra/acsmeeting/network/ScopedNetworkRequestSpecTest.kt +0 -69
  82. package/android/src/test/java/com/mentra/acsmeeting/source/BitmapFontTest.kt +0 -22
  83. package/android/src/test/java/com/mentra/acsmeeting/source/DecodedTrackRelayTest.kt +0 -41
  84. package/android/src/test/java/com/mentra/acsmeeting/source/FirstFrameGateTest.kt +0 -60
  85. package/android/src/test/java/com/mentra/acsmeeting/source/GlassesMediaSourceTest.kt +0 -151
  86. package/android/src/test/java/com/mentra/acsmeeting/source/I420PlanesTest.kt +0 -67
  87. package/android/src/test/java/com/mentra/acsmeeting/source/SelectedIcePairTest.kt +0 -165
  88. package/android/src/test/java/com/mentra/acsmeeting/source/SoftApIceDiagnosisTest.kt +0 -148
  89. package/android/src/test/java/com/mentra/acsmeeting/source/SoftApIcePolicyTest.kt +0 -76
  90. package/android/src/test/java/com/mentra/acsmeeting/source/SoftApSdpGuardTest.kt +0 -275
  91. package/android/src/test/java/com/mentra/acsmeeting/source/SyntheticFrameFactoryTest.kt +0 -193
  92. package/android/src/test/java/com/mentra/acsmeeting/source/SyntheticI420SourceTest.kt +0 -176
  93. package/android/src/test/java/com/mentra/acsmeeting/source/TrackRegistryTest.kt +0 -45
  94. package/android/src/test/java/com/mentra/acsmeeting/source/WhipIngestProtocolTest.kt +0 -356
  95. package/android/src/test/java/com/mentra/acsmeeting/source/WhipIngestServerLoopbackTest.kt +0 -411
  96. package/android/src/test/java/com/mentra/acsmeeting/telemetry/AvSyncProbeTest.kt +0 -83
  97. package/android/src/test/java/com/mentra/acsmeeting/telemetry/ChromaProbeTest.kt +0 -61
  98. package/android/src/test/java/com/mentra/acsmeeting/telemetry/PipelineStatsTest.kt +0 -322
  99. package/android/src/test/java/com/mentra/acsmeeting/telemetry/ProcessCpuTest.kt +0 -18
  100. package/android/src/test/java/com/mentra/acsmeeting/telemetry/RingPercentileTest.kt +0 -49
  101. package/android/src/test/java/com/mentra/acsmeeting/telemetry/VideoRateVerdictTest.kt +0 -149
  102. package/android/src/test/java/com/mentra/acsmeeting/trace/SoftApTraceTest.kt +0 -97
  103. package/android/src/test/java/com/mentra/acsmeeting/video/FrameGeometryTest.kt +0 -33
  104. package/android/src/test/java/com/mentra/acsmeeting/video/I420PackerTest.kt +0 -126
  105. package/ios/PolicyKit/Sources/AcsAudioPolicy/GlassesMediaSource.swift +0 -68
  106. package/ios/WhepVideoSource.swift +0 -356
@@ -1,143 +0,0 @@
1
- package com.mentra.acsmeeting.source
2
-
3
- enum class SourceKind {
4
- /** Subscribe to a Cloudflare WHEP endpoint. The phone is the offerer. */
5
- WHEP,
6
- DIRECT,
7
-
8
- /**
9
- * Serve a WHIP endpoint on the glasses hotspot and let the glasses publish into it. The phone is
10
- * the answerer, and no traffic leaves the local link. See [LocalWhipIngestSource].
11
- */
12
- SOFTAP,
13
- }
14
-
15
- enum class SourceState { IDLE, CONNECTING, LIVE, FAILED }
16
-
17
- data class SourceConfig(
18
- /**
19
- * WHEP: the endpoint to subscribe to. SOFTAP: unused, because the URL is not known until the
20
- * listener has bound a port — the source reports it back through
21
- * [GlassesMediaSource.ingestUrl] instead.
22
- */
23
- val url: String,
24
- val kind: SourceKind = SourceKind.WHEP,
25
- /** SOFTAP only: the phone's own IPv4 address on the hotspot, to bind the listener to. */
26
- val bindAddress: String? = null,
27
- )
28
-
29
- /** ACS-negotiated output size. One object so a frame cannot observe a torn width/height. */
30
- data class TargetSize(val width: Int, val height: Int)
31
-
32
- /**
33
- * Whether a subscriber already on [currentUrl] can serve [next] as-is instead of
34
- * being rebuilt.
35
- *
36
- * Reuse is the whole point: a rebuild mints a new peer and restarts the wait for
37
- * the first frame, which is the outage we are trying to shorten. `CONNECTING`
38
- * counts as reusable, and since `LIVE` means "a frame reached the sink" that now
39
- * spans the answer → first frame window too. It cannot strand a caller, because
40
- * every `CONNECTING` is bounded: the offer post fails, or the answer's
41
- * first-frame deadline expires into `FAILED` and this returns false.
42
- *
43
- * SoftAP never reuses: the listener, port and peer belong to one publish attempt,
44
- * and the ingest URL is an output of binding, not an input that could stay valid.
45
- *
46
- * Owned by an object rather than a file-level function so Kotlin incremental
47
- * compile cannot see two [GlassesMediaSourceKt] facades and report a phantom
48
- * overload of the same signature.
49
- */
50
- object SourceReusePolicy {
51
- fun canReuse(currentUrl: String?, state: SourceState, next: SourceConfig): Boolean =
52
- currentUrl == next.url && next.kind == SourceKind.WHEP && state != SourceState.FAILED
53
- }
54
-
55
- /**
56
- * Observes source health transitions. `FAILED` is the one that matters: ICE
57
- * dropped, the WHEP endpoint went away, or an answered subscription never
58
- * delivered a frame — and nothing downstream will notice on its own, because
59
- * ACS keeps the call up with a frozen last frame.
60
- */
61
- fun interface SourceStateListener {
62
- fun onSourceState(state: SourceState, reason: String?)
63
- }
64
-
65
- /**
66
- * Transports whatever the glasses already captured. Capture policy lives
67
- * outside this interface so a Cloudflare hop can be replaced without touching ACS.
68
- */
69
- interface GlassesMediaSource {
70
- fun start(config: SourceConfig)
71
- fun restart(config: SourceConfig)
72
- /** Rebuild the transport for the current config even if it looks healthy. */
73
- fun forceRestart() {}
74
- fun stop()
75
- val state: SourceState
76
-
77
- /**
78
- * SOFTAP only: the WHIP URL the glasses must POST their offer to, known only after [start] has
79
- * bound a listener. Null for every other kind, where the URL is an input rather than an output.
80
- */
81
- val ingestUrl: String? get() = null
82
-
83
- fun setPcmDeliveryEnabled(enabled: Boolean)
84
- fun setTargetSize(size: TargetSize?) {}
85
- fun setStateListener(listener: SourceStateListener?) {}
86
- }
87
-
88
- /**
89
- * Builds the transport for one attempt. Takes [SourceConfig] because the kind decides the class:
90
- * a Cloudflare subscription and a SoftAP listener are different objects, not one object with a
91
- * mode flag, and the session must not have to know which.
92
- */
93
- fun interface GlassesMediaSourceFactory {
94
- fun create(video: VideoFrameListener, pcm: PcmListener, config: SourceConfig): GlassesMediaSource
95
- }
96
-
97
- class GlassesMediaController(
98
- private val factory: GlassesMediaSourceFactory,
99
- ) {
100
- private var source: GlassesMediaSource? = null
101
- private var stateListener: SourceStateListener? = null
102
-
103
- val state: SourceState
104
- get() = source?.state ?: SourceState.IDLE
105
-
106
- /** SOFTAP only: the URL the glasses must publish to, once a listener has bound. */
107
- val ingestUrl: String?
108
- get() = source?.ingestUrl
109
-
110
- fun attach(video: VideoFrameListener, pcm: PcmListener, config: SourceConfig) {
111
- source?.stop()
112
- source = factory.create(video, pcm, config).also {
113
- it.setStateListener(stateListener)
114
- it.start(config)
115
- }
116
- }
117
-
118
- fun restart(config: SourceConfig) {
119
- source?.restart(config)
120
- }
121
-
122
- fun forceRestart() {
123
- source?.forceRestart()
124
- }
125
-
126
- fun setStateListener(listener: SourceStateListener?) {
127
- stateListener = listener
128
- source?.setStateListener(listener)
129
- }
130
-
131
- fun stop() {
132
- source?.stop()
133
- source = null
134
- }
135
-
136
- fun setPcmDeliveryEnabled(enabled: Boolean) {
137
- source?.setPcmDeliveryEnabled(enabled)
138
- }
139
-
140
- fun setTargetSize(size: TargetSize?) {
141
- source?.setTargetSize(size)
142
- }
143
- }