@snap/camera-kit 0.15.1 → 0.17.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 (418) hide show
  1. package/LICENSE.md +139 -3873
  2. package/README.md +3 -3
  3. package/docs/html/assets/main.js +4 -3
  4. package/docs/html/assets/navigation.js +1 -0
  5. package/docs/html/assets/search.js +1 -1
  6. package/docs/html/assets/style.css +72 -25
  7. package/docs/html/classes/CameraKit.html +11 -196
  8. package/docs/html/classes/CameraKitSession.html +43 -366
  9. package/docs/html/classes/CameraKitSource.html +14 -223
  10. package/docs/html/classes/LensPerformanceMeasurement.html +9 -184
  11. package/docs/html/classes/LensPerformanceMetrics.html +7 -148
  12. package/docs/html/classes/LensRepository.html +17 -234
  13. package/docs/html/classes/Transform2D.html +7 -176
  14. package/docs/html/classes/TypedCustomEvent.html +4 -178
  15. package/docs/html/classes/TypedEventTarget.html +4 -209
  16. package/docs/html/enums/Lens_CameraFacing.html +5 -0
  17. package/docs/html/enums/UserData_Zodiac.html +15 -0
  18. package/docs/html/functions/ConcatInjectable.html +10 -193
  19. package/docs/html/functions/Injectable.html +9 -192
  20. package/docs/html/functions/bootstrapCameraKit.html +6 -147
  21. package/docs/html/functions/createExtension.html +6 -123
  22. package/docs/html/functions/createImageSource.html +4 -130
  23. package/docs/html/functions/createMediaStreamSource.html +4 -130
  24. package/docs/html/functions/createVideoSource.html +4 -130
  25. package/docs/html/functions/estimateLensPerformance.html +3 -120
  26. package/docs/html/functions/lensSourcesFactory.html +6 -127
  27. package/docs/html/functions/remoteApiServicesFactory.html +3 -121
  28. package/docs/html/hierarchy.html +1 -0
  29. package/docs/html/index.html +8 -165
  30. package/docs/html/interfaces/CameraKitBootstrapConfiguration.html +11 -192
  31. package/docs/html/interfaces/CameraKitDeviceOptions.html +11 -0
  32. package/docs/html/interfaces/CameraKitSourceInfo.html +9 -0
  33. package/docs/html/interfaces/CameraKitSourceSubscriber.html +3 -194
  34. package/docs/html/interfaces/ComputedFrameMetrics.html +2 -150
  35. package/docs/html/interfaces/CreateSessionOptions.html +5 -148
  36. package/docs/html/interfaces/EstimatedLensPerformance.html +3 -146
  37. package/docs/html/interfaces/FunctionSourceOptions.html +7 -0
  38. package/docs/html/interfaces/Lens.html +12 -205
  39. package/docs/html/interfaces/LensCreator.html +3 -0
  40. package/docs/html/interfaces/LensLaunchData.html +3 -179
  41. package/docs/html/interfaces/LensSource.html +3 -172
  42. package/docs/html/interfaces/LoadAssetRequest.html +13 -0
  43. package/docs/html/interfaces/MediaStreamSourceOptions.html +16 -138
  44. package/docs/html/interfaces/Preview.html +4 -141
  45. package/docs/html/interfaces/RemoteApiRequest.html +7 -162
  46. package/docs/html/interfaces/RemoteApiResponse.html +6 -155
  47. package/docs/html/interfaces/RemoteApiService.html +9 -171
  48. package/docs/html/interfaces/Snapcode.html +5 -148
  49. package/docs/html/interfaces/UriCancelRequest.html +2 -138
  50. package/docs/html/interfaces/UriRequest.html +2 -154
  51. package/docs/html/interfaces/UriResponse.html +2 -150
  52. package/docs/html/interfaces/VideoSourceOptions.html +15 -134
  53. package/docs/html/modules.html +57 -175
  54. package/docs/html/types/AssetLoader.html +5 -132
  55. package/docs/html/types/AssetResponse.html +1 -0
  56. package/docs/html/types/AssetTiming.html +2 -115
  57. package/docs/html/types/BenchmarkError.html +1 -112
  58. package/docs/html/types/BootstrapError.html +2 -115
  59. package/docs/html/types/CacheKeyNotFoundError.html +1 -112
  60. package/docs/html/types/CameraKitSessionEventListener.html +2 -115
  61. package/docs/html/types/CameraKitSessionEvents.html +2 -122
  62. package/docs/html/types/CameraKitSourceError.html +1 -112
  63. package/docs/html/types/ConfigurationError.html +2 -115
  64. package/docs/html/types/FetchHandler.html +1 -0
  65. package/docs/html/types/Keyboard.html +14 -194
  66. package/docs/html/types/KeyboardEvents.html +2 -124
  67. package/docs/html/types/LegalError.html +1 -112
  68. package/docs/html/types/LensAbortError.html +2 -115
  69. package/docs/html/types/LensAssetError.html +2 -115
  70. package/docs/html/types/LensContentValidationError.html +1 -112
  71. package/docs/html/types/LensError.html +1 -112
  72. package/docs/html/types/LensExecutionError.html +2 -115
  73. package/docs/html/types/LensImagePickerError.html +2 -115
  74. package/docs/html/types/LensLaunchParams.html +2 -0
  75. package/docs/html/types/LensMetricsEvents.html +2 -115
  76. package/docs/html/types/LensPerformanceCluster.html +1 -113
  77. package/docs/html/types/LensView.html +2 -115
  78. package/docs/html/types/LensWait.html +2 -115
  79. package/docs/html/types/Matrix.html +3 -0
  80. package/docs/html/types/PersistentStoreError.html +2 -115
  81. package/docs/html/types/PlatformNotSupportedError.html +2 -115
  82. package/docs/html/types/PublicContainer.html +2 -115
  83. package/docs/html/types/PublicServices.html +2 -0
  84. package/docs/html/types/RemoteApiCancelRequestHandler.html +2 -0
  85. package/docs/html/types/RemoteApiRequestHandler.html +2 -139
  86. package/docs/html/types/RemoteApiServices.html +1 -112
  87. package/docs/html/types/RemoteApiStatus.html +2 -115
  88. package/docs/html/types/RenderTarget.html +2 -115
  89. package/docs/html/types/Uri.html +1 -112
  90. package/docs/html/types/WebGLError.html +1 -112
  91. package/docs/html/variables/extensionRequestContext.html +2 -115
  92. package/docs/md/README.md +3 -3
  93. package/docs/md/classes/CameraKit.md +15 -15
  94. package/docs/md/classes/CameraKitSession.md +38 -38
  95. package/docs/md/classes/CameraKitSource.md +22 -30
  96. package/docs/md/classes/LensPerformanceMeasurement.md +10 -6
  97. package/docs/md/classes/LensPerformanceMetrics.md +2 -2
  98. package/docs/md/classes/LensRepository.md +18 -18
  99. package/docs/md/classes/Transform2D.md +7 -3
  100. package/docs/md/classes/TypedCustomEvent.md +10 -6
  101. package/docs/md/classes/TypedEventTarget.md +12 -8
  102. package/docs/md/enums/Lens_CameraFacing.md +36 -0
  103. package/docs/md/enums/UserData_Zodiac.md +106 -0
  104. package/docs/md/interfaces/CameraKitBootstrapConfiguration.md +2 -2
  105. package/docs/md/interfaces/CameraKitDeviceOptions.md +41 -0
  106. package/docs/md/interfaces/CameraKitSourceInfo.md +43 -0
  107. package/docs/md/interfaces/CameraKitSourceSubscriber.md +7 -7
  108. package/docs/md/interfaces/ComputedFrameMetrics.md +1 -1
  109. package/docs/md/interfaces/CreateSessionOptions.md +1 -1
  110. package/docs/md/interfaces/EstimatedLensPerformance.md +1 -1
  111. package/docs/md/interfaces/FunctionSourceOptions.md +22 -0
  112. package/docs/md/interfaces/Lens.md +4 -4
  113. package/docs/md/interfaces/LensCreator.md +17 -0
  114. package/docs/md/interfaces/LensLaunchData.md +6 -6
  115. package/docs/md/interfaces/LensSource.md +5 -5
  116. package/docs/md/interfaces/LoadAssetRequest.md +49 -0
  117. package/docs/md/interfaces/MediaStreamSourceOptions.md +46 -1
  118. package/docs/md/interfaces/Preview.md +1 -1
  119. package/docs/md/interfaces/RemoteApiRequest.md +2 -2
  120. package/docs/md/interfaces/RemoteApiResponse.md +2 -2
  121. package/docs/md/interfaces/RemoteApiService.md +1 -1
  122. package/docs/md/interfaces/Snapcode.md +1 -1
  123. package/docs/md/interfaces/UriCancelRequest.md +2 -2
  124. package/docs/md/interfaces/UriRequest.md +3 -3
  125. package/docs/md/interfaces/UriResponse.md +2 -2
  126. package/docs/md/interfaces/VideoSourceOptions.md +44 -1
  127. package/docs/md/modules.md +183 -201
  128. package/lib/CameraKit.d.ts +108 -108
  129. package/lib/CameraKit.js +1 -1
  130. package/lib/CameraKit.js.map +1 -1
  131. package/lib/bootstrapCameraKit.d.ts +4 -4
  132. package/lib/bootstrapCameraKit.js +21 -20
  133. package/lib/bootstrapCameraKit.js.map +1 -1
  134. package/lib/clients/createTsProtoClient.d.ts +5 -12
  135. package/lib/clients/createTsProtoClient.js +1 -2
  136. package/lib/clients/createTsProtoClient.js.map +1 -1
  137. package/lib/clients/grpcHandler.d.ts +7 -4
  138. package/lib/clients/grpcHandler.js +8 -5
  139. package/lib/clients/grpcHandler.js.map +1 -1
  140. package/lib/clients/lensesClient.d.ts +3 -3
  141. package/lib/clients/lensesClient.js +2 -2
  142. package/lib/clients/lensesClient.js.map +1 -1
  143. package/lib/clients/metricsClient.d.ts +26 -0
  144. package/lib/clients/metricsClient.js +120 -0
  145. package/lib/clients/metricsClient.js.map +1 -0
  146. package/lib/configuration.js +1 -1
  147. package/lib/configuration.js.map +1 -1
  148. package/lib/dependency-injection/Container.d.ts +1 -1
  149. package/lib/dependency-injection/Container.js +1 -1
  150. package/lib/dependency-injection/Container.js.map +1 -1
  151. package/lib/dependency-injection/Injectable.d.ts +6 -6
  152. package/lib/dependency-injection/Injectable.js.map +1 -1
  153. package/lib/dependency-injection/RootServices.d.ts +7 -8
  154. package/lib/dependency-injection/RootServices.js.map +1 -1
  155. package/lib/environment.d.ts +4 -0
  156. package/lib/environment.js +2 -0
  157. package/lib/environment.js.map +1 -0
  158. package/lib/extensions/RemoteApiServices.d.ts +2 -2
  159. package/lib/extensions/RemoteApiServices.js +11 -6
  160. package/lib/extensions/RemoteApiServices.js.map +1 -1
  161. package/lib/extensions/uriHandlersRegister.d.ts +4 -4
  162. package/lib/extensions/uriHandlersRegister.js +6 -6
  163. package/lib/extensions/uriHandlersRegister.js.map +1 -1
  164. package/lib/generated-proto/blizzard/cameraKitEvents.d.ts +4330 -678
  165. package/lib/generated-proto/blizzard/cameraKitEvents.js +515 -72
  166. package/lib/generated-proto/blizzard/cameraKitEvents.js.map +1 -1
  167. package/lib/generated-proto/pb_schema/camera_kit/v3/business_events.d.ts +3 -11
  168. package/lib/generated-proto/pb_schema/camera_kit/v3/business_events.js +6 -156
  169. package/lib/generated-proto/pb_schema/camera_kit/v3/business_events.js.map +1 -1
  170. package/lib/generated-proto/pb_schema/camera_kit/v3/export.d.ts +19 -19
  171. package/lib/generated-proto/pb_schema/camera_kit/v3/export.js +13 -27
  172. package/lib/generated-proto/pb_schema/camera_kit/v3/export.js.map +1 -1
  173. package/lib/generated-proto/pb_schema/camera_kit/v3/legal_prompt.d.ts +0 -6
  174. package/lib/generated-proto/pb_schema/camera_kit/v3/legal_prompt.js +2 -83
  175. package/lib/generated-proto/pb_schema/camera_kit/v3/legal_prompt.js.map +1 -1
  176. package/lib/generated-proto/pb_schema/camera_kit/v3/lens.d.ts +0 -22
  177. package/lib/generated-proto/pb_schema/camera_kit/v3/lens.js +0 -263
  178. package/lib/generated-proto/pb_schema/camera_kit/v3/lens.js.map +1 -1
  179. package/lib/generated-proto/pb_schema/camera_kit/v3/operational_metrics.d.ts +30 -34
  180. package/lib/generated-proto/pb_schema/camera_kit/v3/operational_metrics.js +7 -73
  181. package/lib/generated-proto/pb_schema/camera_kit/v3/operational_metrics.js.map +1 -1
  182. package/lib/generated-proto/pb_schema/camera_kit/v3/ranking.d.ts +0 -6
  183. package/lib/generated-proto/pb_schema/camera_kit/v3/ranking.js +0 -110
  184. package/lib/generated-proto/pb_schema/camera_kit/v3/ranking.js.map +1 -1
  185. package/lib/generated-proto/pb_schema/camera_kit/v3/service.d.ts +48 -114
  186. package/lib/generated-proto/pb_schema/camera_kit/v3/service.js +0 -225
  187. package/lib/generated-proto/pb_schema/camera_kit/v3/service.js.map +1 -1
  188. package/lib/generated-proto/pb_schema/cdp/cof/benchmark.d.ts +6 -6
  189. package/lib/generated-proto/pb_schema/cdp/cof/benchmark.js +5 -19
  190. package/lib/generated-proto/pb_schema/cdp/cof/benchmark.js.map +1 -1
  191. package/lib/generated-proto/pb_schema/cdp/cof/circumstance_service.d.ts +1422 -1422
  192. package/lib/generated-proto/pb_schema/cdp/cof/config_request.d.ts +12 -12
  193. package/lib/generated-proto/pb_schema/cdp/cof/config_request.js +10 -24
  194. package/lib/generated-proto/pb_schema/cdp/cof/config_request.js.map +1 -1
  195. package/lib/generated-proto/pb_schema/cdp/cof/config_response.d.ts +207 -207
  196. package/lib/generated-proto/pb_schema/cdp/cof/config_result.d.ts +530 -530
  197. package/lib/generated-proto/pb_schema/cdp/cof/config_result.js +10 -24
  198. package/lib/generated-proto/pb_schema/cdp/cof/config_result.js.map +1 -1
  199. package/lib/generated-proto/pb_schema/common/value.d.ts +6 -6
  200. package/lib/generated-proto/pb_schema/common/value.js +4 -18
  201. package/lib/generated-proto/pb_schema/common/value.js.map +1 -1
  202. package/lib/generated-proto/pb_schema/google/api/http.d.ts +0 -6
  203. package/lib/generated-proto/pb_schema/google/api/http.js +0 -77
  204. package/lib/generated-proto/pb_schema/google/api/http.js.map +1 -1
  205. package/lib/generated-proto/pb_schema/google/protobuf/any.d.ts +0 -2
  206. package/lib/generated-proto/pb_schema/google/protobuf/any.js +0 -44
  207. package/lib/generated-proto/pb_schema/google/protobuf/any.js.map +1 -1
  208. package/lib/generated-proto/pb_schema/google/protobuf/descriptor.d.ts +4830 -4896
  209. package/lib/generated-proto/pb_schema/google/protobuf/descriptor.js +10 -997
  210. package/lib/generated-proto/pb_schema/google/protobuf/descriptor.js.map +1 -1
  211. package/lib/generated-proto/pb_schema/google/protobuf/timestamp.d.ts +3 -5
  212. package/lib/generated-proto/pb_schema/google/protobuf/timestamp.js +6 -35
  213. package/lib/generated-proto/pb_schema/google/protobuf/timestamp.js.map +1 -1
  214. package/lib/generated-proto/pb_schema/google/protobuf/wrappers.d.ts +6 -6
  215. package/lib/generated-proto/pb_schema/google/protobuf/wrappers.js +10 -24
  216. package/lib/generated-proto/pb_schema/google/protobuf/wrappers.js.map +1 -1
  217. package/lib/generated-proto/pb_schema/lenses/launchdata.d.ts +9 -9
  218. package/lib/generated-proto/pb_schema/lenses/remote_api/remote_api_service.d.ts +11 -11
  219. package/lib/generated-proto/pb_schema/lenses/remote_api/remote_api_service.js +6 -20
  220. package/lib/generated-proto/pb_schema/lenses/remote_api/remote_api_service.js.map +1 -1
  221. package/lib/generated-proto/pb_schema/lenses/snappable.d.ts +42 -42
  222. package/lib/generated-proto/pb_schema/lenses/snappable.js +14 -28
  223. package/lib/generated-proto/pb_schema/lenses/snappable.js.map +1 -1
  224. package/lib/generated-proto/pb_schema/lenses/user_data.d.ts +8 -8
  225. package/lib/generated-proto/pb_schema/lenses/user_data.js +8 -22
  226. package/lib/generated-proto/pb_schema/lenses/user_data.js.map +1 -1
  227. package/lib/handlers/defaultFetchHandler.d.ts +1 -1
  228. package/lib/handlers/defaultFetchHandler.js.map +1 -1
  229. package/lib/handlers/requestStateEmittingHandler.d.ts +5 -6
  230. package/lib/handlers/requestStateEmittingHandler.js +6 -8
  231. package/lib/handlers/requestStateEmittingHandler.js.map +1 -1
  232. package/lib/handlers/responseCachingHandler.d.ts +9 -10
  233. package/lib/handlers/responseCachingHandler.js +9 -3
  234. package/lib/handlers/responseCachingHandler.js.map +1 -1
  235. package/lib/handlers/utils.d.ts +12 -0
  236. package/lib/handlers/utils.js +19 -0
  237. package/lib/handlers/utils.js.map +1 -0
  238. package/lib/index.d.ts +21 -15
  239. package/lib/index.js +17 -12
  240. package/lib/index.js.map +1 -1
  241. package/lib/lens/Lens.d.ts +12 -2
  242. package/lib/lens/Lens.js +5 -0
  243. package/lib/lens/Lens.js.map +1 -1
  244. package/lib/lens/LensLaunchData.d.ts +6 -3
  245. package/lib/lens/LensLaunchData.js +2 -0
  246. package/lib/lens/LensLaunchData.js.map +1 -1
  247. package/lib/lens/LensPersistenceStore.d.ts +1 -1
  248. package/lib/lens/LensPersistenceStore.js +1 -1
  249. package/lib/lens/LensPersistenceStore.js.map +1 -1
  250. package/lib/lens/LensRepository.d.ts +5 -1
  251. package/lib/lens/LensRepository.js +9 -5
  252. package/lib/lens/LensRepository.js.map +1 -1
  253. package/lib/lens/LensSource.d.ts +2 -2
  254. package/lib/lens/LensSource.js +4 -4
  255. package/lib/lens/LensSource.js.map +1 -1
  256. package/lib/lens/assets/LensAssetRepository.d.ts +35 -4
  257. package/lib/lens/assets/LensAssetRepository.js +9 -9
  258. package/lib/lens/assets/LensAssetRepository.js.map +1 -1
  259. package/lib/lens/assets/LensAssetsProvider.d.ts +1 -1
  260. package/lib/lens/assets/LensAssetsProvider.js +9 -4
  261. package/lib/lens/assets/LensAssetsProvider.js.map +1 -1
  262. package/lib/lens/assets/deviceDependentAssetLoader.js +3 -2
  263. package/lib/lens/assets/deviceDependentAssetLoader.js.map +1 -1
  264. package/lib/lens/assets/remoteMediaAssetLoaderFactory.js +4 -3
  265. package/lib/lens/assets/remoteMediaAssetLoaderFactory.js.map +1 -1
  266. package/lib/lens/assets/staticAssetLoader.js +5 -4
  267. package/lib/lens/assets/staticAssetLoader.js.map +1 -1
  268. package/lib/lens/cameraKitLensSource.d.ts +3 -2
  269. package/lib/lens/cameraKitLensSource.js +87 -42
  270. package/lib/lens/cameraKitLensSource.js.map +1 -1
  271. package/lib/lens/fetchWatermarkLens.d.ts +11 -0
  272. package/lib/lens/fetchWatermarkLens.js +27 -0
  273. package/lib/lens/fetchWatermarkLens.js.map +1 -0
  274. package/lib/lens-client-interface/imagePicker.d.ts +2 -1
  275. package/lib/lens-client-interface/imagePicker.js.map +1 -1
  276. package/lib/lens-client-interface/lensClientInterface.d.ts +1 -1
  277. package/lib/lens-client-interface/lensClientInterface.js +1 -1
  278. package/lib/lens-client-interface/lensClientInterface.js.map +1 -1
  279. package/lib/lens-core-module/lensCore.d.ts +2 -1
  280. package/lib/lens-core-module/lensCore.js.map +1 -1
  281. package/lib/lens-core-module/loader/bootstrapURLs.d.ts +12 -0
  282. package/lib/lens-core-module/loader/bootstrapURLs.js +48 -0
  283. package/lib/lens-core-module/loader/bootstrapURLs.js.map +1 -0
  284. package/lib/lens-core-module/loader/lensCoreFactory.d.ts +0 -12
  285. package/lib/lens-core-module/loader/lensCoreFactory.js +4 -49
  286. package/lib/lens-core-module/loader/lensCoreFactory.js.map +1 -1
  287. package/lib/lensCoreWasmVersions.d.ts +6 -0
  288. package/lib/lensCoreWasmVersions.js +6 -0
  289. package/lib/lensCoreWasmVersions.js.map +1 -0
  290. package/lib/media-sources/CameraKitSource.d.ts +39 -17
  291. package/lib/media-sources/CameraKitSource.js +8 -2
  292. package/lib/media-sources/CameraKitSource.js.map +1 -1
  293. package/lib/media-sources/FunctionSource.d.ts +15 -4
  294. package/lib/media-sources/FunctionSource.js +1 -2
  295. package/lib/media-sources/FunctionSource.js.map +1 -1
  296. package/lib/media-sources/ImageSource.d.ts +3 -5
  297. package/lib/media-sources/ImageSource.js +1 -3
  298. package/lib/media-sources/ImageSource.js.map +1 -1
  299. package/lib/media-sources/MediaStreamSource.d.ts +17 -33
  300. package/lib/media-sources/MediaStreamSource.js +6 -41
  301. package/lib/media-sources/MediaStreamSource.js.map +1 -1
  302. package/lib/media-sources/VideoSource.d.ts +14 -10
  303. package/lib/media-sources/VideoSource.js +5 -11
  304. package/lib/media-sources/VideoSource.js.map +1 -1
  305. package/lib/metrics/businessEventsReporter.d.ts +3 -4
  306. package/lib/metrics/businessEventsReporter.js +11 -55
  307. package/lib/metrics/businessEventsReporter.js.map +1 -1
  308. package/lib/metrics/operational/Count.d.ts +2 -0
  309. package/lib/metrics/operational/Count.js +6 -1
  310. package/lib/metrics/operational/Count.js.map +1 -1
  311. package/lib/metrics/operational/Histogram.d.ts +1 -1
  312. package/lib/metrics/operational/Histogram.js +7 -3
  313. package/lib/metrics/operational/Histogram.js.map +1 -1
  314. package/lib/metrics/operational/Metric.js +2 -0
  315. package/lib/metrics/operational/Metric.js.map +1 -1
  316. package/lib/metrics/operational/Timer.d.ts +9 -6
  317. package/lib/metrics/operational/Timer.js +12 -26
  318. package/lib/metrics/operational/Timer.js.map +1 -1
  319. package/lib/metrics/reporters/reportBenchmarks.d.ts +3 -3
  320. package/lib/metrics/reporters/reportBenchmarks.js +6 -5
  321. package/lib/metrics/reporters/reportBenchmarks.js.map +1 -1
  322. package/lib/metrics/reporters/reportGlobalException.d.ts +4 -4
  323. package/lib/metrics/reporters/reportGlobalException.js +13 -11
  324. package/lib/metrics/reporters/reportGlobalException.js.map +1 -1
  325. package/lib/metrics/reporters/reportHttpMetrics.d.ts +3 -3
  326. package/lib/metrics/reporters/reportHttpMetrics.js +19 -16
  327. package/lib/metrics/reporters/reportHttpMetrics.js.map +1 -1
  328. package/lib/metrics/reporters/reportLegalState.d.ts +3 -3
  329. package/lib/metrics/reporters/reportLegalState.js +7 -9
  330. package/lib/metrics/reporters/reportLegalState.js.map +1 -1
  331. package/lib/metrics/reporters/reportLensAndAssetDownload.d.ts +3 -3
  332. package/lib/metrics/reporters/reportLensAndAssetDownload.js +12 -12
  333. package/lib/metrics/reporters/reportLensAndAssetDownload.js.map +1 -1
  334. package/lib/metrics/reporters/reportLensView.d.ts +3 -3
  335. package/lib/metrics/reporters/reportLensView.js +6 -6
  336. package/lib/metrics/reporters/reportLensView.js.map +1 -1
  337. package/lib/metrics/reporters/reportLensWait.d.ts +2 -3
  338. package/lib/metrics/reporters/reportLensWait.js +1 -3
  339. package/lib/metrics/reporters/reportLensWait.js.map +1 -1
  340. package/lib/metrics/reporters/reportPlatformCapabilities.d.ts +3 -3
  341. package/lib/metrics/reporters/reportPlatformCapabilities.js +6 -5
  342. package/lib/metrics/reporters/reportPlatformCapabilities.js.map +1 -1
  343. package/lib/metrics/reporters/reportUserSession.js +3 -3
  344. package/lib/metrics/reporters/reportUserSession.js.map +1 -1
  345. package/lib/metrics/reporters/reporters.d.ts +2 -2
  346. package/lib/namedErrors.d.ts +1 -1
  347. package/lib/namedErrors.js +1 -1
  348. package/lib/namedErrors.js.map +1 -1
  349. package/lib/observable-operators/unsubscribed.d.ts +1 -1
  350. package/lib/observable-operators/unsubscribed.js +1 -1
  351. package/lib/observable-operators/unsubscribed.js.map +1 -1
  352. package/lib/platform/platformCapabilities.d.ts +1 -1
  353. package/lib/platform/platformCapabilities.js +9 -3
  354. package/lib/platform/platformCapabilities.js.map +1 -1
  355. package/lib/platform/platformInfo.d.ts +1 -0
  356. package/lib/platform/platformInfo.js +3 -3
  357. package/lib/platform/platformInfo.js.map +1 -1
  358. package/lib/remote-configuration/cofHandler.d.ts +3 -3
  359. package/lib/remote-configuration/cofHandler.js +6 -4
  360. package/lib/remote-configuration/cofHandler.js.map +1 -1
  361. package/lib/remote-configuration/preloadConfiguration.d.ts +1 -1
  362. package/lib/remote-configuration/preloadConfiguration.js +9 -4
  363. package/lib/remote-configuration/preloadConfiguration.js.map +1 -1
  364. package/lib/remote-configuration/remoteConfiguration.d.ts +7 -6
  365. package/lib/remote-configuration/remoteConfiguration.js +18 -15
  366. package/lib/remote-configuration/remoteConfiguration.js.map +1 -1
  367. package/lib/session/CameraKitSession.d.ts +8 -8
  368. package/lib/session/CameraKitSession.js +11 -9
  369. package/lib/session/CameraKitSession.js.map +1 -1
  370. package/lib/session/LensKeyboard.d.ts +1 -7
  371. package/lib/session/LensKeyboard.js.map +1 -1
  372. package/lib/session/LensPerformanceMeasurement.d.ts +1 -1
  373. package/lib/session/LensPerformanceMeasurement.js +3 -3
  374. package/lib/session/LensPerformanceMeasurement.js.map +1 -1
  375. package/lib/session/LensPerformanceMetrics.d.ts +1 -1
  376. package/lib/session/LensPerformanceMetrics.js.map +1 -1
  377. package/lib/session/lensState.d.ts +5 -4
  378. package/lib/session/lensState.js +80 -57
  379. package/lib/session/lensState.js.map +1 -1
  380. package/lib/transforms/Transform2D.d.ts +8 -3
  381. package/lib/transforms/Transform2D.js +1 -1
  382. package/lib/transforms/Transform2D.js.map +1 -1
  383. package/lib/utils.d.ts +3 -0
  384. package/lib/utils.js +4 -0
  385. package/lib/utils.js.map +1 -0
  386. package/package.json +27 -6
  387. package/docs/html/functions/createUserMediaSource.html +0 -138
  388. package/docs/html/functions/getRequiredBootstrapURLs.html +0 -130
  389. package/docs/html/types/CameraKitDeviceInfo.html +0 -125
  390. package/docs/html/types/CameraKitDeviceOptions.html +0 -120
  391. package/docs/html/types/CameraKitSourceInfo.html +0 -112
  392. package/docs/html/types/CameraKitSourceOptions.html +0 -118
  393. package/lib/common/index.d.ts +0 -2
  394. package/lib/common/index.js +0 -3
  395. package/lib/common/index.js.map +0 -1
  396. package/lib/environment.json +0 -1
  397. package/lib/handlers/index.d.ts +0 -2
  398. package/lib/handlers/index.js +0 -3
  399. package/lib/handlers/index.js.map +0 -1
  400. package/lib/lens-core-module/index.d.ts +0 -3
  401. package/lib/lens-core-module/index.js +0 -4
  402. package/lib/lens-core-module/index.js.map +0 -1
  403. package/lib/lens-core-module/loader/index.d.ts +0 -1
  404. package/lib/lens-core-module/loader/index.js +0 -2
  405. package/lib/lens-core-module/loader/index.js.map +0 -1
  406. package/lib/lensCoreWasmVersions.json +0 -5
  407. package/lib/metrics/metricsHandler.d.ts +0 -10
  408. package/lib/metrics/metricsHandler.js +0 -13
  409. package/lib/metrics/metricsHandler.js.map +0 -1
  410. package/lib/metrics/operational/operationalMetricsReporter.d.ts +0 -64
  411. package/lib/metrics/operational/operationalMetricsReporter.js +0 -144
  412. package/lib/metrics/operational/operationalMetricsReporter.js.map +0 -1
  413. package/lib/session/index.d.ts +0 -1
  414. package/lib/session/index.js +0 -2
  415. package/lib/session/index.js.map +0 -1
  416. package/lib/transforms/index.d.ts +0 -1
  417. package/lib/transforms/index.js +0 -2
  418. package/lib/transforms/index.js.map +0 -1
