@dolby-optiview/ads-sdk-core 1.0.0-beta.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 (187) hide show
  1. package/dist/OptiViewAds.d.ts +190 -0
  2. package/dist/OptiViewAds.js +1 -0
  3. package/dist/config/keys.d.ts +23 -0
  4. package/dist/config/keys.js +1 -0
  5. package/dist/diagnostics/DiagnosticBuffer.d.ts +33 -0
  6. package/dist/diagnostics/DiagnosticBuffer.js +1 -0
  7. package/dist/diagnostics/DiagnosticEvent.d.ts +71 -0
  8. package/dist/diagnostics/DiagnosticEvent.js +1 -0
  9. package/dist/diagnostics/debugLog.d.ts +8 -0
  10. package/dist/diagnostics/debugLog.js +1 -0
  11. package/dist/diagnostics/errorCodes.d.ts +45 -0
  12. package/dist/diagnostics/errorCodes.js +1 -0
  13. package/dist/diagnostics/index.d.ts +6 -0
  14. package/dist/diagnostics/index.js +1 -0
  15. package/dist/diagnostics/playbackErrorContext.d.ts +22 -0
  16. package/dist/diagnostics/playbackErrorContext.js +1 -0
  17. package/dist/generated/diagnosticCodes.d.ts +487 -0
  18. package/dist/generated/diagnosticCodes.js +1 -0
  19. package/dist/generated/version.d.ts +5 -0
  20. package/dist/generated/version.js +1 -0
  21. package/dist/id3/buildId3.d.ts +25 -0
  22. package/dist/id3/buildId3.js +1 -0
  23. package/dist/id3/index.d.ts +3 -0
  24. package/dist/id3/index.js +1 -0
  25. package/dist/id3/parseId3Geob.d.ts +28 -0
  26. package/dist/id3/parseId3Geob.js +1 -0
  27. package/dist/index.d.ts +45 -0
  28. package/dist/index.js +1 -0
  29. package/dist/interfaces/PlayerAdapter.d.ts +163 -0
  30. package/dist/interfaces/PlayerAdapter.js +1 -0
  31. package/dist/internal/index.d.ts +1 -0
  32. package/dist/internal/index.js +1 -0
  33. package/dist/server/index.d.ts +20 -0
  34. package/dist/server/index.js +1 -0
  35. package/dist/services/AdBreakSequencer.d.ts +146 -0
  36. package/dist/services/AdBreakSequencer.js +1 -0
  37. package/dist/services/AdPlayerController.d.ts +495 -0
  38. package/dist/services/AdPlayerController.js +1 -0
  39. package/dist/services/BreakScheduler.d.ts +215 -0
  40. package/dist/services/BreakScheduler.js +1 -0
  41. package/dist/services/BreakTransitionTimer.d.ts +48 -0
  42. package/dist/services/BreakTransitionTimer.js +1 -0
  43. package/dist/services/CmcdAdReporter.d.ts +81 -0
  44. package/dist/services/CmcdAdReporter.js +1 -0
  45. package/dist/services/GamPodAdTracker.d.ts +65 -0
  46. package/dist/services/GamPodAdTracker.js +1 -0
  47. package/dist/services/GamPodUrlBuilder.d.ts +30 -0
  48. package/dist/services/GamPodUrlBuilder.js +1 -0
  49. package/dist/services/GamStreamManager.d.ts +67 -0
  50. package/dist/services/GamStreamManager.js +1 -0
  51. package/dist/services/LensReporter.d.ts +30 -0
  52. package/dist/services/LensReporter.js +1 -0
  53. package/dist/services/ManifestService.d.ts +91 -0
  54. package/dist/services/ManifestService.js +1 -0
  55. package/dist/services/MetadataCueTracker.d.ts +44 -0
  56. package/dist/services/MetadataCueTracker.js +1 -0
  57. package/dist/services/PauseAdController.d.ts +108 -0
  58. package/dist/services/PauseAdController.js +1 -0
  59. package/dist/services/RewindRearm.d.ts +109 -0
  60. package/dist/services/RewindRearm.js +1 -0
  61. package/dist/services/SsaiController.d.ts +59 -0
  62. package/dist/services/SsaiController.js +1 -0
  63. package/dist/services/StitcherUrlBuilder.d.ts +34 -0
  64. package/dist/services/StitcherUrlBuilder.js +1 -0
  65. package/dist/services/VastAdManager.d.ts +89 -0
  66. package/dist/services/VastAdManager.js +1 -0
  67. package/dist/services/adPlayer/AdPlayerEvents.d.ts +39 -0
  68. package/dist/services/adPlayer/AdPlayerEvents.js +1 -0
  69. package/dist/services/adPlayer/AdPlayerState.d.ts +98 -0
  70. package/dist/services/adPlayer/AdPlayerState.js +1 -0
  71. package/dist/services/adPlayer/AdPreloader.d.ts +54 -0
  72. package/dist/services/adPlayer/AdPreloader.js +1 -0
  73. package/dist/services/adPlayer/AdStage.d.ts +57 -0
  74. package/dist/services/adPlayer/AdStage.js +1 -0
  75. package/dist/services/adPlayer/AssetParameterResolver.d.ts +44 -0
  76. package/dist/services/adPlayer/AssetParameterResolver.js +1 -0
  77. package/dist/services/adPlayer/AssetPlayback.d.ts +71 -0
  78. package/dist/services/adPlayer/AssetPlayback.js +1 -0
  79. package/dist/services/adPlayer/BreakSequenceDriver.d.ts +46 -0
  80. package/dist/services/adPlayer/BreakSequenceDriver.js +1 -0
  81. package/dist/services/adPlayer/ContentResumeCoordinator.d.ts +44 -0
  82. package/dist/services/adPlayer/ContentResumeCoordinator.js +1 -0
  83. package/dist/services/adPlayer/ContinueContentPlayout.d.ts +26 -0
  84. package/dist/services/adPlayer/ContinueContentPlayout.js +1 -0
  85. package/dist/services/adPlayer/GamPodBridge.d.ts +66 -0
  86. package/dist/services/adPlayer/GamPodBridge.js +1 -0
  87. package/dist/services/adPlayer/PauseAdPresenter.d.ts +60 -0
  88. package/dist/services/adPlayer/PauseAdPresenter.js +1 -0
  89. package/dist/services/adPlayer/PresentationModeTracker.d.ts +66 -0
  90. package/dist/services/adPlayer/PresentationModeTracker.js +1 -0
  91. package/dist/services/adPlayer/SharedElementBreakPlayer.d.ts +54 -0
  92. package/dist/services/adPlayer/SharedElementBreakPlayer.js +1 -0
  93. package/dist/services/adPlayer/VariantSelector.d.ts +38 -0
  94. package/dist/services/adPlayer/VariantSelector.js +1 -0
  95. package/dist/services/adPlayer/connectPauseAd.d.ts +10 -0
  96. package/dist/services/adPlayer/connectPauseAd.js +1 -0
  97. package/dist/services/adPlayer/liveEdge.d.ts +6 -0
  98. package/dist/services/adPlayer/liveEdge.js +1 -0
  99. package/dist/services/assetParameterMacroTable.d.ts +9 -0
  100. package/dist/services/assetParameterMacroTable.js +1 -0
  101. package/dist/services/assetParameterMacros.d.ts +69 -0
  102. package/dist/services/assetParameterMacros.js +1 -0
  103. package/dist/services/breakTiming.d.ts +60 -0
  104. package/dist/services/breakTiming.js +1 -0
  105. package/dist/services/channelSwitch.d.ts +32 -0
  106. package/dist/services/channelSwitch.js +1 -0
  107. package/dist/services/detectDeviceType.d.ts +15 -0
  108. package/dist/services/detectDeviceType.js +1 -0
  109. package/dist/services/detectInsertionMode.d.ts +38 -0
  110. package/dist/services/detectInsertionMode.js +1 -0
  111. package/dist/services/detectPreloadMode.d.ts +13 -0
  112. package/dist/services/detectPreloadMode.js +1 -0
  113. package/dist/services/ed25519.d.ts +19 -0
  114. package/dist/services/ed25519.js +1 -0
  115. package/dist/services/fetchWithTimeout.d.ts +35 -0
  116. package/dist/services/fetchWithTimeout.js +1 -0
  117. package/dist/services/lensBackend.d.ts +16 -0
  118. package/dist/services/lensBackend.js +1 -0
  119. package/dist/services/lensBackendDevelopment.d.ts +1 -0
  120. package/dist/services/lensBackendDevelopment.js +1 -0
  121. package/dist/services/lensBackendProduction.d.ts +9 -0
  122. package/dist/services/lensBackendProduction.js +1 -0
  123. package/dist/services/manifestSignature.d.ts +43 -0
  124. package/dist/services/manifestSignature.js +1 -0
  125. package/dist/services/manifestTrustedKeys.d.ts +9 -0
  126. package/dist/services/manifestTrustedKeys.js +1 -0
  127. package/dist/services/parseBreakManifest.d.ts +15 -0
  128. package/dist/services/parseBreakManifest.js +1 -0
  129. package/dist/services/parseVastCompanion.d.ts +31 -0
  130. package/dist/services/parseVastCompanion.js +1 -0
  131. package/dist/services/parseVastLinear.d.ts +36 -0
  132. package/dist/services/parseVastLinear.js +1 -0
  133. package/dist/services/pictureInPicture.d.ts +28 -0
  134. package/dist/services/pictureInPicture.js +1 -0
  135. package/dist/services/resolveAssetParameters.d.ts +6 -0
  136. package/dist/services/resolveAssetParameters.js +1 -0
  137. package/dist/services/resolveDeliveryMode.d.ts +54 -0
  138. package/dist/services/resolveDeliveryMode.js +1 -0
  139. package/dist/services/resolveGamVendorConfiguration.d.ts +55 -0
  140. package/dist/services/resolveGamVendorConfiguration.js +1 -0
  141. package/dist/services/resolvePauseResumePoint.d.ts +32 -0
  142. package/dist/services/resolvePauseResumePoint.js +1 -0
  143. package/dist/services/resolvePollingDecision.d.ts +24 -0
  144. package/dist/services/resolvePollingDecision.js +1 -0
  145. package/dist/services/resolveResumePoint.d.ts +38 -0
  146. package/dist/services/resolveResumePoint.js +1 -0
  147. package/dist/services/resolveTargetedUri.d.ts +22 -0
  148. package/dist/services/resolveTargetedUri.js +1 -0
  149. package/dist/services/resolveVastAdmission.d.ts +34 -0
  150. package/dist/services/resolveVastAdmission.js +1 -0
  151. package/dist/services/selectVariant.d.ts +47 -0
  152. package/dist/services/selectVariant.js +1 -0
  153. package/dist/services/urlOrigin.d.ts +23 -0
  154. package/dist/services/urlOrigin.js +1 -0
  155. package/dist/session/AdBreakStatusTracker.d.ts +49 -0
  156. package/dist/session/AdBreakStatusTracker.js +1 -0
  157. package/dist/session/BreakLifecycle.d.ts +62 -0
  158. package/dist/session/BreakLifecycle.js +1 -0
  159. package/dist/session/SessionStarter.d.ts +98 -0
  160. package/dist/session/SessionStarter.js +1 -0
  161. package/dist/session/SessionState.d.ts +37 -0
  162. package/dist/session/SessionState.js +1 -0
  163. package/dist/types/BreakManifest.d.ts +335 -0
  164. package/dist/types/BreakManifest.js +1 -0
  165. package/dist/types/Events.d.ts +245 -0
  166. package/dist/types/Events.js +1 -0
  167. package/dist/types/OptiViewAdsConfig.d.ts +425 -0
  168. package/dist/types/OptiViewAdsConfig.js +1 -0
  169. package/dist/types/VendorAdError.d.ts +12 -0
  170. package/dist/types/VendorAdError.js +1 -0
  171. package/dist/vendor/lens-sdk/THIRD-PARTY-NOTICES.txt +266 -0
  172. package/dist/vendor/lens-sdk/compat.d.ts +9 -0
  173. package/dist/vendor/lens-sdk/encoding-cmcd.d.ts +9 -0
  174. package/dist/vendor/lens-sdk/encoding-json.d.ts +9 -0
  175. package/dist/vendor/lens-sdk/encoding.d.ts +42 -0
  176. package/dist/vendor/lens-sdk/environment.d.ts +35 -0
  177. package/dist/vendor/lens-sdk/index.d.ts +3 -0
  178. package/dist/vendor/lens-sdk/index.js +1 -0
  179. package/dist/vendor/lens-sdk/legacy.d.ts +12 -0
  180. package/dist/vendor/lens-sdk/lens-core-Q5lbQGMC.js +1 -0
  181. package/dist/vendor/lens-sdk/lens-global.d.ts +23 -0
  182. package/dist/vendor/lens-sdk/lens.d.ts +21 -0
  183. package/dist/vendor/lens-sdk/transport.d.ts +46 -0
  184. package/dist/vendor/lens-sdk/types.d.ts +218 -0
  185. package/dist/vendor/lens-sdk/user-id.d.ts +5 -0
  186. package/dist/vendor/lens-sdk/validation.d.ts +30 -0
  187. package/package.json +57 -0
