@snap/camera-kit 0.7.0

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 (554) hide show
  1. package/LICENSE.md +6247 -0
  2. package/README.md +166 -0
  3. package/docs/html/.nojekyll +1 -0
  4. package/docs/html/assets/highlight.css +106 -0
  5. package/docs/html/assets/main.js +54 -0
  6. package/docs/html/assets/search.js +1 -0
  7. package/docs/html/assets/style.css +1225 -0
  8. package/docs/html/assets/widgets.png +0 -0
  9. package/docs/html/assets/widgets@2x.png +0 -0
  10. package/docs/html/classes/CameraKit.html +121 -0
  11. package/docs/html/classes/CameraKitSession.html +347 -0
  12. package/docs/html/classes/CameraKitSource.html +152 -0
  13. package/docs/html/classes/LensPerformanceMeasurement.html +115 -0
  14. package/docs/html/classes/LensPerformanceMetrics.html +76 -0
  15. package/docs/html/classes/LensRepository.html +171 -0
  16. package/docs/html/classes/LensSources.html +82 -0
  17. package/docs/html/classes/Transform2D.html +99 -0
  18. package/docs/html/classes/TypedCustomEvent.html +109 -0
  19. package/docs/html/classes/TypedEventTarget.html +146 -0
  20. package/docs/html/functions/Injectable.html +193 -0
  21. package/docs/html/functions/bootstrapCameraKit.html +158 -0
  22. package/docs/html/functions/createExtension.html +127 -0
  23. package/docs/html/functions/createImageSource.html +123 -0
  24. package/docs/html/functions/createMediaStreamSource.html +123 -0
  25. package/docs/html/functions/createUserMediaSource.html +127 -0
  26. package/docs/html/functions/createVideoSource.html +124 -0
  27. package/docs/html/functions/estimateLensPerformance.html +116 -0
  28. package/docs/html/functions/getRequiredBootstrapURLs.html +124 -0
  29. package/docs/html/functions/lensSourcesFactory.html +116 -0
  30. package/docs/html/functions/uriHandlersFactory.html +118 -0
  31. package/docs/html/index.html +208 -0
  32. package/docs/html/interfaces/CameraKitBootstrapConfiguration.html +132 -0
  33. package/docs/html/interfaces/CameraKitSourceSubscriber.html +121 -0
  34. package/docs/html/interfaces/ComputedFrameMetrics.html +70 -0
  35. package/docs/html/interfaces/CreateSessionOptions.html +77 -0
  36. package/docs/html/interfaces/EstimatedLensPerformance.html +78 -0
  37. package/docs/html/interfaces/Lens.html +115 -0
  38. package/docs/html/interfaces/LensSource.html +113 -0
  39. package/docs/html/interfaces/MediaStreamSourceOptions.html +65 -0
  40. package/docs/html/interfaces/UriCancelRequest.html +65 -0
  41. package/docs/html/interfaces/UriHandler.html +128 -0
  42. package/docs/html/interfaces/UriRequest.html +80 -0
  43. package/docs/html/interfaces/UriResponse.html +80 -0
  44. package/docs/html/interfaces/VideoSourceOptions.html +60 -0
  45. package/docs/html/modules.html +198 -0
  46. package/docs/html/types/AssetLoader.html +126 -0
  47. package/docs/html/types/AssetTiming.html +116 -0
  48. package/docs/html/types/BenchmarkError.html +107 -0
  49. package/docs/html/types/BootstrapError.html +110 -0
  50. package/docs/html/types/CacheKeyNotFoundError.html +107 -0
  51. package/docs/html/types/CameraKitDeviceInfo.html +114 -0
  52. package/docs/html/types/CameraKitSessionEventListener.html +109 -0
  53. package/docs/html/types/CameraKitSessionEvents.html +118 -0
  54. package/docs/html/types/CameraKitSourceError.html +107 -0
  55. package/docs/html/types/CameraKitSourceInfo.html +107 -0
  56. package/docs/html/types/CameraKitSourceOptions.html +113 -0
  57. package/docs/html/types/ConfigurationError.html +109 -0
  58. package/docs/html/types/Keyboard.html +196 -0
  59. package/docs/html/types/KeyboardEvents.html +109 -0
  60. package/docs/html/types/LegalError.html +107 -0
  61. package/docs/html/types/LensAssetError.html +109 -0
  62. package/docs/html/types/LensContentValidationError.html +107 -0
  63. package/docs/html/types/LensError.html +107 -0
  64. package/docs/html/types/LensExecutionError.html +114 -0
  65. package/docs/html/types/LensImagePickerError.html +110 -0
  66. package/docs/html/types/LensLaunchParams.html +109 -0
  67. package/docs/html/types/LensMetricsEvents.html +110 -0
  68. package/docs/html/types/LensPerformanceCluster.html +107 -0
  69. package/docs/html/types/LensView.html +119 -0
  70. package/docs/html/types/LensWait.html +111 -0
  71. package/docs/html/types/PersistentStoreError.html +109 -0
  72. package/docs/html/types/PlatformNotSupportedError.html +110 -0
  73. package/docs/html/types/PublicContainer.html +110 -0
  74. package/docs/html/types/RenderTarget.html +111 -0
  75. package/docs/html/types/Uri.html +107 -0
  76. package/docs/html/types/UriHandlers.html +109 -0
  77. package/docs/html/types/WebGLError.html +107 -0
  78. package/docs/html/variables/extensionRequestContext.html +109 -0
  79. package/docs/md/.nojekyll +1 -0
  80. package/docs/md/README.md +168 -0
  81. package/docs/md/classes/CameraKit.md +94 -0
  82. package/docs/md/classes/CameraKitSession.md +359 -0
  83. package/docs/md/classes/CameraKitSource.md +110 -0
  84. package/docs/md/classes/LensPerformanceMeasurement.md +77 -0
  85. package/docs/md/classes/LensPerformanceMetrics.md +37 -0
  86. package/docs/md/classes/LensRepository.md +145 -0
  87. package/docs/md/classes/LensSources.md +29 -0
  88. package/docs/md/classes/Transform2D.md +55 -0
  89. package/docs/md/classes/TypedCustomEvent.md +65 -0
  90. package/docs/md/classes/TypedEventTarget.md +103 -0
  91. package/docs/md/interfaces/CameraKitBootstrapConfiguration.md +106 -0
  92. package/docs/md/interfaces/CameraKitSourceSubscriber.md +55 -0
  93. package/docs/md/interfaces/ComputedFrameMetrics.md +29 -0
  94. package/docs/md/interfaces/CreateSessionOptions.md +35 -0
  95. package/docs/md/interfaces/EstimatedLensPerformance.md +38 -0
  96. package/docs/md/interfaces/Lens.md +84 -0
  97. package/docs/md/interfaces/LensSource.md +68 -0
  98. package/docs/md/interfaces/MediaStreamSourceOptions.md +22 -0
  99. package/docs/md/interfaces/UriCancelRequest.md +22 -0
  100. package/docs/md/interfaces/UriHandler.md +63 -0
  101. package/docs/md/interfaces/UriRequest.md +43 -0
  102. package/docs/md/interfaces/UriResponse.md +43 -0
  103. package/docs/md/interfaces/VideoSourceOptions.md +15 -0
  104. package/docs/md/modules.md +827 -0
  105. package/lib/CameraKit.d.ts +170 -0
  106. package/lib/CameraKit.js +145 -0
  107. package/lib/CameraKit.js.map +1 -0
  108. package/lib/__tests__/data.d.ts +9 -0
  109. package/lib/__tests__/data.js +50 -0
  110. package/lib/__tests__/data.js.map +1 -0
  111. package/lib/__tests__/deferred.d.ts +16 -0
  112. package/lib/__tests__/deferred.js +29 -0
  113. package/lib/__tests__/deferred.js.map +1 -0
  114. package/lib/__tests__/jest.matchers.d.ts +17 -0
  115. package/lib/__tests__/jest.matchers.js +67 -0
  116. package/lib/__tests__/jest.matchers.js.map +1 -0
  117. package/lib/assertPlatformSupported.d.ts +4 -0
  118. package/lib/assertPlatformSupported.js +10 -0
  119. package/lib/assertPlatformSupported.js.map +1 -0
  120. package/lib/benchmark/benchmarkGflops.d.ts +16 -0
  121. package/lib/benchmark/benchmarkGflops.js +129 -0
  122. package/lib/benchmark/benchmarkGflops.js.map +1 -0
  123. package/lib/benchmark/estimateLensPerformanceCluster.d.ts +33 -0
  124. package/lib/benchmark/estimateLensPerformanceCluster.js +48 -0
  125. package/lib/benchmark/estimateLensPerformanceCluster.js.map +1 -0
  126. package/lib/benchmark/webglUtils.d.ts +7 -0
  127. package/lib/benchmark/webglUtils.js +87 -0
  128. package/lib/benchmark/webglUtils.js.map +1 -0
  129. package/lib/bootstrapCameraKit.d.ts +96 -0
  130. package/lib/bootstrapCameraKit.js +204 -0
  131. package/lib/bootstrapCameraKit.js.map +1 -0
  132. package/lib/common/__mocks__/loadScript.d.ts +1 -0
  133. package/lib/common/__mocks__/loadScript.js +10 -0
  134. package/lib/common/__mocks__/loadScript.js.map +1 -0
  135. package/lib/common/assertions.d.ts +27 -0
  136. package/lib/common/assertions.js +39 -0
  137. package/lib/common/assertions.js.map +1 -0
  138. package/lib/common/cameraKitUserAgent.d.ts +34 -0
  139. package/lib/common/cameraKitUserAgent.js +216 -0
  140. package/lib/common/cameraKitUserAgent.js.map +1 -0
  141. package/lib/common/copyDefinedProperties.d.ts +13 -0
  142. package/lib/common/copyDefinedProperties.js +16 -0
  143. package/lib/common/copyDefinedProperties.js.map +1 -0
  144. package/lib/common/entries.d.ts +3 -0
  145. package/lib/common/entries.js +3 -0
  146. package/lib/common/entries.js.map +1 -0
  147. package/lib/common/errorHelpers.d.ts +10 -0
  148. package/lib/common/errorHelpers.js +24 -0
  149. package/lib/common/errorHelpers.js.map +1 -0
  150. package/lib/common/getFilename.d.ts +1 -0
  151. package/lib/common/getFilename.js +4 -0
  152. package/lib/common/getFilename.js.map +1 -0
  153. package/lib/common/index.d.ts +2 -0
  154. package/lib/common/index.js +3 -0
  155. package/lib/common/index.js.map +1 -0
  156. package/lib/common/loadScript.d.ts +1 -0
  157. package/lib/common/loadScript.js +11 -0
  158. package/lib/common/loadScript.js.map +1 -0
  159. package/lib/common/locale.d.ts +2 -0
  160. package/lib/common/locale.js +11 -0
  161. package/lib/common/locale.js.map +1 -0
  162. package/lib/common/localization.d.ts +43 -0
  163. package/lib/common/localization.js +43 -0
  164. package/lib/common/localization.js.map +1 -0
  165. package/lib/common/memoize.d.ts +8 -0
  166. package/lib/common/memoize.js +15 -0
  167. package/lib/common/memoize.js.map +1 -0
  168. package/lib/common/pageVisibility.d.ts +20 -0
  169. package/lib/common/pageVisibility.js +62 -0
  170. package/lib/common/pageVisibility.js.map +1 -0
  171. package/lib/common/time.d.ts +1 -0
  172. package/lib/common/time.js +2 -0
  173. package/lib/common/time.js.map +1 -0
  174. package/lib/common/typeguards.d.ts +53 -0
  175. package/lib/common/typeguards.js +92 -0
  176. package/lib/common/typeguards.js.map +1 -0
  177. package/lib/common/types.d.ts +10 -0
  178. package/lib/common/types.js +2 -0
  179. package/lib/common/types.js.map +1 -0
  180. package/lib/common/validate.d.ts +14 -0
  181. package/lib/common/validate.js +104 -0
  182. package/lib/common/validate.js.map +1 -0
  183. package/lib/configuration.d.ts +92 -0
  184. package/lib/configuration.js +36 -0
  185. package/lib/configuration.js.map +1 -0
  186. package/lib/configurationOverrides.d.ts +12 -0
  187. package/lib/configurationOverrides.js +41 -0
  188. package/lib/configurationOverrides.js.map +1 -0
  189. package/lib/dependency-injection/Container.d.ts +177 -0
  190. package/lib/dependency-injection/Container.js +160 -0
  191. package/lib/dependency-injection/Container.js.map +1 -0
  192. package/lib/dependency-injection/Injectable.d.ts +39 -0
  193. package/lib/dependency-injection/Injectable.js +18 -0
  194. package/lib/dependency-injection/Injectable.js.map +1 -0
  195. package/lib/dependency-injection/PartialContainer.d.ts +81 -0
  196. package/lib/dependency-injection/PartialContainer.js +85 -0
  197. package/lib/dependency-injection/PartialContainer.js.map +1 -0
  198. package/lib/dependency-injection/RootServices.d.ts +62 -0
  199. package/lib/dependency-injection/RootServices.js +2 -0
  200. package/lib/dependency-injection/RootServices.js.map +1 -0
  201. package/lib/dependency-injection/types.d.ts +56 -0
  202. package/lib/dependency-injection/types.js +2 -0
  203. package/lib/dependency-injection/types.js.map +1 -0
  204. package/lib/environment.json +1 -0
  205. package/lib/events/TypedCustomEvent.d.ts +10 -0
  206. package/lib/events/TypedCustomEvent.js +11 -0
  207. package/lib/events/TypedCustomEvent.js.map +1 -0
  208. package/lib/events/TypedEventTarget.d.ts +25 -0
  209. package/lib/events/TypedEventTarget.js +57 -0
  210. package/lib/events/TypedEventTarget.js.map +1 -0
  211. package/lib/events/scan.d.ts +15 -0
  212. package/lib/events/scan.js +46 -0
  213. package/lib/events/scan.js.map +1 -0
  214. package/lib/extensions/LensSources.d.ts +58 -0
  215. package/lib/extensions/LensSources.js +50 -0
  216. package/lib/extensions/LensSources.js.map +1 -0
  217. package/lib/extensions/UriHandlers.d.ts +54 -0
  218. package/lib/extensions/UriHandlers.js +93 -0
  219. package/lib/extensions/UriHandlers.js.map +1 -0
  220. package/lib/extensions/extensionRequestContext.d.ts +4 -0
  221. package/lib/extensions/extensionRequestContext.js +14 -0
  222. package/lib/extensions/extensionRequestContext.js.map +1 -0
  223. package/lib/generated-proto/blizzard/cameraKitEvents.d.ts +5603 -0
  224. package/lib/generated-proto/blizzard/cameraKitEvents.js +522 -0
  225. package/lib/generated-proto/blizzard/cameraKitEvents.js.map +1 -0
  226. package/lib/generated-proto/pb_schema/camera_kit/v3/business_events.d.ts +98 -0
  227. package/lib/generated-proto/pb_schema/camera_kit/v3/business_events.js +260 -0
  228. package/lib/generated-proto/pb_schema/camera_kit/v3/business_events.js.map +1 -0
  229. package/lib/generated-proto/pb_schema/camera_kit/v3/export.d.ts +543 -0
  230. package/lib/generated-proto/pb_schema/camera_kit/v3/export.js +429 -0
  231. package/lib/generated-proto/pb_schema/camera_kit/v3/export.js.map +1 -0
  232. package/lib/generated-proto/pb_schema/camera_kit/v3/legal_prompt.d.ts +100 -0
  233. package/lib/generated-proto/pb_schema/camera_kit/v3/legal_prompt.js +164 -0
  234. package/lib/generated-proto/pb_schema/camera_kit/v3/legal_prompt.js.map +1 -0
  235. package/lib/generated-proto/pb_schema/camera_kit/v3/lens.d.ts +395 -0
  236. package/lib/generated-proto/pb_schema/camera_kit/v3/lens.js +644 -0
  237. package/lib/generated-proto/pb_schema/camera_kit/v3/lens.js.map +1 -0
  238. package/lib/generated-proto/pb_schema/camera_kit/v3/operational_metrics.d.ts +185 -0
  239. package/lib/generated-proto/pb_schema/camera_kit/v3/operational_metrics.js +172 -0
  240. package/lib/generated-proto/pb_schema/camera_kit/v3/operational_metrics.js.map +1 -0
  241. package/lib/generated-proto/pb_schema/camera_kit/v3/ranking.d.ts +86 -0
  242. package/lib/generated-proto/pb_schema/camera_kit/v3/ranking.js +234 -0
  243. package/lib/generated-proto/pb_schema/camera_kit/v3/ranking.js.map +1 -0
  244. package/lib/generated-proto/pb_schema/camera_kit/v3/service.d.ts +854 -0
  245. package/lib/generated-proto/pb_schema/camera_kit/v3/service.js +629 -0
  246. package/lib/generated-proto/pb_schema/camera_kit/v3/service.js.map +1 -0
  247. package/lib/generated-proto/pb_schema/cdp/cof/benchmark.d.ts +86 -0
  248. package/lib/generated-proto/pb_schema/cdp/cof/benchmark.js +185 -0
  249. package/lib/generated-proto/pb_schema/cdp/cof/benchmark.js.map +1 -0
  250. package/lib/generated-proto/pb_schema/cdp/cof/benchmark_name.d.ts +95 -0
  251. package/lib/generated-proto/pb_schema/cdp/cof/benchmark_name.js +104 -0
  252. package/lib/generated-proto/pb_schema/cdp/cof/benchmark_name.js.map +1 -0
  253. package/lib/generated-proto/pb_schema/cdp/cof/circumstance_service.d.ts +10212 -0
  254. package/lib/generated-proto/pb_schema/cdp/cof/circumstance_service.js +1300 -0
  255. package/lib/generated-proto/pb_schema/cdp/cof/circumstance_service.js.map +1 -0
  256. package/lib/generated-proto/pb_schema/cdp/cof/config_request.d.ts +401 -0
  257. package/lib/generated-proto/pb_schema/cdp/cof/config_request.js +525 -0
  258. package/lib/generated-proto/pb_schema/cdp/cof/config_request.js.map +1 -0
  259. package/lib/generated-proto/pb_schema/cdp/cof/config_response.d.ts +1287 -0
  260. package/lib/generated-proto/pb_schema/cdp/cof/config_response.js +135 -0
  261. package/lib/generated-proto/pb_schema/cdp/cof/config_response.js.map +1 -0
  262. package/lib/generated-proto/pb_schema/cdp/cof/config_result.d.ts +4208 -0
  263. package/lib/generated-proto/pb_schema/cdp/cof/config_result.js +1053 -0
  264. package/lib/generated-proto/pb_schema/cdp/cof/config_result.js.map +1 -0
  265. package/lib/generated-proto/pb_schema/cdp/cof/debug_info.d.ts +102 -0
  266. package/lib/generated-proto/pb_schema/cdp/cof/debug_info.js +165 -0
  267. package/lib/generated-proto/pb_schema/cdp/cof/debug_info.js.map +1 -0
  268. package/lib/generated-proto/pb_schema/cdp/cof/namespace.d.ts +8 -0
  269. package/lib/generated-proto/pb_schema/cdp/cof/namespace.js +17 -0
  270. package/lib/generated-proto/pb_schema/cdp/cof/namespace.js.map +1 -0
  271. package/lib/generated-proto/pb_schema/common/ruid.d.ts +75 -0
  272. package/lib/generated-proto/pb_schema/common/ruid.js +96 -0
  273. package/lib/generated-proto/pb_schema/common/ruid.js.map +1 -0
  274. package/lib/generated-proto/pb_schema/common/value.d.ts +131 -0
  275. package/lib/generated-proto/pb_schema/common/value.js +204 -0
  276. package/lib/generated-proto/pb_schema/common/value.js.map +1 -0
  277. package/lib/generated-proto/pb_schema/google/api/annotations.d.ts +1 -0
  278. package/lib/generated-proto/pb_schema/google/api/annotations.js +9 -0
  279. package/lib/generated-proto/pb_schema/google/api/annotations.js.map +1 -0
  280. package/lib/generated-proto/pb_schema/google/api/http.d.ts +3636 -0
  281. package/lib/generated-proto/pb_schema/google/api/http.js +271 -0
  282. package/lib/generated-proto/pb_schema/google/api/http.js.map +1 -0
  283. package/lib/generated-proto/pb_schema/google/protobuf/any.d.ts +139 -0
  284. package/lib/generated-proto/pb_schema/google/protobuf/any.js +94 -0
  285. package/lib/generated-proto/pb_schema/google/protobuf/any.js.map +1 -0
  286. package/lib/generated-proto/pb_schema/google/protobuf/descriptor.d.ts +50968 -0
  287. package/lib/generated-proto/pb_schema/google/protobuf/descriptor.js +2962 -0
  288. package/lib/generated-proto/pb_schema/google/protobuf/descriptor.js.map +1 -0
  289. package/lib/generated-proto/pb_schema/google/protobuf/timestamp.d.ts +98 -0
  290. package/lib/generated-proto/pb_schema/google/protobuf/timestamp.js +82 -0
  291. package/lib/generated-proto/pb_schema/google/protobuf/timestamp.js.map +1 -0
  292. package/lib/generated-proto/pb_schema/google/protobuf/wrappers.d.ts +173 -0
  293. package/lib/generated-proto/pb_schema/google/protobuf/wrappers.js +332 -0
  294. package/lib/generated-proto/pb_schema/google/protobuf/wrappers.js.map +1 -0
  295. package/lib/generated-proto/pb_schema/lenses/geocircle.d.ts +42 -0
  296. package/lib/generated-proto/pb_schema/lenses/geocircle.js +52 -0
  297. package/lib/generated-proto/pb_schema/lenses/geocircle.js.map +1 -0
  298. package/lib/generated-proto/pb_schema/lenses/geopoint.d.ts +32 -0
  299. package/lib/generated-proto/pb_schema/lenses/geopoint.js +50 -0
  300. package/lib/generated-proto/pb_schema/lenses/geopoint.js.map +1 -0
  301. package/lib/generated-proto/pb_schema/lenses/launch_params.d.ts +29 -0
  302. package/lib/generated-proto/pb_schema/lenses/launch_params.js +43 -0
  303. package/lib/generated-proto/pb_schema/lenses/launch_params.js.map +1 -0
  304. package/lib/generated-proto/pb_schema/lenses/launchdata.d.ts +365 -0
  305. package/lib/generated-proto/pb_schema/lenses/launchdata.js +216 -0
  306. package/lib/generated-proto/pb_schema/lenses/launchdata.js.map +1 -0
  307. package/lib/generated-proto/pb_schema/lenses/lures.d.ts +113 -0
  308. package/lib/generated-proto/pb_schema/lenses/lures.js +64 -0
  309. package/lib/generated-proto/pb_schema/lenses/lures.js.map +1 -0
  310. package/lib/generated-proto/pb_schema/lenses/persistent_store.d.ts +29 -0
  311. package/lib/generated-proto/pb_schema/lenses/persistent_store.js +43 -0
  312. package/lib/generated-proto/pb_schema/lenses/persistent_store.js.map +1 -0
  313. package/lib/generated-proto/pb_schema/lenses/snappable.d.ts +921 -0
  314. package/lib/generated-proto/pb_schema/lenses/snappable.js +954 -0
  315. package/lib/generated-proto/pb_schema/lenses/snappable.js.map +1 -0
  316. package/lib/generated-proto/pb_schema/lenses/user_data.d.ts +247 -0
  317. package/lib/generated-proto/pb_schema/lenses/user_data.js +362 -0
  318. package/lib/generated-proto/pb_schema/lenses/user_data.js.map +1 -0
  319. package/lib/handlers/HandlerChainBuilder.d.ts +95 -0
  320. package/lib/handlers/HandlerChainBuilder.js +187 -0
  321. package/lib/handlers/HandlerChainBuilder.js.map +1 -0
  322. package/lib/handlers/arrayBufferParsingHandler.d.ts +10 -0
  323. package/lib/handlers/arrayBufferParsingHandler.js +18 -0
  324. package/lib/handlers/arrayBufferParsingHandler.js.map +1 -0
  325. package/lib/handlers/batchingHandler.d.ts +25 -0
  326. package/lib/handlers/batchingHandler.js +79 -0
  327. package/lib/handlers/batchingHandler.js.map +1 -0
  328. package/lib/handlers/cameraKitServiceFetchHandlerFactory.d.ts +12 -0
  329. package/lib/handlers/cameraKitServiceFetchHandlerFactory.js +19 -0
  330. package/lib/handlers/cameraKitServiceFetchHandlerFactory.js.map +1 -0
  331. package/lib/handlers/debugHandler.d.ts +8 -0
  332. package/lib/handlers/debugHandler.js +27 -0
  333. package/lib/handlers/debugHandler.js.map +1 -0
  334. package/lib/handlers/defaultFetchHandler.d.ts +15 -0
  335. package/lib/handlers/defaultFetchHandler.js +29 -0
  336. package/lib/handlers/defaultFetchHandler.js.map +1 -0
  337. package/lib/handlers/headersModifyingFetchHandler.d.ts +8 -0
  338. package/lib/handlers/headersModifyingFetchHandler.js +13 -0
  339. package/lib/handlers/headersModifyingFetchHandler.js.map +1 -0
  340. package/lib/handlers/index.d.ts +2 -0
  341. package/lib/handlers/index.js +3 -0
  342. package/lib/handlers/index.js.map +1 -0
  343. package/lib/handlers/mappingHandler.d.ts +15 -0
  344. package/lib/handlers/mappingHandler.js +65 -0
  345. package/lib/handlers/mappingHandler.js.map +1 -0
  346. package/lib/handlers/noCorsRetryingFetchHandler.d.ts +48 -0
  347. package/lib/handlers/noCorsRetryingFetchHandler.js +94 -0
  348. package/lib/handlers/noCorsRetryingFetchHandler.js.map +1 -0
  349. package/lib/handlers/persistingHandler.d.ts +14 -0
  350. package/lib/handlers/persistingHandler.js +71 -0
  351. package/lib/handlers/persistingHandler.js.map +1 -0
  352. package/lib/handlers/rateLimitingHandler.d.ts +20 -0
  353. package/lib/handlers/rateLimitingHandler.js +43 -0
  354. package/lib/handlers/rateLimitingHandler.js.map +1 -0
  355. package/lib/handlers/requestStateEmittingHandler.d.ts +29 -0
  356. package/lib/handlers/requestStateEmittingHandler.js +43 -0
  357. package/lib/handlers/requestStateEmittingHandler.js.map +1 -0
  358. package/lib/handlers/responseCachingHandler.d.ts +27 -0
  359. package/lib/handlers/responseCachingHandler.js +94 -0
  360. package/lib/handlers/responseCachingHandler.js.map +1 -0
  361. package/lib/handlers/retryingHandler.d.ts +37 -0
  362. package/lib/handlers/retryingHandler.js +73 -0
  363. package/lib/handlers/retryingHandler.js.map +1 -0
  364. package/lib/handlers/timeoutHandler.d.ts +18 -0
  365. package/lib/handlers/timeoutHandler.js +30 -0
  366. package/lib/handlers/timeoutHandler.js.map +1 -0
  367. package/lib/index.d.ts +33 -0
  368. package/lib/index.js +32 -0
  369. package/lib/index.js.map +1 -0
  370. package/lib/legal/legalPrompt.d.ts +17 -0
  371. package/lib/legal/legalPrompt.js +144 -0
  372. package/lib/legal/legalPrompt.js.map +1 -0
  373. package/lib/legal/legalState.d.ts +50 -0
  374. package/lib/legal/legalState.js +149 -0
  375. package/lib/legal/legalState.js.map +1 -0
  376. package/lib/lens/Lens.d.ts +71 -0
  377. package/lib/lens/Lens.js +63 -0
  378. package/lib/lens/Lens.js.map +1 -0
  379. package/lib/lens/LensLaunchParams.d.ts +19 -0
  380. package/lib/lens/LensLaunchParams.js +38 -0
  381. package/lib/lens/LensLaunchParams.js.map +1 -0
  382. package/lib/lens/LensPersistenceStore.d.ts +7 -0
  383. package/lib/lens/LensPersistenceStore.js +20 -0
  384. package/lib/lens/LensPersistenceStore.js.map +1 -0
  385. package/lib/lens/LensRepository.d.ts +134 -0
  386. package/lib/lens/LensRepository.js +239 -0
  387. package/lib/lens/LensRepository.js.map +1 -0
  388. package/lib/lens/assets/LensAssetRepository.d.ts +66 -0
  389. package/lib/lens/assets/LensAssetRepository.js +179 -0
  390. package/lib/lens/assets/LensAssetRepository.js.map +1 -0
  391. package/lib/lens/assets/LensAssetsProvider.d.ts +21 -0
  392. package/lib/lens/assets/LensAssetsProvider.js +41 -0
  393. package/lib/lens/assets/LensAssetsProvider.js.map +1 -0
  394. package/lib/lens/assets/deviceDependentAssetLoader.d.ts +11 -0
  395. package/lib/lens/assets/deviceDependentAssetLoader.js +58 -0
  396. package/lib/lens/assets/deviceDependentAssetLoader.js.map +1 -0
  397. package/lib/lens/assets/remoteMediaAssetLoaderFactory.d.ts +10 -0
  398. package/lib/lens/assets/remoteMediaAssetLoaderFactory.js +26 -0
  399. package/lib/lens/assets/remoteMediaAssetLoaderFactory.js.map +1 -0
  400. package/lib/lens/assets/staticAssetLoader.d.ts +10 -0
  401. package/lib/lens/assets/staticAssetLoader.js +24 -0
  402. package/lib/lens/assets/staticAssetLoader.js.map +1 -0
  403. package/lib/lens/index.d.ts +7 -0
  404. package/lib/lens/index.js +7 -0
  405. package/lib/lens/index.js.map +1 -0
  406. package/lib/lens/lensEnvelopeUtil.d.ts +5 -0
  407. package/lib/lens/lensEnvelopeUtil.js +19 -0
  408. package/lib/lens/lensEnvelopeUtil.js.map +1 -0
  409. package/lib/lens/lensHttpUtil.d.ts +4 -0
  410. package/lib/lens/lensHttpUtil.js +30 -0
  411. package/lib/lens/lensHttpUtil.js.map +1 -0
  412. package/lib/lens-client-interface/exif.d.ts +20 -0
  413. package/lib/lens-client-interface/exif.js +61 -0
  414. package/lib/lens-client-interface/exif.js.map +1 -0
  415. package/lib/lens-client-interface/imagePicker.d.ts +7 -0
  416. package/lib/lens-client-interface/imagePicker.js +128 -0
  417. package/lib/lens-client-interface/imagePicker.js.map +1 -0
  418. package/lib/lens-client-interface/lensClientInterface.d.ts +13 -0
  419. package/lib/lens-client-interface/lensClientInterface.js +30 -0
  420. package/lib/lens-client-interface/lensClientInterface.js.map +1 -0
  421. package/lib/lens-core-module/generated-types.d.ts +426 -0
  422. package/lib/lens-core-module/generated-types.js +2 -0
  423. package/lib/lens-core-module/generated-types.js.map +1 -0
  424. package/lib/lens-core-module/index.d.ts +2 -0
  425. package/lib/lens-core-module/index.js +3 -0
  426. package/lib/lens-core-module/index.js.map +1 -0
  427. package/lib/lens-core-module/loader/index.d.ts +1 -0
  428. package/lib/lens-core-module/loader/index.js +2 -0
  429. package/lib/lens-core-module/loader/index.js.map +1 -0
  430. package/lib/lens-core-module/loader/lensCoreFactory.d.ts +30 -0
  431. package/lib/lens-core-module/loader/lensCoreFactory.js +121 -0
  432. package/lib/lens-core-module/loader/lensCoreFactory.js.map +1 -0
  433. package/lib/lensCoreWasmVersions.json +5 -0
  434. package/lib/logger/errorLoggingDecorator.d.ts +9 -0
  435. package/lib/logger/errorLoggingDecorator.js +32 -0
  436. package/lib/logger/errorLoggingDecorator.js.map +1 -0
  437. package/lib/logger/logEntries.d.ts +15 -0
  438. package/lib/logger/logEntries.js +14 -0
  439. package/lib/logger/logEntries.js.map +1 -0
  440. package/lib/logger/logger.d.ts +35 -0
  441. package/lib/logger/logger.js +48 -0
  442. package/lib/logger/logger.js.map +1 -0
  443. package/lib/logger/registerLogEntriesSubscriber.d.ts +14 -0
  444. package/lib/logger/registerLogEntriesSubscriber.js +23 -0
  445. package/lib/logger/registerLogEntriesSubscriber.js.map +1 -0
  446. package/lib/media-sources/CameraKitSource.d.ts +88 -0
  447. package/lib/media-sources/CameraKitSource.js +140 -0
  448. package/lib/media-sources/CameraKitSource.js.map +1 -0
  449. package/lib/media-sources/FunctionSource.d.ts +30 -0
  450. package/lib/media-sources/FunctionSource.js +132 -0
  451. package/lib/media-sources/FunctionSource.js.map +1 -0
  452. package/lib/media-sources/ImageSource.d.ts +13 -0
  453. package/lib/media-sources/ImageSource.js +28 -0
  454. package/lib/media-sources/ImageSource.js.map +1 -0
  455. package/lib/media-sources/MediaStreamSource.d.ts +41 -0
  456. package/lib/media-sources/MediaStreamSource.js +146 -0
  457. package/lib/media-sources/MediaStreamSource.js.map +1 -0
  458. package/lib/media-sources/VideoSource.d.ts +21 -0
  459. package/lib/media-sources/VideoSource.js +38 -0
  460. package/lib/media-sources/VideoSource.js.map +1 -0
  461. package/lib/metrics/businessEventsReporter.d.ts +37 -0
  462. package/lib/metrics/businessEventsReporter.js +160 -0
  463. package/lib/metrics/businessEventsReporter.js.map +1 -0
  464. package/lib/metrics/metricsEventTarget.d.ts +41 -0
  465. package/lib/metrics/metricsEventTarget.js +11 -0
  466. package/lib/metrics/metricsEventTarget.js.map +1 -0
  467. package/lib/metrics/metricsHandler.d.ts +9 -0
  468. package/lib/metrics/metricsHandler.js +13 -0
  469. package/lib/metrics/metricsHandler.js.map +1 -0
  470. package/lib/metrics/operationalMetricsReporter.d.ts +52 -0
  471. package/lib/metrics/operationalMetricsReporter.js +108 -0
  472. package/lib/metrics/operationalMetricsReporter.js.map +1 -0
  473. package/lib/metrics/reporters/reportBenchmarks.d.ts +10 -0
  474. package/lib/metrics/reporters/reportBenchmarks.js +29 -0
  475. package/lib/metrics/reporters/reportBenchmarks.js.map +1 -0
  476. package/lib/metrics/reporters/reportGlobalException.d.ts +19 -0
  477. package/lib/metrics/reporters/reportGlobalException.js +68 -0
  478. package/lib/metrics/reporters/reportGlobalException.js.map +1 -0
  479. package/lib/metrics/reporters/reportHttpMetrics.d.ts +17 -0
  480. package/lib/metrics/reporters/reportHttpMetrics.js +92 -0
  481. package/lib/metrics/reporters/reportHttpMetrics.js.map +1 -0
  482. package/lib/metrics/reporters/reportLegalState.d.ts +15 -0
  483. package/lib/metrics/reporters/reportLegalState.js +34 -0
  484. package/lib/metrics/reporters/reportLegalState.js.map +1 -0
  485. package/lib/metrics/reporters/reportLensAndAssetDownload.d.ts +38 -0
  486. package/lib/metrics/reporters/reportLensAndAssetDownload.js +88 -0
  487. package/lib/metrics/reporters/reportLensAndAssetDownload.js.map +1 -0
  488. package/lib/metrics/reporters/reportLensValidationFailed.d.ts +20 -0
  489. package/lib/metrics/reporters/reportLensValidationFailed.js +24 -0
  490. package/lib/metrics/reporters/reportLensValidationFailed.js.map +1 -0
  491. package/lib/metrics/reporters/reportLensView.d.ts +36 -0
  492. package/lib/metrics/reporters/reportLensView.js +101 -0
  493. package/lib/metrics/reporters/reportLensView.js.map +1 -0
  494. package/lib/metrics/reporters/reportLensWait.d.ts +33 -0
  495. package/lib/metrics/reporters/reportLensWait.js +56 -0
  496. package/lib/metrics/reporters/reportLensWait.js.map +1 -0
  497. package/lib/metrics/reporters/reportSessionException.d.ts +17 -0
  498. package/lib/metrics/reporters/reportSessionException.js +12 -0
  499. package/lib/metrics/reporters/reportSessionException.js.map +1 -0
  500. package/lib/metrics/reporters/reportUserSession.d.ts +14 -0
  501. package/lib/metrics/reporters/reportUserSession.js +67 -0
  502. package/lib/metrics/reporters/reportUserSession.js.map +1 -0
  503. package/lib/metrics/reporters/reporters.d.ts +44 -0
  504. package/lib/metrics/reporters/reporters.js +33 -0
  505. package/lib/metrics/reporters/reporters.js.map +1 -0
  506. package/lib/namedErrors.d.ts +107 -0
  507. package/lib/namedErrors.js +56 -0
  508. package/lib/namedErrors.js.map +1 -0
  509. package/lib/persistence/ExpiringPersistence.d.ts +20 -0
  510. package/lib/persistence/ExpiringPersistence.js +58 -0
  511. package/lib/persistence/ExpiringPersistence.js.map +1 -0
  512. package/lib/persistence/IndexedDBPersistence.d.ts +47 -0
  513. package/lib/persistence/IndexedDBPersistence.js +180 -0
  514. package/lib/persistence/IndexedDBPersistence.js.map +1 -0
  515. package/lib/persistence/Persistence.d.ts +25 -0
  516. package/lib/persistence/Persistence.js +10 -0
  517. package/lib/persistence/Persistence.js.map +1 -0
  518. package/lib/remote-configuration/cofHandler.d.ts +21 -0
  519. package/lib/remote-configuration/cofHandler.js +75 -0
  520. package/lib/remote-configuration/cofHandler.js.map +1 -0
  521. package/lib/remote-configuration/remoteConfiguration.d.ts +13 -0
  522. package/lib/remote-configuration/remoteConfiguration.js +43 -0
  523. package/lib/remote-configuration/remoteConfiguration.js.map +1 -0
  524. package/lib/session/CameraKitSession.d.ts +252 -0
  525. package/lib/session/CameraKitSession.js +439 -0
  526. package/lib/session/CameraKitSession.js.map +1 -0
  527. package/lib/session/CameraKitSessionEvents.d.ts +33 -0
  528. package/lib/session/CameraKitSessionEvents.js +21 -0
  529. package/lib/session/CameraKitSessionEvents.js.map +1 -0
  530. package/lib/session/LensKeyboard.d.ts +89 -0
  531. package/lib/session/LensKeyboard.js +95 -0
  532. package/lib/session/LensKeyboard.js.map +1 -0
  533. package/lib/session/LensPerformanceMeasurement.d.ts +55 -0
  534. package/lib/session/LensPerformanceMeasurement.js +91 -0
  535. package/lib/session/LensPerformanceMeasurement.js.map +1 -0
  536. package/lib/session/LensPerformanceMetrics.d.ts +31 -0
  537. package/lib/session/LensPerformanceMetrics.js +58 -0
  538. package/lib/session/LensPerformanceMetrics.js.map +1 -0
  539. package/lib/session/index.d.ts +1 -0
  540. package/lib/session/index.js +2 -0
  541. package/lib/session/index.js.map +1 -0
  542. package/lib/session/lensState.d.ts +29 -0
  543. package/lib/session/lensState.js +160 -0
  544. package/lib/session/lensState.js.map +1 -0
  545. package/lib/session/sessionState.d.ts +10 -0
  546. package/lib/session/sessionState.js +12 -0
  547. package/lib/session/sessionState.js.map +1 -0
  548. package/lib/transforms/Transform2D.d.ts +17 -0
  549. package/lib/transforms/Transform2D.js +18 -0
  550. package/lib/transforms/Transform2D.js.map +1 -0
  551. package/lib/transforms/index.d.ts +1 -0
  552. package/lib/transforms/index.js +2 -0
  553. package/lib/transforms/index.js.map +1 -0
  554. package/package.json +62 -0