@@ -1,8 +1,8 @@
1
1
  import { Metric, serializeMetricDimensions } from "./Metric";
2
2
  /** @internal */
3
3
  export class Histogram extends Metric {
4
- static level(name, level, dimsensions = {}) {
5
- const histogram = new Histogram(name, dimsensions);
4
+ static level(name, level, dimensions = {}) {
5
+ const histogram = new Histogram(name, dimensions);
6
6
  histogram.add(level);
7
7
  return histogram;
8
8
  }
@@ -17,7 +17,11 @@ export class Histogram extends Metric {
17
17
  toOperationalMetric() {
18
18
  const timestamp = new Date();
19
19
  const name = `${this.name}${serializeMetricDimensions(this.dimensions)}`;
20
- return this.levels.map((level) => ({ name, timestamp, metric: { $case: "histogram", histogram: level } }));
20
+ return this.levels.map((level) => ({
21
+ name,
22
+ timestamp,
23
+ metric: { $case: "histogram", histogram: `${Math.ceil(level)}` },
24
+ }));
21
25
  }
22
26
  }
23
27
  //# sourceMappingURL=Histogram.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"Histogram.js","sourceRoot":"","sources":["../../../src/metrics/operational/Histogram.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,MAAM,EAAoB,yBAAyB,EAAE,MAAM,UAAU,CAAC;AAO/E,gBAAgB;AAChB,MAAM,OAAO,SAAU,SAAQ,MAAM;IACjC,MAAM,CAAC,KAAK,CAAC,IAAY,EAAE,KAAa,EAAE,cAAgC,EAAE;QACxE,MAAM,SAAS,GAAG,IAAI,SAAS,CAAC,IAAI,EAAE,WAAW,CAAC,CAAC;QACnD,SAAS,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC;QACrB,OAAO,SAAS,CAAC;IACrB,CAAC;IAID,YAAqB,IAAY,EAAE,aAA+B,EAAE;QAChE,KAAK,CAAC,IAAI,EAAE,UAAU,CAAC,CAAC;QADP,SAAI,GAAJ,IAAI,CAAQ;QAFhB,WAAM,GAAa,EAAE,CAAC;IAIvC,CAAC;IAED,GAAG,CAAC,KAAa;QACb,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;IAC5B,CAAC;IAED,mBAAmB;QACf,MAAM,SAAS,GAAG,IAAI,IAAI,EAAE,CAAC;QAC7B,MAAM,IAAI,GAAG,GAAG,IAAI,CAAC,IAAI,GAAG,yBAAyB,CAAC,IAAI,CAAC,UAAU,CAAC,EAAE,CAAC;QACzE,OAAO,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,CAAC,EAAE,IAAI,EAAE,SAAS,EAAE,MAAM,EAAE,EAAE,KAAK,EAAE,WAAW,EAAE,SAAS,EAAE,KAAK,EAAE,EAAE,CAAC,CAAC,CAAC;IAC/G,CAAC;CACJ","sourcesContent":["import { OperationalMetric } from \"../../generated-proto/pb_schema/camera_kit/v3/operational_metrics\";\nimport { Metric, MetricDimensions, serializeMetricDimensions } from \"./Metric\";\n\n/** @internal */\nexport type HistogramMetric = OperationalMetric & {\n metric: Extract<OperationalMetric[\"metric\"], { $case: \"histogram\" }>;\n};\n\n/** @internal */\nexport class Histogram extends Metric {\n static level(name: string, level: number, dimsensions: MetricDimensions = {}): Histogram {\n const histogram = new Histogram(name, dimsensions);\n histogram.add(level);\n return histogram;\n }\n\n private readonly levels: number[] = [];\n\n constructor(readonly name: string, dimensions: MetricDimensions = {}) {\n super(name, dimensions);\n }\n\n add(level: number): void {\n this.levels.push(level);\n }\n\n toOperationalMetric(): HistogramMetric[] {\n const timestamp = new Date();\n const name = `${this.name}${serializeMetricDimensions(this.dimensions)}`;\n return this.levels.map((level) => ({ name, timestamp, metric: { $case: \"histogram\", histogram: level } }));\n }\n}\n"]}
1
+ {"version":3,"file":"Histogram.js","sourceRoot":"","sources":["../../../src/metrics/operational/Histogram.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,MAAM,EAAoB,yBAAyB,EAAE,MAAM,UAAU,CAAC;AAO/E,gBAAgB;AAChB,MAAM,OAAO,SAAU,SAAQ,MAAM;IACjC,MAAM,CAAC,KAAK,CAAC,IAAY,EAAE,KAAa,EAAE,aAA+B,EAAE;QACvE,MAAM,SAAS,GAAG,IAAI,SAAS,CAAC,IAAI,EAAE,UAAU,CAAC,CAAC;QAClD,SAAS,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC;QACrB,OAAO,SAAS,CAAC;IACrB,CAAC;IAID,YAAqB,IAAY,EAAE,aAA+B,EAAE;QAChE,KAAK,CAAC,IAAI,EAAE,UAAU,CAAC,CAAC;QADP,SAAI,GAAJ,IAAI,CAAQ;QAFhB,WAAM,GAAa,EAAE,CAAC;IAIvC,CAAC;IAED,GAAG,CAAC,KAAa;QACb,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;IAC5B,CAAC;IAED,mBAAmB;QACf,MAAM,SAAS,GAAG,IAAI,IAAI,EAAE,CAAC;QAC7B,MAAM,IAAI,GAAG,GAAG,IAAI,CAAC,IAAI,GAAG,yBAAyB,CAAC,IAAI,CAAC,UAAU,CAAC,EAAE,CAAC;QACzE,OAAO,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,CAAC;YAC/B,IAAI;YACJ,SAAS;YACT,MAAM,EAAE,EAAE,KAAK,EAAE,WAAW,EAAE,SAAS,EAAE,GAAG,IAAI,CAAC,IAAI,CAAC,KAAK,CAAC,EAAE,EAAE;SACnE,CAAC,CAAC,CAAC;IACR,CAAC;CACJ","sourcesContent":["import { OperationalMetric } from \"../../generated-proto/pb_schema/camera_kit/v3/operational_metrics\";\nimport { Metric, MetricDimensions, serializeMetricDimensions } from \"./Metric\";\n\n/** @internal */\nexport type HistogramMetric = OperationalMetric & {\n metric: Extract<OperationalMetric[\"metric\"], { $case: \"histogram\" }>;\n};\n\n/** @internal */\nexport class Histogram extends Metric {\n static level(name: string, level: number, dimensions: MetricDimensions = {}): Histogram {\n const histogram = new Histogram(name, dimensions);\n histogram.add(level);\n return histogram;\n }\n\n private readonly levels: number[] = [];\n\n constructor(readonly name: string, dimensions: MetricDimensions = {}) {\n super(name, dimensions);\n }\n\n add(level: number): void {\n this.levels.push(level);\n }\n\n toOperationalMetric(): HistogramMetric[] {\n const timestamp = new Date();\n const name = `${this.name}${serializeMetricDimensions(this.dimensions)}`;\n return this.levels.map((level) => ({\n name,\n timestamp,\n metric: { $case: \"histogram\", histogram: `${Math.ceil(level)}` },\n }));\n }\n}\n"]}
@@ -19,6 +19,8 @@ export function joinMetricNames(names) {
19
19
  export function serializeMetricDimensions(dimensions) {
20
20
  if (Object.keys(dimensions).length === 0)
21
21
  return "";
22
+ // The order in which we'll iterate over the dimension keys is governed by the (rather complex) rules for object
23
+ // key iteration in JS -- since ES2015, for string keys of own properties, this is insertion order.
22
24
  return `${dimensionDelimiter}${Array.from(Object.entries(dimensions))
23
25
  .map((d) => d.join(dimensionDelimiter))
24
26
  .join(dimensionDelimiter)}`;
@@ -1 +1 @@
1
- {"version":3,"file":"Metric.js","sourceRoot":"","sources":["../../../src/metrics/operational/Metric.ts"],"names":[],"mappings":"AAIA,MAAM,aAAa,GAAG,GAAG,CAAC;AAC1B,MAAM,kBAAkB,GAAG,GAAG,CAAC;AAC/B,MAAM,cAAc,GAAG,IAAI,MAAM,CAAC,IAAI,aAAa,KAAK,aAAa,IAAI,EAAE,GAAG,CAAC,CAAC;AAKhF,gBAAgB;AAChB,MAAM,OAAgB,MAAM;IACxB,YAAqB,IAAY,EAAW,aAA+B,EAAE;QAAxD,SAAI,GAAJ,IAAI,CAAQ;QAAW,eAAU,GAAV,UAAU,CAAuB;IAAG,CAAC;IAEjF,KAAK,CACD,WAAiC,EACjC,IAAe,EACf,aAA+B,EAAE;QAEjC,OAAO,IAAI,WAAW,CAAC,GAAG,IAAI,CAAC,IAAI,GAAG,aAAa,GAAG,IAAI,EAAE,EAAE,UAAU,CAAC,CAAC;IAC9E,CAAC;CAGJ;AAKD,gBAAgB;AAChB,MAAM,UAAU,eAAe,CAAC,KAAe;IAC3C,OAAO,KAAK,CAAC,IAAI,CAAC,aAAa,CAAC,CAAC,OAAO,CAAC,cAAc,EAAE,EAAE,CAAC,CAAC;AACjE,CAAC;AAED,gBAAgB;AAChB,MAAM,UAAU,yBAAyB,CAAC,UAA4B;IAClE,IAAI,MAAM,CAAC,IAAI,CAAC,UAAU,CAAC,CAAC,MAAM,KAAK,CAAC;QAAE,OAAO,EAAE,CAAC;IACpD,OAAO,GAAG,kBAAkB,GAAG,KAAK,CAAC,IAAI,CAAC,MAAM,CAAC,OAAO,CAAC,UAAU,CAAC,CAAC;SAChE,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,kBAAkB,CAAC,CAAC;SACtC,IAAI,CAAC,kBAAkB,CAAC,EAAE,CAAC;AACpC,CAAC","sourcesContent":["import { OperationalMetric } from \"../../generated-proto/pb_schema/camera_kit/v3/operational_metrics\";\n\ntype MetricConstructor<T> = new (name: string, dimensions: MetricDimensions) => T;\n\nconst nameDelimiter = \"_\";\nconst dimensionDelimiter = \".\";\nconst delimiterRegex = new RegExp(`^${nameDelimiter}+|${nameDelimiter}+$`, \"g\");\n\n/** @internal */\nexport type MetricDimensions = Record<string, string | number>;\n\n/** @internal */\nexport abstract class Metric {\n constructor(readonly name: string, readonly dimensions: MetricDimensions = {}) {}\n\n child<ChildName extends string, T extends Metric>(\n constructor: MetricConstructor<T>,\n name: ChildName,\n dimensions: MetricDimensions = {}\n ): T {\n return new constructor(`${this.name}${nameDelimiter}${name}`, dimensions);\n }\n\n abstract toOperationalMetric(): Required<OperationalMetric>[];\n}\n\n/** @internal */\nexport type JoinMetricNames<Parent extends string, Child extends string> = `${Parent}${typeof nameDelimiter}${Child}`;\n\n/** @internal */\nexport function joinMetricNames(names: string[]): string {\n return names.join(nameDelimiter).replace(delimiterRegex, \"\");\n}\n\n/** @internal */\nexport function serializeMetricDimensions(dimensions: MetricDimensions): string {\n if (Object.keys(dimensions).length === 0) return \"\";\n return `${dimensionDelimiter}${Array.from(Object.entries(dimensions))\n .map((d) => d.join(dimensionDelimiter))\n .join(dimensionDelimiter)}`;\n}\n"]}
1
+ {"version":3,"file":"Metric.js","sourceRoot":"","sources":["../../../src/metrics/operational/Metric.ts"],"names":[],"mappings":"AAIA,MAAM,aAAa,GAAG,GAAG,CAAC;AAC1B,MAAM,kBAAkB,GAAG,GAAG,CAAC;AAC/B,MAAM,cAAc,GAAG,IAAI,MAAM,CAAC,IAAI,aAAa,KAAK,aAAa,IAAI,EAAE,GAAG,CAAC,CAAC;AAKhF,gBAAgB;AAChB,MAAM,OAAgB,MAAM;IACxB,YAAqB,IAAY,EAAW,aAA+B,EAAE;QAAxD,SAAI,GAAJ,IAAI,CAAQ;QAAW,eAAU,GAAV,UAAU,CAAuB;IAAG,CAAC;IAEjF,KAAK,CACD,WAAiC,EACjC,IAAe,EACf,aAA+B,EAAE;QAEjC,OAAO,IAAI,WAAW,CAAC,GAAG,IAAI,CAAC,IAAI,GAAG,aAAa,GAAG,IAAI,EAAE,EAAE,UAAU,CAAC,CAAC;IAC9E,CAAC;CAGJ;AAKD,gBAAgB;AAChB,MAAM,UAAU,eAAe,CAAC,KAAe;IAC3C,OAAO,KAAK,CAAC,IAAI,CAAC,aAAa,CAAC,CAAC,OAAO,CAAC,cAAc,EAAE,EAAE,CAAC,CAAC;AACjE,CAAC;AAED,gBAAgB;AAChB,MAAM,UAAU,yBAAyB,CAAC,UAA4B;IAClE,IAAI,MAAM,CAAC,IAAI,CAAC,UAAU,CAAC,CAAC,MAAM,KAAK,CAAC;QAAE,OAAO,EAAE,CAAC;IACpD,gHAAgH;IAChH,mGAAmG;IACnG,OAAO,GAAG,kBAAkB,GAAG,KAAK,CAAC,IAAI,CAAC,MAAM,CAAC,OAAO,CAAC,UAAU,CAAC,CAAC;SAChE,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,kBAAkB,CAAC,CAAC;SACtC,IAAI,CAAC,kBAAkB,CAAC,EAAE,CAAC;AACpC,CAAC","sourcesContent":["import { OperationalMetric } from \"../../generated-proto/pb_schema/camera_kit/v3/operational_metrics\";\n\ntype MetricConstructor<T> = new (name: string, dimensions: MetricDimensions) => T;\n\nconst nameDelimiter = \"_\";\nconst dimensionDelimiter = \".\";\nconst delimiterRegex = new RegExp(`^${nameDelimiter}+|${nameDelimiter}+$`, \"g\");\n\n/** @internal */\nexport type MetricDimensions = Record<string, string | number>;\n\n/** @internal */\nexport abstract class Metric {\n constructor(readonly name: string, readonly dimensions: MetricDimensions = {}) {}\n\n child<ChildName extends string, T extends Metric>(\n constructor: MetricConstructor<T>,\n name: ChildName,\n dimensions: MetricDimensions = {}\n ): T {\n return new constructor(`${this.name}${nameDelimiter}${name}`, dimensions);\n }\n\n abstract toOperationalMetric(): Required<OperationalMetric>[];\n}\n\n/** @internal */\nexport type JoinMetricNames<Parent extends string, Child extends string> = `${Parent}${typeof nameDelimiter}${Child}`;\n\n/** @internal */\nexport function joinMetricNames(names: string[]): string {\n return names.join(nameDelimiter).replace(delimiterRegex, \"\");\n}\n\n/** @internal */\nexport function serializeMetricDimensions(dimensions: MetricDimensions): string {\n if (Object.keys(dimensions).length === 0) return \"\";\n // The order in which we'll iterate over the dimension keys is governed by the (rather complex) rules for object\n // key iteration in JS -- since ES2015, for string keys of own properties, this is insertion order.\n return `${dimensionDelimiter}${Array.from(Object.entries(dimensions))\n .map((d) => d.join(dimensionDelimiter))\n .join(dimensionDelimiter)}`;\n}\n"]}
@@ -1,6 +1,6 @@
1
+ import { MetricsClient } from "../../clients/metricsClient";
1
2
  import { OperationalMetric } from "../../generated-proto/pb_schema/camera_kit/v3/operational_metrics";
2
3
  import { JoinMetricNames, Metric, MetricDimensions } from "./Metric";
3
- import { OperationalMetricsReporter } from "./operationalMetricsReporter";
4
4
  interface Measure {
5
5
  name: string;
6
6
  duration: number;
@@ -62,7 +62,10 @@ export declare class Timer<Name extends string> extends Metric {
62
62
  * @param name
63
63
  * @returns
64
64
  */
65
- measure(name?: string): void;
65
+ measure(): Measure | undefined;
66
+ measure(dimensions: MetricDimensions): Measure | undefined;
67
+ measure(name: string): Measure | undefined;
68
+ measure(name: string, dimensions: MetricDimensions): Measure | undefined;
66
69
  /**
67
70
  * Remove all measures from this Timer and any child timers previously created by calls to `mark()`.
68
71
  */
@@ -72,17 +75,17 @@ export declare class Timer<Name extends string> extends Metric {
72
75
  */
73
76
  stop(): void;
74
77
  /**
75
- * Report this metric using {@link OperationalMetricsReporter}.
78
+ * Report this metric using {@link MetricsClient}.
76
79
  *
77
80
  * After reporting, the Timer can longer be used. Its internal state is cleared and cannot be updated. Calling this
78
81
  * method a second time will no-op.
79
82
  *
80
83
  * @param reporter All measurements will be reported using the given reporter.
81
84
  */
82
- stopAndReport(reporter: OperationalMetricsReporter): Promise<void>;
85
+ stopAndReport(client: MetricsClient): Promise<void>;
83
86
  /**
84
- * Convert all measures from this Timer and from any child timers into an array of {@link OperationalMeric} objects,
85
- * which can be sent to the backend.
87
+ * Convert all measures from this Timer and from any child timers into an array of {@link OperationalMetric}
88
+ * objects, which can be sent to the backend.
86
89
  *
87
90
  * @returns
88
91
  */
@@ -44,33 +44,19 @@ export class Timer extends Metric {
44
44
  this.marks.add(mark);
45
45
  return mark;
46
46
  }
47
- /**
48
- * Measure the time (in milliseconds) since this Timer was created.
49
- *
50
- * If a name is provided, the measure's name will be prefixed with the name of this Timer. Otherwise the name of
51
- * the measure will be the name of this Timer.
52
- *
53
- * @example
54
- * ```ts
55
- * const timer = new Timer('a')
56
- * timer.measure('b')
57
- * const measures = timer.getMeasures()
58
- * // measure[0].name === 'a_b'
59
- * ```
60
- *
61
- * @param name
62
- * @returns
63
- */
64
- measure(name = "") {
47
+ measure(nameOrDimensions, maybeDimensions) {
65
48
  if (this.stopped)
66
- return;
49
+ return undefined;
50
+ const name = typeof nameOrDimensions === "string" ? nameOrDimensions : "";
51
+ const dimensions = typeof nameOrDimensions === "string" ? maybeDimensions : nameOrDimensions;
67
52
  const fullName = joinMetricNames([this.name, name]);
68
53
  const measure = {
69
54
  name: fullName,
70
55
  duration: getTimeMs() - this.startTime,
71
- dimensions: this.dimensions,
56
+ dimensions: dimensions !== null && dimensions !== void 0 ? dimensions : this.dimensions,
72
57
  };
73
58
  this.measures.add(measure);
59
+ return measure;
74
60
  }
75
61
  /**
76
62
  * Remove all measures from this Timer and any child timers previously created by calls to `mark()`.
@@ -87,23 +73,23 @@ export class Timer extends Metric {
87
73
  this.marks.forEach((mark) => mark.stop());
88
74
  }
89
75
  /**
90
- * Report this metric using {@link OperationalMetricsReporter}.
76
+ * Report this metric using {@link MetricsClient}.
91
77
  *
92
78
  * After reporting, the Timer can longer be used. Its internal state is cleared and cannot be updated. Calling this
93
79
  * method a second time will no-op.
94
80
  *
95
81
  * @param reporter All measurements will be reported using the given reporter.
96
82
  */
97
- stopAndReport(reporter) {
83
+ stopAndReport(client) {
98
84
  return __awaiter(this, void 0, void 0, function* () {
99
- reporter.report(this);
85
+ client.setOperationalMetrics(this);
100
86
  this.stop();
101
87
  this.clear();
102
88
  });
103
89
  }
104
90
  /**
105
- * Convert all measures from this Timer and from any child timers into an array of {@link OperationalMeric} objects,
106
- * which can be sent to the backend.
91
+ * Convert all measures from this Timer and from any child timers into an array of {@link OperationalMetric}
92
+ * objects, which can be sent to the backend.
107
93
  *
108
94
  * @returns
109
95
  */
@@ -114,7 +100,7 @@ export class Timer extends Metric {
114
100
  timestamp,
115
101
  metric: {
116
102
  $case: "latencyMillis",
117
- latencyMillis: measure.duration,
103
+ latencyMillis: `${Math.ceil(measure.duration)}`,
118
104
  },
119
105
  }));
120
106
  }
@@ -1 +1 @@
1
- {"version":3,"file":"Timer.js","sourceRoot":"","sources":["../../../src/metrics/operational/Timer.ts"],"names":[],"mappings":"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","sourcesContent":["import { getTimeMs } from \"../../common/time\";\nimport { OperationalMetric } from \"../../generated-proto/pb_schema/camera_kit/v3/operational_metrics\";\nimport { JoinMetricNames, Metric, MetricDimensions, joinMetricNames, serializeMetricDimensions } from \"./Metric\";\nimport { OperationalMetricsReporter } from \"./operationalMetricsReporter\";\n\ninterface Measure {\n name: string;\n duration: number;\n dimensions: MetricDimensions;\n}\n\n/** @internal */\nexport type LatencyMetric = OperationalMetric & {\n metric: Extract<OperationalMetric[\"metric\"], { $case: \"latencyMillis\" }>;\n};\n\n/** @internal */\nexport class Timer<Name extends string> extends Metric {\n private readonly marks: Set<Timer<string>>;\n private readonly measures: Set<Measure>;\n private readonly startTime = getTimeMs();\n private stopped = false;\n\n constructor(readonly name: Name, dimensions: MetricDimensions = {}) {\n super(name, dimensions);\n\n this.marks = new Set();\n this.measures = new Set();\n }\n\n /**\n * Return all measures created by this Timer and any child timers.\n */\n getMeasures(): ReadonlyArray<Measure> {\n return Array.from(this.measures.values()).concat(\n ...Array.from(this.marks.values()).map((mark) => mark.getMeasures())\n );\n }\n\n /**\n * Create a child Timer, using this Timer's name as a prefix when naming the new Timer. Any measures made with the\n * child Timer will be included when calling `getMeasures()` on this Timer, or when calling `toOperationalMetric`\n * on this Timer.\n *\n * @example\n * ```ts\n * const parent = new Timer('parent')\n * const child = parent.mark('child') // child metric name is parent_child.\n *\n * child.measure()\n * const measures = parent.getMeasures() // has one element.\n * ```\n *\n * @param name\n * @param dimensions If omitted, the child timer will NOT inherit dimensions from the parent -- if the child timer\n * should re-use the parent's dimensions, this must be done explicitly by passing the parent's dimensions as an\n * argument here.\n * @returns A child Timer.\n */\n mark<MarkName extends string>(\n name: MarkName,\n dimensions: MetricDimensions = {}\n ): Timer<JoinMetricNames<Name, MarkName>> {\n const mark = new Timer(joinMetricNames([this.name, name]) as JoinMetricNames<Name, MarkName>, dimensions);\n if (this.stopped) mark.stop();\n this.marks.add(mark);\n return mark;\n }\n\n /**\n * Measure the time (in milliseconds) since this Timer was created.\n *\n * If a name is provided, the measure's name will be prefixed with the name of this Timer. Otherwise the name of\n * the measure will be the name of this Timer.\n *\n * @example\n * ```ts\n * const timer = new Timer('a')\n * timer.measure('b')\n * const measures = timer.getMeasures()\n * // measure[0].name === 'a_b'\n * ```\n *\n * @param name\n * @returns\n */\n measure(name = \"\"): void {\n if (this.stopped) return;\n const fullName = joinMetricNames([this.name, name]);\n const measure: Measure = {\n name: fullName,\n duration: getTimeMs() - this.startTime,\n dimensions: this.dimensions,\n };\n this.measures.add(measure);\n }\n\n /**\n * Remove all measures from this Timer and any child timers previously created by calls to `mark()`.\n */\n clear(): void {\n this.measures.clear();\n this.marks.forEach((mark) => mark.clear());\n }\n\n /**\n * Prevent any future measures from being created by this Timer or any child timers.\n */\n stop(): void {\n this.stopped = true;\n this.marks.forEach((mark) => mark.stop());\n }\n\n /**\n * Report this metric using {@link OperationalMetricsReporter}.\n *\n * After reporting, the Timer can longer be used. Its internal state is cleared and cannot be updated. Calling this\n * method a second time will no-op.\n *\n * @param reporter All measurements will be reported using the given reporter.\n */\n async stopAndReport(reporter: OperationalMetricsReporter): Promise<void> {\n reporter.report(this);\n this.stop();\n this.clear();\n }\n\n /**\n * Convert all measures from this Timer and from any child timers into an array of {@link OperationalMeric} objects,\n * which can be sent to the backend.\n *\n * @returns\n */\n toOperationalMetric(): LatencyMetric[] {\n const timestamp = new Date();\n return this.getMeasures().map((measure) => ({\n name: `${measure.name}${serializeMetricDimensions(measure.dimensions)}`,\n timestamp,\n metric: {\n $case: \"latencyMillis\",\n latencyMillis: measure.duration,\n },\n }));\n }\n}\n"]}
1
+ {"version":3,"file":"Timer.js","sourceRoot":"","sources":["../../../src/metrics/operational/Timer.ts"],"names":[],"mappings":"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","sourcesContent":["import { MetricsClient } from \"../../clients/metricsClient\";\nimport { getTimeMs } from \"../../common/time\";\nimport { OperationalMetric } from \"../../generated-proto/pb_schema/camera_kit/v3/operational_metrics\";\nimport { JoinMetricNames, Metric, MetricDimensions, joinMetricNames, serializeMetricDimensions } from \"./Metric\";\n\ninterface Measure {\n name: string;\n duration: number;\n dimensions: MetricDimensions;\n}\n\n/** @internal */\nexport type LatencyMetric = OperationalMetric & {\n metric: Extract<OperationalMetric[\"metric\"], { $case: \"latencyMillis\" }>;\n};\n\n/** @internal */\nexport class Timer<Name extends string> extends Metric {\n private readonly marks: Set<Timer<string>>;\n private readonly measures: Set<Measure>;\n private readonly startTime = getTimeMs();\n private stopped = false;\n\n constructor(readonly name: Name, dimensions: MetricDimensions = {}) {\n super(name, dimensions);\n\n this.marks = new Set();\n this.measures = new Set();\n }\n\n /**\n * Return all measures created by this Timer and any child timers.\n */\n getMeasures(): ReadonlyArray<Measure> {\n return Array.from(this.measures.values()).concat(\n ...Array.from(this.marks.values()).map((mark) => mark.getMeasures())\n );\n }\n\n /**\n * Create a child Timer, using this Timer's name as a prefix when naming the new Timer. Any measures made with the\n * child Timer will be included when calling `getMeasures()` on this Timer, or when calling `toOperationalMetric`\n * on this Timer.\n *\n * @example\n * ```ts\n * const parent = new Timer('parent')\n * const child = parent.mark('child') // child metric name is parent_child.\n *\n * child.measure()\n * const measures = parent.getMeasures() // has one element.\n * ```\n *\n * @param name\n * @param dimensions If omitted, the child timer will NOT inherit dimensions from the parent -- if the child timer\n * should re-use the parent's dimensions, this must be done explicitly by passing the parent's dimensions as an\n * argument here.\n * @returns A child Timer.\n */\n mark<MarkName extends string>(\n name: MarkName,\n dimensions: MetricDimensions = {}\n ): Timer<JoinMetricNames<Name, MarkName>> {\n const mark = new Timer(joinMetricNames([this.name, name]) as JoinMetricNames<Name, MarkName>, dimensions);\n if (this.stopped) mark.stop();\n this.marks.add(mark);\n return mark;\n }\n\n /**\n * Measure the time (in milliseconds) since this Timer was created.\n *\n * If a name is provided, the measure's name will be prefixed with the name of this Timer. Otherwise the name of\n * the measure will be the name of this Timer.\n *\n * @example\n * ```ts\n * const timer = new Timer('a')\n * timer.measure('b')\n * const measures = timer.getMeasures()\n * // measure[0].name === 'a_b'\n * ```\n *\n * @param name\n * @returns\n */\n measure(): Measure | undefined;\n measure(dimensions: MetricDimensions): Measure | undefined;\n measure(name: string): Measure | undefined;\n measure(name: string, dimensions: MetricDimensions): Measure | undefined;\n measure(nameOrDimensions?: string | MetricDimensions, maybeDimensions?: MetricDimensions): Measure | undefined {\n if (this.stopped) return undefined;\n const name = typeof nameOrDimensions === \"string\" ? nameOrDimensions : \"\";\n const dimensions = typeof nameOrDimensions === \"string\" ? maybeDimensions : nameOrDimensions;\n\n const fullName = joinMetricNames([this.name, name]);\n const measure: Measure = {\n name: fullName,\n duration: getTimeMs() - this.startTime,\n dimensions: dimensions ?? this.dimensions,\n };\n this.measures.add(measure);\n return measure;\n }\n\n /**\n * Remove all measures from this Timer and any child timers previously created by calls to `mark()`.\n */\n clear(): void {\n this.measures.clear();\n this.marks.forEach((mark) => mark.clear());\n }\n\n /**\n * Prevent any future measures from being created by this Timer or any child timers.\n */\n stop(): void {\n this.stopped = true;\n this.marks.forEach((mark) => mark.stop());\n }\n\n /**\n * Report this metric using {@link MetricsClient}.\n *\n * After reporting, the Timer can longer be used. Its internal state is cleared and cannot be updated. Calling this\n * method a second time will no-op.\n *\n * @param reporter All measurements will be reported using the given reporter.\n */\n async stopAndReport(client: MetricsClient): Promise<void> {\n client.setOperationalMetrics(this);\n this.stop();\n this.clear();\n }\n\n /**\n * Convert all measures from this Timer and from any child timers into an array of {@link OperationalMetric}\n * objects, which can be sent to the backend.\n *\n * @returns\n */\n toOperationalMetric(): LatencyMetric[] {\n const timestamp = new Date();\n return this.getMeasures().map((measure) => ({\n name: `${measure.name}${serializeMetricDimensions(measure.dimensions)}`,\n timestamp,\n metric: {\n $case: \"latencyMillis\",\n latencyMillis: `${Math.ceil(measure.duration)}`,\n },\n }));\n }\n}\n"]}
@@ -1,10 +1,10 @@
1
+ import { MetricsClient } from "../../clients/metricsClient";
1
2
  import { CameraKitConfiguration } from "../../configuration";
2
3
  import { MakeTaggedBusinessEvent } from "../businessEventsReporter";
3
4
  import { MetricsEventTarget } from "../metricsEventTarget";
4
- import { OperationalMetricsReporter } from "../operational/operationalMetricsReporter";
5
5
  export type BenchmarkComplete = MakeTaggedBusinessEvent<"benchmarkComplete">;
6
6
  export declare const reportBenchmarks: {
7
- (args_0: MetricsEventTarget, args_1: OperationalMetricsReporter, args_2: CameraKitConfiguration): Promise<void>;
7
+ (args_0: MetricsEventTarget, args_1: MetricsClient, args_2: CameraKitConfiguration): Promise<void>;
8
8
  token: "reportBenchmarks";
9
- dependencies: readonly ["metricsEventTarget", "operationalMetricsReporter", "configuration"];
9
+ dependencies: readonly ["metricsEventTarget", "metricsClient", "configuration"];
10
10
  };
@@ -1,12 +1,13 @@
1
1
  import { __awaiter } from "tslib";
2
+ import { metricsClientFactory } from "../../clients/metricsClient";
2
3
  import { configurationToken } from "../../configuration";
3
4
  import { Injectable } from "../../dependency-injection/Injectable";
4
5
  import { TypedCustomEvent } from "../../events/TypedCustomEvent";
5
6
  import { metricsEventTargetFactory } from "../metricsEventTarget";
6
- import { operationalMetricReporterFactory, } from "../operational/operationalMetricsReporter";
7
+ import { Histogram } from "../operational/Histogram";
7
8
  // Allowlist the benchmarks we wish to report.
8
9
  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
+ export const reportBenchmarks = Injectable("reportBenchmarks", [metricsEventTargetFactory.token, metricsClientFactory.token, configurationToken], (metricsEventTarget, metrics, config) => __awaiter(void 0, void 0, void 0, function* () {
10
11
  if (config.lensPerformance === undefined)
11
12
  return;
12
13
  // Safety: config.lensPerformance cannot reject – all Promises contained in CameraKitConfiguration have
@@ -14,16 +15,16 @@ export const reportBenchmarks = Injectable("reportBenchmarks", [metricsEventTarg
14
15
  const lensPerformance = yield config.lensPerformance;
15
16
  const baseBenchmark = {
16
17
  name: "benchmarkComplete",
17
- performanceCluster: lensPerformance.cluster,
18
+ performanceCluster: `${lensPerformance.cluster}`,
18
19
  webglRendererInfo: lensPerformance.webglRendererInfo,
19
20
  };
20
- const dimensions = new Map([["performance_cluster", lensPerformance.cluster.toString()]]);
21
+ const dimensions = { performance_cluster: lensPerformance.cluster.toString() };
21
22
  for (const benchmark of lensPerformance.benchmarks) {
22
23
  if (!reportableBenchmarks.includes(benchmark.name))
23
24
  continue;
24
25
  const benchmarkComplete = Object.assign(Object.assign({}, baseBenchmark), { benchmarkName: benchmark.name, benchmarkValue: benchmark.value });
25
26
  metricsEventTarget.dispatchEvent(new TypedCustomEvent("benchmarkComplete", benchmarkComplete));
26
- reporter.histogram(`benchmark.${benchmark.name}`, benchmark.value, dimensions);
27
+ metrics.setOperationalMetrics(Histogram.level(`benchmark.${benchmark.name}`, benchmark.value, dimensions));
27
28
  }
28
29
  }));
29
30
  //# sourceMappingURL=reportBenchmarks.js.map
@@ -1 +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,EACH,gCAAgC,GAEnC,MAAM,2CAA2C,CAAC;AAEnD,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 {\n operationalMetricReporterFactory,\n OperationalMetricsReporter,\n} from \"../operational/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"]}
1
+ {"version":3,"file":"reportBenchmarks.js","sourceRoot":"","sources":["../../../src/metrics/reporters/reportBenchmarks.ts"],"names":[],"mappings":";AAAA,OAAO,EAAiB,oBAAoB,EAAE,MAAM,6BAA6B,CAAC;AAClF,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,SAAS,EAAE,MAAM,0BAA0B,CAAC;AAErD,8CAA8C;AAC9C,MAAM,oBAAoB,GAAG,CAAC,QAAQ,CAAC,CAAC;AAIxC,MAAM,CAAC,MAAM,gBAAgB,GAAG,UAAU,CACtC,kBAAkB,EAClB,CAAC,yBAAyB,CAAC,KAAK,EAAE,oBAAoB,CAAC,KAAK,EAAE,kBAAkB,CAAU,EAC1F,CAAO,kBAAsC,EAAE,OAAsB,EAAE,MAA8B,EAAE,EAAE;IACrG,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,GAAG,eAAe,CAAC,OAAO,EAAE;QAChD,iBAAiB,EAAE,eAAe,CAAC,iBAAiB;KACvD,CAAC;IACF,MAAM,UAAU,GAAG,EAAE,mBAAmB,EAAE,eAAe,CAAC,OAAO,CAAC,QAAQ,EAAE,EAAE,CAAC;IAC/E,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,OAAO,CAAC,qBAAqB,CAAC,SAAS,CAAC,KAAK,CAAC,aAAa,SAAS,CAAC,IAAI,EAAE,EAAE,SAAS,CAAC,KAAK,EAAE,UAAU,CAAC,CAAC,CAAC;KAC9G;AACL,CAAC,CAAA,CACJ,CAAC","sourcesContent":["import { MetricsClient, metricsClientFactory } from \"../../clients/metricsClient\";\nimport { 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 { Histogram } from \"../operational/Histogram\";\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, metricsClientFactory.token, configurationToken] as const,\n async (metricsEventTarget: MetricsEventTarget, metrics: MetricsClient, config: CameraKitConfiguration) => {\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 = { 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 metrics.setOperationalMetrics(Histogram.level(`benchmark.${benchmark.name}`, benchmark.value, dimensions));\n }\n }\n);\n"]}
@@ -2,14 +2,14 @@ import { Observable } from "rxjs";
2
2
  import { LogEntry } from "../../logger/logger";
3
3
  import { LensState } from "../../session/lensState";
4
4
  import { MetricsEventTarget } from "../metricsEventTarget";
5
- import { OperationalMetricsReporter } from "../operational/operationalMetricsReporter";
5
+ import { MetricsClient } from "../../clients/metricsClient";
6
6
  interface RepeatableLogEntry {
7
7
  entry: LogEntry;
8
8
  count: number;
9
9
  lastTime: Date;
10
10
  }
11
11
  export declare function getContextString(logEntries: RepeatableLogEntry[]): string;
12
- export declare function reportExceptionToBlizzard(logEntries: Observable<LogEntry>, metricsEventTarget: MetricsEventTarget, reporter: OperationalMetricsReporter, lensState?: LensState): void;
12
+ export declare function reportExceptionToBlizzard(logEntries: Observable<LogEntry>, metricsEventTarget: MetricsEventTarget, metrics: MetricsClient, lensState?: LensState): void;
13
13
  export interface GlobalExceptionReporter {
14
14
  attachLensContext: (lensState: LensState) => void;
15
15
  }
@@ -19,8 +19,8 @@ export interface GlobalExceptionReporter {
19
19
  * @internal
20
20
  */
21
21
  export declare const reportGlobalException: {
22
- (args_0: Observable<LogEntry>, args_1: MetricsEventTarget, args_2: OperationalMetricsReporter): GlobalExceptionReporter;
22
+ (args_0: Observable<LogEntry>, args_1: MetricsEventTarget, args_2: MetricsClient): GlobalExceptionReporter;
23
23
  token: "reportGlobalException";
24
- dependencies: readonly ["logEntries", "metricsEventTarget", "operationalMetricsReporter"];
24
+ dependencies: readonly ["logEntries", "metricsEventTarget", "metricsClient"];
25
25
  };
26
26
  export {};
@@ -1,13 +1,14 @@
1
1
  import { isState } from "@snap/state-management";
2
2
  import { filter, map, scan, Subject, takeUntil } from "rxjs";
3
3
  import { entries } from "../../common/entries";
4
- import { ensureError } from "../../common/errorHelpers";
4
+ import { ensureError, stringifyError } from "../../common/errorHelpers";
5
5
  import { Injectable } from "../../dependency-injection/Injectable";
6
6
  import { TypedCustomEvent } from "../../events/TypedCustomEvent";
7
7
  import { logEntriesFactory } from "../../logger/logEntries";
8
8
  import { logLevelMap } from "../../logger/logger";
9
9
  import { metricsEventTargetFactory } from "../metricsEventTarget";
10
- import { operationalMetricReporterFactory, } from "../operational/operationalMetricsReporter";
10
+ import { metricsClientFactory } from "../../clients/metricsClient";
11
+ import { Count } from "../operational/Count";
11
12
  const logMethods = entries(logLevelMap).map(([level]) => level);
12
13
  // How many log entries to include as the error context
13
14
  const maxBufferedEntries = 15;
@@ -29,21 +30,22 @@ export function getContextString(logEntries) {
29
30
  */
30
31
  function prettyPrintMessage(message) {
31
32
  if (message instanceof Error)
32
- return stringifyError(message);
33
+ return stringifyErrorMessage(message);
33
34
  if (message instanceof Date)
34
35
  return message.toISOString();
35
36
  return message + "";
36
37
  }
37
38
  /**
38
- * Returns an error message for a given error, and also appends the error message of any nested error, if one exists.
39
+ * Returns an error message for a given error, and also appends the error message of any nested error,
40
+ * if one exists. It DOES NOT append error stack trace.
39
41
  * @param error Error to stringify.
40
42
  * @returns Error message including nested error messages.
41
43
  */
42
- function stringifyError(error) {
43
- const cause = error.cause ? `; Caused by ${stringifyError(ensureError(error.cause))}` : "";
44
+ function stringifyErrorMessage(error) {
45
+ const cause = error.cause ? `; Caused by ${stringifyErrorMessage(ensureError(error.cause))}` : "";
44
46
  return `${error.name}: ${error.message}${cause}`;
45
47
  }
46
- export function reportExceptionToBlizzard(logEntries, metricsEventTarget, reporter, lensState) {
48
+ export function reportExceptionToBlizzard(logEntries, metricsEventTarget, metrics, lensState) {
47
49
  logEntries
48
50
  .pipe(scan(({ entries }, newEntry) => {
49
51
  const lastEntry = entries[entries.length - 1];
@@ -80,7 +82,7 @@ export function reportExceptionToBlizzard(logEntries, metricsEventTarget, report
80
82
  type: error.name,
81
83
  reason: `${stringifyError(error)}${contextSeparator}${getContextString(context)}`,
82
84
  }));
83
- reporter.count("handled_exception", 1, new Map([["type", error.name]]));
85
+ metrics.setOperationalMetrics(Count.count("handled_exception", 1, { type: error.name }));
84
86
  });
85
87
  }
86
88
  /**
@@ -88,16 +90,16 @@ export function reportExceptionToBlizzard(logEntries, metricsEventTarget, report
88
90
  *
89
91
  * @internal
90
92
  */
91
- export const reportGlobalException = Injectable("reportGlobalException", [logEntriesFactory.token, metricsEventTargetFactory.token, operationalMetricReporterFactory.token], (logEntries, metricsEventTarget, reporter) => {
93
+ export const reportGlobalException = Injectable("reportGlobalException", [logEntriesFactory.token, metricsEventTargetFactory.token, metricsClientFactory.token], (logEntries, metricsEventTarget, metrics) => {
92
94
  // Initially we log exceptions without any lens context
93
95
  const cancellationSubject = new Subject();
94
- reportExceptionToBlizzard(logEntries.pipe(takeUntil(cancellationSubject)), metricsEventTarget, reporter);
96
+ reportExceptionToBlizzard(logEntries.pipe(takeUntil(cancellationSubject)), metricsEventTarget, metrics);
95
97
  // Later session scope reporter triggers cancellation of the global one
96
98
  // and initiates exception reporting with a lens context
97
99
  return {
98
100
  attachLensContext: (lensState) => {
99
101
  cancellationSubject.next();
100
- reportExceptionToBlizzard(logEntries, metricsEventTarget, reporter, lensState);
102
+ reportExceptionToBlizzard(logEntries, metricsEventTarget, metrics, lensState);
101
103
  },
102
104
  };
103
105
  });
@@ -1 +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 { ensureError } 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 {\n operationalMetricReporterFactory,\n OperationalMetricsReporter,\n} from \"../operational/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 RepeatableLogEntry {\n entry: LogEntry;\n count: number;\n lastTime: Date;\n}\n\ninterface EntriesBuffer {\n /**\n * LogEntries grouped by their message.\n */\n entries: RepeatableLogEntry[];\n /**\n * The recent log entry.\n */\n recent: LogEntry;\n}\n\nexport function getContextString(logEntries: RepeatableLogEntry[]) {\n const result = [];\n for (const { entry, count, lastTime } of logEntries) {\n const time = entry.time.toISOString();\n const method = entry.level.padStart(methodLength);\n const messages = entry.messages.map(prettyPrintMessage).join(\" \");\n let dupSuffix =\n count > 1 ? ` (Repeated ${count} times with the last occurrence at ${lastTime.toISOString()})` : \"\";\n\n result.push(`${time} [${entry.module}] ${method}: ${messages}${dupSuffix}`);\n }\n return result.join(\"\\n\");\n}\n\n/**\n * Pretty print a log message.\n */\nfunction prettyPrintMessage(message: unknown): string {\n if (message instanceof Error) return stringifyError(message);\n if (message instanceof Date) return message.toISOString();\n return message + \"\";\n}\n\n/**\n * Returns an error message for a given error, and also appends the error message of any nested error, if one exists.\n * @param error Error to stringify.\n * @returns Error message including nested error messages.\n */\nfunction stringifyError(error: Error): string {\n const cause = error.cause ? `; Caused by ${stringifyError(ensureError(error.cause))}` : \"\";\n return `${error.name}: ${error.message}${cause}`;\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 ({ entries }, newEntry) => {\n const lastEntry = entries[entries.length - 1];\n const isNewEntryRepeated =\n lastEntry &&\n lastEntry.entry.messages.join() === newEntry.messages.join() &&\n lastEntry.entry.level === newEntry.level;\n if (isNewEntryRepeated) {\n lastEntry.count += 1;\n lastEntry.lastTime = newEntry.time;\n } else {\n entries.push({\n entry: newEntry,\n count: 1,\n lastTime: newEntry.time,\n });\n }\n return {\n entries: entries.slice(-maxBufferedEntries),\n recent: newEntry,\n };\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\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"]}
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 { ensureError, 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 { MetricsClient, metricsClientFactory } from \"../../clients/metricsClient\";\nimport { Count } from \"../operational/Count\";\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 RepeatableLogEntry {\n entry: LogEntry;\n count: number;\n lastTime: Date;\n}\n\ninterface EntriesBuffer {\n /**\n * LogEntries grouped by their message.\n */\n entries: RepeatableLogEntry[];\n /**\n * The recent log entry.\n */\n recent: LogEntry;\n}\n\nexport function getContextString(logEntries: RepeatableLogEntry[]) {\n const result = [];\n for (const { entry, count, lastTime } of logEntries) {\n const time = entry.time.toISOString();\n const method = entry.level.padStart(methodLength);\n const messages = entry.messages.map(prettyPrintMessage).join(\" \");\n let dupSuffix =\n count > 1 ? ` (Repeated ${count} times with the last occurrence at ${lastTime.toISOString()})` : \"\";\n\n result.push(`${time} [${entry.module}] ${method}: ${messages}${dupSuffix}`);\n }\n return result.join(\"\\n\");\n}\n\n/**\n * Pretty print a log message.\n */\nfunction prettyPrintMessage(message: unknown): string {\n if (message instanceof Error) return stringifyErrorMessage(message);\n if (message instanceof Date) return message.toISOString();\n return message + \"\";\n}\n\n/**\n * Returns an error message for a given error, and also appends the error message of any nested error,\n * if one exists. It DOES NOT append error stack trace.\n * @param error Error to stringify.\n * @returns Error message including nested error messages.\n */\nfunction stringifyErrorMessage(error: Error): string {\n const cause = error.cause ? `; Caused by ${stringifyErrorMessage(ensureError(error.cause))}` : \"\";\n return `${error.name}: ${error.message}${cause}`;\n}\n\nexport function reportExceptionToBlizzard(\n logEntries: Observable<LogEntry>,\n metricsEventTarget: MetricsEventTarget,\n metrics: MetricsClient,\n lensState?: LensState\n) {\n logEntries\n .pipe(\n scan<LogEntry, EntriesBuffer>(\n ({ entries }, newEntry) => {\n const lastEntry = entries[entries.length - 1];\n const isNewEntryRepeated =\n lastEntry &&\n lastEntry.entry.messages.join() === newEntry.messages.join() &&\n lastEntry.entry.level === newEntry.level;\n if (isNewEntryRepeated) {\n lastEntry.count += 1;\n lastEntry.lastTime = newEntry.time;\n } else {\n entries.push({\n entry: newEntry,\n count: 1,\n lastTime: newEntry.time,\n });\n }\n return {\n entries: entries.slice(-maxBufferedEntries),\n recent: newEntry,\n };\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\n metrics.setOperationalMetrics(Count.count(\"handled_exception\", 1, { 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, metricsClientFactory.token] as const,\n (\n logEntries: Observable<LogEntry>,\n metricsEventTarget: MetricsEventTarget,\n metrics: MetricsClient\n ): GlobalExceptionReporter => {\n // Initially we log exceptions without any lens context\n const cancellationSubject = new Subject<void>();\n reportExceptionToBlizzard(logEntries.pipe(takeUntil(cancellationSubject)), metricsEventTarget, metrics);\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, metrics, lensState);\n },\n };\n }\n);\n"]}
@@ -1,10 +1,10 @@
1
1
  import { CofDimensions } from "../../remote-configuration/cofHandler";
2
2
  import { Dimensions, RequestStateEventTarget } from "../../handlers/requestStateEmittingHandler";
3
- import { OperationalMetricsReporter } from "../operational/operationalMetricsReporter";
3
+ import { MetricsClient } from "../../clients/metricsClient";
4
4
  import { AssetDownloadDimensions, LensDownloadDimensions } from "./reportLensAndAssetDownload";
5
5
  export declare const isRelevantRequest: (value: Dimensions) => value is CofDimensions | AssetDownloadDimensions | LensDownloadDimensions;
6
6
  export declare const reportHttpMetrics: {
7
- (args_0: OperationalMetricsReporter, args_1: RequestStateEventTarget): void;
7
+ (args_0: MetricsClient, args_1: RequestStateEventTarget): void;
8
8
  token: "reportHttpMetrics";
9
- dependencies: readonly ["operationalMetricsReporter", "requestStateEventTarget"];
9
+ dependencies: readonly ["metricsClient", "requestStateEventTarget"];
10
10
  };
@@ -3,8 +3,10 @@ import { Injectable } from "../../dependency-injection/Injectable";
3
3
  import { scan } from "../../events/scan";
4
4
  import { COF_REQUEST_TYPE } from "../../remote-configuration/cofHandler";
5
5
  import { requestStateEventTargetFactory, } from "../../handlers/requestStateEmittingHandler";
6
- import { operationalMetricReporterFactory, } from "../operational/operationalMetricsReporter";
7
6
  import { getPlatformInfo } from "../../platform/platformInfo";
7
+ import { metricsClientFactory } from "../../clients/metricsClient";
8
+ import { Count } from "../operational/Count";
9
+ import { Histogram } from "../operational/Histogram";
8
10
  import { isLensOrAssetRequest } from "./reportLensAndAssetDownload";
9
11
  const getAdditionalDimensions = (dimensions) => {
10
12
  switch (dimensions.requestType) {
@@ -57,16 +59,17 @@ const getStatus = (event) => {
57
59
  export const isRelevantRequest = (value) => {
58
60
  return isLensOrAssetRequest(value) || value["requestType"] === COF_REQUEST_TYPE;
59
61
  };
60
- export const reportHttpMetrics = Injectable("reportHttpMetrics", [operationalMetricReporterFactory.token, requestStateEventTargetFactory.token], (reporter, requestStateEventTarget) => {
62
+ export const reportHttpMetrics = Injectable("reportHttpMetrics", [metricsClientFactory.token, requestStateEventTargetFactory.token], (metrics, requestStateEventTarget) => {
61
63
  scan({ name: "inProgress", inProgress: new Map() })(requestStateEventTarget, ["started", "completed", "errored"], (state, event) => {
62
64
  var _a;
63
65
  const { inProgress } = state;
64
- const { dimensions, requestId, timeMs } = event.detail;
66
+ const { dimensions, requestId } = event.detail;
65
67
  if (!isRelevantRequest(dimensions))
66
68
  return state;
67
69
  switch (event.type) {
68
70
  case "started":
69
- inProgress.set(requestId, { startTimeMs: timeMs });
71
+ const timer = event.detail.timer;
72
+ inProgress.set(requestId, { timer });
70
73
  return { name: "inProgress", inProgress };
71
74
  case "completed":
72
75
  case "errored":
@@ -74,23 +77,23 @@ export const reportHttpMetrics = Injectable("reportHttpMetrics", [operationalMet
74
77
  if (!completedRequest)
75
78
  return state;
76
79
  inProgress.delete(requestId);
77
- const downloadTimeMs = timeMs - completedRequest.startTimeMs;
78
80
  const downloadSizeKb = getSizeKb(event);
79
81
  const status = getStatus(event);
80
- const operationalDimensions = new Map([
81
- ["content_type", getContentType(dimensions)],
82
- ["network_type", (_a = getPlatformInfo().connectionType) !== null && _a !== void 0 ? _a : "unknown"],
83
- ["status", status],
84
- ]);
82
+ const operationalDimensions = {
83
+ content_type: getContentType(dimensions),
84
+ network_type: (_a = getPlatformInfo().connectionType) !== null && _a !== void 0 ? _a : "unknown",
85
+ status,
86
+ };
85
87
  for (const [key, value] of getAdditionalDimensions(dimensions)) {
86
- operationalDimensions.set(key, value);
88
+ operationalDimensions[key] = value;
87
89
  }
90
+ completedRequest.timer.measure(operationalDimensions);
88
91
  return {
89
92
  name: "completed",
90
93
  inProgress: state.inProgress,
91
94
  dimensions: operationalDimensions,
92
95
  downloadSizeKb,
93
- downloadTimeMs,
96
+ timer: completedRequest.timer,
94
97
  };
95
98
  default:
96
99
  assertUnreachable(event);
@@ -98,10 +101,10 @@ export const reportHttpMetrics = Injectable("reportHttpMetrics", [operationalMet
98
101
  }).addEventListener("state", ({ detail: state }) => {
99
102
  if (state.name !== "completed")
100
103
  return;
101
- const { dimensions, downloadTimeMs, downloadSizeKb } = state;
102
- reporter.count("download_finished", 1, dimensions);
103
- reporter.timer("download_latency", downloadTimeMs, dimensions);
104
- reporter.histogram("download_size_kb", downloadSizeKb, dimensions);
104
+ const { dimensions, timer, downloadSizeKb } = state;
105
+ metrics.setOperationalMetrics(Count.count("download_finished", 1, dimensions));
106
+ metrics.setOperationalMetrics(Histogram.level("download_size_kb", downloadSizeKb, dimensions));
107
+ metrics.setOperationalMetrics(timer);
105
108
  });
106
109
  });
107
110
  //# sourceMappingURL=reportHttpMetrics.js.map
@@ -1 +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 {\n Dimensions,\n RequestStateEventTarget,\n RequestStateEvents,\n requestStateEventTargetFactory,\n} from \"../../handlers/requestStateEmittingHandler\";\nimport {\n operationalMetricReporterFactory,\n OperationalMetricsReporter,\n} from \"../operational/operationalMetricsReporter\";\nimport { getPlatformInfo } from \"../../platform/platformInfo\";\nimport { AssetDownloadDimensions, isLensOrAssetRequest, LensDownloadDimensions } from \"./reportLensAndAssetDownload\";\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 getAdditionalDimensions = (\n dimensions: LensDownloadDimensions | AssetDownloadDimensions | CofDimensions\n): [string, string][] => {\n switch (dimensions.requestType) {\n case \"lens_content\":\n case \"asset\":\n return [];\n case COF_REQUEST_TYPE:\n return [[\"delta\", dimensions.delta]];\n default:\n assertUnreachable(dimensions);\n }\n};\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, requestStateEventTargetFactory.token] as const,\n (reporter: OperationalMetricsReporter, requestStateEventTarget: RequestStateEventTarget) => {\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\", getPlatformInfo().connectionType ?? \"unknown\"],\n [\"status\", status],\n ]);\n\n for (const [key, value] of getAdditionalDimensions(dimensions)) {\n operationalDimensions.set(key, value);\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"]}
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 {\n Dimensions,\n RequestStateEventTarget,\n RequestStateEvents,\n requestStateEventTargetFactory,\n} from \"../../handlers/requestStateEmittingHandler\";\nimport { getPlatformInfo } from \"../../platform/platformInfo\";\nimport { MetricsClient, metricsClientFactory } from \"../../clients/metricsClient\";\nimport { Count } from \"../operational/Count\";\nimport { Histogram } from \"../operational/Histogram\";\nimport { Timer } from \"../operational/Timer\";\nimport { AssetDownloadDimensions, isLensOrAssetRequest, LensDownloadDimensions } from \"./reportLensAndAssetDownload\";\n\ntype InProgressMap = Map<number, { timer: Timer<\"download_latency\"> }>;\ninterface InProgress {\n name: \"inProgress\";\n inProgress: InProgressMap;\n}\ninterface Completed {\n name: \"completed\";\n inProgress: InProgressMap;\n dimensions: Record<string, string>;\n timer: Timer<\"download_latency\">;\n downloadSizeKb: number;\n}\ntype RequestState = InProgress | Completed;\n\nconst getAdditionalDimensions = (\n dimensions: LensDownloadDimensions | AssetDownloadDimensions | CofDimensions\n): [string, string][] => {\n switch (dimensions.requestType) {\n case \"lens_content\":\n case \"asset\":\n return [];\n case COF_REQUEST_TYPE:\n return [[\"delta\", dimensions.delta]];\n default:\n assertUnreachable(dimensions);\n }\n};\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 [metricsClientFactory.token, requestStateEventTargetFactory.token] as const,\n (metrics: MetricsClient, requestStateEventTarget: RequestStateEventTarget) => {\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 } = event.detail;\n\n if (!isRelevantRequest(dimensions)) return state;\n\n switch (event.type) {\n case \"started\":\n const timer = event.detail.timer;\n inProgress.set(requestId, { timer });\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 downloadSizeKb = getSizeKb(event);\n const status = getStatus(event);\n const operationalDimensions: Record<string, string> = {\n content_type: getContentType(dimensions),\n network_type: getPlatformInfo().connectionType ?? \"unknown\",\n status,\n };\n\n for (const [key, value] of getAdditionalDimensions(dimensions)) {\n operationalDimensions[key] = value;\n }\n\n completedRequest.timer.measure(operationalDimensions);\n\n return {\n name: \"completed\",\n inProgress: state.inProgress,\n dimensions: operationalDimensions,\n downloadSizeKb,\n timer: completedRequest.timer,\n };\n default:\n assertUnreachable(event);\n }\n }\n ).addEventListener(\"state\", ({ detail: state }) => {\n if (state.name !== \"completed\") return;\n\n const { dimensions, timer, downloadSizeKb } = state;\n\n metrics.setOperationalMetrics(Count.count(\"download_finished\", 1, dimensions));\n metrics.setOperationalMetrics(Histogram.level(\"download_size_kb\", downloadSizeKb, dimensions));\n metrics.setOperationalMetrics(timer);\n });\n }\n);\n"]}