@@ -0,0 +1,487 @@
1
+ /**
2
+ * The full catalog of known diagnostic codes, keyed by the stable code string.
3
+ * `as const` keeps the keys narrow so callers get compile-time checking via
4
+ * {@link KnownDiagnosticCode}.
5
+ */
6
+ export declare const DIAGNOSTIC_CODES: {
7
+ readonly "DA-SESSION-STARTED": {
8
+ readonly category: "session";
9
+ readonly level: "info";
10
+ readonly summary: "Monetization session started; manifest polling began. context: manifestUrl (stitcherUrl in SSAI mode), reported verbatim.";
11
+ };
12
+ readonly "DA-SESSION-ENDED": {
13
+ readonly category: "session";
14
+ readonly level: "info";
15
+ readonly summary: "Monetization session ended; polling and scheduling stopped.";
16
+ };
17
+ readonly "DA-ASSET-PARAMETERS-UPDATED": {
18
+ readonly category: "session";
19
+ readonly level: "info";
20
+ readonly summary: "The break manifest's session-level asset parameters changed; the merged parameters were pushed to the active GAM stream. context: source ('manifest'), keys (parameter names only, never values).";
21
+ };
22
+ readonly "DA-MANIFEST-FETCH-FAILED": {
23
+ readonly category: "manifest";
24
+ readonly level: "error";
25
+ readonly summary: "Initial break-manifest fetch failed; the session could not start.";
26
+ };
27
+ readonly "DA-MANIFEST-POLL-FAILED": {
28
+ readonly category: "manifest";
29
+ readonly level: "warn";
30
+ readonly summary: "A manifest poll failed; the SDK keeps the last good manifest and retries.";
31
+ };
32
+ readonly "DA-MANIFEST-CHANNEL-CHANGED": {
33
+ readonly category: "manifest";
34
+ readonly level: "info";
35
+ readonly summary: "A polled manifest describes a different ads channel (channelId, GAM identity or timebase changed); the SDK re-aligned its ad setup and resolved delivery mode again while the session and content playback continued. context: previousChannelId, channelId, reason, manifestUrl.";
36
+ };
37
+ readonly "DA-MANIFEST-INTERCEPT-FAILED": {
38
+ readonly category: "manifest";
39
+ readonly level: "warn";
40
+ readonly summary: "The customer manifest-response interceptor threw; the un-modified parsed manifest was used instead.";
41
+ };
42
+ readonly "DA-MANIFEST-REQUEST-INTERCEPT-FAILED": {
43
+ readonly category: "manifest";
44
+ readonly level: "warn";
45
+ readonly summary: "The customer manifest-request interceptor threw; the normal network fetch of the original URL was used instead.";
46
+ };
47
+ readonly "DA-MANIFEST-SIGNATURE-INVALID": {
48
+ readonly category: "manifest";
49
+ readonly level: "error";
50
+ readonly summary: "The break-manifest response failed detached-JWS signature verification (missing/malformed X-Manifest-Signature, unsupported alg, unknown kid, unknown critical param, or signature mismatch); the manifest was rejected and no breaks were scheduled. context: url, reason.";
51
+ };
52
+ readonly "DA-PDT-MISSING": {
53
+ readonly category: "playback";
54
+ readonly level: "warn";
55
+ readonly summary: "No EXT-X-PROGRAM-DATE-TIME once content is playing (or after the startup backstop window); wallclock-timebase breaks fall back to the system clock.";
56
+ };
57
+ readonly "DA-ANVATO-CUE-PENDING": {
58
+ readonly category: "break";
59
+ readonly level: "info";
60
+ readonly summary: "ptsSource: 'anvatoCue' — no Anvato in-stream cue observed yet for a PTS break; the break stays pending until its cue arrives.";
61
+ };
62
+ readonly "DA-ANVATO-CUE-MATCHED": {
63
+ readonly category: "break";
64
+ readonly level: "info";
65
+ readonly summary: "ptsSource: 'anvatoCue' — a PTS break's start was matched to an observed Anvato cue and scheduled at the cue's media time.";
66
+ };
67
+ readonly "DA-ANVATO-CUE-ENTERED": {
68
+ readonly category: "break";
69
+ readonly level: "info";
70
+ readonly summary: "ptsSource: 'anvatoCue' — a break was started by the cue reaching the playhead rather than by the scheduler's 250ms tick; context carries the breakId, the cue pts and the media time it fired at, so the two start paths are distinguishable in the field.";
71
+ };
72
+ readonly "DA-ANVATO-CUE-OBSERVED": {
73
+ readonly category: "break";
74
+ readonly level: "info";
75
+ readonly summary: "ptsSource: 'anvatoCue' — an Anvato break-signaling (type=cue) frame was observed in the stream; context carries the cue's pts, the media time it landed at, whether the tracker recorded it, and the raw payload — so a manifest-PTS vs in-stream-PTS misalignment is observable in the field.";
76
+ };
77
+ readonly "DA-PRELOAD-FAILED": {
78
+ readonly category: "preload";
79
+ readonly level: "warn";
80
+ readonly summary: "Ad preload failed; the asset will be loaded on demand at break start.";
81
+ };
82
+ readonly "DA-PRELOAD-MODE-RESOLVED": {
83
+ readonly category: "preload";
84
+ readonly level: "info";
85
+ readonly summary: "The configured ad preload mode was resolved for this session; context carries both the configured and the resolved mode.";
86
+ };
87
+ readonly "DA-PRELOAD-PATH": {
88
+ readonly category: "preload";
89
+ readonly level: "info";
90
+ readonly summary: "The preload path actually taken for a break's ad (parallel buffer / detached prefetch / none) and the creative container (stream vs progressive).";
91
+ };
92
+ readonly "DA-BREAK-EARLY-RETURN": {
93
+ readonly category: "break";
94
+ readonly level: "info";
95
+ readonly summary: "The active break was removed from a polled manifest (early return); the break ends immediately and content resumes at break start plus the seconds already played.";
96
+ };
97
+ readonly "DA-BREAK-WINDOW-ESCAPED": {
98
+ readonly category: "break";
99
+ readonly level: "warn";
100
+ readonly summary: "An active wallclock break outlived its window on the stream clock (ad stall, bogus trigger position, or a re-fired completed break); the SDK ended it and returned to content. context.overrunSec says by how much.";
101
+ };
102
+ readonly "DA-BREAK-EVENT-UNSUPPORTED": {
103
+ readonly category: "break";
104
+ readonly level: "warn";
105
+ readonly summary: "A break is triggered by a spec event this SDK version does not schedule on this platform (web schedules `start`, `pause` and `end`; Android and iOS do not schedule `end` yet); the break was ignored. context.event names the event.";
106
+ };
107
+ readonly "DA-BREAK-SUPPRESSED-OVERLAP": {
108
+ readonly category: "break";
109
+ readonly level: "warn";
110
+ readonly summary: "A break was suppressed because an ad was already playing.";
111
+ };
112
+ readonly "DA-BREAK-TRANSITION": {
113
+ readonly category: "break";
114
+ readonly level: "info";
115
+ readonly summary: "Measured duration of a playback transition into an ad break, between two ads, between chained breaks, or back to content.";
116
+ };
117
+ readonly "DA-AD-SURFACE-REVEALED": {
118
+ readonly category: "break";
119
+ readonly level: "info";
120
+ readonly summary: "The ad surface became visible: how long it was held back waiting for the ad's first frame, and whether it was revealed because that frame arrived or because the wait timed out.";
121
+ };
122
+ readonly "DA-PREROLL-CONTENT-HELD": {
123
+ readonly category: "break";
124
+ readonly level: "info";
125
+ readonly summary: "Content playback was held at session start until a pending pre-roll began, so no content is shown before the ad.";
126
+ };
127
+ readonly "DA-SHARED-ELEMENT-UNSUPPORTED": {
128
+ readonly category: "break";
129
+ readonly level: "warn";
130
+ readonly summary: "Configured shared-element insertion is unsupported on this platform (non-iPhone/iPod); fell back to overlay insertion.";
131
+ };
132
+ readonly "DA-SHARED-ELEMENT-RESTORE-FAILED": {
133
+ readonly category: "playback";
134
+ readonly level: "error";
135
+ readonly summary: "Content did not resume after a shared-element break: the reload/seek/play restore failed twice; the viewer is left paused on the handed-back element.";
136
+ };
137
+ readonly "DA-IMAGE-LOAD-FAILED": {
138
+ readonly category: "break";
139
+ readonly level: "warn";
140
+ readonly summary: "An image (companion, backdrop or image ad) could not be fetched or decoded within the timeout; the break continues without it.";
141
+ };
142
+ readonly "DA-PIP-TRANSFER-FAILED": {
143
+ readonly category: "break";
144
+ readonly level: "warn";
145
+ readonly summary: "The picture-in-picture window could not be moved between the content and ad elements; the break continues but the viewer may not see the ad in the PiP window.";
146
+ };
147
+ readonly "DA-PIP-AUTODETECT-UNAVAILABLE": {
148
+ readonly category: "break";
149
+ readonly level: "warn";
150
+ readonly summary: "No Activity could be resolved from the renderer's Context or the overlay's view tree, so picture-in-picture cannot be detected automatically; the host must call OptiViewAds.setPictureInPicture() from Activity.onPictureInPictureModeChanged or breaks will be laid out for a fullscreen surface. Android only.";
151
+ };
152
+ readonly "DA-CONTENT-ELEMENT-SWAPPED": {
153
+ readonly category: "break";
154
+ readonly level: "info";
155
+ readonly summary: "The content player replaced its <video> element; the SDK re-bound its presentation listeners to the new one.";
156
+ };
157
+ readonly "DA-PIP-FORMAT-OVERRIDE": {
158
+ readonly category: "break";
159
+ readonly level: "info";
160
+ readonly summary: "The content player is in picture-in-picture, so the break's declared format was overruled and it plays as a single fullscreen ad.";
161
+ };
162
+ readonly "DA-CHAIN-RESOLVER-ERROR": {
163
+ readonly category: "chaining";
164
+ readonly level: "warn";
165
+ readonly summary: "The chained-successor resolver threw; chaining was skipped for this break.";
166
+ };
167
+ readonly "DA-GAM-NO-ASSET-KEY": {
168
+ readonly category: "gam";
169
+ readonly level: "warn";
170
+ readonly summary: "Retired: the GAM stream identity now comes from the manifest's vendorConfiguration. Kept declared so the code is never reused; see DA-GAM-CONFIG-MISSING.";
171
+ };
172
+ readonly "DA-GAM-SESSION-FAILED": {
173
+ readonly category: "gam";
174
+ readonly level: "error";
175
+ readonly summary: "The GAM/IMA session failed to initialize; GAM breaks will not serve.";
176
+ };
177
+ readonly "DA-GAM-CONFIG-RESOLVED": {
178
+ readonly category: "gam";
179
+ readonly level: "info";
180
+ readonly summary: "The GAM stream identity for this session was resolved from the manifest's vendorConfiguration.";
181
+ };
182
+ readonly "DA-GAM-CONFIG-MISSING": {
183
+ readonly category: "gam";
184
+ readonly level: "error";
185
+ readonly summary: "The break manifest carries no usable \"gam\" vendorConfiguration entry; GAM assets are skipped.";
186
+ };
187
+ readonly "DA-GAM-POD-IDENTITY-MISMATCH": {
188
+ readonly category: "gam";
189
+ readonly level: "error";
190
+ readonly summary: "A GAM pod asset's vendorParameters name a different network code or custom asset key than the stream session was created with; the asset is skipped because the pod request cannot serve.";
191
+ };
192
+ readonly "DA-VENDOR-CONFIG-UNKNOWN-TYPE": {
193
+ readonly category: "manifest";
194
+ readonly level: "info";
195
+ readonly summary: "One or more vendorConfiguration entries declare a type this SDK version does not recognise and were ignored.";
196
+ };
197
+ readonly "DA-CONTENT-PLAYBACK-ERROR": {
198
+ readonly category: "playback";
199
+ readonly level: "error";
200
+ readonly summary: "The content player reported a playback error.";
201
+ };
202
+ readonly "DA-CONTENT-RESUME-STALLED": {
203
+ readonly category: "playback";
204
+ readonly level: "warn";
205
+ readonly summary: "Content did not resume within the watchdog window after a break that paused it ended; the SDK re-issued play() once. iOS only for now.";
206
+ };
207
+ readonly "DA-AD-PLAYBACK-ERROR": {
208
+ readonly category: "playback";
209
+ readonly level: "error";
210
+ readonly summary: "The ad player reported a playback error during a break.";
211
+ };
212
+ readonly "DA-AD-START-INTERRUPTED": {
213
+ readonly category: "playback";
214
+ readonly level: "warn";
215
+ readonly summary: "The ad element's play() was interrupted by a browser-initiated pause before the ad started (Chromium AbortError, seen on Samsung Tizen); the SDK re-issued play() once. context: breakId, error.";
216
+ };
217
+ readonly "DA-DELIVERY-MODE-RESOLVED": {
218
+ readonly category: "session";
219
+ readonly level: "info";
220
+ readonly summary: "Delivery mode (sgai/ssai) resolved for the session at start and again on an ads-channel switch from the manifest's delivery rules (or the explicit client config).";
221
+ };
222
+ readonly "DA-DELIVERY-MODE-UNKNOWN": {
223
+ readonly category: "session";
224
+ readonly level: "warn";
225
+ readonly summary: "The matching delivery rule carried an unrecognized mode value; sgai is used (forward compatibility).";
226
+ };
227
+ readonly "DA-DELIVERY-MODE-OVERRIDDEN": {
228
+ readonly category: "session";
229
+ readonly level: "info";
230
+ readonly summary: "The manifest's delivery rules resolved a different mode, but the explicit client config takes precedence.";
231
+ };
232
+ readonly "DA-DELIVERY-MODE-CHANGE-IGNORED": {
233
+ readonly category: "session";
234
+ readonly level: "warn";
235
+ readonly summary: "An ordinary manifest poll resolves a different delivery mode; the mode pinned for the session stays in force. An ads-channel switch resolves the mode again.";
236
+ };
237
+ readonly "DA-SSAI-UNAVAILABLE": {
238
+ readonly category: "session";
239
+ readonly level: "error";
240
+ readonly summary: "The manifest selected ssai delivery but no vendor configuration can provide a stitched stream (no gam entry with an assetKey); at start the session fails, while on a channel switch the session stays in sgai.";
241
+ };
242
+ readonly "DA-SSAI-SESSION-FAILED": {
243
+ readonly category: "session";
244
+ readonly level: "error";
245
+ readonly summary: "The SSAI session failed to start (IMA stream init, stream id, or stitched-stream load).";
246
+ };
247
+ readonly "DA-SSAI-IMA-ERROR": {
248
+ readonly category: "gam";
249
+ readonly level: "error";
250
+ readonly summary: "IMA reported an error during the SSAI stream session.";
251
+ };
252
+ readonly "DA-INSERTION-TYPE-RESOLVED": {
253
+ readonly category: "session";
254
+ readonly level: "info";
255
+ readonly summary: "Per-session ad insertion type resolved, and whether the integrator set it or left it unset (unset lets the manifest's resumeOffset drive the resume point).";
256
+ };
257
+ readonly "DA-RESUME-OFFSET-CLAMPED": {
258
+ readonly category: "break";
259
+ readonly level: "info";
260
+ readonly summary: "The resume offset was shortened to the ad duration actually played, so the break could not skip further than the ads it delivered.";
261
+ };
262
+ readonly "DA-INSERTION-TYPE-IGNORED-SSAI": {
263
+ readonly category: "session";
264
+ readonly level: "warn";
265
+ readonly summary: "adInsertionType is ignored in SSAI mode; the stitcher controls ad insertion server-side.";
266
+ };
267
+ readonly "DA-VAST-UNSUPPORTED-FORMAT": {
268
+ readonly category: "break";
269
+ readonly level: "warn";
270
+ readonly summary: "A VAST asset appeared in an unsupported break format; VAST is only supported in single, double, and lshape_ad. The break was skipped.";
271
+ };
272
+ readonly "DA-ASSET-MACRO-UNKNOWN": {
273
+ readonly category: "break";
274
+ readonly level: "warn";
275
+ readonly summary: "An asset parameter value contained a macro the SDK has no value for (an unknown or unavailable OptiView macro, or a registered customer macro that returned no value); the parameter was still sent, with the macro kept as its literal token. Raised once per parameter key and macro. context: key, macro, breakId, assetId.";
276
+ };
277
+ readonly "DA-VAST-SSAI-UNSUPPORTED": {
278
+ readonly category: "session";
279
+ readonly level: "warn";
280
+ readonly summary: "VAST assets are not supported in SSAI mode (VAST is SGAI-only); the asset was skipped.";
281
+ };
282
+ readonly "DA-VAST-IMA-ERROR": {
283
+ readonly category: "gam";
284
+ readonly level: "error";
285
+ readonly summary: "Google IMA reported an error while loading or playing a VAST (client-side / CSAI) ad.";
286
+ };
287
+ readonly "DA-VAST-IMA-SDK-MISSING": {
288
+ readonly category: "gam";
289
+ readonly level: "error";
290
+ readonly summary: "The Google IMA client-side SDK (ima3.js) is unavailable; VAST (CSAI) ads cannot be played.";
291
+ };
292
+ readonly "DA-PAUSE-AD-SHOWN": {
293
+ readonly category: "break";
294
+ readonly level: "info";
295
+ readonly summary: "A pause ad (full-screen image or video) was shown while content is paused.";
296
+ };
297
+ readonly "DA-PAUSE-AD-DISMISSED": {
298
+ readonly category: "break";
299
+ readonly level: "info";
300
+ readonly summary: "A pause ad was dismissed (content resumed, or the duration cap elapsed).";
301
+ };
302
+ readonly "DA-PAUSE-AD-RESUME-ALLOWED": {
303
+ readonly category: "break";
304
+ readonly level: "info";
305
+ readonly summary: "The viewer may now resume content over the shown pause ad: the break's controls.skipOffset elapsed, or (no skipOffset) the ad was watched fully: a video creative ended, an image reached its duration cap or has none. context: breakId.";
306
+ };
307
+ readonly "DA-PAUSE-AD-RESUME-BLOCKED": {
308
+ readonly category: "break";
309
+ readonly level: "info";
310
+ readonly summary: "Content tried to resume while a pause ad must still be watched (controls.skipOffset not reached, or no skipOffset and the video creative has not ended / the image duration cap has not elapsed); the SDK keeps content paused. context: breakId, elapsedSec, skipOffset.";
311
+ };
312
+ readonly "DA-PAUSE-AD-DVR-EXPIRED": {
313
+ readonly category: "break";
314
+ readonly level: "info";
315
+ readonly summary: "The viewer paused for longer than the DVR window is deep, so the position they paused at aged out and playback resumed at the live edge instead. context: pinnedPosition, liveEdge.";
316
+ };
317
+ readonly "DA-PAUSE-AD-NO-ASSET": {
318
+ readonly category: "break";
319
+ readonly level: "warn";
320
+ readonly summary: "A pause break had no usable image or video asset (no first asset, unsupported media type, or no resolvable VAST creative); the pause ad was skipped.";
321
+ };
322
+ readonly "DA-PAUSE-AD-SSAI-UNSUPPORTED": {
323
+ readonly category: "session";
324
+ readonly level: "warn";
325
+ readonly summary: "Pause ads are SGAI-only and not supported in SSAI mode; the pause break was skipped.";
326
+ };
327
+ readonly "DA-MANIFEST-POLLED": {
328
+ readonly category: "manifest";
329
+ readonly level: "info";
330
+ readonly summary: "A manifest poll refresh succeeded (cadence follows the manifest polling config).";
331
+ };
332
+ readonly "DA-AD-SKIPPED": {
333
+ readonly category: "playback";
334
+ readonly level: "info";
335
+ readonly summary: "The viewer skipped the active ad break (controls.skipOffset honored).";
336
+ };
337
+ readonly "DA-AD-SKIP-SUPPRESSED": {
338
+ readonly category: "playback";
339
+ readonly level: "info";
340
+ readonly summary: "A skip request was suppressed (no skipOffset declared, or requested before the offset).";
341
+ };
342
+ readonly "DA-AD-CLICKED": {
343
+ readonly category: "playback";
344
+ readonly level: "info";
345
+ readonly summary: "The viewer clicked the ad on screen (adclick emitted).";
346
+ };
347
+ readonly "DA-RESUME-SEEK": {
348
+ readonly category: "playback";
349
+ readonly level: "info";
350
+ readonly summary: "Content was resume-seeked to the resolved post-break position (insertion type policy).";
351
+ };
352
+ readonly "DA-RESUME-LANDED": {
353
+ readonly category: "playback";
354
+ readonly level: "info";
355
+ readonly summary: "Where the post-break resume-seek actually landed, measured on the seeked event rather than inferred: context carries breakId, target (the position requested), landed and errorSec (landed - target; negative means the player settled EARLIER than asked). landed is null with a reason when no seeked event arrived, which is normal for a seek to the position the playhead already holds. Report-only: the SDK does not correct the position.";
356
+ };
357
+ readonly "DA-RESUME-PREPOSITIONED": {
358
+ readonly category: "playback";
359
+ readonly level: "info";
360
+ readonly summary: "The break resumed without a seek: content was moved onto its resume position DURING the break, so the transition needed no jump. Context carries breakId, target, prepositionedTo, landed, shortfallSec and exact. exact=true means it reached the policy target. exact=false means the live window never published those frames, so content was moved as close as exists — the viewer lands short, but arrives already in place rather than via a visible seek at the cut.";
361
+ };
362
+ readonly "DA-RESUME-CATCHUP": {
363
+ readonly category: "playback";
364
+ readonly level: "info";
365
+ readonly summary: "Content began playing behind the ad to reach its resume point. Context carries breakId, startPos, target, remainingAdSec, publishedEnd and clampedStart — clampedStart true means the stream had not published the ideal start position, so playback began late and the alignment loop must make up the difference (the zero-live-headroom case). Its ABSENCE on a live break that resumed short means catch-up never ran at all, which is a different fault from it running and falling short.";
366
+ };
367
+ readonly "DA-RESUME-TARGET-CLAMPED": {
368
+ readonly category: "playback";
369
+ readonly level: "warn";
370
+ readonly summary: "The computed resume position sat inside the engine's minimum live offset and was clamped to the closest position the engine will hold; context carries breakId, requested, clamped and shortfallSec. Distinct from DA-RESUME-OFFSET-CLAMPED, which shortens the OFFSET to the ad seconds actually played.";
371
+ };
372
+ readonly "DA-RESUME-ALIGN-BLOCKED": {
373
+ readonly category: "playback";
374
+ readonly level: "warn";
375
+ readonly summary: "Resume alignment wanted to move content past the live edge and stood down, because no seek can reach media the stream has not published yet; content is left riding the edge and the break-end clamp places it. Context carries target, requested, safeEnd, shortfallSec and remainingSec. Emitted once per break. A persistent shortfall here means the resume target is further ahead than the feed's published edge — typically the player's view of the edge is stale, not that the seek is wrong.";
376
+ };
377
+ readonly "DA-CONTINUE-PLAYOUT-BEGIN": {
378
+ readonly category: "playback";
379
+ readonly level: "info";
380
+ readonly summary: "continueContentDuringBreak engaged: content keeps PLAYING through the break, hidden and muted, so no resume seek is needed. Context carries breakId, anchor, breakDurationSec and edgeDistanceSec.";
381
+ };
382
+ readonly "DA-CONTINUE-PLAYOUT-END": {
383
+ readonly category: "playback";
384
+ readonly level: "info";
385
+ readonly summary: "continueContentDuringBreak reached the cut. Context carries driftSec (content position minus where the break says it should be), maxDriftSec, the corrections applied, rateHonoured (false if the engine drove playbackRate itself) and driftUnrecoverable.";
386
+ };
387
+ readonly "DA-CONTINUE-PLAYOUT-REFUSED": {
388
+ readonly category: "playback";
389
+ readonly level: "info";
390
+ readonly summary: "continueContentDuringBreak was not used this session, so breaks pause content and resume with a seek as before. Emitted once per session; context carries the reason (disabled, not-replacement, format, shared-element, picture-in-picture, single-decoder) and the break format. Its ABSENCE on an eligible session is the signal the mode engaged.";
391
+ };
392
+ readonly "DA-CONTINUE-PLAYOUT-QUALITY-UNAVAILABLE": {
393
+ readonly category: "playback";
394
+ readonly level: "warn";
395
+ readonly summary: "Content continues through the replacement break without a video-quality constraint, so the content stream may retain its normal bitrate alongside the ad. Context carries breakId and reason (unsupported when the optional Web adapter method is absent, not-applied when the adapter returned false or could not apply the request).";
396
+ };
397
+ readonly "DA-CONTINUE-PLAYOUT-DRIFT": {
398
+ readonly category: "playback";
399
+ readonly level: "warn";
400
+ readonly summary: "Content drifted further from the break timeline than the remaining break can remove within the playback-rate bounds, so part of it is carried into the cut. Context carries driftSec, remainingSec, the rate applied and seekIssued (always false: a corrective seek would be clipped).";
401
+ };
402
+ readonly "DA-CONTINUE-PLAYOUT-ABANDONED": {
403
+ readonly category: "playback";
404
+ readonly level: "warn";
405
+ readonly summary: "Content could not be kept playing through the break, so it reverted to the pause-and-resume path mid-break. Context carries breakId, the reason and the driftSec at the moment it converted.";
406
+ };
407
+ readonly "DA-AD-AV-DESYNC": {
408
+ readonly category: "playback";
409
+ readonly level: "warn";
410
+ readonly summary: "The ad player's audio sink was handed a buffer whose timestamp does not continue the audio it has already been fed, so the media clock had to be re-anchored mid-ad. Video is scheduled off that clock while the audio already queued in the output track keeps draining, so every re-anchor pushes the picture further from the sound actually being heard. Context carries breakId, assetId, expectedSec, actualSec, deltaSec (negative = audio running behind the picture) and positionSec. Seen on server-stitched pods whose per-ad audio and video durations do not match; a single event near the end of a pod is the accumulated total, not an isolated glitch.";
411
+ };
412
+ readonly "DA-AD-PLAYOUT-SYNC": {
413
+ readonly category: "playback";
414
+ readonly level: "info";
415
+ readonly summary: "Per-break summary of ad playout health, emitted once at break end. Context carries podUri (the resolved ad media, so a stitched pod can be fetched and inspected), desyncEvents, maxDesyncSec, droppedFrames, audioUnderruns, audioFormats and videoFormats (the distinct decoder input formats seen during the break — more than one means the stitched stream changed sample rate or codec mid-pod) and frameOffsetMeanMs (mean video frame processing offset; large negative values mean frames were released late against the audio clock).";
416
+ };
417
+ readonly "DA-EVENT": {
418
+ readonly category: "event";
419
+ readonly level: "info";
420
+ readonly summary: "An SDK event, recorded into the diagnostic ring buffer so exportDiagnostics() carries one unified timeline of diagnostics and playback events. Raised to error for aderror. Buffer-only: not dispatched to onDiagnostic handlers, which would duplicate the event stream they already receive.";
421
+ };
422
+ readonly "DA-BREAK-CONTENT-MASK": {
423
+ readonly category: "break";
424
+ readonly level: "warn";
425
+ readonly summary: "The host's content surface cannot follow view transforms (punch-through SurfaceView, e.g. react-native-video's default), so the two-box format masks the backdrop with a transparent hole over the content box instead of reframing the content view. context: format.";
426
+ };
427
+ readonly "DA-BREAK-FORMAT-DEGRADED": {
428
+ readonly category: "break";
429
+ readonly level: "warn";
430
+ readonly summary: "Split break reframing degraded: the host supplied no content view or sibling container for the ad.";
431
+ };
432
+ readonly "DA-BREAK-NO-PLAYABLE-ASSET": {
433
+ readonly category: "break";
434
+ readonly level: "warn";
435
+ readonly summary: "A break had nothing to play, so it never began: no adbreakbegin/adbreakend was emitted, content kept playing, and a public aderror (source ad, carrying the break) reports it. context.reason says why: no-variant (none declared), no-qualifying-variant (variant selection - device targeting + format playability - matched nothing and no downgrade applied), no-assets (the selected variant was empty), or lshape-content-skipped (shared-element insertion cannot render a backdrop). This is the BREAK-level outcome; when a particular variant was passed over for an unrecognised format, DA-BREAK-VARIANT-FORMAT-UNKNOWN names that format alongside it. context: breakId, reason, declaredAssetCount, format.";
436
+ };
437
+ readonly "DA-BREAK-VARIANT-FORMAT-UNKNOWN": {
438
+ readonly category: "break";
439
+ readonly level: "warn";
440
+ readonly summary: "A break variant declares a format this SDK version does not recognise, so it was passed over during variant selection rather than guessed at - an unknown format is never playable, because rendering it as a fullscreen single would be the most invasive possible misreading. Raised once per skipped variant: a break that still has a playable variant plays it and reports this too, so the skip is never silent, and a break left with nothing also reports DA-BREAK-NO-PLAYABLE-ASSET with reason no-qualifying-variant. An ABSENT format is treated identically to an unrecognised one. context: breakId, format (the raw manifest string; empty when the field was absent).";
441
+ };
442
+ readonly "DA-AD-STALLED": {
443
+ readonly category: "playback";
444
+ readonly level: "warn";
445
+ readonly summary: "An ad began playing and then stopped advancing: the playhead did not move for the stall threshold while the ad was meant to be playing. context: assetId, breakId, playbackState, stalledForMs, positionMs, bufferedAheadMs, reason.";
446
+ };
447
+ readonly "DA-AD-FOREGROUND-RESUMED": {
448
+ readonly category: "playback";
449
+ readonly level: "info";
450
+ readonly summary: "An in-flight ad resumed after the app returned to the foreground; context carries the suspended duration and ad position at resume.";
451
+ };
452
+ readonly "DA-AD-FOCUS-LOST": {
453
+ readonly category: "playback";
454
+ readonly level: "warn";
455
+ readonly summary: "The overlay ad lost permanent audio focus during an active break; the host player must not reclaim focus while the SDK ad is on screen. context: breakId, transient, reason.";
456
+ };
457
+ readonly "DA-AD-FOCUS-GRANTED": {
458
+ readonly category: "playback";
459
+ readonly level: "info";
460
+ readonly summary: "The overlay ad was granted media audio focus for the break, so system focus semantics (call, duck, permanent loss) apply to ad playback. context: breakId, cause, alreadyHeld.";
461
+ };
462
+ readonly "DA-AD-FOCUS-DENIED": {
463
+ readonly category: "playback";
464
+ readonly level: "warn";
465
+ readonly summary: "The platform refused the overlay ad's media audio-focus request, so the break plays with no focus of its own: another app's audio can mix over the ad, and a call can neither duck nor pause it. context: breakId, cause.";
466
+ };
467
+ readonly "DA-AD-FOCUS-ABANDONED": {
468
+ readonly category: "playback";
469
+ readonly level: "info";
470
+ readonly summary: "The overlay ad gave media audio focus back, so the content player's own focus request finds a clean stack. context: breakId, cause.";
471
+ };
472
+ readonly "DA-BREAK-ABANDONED": {
473
+ readonly category: "lifecycle";
474
+ readonly level: "warn";
475
+ readonly summary: "A break was still in flight when the session was torn down (endSession, destroy, or a startSession over an active session). context: breakId, cause, phase, unbalancedAdBegin, adIndex, totalAds, assetId.";
476
+ };
477
+ readonly "DA-RENDERER-UNAVAILABLE": {
478
+ readonly category: "lifecycle";
479
+ readonly level: "error";
480
+ readonly summary: "The renderer could not render a break because a required piece of it was not attached (e.g. no ad player), after the SDK had already emitted adbreakbegin — so the break began and will never end. context: breakId, missing.";
481
+ };
482
+ readonly "DA-SESSION-STARTING": {
483
+ readonly category: "session";
484
+ readonly level: "info";
485
+ readonly summary: "A step of startSession() was entered: begin, manifest-fetch, gam-init or scheduling. Emitted on entry, so the last one recorded names the step a hung startSession never finished. context: step, manifestUrl, elapsedMs. The URL is reported verbatim; the redacted config summary carries only its origin (config.manifestOrigin).";
486
+ };
487
+ };
@@ -0,0 +1 @@
1
+ export const DIAGNOSTIC_CODES={"DA-SESSION-STARTED":{category:"session",level:"info",summary:"Monetization session started; manifest polling began. context: manifestUrl (stitcherUrl in SSAI mode), reported verbatim."},"DA-SESSION-ENDED":{category:"session",level:"info",summary:"Monetization session ended; polling and scheduling stopped."},"DA-ASSET-PARAMETERS-UPDATED":{category:"session",level:"info",summary:"The break manifest's session-level asset parameters changed; the merged parameters were pushed to the active GAM stream. context: source ('manifest'), keys (parameter names only, never values)."},"DA-MANIFEST-FETCH-FAILED":{category:"manifest",level:"error",summary:"Initial break-manifest fetch failed; the session could not start."},"DA-MANIFEST-POLL-FAILED":{category:"manifest",level:"warn",summary:"A manifest poll failed; the SDK keeps the last good manifest and retries."},"DA-MANIFEST-CHANNEL-CHANGED":{category:"manifest",level:"info",summary:"A polled manifest describes a different ads channel (channelId, GAM identity or timebase changed); the SDK re-aligned its ad setup and resolved delivery mode again while the session and content playback continued. context: previousChannelId, channelId, reason, manifestUrl."},"DA-MANIFEST-INTERCEPT-FAILED":{category:"manifest",level:"warn",summary:"The customer manifest-response interceptor threw; the un-modified parsed manifest was used instead."},"DA-MANIFEST-REQUEST-INTERCEPT-FAILED":{category:"manifest",level:"warn",summary:"The customer manifest-request interceptor threw; the normal network fetch of the original URL was used instead."},"DA-MANIFEST-SIGNATURE-INVALID":{category:"manifest",level:"error",summary:"The break-manifest response failed detached-JWS signature verification (missing/malformed X-Manifest-Signature, unsupported alg, unknown kid, unknown critical param, or signature mismatch); the manifest was rejected and no breaks were scheduled. context: url, reason."},"DA-PDT-MISSING":{category:"playback",level:"warn",summary:"No EXT-X-PROGRAM-DATE-TIME once content is playing (or after the startup backstop window); wallclock-timebase breaks fall back to the system clock."},"DA-ANVATO-CUE-PENDING":{category:"break",level:"info",summary:"ptsSource: 'anvatoCue' — no Anvato in-stream cue observed yet for a PTS break; the break stays pending until its cue arrives."},"DA-ANVATO-CUE-MATCHED":{category:"break",level:"info",summary:"ptsSource: 'anvatoCue' — a PTS break's start was matched to an observed Anvato cue and scheduled at the cue's media time."},"DA-ANVATO-CUE-ENTERED":{category:"break",level:"info",summary:"ptsSource: 'anvatoCue' — a break was started by the cue reaching the playhead rather than by the scheduler's 250ms tick; context carries the breakId, the cue pts and the media time it fired at, so the two start paths are distinguishable in the field."},"DA-ANVATO-CUE-OBSERVED":{category:"break",level:"info",summary:"ptsSource: 'anvatoCue' — an Anvato break-signaling (type=cue) frame was observed in the stream; context carries the cue's pts, the media time it landed at, whether the tracker recorded it, and the raw payload — so a manifest-PTS vs in-stream-PTS misalignment is observable in the field."},"DA-PRELOAD-FAILED":{category:"preload",level:"warn",summary:"Ad preload failed; the asset will be loaded on demand at break start."},"DA-PRELOAD-MODE-RESOLVED":{category:"preload",level:"info",summary:"The configured ad preload mode was resolved for this session; context carries both the configured and the resolved mode."},"DA-PRELOAD-PATH":{category:"preload",level:"info",summary:"The preload path actually taken for a break's ad (parallel buffer / detached prefetch / none) and the creative container (stream vs progressive)."},"DA-BREAK-EARLY-RETURN":{category:"break",level:"info",summary:"The active break was removed from a polled manifest (early return); the break ends immediately and content resumes at break start plus the seconds already played."},"DA-BREAK-WINDOW-ESCAPED":{category:"break",level:"warn",summary:"An active wallclock break outlived its window on the stream clock (ad stall, bogus trigger position, or a re-fired completed break); the SDK ended it and returned to content. context.overrunSec says by how much."},"DA-BREAK-EVENT-UNSUPPORTED":{category:"break",level:"warn",summary:"A break is triggered by a spec event this SDK version does not schedule on this platform (web schedules `start`, `pause` and `end`; Android and iOS do not schedule `end` yet); the break was ignored. context.event names the event."},"DA-BREAK-SUPPRESSED-OVERLAP":{category:"break",level:"warn",summary:"A break was suppressed because an ad was already playing."},"DA-BREAK-TRANSITION":{category:"break",level:"info",summary:"Measured duration of a playback transition into an ad break, between two ads, between chained breaks, or back to content."},"DA-AD-SURFACE-REVEALED":{category:"break",level:"info",summary:"The ad surface became visible: how long it was held back waiting for the ad's first frame, and whether it was revealed because that frame arrived or because the wait timed out."},"DA-PREROLL-CONTENT-HELD":{category:"break",level:"info",summary:"Content playback was held at session start until a pending pre-roll began, so no content is shown before the ad."},"DA-SHARED-ELEMENT-UNSUPPORTED":{category:"break",level:"warn",summary:"Configured shared-element insertion is unsupported on this platform (non-iPhone/iPod); fell back to overlay insertion."},"DA-SHARED-ELEMENT-RESTORE-FAILED":{category:"playback",level:"error",summary:"Content did not resume after a shared-element break: the reload/seek/play restore failed twice; the viewer is left paused on the handed-back element."},"DA-IMAGE-LOAD-FAILED":{category:"break",level:"warn",summary:"An image (companion, backdrop or image ad) could not be fetched or decoded within the timeout; the break continues without it."},"DA-PIP-TRANSFER-FAILED":{category:"break",level:"warn",summary:"The picture-in-picture window could not be moved between the content and ad elements; the break continues but the viewer may not see the ad in the PiP window."},"DA-PIP-AUTODETECT-UNAVAILABLE":{category:"break",level:"warn",summary:"No Activity could be resolved from the renderer's Context or the overlay's view tree, so picture-in-picture cannot be detected automatically; the host must call OptiViewAds.setPictureInPicture() from Activity.onPictureInPictureModeChanged or breaks will be laid out for a fullscreen surface. Android only."},"DA-CONTENT-ELEMENT-SWAPPED":{category:"break",level:"info",summary:"The content player replaced its <video> element; the SDK re-bound its presentation listeners to the new one."},"DA-PIP-FORMAT-OVERRIDE":{category:"break",level:"info",summary:"The content player is in picture-in-picture, so the break's declared format was overruled and it plays as a single fullscreen ad."},"DA-CHAIN-RESOLVER-ERROR":{category:"chaining",level:"warn",summary:"The chained-successor resolver threw; chaining was skipped for this break."},"DA-GAM-NO-ASSET-KEY":{category:"gam",level:"warn",summary:"Retired: the GAM stream identity now comes from the manifest's vendorConfiguration. Kept declared so the code is never reused; see DA-GAM-CONFIG-MISSING."},"DA-GAM-SESSION-FAILED":{category:"gam",level:"error",summary:"The GAM/IMA session failed to initialize; GAM breaks will not serve."},"DA-GAM-CONFIG-RESOLVED":{category:"gam",level:"info",summary:"The GAM stream identity for this session was resolved from the manifest's vendorConfiguration."},"DA-GAM-CONFIG-MISSING":{category:"gam",level:"error",summary:'The break manifest carries no usable "gam" vendorConfiguration entry; GAM assets are skipped.'},"DA-GAM-POD-IDENTITY-MISMATCH":{category:"gam",level:"error",summary:"A GAM pod asset's vendorParameters name a different network code or custom asset key than the stream session was created with; the asset is skipped because the pod request cannot serve."},"DA-VENDOR-CONFIG-UNKNOWN-TYPE":{category:"manifest",level:"info",summary:"One or more vendorConfiguration entries declare a type this SDK version does not recognise and were ignored."},"DA-CONTENT-PLAYBACK-ERROR":{category:"playback",level:"error",summary:"The content player reported a playback error."},"DA-CONTENT-RESUME-STALLED":{category:"playback",level:"warn",summary:"Content did not resume within the watchdog window after a break that paused it ended; the SDK re-issued play() once. iOS only for now."},"DA-AD-PLAYBACK-ERROR":{category:"playback",level:"error",summary:"The ad player reported a playback error during a break."},"DA-AD-START-INTERRUPTED":{category:"playback",level:"warn",summary:"The ad element's play() was interrupted by a browser-initiated pause before the ad started (Chromium AbortError, seen on Samsung Tizen); the SDK re-issued play() once. context: breakId, error."},"DA-DELIVERY-MODE-RESOLVED":{category:"session",level:"info",summary:"Delivery mode (sgai/ssai) resolved for the session at start and again on an ads-channel switch from the manifest's delivery rules (or the explicit client config)."},"DA-DELIVERY-MODE-UNKNOWN":{category:"session",level:"warn",summary:"The matching delivery rule carried an unrecognized mode value; sgai is used (forward compatibility)."},"DA-DELIVERY-MODE-OVERRIDDEN":{category:"session",level:"info",summary:"The manifest's delivery rules resolved a different mode, but the explicit client config takes precedence."},"DA-DELIVERY-MODE-CHANGE-IGNORED":{category:"session",level:"warn",summary:"An ordinary manifest poll resolves a different delivery mode; the mode pinned for the session stays in force. An ads-channel switch resolves the mode again."},"DA-SSAI-UNAVAILABLE":{category:"session",level:"error",summary:"The manifest selected ssai delivery but no vendor configuration can provide a stitched stream (no gam entry with an assetKey); at start the session fails, while on a channel switch the session stays in sgai."},"DA-SSAI-SESSION-FAILED":{category:"session",level:"error",summary:"The SSAI session failed to start (IMA stream init, stream id, or stitched-stream load)."},"DA-SSAI-IMA-ERROR":{category:"gam",level:"error",summary:"IMA reported an error during the SSAI stream session."},"DA-INSERTION-TYPE-RESOLVED":{category:"session",level:"info",summary:"Per-session ad insertion type resolved, and whether the integrator set it or left it unset (unset lets the manifest's resumeOffset drive the resume point)."},"DA-RESUME-OFFSET-CLAMPED":{category:"break",level:"info",summary:"The resume offset was shortened to the ad duration actually played, so the break could not skip further than the ads it delivered."},"DA-INSERTION-TYPE-IGNORED-SSAI":{category:"session",level:"warn",summary:"adInsertionType is ignored in SSAI mode; the stitcher controls ad insertion server-side."},"DA-VAST-UNSUPPORTED-FORMAT":{category:"break",level:"warn",summary:"A VAST asset appeared in an unsupported break format; VAST is only supported in single, double, and lshape_ad. The break was skipped."},"DA-ASSET-MACRO-UNKNOWN":{category:"break",level:"warn",summary:"An asset parameter value contained a macro the SDK has no value for (an unknown or unavailable OptiView macro, or a registered customer macro that returned no value); the parameter was still sent, with the macro kept as its literal token. Raised once per parameter key and macro. context: key, macro, breakId, assetId."},"DA-VAST-SSAI-UNSUPPORTED":{category:"session",level:"warn",summary:"VAST assets are not supported in SSAI mode (VAST is SGAI-only); the asset was skipped."},"DA-VAST-IMA-ERROR":{category:"gam",level:"error",summary:"Google IMA reported an error while loading or playing a VAST (client-side / CSAI) ad."},"DA-VAST-IMA-SDK-MISSING":{category:"gam",level:"error",summary:"The Google IMA client-side SDK (ima3.js) is unavailable; VAST (CSAI) ads cannot be played."},"DA-PAUSE-AD-SHOWN":{category:"break",level:"info",summary:"A pause ad (full-screen image or video) was shown while content is paused."},"DA-PAUSE-AD-DISMISSED":{category:"break",level:"info",summary:"A pause ad was dismissed (content resumed, or the duration cap elapsed)."},"DA-PAUSE-AD-RESUME-ALLOWED":{category:"break",level:"info",summary:"The viewer may now resume content over the shown pause ad: the break's controls.skipOffset elapsed, or (no skipOffset) the ad was watched fully: a video creative ended, an image reached its duration cap or has none. context: breakId."},"DA-PAUSE-AD-RESUME-BLOCKED":{category:"break",level:"info",summary:"Content tried to resume while a pause ad must still be watched (controls.skipOffset not reached, or no skipOffset and the video creative has not ended / the image duration cap has not elapsed); the SDK keeps content paused. context: breakId, elapsedSec, skipOffset."},"DA-PAUSE-AD-DVR-EXPIRED":{category:"break",level:"info",summary:"The viewer paused for longer than the DVR window is deep, so the position they paused at aged out and playback resumed at the live edge instead. context: pinnedPosition, liveEdge."},"DA-PAUSE-AD-NO-ASSET":{category:"break",level:"warn",summary:"A pause break had no usable image or video asset (no first asset, unsupported media type, or no resolvable VAST creative); the pause ad was skipped."},"DA-PAUSE-AD-SSAI-UNSUPPORTED":{category:"session",level:"warn",summary:"Pause ads are SGAI-only and not supported in SSAI mode; the pause break was skipped."},"DA-MANIFEST-POLLED":{category:"manifest",level:"info",summary:"A manifest poll refresh succeeded (cadence follows the manifest polling config)."},"DA-AD-SKIPPED":{category:"playback",level:"info",summary:"The viewer skipped the active ad break (controls.skipOffset honored)."},"DA-AD-SKIP-SUPPRESSED":{category:"playback",level:"info",summary:"A skip request was suppressed (no skipOffset declared, or requested before the offset)."},"DA-AD-CLICKED":{category:"playback",level:"info",summary:"The viewer clicked the ad on screen (adclick emitted)."},"DA-RESUME-SEEK":{category:"playback",level:"info",summary:"Content was resume-seeked to the resolved post-break position (insertion type policy)."},"DA-RESUME-LANDED":{category:"playback",level:"info",summary:"Where the post-break resume-seek actually landed, measured on the seeked event rather than inferred: context carries breakId, target (the position requested), landed and errorSec (landed - target; negative means the player settled EARLIER than asked). landed is null with a reason when no seeked event arrived, which is normal for a seek to the position the playhead already holds. Report-only: the SDK does not correct the position."},"DA-RESUME-PREPOSITIONED":{category:"playback",level:"info",summary:"The break resumed without a seek: content was moved onto its resume position DURING the break, so the transition needed no jump. Context carries breakId, target, prepositionedTo, landed, shortfallSec and exact. exact=true means it reached the policy target. exact=false means the live window never published those frames, so content was moved as close as exists — the viewer lands short, but arrives already in place rather than via a visible seek at the cut."},"DA-RESUME-CATCHUP":{category:"playback",level:"info",summary:"Content began playing behind the ad to reach its resume point. Context carries breakId, startPos, target, remainingAdSec, publishedEnd and clampedStart — clampedStart true means the stream had not published the ideal start position, so playback began late and the alignment loop must make up the difference (the zero-live-headroom case). Its ABSENCE on a live break that resumed short means catch-up never ran at all, which is a different fault from it running and falling short."},"DA-RESUME-TARGET-CLAMPED":{category:"playback",level:"warn",summary:"The computed resume position sat inside the engine's minimum live offset and was clamped to the closest position the engine will hold; context carries breakId, requested, clamped and shortfallSec. Distinct from DA-RESUME-OFFSET-CLAMPED, which shortens the OFFSET to the ad seconds actually played."},"DA-RESUME-ALIGN-BLOCKED":{category:"playback",level:"warn",summary:"Resume alignment wanted to move content past the live edge and stood down, because no seek can reach media the stream has not published yet; content is left riding the edge and the break-end clamp places it. Context carries target, requested, safeEnd, shortfallSec and remainingSec. Emitted once per break. A persistent shortfall here means the resume target is further ahead than the feed's published edge — typically the player's view of the edge is stale, not that the seek is wrong."},"DA-CONTINUE-PLAYOUT-BEGIN":{category:"playback",level:"info",summary:"continueContentDuringBreak engaged: content keeps PLAYING through the break, hidden and muted, so no resume seek is needed. Context carries breakId, anchor, breakDurationSec and edgeDistanceSec."},"DA-CONTINUE-PLAYOUT-END":{category:"playback",level:"info",summary:"continueContentDuringBreak reached the cut. Context carries driftSec (content position minus where the break says it should be), maxDriftSec, the corrections applied, rateHonoured (false if the engine drove playbackRate itself) and driftUnrecoverable."},"DA-CONTINUE-PLAYOUT-REFUSED":{category:"playback",level:"info",summary:"continueContentDuringBreak was not used this session, so breaks pause content and resume with a seek as before. Emitted once per session; context carries the reason (disabled, not-replacement, format, shared-element, picture-in-picture, single-decoder) and the break format. Its ABSENCE on an eligible session is the signal the mode engaged."},"DA-CONTINUE-PLAYOUT-QUALITY-UNAVAILABLE":{category:"playback",level:"warn",summary:"Content continues through the replacement break without a video-quality constraint, so the content stream may retain its normal bitrate alongside the ad. Context carries breakId and reason (unsupported when the optional Web adapter method is absent, not-applied when the adapter returned false or could not apply the request)."},"DA-CONTINUE-PLAYOUT-DRIFT":{category:"playback",level:"warn",summary:"Content drifted further from the break timeline than the remaining break can remove within the playback-rate bounds, so part of it is carried into the cut. Context carries driftSec, remainingSec, the rate applied and seekIssued (always false: a corrective seek would be clipped)."},"DA-CONTINUE-PLAYOUT-ABANDONED":{category:"playback",level:"warn",summary:"Content could not be kept playing through the break, so it reverted to the pause-and-resume path mid-break. Context carries breakId, the reason and the driftSec at the moment it converted."},"DA-AD-AV-DESYNC":{category:"playback",level:"warn",summary:"The ad player's audio sink was handed a buffer whose timestamp does not continue the audio it has already been fed, so the media clock had to be re-anchored mid-ad. Video is scheduled off that clock while the audio already queued in the output track keeps draining, so every re-anchor pushes the picture further from the sound actually being heard. Context carries breakId, assetId, expectedSec, actualSec, deltaSec (negative = audio running behind the picture) and positionSec. Seen on server-stitched pods whose per-ad audio and video durations do not match; a single event near the end of a pod is the accumulated total, not an isolated glitch."},"DA-AD-PLAYOUT-SYNC":{category:"playback",level:"info",summary:"Per-break summary of ad playout health, emitted once at break end. Context carries podUri (the resolved ad media, so a stitched pod can be fetched and inspected), desyncEvents, maxDesyncSec, droppedFrames, audioUnderruns, audioFormats and videoFormats (the distinct decoder input formats seen during the break — more than one means the stitched stream changed sample rate or codec mid-pod) and frameOffsetMeanMs (mean video frame processing offset; large negative values mean frames were released late against the audio clock)."},"DA-EVENT":{category:"event",level:"info",summary:"An SDK event, recorded into the diagnostic ring buffer so exportDiagnostics() carries one unified timeline of diagnostics and playback events. Raised to error for aderror. Buffer-only: not dispatched to onDiagnostic handlers, which would duplicate the event stream they already receive."},"DA-BREAK-CONTENT-MASK":{category:"break",level:"warn",summary:"The host's content surface cannot follow view transforms (punch-through SurfaceView, e.g. react-native-video's default), so the two-box format masks the backdrop with a transparent hole over the content box instead of reframing the content view. context: format."},"DA-BREAK-FORMAT-DEGRADED":{category:"break",level:"warn",summary:"Split break reframing degraded: the host supplied no content view or sibling container for the ad."},"DA-BREAK-NO-PLAYABLE-ASSET":{category:"break",level:"warn",summary:"A break had nothing to play, so it never began: no adbreakbegin/adbreakend was emitted, content kept playing, and a public aderror (source ad, carrying the break) reports it. context.reason says why: no-variant (none declared), no-qualifying-variant (variant selection - device targeting + format playability - matched nothing and no downgrade applied), no-assets (the selected variant was empty), or lshape-content-skipped (shared-element insertion cannot render a backdrop). This is the BREAK-level outcome; when a particular variant was passed over for an unrecognised format, DA-BREAK-VARIANT-FORMAT-UNKNOWN names that format alongside it. context: breakId, reason, declaredAssetCount, format."},"DA-BREAK-VARIANT-FORMAT-UNKNOWN":{category:"break",level:"warn",summary:"A break variant declares a format this SDK version does not recognise, so it was passed over during variant selection rather than guessed at - an unknown format is never playable, because rendering it as a fullscreen single would be the most invasive possible misreading. Raised once per skipped variant: a break that still has a playable variant plays it and reports this too, so the skip is never silent, and a break left with nothing also reports DA-BREAK-NO-PLAYABLE-ASSET with reason no-qualifying-variant. An ABSENT format is treated identically to an unrecognised one. context: breakId, format (the raw manifest string; empty when the field was absent)."},"DA-AD-STALLED":{category:"playback",level:"warn",summary:"An ad began playing and then stopped advancing: the playhead did not move for the stall threshold while the ad was meant to be playing. context: assetId, breakId, playbackState, stalledForMs, positionMs, bufferedAheadMs, reason."},"DA-AD-FOREGROUND-RESUMED":{category:"playback",level:"info",summary:"An in-flight ad resumed after the app returned to the foreground; context carries the suspended duration and ad position at resume."},"DA-AD-FOCUS-LOST":{category:"playback",level:"warn",summary:"The overlay ad lost permanent audio focus during an active break; the host player must not reclaim focus while the SDK ad is on screen. context: breakId, transient, reason."},"DA-AD-FOCUS-GRANTED":{category:"playback",level:"info",summary:"The overlay ad was granted media audio focus for the break, so system focus semantics (call, duck, permanent loss) apply to ad playback. context: breakId, cause, alreadyHeld."},"DA-AD-FOCUS-DENIED":{category:"playback",level:"warn",summary:"The platform refused the overlay ad's media audio-focus request, so the break plays with no focus of its own: another app's audio can mix over the ad, and a call can neither duck nor pause it. context: breakId, cause."},"DA-AD-FOCUS-ABANDONED":{category:"playback",level:"info",summary:"The overlay ad gave media audio focus back, so the content player's own focus request finds a clean stack. context: breakId, cause."},"DA-BREAK-ABANDONED":{category:"lifecycle",level:"warn",summary:"A break was still in flight when the session was torn down (endSession, destroy, or a startSession over an active session). context: breakId, cause, phase, unbalancedAdBegin, adIndex, totalAds, assetId."},"DA-RENDERER-UNAVAILABLE":{category:"lifecycle",level:"error",summary:"The renderer could not render a break because a required piece of it was not attached (e.g. no ad player), after the SDK had already emitted adbreakbegin — so the break began and will never end. context: breakId, missing."},"DA-SESSION-STARTING":{category:"session",level:"info",summary:"A step of startSession() was entered: begin, manifest-fetch, gam-init or scheduling. Emitted on entry, so the last one recorded names the step a hung startSession never finished. context: step, manifestUrl, elapsedMs. The URL is reported verbatim; the redacted config summary carries only its origin (config.manifestOrigin)."}};
@@ -0,0 +1,5 @@
1
+ /**
2
+ * SDK version embedded in diagnostic reports.
3
+ * Stamped from the monorepo lockstep version (lerna.json) by the taxonomy generator.
4
+ */
5
+ export declare const SDK_VERSION = "1.0.0-beta.1";
@@ -0,0 +1 @@
1
+ export const SDK_VERSION="1.0.0-beta.1";
@@ -0,0 +1,25 @@
1
+ export declare const latin1Bytes: (text: string) => number[];
2
+ export declare const utf8Bytes: (text: string) => number[];
3
+ /** UTF-16LE code units, optionally prefixed with the FF FE BOM. */
4
+ export declare const utf16leBytes: (text: string, withBom?: boolean) => number[];
5
+ /** UTF-16BE code units, optionally prefixed with the FE FF BOM. */
6
+ export declare const utf16beBytes: (text: string, withBom?: boolean) => number[];
7
+ export declare const syncsafe: (value: number) => number[];
8
+ export declare const uint32: (value: number) => number[];
9
+ /**
10
+ * GEOB frame body: encoding byte, MIME (latin1 + NUL), file name and content
11
+ * description (NUL-terminated in the frame encoding — double NUL for the
12
+ * UTF-16 encodings), then the object data.
13
+ */
14
+ export declare const buildGeobBody: (encoding: number, mime: number[], fileName: number[], description: number[], data: number[]) => number[];
15
+ /** Frame header: 4-byte id, 4-byte size (syncsafe in v2.4, plain in v2.3), 2 flag bytes. */
16
+ export declare const buildFrame: (id: string, body: number[], version: 3 | 4) => number[];
17
+ /** Tag header ("ID3" + ver + flags + syncsafe size) followed by the given content. */
18
+ export declare const buildTag: (version: 3 | 4, frames: number[], options?: {
19
+ flags?: number;
20
+ padding?: number;
21
+ extendedHeader?: number[];
22
+ }) => Uint8Array;
23
+ export declare const ANVATO_PAYLOAD = "type=cue&pts=1234.567";
24
+ /** A complete Anvato-shaped tag: one GEOB frame, latin1 texts, UTF-8 payload. */
25
+ export declare const buildAnvatoGeobTag: (version?: 3 | 4, payload?: string) => Uint8Array;
@@ -0,0 +1 @@
1
+ export const latin1Bytes=t=>Array.from(t,t=>t.charCodeAt(0));export const utf8Bytes=t=>Array.from((new TextEncoder).encode(t));export const utf16leBytes=(t,e=!0)=>{const n=e?[255,254]:[];for(let e=0;e<t.length;e++){const o=t.charCodeAt(e);n.push(255&o,o>>8&255)}return n};export const utf16beBytes=(t,e=!1)=>{const n=e?[254,255]:[];for(let e=0;e<t.length;e++){const o=t.charCodeAt(e);n.push(o>>8&255,255&o)}return n};export const syncsafe=t=>[t>>21&127,t>>14&127,t>>7&127,127&t];export const uint32=t=>[t>>>24&255,t>>>16&255,t>>>8&255,255&t];export const buildGeobBody=(t,e,n,o,r)=>{const s=1===t||2===t?[0,0]:[0];return[t,...e,0,...n,...s,...o,...s,...r]};export const buildFrame=(t,e,n)=>{return[...latin1Bytes(t),...4===n?syncsafe(e.length):(o=e.length,[o>>>24&255,o>>>16&255,o>>>8&255,255&o]),0,0,...e];var o};export const buildTag=(t,e,n)=>{const o=n?.extendedHeader??[],r=new Array(n?.padding??0).fill(0),s=o.length+e.length+r.length;return new Uint8Array([73,68,51,t,0,n?.flags??0,...syncsafe(s),...o,...e,...r])};export const ANVATO_PAYLOAD="type=cue&pts=1234.567";export const buildAnvatoGeobTag=(t=3,e=ANVATO_PAYLOAD)=>{return buildTag(t,buildFrame("GEOB",buildGeobBody(0,latin1Bytes("application/json"),latin1Bytes("anvatos.json"),latin1Bytes("Anvatos"),(n=e,Array.from((new TextEncoder).encode(n)))),t));var n};
@@ -0,0 +1,3 @@
1
+ export { parseId3GeobFrames, parseId3GeobBody, decodeUtf8 } from './parseId3Geob';
2
+ export type { Id3GeobFrame } from './parseId3Geob';
3
+ export { ANVATO_PAYLOAD, buildAnvatoGeobTag, buildFrame, buildGeobBody, buildTag, latin1Bytes, syncsafe, uint32, utf16beBytes, utf16leBytes, utf8Bytes, } from './buildId3';
@@ -0,0 +1 @@
1
+ export{parseId3GeobFrames,parseId3GeobBody,decodeUtf8}from"./parseId3Geob";export{ANVATO_PAYLOAD,buildAnvatoGeobTag,buildFrame,buildGeobBody,buildTag,latin1Bytes,syncsafe,uint32,utf16beBytes,utf16leBytes,utf8Bytes}from"./buildId3";
@@ -0,0 +1,28 @@
1
+ /**
2
+ * Minimal ID3v2 GEOB parser for Anvato in-stream break signaling (`ptsSource: 'anvatoCue'`), which matches
3
+ * on description `Anvatos`, MIME `application/json` and data `type=cue&pts=…`. Two entry points:
4
+ * {@link parseId3GeobFrames} for a complete raw ID3v2 tag (HLS.js `FRAG_PARSING_METADATA`) and
5
+ * {@link parseId3GeobBody} for one frame body (Shaka's `shaka.util.Id3Utils` has no GEOB decoder
6
+ * and passes the body through undecoded). Lives in core because both adapters consume it and an
7
+ * adapter must never depend on another adapter; exposed as `@dolby-optiview/ads-sdk-core/id3`.
8
+ */
9
+ /** A single parsed ID3v2 GEOB frame. */
10
+ export interface Id3GeobFrame {
11
+ /** GEOB MIME type (always latin1 in the tag), e.g. `application/json`. */
12
+ mimeType: string;
13
+ /** GEOB file name, decoded in the frame's text encoding. */
14
+ fileName: string;
15
+ /** GEOB content description (e.g. `Anvatos`), in the frame's text encoding. */
16
+ description: string;
17
+ /** The encapsulated object bytes (undecoded). */
18
+ data: Uint8Array;
19
+ }
20
+ /** Empty array for anything that is not a well-formed ID3v2.3/2.4 tag; never throws. */
21
+ export declare function parseId3GeobFrames(bytes: Uint8Array): Id3GeobFrame[];
22
+ /**
23
+ * GEOB frame body (after the 10-byte frame header): encoding byte, MIME (latin1, NUL), file name
24
+ * (NUL, frame encoding), description (NUL, frame encoding), object data. Null when malformed; never throws.
25
+ */
26
+ export declare function parseId3GeobBody(body: Uint8Array): Id3GeobFrame | null;
27
+ /** Decode UTF-8 bytes (also used for the GEOB object data / Anvato payload). */
28
+ export declare function decodeUtf8(bytes: Uint8Array): string;