@@ -0,0 +1,41 @@
1
+ import { TypedCustomEvent } from "../events/TypedCustomEvent";
2
+ import { TypedEventTarget } from "../events/TypedEventTarget";
3
+ import { AssetValidationFailed } from "../lens/assets/LensAssetsProvider";
4
+ import { AssetDownload, LensDownload } from "./reporters/reportLensAndAssetDownload";
5
+ import { LensContentValidationFailed } from "./reporters/reportLensValidationFailed";
6
+ import { LensView } from "./reporters/reportLensView";
7
+ import { LensWait } from "./reporters/reportLensWait";
8
+ import { Session } from "./reporters/reportUserSession";
9
+ import { BenchmarkComplete } from "./reporters/reportBenchmarks";
10
+ import { LegalPrompt } from "./reporters/reportLegalState";
11
+ import { MakeTaggedBusinessEvent } from "./businessEventsReporter";
12
+ /**
13
+ * The Exception metric reports every time we handle an exception.
14
+ */
15
+ export declare type Exception = MakeTaggedBusinessEvent<"exception">;
16
+ export declare type CameraKitBootstrapMetricEvents = TypedCustomEvent<BenchmarkComplete["name"], BenchmarkComplete>;
17
+ export declare type CameraKitSessionMetricEvents = TypedCustomEvent<LegalPrompt["name"], LegalPrompt> | TypedCustomEvent<LensView["name"], LensView> | TypedCustomEvent<LensWait["name"], LensWait> | TypedCustomEvent<LensDownload["name"], LensDownload> | TypedCustomEvent<AssetDownload["name"], AssetDownload> | TypedCustomEvent<AssetValidationFailed["name"], AssetValidationFailed> | TypedCustomEvent<LensContentValidationFailed["name"], LensContentValidationFailed> | TypedCustomEvent<Session["name"], Session>;
18
+ /**
19
+ * A union of all event types emitted by the {@link CameraKit.events} event emitter.
20
+ *
21
+ * @internal
22
+ */
23
+ export declare type CameraKitMetricEvents = CameraKitSessionMetricEvents | CameraKitBootstrapMetricEvents | TypedCustomEvent<Exception["name"], Exception>;
24
+ /**
25
+ * This event target may be used to listen for any of the metrics events reported by CameraKit.
26
+ *
27
+ * @internal
28
+ */
29
+ export declare type MetricsEventTarget = TypedEventTarget<CameraKitMetricEvents>;
30
+ /**
31
+ * Any metrics that we wish to emit to applications should be dispatched on this event target.
32
+ *
33
+ * Our business events reporter also listens to this event target, and may report the emitted metrics to our backend.
34
+ *
35
+ * @internal
36
+ */
37
+ export declare const metricsEventTargetFactory: {
38
+ (): MetricsEventTarget;
39
+ token: "metricsEventTarget";
40
+ dependencies: [];
41
+ };
@@ -0,0 +1,11 @@
1
+ import { Injectable } from "../dependency-injection/Injectable";
2
+ import { TypedEventTarget } from "../events/TypedEventTarget";
3
+ /**
4
+ * Any metrics that we wish to emit to applications should be dispatched on this event target.
5
+ *
6
+ * Our business events reporter also listens to this event target, and may report the emitted metrics to our backend.
7
+ *
8
+ * @internal
9
+ */
10
+ export const metricsEventTargetFactory = Injectable("metricsEventTarget", () => new TypedEventTarget());
11
+ //# sourceMappingURL=metricsEventTarget.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"metricsEventTarget.js","sourceRoot":"","sources":["../../src/metrics/metricsEventTarget.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,MAAM,oCAAoC,CAAC;AAEhE,OAAO,EAAE,gBAAgB,EAAE,MAAM,4BAA4B,CAAC;AA6C9D;;;;;;GAMG;AACH,MAAM,CAAC,MAAM,yBAAyB,GAAG,UAAU,CAC/C,oBAAoB,EACpB,GAAuB,EAAE,CAAC,IAAI,gBAAgB,EAAE,CACnD,CAAC","sourcesContent":["import { Injectable } from \"../dependency-injection/Injectable\";\nimport { TypedCustomEvent } from \"../events/TypedCustomEvent\";\nimport { TypedEventTarget } from \"../events/TypedEventTarget\";\nimport { AssetValidationFailed } from \"../lens/assets/LensAssetsProvider\";\nimport { AssetDownload, LensDownload } from \"./reporters/reportLensAndAssetDownload\";\nimport { LensContentValidationFailed } from \"./reporters/reportLensValidationFailed\";\nimport { LensView } from \"./reporters/reportLensView\";\nimport { LensWait } from \"./reporters/reportLensWait\";\nimport { Session } from \"./reporters/reportUserSession\";\nimport { BenchmarkComplete } from \"./reporters/reportBenchmarks\";\nimport { LegalPrompt } from \"./reporters/reportLegalState\";\nimport { MakeTaggedBusinessEvent } from \"./businessEventsReporter\";\n\n/**\n * The Exception metric reports every time we handle an exception.\n */\nexport type Exception = MakeTaggedBusinessEvent<\"exception\">;\n\nexport type CameraKitBootstrapMetricEvents = TypedCustomEvent<BenchmarkComplete[\"name\"], BenchmarkComplete>;\n\nexport type CameraKitSessionMetricEvents =\n | TypedCustomEvent<LegalPrompt[\"name\"], LegalPrompt>\n | TypedCustomEvent<LensView[\"name\"], LensView>\n | TypedCustomEvent<LensWait[\"name\"], LensWait>\n | TypedCustomEvent<LensDownload[\"name\"], LensDownload>\n | TypedCustomEvent<AssetDownload[\"name\"], AssetDownload>\n | TypedCustomEvent<AssetValidationFailed[\"name\"], AssetValidationFailed>\n | TypedCustomEvent<LensContentValidationFailed[\"name\"], LensContentValidationFailed>\n | TypedCustomEvent<Session[\"name\"], Session>;\n\n/**\n * A union of all event types emitted by the {@link CameraKit.events} event emitter.\n *\n * @internal\n */\nexport type CameraKitMetricEvents =\n | CameraKitSessionMetricEvents\n | CameraKitBootstrapMetricEvents\n | TypedCustomEvent<Exception[\"name\"], Exception>;\n\n/**\n * This event target may be used to listen for any of the metrics events reported by CameraKit.\n *\n * @internal\n */\nexport type MetricsEventTarget = TypedEventTarget<CameraKitMetricEvents>;\n\n/**\n * Any metrics that we wish to emit to applications should be dispatched on this event target.\n *\n * Our business events reporter also listens to this event target, and may report the emitted metrics to our backend.\n *\n * @internal\n */\nexport const metricsEventTargetFactory = Injectable(\n \"metricsEventTarget\",\n (): MetricsEventTarget => new TypedEventTarget()\n);\n"]}
@@ -0,0 +1,9 @@
1
+ import { FetchHandler } from "../handlers/defaultFetchHandler";
2
+ /**
3
+ * @internal
4
+ */
5
+ export declare const metricsHandlerFactory: {
6
+ (args_0: FetchHandler<Response>): import("../handlers/HandlerChainBuilder").Handler<RequestInfo, Response, RequestInit | undefined>;
7
+ token: "metricsHandler";
8
+ dependencies: readonly ["cameraKitServiceFetchHandler"];
9
+ };
@@ -0,0 +1,13 @@
1
+ import { Injectable } from "../dependency-injection/Injectable";
2
+ import { cameraKitServiceFetchHandlerFactory } from "../handlers/cameraKitServiceFetchHandlerFactory";
3
+ import { HandlerChainBuilder } from "../handlers/HandlerChainBuilder";
4
+ import { createRateLimitingHandler } from "../handlers/rateLimitingHandler";
5
+ const METRIC_REQUEST_RATE_LIMIT_MS = 1000; // send at most one metric request per second.
6
+ /**
7
+ * @internal
8
+ */
9
+ export const metricsHandlerFactory = Injectable("metricsHandler", [cameraKitServiceFetchHandlerFactory.token], (fetchHandler) => {
10
+ return new HandlerChainBuilder(fetchHandler).map(createRateLimitingHandler(METRIC_REQUEST_RATE_LIMIT_MS))
11
+ .handler;
12
+ });
13
+ //# sourceMappingURL=metricsHandler.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"metricsHandler.js","sourceRoot":"","sources":["../../src/metrics/metricsHandler.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,MAAM,oCAAoC,CAAC;AAEhE,OAAO,EAAE,mCAAmC,EAAE,MAAM,iDAAiD,CAAC;AACtG,OAAO,EAAE,mBAAmB,EAAE,MAAM,iCAAiC,CAAC;AACtE,OAAO,EAAE,yBAAyB,EAAE,MAAM,iCAAiC,CAAC;AAE5E,MAAM,4BAA4B,GAAG,IAAI,CAAC,CAAC,8CAA8C;AAEzF;;GAEG;AACH,MAAM,CAAC,MAAM,qBAAqB,GAAG,UAAU,CAC3C,gBAAgB,EAChB,CAAC,mCAAmC,CAAC,KAAK,CAAU,EACpD,CAAC,YAA0B,EAAE,EAAE;IAC3B,OAAO,IAAI,mBAAmB,CAAC,YAAY,CAAC,CAAC,GAAG,CAAC,yBAAyB,CAAC,4BAA4B,CAAC,CAAC;SACpG,OAAO,CAAC;AACjB,CAAC,CACJ,CAAC","sourcesContent":["import { Injectable } from \"../dependency-injection/Injectable\";\nimport { FetchHandler } from \"../handlers/defaultFetchHandler\";\nimport { cameraKitServiceFetchHandlerFactory } from \"../handlers/cameraKitServiceFetchHandlerFactory\";\nimport { HandlerChainBuilder } from \"../handlers/HandlerChainBuilder\";\nimport { createRateLimitingHandler } from \"../handlers/rateLimitingHandler\";\n\nconst METRIC_REQUEST_RATE_LIMIT_MS = 1000; // send at most one metric request per second.\n\n/**\n * @internal\n */\nexport const metricsHandlerFactory = Injectable(\n \"metricsHandler\",\n [cameraKitServiceFetchHandlerFactory.token] as const,\n (fetchHandler: FetchHandler) => {\n return new HandlerChainBuilder(fetchHandler).map(createRateLimitingHandler(METRIC_REQUEST_RATE_LIMIT_MS))\n .handler;\n }\n);\n"]}
@@ -0,0 +1,52 @@
1
+ import { FetchHandler } from "../handlers/defaultFetchHandler";
2
+ import { OperationalMetric } from "../generated-proto/pb_schema/camera_kit/v3/operational_metrics";
3
+ declare type MetricsHandler = (metric: OperationalMetric) => Promise<void>;
4
+ /**
5
+ * Use this class to report operational metrics – these are metrics that describe aspects of the SDK's performance,
6
+ * which may be used to assess and investigate operational issues.
7
+ */
8
+ /** @internal */
9
+ export declare class OperationalMetricsReporter {
10
+ private readonly metricsHandler;
11
+ constructor(metricsHandler: MetricsHandler);
12
+ /**
13
+ * Record a count.
14
+ *
15
+ * @param name
16
+ * @param count
17
+ * @param dimensions An optional Map containing dimensions which describe the metric.
18
+ * For example: `new Map([['status', '200']])`
19
+ * @returns Promise which resolves when the metric has been handled.
20
+ */
21
+ count(name: string, count: number, dimensions?: Map<string, string>): Promise<void>;
22
+ /**
23
+ * Record a duration in milliseconds.
24
+ *
25
+ * @param name
26
+ * @param latencyMillis
27
+ * @param dimensions An optional Map containing dimensions which describe the metric.
28
+ * For example: `new Map([['status', '200']])`
29
+ * @returns Promise which resolves when the metric has been handled.
30
+ */
31
+ timer(name: string, latencyMillis: number, dimensions?: Map<string, string>): Promise<void>;
32
+ /**
33
+ * Record a histogram.
34
+ *
35
+ * @param name
36
+ * @param histogram
37
+ * @param dimensions An optional Map containing dimensions which describe the metric.
38
+ * For example: `new Map([['status', '200']])`
39
+ * @returns Promise which resolves when the metric has been handled.
40
+ */
41
+ histogram(name: string, histogram: number, dimensions?: Map<string, string>): Promise<void>;
42
+ private record;
43
+ }
44
+ /**
45
+ * @internal
46
+ */
47
+ export declare const operationalMetricReporterFactory: {
48
+ (args_0: FetchHandler<Response>): OperationalMetricsReporter;
49
+ token: "operationalMetricsReporter";
50
+ dependencies: readonly ["metricsHandler"];
51
+ };
52
+ export {};
@@ -0,0 +1,108 @@
1
+ import { Injectable } from "../dependency-injection/Injectable";
2
+ import { HandlerChainBuilder } from "../handlers/HandlerChainBuilder";
3
+ import { createBatchingHandler } from "../handlers/batchingHandler";
4
+ import { SetOperationalMetricsRequest } from "../generated-proto/pb_schema/camera_kit/v3/service";
5
+ import { createMappingHandler } from "../handlers/mappingHandler";
6
+ import { metricsHandlerFactory } from "./metricsHandler";
7
+ // CameraKit's prod metrics endpoint.
8
+ // See: https://github.sc-corp.net/Snapchat/pb_schema/blob/c390b9c/proto/camera_kit/v3/service.proto#L126
9
+ const OPERATIONAL_METRICS_ENDPOINT = "https://api-kit.snapchat.com/com.snap.camerakit.v3.Metrics/metrics/operational_metrics";
10
+ const DIMENSION_DELIMITER = ".";
11
+ // These values are (currently) arbitrarily selected.
12
+ // TODO: Once we have gathered a sufficient quantity of metrics data, we should tune these numbers to ensure we're
13
+ // operating with the right cost vs. alarming SLA vs. IDB storage size tradeoffs.
14
+ const METRIC_BATCH_MAX_SIZE = 100;
15
+ const METRIC_BATCH_MAX_AGE_MS = 5000;
16
+ /**
17
+ * Use this class to report operational metrics – these are metrics that describe aspects of the SDK's performance,
18
+ * which may be used to assess and investigate operational issues.
19
+ */
20
+ /** @internal */
21
+ export class OperationalMetricsReporter {
22
+ constructor(metricsHandler) {
23
+ this.metricsHandler = metricsHandler;
24
+ }
25
+ /**
26
+ * Record a count.
27
+ *
28
+ * @param name
29
+ * @param count
30
+ * @param dimensions An optional Map containing dimensions which describe the metric.
31
+ * For example: `new Map([['status', '200']])`
32
+ * @returns Promise which resolves when the metric has been handled.
33
+ */
34
+ count(name, count, dimensions) {
35
+ return this.record(name, { $case: "count", count }, dimensions);
36
+ }
37
+ /**
38
+ * Record a duration in milliseconds.
39
+ *
40
+ * @param name
41
+ * @param latencyMillis
42
+ * @param dimensions An optional Map containing dimensions which describe the metric.
43
+ * For example: `new Map([['status', '200']])`
44
+ * @returns Promise which resolves when the metric has been handled.
45
+ */
46
+ timer(name, latencyMillis, dimensions) {
47
+ return this.record(name, { $case: "latencyMillis", latencyMillis }, dimensions);
48
+ }
49
+ /**
50
+ * Record a histogram.
51
+ *
52
+ * @param name
53
+ * @param histogram
54
+ * @param dimensions An optional Map containing dimensions which describe the metric.
55
+ * For example: `new Map([['status', '200']])`
56
+ * @returns Promise which resolves when the metric has been handled.
57
+ */
58
+ histogram(name, histogram, dimensions) {
59
+ return this.record(name, { $case: "histogram", histogram }, dimensions);
60
+ }
61
+ record(name, metric, dimensions) {
62
+ // The naming convention (metricName.dimensionName.dimensionValue.dimensionName.dimensionValue...) is mentioned
63
+ // the Graphene docs here https://wiki.sc-corp.net/display/METRICS/Graphene
64
+ // TODO: find explicit documentation of the API, if it exists.
65
+ const serializedDimensions = dimensions
66
+ ? `.${Array.from(dimensions.entries())
67
+ .map((d) => d.join(DIMENSION_DELIMITER))
68
+ .join(DIMENSION_DELIMITER)}`
69
+ : "";
70
+ return this.metricsHandler({
71
+ name: `${name}${serializedDimensions}`,
72
+ timestamp: new Date(),
73
+ metric,
74
+ });
75
+ }
76
+ }
77
+ /**
78
+ * @internal
79
+ */
80
+ export const operationalMetricReporterFactory = Injectable("operationalMetricsReporter", [metricsHandlerFactory.token], (metricsHandler) => {
81
+ const handler = new HandlerChainBuilder(metricsHandler)
82
+ .map(createMappingHandler((metrics) => {
83
+ const request = { metrics };
84
+ return new Request(OPERATIONAL_METRICS_ENDPOINT, {
85
+ method: "POST",
86
+ body: JSON.stringify(SetOperationalMetricsRequest.toJSON(request)),
87
+ credentials: "include",
88
+ // Setting this to true makes fetch behave like `Navigator.sendBeacon` – that is, the request
89
+ // will still be made even if the page terminates.
90
+ // https://developer.mozilla.org/en-US/docs/Web/API/fetch
91
+ keepalive: true,
92
+ });
93
+ }))
94
+ .map(createBatchingHandler({
95
+ // The batching logic here is very simple – it could be improved by e.g. combining counts with
96
+ // the same name, computing statistics to reduce overall data sent, etc. Right now this is
97
+ // premature optimization, but could become a good idea in the future.
98
+ batchReduce: (previousBundle, metric) => {
99
+ const bundle = previousBundle !== null && previousBundle !== void 0 ? previousBundle : { metrics: [] };
100
+ bundle.metrics.push(metric);
101
+ return bundle;
102
+ },
103
+ isBatchComplete: (bundle) => bundle.metrics.length >= METRIC_BATCH_MAX_SIZE,
104
+ maxBatchAge: METRIC_BATCH_MAX_AGE_MS,
105
+ })).handler;
106
+ return new OperationalMetricsReporter(handler);
107
+ });
108
+ //# sourceMappingURL=operationalMetricsReporter.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"operationalMetricsReporter.js","sourceRoot":"","sources":["../../src/metrics/operationalMetricsReporter.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,MAAM,oCAAoC,CAAC;AAEhE,OAAO,EAAE,mBAAmB,EAAE,MAAM,iCAAiC,CAAC;AACtE,OAAO,EAAE,qBAAqB,EAAE,MAAM,6BAA6B,CAAC;AAKpE,OAAO,EAAE,4BAA4B,EAAE,MAAM,oDAAoD,CAAC;AAClG,OAAO,EAAE,oBAAoB,EAAE,MAAM,4BAA4B,CAAC;AAClE,OAAO,EAAE,qBAAqB,EAAE,MAAM,kBAAkB,CAAC;AAIzD,qCAAqC;AACrC,yGAAyG;AACzG,MAAM,4BAA4B,GAC9B,wFAAwF,CAAC;AAE7F,MAAM,mBAAmB,GAAG,GAAG,CAAC;AAEhC,qDAAqD;AACrD,kHAAkH;AAClH,iFAAiF;AACjF,MAAM,qBAAqB,GAAG,GAAG,CAAC;AAClC,MAAM,uBAAuB,GAAG,IAAI,CAAC;AAErC;;;GAGG;AACH,gBAAgB;AAChB,MAAM,OAAO,0BAA0B;IACnC,YAA6B,cAA8B;QAA9B,mBAAc,GAAd,cAAc,CAAgB;IAAG,CAAC;IAE/D;;;;;;;;OAQG;IACH,KAAK,CAAC,IAAY,EAAE,KAAa,EAAE,UAAgC;QAC/D,OAAO,IAAI,CAAC,MAAM,CAAC,IAAI,EAAE,EAAE,KAAK,EAAE,OAAO,EAAE,KAAK,EAAE,EAAE,UAAU,CAAC,CAAC;IACpE,CAAC;IAED;;;;;;;;OAQG;IACH,KAAK,CAAC,IAAY,EAAE,aAAqB,EAAE,UAAgC;QACvE,OAAO,IAAI,CAAC,MAAM,CAAC,IAAI,EAAE,EAAE,KAAK,EAAE,eAAe,EAAE,aAAa,EAAE,EAAE,UAAU,CAAC,CAAC;IACpF,CAAC;IAED;;;;;;;;OAQG;IACH,SAAS,CAAC,IAAY,EAAE,SAAiB,EAAE,UAAgC;QACvE,OAAO,IAAI,CAAC,MAAM,CAAC,IAAI,EAAE,EAAE,KAAK,EAAE,WAAW,EAAE,SAAS,EAAE,EAAE,UAAU,CAAC,CAAC;IAC5E,CAAC;IAEO,MAAM,CACV,IAAY,EACZ,MAA6C,EAC7C,UAAyC;QAEzC,+GAA+G;QAC/G,2EAA2E;QAC3E,8DAA8D;QAC9D,MAAM,oBAAoB,GAAG,UAAU;YACnC,CAAC,CAAC,IAAI,KAAK,CAAC,IAAI,CAAC,UAAU,CAAC,OAAO,EAAE,CAAC;iBAC/B,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,mBAAmB,CAAC,CAAC;iBACvC,IAAI,CAAC,mBAAmB,CAAC,EAAE;YAClC,CAAC,CAAC,EAAE,CAAC;QAET,OAAO,IAAI,CAAC,cAAc,CAAC;YACvB,IAAI,EAAE,GAAG,IAAI,GAAG,oBAAoB,EAAE;YACtC,SAAS,EAAE,IAAI,IAAI,EAAE;YACrB,MAAM;SACT,CAAC,CAAC;IACP,CAAC;CACJ;AAED;;GAEG;AACH,MAAM,CAAC,MAAM,gCAAgC,GAAG,UAAU,CACtD,4BAA4B,EAC5B,CAAC,qBAAqB,CAAC,KAAK,CAAU,EACtC,CAAC,cAA4B,EAAE,EAAE;IAC7B,MAAM,OAAO,GAAG,IAAI,mBAAmB,CAAC,cAAc,CAAC;SAClD,GAAG,CACA,oBAAoB,CAAC,CAAC,OAAiC,EAAE,EAAE;QACvD,MAAM,OAAO,GAAiC,EAAE,OAAO,EAAE,CAAC;QAC1D,OAAO,IAAI,OAAO,CAAC,4BAA4B,EAAE;YAC7C,MAAM,EAAE,MAAM;YACd,IAAI,EAAE,IAAI,CAAC,SAAS,CAAC,4BAA4B,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC;YAClE,WAAW,EAAE,SAAS;YAEtB,6FAA6F;YAC7F,kDAAkD;YAClD,yDAAyD;YACzD,SAAS,EAAE,IAAI;SAClB,CAAC,CAAC;IACP,CAAC,CAAC,CACL;SACA,GAAG,CACA,qBAAqB,CAAC;QAClB,8FAA8F;QAC9F,0FAA0F;QAC1F,sEAAsE;QACtE,WAAW,EAAE,CAAC,cAAoD,EAAE,MAAyB,EAAE,EAAE;YAC7F,MAAM,MAAM,GAAG,cAAc,aAAd,cAAc,cAAd,cAAc,GAAI,EAAE,OAAO,EAAE,EAAE,EAAE,CAAC;YACjD,MAAM,CAAC,OAAO,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;YAC5B,OAAO,MAAM,CAAC;QAClB,CAAC;QACD,eAAe,EAAE,CAAC,MAAM,EAAE,EAAE,CAAC,MAAM,CAAC,OAAO,CAAC,MAAM,IAAI,qBAAqB;QAC3E,WAAW,EAAE,uBAAuB;KACvC,CAAC,CACL,CAAC,OAAO,CAAC;IAEd,OAAO,IAAI,0BAA0B,CAAC,OAAO,CAAC,CAAC;AACnD,CAAC,CACJ,CAAC","sourcesContent":["import { Injectable } from \"../dependency-injection/Injectable\";\nimport { FetchHandler } from \"../handlers/defaultFetchHandler\";\nimport { HandlerChainBuilder } from \"../handlers/HandlerChainBuilder\";\nimport { createBatchingHandler } from \"../handlers/batchingHandler\";\nimport {\n OperationalMetric,\n OperationalMetricsBundle,\n} from \"../generated-proto/pb_schema/camera_kit/v3/operational_metrics\";\nimport { SetOperationalMetricsRequest } from \"../generated-proto/pb_schema/camera_kit/v3/service\";\nimport { createMappingHandler } from \"../handlers/mappingHandler\";\nimport { metricsHandlerFactory } from \"./metricsHandler\";\n\ntype MetricsHandler = (metric: OperationalMetric) => Promise<void>;\n\n// CameraKit's prod metrics endpoint.\n// See: https://github.sc-corp.net/Snapchat/pb_schema/blob/c390b9c/proto/camera_kit/v3/service.proto#L126\nconst OPERATIONAL_METRICS_ENDPOINT =\n \"https://api-kit.snapchat.com/com.snap.camerakit.v3.Metrics/metrics/operational_metrics\";\n\nconst DIMENSION_DELIMITER = \".\";\n\n// These values are (currently) arbitrarily selected.\n// TODO: Once we have gathered a sufficient quantity of metrics data, we should tune these numbers to ensure we're\n// operating with the right cost vs. alarming SLA vs. IDB storage size tradeoffs.\nconst METRIC_BATCH_MAX_SIZE = 100;\nconst METRIC_BATCH_MAX_AGE_MS = 5000;\n\n/**\n * Use this class to report operational metrics – these are metrics that describe aspects of the SDK's performance,\n * which may be used to assess and investigate operational issues.\n */\n/** @internal */\nexport class OperationalMetricsReporter {\n constructor(private readonly metricsHandler: MetricsHandler) {}\n\n /**\n * Record a count.\n *\n * @param name\n * @param count\n * @param dimensions An optional Map containing dimensions which describe the metric.\n * For example: `new Map([['status', '200']])`\n * @returns Promise which resolves when the metric has been handled.\n */\n count(name: string, count: number, dimensions?: Map<string, string>): Promise<void> {\n return this.record(name, { $case: \"count\", count }, dimensions);\n }\n\n /**\n * Record a duration in milliseconds.\n *\n * @param name\n * @param latencyMillis\n * @param dimensions An optional Map containing dimensions which describe the metric.\n * For example: `new Map([['status', '200']])`\n * @returns Promise which resolves when the metric has been handled.\n */\n timer(name: string, latencyMillis: number, dimensions?: Map<string, string>): Promise<void> {\n return this.record(name, { $case: \"latencyMillis\", latencyMillis }, dimensions);\n }\n\n /**\n * Record a histogram.\n *\n * @param name\n * @param histogram\n * @param dimensions An optional Map containing dimensions which describe the metric.\n * For example: `new Map([['status', '200']])`\n * @returns Promise which resolves when the metric has been handled.\n */\n histogram(name: string, histogram: number, dimensions?: Map<string, string>): Promise<void> {\n return this.record(name, { $case: \"histogram\", histogram }, dimensions);\n }\n\n private record(\n name: string,\n metric: Required<OperationalMetric>[\"metric\"],\n dimensions?: Map<string, string | number>\n ): Promise<void> {\n // The naming convention (metricName.dimensionName.dimensionValue.dimensionName.dimensionValue...) is mentioned\n // the Graphene docs here https://wiki.sc-corp.net/display/METRICS/Graphene\n // TODO: find explicit documentation of the API, if it exists.\n const serializedDimensions = dimensions\n ? `.${Array.from(dimensions.entries())\n .map((d) => d.join(DIMENSION_DELIMITER))\n .join(DIMENSION_DELIMITER)}`\n : \"\";\n\n return this.metricsHandler({\n name: `${name}${serializedDimensions}`,\n timestamp: new Date(),\n metric,\n });\n }\n}\n\n/**\n * @internal\n */\nexport const operationalMetricReporterFactory = Injectable(\n \"operationalMetricsReporter\",\n [metricsHandlerFactory.token] as const,\n (metricsHandler: FetchHandler) => {\n const handler = new HandlerChainBuilder(metricsHandler)\n .map(\n createMappingHandler((metrics: OperationalMetricsBundle) => {\n const request: SetOperationalMetricsRequest = { metrics };\n return new Request(OPERATIONAL_METRICS_ENDPOINT, {\n method: \"POST\",\n body: JSON.stringify(SetOperationalMetricsRequest.toJSON(request)),\n credentials: \"include\",\n\n // Setting this to true makes fetch behave like `Navigator.sendBeacon` – that is, the request\n // will still be made even if the page terminates.\n // https://developer.mozilla.org/en-US/docs/Web/API/fetch\n keepalive: true,\n });\n })\n )\n .map(\n createBatchingHandler({\n // The batching logic here is very simple – it could be improved by e.g. combining counts with\n // the same name, computing statistics to reduce overall data sent, etc. Right now this is\n // premature optimization, but could become a good idea in the future.\n batchReduce: (previousBundle: OperationalMetricsBundle | undefined, metric: OperationalMetric) => {\n const bundle = previousBundle ?? { metrics: [] };\n bundle.metrics.push(metric);\n return bundle;\n },\n isBatchComplete: (bundle) => bundle.metrics.length >= METRIC_BATCH_MAX_SIZE,\n maxBatchAge: METRIC_BATCH_MAX_AGE_MS,\n })\n ).handler;\n\n return new OperationalMetricsReporter(handler);\n }\n);\n"]}
@@ -0,0 +1,10 @@
1
+ import { CameraKitConfiguration } from "../../configuration";
2
+ import { MakeTaggedBusinessEvent } from "../businessEventsReporter";
3
+ import { MetricsEventTarget } from "../metricsEventTarget";
4
+ import { OperationalMetricsReporter } from "../operationalMetricsReporter";
5
+ export declare type BenchmarkComplete = MakeTaggedBusinessEvent<"benchmarkComplete">;
6
+ export declare const reportBenchmarks: {
7
+ (args_0: MetricsEventTarget, args_1: OperationalMetricsReporter, args_2: CameraKitConfiguration): Promise<void>;
8
+ token: "reportBenchmarks";
9
+ dependencies: readonly ["metricsEventTarget", "operationalMetricsReporter", "configuration"];
10
+ };
@@ -0,0 +1,29 @@
1
+ import { __awaiter } from "tslib";
2
+ import { configurationToken } from "../../configuration";
3
+ import { Injectable } from "../../dependency-injection/Injectable";
4
+ import { TypedCustomEvent } from "../../events/TypedCustomEvent";
5
+ import { metricsEventTargetFactory } from "../metricsEventTarget";
6
+ import { operationalMetricReporterFactory } from "../operationalMetricsReporter";
7
+ // Allowlist the benchmarks we wish to report.
8
+ const reportableBenchmarks = ["gflops"];
9
+ export const reportBenchmarks = Injectable("reportBenchmarks", [metricsEventTargetFactory.token, operationalMetricReporterFactory.token, configurationToken], (metricsEventTarget, reporter, config) => __awaiter(void 0, void 0, void 0, function* () {
10
+ if (config.lensPerformance === undefined)
11
+ return;
12
+ // Safety: config.lensPerformance cannot reject – all Promises contained in CameraKitConfiguration have
13
+ // catch blocks which return a default value.
14
+ const lensPerformance = yield config.lensPerformance;
15
+ const baseBenchmark = {
16
+ name: "benchmarkComplete",
17
+ performanceCluster: lensPerformance.cluster,
18
+ webglRendererInfo: lensPerformance.webglRendererInfo,
19
+ };
20
+ const dimensions = new Map([["performance_cluster", lensPerformance.cluster.toString()]]);
21
+ for (const benchmark of lensPerformance.benchmarks) {
22
+ if (!reportableBenchmarks.includes(benchmark.name))
23
+ continue;
24
+ const benchmarkComplete = Object.assign(Object.assign({}, baseBenchmark), { benchmarkName: benchmark.name, benchmarkValue: benchmark.value });
25
+ metricsEventTarget.dispatchEvent(new TypedCustomEvent("benchmarkComplete", benchmarkComplete));
26
+ reporter.histogram(`benchmark.${benchmark.name}`, benchmark.value, dimensions);
27
+ }
28
+ }));
29
+ //# sourceMappingURL=reportBenchmarks.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"reportBenchmarks.js","sourceRoot":"","sources":["../../../src/metrics/reporters/reportBenchmarks.ts"],"names":[],"mappings":";AAAA,OAAO,EAA0B,kBAAkB,EAAE,MAAM,qBAAqB,CAAC;AACjF,OAAO,EAAE,UAAU,EAAE,MAAM,uCAAuC,CAAC;AACnE,OAAO,EAAE,gBAAgB,EAAE,MAAM,+BAA+B,CAAC;AAEjE,OAAO,EAAsB,yBAAyB,EAAE,MAAM,uBAAuB,CAAC;AACtF,OAAO,EAAE,gCAAgC,EAA8B,MAAM,+BAA+B,CAAC;AAE7G,8CAA8C;AAC9C,MAAM,oBAAoB,GAAG,CAAC,QAAQ,CAAC,CAAC;AAIxC,MAAM,CAAC,MAAM,gBAAgB,GAAG,UAAU,CACtC,kBAAkB,EAClB,CAAC,yBAAyB,CAAC,KAAK,EAAE,gCAAgC,CAAC,KAAK,EAAE,kBAAkB,CAAU,EACtG,CACI,kBAAsC,EACtC,QAAoC,EACpC,MAA8B,EAChC,EAAE;IACA,IAAI,MAAM,CAAC,eAAe,KAAK,SAAS;QAAE,OAAO;IACjD,uGAAuG;IACvG,6CAA6C;IAC7C,MAAM,eAAe,GAAG,MAAM,MAAM,CAAC,eAAe,CAAC;IACrD,MAAM,aAAa,GAAiF;QAChG,IAAI,EAAE,mBAAmB;QACzB,kBAAkB,EAAE,eAAe,CAAC,OAAO;QAC3C,iBAAiB,EAAE,eAAe,CAAC,iBAAiB;KACvD,CAAC;IACF,MAAM,UAAU,GAAG,IAAI,GAAG,CAAC,CAAC,CAAC,qBAAqB,EAAE,eAAe,CAAC,OAAO,CAAC,QAAQ,EAAE,CAAC,CAAC,CAAC,CAAC;IAC1F,KAAK,MAAM,SAAS,IAAI,eAAe,CAAC,UAAU,EAAE;QAChD,IAAI,CAAC,oBAAoB,CAAC,QAAQ,CAAC,SAAS,CAAC,IAAI,CAAC;YAAE,SAAS;QAC7D,MAAM,iBAAiB,mCAChB,aAAa,KAChB,aAAa,EAAE,SAAS,CAAC,IAAI,EAC7B,cAAc,EAAE,SAAS,CAAC,KAAK,GAClC,CAAC;QACF,kBAAkB,CAAC,aAAa,CAAC,IAAI,gBAAgB,CAAC,mBAAmB,EAAE,iBAAiB,CAAC,CAAC,CAAC;QAC/F,QAAQ,CAAC,SAAS,CAAC,aAAa,SAAS,CAAC,IAAI,EAAE,EAAE,SAAS,CAAC,KAAK,EAAE,UAAU,CAAC,CAAC;KAClF;AACL,CAAC,CAAA,CACJ,CAAC","sourcesContent":["import { CameraKitConfiguration, configurationToken } from \"../../configuration\";\nimport { Injectable } from \"../../dependency-injection/Injectable\";\nimport { TypedCustomEvent } from \"../../events/TypedCustomEvent\";\nimport { MakeTaggedBusinessEvent } from \"../businessEventsReporter\";\nimport { MetricsEventTarget, metricsEventTargetFactory } from \"../metricsEventTarget\";\nimport { operationalMetricReporterFactory, OperationalMetricsReporter } from \"../operationalMetricsReporter\";\n\n// Allowlist the benchmarks we wish to report.\nconst reportableBenchmarks = [\"gflops\"];\n\nexport type BenchmarkComplete = MakeTaggedBusinessEvent<\"benchmarkComplete\">;\n\nexport const reportBenchmarks = Injectable(\n \"reportBenchmarks\",\n [metricsEventTargetFactory.token, operationalMetricReporterFactory.token, configurationToken] as const,\n async (\n metricsEventTarget: MetricsEventTarget,\n reporter: OperationalMetricsReporter,\n config: CameraKitConfiguration\n ) => {\n if (config.lensPerformance === undefined) return;\n // Safety: config.lensPerformance cannot reject – all Promises contained in CameraKitConfiguration have\n // catch blocks which return a default value.\n const lensPerformance = await config.lensPerformance;\n const baseBenchmark: Pick<BenchmarkComplete, \"name\" | \"performanceCluster\" | \"webglRendererInfo\"> = {\n name: \"benchmarkComplete\",\n performanceCluster: lensPerformance.cluster,\n webglRendererInfo: lensPerformance.webglRendererInfo,\n };\n const dimensions = new Map([[\"performance_cluster\", lensPerformance.cluster.toString()]]);\n for (const benchmark of lensPerformance.benchmarks) {\n if (!reportableBenchmarks.includes(benchmark.name)) continue;\n const benchmarkComplete: BenchmarkComplete = {\n ...baseBenchmark,\n benchmarkName: benchmark.name,\n benchmarkValue: benchmark.value,\n };\n metricsEventTarget.dispatchEvent(new TypedCustomEvent(\"benchmarkComplete\", benchmarkComplete));\n reporter.histogram(`benchmark.${benchmark.name}`, benchmark.value, dimensions);\n }\n }\n);\n"]}
@@ -0,0 +1,19 @@
1
+ import { Observable } from "rxjs";
2
+ import { LogEntry } from "../../logger/logger";
3
+ import { LensState } from "../../session/lensState";
4
+ import { MetricsEventTarget } from "../metricsEventTarget";
5
+ import { OperationalMetricsReporter } from "../operationalMetricsReporter";
6
+ export declare function reportExceptionToBlizzard(logEntries: Observable<LogEntry>, metricsEventTarget: MetricsEventTarget, reporter: OperationalMetricsReporter, lensState?: LensState): void;
7
+ export interface GlobalExceptionReporter {
8
+ attachLensContext: (lensState: LensState) => void;
9
+ }
10
+ /**
11
+ * Reports log entries to Blizzard when there is no CameraKit session yet.
12
+ *
13
+ * @internal
14
+ */
15
+ export declare const reportGlobalException: {
16
+ (args_0: Observable<LogEntry>, args_1: MetricsEventTarget, args_2: OperationalMetricsReporter): GlobalExceptionReporter;
17
+ token: "reportGlobalException";
18
+ dependencies: readonly ["logEntries", "metricsEventTarget", "operationalMetricsReporter"];
19
+ };
@@ -0,0 +1,68 @@
1
+ import { isState } from "@snap/state-management";
2
+ import { filter, map, scan, Subject, takeUntil } from "rxjs";
3
+ import { entries } from "../../common/entries";
4
+ import { stringifyError } from "../../common/errorHelpers";
5
+ import { Injectable } from "../../dependency-injection/Injectable";
6
+ import { TypedCustomEvent } from "../../events/TypedCustomEvent";
7
+ import { logEntriesFactory } from "../../logger/logEntries";
8
+ import { logLevelMap } from "../../logger/logger";
9
+ import { metricsEventTargetFactory } from "../metricsEventTarget";
10
+ import { operationalMetricReporterFactory } from "../operationalMetricsReporter";
11
+ const logMethods = entries(logLevelMap).map(([level]) => level);
12
+ // How many log entries to include as the error context
13
+ const maxBufferedEntries = 15;
14
+ const contextSeparator = "\n\n----------------- Context -----------------\n\n";
15
+ const methodLength = logMethods.reduce((max, method) => Math.max(max, method.length), 0);
16
+ function getContextString(logEntry) {
17
+ const result = [];
18
+ for (const entry of logEntry) {
19
+ const time = entry.time.toISOString();
20
+ const method = entry.level.padStart(methodLength);
21
+ // TODO: improve pretty printing
22
+ const messages = entry.messages.map((m) => m + "").join(" ");
23
+ result.push(`${time} [${entry.module}] ${method}: ${messages}`);
24
+ }
25
+ return result.join("\n");
26
+ }
27
+ export function reportExceptionToBlizzard(logEntries, metricsEventTarget, reporter, lensState) {
28
+ logEntries
29
+ .pipe(scan((acc, recent) => ({
30
+ entries: [...acc.entries, recent].slice(-maxBufferedEntries),
31
+ recent,
32
+ }),
33
+ // Start with a dummy recent entry -- it gets overridden each time we handle a log entry.
34
+ { entries: [], recent: { time: new Date(), module: "any", level: "debug", messages: [] } }), filter(({ recent }) => recent.level === "error"), map(({ entries, recent }) => ({
35
+ context: entries,
36
+ error: recent.messages.find((e) => e instanceof Error),
37
+ })), filter(({ error }) => !!error))
38
+ .subscribe(({ error, context }) => {
39
+ const currentLensState = lensState === null || lensState === void 0 ? void 0 : lensState.getState();
40
+ const lensId = currentLensState && !isState(currentLensState, "noLensApplied") ? currentLensState.data.id : "none";
41
+ metricsEventTarget.dispatchEvent(new TypedCustomEvent("exception", {
42
+ name: "exception",
43
+ lensId,
44
+ type: error.name,
45
+ reason: `${stringifyError(error)}${contextSeparator}${getContextString(context)}`,
46
+ }));
47
+ reporter.count("handled_exception", 1, new Map([["type", error.name]]));
48
+ });
49
+ }
50
+ /**
51
+ * Reports log entries to Blizzard when there is no CameraKit session yet.
52
+ *
53
+ * @internal
54
+ */
55
+ export const reportGlobalException = Injectable("reportGlobalException", [logEntriesFactory.token, metricsEventTargetFactory.token, operationalMetricReporterFactory.token], (logEntries, metricsEventTarget, reporter) => {
56
+ // Initially we log exceptions without any lens context
57
+ const cancellationSubject = new Subject();
58
+ reportExceptionToBlizzard(logEntries.pipe(takeUntil(cancellationSubject)), metricsEventTarget, reporter);
59
+ // Later session scope reporter triggers cancellation of the global one
60
+ // and initiates exception reporting with a lens context
61
+ return {
62
+ attachLensContext: (lensState) => {
63
+ cancellationSubject.next();
64
+ reportExceptionToBlizzard(logEntries, metricsEventTarget, reporter, lensState);
65
+ },
66
+ };
67
+ });
68
+ //# sourceMappingURL=reportGlobalException.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"reportGlobalException.js","sourceRoot":"","sources":["../../../src/metrics/reporters/reportGlobalException.ts"],"names":[],"mappings":"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","sourcesContent":["import { isState } from \"@snap/state-management\";\nimport { filter, map, Observable, scan, Subject, takeUntil } from \"rxjs\";\nimport { entries } from \"../../common/entries\";\nimport { stringifyError } from \"../../common/errorHelpers\";\nimport { Injectable } from \"../../dependency-injection/Injectable\";\nimport { TypedCustomEvent } from \"../../events/TypedCustomEvent\";\nimport { logEntriesFactory } from \"../../logger/logEntries\";\nimport { LogEntry, logLevelMap } from \"../../logger/logger\";\nimport { LensState } from \"../../session/lensState\";\nimport { MetricsEventTarget, metricsEventTargetFactory } from \"../metricsEventTarget\";\nimport { operationalMetricReporterFactory, OperationalMetricsReporter } from \"../operationalMetricsReporter\";\n\nconst logMethods = entries(logLevelMap).map(([level]) => level);\n\n// How many log entries to include as the error context\nconst maxBufferedEntries = 15;\nconst contextSeparator = \"\\n\\n----------------- Context -----------------\\n\\n\";\nconst methodLength = logMethods.reduce((max, method) => Math.max(max, method.length), 0);\n\ninterface EntriesBuffer {\n entries: LogEntry[];\n recent: LogEntry;\n}\n\nfunction getContextString(logEntry: LogEntry[]) {\n const result = [];\n for (const entry of logEntry) {\n const time = entry.time.toISOString();\n const method = entry.level.padStart(methodLength);\n // TODO: improve pretty printing\n const messages = entry.messages.map((m) => m + \"\").join(\" \");\n result.push(`${time} [${entry.module}] ${method}: ${messages}`);\n }\n return result.join(\"\\n\");\n}\n\nexport function reportExceptionToBlizzard(\n logEntries: Observable<LogEntry>,\n metricsEventTarget: MetricsEventTarget,\n reporter: OperationalMetricsReporter,\n lensState?: LensState\n) {\n logEntries\n .pipe(\n scan<LogEntry, EntriesBuffer>(\n (acc, recent) => ({\n entries: [...acc.entries, recent].slice(-maxBufferedEntries),\n recent,\n }),\n // Start with a dummy recent entry -- it gets overridden each time we handle a log entry.\n { entries: [], recent: { time: new Date(), module: \"any\", level: \"debug\", messages: [] } }\n ),\n filter(({ recent }) => recent.level === \"error\"),\n map(({ entries, recent }) => ({\n context: entries,\n error: recent.messages.find((e) => e instanceof Error) as Error,\n })),\n filter(({ error }) => !!error)\n )\n .subscribe(({ error, context }) => {\n const currentLensState = lensState?.getState();\n const lensId =\n currentLensState && !isState(currentLensState, \"noLensApplied\") ? currentLensState.data.id : \"none\";\n metricsEventTarget.dispatchEvent(\n new TypedCustomEvent(\"exception\", {\n name: \"exception\",\n lensId,\n type: error.name,\n reason: `${stringifyError(error)}${contextSeparator}${getContextString(context)}`,\n })\n );\n reporter.count(\"handled_exception\", 1, new Map([[\"type\", error.name]]));\n });\n}\n\nexport interface GlobalExceptionReporter {\n attachLensContext: (lensState: LensState) => void;\n}\n\n/**\n * Reports log entries to Blizzard when there is no CameraKit session yet.\n *\n * @internal\n */\nexport const reportGlobalException = Injectable(\n \"reportGlobalException\",\n [logEntriesFactory.token, metricsEventTargetFactory.token, operationalMetricReporterFactory.token] as const,\n (\n logEntries: Observable<LogEntry>,\n metricsEventTarget: MetricsEventTarget,\n reporter: OperationalMetricsReporter\n ): GlobalExceptionReporter => {\n // Initially we log exceptions without any lens context\n const cancellationSubject = new Subject<void>();\n reportExceptionToBlizzard(logEntries.pipe(takeUntil(cancellationSubject)), metricsEventTarget, reporter);\n\n // Later session scope reporter triggers cancellation of the global one\n // and initiates exception reporting with a lens context\n return {\n attachLensContext: (lensState: LensState) => {\n cancellationSubject.next();\n reportExceptionToBlizzard(logEntries, metricsEventTarget, reporter, lensState);\n },\n };\n }\n);\n"]}
@@ -0,0 +1,17 @@
1
+ import { CofDimensions } from "../../remote-configuration/cofHandler";
2
+ import { Dimensions } from "../../handlers/requestStateEmittingHandler";
3
+ import { OperationalMetricsReporter } from "../operationalMetricsReporter";
4
+ import { AssetDownloadDimensions, LensDownloadDimensions } from "./reportLensAndAssetDownload";
5
+ declare global {
6
+ interface Navigator {
7
+ connection?: {
8
+ type?: "bluetooth" | "cellular" | "ethernet" | "none" | "wifi" | "wimax" | "other" | "unknown";
9
+ };
10
+ }
11
+ }
12
+ export declare const isRelevantRequest: (value: Dimensions) => value is CofDimensions | AssetDownloadDimensions | LensDownloadDimensions;
13
+ export declare const reportHttpMetrics: {
14
+ (args_0: OperationalMetricsReporter): void;
15
+ token: "reportHttpMetrics";
16
+ dependencies: readonly ["operationalMetricsReporter"];
17
+ };
@@ -0,0 +1,92 @@
1
+ import { assertUnreachable } from "../../common/assertions";
2
+ import { Injectable } from "../../dependency-injection/Injectable";
3
+ import { scan } from "../../events/scan";
4
+ import { COF_REQUEST_TYPE } from "../../remote-configuration/cofHandler";
5
+ import { requestStateEventTarget } from "../../handlers/requestStateEmittingHandler";
6
+ import { operationalMetricReporterFactory } from "../operationalMetricsReporter";
7
+ import { isLensOrAssetRequest } from "./reportLensAndAssetDownload";
8
+ const getContentType = (dimensions) => {
9
+ switch (dimensions.requestType) {
10
+ case "lens_content":
11
+ return "lens_content";
12
+ case "asset":
13
+ return dimensions.assetType;
14
+ case COF_REQUEST_TYPE:
15
+ return COF_REQUEST_TYPE;
16
+ default:
17
+ assertUnreachable(dimensions);
18
+ }
19
+ };
20
+ const getSizeKb = (event) => {
21
+ switch (event.type) {
22
+ case "started":
23
+ case "errored":
24
+ return 0;
25
+ case "completed":
26
+ return event.detail.sizeByte / 1024;
27
+ default:
28
+ assertUnreachable(event);
29
+ }
30
+ };
31
+ const getStatus = (event) => {
32
+ switch (event.type) {
33
+ case "started":
34
+ case "errored":
35
+ // We'll use status 0 to indicate that an exception occurred during the request. This is somewhat in keeping
36
+ // with browsers that set the response status to 0 if the request was not able to be made (e.g. CORs
37
+ // preflight failed, or the user canceled the request).
38
+ return "0";
39
+ case "completed":
40
+ return event.detail.status.toString();
41
+ default:
42
+ assertUnreachable(event);
43
+ }
44
+ };
45
+ export const isRelevantRequest = (value) => {
46
+ return isLensOrAssetRequest(value) || value["requestType"] === COF_REQUEST_TYPE;
47
+ };
48
+ export const reportHttpMetrics = Injectable("reportHttpMetrics", [operationalMetricReporterFactory.token], (reporter) => {
49
+ scan({ name: "inProgress", inProgress: new Map() })(requestStateEventTarget, ["started", "completed", "errored"], (state, event) => {
50
+ var _a, _b;
51
+ const { inProgress } = state;
52
+ const { dimensions, requestId, timeMs } = event.detail;
53
+ if (!isRelevantRequest(dimensions))
54
+ return state;
55
+ switch (event.type) {
56
+ case "started":
57
+ inProgress.set(requestId, { startTimeMs: timeMs });
58
+ return { name: "inProgress", inProgress };
59
+ case "completed":
60
+ case "errored":
61
+ const completedRequest = inProgress.get(requestId);
62
+ if (!completedRequest)
63
+ return state;
64
+ inProgress.delete(requestId);
65
+ const downloadTimeMs = timeMs - completedRequest.startTimeMs;
66
+ const downloadSizeKb = getSizeKb(event);
67
+ const status = getStatus(event);
68
+ const operationalDimensions = new Map([
69
+ ["content_type", getContentType(dimensions)],
70
+ ["network_type", (_b = (_a = navigator.connection) === null || _a === void 0 ? void 0 : _a.type) !== null && _b !== void 0 ? _b : "unknown"],
71
+ ["status", status],
72
+ ]);
73
+ return {
74
+ name: "completed",
75
+ inProgress: state.inProgress,
76
+ dimensions: operationalDimensions,
77
+ downloadSizeKb,
78
+ downloadTimeMs,
79
+ };
80
+ default:
81
+ assertUnreachable(event);
82
+ }
83
+ }).addEventListener("state", ({ detail: state }) => {
84
+ if (state.name !== "completed")
85
+ return;
86
+ const { dimensions, downloadTimeMs, downloadSizeKb } = state;
87
+ reporter.count("download_finished", 1, dimensions);
88
+ reporter.timer("download_latency", downloadTimeMs, dimensions);
89
+ reporter.histogram("download_size_kb", downloadSizeKb, dimensions);
90
+ });
91
+ });
92
+ //# sourceMappingURL=reportHttpMetrics.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"reportHttpMetrics.js","sourceRoot":"","sources":["../../../src/metrics/reporters/reportHttpMetrics.ts"],"names":[],"mappings":"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","sourcesContent":["import { assertUnreachable } from \"../../common/assertions\";\nimport { Injectable } from \"../../dependency-injection/Injectable\";\nimport { scan } from \"../../events/scan\";\nimport { CofDimensions, COF_REQUEST_TYPE } from \"../../remote-configuration/cofHandler\";\nimport { Dimensions, RequestStateEvents, requestStateEventTarget } from \"../../handlers/requestStateEmittingHandler\";\nimport { operationalMetricReporterFactory, OperationalMetricsReporter } from \"../operationalMetricsReporter\";\nimport { AssetDownloadDimensions, isLensOrAssetRequest, LensDownloadDimensions } from \"./reportLensAndAssetDownload\";\n\ndeclare global {\n interface Navigator {\n connection?: {\n // This currently has extremely limited support in browsers.\n // https://wicg.github.io/netinfo/#dom-networkinformation-type\n type?: \"bluetooth\" | \"cellular\" | \"ethernet\" | \"none\" | \"wifi\" | \"wimax\" | \"other\" | \"unknown\";\n };\n }\n}\n\ntype InProgressMap = Map<number, { startTimeMs: number }>;\ninterface InProgress {\n name: \"inProgress\";\n inProgress: InProgressMap;\n}\ninterface Completed {\n name: \"completed\";\n inProgress: InProgressMap;\n dimensions: Map<string, string>;\n downloadTimeMs: number;\n downloadSizeKb: number;\n}\ntype RequestState = InProgress | Completed;\n\nconst getContentType = (dimensions: LensDownloadDimensions | AssetDownloadDimensions | CofDimensions): string => {\n switch (dimensions.requestType) {\n case \"lens_content\":\n return \"lens_content\";\n case \"asset\":\n return dimensions.assetType;\n case COF_REQUEST_TYPE:\n return COF_REQUEST_TYPE;\n default:\n assertUnreachable(dimensions);\n }\n};\n\nconst getSizeKb = (event: RequestStateEvents): number => {\n switch (event.type) {\n case \"started\":\n case \"errored\":\n return 0;\n case \"completed\":\n return event.detail.sizeByte / 1024;\n default:\n assertUnreachable(event);\n }\n};\n\nconst getStatus = (event: RequestStateEvents): string => {\n switch (event.type) {\n case \"started\":\n case \"errored\":\n // We'll use status 0 to indicate that an exception occurred during the request. This is somewhat in keeping\n // with browsers that set the response status to 0 if the request was not able to be made (e.g. CORs\n // preflight failed, or the user canceled the request).\n return \"0\";\n case \"completed\":\n return event.detail.status.toString();\n default:\n assertUnreachable(event);\n }\n};\n\nexport const isRelevantRequest = (\n value: Dimensions\n): value is LensDownloadDimensions | AssetDownloadDimensions | CofDimensions => {\n return isLensOrAssetRequest(value) || value[\"requestType\"] === COF_REQUEST_TYPE;\n};\n\nexport const reportHttpMetrics = Injectable(\n \"reportHttpMetrics\",\n [operationalMetricReporterFactory.token] as const,\n (reporter: OperationalMetricsReporter) => {\n scan<RequestState>({ name: \"inProgress\", inProgress: new Map() })(\n requestStateEventTarget,\n [\"started\", \"completed\", \"errored\"],\n (state, event) => {\n const { inProgress } = state;\n const { dimensions, requestId, timeMs } = event.detail;\n\n if (!isRelevantRequest(dimensions)) return state;\n\n switch (event.type) {\n case \"started\":\n inProgress.set(requestId, { startTimeMs: timeMs });\n return { name: \"inProgress\", inProgress };\n case \"completed\":\n case \"errored\":\n const completedRequest = inProgress.get(requestId);\n if (!completedRequest) return state;\n inProgress.delete(requestId);\n\n const downloadTimeMs = timeMs - completedRequest.startTimeMs;\n const downloadSizeKb = getSizeKb(event);\n const status = getStatus(event);\n const operationalDimensions = new Map<string, string>([\n [\"content_type\", getContentType(dimensions)],\n [\"network_type\", navigator.connection?.type ?? \"unknown\"],\n [\"status\", status],\n ]);\n\n return {\n name: \"completed\",\n inProgress: state.inProgress,\n dimensions: operationalDimensions,\n downloadSizeKb,\n downloadTimeMs,\n };\n default:\n assertUnreachable(event);\n }\n }\n ).addEventListener(\"state\", ({ detail: state }) => {\n if (state.name !== \"completed\") return;\n\n const { dimensions, downloadTimeMs, downloadSizeKb } = state;\n\n reporter.count(\"download_finished\", 1, dimensions);\n reporter.timer(\"download_latency\", downloadTimeMs, dimensions);\n reporter.histogram(\"download_size_kb\", downloadSizeKb, dimensions);\n });\n }\n);\n"]}
@@ -0,0 +1,15 @@
1
+ import { MakeTaggedBusinessEvent } from "../businessEventsReporter";
2
+ import { MetricsEventTarget } from "../metricsEventTarget";
3
+ import { OperationalMetricsReporter } from "../operationalMetricsReporter";
4
+ /**
5
+ * The LegalPrompt metric reports each time a BIPA legal prompt is shown.
6
+ */
7
+ export declare type LegalPrompt = MakeTaggedBusinessEvent<"legalPrompt">;
8
+ /**
9
+ * @internal
10
+ */
11
+ export declare const reportLegalState: {
12
+ (args_0: import("@snap/state-management").StateMachine<import("@snap/state-management").Action<"requestLegalPrompt", undefined> | import("@snap/state-management").Action<"accept", string> | import("@snap/state-management").Action<"reject", string>, import("@snap/state-management").State<"unknown", undefined> | import("@snap/state-management").State<"accepted", undefined> | import("@snap/state-management").State<"rejected", undefined>>, args_1: MetricsEventTarget, args_2: OperationalMetricsReporter): void;
13
+ token: "reportLegalState";
14
+ dependencies: readonly ["legalState", "metricsEventTarget", "operationalMetricsReporter"];
15
+ };
@@ -0,0 +1,34 @@
1
+ import { forActions } from "@snap/state-management";
2
+ import { map } from "rxjs";
3
+ import { Injectable } from "../../dependency-injection/Injectable";
4
+ import { TypedCustomEvent } from "../../events/TypedCustomEvent";
5
+ import { CameraKitLegalPromptResult } from "../../generated-proto/blizzard/cameraKitEvents";
6
+ import { legalStateFactory } from "../../legal/legalState";
7
+ import { metricsEventTargetFactory } from "../metricsEventTarget";
8
+ import { operationalMetricReporterFactory } from "../operationalMetricsReporter";
9
+ /**
10
+ * @internal
11
+ */
12
+ export const reportLegalState = Injectable("reportLegalState", [legalStateFactory.token, metricsEventTargetFactory.token, operationalMetricReporterFactory.token], (legalState, metricsEventTarget, operationalMetricsReporter) => {
13
+ legalState.events
14
+ .pipe(forActions("accept", "reject"), map(([{ data, name }]) => ({
15
+ name: "legalPrompt",
16
+ legalPromptId: data,
17
+ legalPromptResult: name === "accept"
18
+ ? CameraKitLegalPromptResult.CAMERA_KIT_LEGAL_PROMPT_ACCEPTED
19
+ : CameraKitLegalPromptResult.CAMERA_KIT_LEGAL_PROMPT_DISMISSED,
20
+ })))
21
+ .subscribe({
22
+ next: (legalPromptEvent) => {
23
+ metricsEventTarget.dispatchEvent(new TypedCustomEvent("legalPrompt", legalPromptEvent));
24
+ operationalMetricsReporter.count("legal_prompt_interaction", 1, new Map([
25
+ [
26
+ "accepted",
27
+ (legalPromptEvent.legalPromptResult ===
28
+ CameraKitLegalPromptResult.CAMERA_KIT_LEGAL_PROMPT_ACCEPTED).toString(),
29
+ ],
30
+ ]));
31
+ },
32
+ });
33
+ });
34
+ //# sourceMappingURL=reportLegalState.js.map