@snap/camera-kit 1.14.0 → 1.15.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 (270) hide show
  1. package/README.md +1 -1
  2. package/dist/CameraKit.d.ts +2 -2
  3. package/dist/CameraKit.d.ts.map +1 -1
  4. package/dist/CameraKit.js +4 -0
  5. package/dist/CameraKit.js.map +1 -1
  6. package/dist/RootServices.d.ts +5 -2
  7. package/dist/RootServices.d.ts.map +1 -1
  8. package/dist/RootServices.js.map +1 -1
  9. package/dist/bootstrapCameraKit.d.ts.map +1 -1
  10. package/dist/bootstrapCameraKit.js +5 -2
  11. package/dist/bootstrapCameraKit.js.map +1 -1
  12. package/dist/clients/metricsClient.d.ts +16 -3
  13. package/dist/clients/metricsClient.d.ts.map +1 -1
  14. package/dist/clients/metricsClient.js +14 -6
  15. package/dist/clients/metricsClient.js.map +1 -1
  16. package/dist/configuration.d.ts +52 -2
  17. package/dist/configuration.d.ts.map +1 -1
  18. package/dist/configuration.js +1 -0
  19. package/dist/configuration.js.map +1 -1
  20. package/dist/environment.js +1 -1
  21. package/dist/environment.js.map +1 -1
  22. package/dist/index.d.ts +4 -2
  23. package/dist/index.d.ts.map +1 -1
  24. package/dist/index.js +2 -1
  25. package/dist/index.js.map +1 -1
  26. package/dist/lens/analytics/lensAnalyticEventsHandler.d.ts +9 -0
  27. package/dist/lens/analytics/lensAnalyticEventsHandler.d.ts.map +1 -0
  28. package/dist/lens/analytics/lensAnalyticEventsHandler.js +5 -0
  29. package/dist/lens/analytics/lensAnalyticEventsHandler.js.map +1 -0
  30. package/dist/lens/analytics/registerLensAnalyticEventsHandler.d.ts +35 -0
  31. package/dist/lens/analytics/registerLensAnalyticEventsHandler.d.ts.map +1 -0
  32. package/dist/lens/analytics/registerLensAnalyticEventsHandler.js +13 -0
  33. package/dist/lens/analytics/registerLensAnalyticEventsHandler.js.map +1 -0
  34. package/dist/lensCoreWasmVersions.js +3 -3
  35. package/dist/lensCoreWasmVersions.js.map +1 -1
  36. package/dist/remote-configuration/configurationProvider.d.ts +15 -0
  37. package/dist/remote-configuration/configurationProvider.d.ts.map +1 -0
  38. package/dist/remote-configuration/configurationProvider.js +32 -0
  39. package/dist/remote-configuration/configurationProvider.js.map +1 -0
  40. package/dist/remote-configuration/preloadConfiguration.d.ts.map +1 -1
  41. package/dist/remote-configuration/preloadConfiguration.js +18 -6
  42. package/dist/remote-configuration/preloadConfiguration.js.map +1 -1
  43. package/dist/remote-configuration/util.d.ts +4 -0
  44. package/dist/remote-configuration/util.d.ts.map +1 -0
  45. package/dist/remote-configuration/util.js +17 -0
  46. package/dist/remote-configuration/util.js.map +1 -0
  47. package/dist/uri-handlers/internal-handlers/httpUriHandler.d.ts +7 -5
  48. package/dist/uri-handlers/internal-handlers/httpUriHandler.d.ts.map +1 -1
  49. package/dist/uri-handlers/internal-handlers/httpUriHandler.js +4 -4
  50. package/dist/uri-handlers/internal-handlers/httpUriHandler.js.map +1 -1
  51. package/dist/uri-handlers/internal-handlers/httpValidators.d.ts +2 -1
  52. package/dist/uri-handlers/internal-handlers/httpValidators.d.ts.map +1 -1
  53. package/dist/uri-handlers/internal-handlers/httpValidators.js +13 -1
  54. package/dist/uri-handlers/internal-handlers/httpValidators.js.map +1 -1
  55. package/dist/uri-handlers/uriHandlersRegister.d.ts.map +1 -1
  56. package/dist/uri-handlers/uriHandlersRegister.js +1 -1
  57. package/dist/uri-handlers/uriHandlersRegister.js.map +1 -1
  58. package/docs/html/assets/hierarchy.js +1 -1
  59. package/docs/html/assets/navigation.js +1 -1
  60. package/docs/html/assets/search.js +1 -1
  61. package/docs/html/classes/CameraKit.html +2 -2
  62. package/docs/html/classes/CameraKitSession.html +2 -2
  63. package/docs/html/classes/CameraKitSource.html +2 -2
  64. package/docs/html/classes/LensPerformanceMeasurement.html +2 -2
  65. package/docs/html/classes/LensPerformanceMetrics.html +2 -2
  66. package/docs/html/classes/LensRepository.html +2 -2
  67. package/docs/html/classes/Transform2D.html +2 -2
  68. package/docs/html/classes/TypedCustomEvent.html +3 -3
  69. package/docs/html/classes/TypedEventTarget.html +2 -2
  70. package/docs/html/enums/Lens_CameraFacing.html +2 -2
  71. package/docs/html/functions/bootstrapCameraKit.html +2 -2
  72. package/docs/html/functions/createExtension.html +2 -2
  73. package/docs/html/functions/createImageSource.html +2 -2
  74. package/docs/html/functions/createMediaStreamSource.html +2 -2
  75. package/docs/html/functions/createVideoSource.html +2 -2
  76. package/docs/html/functions/estimateLensPerformance.html +2 -2
  77. package/docs/html/functions/filePickerFactory.html +2 -2
  78. package/docs/html/functions/getExtensionRequestContext.html +2 -2
  79. package/docs/html/functions/lensSourcesFactory.html +2 -2
  80. package/docs/html/functions/remoteApiServicesFactory.html +1 -1
  81. package/docs/html/hierarchy.html +1 -1
  82. package/docs/html/index.html +3 -3
  83. package/docs/html/interfaces/BitmojiUserInfo.html +2 -2
  84. package/docs/html/interfaces/CameraKitBootstrapConfiguration.html +24 -5
  85. package/docs/html/interfaces/CameraKitDeviceOptions.html +3 -3
  86. package/docs/html/interfaces/CameraKitSourceInfo.html +2 -2
  87. package/docs/html/interfaces/CameraKitSourceSubscriber.html +2 -2
  88. package/docs/html/interfaces/ComputedFrameMetrics.html +2 -2
  89. package/docs/html/interfaces/CreateSessionOptions.html +2 -2
  90. package/docs/html/interfaces/EstimatedLensPerformance.html +2 -2
  91. package/docs/html/interfaces/Font.html +2 -2
  92. package/docs/html/interfaces/FriendUserInfo.html +2 -2
  93. package/docs/html/interfaces/FunctionSourceOptions.html +2 -2
  94. package/docs/html/interfaces/Keyboard.html +2 -2
  95. package/docs/html/interfaces/KeyboardActiveEvent.html +2 -2
  96. package/docs/html/interfaces/Lens.html +2 -2
  97. package/docs/html/interfaces/LensCreator.html +2 -2
  98. package/docs/html/interfaces/LensHttpRequest.html +2 -2
  99. package/docs/html/interfaces/LensLaunchData.html +2 -2
  100. package/docs/html/interfaces/LensSource.html +2 -2
  101. package/docs/html/interfaces/LensUserData.html +2 -2
  102. package/docs/html/interfaces/LoadAssetRequest.html +2 -2
  103. package/docs/html/interfaces/MediaStreamSourceOptions.html +3 -3
  104. package/docs/html/interfaces/Preview.html +2 -2
  105. package/docs/html/interfaces/RemoteApiRequest.html +2 -2
  106. package/docs/html/interfaces/RemoteApiResponse.html +2 -2
  107. package/docs/html/interfaces/RemoteApiService.html +2 -2
  108. package/docs/html/interfaces/ScreenRegion.html +2 -2
  109. package/docs/html/interfaces/Snapcode.html +2 -2
  110. package/docs/html/interfaces/UriCancelRequest.html +2 -2
  111. package/docs/html/interfaces/UriRequest.html +2 -2
  112. package/docs/html/interfaces/UriResponse.html +2 -2
  113. package/docs/html/interfaces/VideoSourceOptions.html +3 -3
  114. package/docs/html/modules.html +1 -1
  115. package/docs/html/types/ArgumentValidationError.html +2 -2
  116. package/docs/html/types/AssetLoader.html +2 -2
  117. package/docs/html/types/AssetResponse.html +1 -1
  118. package/docs/html/types/AssetTiming.html +2 -2
  119. package/docs/html/types/BenchmarkError.html +1 -1
  120. package/docs/html/types/BootstrapError.html +2 -2
  121. package/docs/html/types/CacheKeyNotFoundError.html +1 -1
  122. package/docs/html/types/CameraKitSessionEventListener.html +2 -2
  123. package/docs/html/types/CameraKitSessionEvents.html +2 -2
  124. package/docs/html/types/CameraKitSourceError.html +1 -1
  125. package/docs/html/types/ConfigurationError.html +2 -2
  126. package/docs/html/types/FetchHandler.html +1 -1
  127. package/docs/html/types/FilePicker.html +2 -2
  128. package/docs/html/types/FilePickerOptions.html +2 -2
  129. package/docs/html/types/FilePickerResult.html +2 -2
  130. package/docs/html/types/KeyboardEventListener.html +2 -2
  131. package/docs/html/types/KeyboardEvents.html +2 -2
  132. package/docs/html/types/LegalError.html +1 -1
  133. package/docs/html/types/LensAbortError.html +2 -2
  134. package/docs/html/types/LensAssetError.html +2 -2
  135. package/docs/html/types/LensContentValidationError.html +1 -1
  136. package/docs/html/types/LensError.html +1 -1
  137. package/docs/html/types/LensExecutionError.html +2 -2
  138. package/docs/html/types/LensHttpHandler.html +2 -2
  139. package/docs/html/types/LensImagePickerError.html +2 -2
  140. package/docs/html/types/LensLaunchParams.html +2 -2
  141. package/docs/html/types/LensMetricsEvents.html +2 -2
  142. package/docs/html/types/LensPerformanceCluster.html +1 -1
  143. package/docs/html/types/LensView.html +2 -2
  144. package/docs/html/types/LensWait.html +2 -2
  145. package/docs/html/types/LogLevel.html +2 -2
  146. package/docs/html/types/Logger.html +2 -2
  147. package/docs/html/types/Matrix.html +2 -2
  148. package/docs/html/types/OpenDefaultFilePicker.html +2 -2
  149. package/docs/html/types/PersistentStoreError.html +2 -2
  150. package/docs/html/types/PickedFile.html +2 -2
  151. package/docs/html/types/PlatformNotSupportedError.html +2 -2
  152. package/docs/html/types/PublicContainer.html +2 -2
  153. package/docs/html/types/PublicServices.html +2 -2
  154. package/docs/html/types/RemoteApiCancelRequestHandler.html +2 -2
  155. package/docs/html/types/RemoteApiRequestHandler.html +2 -2
  156. package/docs/html/types/RemoteApiServices.html +1 -1
  157. package/docs/html/types/RemoteApiStatus.html +2 -2
  158. package/docs/html/types/RenderTarget.html +2 -2
  159. package/docs/html/types/ScreenRegionType.html +2 -2
  160. package/docs/html/types/ScreenRegions.html +2 -2
  161. package/docs/html/types/Uri.html +1 -1
  162. package/docs/html/types/ValidationStrategy.html +11 -0
  163. package/docs/html/types/WebGLError.html +1 -1
  164. package/docs/html/types/Zodiac.html +1 -1
  165. package/docs/html/variables/extensionRequestContext.html +2 -2
  166. package/docs/md/README.md +2 -2
  167. package/docs/md/classes/CameraKit.md +1 -1
  168. package/docs/md/classes/CameraKitSession.md +1 -1
  169. package/docs/md/classes/CameraKitSource.md +1 -1
  170. package/docs/md/classes/LensPerformanceMeasurement.md +1 -1
  171. package/docs/md/classes/LensPerformanceMetrics.md +1 -1
  172. package/docs/md/classes/LensRepository.md +1 -1
  173. package/docs/md/classes/Transform2D.md +1 -1
  174. package/docs/md/classes/TypedCustomEvent.md +1 -1
  175. package/docs/md/classes/TypedEventTarget.md +1 -1
  176. package/docs/md/enumerations/Lens_CameraFacing.md +1 -1
  177. package/docs/md/functions/bootstrapCameraKit.md +1 -1
  178. package/docs/md/functions/createExtension.md +1 -1
  179. package/docs/md/functions/createImageSource.md +1 -1
  180. package/docs/md/functions/createMediaStreamSource.md +1 -1
  181. package/docs/md/functions/createVideoSource.md +1 -1
  182. package/docs/md/functions/estimateLensPerformance.md +1 -1
  183. package/docs/md/functions/filePickerFactory.md +1 -1
  184. package/docs/md/functions/getExtensionRequestContext.md +1 -1
  185. package/docs/md/functions/lensSourcesFactory.md +1 -1
  186. package/docs/md/functions/remoteApiServicesFactory.md +1 -1
  187. package/docs/md/globals.md +3 -2
  188. package/docs/md/interfaces/BitmojiUserInfo.md +1 -1
  189. package/docs/md/interfaces/CameraKitBootstrapConfiguration.md +43 -3
  190. package/docs/md/interfaces/CameraKitDeviceOptions.md +1 -1
  191. package/docs/md/interfaces/CameraKitSourceInfo.md +1 -1
  192. package/docs/md/interfaces/CameraKitSourceSubscriber.md +1 -1
  193. package/docs/md/interfaces/ComputedFrameMetrics.md +1 -1
  194. package/docs/md/interfaces/CreateSessionOptions.md +1 -1
  195. package/docs/md/interfaces/EstimatedLensPerformance.md +1 -1
  196. package/docs/md/interfaces/Font.md +1 -1
  197. package/docs/md/interfaces/FriendUserInfo.md +1 -1
  198. package/docs/md/interfaces/FunctionSourceOptions.md +1 -1
  199. package/docs/md/interfaces/Keyboard.md +1 -1
  200. package/docs/md/interfaces/KeyboardActiveEvent.md +1 -1
  201. package/docs/md/interfaces/Lens.md +1 -1
  202. package/docs/md/interfaces/LensCreator.md +1 -1
  203. package/docs/md/interfaces/LensHttpRequest.md +1 -1
  204. package/docs/md/interfaces/LensLaunchData.md +1 -1
  205. package/docs/md/interfaces/LensSource.md +1 -1
  206. package/docs/md/interfaces/LensUserData.md +1 -1
  207. package/docs/md/interfaces/LoadAssetRequest.md +1 -1
  208. package/docs/md/interfaces/MediaStreamSourceOptions.md +1 -1
  209. package/docs/md/interfaces/Preview.md +1 -1
  210. package/docs/md/interfaces/RemoteApiRequest.md +1 -1
  211. package/docs/md/interfaces/RemoteApiResponse.md +1 -1
  212. package/docs/md/interfaces/RemoteApiService.md +1 -1
  213. package/docs/md/interfaces/ScreenRegion.md +1 -1
  214. package/docs/md/interfaces/Snapcode.md +1 -1
  215. package/docs/md/interfaces/UriCancelRequest.md +1 -1
  216. package/docs/md/interfaces/UriRequest.md +1 -1
  217. package/docs/md/interfaces/UriResponse.md +1 -1
  218. package/docs/md/interfaces/VideoSourceOptions.md +1 -1
  219. package/docs/md/type-aliases/ArgumentValidationError.md +1 -1
  220. package/docs/md/type-aliases/AssetLoader.md +1 -1
  221. package/docs/md/type-aliases/AssetResponse.md +1 -1
  222. package/docs/md/type-aliases/AssetTiming.md +1 -1
  223. package/docs/md/type-aliases/BenchmarkError.md +1 -1
  224. package/docs/md/type-aliases/BootstrapError.md +1 -1
  225. package/docs/md/type-aliases/CacheKeyNotFoundError.md +1 -1
  226. package/docs/md/type-aliases/CameraKitSessionEventListener.md +1 -1
  227. package/docs/md/type-aliases/CameraKitSessionEvents.md +1 -1
  228. package/docs/md/type-aliases/CameraKitSourceError.md +1 -1
  229. package/docs/md/type-aliases/ConfigurationError.md +1 -1
  230. package/docs/md/type-aliases/FetchHandler.md +1 -1
  231. package/docs/md/type-aliases/FilePicker.md +1 -1
  232. package/docs/md/type-aliases/FilePickerOptions.md +1 -1
  233. package/docs/md/type-aliases/FilePickerResult.md +1 -1
  234. package/docs/md/type-aliases/KeyboardEventListener.md +1 -1
  235. package/docs/md/type-aliases/KeyboardEvents.md +1 -1
  236. package/docs/md/type-aliases/LegalError.md +1 -1
  237. package/docs/md/type-aliases/LensAbortError.md +1 -1
  238. package/docs/md/type-aliases/LensAssetError.md +1 -1
  239. package/docs/md/type-aliases/LensContentValidationError.md +1 -1
  240. package/docs/md/type-aliases/LensError.md +1 -1
  241. package/docs/md/type-aliases/LensExecutionError.md +1 -1
  242. package/docs/md/type-aliases/LensHttpHandler.md +1 -1
  243. package/docs/md/type-aliases/LensImagePickerError.md +1 -1
  244. package/docs/md/type-aliases/LensLaunchParams.md +1 -1
  245. package/docs/md/type-aliases/LensMetricsEvents.md +1 -1
  246. package/docs/md/type-aliases/LensPerformanceCluster.md +1 -1
  247. package/docs/md/type-aliases/LensView.md +1 -1
  248. package/docs/md/type-aliases/LensWait.md +1 -1
  249. package/docs/md/type-aliases/LogLevel.md +1 -1
  250. package/docs/md/type-aliases/Logger.md +1 -1
  251. package/docs/md/type-aliases/Matrix.md +1 -1
  252. package/docs/md/type-aliases/OpenDefaultFilePicker.md +1 -1
  253. package/docs/md/type-aliases/PersistentStoreError.md +1 -1
  254. package/docs/md/type-aliases/PickedFile.md +1 -1
  255. package/docs/md/type-aliases/PlatformNotSupportedError.md +1 -1
  256. package/docs/md/type-aliases/PublicContainer.md +1 -1
  257. package/docs/md/type-aliases/PublicServices.md +2 -2
  258. package/docs/md/type-aliases/RemoteApiCancelRequestHandler.md +1 -1
  259. package/docs/md/type-aliases/RemoteApiRequestHandler.md +1 -1
  260. package/docs/md/type-aliases/RemoteApiServices.md +1 -1
  261. package/docs/md/type-aliases/RemoteApiStatus.md +1 -1
  262. package/docs/md/type-aliases/RenderTarget.md +1 -1
  263. package/docs/md/type-aliases/ScreenRegionType.md +1 -1
  264. package/docs/md/type-aliases/ScreenRegions.md +1 -1
  265. package/docs/md/type-aliases/Uri.md +1 -1
  266. package/docs/md/type-aliases/ValidationStrategy.md +22 -0
  267. package/docs/md/type-aliases/WebGLError.md +1 -1
  268. package/docs/md/type-aliases/Zodiac.md +1 -1
  269. package/docs/md/variables/extensionRequestContext.md +1 -1
  270. package/package.json +2 -2
@@ -1 +1 @@
1
- {"version":3,"file":"httpUriHandler.js","sourceRoot":"","sources":["../../../src/uri-handlers/internal-handlers/httpUriHandler.ts"],"names":[],"mappings":"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","sourcesContent":["import type { RemoteApiSpecsClient } from \"../../clients/remoteApiSpecsClient\";\nimport type { Lens } from \"../../lens/Lens\";\nimport type { LensState } from \"../../session/lensState\";\nimport { getLogger } from \"../../logger/logger\";\nimport type { SessionState } from \"../../session/sessionState\";\nimport { namedError } from \"../../namedErrors\";\nimport type { CameraKitBootstrapConfiguration, LensHttpHandler } from \"../../configuration\";\nimport type { UriHandler, UriRequest, UriResponse } from \"../UriHandlers\";\nimport { createUriRequestProcessor } from \"../uriRequestProcessor\";\nimport type { RemoteApiSpec } from \"../../generated-proto/pb_schema/camera_kit/v3/remote_api_spec\";\nimport { isPromise } from \"../../common/typeguards\";\nimport type { ContentType } from \"../../lens-core-module/generated-types\";\nimport { requestValidationErrorName, validateRequest } from \"./httpValidators\";\n\nconst logger = getLogger(\"lensHttpHandler\");\n\nconst lensHttpHandlerErrorName = \"LensHttpHandlerError\";\nconst lensHttpHandlerError = namedError(lensHttpHandlerErrorName);\n\ntype LensHttpRequestErrorType = \"UnknownError\" | \"LensHttpHandlerError\" | \"RequestValidationError\";\n\nconst allowedResponseHeaders = [\n \"Accept-Ranges\",\n \"Cache-Control\",\n \"Content-Language\",\n \"Content-Length\",\n \"Content-Type\",\n \"Date\",\n \"ETag\",\n \"Expires\",\n \"Last-Modified\",\n \"Location\",\n];\n\nconst requestHeadersToExclude = [\"x-sc-lenses-remote-api-spec-id\"];\n\n/**\n *\n * @internal\n *\n * @param lensState\n * @param sessionState\n * @param remoteApiSpecsClient\n * @param clientLentHttpRequestHandler\n * @returns\n */\nexport function createHttpUriHandler(\n lensState: LensState,\n sessionState: SessionState,\n remoteApiSpecsClient: RemoteApiSpecsClient,\n customLentFetchHandler: LensHttpHandler | undefined\n): UriHandler {\n let allowlistPromise: Promise<RemoteApiSpec[]> | undefined = undefined;\n\n return createUriRequestProcessor({\n uri: [\"http://\", \"https://\"],\n lensState,\n sessionState,\n async processRequest({ request, lens, reply, setCancellationHandler }) {\n allowlistPromise = allowlistPromise ?? getAllowlist(remoteApiSpecsClient);\n const allowlist = await allowlistPromise;\n handleHttpUriRequest(request, lens, reply, setCancellationHandler, allowlist, customLentFetchHandler);\n },\n processInternalError(error: Error) {\n // The expectation is that if an error occurs, it happens in our own implementation,\n // because app callbacks are wrapped with try..catch blocks.\n // Therefore, we would like to report this error.\n logger.error(error);\n },\n });\n}\n\nasync function getAllowlist(remoteApiSpecsClient: RemoteApiSpecsClient) {\n const result = await remoteApiSpecsClient.getRemoteApiSpecs({});\n if (!result.ok) throw new Error(\"Failed getting Remote API specs.\", { cause: result.unwrapErr() });\n return result.unwrap().message?.remoteApiSpecs ?? [];\n}\n\n/**\n *\n * @internal\n *\n * @param request\n * @param lens\n * @param reply\n * @param setCancellationHandler\n * @param allowlist\n * @param clientLensHttpRequestHandler\n */\nexport async function handleHttpUriRequest(\n request: UriRequest,\n lens: Lens,\n reply: (response: UriResponse) => void,\n setCancellationHandler: (fn: () => void) => void,\n allowlist: RemoteApiSpec[],\n customLensHttpHandler: LensHttpHandler | undefined\n) {\n try {\n validateRequest(request, allowlist);\n const { url, init } = mapLensToFetchRequest(request);\n\n // abort controller to abort fetch request when lens sends cancellation request\n const abortController = new AbortController();\n init.signal = abortController.signal;\n setCancellationHandler(() => abortController.abort());\n\n let response: Response;\n if (customLensHttpHandler) {\n const handlerName = \"lensHttpHandler\" satisfies keyof CameraKitBootstrapConfiguration;\n try {\n const { uri, identifier, method, metadata, data } = request;\n const responsePromise = customLensHttpHandler(url, init, {\n url: uri,\n identifier,\n method,\n data,\n headers: metadata,\n lens,\n });\n if (!isPromise(responsePromise)) {\n throw lensHttpHandlerError(\n `The '${handlerName}' callback provided to Camera Kit must return a Promise.`\n );\n }\n response = await responsePromise;\n } catch (error) {\n // NOTE: This error message will be displayed in browser only\n error =\n error instanceof Error && error.name === lensHttpHandlerErrorName\n ? error\n : lensHttpHandlerError(\n `The '${handlerName}' callback provided to Camera Kit configuration failed.`,\n error\n );\n throw error;\n }\n } else {\n response = await fetch(url, init);\n }\n\n reply(await mapFetchToLensResponse(response));\n } catch (error) {\n if (error instanceof Error && error.name === lensHttpHandlerErrorName) {\n // We do not report errors generated in partners's app code\n logger.warn(error);\n reply(\n getErrorResponse(\n \"LensHttpHandlerError\",\n // In case of an error in partner provided callback,\n // we just send a generic message to lens, which is common for all Camera Kit SDKs.\n `The lens HTTP request handler provided to Camera Kit failed.`\n )\n );\n } else if (error instanceof Error && error.name === requestValidationErrorName) {\n // We do not report validation error caused by lens code\n logger.warn(error);\n reply(\n getErrorResponse(\n \"RequestValidationError\",\n // NOTE: Validation errors sent to lens should be consistent with the other Camera Kit SDKs\n error.message\n )\n );\n } else {\n // We report error to our backend only in case of unknown error\n logger.error(error);\n reply(\n getErrorResponse(\n \"UnknownError\",\n // NOTE: we don't want to expose error details to lens\n \"An unknown error occurred.\"\n )\n );\n }\n }\n}\n\nfunction getErrorResponse(errorType: LensHttpRequestErrorType, message: string): UriResponse {\n return {\n code: 400,\n description: \"\",\n contentType: \"text/plain\",\n metadata: {\n \"x-camera-kit-error-type\": errorType,\n },\n data: new TextEncoder().encode(message),\n };\n}\n\n/**\n * @internal\n */\nexport function mapLensToFetchRequest({ uri, method, metadata, data }: UriRequest): { url: string; init: RequestInit } {\n const headers = new Headers(metadata);\n // remove internal headers that LensCore adds\n for (const header of requestHeadersToExclude) {\n headers.delete(header);\n }\n return {\n url: uri,\n init: {\n headers: Object.fromEntries(headers.entries()),\n body: method !== \"GET\" && (method as any) !== \"HEAD\" && method !== undefined ? data : undefined,\n method,\n },\n };\n}\n\n/**\n * @internal\n */\nexport async function mapFetchToLensResponse(response: Response): Promise<UriResponse> {\n const metadata: Record<string, string> = {};\n for (const allowedHeader of allowedResponseHeaders) {\n const value = response.headers.get(allowedHeader);\n if (value) {\n metadata[allowedHeader.toLowerCase()] = value;\n }\n }\n return {\n code: response.status,\n description: \"\",\n // Safety: At the time of writing any contentType value provided in the response object will be ignored:\n // eslint-disable-next-line max-len\n // https://github.sc-corp.net/Snapchat/LensCore/blob/722629250973cdf1064baef85d9360229f9dff76/Src/Scenarium/Primitives/RemoteServiceModule.cpp#L517-L533\n // But we still try to provide it with the correct value for consistency with mobile SDKs.\n contentType: (response.headers.get(\"Content-Type\") ?? \"\") as ContentType,\n metadata,\n data: await response.arrayBuffer(),\n };\n}\n"]}
1
+ {"version":3,"file":"httpUriHandler.js","sourceRoot":"","sources":["../../../src/uri-handlers/internal-handlers/httpUriHandler.ts"],"names":[],"mappings":"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","sourcesContent":["import type { RemoteApiSpecsClient } from \"../../clients/remoteApiSpecsClient\";\nimport type { Lens } from \"../../lens/Lens\";\nimport type { LensState } from \"../../session/lensState\";\nimport { getLogger } from \"../../logger/logger\";\nimport type { SessionState } from \"../../session/sessionState\";\nimport { namedError } from \"../../namedErrors\";\nimport type { CameraKitBootstrapConfiguration, LensHttpHandler, ValidationStrategy } from \"../../configuration\";\nimport type { UriHandler, UriRequest, UriResponse } from \"../UriHandlers\";\nimport { createUriRequestProcessor } from \"../uriRequestProcessor\";\nimport type { RemoteApiSpec } from \"../../generated-proto/pb_schema/camera_kit/v3/remote_api_spec\";\nimport { isPromise } from \"../../common/typeguards\";\nimport type { ContentType } from \"../../lens-core-module/generated-types\";\nimport { requestValidationErrorName, validateRequest } from \"./httpValidators\";\n\nconst logger = getLogger(\"lensHttpHandler\");\n\nconst lensHttpHandlerErrorName = \"LensHttpHandlerError\";\nconst lensHttpHandlerError = namedError(lensHttpHandlerErrorName);\n\ntype LensHttpRequestErrorType = \"UnknownError\" | \"LensHttpHandlerError\" | \"RequestValidationError\";\n\nconst allowedResponseHeaders = [\n \"Accept-Ranges\",\n \"Cache-Control\",\n \"Content-Language\",\n \"Content-Length\",\n \"Content-Type\",\n \"Date\",\n \"ETag\",\n \"Expires\",\n \"Last-Modified\",\n \"Location\",\n];\n\nconst requestHeadersToExclude = [\"x-sc-lenses-remote-api-spec-id\"];\n\n/**\n *\n * @internal\n *\n * @param lensState\n * @param sessionState\n * @param remoteApiSpecsClient\n * @param customLentFetchHandler\n * @param validationStrategy\n * @returns\n */\nexport function createHttpUriHandler(\n lensState: LensState,\n sessionState: SessionState,\n remoteApiSpecsClient: RemoteApiSpecsClient,\n customLentFetchHandler: LensHttpHandler | undefined,\n validationStrategy: ValidationStrategy = \"strict\"\n): UriHandler {\n let allowlistPromise: Promise<RemoteApiSpec[]> | undefined = undefined;\n\n return createUriRequestProcessor({\n uri: [\"http://\", \"https://\"],\n lensState,\n sessionState,\n async processRequest({ request, lens, reply, setCancellationHandler }) {\n allowlistPromise = allowlistPromise ?? getAllowlist(remoteApiSpecsClient);\n const allowlist = await allowlistPromise;\n handleHttpUriRequest(\n request,\n lens,\n reply,\n setCancellationHandler,\n allowlist,\n customLentFetchHandler,\n validationStrategy\n );\n },\n processInternalError(error: Error) {\n // The expectation is that if an error occurs, it happens in our own implementation,\n // because app callbacks are wrapped with try..catch blocks.\n // Therefore, we would like to report this error.\n logger.error(error);\n },\n });\n}\n\nasync function getAllowlist(remoteApiSpecsClient: RemoteApiSpecsClient) {\n const result = await remoteApiSpecsClient.getRemoteApiSpecs({});\n if (!result.ok) throw new Error(\"Failed getting Remote API specs.\", { cause: result.unwrapErr() });\n return result.unwrap().message?.remoteApiSpecs ?? [];\n}\n\n/**\n *\n * @internal\n *\n * @param request\n * @param lens\n * @param reply\n * @param setCancellationHandler\n * @param allowlist\n * @param customLensHttpHandler\n * @param validationStrategy\n */\nexport async function handleHttpUriRequest(\n request: UriRequest,\n lens: Lens,\n reply: (response: UriResponse) => void,\n setCancellationHandler: (fn: () => void) => void,\n allowlist: RemoteApiSpec[],\n customLensHttpHandler: LensHttpHandler | undefined,\n validationStrategy: ValidationStrategy = \"strict\"\n) {\n try {\n validateRequest(request, allowlist, validationStrategy);\n const { url, init } = mapLensToFetchRequest(request);\n\n // abort controller to abort fetch request when lens sends cancellation request\n const abortController = new AbortController();\n init.signal = abortController.signal;\n setCancellationHandler(() => abortController.abort());\n\n let response: Response;\n if (customLensHttpHandler) {\n const handlerName = \"lensHttpHandler\" satisfies keyof CameraKitBootstrapConfiguration;\n try {\n const { uri, identifier, method, metadata, data } = request;\n const responsePromise = customLensHttpHandler(url, init, {\n url: uri,\n identifier,\n method,\n data,\n headers: metadata,\n lens,\n });\n if (!isPromise(responsePromise)) {\n throw lensHttpHandlerError(\n `The '${handlerName}' callback provided to Camera Kit must return a Promise.`\n );\n }\n response = await responsePromise;\n } catch (error) {\n // NOTE: This error message will be displayed in browser only\n error =\n error instanceof Error && error.name === lensHttpHandlerErrorName\n ? error\n : lensHttpHandlerError(\n `The '${handlerName}' callback provided to Camera Kit configuration failed.`,\n error\n );\n throw error;\n }\n } else {\n response = await fetch(url, init);\n }\n\n reply(await mapFetchToLensResponse(response));\n } catch (error) {\n if (error instanceof Error && error.name === lensHttpHandlerErrorName) {\n // We do not report errors generated in partners's app code\n logger.warn(error);\n reply(\n getErrorResponse(\n \"LensHttpHandlerError\",\n // In case of an error in partner provided callback,\n // we just send a generic message to lens, which is common for all Camera Kit SDKs.\n `The lens HTTP request handler provided to Camera Kit failed.`\n )\n );\n } else if (error instanceof Error && error.name === requestValidationErrorName) {\n // We do not report validation error caused by lens code\n logger.warn(error);\n reply(\n getErrorResponse(\n \"RequestValidationError\",\n // NOTE: Validation errors sent to lens should be consistent with the other Camera Kit SDKs\n error.message\n )\n );\n } else {\n // We report error to our backend only in case of unknown error\n logger.error(error);\n reply(\n getErrorResponse(\n \"UnknownError\",\n // NOTE: we don't want to expose error details to lens\n \"An unknown error occurred.\"\n )\n );\n }\n }\n}\n\nfunction getErrorResponse(errorType: LensHttpRequestErrorType, message: string): UriResponse {\n return {\n code: 400,\n description: \"\",\n contentType: \"text/plain\",\n metadata: {\n \"x-camera-kit-error-type\": errorType,\n },\n data: new TextEncoder().encode(message),\n };\n}\n\n/**\n * @internal\n */\nexport function mapLensToFetchRequest({ uri, method, metadata, data }: UriRequest): { url: string; init: RequestInit } {\n const headers = new Headers(metadata);\n // remove internal headers that LensCore adds\n for (const header of requestHeadersToExclude) {\n headers.delete(header);\n }\n return {\n url: uri,\n init: {\n headers: Object.fromEntries(headers.entries()),\n body: method !== \"GET\" && (method as any) !== \"HEAD\" && method !== undefined ? data : undefined,\n method,\n },\n };\n}\n\n/**\n * @internal\n */\nexport async function mapFetchToLensResponse(response: Response): Promise<UriResponse> {\n const metadata: Record<string, string> = {};\n for (const allowedHeader of allowedResponseHeaders) {\n const value = response.headers.get(allowedHeader);\n if (value) {\n metadata[allowedHeader.toLowerCase()] = value;\n }\n }\n return {\n code: response.status,\n description: \"\",\n // Safety: At the time of writing any contentType value provided in the response object will be ignored:\n // eslint-disable-next-line max-len\n // https://github.sc-corp.net/Snapchat/LensCore/blob/722629250973cdf1064baef85d9360229f9dff76/Src/Scenarium/Primitives/RemoteServiceModule.cpp#L517-L533\n // But we still try to provide it with the correct value for consistency with mobile SDKs.\n contentType: (response.headers.get(\"Content-Type\") ?? \"\") as ContentType,\n metadata,\n data: await response.arrayBuffer(),\n };\n}\n"]}
@@ -1,8 +1,9 @@
1
1
  import type { RemoteApiSpec, RemoteParameter } from "../../generated-proto/pb_schema/camera_kit/v3/remote_api_spec";
2
+ import type { ValidationStrategy } from "../../configuration";
2
3
  import type { UriRequest } from "../UriHandlers";
3
4
  export declare const requestValidationErrorName = "RequestValidationError";
4
5
  export declare const requestValidationError: (message: string, cause?: unknown) => never;
5
- export declare function validateRequest(request: UriRequest, specs: RemoteApiSpec[]): void;
6
+ export declare function validateRequest(request: UriRequest, specs: RemoteApiSpec[], validationStrategy?: ValidationStrategy): void;
6
7
  export declare function validatePath(path: string, parameters: RemoteParameter[]): void;
7
8
  export declare function validateHeaders(headers: Record<string, string>, parameters: RemoteParameter[]): void;
8
9
  export declare function validateQuery(queryParams: URLSearchParams, parameters: RemoteParameter[]): void;
@@ -1 +1 @@
1
- {"version":3,"file":"httpValidators.d.ts","sourceRoot":"","sources":["../../../src/uri-handlers/internal-handlers/httpValidators.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,aAAa,EAAE,eAAe,EAAE,MAAM,+DAA+D,CAAC;AAIpH,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,gBAAgB,CAAC;AAEjD,eAAO,MAAM,0BAA0B,2BAA2B,CAAC;AACnE,eAAO,MAAM,sBAAsB,6CAAyC,CAAC;AAE7E,wBAAgB,eAAe,CAAC,OAAO,EAAE,UAAU,EAAE,KAAK,EAAE,aAAa,EAAE,QA8B1E;AAED,wBAAgB,YAAY,CAAC,IAAI,EAAE,MAAM,EAAE,UAAU,EAAE,eAAe,EAAE,QAqDvE;AAED,wBAAgB,eAAe,CAAC,OAAO,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,EAAE,UAAU,EAAE,eAAe,EAAE,QAuB7F;AAED,wBAAgB,aAAa,CAAC,WAAW,EAAE,eAAe,EAAE,UAAU,EAAE,eAAe,EAAE,QAwBxF"}
1
+ {"version":3,"file":"httpValidators.d.ts","sourceRoot":"","sources":["../../../src/uri-handlers/internal-handlers/httpValidators.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,aAAa,EAAE,eAAe,EAAE,MAAM,+DAA+D,CAAC;AAIpH,OAAO,KAAK,EAAE,kBAAkB,EAAE,MAAM,qBAAqB,CAAC;AAC9D,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,gBAAgB,CAAC;AAEjD,eAAO,MAAM,0BAA0B,2BAA2B,CAAC;AACnE,eAAO,MAAM,sBAAsB,6CAAyC,CAAC;AAE7E,wBAAgB,eAAe,CAC3B,OAAO,EAAE,UAAU,EACnB,KAAK,EAAE,aAAa,EAAE,EACtB,kBAAkB,GAAE,kBAA6B,QAuDpD;AAED,wBAAgB,YAAY,CAAC,IAAI,EAAE,MAAM,EAAE,UAAU,EAAE,eAAe,EAAE,QAqDvE;AAED,wBAAgB,eAAe,CAAC,OAAO,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,EAAE,UAAU,EAAE,eAAe,EAAE,QAuB7F;AAED,wBAAgB,aAAa,CAAC,WAAW,EAAE,eAAe,EAAE,UAAU,EAAE,eAAe,EAAE,QAwBxF"}
@@ -4,13 +4,22 @@ import { RemoteParameter_ParameterLocation } from "../../generated-proto/pb_sche
4
4
  import { namedError } from "../../namedErrors";
5
5
  export const requestValidationErrorName = "RequestValidationError";
6
6
  export const requestValidationError = namedError(requestValidationErrorName);
7
- export function validateRequest(request, specs) {
7
+ export function validateRequest(request, specs, validationStrategy = "strict") {
8
8
  var _a;
9
+ if (validationStrategy === "deny") {
10
+ throw requestValidationError("All lens HTTP requests are denied by the current validation strategy.");
11
+ }
12
+ if (validationStrategy === "unrestricted") {
13
+ return;
14
+ }
9
15
  const url = new URL(request.uri);
10
16
  for (const spec of specs) {
11
17
  if (url.host !== spec.host || url.protocol !== (spec.tlsRequired ? "https:" : "http:")) {
12
18
  continue;
13
19
  }
20
+ if (validationStrategy === "host") {
21
+ return;
22
+ }
14
23
  const path = url.pathname.replace(/^\/|\/$/g, "");
15
24
  for (const endpoint of spec.endpoints) {
16
25
  const endpointPath = endpoint.path.replace(/^\/|\/$/g, "");
@@ -20,6 +29,9 @@ export function validateRequest(request, specs) {
20
29
  if (!endpoint.methods.includes(method))
21
30
  continue;
22
31
  validatePath(path.split(endpointPath)[1], endpoint.parameters);
32
+ if (validationStrategy === "route") {
33
+ return;
34
+ }
23
35
  validateHeaders(request.metadata, endpoint.parameters);
24
36
  validateQuery(url.searchParams, endpoint.parameters);
25
37
  return;
@@ -1 +1 @@
1
- {"version":3,"file":"httpValidators.js","sourceRoot":"","sources":["../../../src/uri-handlers/internal-handlers/httpValidators.ts"],"names":[],"mappings":"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","sourcesContent":["import { isEmptyString } from \"../../common/typeguards\";\nimport type { RemoteApiSpec, RemoteParameter } from \"../../generated-proto/pb_schema/camera_kit/v3/remote_api_spec\";\nimport { RemoteEndpoint_HttpRequestMethod } from \"../../generated-proto/pb_schema/camera_kit/v3/remote_api_spec\";\nimport { RemoteParameter_ParameterLocation } from \"../../generated-proto/pb_schema/camera_kit/v3/remote_api_spec\";\nimport { namedError } from \"../../namedErrors\";\nimport type { UriRequest } from \"../UriHandlers\";\n\nexport const requestValidationErrorName = \"RequestValidationError\";\nexport const requestValidationError = namedError(requestValidationErrorName);\n\nexport function validateRequest(request: UriRequest, specs: RemoteApiSpec[]) {\n const url = new URL(request.uri);\n\n // 1. Given url, method and headers and spec:\n for (const spec of specs) {\n // 2. Check protocol and host.\n if (url.host !== spec.host || url.protocol !== (spec.tlsRequired ? \"https:\" : \"http:\")) {\n continue;\n }\n\n // 3. Go for each part together with the path parameters.\n const path = url.pathname.replace(/^\\/|\\/$/g, \"\");\n for (const endpoint of spec.endpoints) {\n const endpointPath = endpoint.path.replace(/^\\/|\\/$/g, \"\");\n if (!path.startsWith(endpointPath)) continue;\n\n const method =\n RemoteEndpoint_HttpRequestMethod[request.method] ?? RemoteEndpoint_HttpRequestMethod.UNRECOGNIZED;\n if (!endpoint.methods.includes(method)) continue;\n\n validatePath(path.split(endpointPath)[1], endpoint.parameters);\n validateHeaders(request.metadata, endpoint.parameters);\n validateQuery(url.searchParams, endpoint.parameters);\n // The request matches the current endpoint\n return;\n }\n }\n\n // The request does not match any of the endpoints\n throw requestValidationError(\"The request does not match any of the Remote API specifications.\");\n}\n\nexport function validatePath(path: string, parameters: RemoteParameter[]) {\n const pathComponents = path.split(\"/\").filter(Boolean);\n\n let paramIndex = 0;\n\n for (const param of parameters) {\n if (param.location !== RemoteParameter_ParameterLocation.PATH) continue;\n\n const paramNameComponent = pathComponents[paramIndex];\n const paramValueComponent = pathComponents[paramIndex + 1];\n\n if (param.constant) {\n // For constant parameters, the value must match the defaultValue\n if (paramNameComponent === param.name && paramValueComponent === param.defaultValue) {\n paramIndex += 2; // Move to the next parameter pair\n } else {\n throw requestValidationError(\n `Expected constant parameter '${param.name}' with value '${param.defaultValue}' ` +\n `at position ${paramIndex}, but found '${paramNameComponent}' and '${paramValueComponent}'.`\n );\n }\n } else if (param.optional) {\n if (paramNameComponent === param.name) {\n // Check if there's another component for its value\n if (paramValueComponent !== undefined) {\n // Optional param with a value\n paramIndex += 2;\n } else {\n // Optional param without a value\n paramIndex += 1;\n }\n }\n // If optional and not present, continue without incrementing paramIndex\n } else {\n // For regular parameters, we just need to ensure a name/value pair exists\n if (paramNameComponent === param.name && paramValueComponent !== undefined) {\n paramIndex += 2; // Move to the next parameter pair\n } else {\n throw requestValidationError(\n `Expected parameter '${param.name}' with a value at position ${paramIndex}, ` +\n `but found '${paramNameComponent}' and '${paramValueComponent}'.`\n );\n }\n }\n }\n\n // After processing all parameters, there should be no extra path components\n if (paramIndex !== pathComponents.length) {\n const invalidPath = pathComponents.slice(paramIndex).join(\"/\");\n throw requestValidationError(\n `Unexpected extra path components starting at position ${paramIndex}: '${invalidPath}'.`\n );\n }\n}\n\nexport function validateHeaders(headers: Record<string, string>, parameters: RemoteParameter[]) {\n for (const param of parameters) {\n if (param.location !== RemoteParameter_ParameterLocation.HEADER) continue;\n\n const headerValue = headers[param.name];\n\n if (param.constant) {\n // For constant parameters, the header must exist and match defaultValue\n if (headerValue !== param.defaultValue) {\n throw requestValidationError(\n `Expected constant header '${param.name}' with value '${param.defaultValue}', ` +\n `but found '${headerValue ?? \"undefined\"}'.`\n );\n }\n } else if (param.optional) {\n // If optional, missing or present value is OK\n } else {\n // For required parameters, the header must exist and have a non-empty value\n if (headerValue == undefined || isEmptyString(headerValue)) {\n throw requestValidationError(`Required header '${param.name}' is missing or empty.`);\n }\n }\n }\n}\n\nexport function validateQuery(queryParams: URLSearchParams, parameters: RemoteParameter[]) {\n for (const param of parameters) {\n if (param.location !== RemoteParameter_ParameterLocation.QUERY) continue;\n\n const paramValue = queryParams.get(param.name);\n\n if (param.constant) {\n // For constant parameters, the query parameter must exist and match defaultValue\n if (paramValue !== param.defaultValue) {\n throw requestValidationError(\n `Expected constant query parameter '${param.name}' with value '${param.defaultValue}', ` +\n `but found '${paramValue ?? \"undefined\"}'.`\n );\n }\n } else if (param.optional) {\n // If optional, missing or present value is OK\n } else {\n // For required parameters, the query parameter must exist and have a non-empty value\n if (paramValue == undefined || isEmptyString(paramValue)) {\n throw requestValidationError(`Required query parameter '${param.name}' is missing or empty.`);\n }\n }\n }\n // All query parameters are valid\n}\n"]}
1
+ {"version":3,"file":"httpValidators.js","sourceRoot":"","sources":["../../../src/uri-handlers/internal-handlers/httpValidators.ts"],"names":[],"mappings":"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","sourcesContent":["import { isEmptyString } from \"../../common/typeguards\";\nimport type { RemoteApiSpec, RemoteParameter } from \"../../generated-proto/pb_schema/camera_kit/v3/remote_api_spec\";\nimport { RemoteEndpoint_HttpRequestMethod } from \"../../generated-proto/pb_schema/camera_kit/v3/remote_api_spec\";\nimport { RemoteParameter_ParameterLocation } from \"../../generated-proto/pb_schema/camera_kit/v3/remote_api_spec\";\nimport { namedError } from \"../../namedErrors\";\nimport type { ValidationStrategy } from \"../../configuration\";\nimport type { UriRequest } from \"../UriHandlers\";\n\nexport const requestValidationErrorName = \"RequestValidationError\";\nexport const requestValidationError = namedError(requestValidationErrorName);\n\nexport function validateRequest(\n request: UriRequest,\n specs: RemoteApiSpec[],\n validationStrategy: ValidationStrategy = \"strict\"\n) {\n // Deny all requests if strategy is \"deny\"\n if (validationStrategy === \"deny\") {\n throw requestValidationError(\"All lens HTTP requests are denied by the current validation strategy.\");\n }\n\n // Skip all validation if unrestricted\n if (validationStrategy === \"unrestricted\") {\n return;\n }\n\n const url = new URL(request.uri);\n\n // 1. Given url, method and headers and spec:\n for (const spec of specs) {\n // 2. Check protocol and host.\n if (url.host !== spec.host || url.protocol !== (spec.tlsRequired ? \"https:\" : \"http:\")) {\n continue;\n }\n\n // If validationStrategy is \"host\", we only validate the host, so we're done\n if (validationStrategy === \"host\") {\n return;\n }\n\n // 3. Go for each part together with the path parameters.\n const path = url.pathname.replace(/^\\/|\\/$/g, \"\");\n for (const endpoint of spec.endpoints) {\n const endpointPath = endpoint.path.replace(/^\\/|\\/$/g, \"\");\n if (!path.startsWith(endpointPath)) continue;\n\n const method =\n RemoteEndpoint_HttpRequestMethod[request.method] ?? RemoteEndpoint_HttpRequestMethod.UNRECOGNIZED;\n if (!endpoint.methods.includes(method)) continue;\n\n // Validate path parameters (they are part of the route)\n validatePath(path.split(endpointPath)[1], endpoint.parameters);\n\n // If validationStrategy is \"route\", we validate host + path + method + path parameters\n // but skip query and header validation\n if (validationStrategy === \"route\") {\n return;\n }\n\n // For \"strict\" validation, also validate query parameters and headers\n validateHeaders(request.metadata, endpoint.parameters);\n validateQuery(url.searchParams, endpoint.parameters);\n // The request matches the current endpoint\n return;\n }\n }\n\n // The request does not match any of the endpoints\n throw requestValidationError(\"The request does not match any of the Remote API specifications.\");\n}\n\nexport function validatePath(path: string, parameters: RemoteParameter[]) {\n const pathComponents = path.split(\"/\").filter(Boolean);\n\n let paramIndex = 0;\n\n for (const param of parameters) {\n if (param.location !== RemoteParameter_ParameterLocation.PATH) continue;\n\n const paramNameComponent = pathComponents[paramIndex];\n const paramValueComponent = pathComponents[paramIndex + 1];\n\n if (param.constant) {\n // For constant parameters, the value must match the defaultValue\n if (paramNameComponent === param.name && paramValueComponent === param.defaultValue) {\n paramIndex += 2; // Move to the next parameter pair\n } else {\n throw requestValidationError(\n `Expected constant parameter '${param.name}' with value '${param.defaultValue}' ` +\n `at position ${paramIndex}, but found '${paramNameComponent}' and '${paramValueComponent}'.`\n );\n }\n } else if (param.optional) {\n if (paramNameComponent === param.name) {\n // Check if there's another component for its value\n if (paramValueComponent !== undefined) {\n // Optional param with a value\n paramIndex += 2;\n } else {\n // Optional param without a value\n paramIndex += 1;\n }\n }\n // If optional and not present, continue without incrementing paramIndex\n } else {\n // For regular parameters, we just need to ensure a name/value pair exists\n if (paramNameComponent === param.name && paramValueComponent !== undefined) {\n paramIndex += 2; // Move to the next parameter pair\n } else {\n throw requestValidationError(\n `Expected parameter '${param.name}' with a value at position ${paramIndex}, ` +\n `but found '${paramNameComponent}' and '${paramValueComponent}'.`\n );\n }\n }\n }\n\n // After processing all parameters, there should be no extra path components\n if (paramIndex !== pathComponents.length) {\n const invalidPath = pathComponents.slice(paramIndex).join(\"/\");\n throw requestValidationError(\n `Unexpected extra path components starting at position ${paramIndex}: '${invalidPath}'.`\n );\n }\n}\n\nexport function validateHeaders(headers: Record<string, string>, parameters: RemoteParameter[]) {\n for (const param of parameters) {\n if (param.location !== RemoteParameter_ParameterLocation.HEADER) continue;\n\n const headerValue = headers[param.name];\n\n if (param.constant) {\n // For constant parameters, the header must exist and match defaultValue\n if (headerValue !== param.defaultValue) {\n throw requestValidationError(\n `Expected constant header '${param.name}' with value '${param.defaultValue}', ` +\n `but found '${headerValue ?? \"undefined\"}'.`\n );\n }\n } else if (param.optional) {\n // If optional, missing or present value is OK\n } else {\n // For required parameters, the header must exist and have a non-empty value\n if (headerValue == undefined || isEmptyString(headerValue)) {\n throw requestValidationError(`Required header '${param.name}' is missing or empty.`);\n }\n }\n }\n}\n\nexport function validateQuery(queryParams: URLSearchParams, parameters: RemoteParameter[]) {\n for (const param of parameters) {\n if (param.location !== RemoteParameter_ParameterLocation.QUERY) continue;\n\n const paramValue = queryParams.get(param.name);\n\n if (param.constant) {\n // For constant parameters, the query parameter must exist and match defaultValue\n if (paramValue !== param.defaultValue) {\n throw requestValidationError(\n `Expected constant query parameter '${param.name}' with value '${param.defaultValue}', ` +\n `but found '${paramValue ?? \"undefined\"}'.`\n );\n }\n } else if (param.optional) {\n // If optional, missing or present value is OK\n } else {\n // For required parameters, the query parameter must exist and have a non-empty value\n if (paramValue == undefined || isEmptyString(paramValue)) {\n throw requestValidationError(`Required query parameter '${param.name}' is missing or empty.`);\n }\n }\n }\n // All query parameters are valid\n}\n"]}
@@ -1 +1 @@
1
- {"version":3,"file":"uriHandlersRegister.d.ts","sourceRoot":"","sources":["../../src/uri-handlers/uriHandlersRegister.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,0BAA0B,CAAC;AAE9D,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,yBAAyB,CAAC;AAI5D,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,wBAAwB,CAAC;AAM7D,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,8BAA8B,CAAC;AAC7D,OAAO,KAAK,EAAE,sBAAsB,EAAE,MAAM,kBAAkB,CAAC;AAE/D,OAAO,KAAK,EAAE,oBAAoB,EAAE,MAAM,iCAAiC,CAAC;AAG5E,OAAO,KAAK,EAAE,WAAW,EAAe,MAAM,eAAe,CAAC;AAE9D,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,yCAAyC,CAAC;AAKjF;;;GAGG;AACH,eAAO,MAAM,mBAAmB;;;;;;;;;;CAsF/B,CAAC"}
1
+ {"version":3,"file":"uriHandlersRegister.d.ts","sourceRoot":"","sources":["../../src/uri-handlers/uriHandlersRegister.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,0BAA0B,CAAC;AAE9D,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,yBAAyB,CAAC;AAI5D,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,wBAAwB,CAAC;AAM7D,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,8BAA8B,CAAC;AAC7D,OAAO,KAAK,EAAE,sBAAsB,EAAE,MAAM,kBAAkB,CAAC;AAE/D,OAAO,KAAK,EAAE,oBAAoB,EAAE,MAAM,iCAAiC,CAAC;AAG5E,OAAO,KAAK,EAAE,WAAW,EAAe,MAAM,eAAe,CAAC;AAE9D,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,yCAAyC,CAAC;AAKjF;;;GAGG;AACH,eAAO,MAAM,mBAAmB;;;;;;;;;;CA4F/B,CAAC"}
@@ -29,7 +29,7 @@ export const registerUriHandlers = Injectable("registerUriHandlers", [
29
29
  throw new Error("Expected an array of UriHandler objects");
30
30
  }
31
31
  const allHandlers = [
32
- createHttpUriHandler(lensState, sessionState, remoteApiSpecsClient, configuration.lensHttpHandler),
32
+ createHttpUriHandler(lensState, sessionState, remoteApiSpecsClient, configuration.lensHttpHandler, configuration.lensHttpValidationStrategy),
33
33
  ...userHandlers,
34
34
  lensKeyboard.uriHandler,
35
35
  createRemoteApiUriHandler(remoteApiServices, sessionState, lensState, lensRepository, metrics),
@@ -1 +1 @@
1
- {"version":3,"file":"uriHandlersRegister.js","sourceRoot":"","sources":["../../src/uri-handlers/uriHandlersRegister.ts"],"names":[],"mappings":"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","sourcesContent":["import { isState } from \"@snap/state-management\";\nimport { Injectable } from \"@snap/ts-inject\";\nimport type { MetricsClient } from \"../clients/metricsClient\";\nimport { metricsClientFactory } from \"../clients/metricsClient\";\nimport type { LensKeyboard } from \"../session/LensKeyboard\";\nimport { lensKeyboardFactory } from \"../session/LensKeyboard\";\nimport type { LensState } from \"../session/lensState\";\nimport { lensStateFactory } from \"../session/lensState\";\nimport type { LensRepository } from \"../lens/LensRepository\";\nimport { lensRepositoryFactory } from \"../lens/LensRepository\";\nimport type { SessionState } from \"../session/sessionState\";\nimport { sessionStateFactory } from \"../session/sessionState\";\nimport { getLogger } from \"../logger/logger\";\nimport { lensCoreFactory } from \"../lens-core-module/loader/lensCoreFactory\";\nimport type { LensCore } from \"../lens-core-module/lensCore\";\nimport type { CameraKitConfiguration } from \"../configuration\";\nimport { configurationToken } from \"../configuration\";\nimport type { RemoteApiSpecsClient } from \"../clients/remoteApiSpecsClient\";\nimport { remoteApiSpecsClientFactory } from \"../clients/remoteApiSpecsClient\";\nimport { createHttpUriHandler } from \"./internal-handlers/httpUriHandler\";\nimport type { UriHandlers, UriResponse } from \"./UriHandlers\";\nimport { extractSchemeAndRoute, isUriHandlers, isUriResponse, uriHandlersFactory } from \"./UriHandlers\";\nimport type { RemoteApiServices } from \"./internal-handlers/remoteApiUriHandler\";\nimport { createRemoteApiUriHandler, remoteApiServicesFactory } from \"./internal-handlers/remoteApiUriHandler\";\n\nconst logger = getLogger(\"uriHandlersRegister\");\n\n/**\n * Registers URI handlers within LensCore.\n * @internal\n */\nexport const registerUriHandlers = Injectable(\n \"registerUriHandlers\",\n [\n configurationToken,\n lensCoreFactory.token,\n lensStateFactory.token,\n uriHandlersFactory.token,\n lensKeyboardFactory.token,\n remoteApiServicesFactory.token,\n lensRepositoryFactory.token,\n sessionStateFactory.token,\n metricsClientFactory.token,\n remoteApiSpecsClientFactory.token,\n ] as const,\n (\n configuration: CameraKitConfiguration,\n lensCore: LensCore,\n lensState: LensState,\n userHandlers: UriHandlers,\n lensKeyboard: LensKeyboard,\n remoteApiServices: RemoteApiServices,\n lensRepository: LensRepository,\n sessionState: SessionState,\n metrics: MetricsClient,\n remoteApiSpecsClient: RemoteApiSpecsClient\n ): void => {\n if (!isUriHandlers(userHandlers)) {\n throw new Error(\"Expected an array of UriHandler objects\");\n }\n\n // Users can provide custom UriHandlers using the `uriHandlersFactory.token`.\n // However, we need to include some internally-defined handlers (e.g., Lens Keyboard and Remote API)\n // before registering the handlers with LensCore.\n // Note: The internal HTTP handler can be overridden if the user prefers to disable validation, for instance.\n const allHandlers = [\n createHttpUriHandler(lensState, sessionState, remoteApiSpecsClient, configuration.lensHttpHandler),\n ...userHandlers,\n lensKeyboard.uriHandler,\n createRemoteApiUriHandler(remoteApiServices, sessionState, lensState, lensRepository, metrics),\n ];\n\n for (const { uri, handleRequest, cancelRequest } of allHandlers) {\n const uris = Array.isArray(uri) ? uri : [uri];\n for (const { scheme, route } of uris.map(extractSchemeAndRoute)) {\n lensCore.registerUriListener(scheme, route, {\n handleRequest: (request) => {\n const reply = (response: UriResponse) => {\n if (!isUriResponse(response)) {\n throw new Error(\"Expected UriResponse object\");\n }\n lensCore.provideUriResponse(request.identifier, response);\n };\n\n // Since lenses are the only things that make URI requests, we expect to always be in the\n // \"lensApplied\" state – we'll sanity check, though, and log a warning if we're not.\n const state = lensState.getState();\n if (isState(state, \"noLensApplied\")) {\n logger.warn(\n `Got a URI request for ${request.uri}, but there is no active lens. The ` +\n `request will not be processed.`\n );\n return;\n }\n\n // NOTE: we do not handle any error thrown on an extension side when handleRequest() is called.\n // That responsibility is delegated to the extension by design and that is exactly what Android\n // and iOS SDKs do.\n handleRequest(request, reply, state.data);\n },\n cancelRequest: (request) => {\n if (cancelRequest) {\n const state = lensState.getState();\n if (isState(state, \"noLensApplied\")) {\n logger.warn(\n `Got a URI cancel request for ${request.uri}, but there is no active ` +\n `lens. The cancel request will not be processed.`\n );\n return;\n }\n cancelRequest(request, state.data);\n }\n },\n });\n }\n }\n }\n);\n"]}
1
+ {"version":3,"file":"uriHandlersRegister.js","sourceRoot":"","sources":["../../src/uri-handlers/uriHandlersRegister.ts"],"names":[],"mappings":"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","sourcesContent":["import { isState } from \"@snap/state-management\";\nimport { Injectable } from \"@snap/ts-inject\";\nimport type { MetricsClient } from \"../clients/metricsClient\";\nimport { metricsClientFactory } from \"../clients/metricsClient\";\nimport type { LensKeyboard } from \"../session/LensKeyboard\";\nimport { lensKeyboardFactory } from \"../session/LensKeyboard\";\nimport type { LensState } from \"../session/lensState\";\nimport { lensStateFactory } from \"../session/lensState\";\nimport type { LensRepository } from \"../lens/LensRepository\";\nimport { lensRepositoryFactory } from \"../lens/LensRepository\";\nimport type { SessionState } from \"../session/sessionState\";\nimport { sessionStateFactory } from \"../session/sessionState\";\nimport { getLogger } from \"../logger/logger\";\nimport { lensCoreFactory } from \"../lens-core-module/loader/lensCoreFactory\";\nimport type { LensCore } from \"../lens-core-module/lensCore\";\nimport type { CameraKitConfiguration } from \"../configuration\";\nimport { configurationToken } from \"../configuration\";\nimport type { RemoteApiSpecsClient } from \"../clients/remoteApiSpecsClient\";\nimport { remoteApiSpecsClientFactory } from \"../clients/remoteApiSpecsClient\";\nimport { createHttpUriHandler } from \"./internal-handlers/httpUriHandler\";\nimport type { UriHandlers, UriResponse } from \"./UriHandlers\";\nimport { extractSchemeAndRoute, isUriHandlers, isUriResponse, uriHandlersFactory } from \"./UriHandlers\";\nimport type { RemoteApiServices } from \"./internal-handlers/remoteApiUriHandler\";\nimport { createRemoteApiUriHandler, remoteApiServicesFactory } from \"./internal-handlers/remoteApiUriHandler\";\n\nconst logger = getLogger(\"uriHandlersRegister\");\n\n/**\n * Registers URI handlers within LensCore.\n * @internal\n */\nexport const registerUriHandlers = Injectable(\n \"registerUriHandlers\",\n [\n configurationToken,\n lensCoreFactory.token,\n lensStateFactory.token,\n uriHandlersFactory.token,\n lensKeyboardFactory.token,\n remoteApiServicesFactory.token,\n lensRepositoryFactory.token,\n sessionStateFactory.token,\n metricsClientFactory.token,\n remoteApiSpecsClientFactory.token,\n ] as const,\n (\n configuration: CameraKitConfiguration,\n lensCore: LensCore,\n lensState: LensState,\n userHandlers: UriHandlers,\n lensKeyboard: LensKeyboard,\n remoteApiServices: RemoteApiServices,\n lensRepository: LensRepository,\n sessionState: SessionState,\n metrics: MetricsClient,\n remoteApiSpecsClient: RemoteApiSpecsClient\n ): void => {\n if (!isUriHandlers(userHandlers)) {\n throw new Error(\"Expected an array of UriHandler objects\");\n }\n\n // Users can provide custom UriHandlers using the `uriHandlersFactory.token`.\n // However, we need to include some internally-defined handlers (e.g., Lens Keyboard and Remote API)\n // before registering the handlers with LensCore.\n // Note: The internal HTTP handler can be overridden if the user prefers to disable validation, for instance.\n const allHandlers = [\n createHttpUriHandler(\n lensState,\n sessionState,\n remoteApiSpecsClient,\n configuration.lensHttpHandler,\n configuration.lensHttpValidationStrategy\n ),\n ...userHandlers,\n lensKeyboard.uriHandler,\n createRemoteApiUriHandler(remoteApiServices, sessionState, lensState, lensRepository, metrics),\n ];\n\n for (const { uri, handleRequest, cancelRequest } of allHandlers) {\n const uris = Array.isArray(uri) ? uri : [uri];\n for (const { scheme, route } of uris.map(extractSchemeAndRoute)) {\n lensCore.registerUriListener(scheme, route, {\n handleRequest: (request) => {\n const reply = (response: UriResponse) => {\n if (!isUriResponse(response)) {\n throw new Error(\"Expected UriResponse object\");\n }\n lensCore.provideUriResponse(request.identifier, response);\n };\n\n // Since lenses are the only things that make URI requests, we expect to always be in the\n // \"lensApplied\" state – we'll sanity check, though, and log a warning if we're not.\n const state = lensState.getState();\n if (isState(state, \"noLensApplied\")) {\n logger.warn(\n `Got a URI request for ${request.uri}, but there is no active lens. The ` +\n `request will not be processed.`\n );\n return;\n }\n\n // NOTE: we do not handle any error thrown on an extension side when handleRequest() is called.\n // That responsibility is delegated to the extension by design and that is exactly what Android\n // and iOS SDKs do.\n handleRequest(request, reply, state.data);\n },\n cancelRequest: (request) => {\n if (cancelRequest) {\n const state = lensState.getState();\n if (isState(state, \"noLensApplied\")) {\n logger.warn(\n `Got a URI cancel request for ${request.uri}, but there is no active ` +\n `lens. The cancel request will not be processed.`\n );\n return;\n }\n cancelRequest(request, state.data);\n }\n },\n });\n }\n }\n }\n);\n"]}
@@ -1 +1 @@
1
- window.hierarchyData = "H4sIAAAAAAAAA5WOPQvCMBRF/8udU6X2k6y6iTgUXKRDaF5pME0kSV1K/7sUQQoq1OkO7553zwhnbfDg1zRPagZHraYmKGs8+Ig0T+Ywoidw7EVPThxVONBDNXS+v3oMN2Uk+C7LGQanwaFMINeKhvz2O7TpQq/B0GjhPTiCl9H8JXqT87FTWjoys11Zsiwu6okhLcuF04mkElVwJPrKDm6t1S9shdfEkMXFQuGiJNl/xj+BNbPT9ASqBK8urQEAAA=="
1
+ window.hierarchyData = "H4sIAAAAAAAAA5WOPQvCMBRF/8udo0L6QZtVNxGHgot0CM0rDaaJJKlL6X+XIkhBhTrd4d3z7hnhnYsB4prmRc3gqTXURO1sgBiR5sUcVvYEgb3sycujjgd66IbO91eP4aatguBZzjB4AwFtI/lWNhR236FtF3sDhsbIECAQg9rMXzZvcj522ihPdrYrE5ZxXk8MaZksnE6ktKyiJ9lXbvBrrX5hK7wmhozzhcJFK3L/jH8Ca2an6Qmbb0P2rQEAAA=="
@@ -1 +1 @@
1
- window.navigationData = "H4sIAAAAAAAAA52Z227jNhCG30XXQdNNu9s2d4kTdxdJdgM7yQItioKmxjYbiVTJkZug6LsXOtimeBpmbzU/vxnOUDz+/m+B8ILFeXEL0vw5YzVoNmdcyE1xUjQMt8V5AbKtzakn+G6LdVWcFM9ClsX5z/+dHFiD6kbgkcErZgyY04Np2vrdmd3+4bWBctYaVPX1DmQA4ypIWq96YHoDMZqlSNG6NCygUUag0q8+a2pPkQ6pWKpWc0jkahDkscAYoWQKNiioPt6DXitdM8nhDphpNdTBSsS1b/KAWnCTQe91yWprJk2nP7sKFPpoTGZTA0MYE/WlQaGkFZuQCHrNeJfUgHAKPnv/wQJfGxQ1QyidfgXhMXHKwVzZNbJgnSHVsPPxEbFZwN8tmDDD0aRwh9F2qRQa1KyZKbkWm1YznAxPO5npNil3j1qkAj+aSYhplDThelh2AjPrylQREU1EVGn6gaZ0tCyjncJE26ca3mvYCfgn2Ha0pZovJWu4KsM53RupwG9ZK/n2iiGLduEooWCPBnQStRekQJcCa/WX6KSf5FoFWY4m+eNqAbJM0qYSqpPuouJ0MbSkOBDFygtjAJNTgiPKmhMG38t2ZbgWKwiP6qg6y8UV7ASH5NQdlL4h/midArpk5VvJO9+DOhVyUJlC30Ep2BI1sJqmx8QpB0+iBEWjfVkKegOvK8V0ecFR7MDZAFrUgC4Hm2Ql66/qpkUo55rV/o7FHgABYXKG5BpALmATWxltQQq0gFohXDTJxdAVZQITC6OnykIuQXc/Xpo4iqjJbkxyPwasmuBrM053E4FD+/6Xn969P7MXvHZVCT669nBTK8Vy9m6zqjVoz3jHEH1VXpwzJZEJ6UMdc06k3e7uI5NlFQ7RMlO0OSDfRlC2jeyj4M9QzkUFXvcOForxpQF5BWvWVtjJ+4ZeUEER2cuD0pv+xq66gnziAkxbYRw42PN5cRLFeNTCbfyoRc54GvZk90yzOvhb2naK95sqBeMuZfhKte23KA+inlxrDADLlEXxZ0KLE5kAw6Ru7+SXxTKRGVabW9hB5WV2/J7RfhP40fuvOdV9mpwKjlV98k8EwfZfmfDG9/473X7DqmutVWCi2ltyYuimR5D4xCpR9sfMCDOmzPERRWYRnO1kEBbS5ET2qWabcRKIBulq6Hj5Fm7g9bPCuWplGQk4ICLJ9nVAGOspKOZXWP16G2QdLRTjEiTf1kw/BzlTK7neVQy7bcBnhcu2aZRGCGcwKswakS/A2+RonypymBcrpTHKO1rJDIA2wnS/2hKVDo/3kCYrxm5yjcd4sJIV399QhSs+sZJrgd60NT0FRWQUfQGyBO1efA9I25Y/Cw2XneGtdlj1Tezbvr7+8pQUU572x7xw9FPrm1ixaIMiimwf97qnCRfq2t/C8zo9MVKkO4ZavLiI4Ss9EvdnOmTYenE45mza5Bo1cuBIirM9Zfr4RnrsuOkJKCK8IMjuzxgD6fctL9bPv2NasFUF5jQinXr44exkeD8pzosSGg28e5MobI/jQ0X0UWM9XlyZ04h06vHDjxZ8dXgM8B8Vj1xflUDy/tXmet/5EM+RJGAbwGsq40duXJ1wsT6c1OaMT18dj2RPlABWhwtgkyD6KjKn/V7RvXl2s2qJSKB3KRnHelISbl1LxrGWKAHU7l+ayGtM6+H/+B8rly2/nh8AAA=="
1
+ window.navigationData = "H4sIAAAAAAAAA52Z227jNhCG30XXQdNNu9s2d4ljdxdxdgM7yQItioKmxjIbiVTJkWuj6LsXOtiieM7ean5+M5yhePz93wzhgNl1tgSu/pyRCiRZEMp4kV1kNcFddp0Bbyp1aQm+22FVZhfZK+N5dv3zfxdnVq+6ZzgyaEmUAnV5Nk1bv7vS2z8da8hnjUJRzffAHRhTEaV1qiciC/DRNEWI1qZhBbVQDIU82qypPUQ6p2ItGkkhkKtekMYCpZjgIViviPXxEeRWyIpwCg9AVCOhclbCr32TB5SMqgR6pwtWWxKuWv3VnaPQozGYTQkEYUjUlxqZ4FpsjCPILaFtUh3CKfjq/QcNPFfIKoKQG/1ywn3ikIOF0GukwVpDqGHr4yNivYK/G1BuhqEJ4c6j7VYIVChJPRN8y4pGEpwMTz2Z4TYhd8+ShQIfzVGIqgVX7npo9ghm1papjEQ0EcVK0w00Ib1lGewxjLd9qOGjhD2Df5xtB1uo+ZqTmorcndOTMRb4kjSc7u4IEm8XRkkM9qxABlEnQQh0y7ASf7FW+olvhZNlaII/rmTA8yBtKol10lxUjC66lhQDIkh+oxRgcEowRElzQu973WwUlWwD7lHtVSe5uIM9oxCcup3SN8TvrZNDF6x8w2nru1eHQnYqQ+gHyBlZowRSxek+ccjBC8tBxNG2LAS9h+NGEJnfUGR7MDaAGtWhS8EGWcH6i6puEPKFJJW9Y9EHgEMYnCGpBOArKHwroy4IgVZQCYSbOrgYmqJEYGBhtFRJyDXI9scLEwdRbLIbktyNAa0meKyH6W4iMGjf//LTu/dX+oLXbEpGB9cWbmqNsYy926xsFOoz3hiirUqLcyY4EsZtqGGO0V5IyfJup7VGSRCKowm0FSm9b3eMHwnPS3e3NXOMtgCkOw9Kt0Xzxugr5AtWgpWysyXG+FIDv4MtaUps5V1DKyinKNrLs9KaUoeumoJ04gpUU6If2NvTeX5SjPEsmdn4WbKU8dTv8x6JJJXzV9ftMd5vImeEmpT+a6xtt+15YtXkqqQHaKYkij27ahzPpOomtfsxuyyaKZphUSxhD6WV2eF7QvvC8aN3X1Oq+zI5aYxVfbFPGc72Xwmzxvfpe7x9Qcq5lMIxUZ0sKTG0Uy5wHKdLD9OnTPHhRSYRjC2qE+bSpET2qSLFMAl4gzQ18XjpDu7h+FngQjQ89wTsEEXJ+hWDG2spYsyvsPl16WSNlhjjFjjdVUS+OjlTa3S9Kwm2W4vPAtdNXQuJ4M6gV5g0Ig9Am+BonypSmDcbIdHLG63RDIBUTLW/2hqFdI93lyYpxnZy9cd4tkYrfrr1cld8Yo2uBbJoqvgU5JHF6CvgOUjzMr1H6rb0Wai/QHVv392qb2Ivu/ray1NQHPN0Ojq6o59a38TyResUxcj6EbJ97jChpv0tPKvTE2OM9EBQsoOJ6L/GR+LpnIgEGysOw5xMm1zNeg4cQXGyp0Qf30j3HWEtQYwIBwTe/hlDIN2+5aD9/HsiGdmUoC490qmHH64u+jeZ7DrLoZZA23eOTPc4PH54H0q2w2WYuvRIpx4//KjBN+cHBvuhcuTaqgCSdi9B81PnXTxDEoAVgPNYxkeuXx1wsT2f1BaETl8yR7IlCgDL86WyChBtVTSn3V7RvM02s6qJokDrotOPtaRRuHbV6cdqogBQmn9pIK8+rYX/43/bdB298h8AAA=="
@@ -1 +1 @@
1
- window.searchData = "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";
1
+ window.searchData = "H4sIAAAAAAAAA819UZPbNrLuf9G8znHULUqi/OZ1nN3U2kkqdnbvPa6UiyNhZriWSB2SGsdJ5b/fAkhKjUaDbM5MTt0nu4ZAdwP8ugH01xD/mFXll3r28uMfs895sZu9xOXqelZkBzN7Ofun+XpTZtVudj07VfvZy1leNKa6zbam/qZ/9uK+Oexn17PtPqtrU89ezmZ/XvfCYI7JWVq22715MEXzNq8bU5hqVOpVttsZ22N/6UHUXM+OWWWKhhp6Ub1aLheXkXz61Hw9mukaz/2G9b4IxhaZg8ocygczcRraTv/LMyEo1U6GNMjIfNSm2H1fHE/Nh/KtKepxs2yH3HZoyn3b4S+eB6ZQOwd8YJHx7/L6kNeKcV8a/sXj7RRpx9nbFRnfnWne7M3BdhrVfGcac277F4/yoks7UDKSi3Kcb9awxCBgOuxf3qrVcLGgfTgYN6Ug/Grb5J1XDY2PNJsQml2nKWKvzl2G541aHVHemN8mjeiq6/BkxfuRiBMoVkUchWIz7hKBbq1ryOoHgRqsRAJe+zZq2L7ODqbK/pk3fyvLpm6q7Pi6LG7zu1OVNXlZSGMf6TIBzsf8Q/nZPFrJVXbMm06APNtjo4shrry7k1d8lVnn7s9t1FvzYPZPMWvfCXhew0xR/2Sq27I6ZMVWDE86+0xRHz05z27m67IyPz6Yqsp35pdqL4YVta3bsjJlJ+zUCnuqwdpV8tE2jiyjY3LFOYzM95esPvwFtndin8/+F92cRIbxn+cFSavsP48Gy2OGYKfsTbE7lnnR9N0ePSgrzHTCyouwZ3XVrMj2X5t8W38vnml1a0MvI989t3m3Jd01TjWs7/3swe0fTXP8R1bs9k9ZukxR3zfN8f4s5y8x81/ZPt+5lu+bKmvM3dcnW/xwFllfRD6r8U11qhuz+2B3XT+V+3z79Qf74LGGd+LcJu7oxBWtuKcaTbd335Xy/tX+Xb9RKyLjPEu5GjTdGRE7WWdNNiy6a6ESTYf+tsPaz+Z/TqYWZ4E10U+IlaSUd9W2lc3nNkbU5TtTNPltLju2qNXr8iTlB9Pcl2IcFhWfmz9JaQwWospBhCgV3ptsZyoxqos6L+2fpDZ2thV1Dp5r4wr5ofJtZK1oj5Ps6aBPDG5X4+KuRnah3MD4UAbWkVZ92GB4QOTwXzf5IWvM28jp5vZUbN1q802kpfoI/qbrv4upIriItdWHru3eLjtiIBkUfnXpKL+16DAihtyYYnt/yKrPogMM2+L1fR5zvpibu/3PptiZylTfF7fldKuciKoTkbciHm2c5LWk5Wv2Gi/eFjbSQn5bmawxb35rTFHT3M8F6qyFVvDNecvSb2IE2WGjYQ9i8/PT6Wafb1+XRZPlYZKMPX2E5Pemesi3hmeL/YeDchcXkaafwS5aW8NoevUhq/LsZm/qbyIttTNv0+Ejui5vIN5YH152Zm/uskaKkyPir0hX2WsGBqNck6YbM7JUDYg5Dye+PX1fnio5zl+ejkA1SS+7xPrvVXk6/vglwlYymVd5fWfbl1+GiEpiZkTtvsx2MVKQq7RtR3cxOnVurFN03nUdJihe+Ru19nn9XbZtyuqrAKqw0aRA80uVs+jyS5WrtxG/VPnAUefydMopJ1eIumqbydNKjHrU2YbrUhxrxlXGTzRc3chhZlzV1gaDovkQyeNyfV3zwZAzrjR2eOLaBs9NqmnMtKpI2wnqAnjXx7Ko4zPZPp6wFy7lRCgXdtU1HDC9syy6KtbbKj/GGLVAn9/+0Wo16POHqYTfyGiHQOENcxQRw4pGEUiV6SAYKGQYfG331fvhQOu1eY5wGwocC7q+mdEqJ/dYTrLLarsuAzn1AeV8vfvZHMrGvDr6HeS0xGDbpyYpxoWPpSyGhyKj6dxnAE28zSRy/f3RbOWXK4q1dHp9NNuBlxuYHKuc6AiiKdr7Ps+g/phV2cE0kXyerN7r8zT1N+VO5DNkxV3rySqj3qTzo7/Ig57iO1O9Jr4bCBrp/aZusuY0hhu6rpw7jI7u8YtZRPXokqZWroAsVazF7OBqem7XZU8G9Xdtnjv+UbFT4l9vcuSQemeaiBeOGnFnmm6RHeNgB42JxIZIFit4Punceunt+w6X7Z5qM1cVNyl+7I41HQYLXl5XmJbsunyjy0UGlA6ZYFnS1bnVCNurDcODarRVPy86q6L7xWNZ595LUKj1eukMGKlnOZimyrejU3xppp/j4E3+PGnMU8Yaix1tjv29qb0cfERp27g+N36kzp2pm6ocHeKl2QQ9tNiUDu1Hd7yV62iEdhMcMH8wLZHzIavujLivjmq4sr1bDqfpe0cGKw0m6jlW4L/v8735kN38I9/tIlWvUbNaCV+shCa7ue8lPMo0iVp61zqLWBEfPJ+0Otje/8rNF0Go/fNkWf/OSJy+yLJ/VudKh/LVeqDl0aqIPlk5mG6OXsawiWp533KR7Ro9UkGsnOcifbCcZ0h0vi2LX+LFMd28bMtirCompuDBFLuy+nagPKTV0bYbrQx5RO2tpENR0PCCWB5L17nw+V22zYu7nypza+NQnB7qFgDX59b1OdI+06f2WJkH6qeivkuj6Qpc6aoNTWWUnyKFs+eG0xXVRXaM5XYvWkir6SpuTdacKvNu4NB20dQ1Hj2uMYU0Yr0fGFL/bELkOmR3JuKnnrQr13LIWc+GRVPf5vg2Lz6Pq7It921LtSo6RT/F8ds9ep4JosLG56e36qIo9ZahT6+J15/VmeJ0aBHkPR8eANlovXr35udXn7579fr7H/7+6Zcf3r/5oBLdhZNPbTz5dCrqgQ1QaL3Clu9+/vGHR9lyW5UD16oeZcvfXr3+52NMucm2cZAqLfnlh5/fvP7x7z98/99vvtXZcCoqsy3vivx3M7zsx7TzDdBIKO4eTyj9yOvjPosWRXOZV1370b1Gb2d8W/iqrk3zIT9QD2p3huSJOhvwdvjY5z/Wl2cEdRIDAnWFEsRITbHENM13fZen6N9m23tXF/m6ZRZVFrhO7d2ZvtNTbLgzTXeA8VfqIRPuTGMNUC3Y4xa0F+1f22G5tyFkhyQj2m5uNnYj6aK4Hczn32anYns/tH2+tJjAXNamih9YmMQr23rk5ELMHFA5YRhO6eirHFe7dy1+slxR9ADJVbd9jn2fier5G/xlZOD98+d6e548zbs7GzigbugEGiocXSHGVN7kVXO/o1WJgzpp88crVSyHvlrtejimeFueiqb6OnQA8hX7HR6v2F121Knsmz7lnTaH8j95rFJbequuw2BdtkbxbZW7Hw3R6m3bP1nt7+Uuz7Y6lee2k9TRSPO3drJsq9hIWZMJzNxD1mSRiCMJvWo7DIQdbm0Mn2Z/m5sJitsOj1LsXcJzCBiaS7+FfipbbNX3+fF9k1XyTb9Q9NWlW911k4fHDI+uiXXzvVWYbWMFbpIRtlvudXuKEXVTmUxMMki6z60nqpTy0W+lLcElL00fT8p1/7fv8K3E9o+T5Lgj0NvSXleTDkftk6fWf3BRYzUf1KjIXqfMdq7V0P1N1mZCDLK9vu2qLCNnYEn4leu4ox0jMZabP5AT1WsfPhIqVbohvMuK/HbKtLYjP1y6PXHc5Zefqrys8kasO4kMv/xyvHSabIDoGUEZEQG0qnqIS/3ONNt7ufiKPnqqxwWyxlzOs2ukDoJdTAnoYMXVlCUg2ZHaS/mnLfW0IZlXfocRsnn4vsi2PA7w2r7So4LaHtbmQGOZ2vf577r5u6ptwY/tUrddnqr/Q5UVtb0BqFbfkB6TtUu/JdW2im12hGb6wH0wu1w8+8akXvU9VCMb2mKcavMuK07Z/jtbKfpTVW4twU5SjhprTrU5OCG3VsiRCnmygZWx58cPVbb9nBd3sSRB1LS2e9N1H0yWDBs1+VeMxi3RVjARScJsxI6Sp9vbkd9M0Vp4FvUUO8PyJ9HLvjW22G2ojEZsOeF6jOsfuz0yIL3jS3SvzB9G7KBzrN/mh1yu5Rkw5PZY77t+jzRjIMC9P93YfeCNCjuXxvoXUBavmibb3k8Xf1UWWd9VBUUylic7csyWaU5MpJznITpP35pHz9PO/P8zT60tT5inbh7Eitq2VvCdXQ7f2/Pvge3y+DX/oKW6vCroORCkYm31XtIEGx6t+KvxnU90KPGsr72437Z9ddrl4hZo2KpORu2eZJ2M5zFvOKQPmxUJ6k29+6+8/q+8uDdV3jhu+tHmDYX5YePEQP9E07wcXucco3gWGz7XmhsXrlly5TEMxIp/5TtTjkQJ0kYdH0ifgZkMW02KCYOb4IjsK9XuVzD/UW8zZsQjHE1v0pCLxQya7FyD5gQw+97WUI3AjLSZeDdFKATvL6ZcHk2/KjJaoN81mLDbOzXH08AVFCrw6tx4bI/QmfnYaySCUvX2pOvamTpQrf8I9fuhXzWPmDByrWSbHW2V5iOMufR8TnvssZCmF4btubT+30REp3UqJHpjn44Jz4BpoOi6PisqPHMmw0JnkfHvaAwbdG48GRXTrlx5StU3r0a0fuYfthlWS5pP1utlUbPjcf9VrNWTFbv2g9yMVnNb8zVBddvhWXRb9E2A+dP1Zada7Vdd26dpPJwarcKu6dP0nYoJGs+Nn6azNuPsDVVbm6bu2z9Z83c/vfc3l6O69Qk6xbi3lTHFz+bOO1GMD991q87dnmbH6FVKT736RqWk1d/p0tF/CPlC/lh9WKMdxUsc5Ll+s/ubStTVb/HLINSsiBKRWg6VxKdfo+RLvmvEzGOoqG/6eGX3Jr+7F89uobZz20nqhmDF61u8Z5OOZRzX4r1TudHT9UQ+pDPYVn1APNOv+G0QA8gzvae8y6uqrP7PqLCrg2sY9xhq2aCu/6vVFXccha7v3U/5NWGkDJTll5ZTtGkrEAJ9muoDxQAPWVPlvynmsm83RRMH+jtfWYvo9o+TLr6QXw9+Z7La3VqM3NuQmz5LUciIeNUbGhhNbHvYNplszaXfc1lSmdpMnvSrvtdzWWGK8OQ1ZkPb5ykWUL61PBxPjdm5got37AhKeTWh3ZR65LvvjtPkXmUPd7cDt6NEwwcqAFlFyYf8YN7Vrx7k0pKoUVYSKytp8oM51NnDQF7oOUx938gf6pluat0MHN+fw1TH+8g/vjHd2kMv7C8x+IcnW/l404aWBTkVJDfT34+8MXd5MWnNIWN3nQ9eZ2UM4iNXHeaGTBk70o1a4O0mvx7N7vWpbsqD/0nR826CNXiW5VcUqtsWcXtj/JyUYpbVDmaWh/TxaXQNGBPkqSYNnm8auVD9NFJ7Y4nK2Le6h01Qf7Bba4e9upY12/sBjAZG9H3Mw5C/ai0Y+mL3sB1TPts9YA1hNW/zvfkp3342Vfw364I202rMz715Vfj5wZPry31Jo9XlF4s0ZnPan+vUEP5x6T+b+rTndC9/PEn2j0dTfGtus9O+ic692GaSFtdlZzsz0ZcHk+S99b9j211Kcn+cKsf/9OxZkvvzNFnmLtu/sdmD4LJU/2CivPOvC1w+9iTLjzWcrC8mfro0VssnCZaaTLbYlU+0iIwZz5tMHMf23vzTfP2hbL4rT8VOHojQZpoW+sVDUUXQYJL8f5ubv7+V5F4eTJL3t/4zVZJM/+G0OLHPGrt//KFs3p+Ox7JqjDjj0XbTEf+b2Z6GPMtvMFn+q5uyamKyLw+nzZK9UmMX9OZ9U1aib0lNpttur4pFbT8/nIac/mNYInK8h9Mug1Z3p8NoqIy0kjT9ej3Li535bfbyj9mDnc2ymL2c4YvFi83senabm/2unr382Oq/nm3LQ3c825Vbp2P2a9fsX8bug2zjtvU389n1x/l1sn6RJvjrr9cf+87ugftDL+PyF9cRZtcfQeoIQUfwOuLs+iNe4+pF6nXDoBt63Raz648LSd8i6LjwOiayviTolnjdlrPrj8n1El9sll6/ZdBv6fVbyepWQbeV1209u/64FNStg35rr18qq0uDbqnXbTO7/rgS1G2Cfhv/rc9lfRDCBRheLArWgkoQAOMjBiwSUqlrCBrwUQMWCxupawgb8HEDFg8wl/qG2AEfPGAxAXCdwIvNKvE7hwACH0FgkQEoKQ5RBD6MwKIDFlLfEEngQwksREDCPIRwAh9PYGECEoAhhBT4mEILFFhJvo0hrNCHFbo4tBY7h8BCFoosWEBCFgrhyEcWWrSABC0MoYU+tDASkzAEFvrAQgsVlECJIa7QxxW60ARS3xBX6OMKLVRQwiSGuEIfV+hilIRJDHGFPq7QQgUlTGKIK/RxtXCxaimuGSGuFj6uFhYpKIXIRQirhQ+rhVvipFi3CGG1YMucRQpKkFwIC50Pq4WD1UYccIishY+shQXLYi6FrEUIrYUPrYVFy0KC1iKE1sKH1sKiZSFBaxFCa+FDa2HRspC3BSG2Fj62FhYui0TsHIJr4YMrmUenKwnBlfjgSixeFlK0TEJwJT64EowuLUmIrsRHV7KIukQSwithG6nYTkrYSvnYShy2JGdKQmglPrQSBy3JmZIQWokPrcRBS3KmJIRW4kMrcdCS4nsSIivxkZVYrCRSlE5CYCU+sJYWKonkSssQV0sfV0sLlURypWWIq6WPq6VFSiJF6WUIq6UPq6UFSiLulkNULX1ULS1UEskXliGulmyP7jbpEq6Wwjbdx9XSQiWRcLUMcbX0cbW0UEkkXC1DXC19XC0tVBIJV8sQV0sfV8uN7IHLEFVLH1UrC5SlhMhViKqVj6qVBcpSQuQqRNXKR9XKAmWJUsBZhbBa+bBaWaQsJUiuQlitfFitLFKWEiRXIaxWPqxWFinL5XWSvEjWa79ziKsVO/9ZqCwlTK6EM6CPq9U6rjgE1soH1iq+Fq5CZK18ZK3ia+EqBNfKB9fagUvcg69DdK19dK0hupCuQ3itfXitHbxSacLWIbzWPrzWDl6SJ65DeK19eK0tYlaSP61DeK19eK0tYFaSP61DdK19dK1X8akO4bVmOYZ1fKqFPIMPr3Uan+oQXmsfXmuXb5AWpnWIrrWPrnQedYo0RFfqoyu1eFlJISQNwZX64EotXFZSCElDbKU+ttJFJC8TIiv1kZU6ZEnrYRoiK/WRlTpkiSfpNIRW6kMrtWBZSQtiGiIr9ZGVWqyspAUxDYGVsgyWhcpKPLWkQhrLB1ZqsbKW/DANgZX6wNpEclmbEFUbH1Ubl8uSPHgTomrjo2pjgbKWXGETomrjo2qziPrgJgTWxgfWJonO8yZE1sZH1sZiZS350SYE1sYH1mYVReUmRNbGR9bGgmUtOeEmRNbGR9bGYmUtudImBNaGJUgdsMQUqZAj5UlSC5e1mOycS4lSlimdO3iJCc+5kCyds2zp3CFMTHrOhYTpnGVM55HQ1T7gnVnOdG5hk4pJ07mQNZ2ztOncIieVaYW5kDids8zp3IInFbeb7TPen2VP5xZAqZg+nQv50zlLoM4thtJE8s/2Ge/Pkqhzi6NUzKLOhTTqnMHOZdxTCbMg5eeDBL3FUSqn6KUcPYNdm6UXUSvl6Xmi3mXfUxG1Uq6eJ+tdAn4jAk9K1/N8/VDCXsrY85S9S8NvpBUBpKQ9z9q7TPxGTPlLeXueuHfJeDnxB1LunifvXUJ+I8JeSt+z/D24lPxGJA6EBD6wDD64pLwUcIQEPrAMPris/EZ0GSGHDyyJDy4xvxHXJhDy+MAS+eDS8xtxPw5CNh9YOh9cin6Tyv0F3LGUPrg0/Ub0GiGpDyyrDy5TH1MvAI9l9sFl62EuEsggZPeBpffBpexhLjqOkOEHluIHl7WPvD8hyQ8syw8ucx8bgJDpB5bqB5e+h7noukK2H1i6H1wKH+ai7wkZf2Apf1i0LKXofELSH1jWH1wiH+aiAwl5f2CJf3DJfJiLi46Q+weW/AeX0I84kJD/B0YAwKJFYESAgEBGAsCiRaC4bgk0ADAeAFxqP7LlEJgAYFQAuPS+nCEDgQ0ARgdAywfMxRAgEALAGAFwSX6I8NwCABkpAC7VDyB6sMAMAKMGIGlXXtGBBHYAGD0ALuUPMuUtMATAKAJwaX8AMfUFAk0AjCcAl/sHmfsWqAJgXAG4/D+A6EECXQCMLwDHAQCI+zaBMgDGGYDjAWITIPAGwIgDWLaMlOhBAncAjDyAZYtAEcECfwCMQIBlMhACBBIBGIsAjhkAkVUHgUgAxiTAsi3YEF1AIBOAsQngGAIQ2XUQCAVgjAI4lgBEhh0EUgEYqwCOKwCMIECAICMXwBEGgKILCPwCMIIBHGkAItsOAscAjGQAxxuAyLiDQDMA4xnAcQcgsu4gUA3AuAZw/AGgiGCBbgDGN4CjEGAhAlBgHIBRDuBoBBD5dxBYB2C0A6zaqiG55EgAIGMeYJUOAEggH4CxD+AIBViICBb4B2AEBKxjZWkC/wCMgADHKcBC3EIJFAQwDgIcrQAinQ8CCwGMhoD1In72FJgIYFQEOHoBRHodBDYCGB0B6xZ9ovcIjAQwSgLWLfpE7xFICWCsBKxb9IneI/ASwIgJWEdqIEHgJYARE+DIBhC5ehC4CWDkBDi+ARK4XmxebJYs5yPwE8AICnCkA4ikPQgcBTCSAhzxACJxDwJPAYyoAEc/gEjeg8BWAKMrwFEQIBL4IDAWwCgLcCwEiCQ+CKQFMNYCHBMBIpEPAnEBjLkAx0aASOaDQF4AYy8gjaFPIC+AsReQtugToS8QGMAYDHC8BIi8Pgg0BjAeAxw3AUs59ghcBjAyAxxBYWvfpZSnQGgAYzTAkRQgkvwgcBrASA1wPAWIRD8ItAYwXgMcVyG9PoHXAEZsgOMqYCmXvQrYY9wGOL5CVC4Aj5Eb4AgLECsNQOA3gBEcsGlLdkXHETgOYCQHzlvsidWzAsuBjOXAeYs9sYJWoDmQ0Rw4xzh2USA6kBEdOF/EsYsC2YGM7EDHXoBYBYAC24GM7UDHXkRHINTzMroDHX0BYikBCnQHMroDHX8BIi+PAt+BjO9Ax1+ASK+jwHcg4ztwvhmaAKHAlzEeCPOBVyhwHsg4D3QkBogkPwqkBzLSAx2LASJdjwLrgYz1QEdjwEpyYhRoD2S0B7aXFETWHgXeAxnvgRAJfyiQHshID2wvKqzE9DEKtAcy2gPb2woyJ40C8YGM+MD2yoLI/6NAfCAjPhAiBXUo0B7Iry109xbk4Us3F/jVhfbuQmT40u2F4PqCQ59YiIDiDQaGPsdmyHQrSrcY+DUGx2aIuXOUrjLwuwyOzACxFgKl6wz8PoNjM0CsSkDpSgO/0+DYDBCLC1C61sDvNbTsh1hggNLVBn63oSU/xCIDlK43MPIDHZkBYp0BCuQHMvIDW/JDLDRAgftAxn1gy32IlQYocB/IuA9suQ+xWgAF7gMZ94GOy5DpdhS4D2TcB7bcRyq6j8B9IOM+sOU+UhG/AveBjPtAx2WAWG6AAveBjPvAlvtIRfwK1Acy6gNb6kOsN0CB+kBGfaCjMkAsOECB+kBGfaCjMkCsOECB+kBGfWBLfYglByhQH8ioD2ypD7HmAAXqAxn1gS31IRYdoEB9IKM+sKU+xKoBFKgPZNQHttSHWDaAAvWBjPrAlvoQeX8UmA9kzAe2zIec+0CB+kBGfWBLfWzEvCEK3Acy7gNb7iMiQCA/kJEf2JIfYv0ACtwHMu4DW+4jMgUC+YGM/MCW/NiIPiSQH8jID2zJj43oQwL3gYz7wJb72Ig+JHAfyLgPbLkPsQIBBe4DGfeBjsvAuXyjUcAg4z7QcRkoFhCgwH0g4z6wvVIh8vcoUB/IqA90VAaK/D0K1Acy6gMdlYEif48C9YGM+kBHZaDI36NAfSCjPtBRGSjy9yhQH8ioD1wNrMEC9YGM+sBVe6FVxK9AfSCjPrClPiIOKHAfyLgPXLUAFB1A4D6QcR+4agEoOoBAfSCjPrClPmIDEBDIuA90dIa8hxfYD2TsBzo2A0X+HwX2Axn7gY7NEG+doEB+ICM/0JEZKJYPoEB+ICM/0JEZKJYPoEB+ICM/cB07AAvMBzLmA9ftjWrR+QXmAxnzgY7JQPHKPQrMBzLmA1vmQyw9QIH8QEZ+oCMzUCw9QIH8QEZ+YDpwc1/gPpBxH5gOXN4XuA9k3Ac6LgPF0gcUuA9k3Ae2tzTkHwAQuA9k3AemLfhE3xe4D2TcBzouA+Xr/AL3gYz7QMdloHylX+A+kHEfmLa3+kXnEbgPZNwHttxH5Gq/dLef4c/RGShf7xfoD2T0B7Y3OMS6AxToD2T0Bzo2A8W6AxTYD2TsBzoyA8W6AxTID2TkBzoyA8W6AxTID2TkBzoyA8W6AxTID2TkB7bkh1h3gAL/gYz/QMdnoFh3gAL/gYz/wJb/EOsOUKBA+r+5n0N6MPaHtr5vfxbp48fz7yv+MfvU/VbS+QeZ/pjh7OUff17PkvafVftP2v4D8/Zf7J4m3b/LTdds0f67mfftuz/YWuT2P+v+0bqXmfb/2Sz7/6w7NbDs/9MpsMvKyz/+/PPyw03uz/2w3TM7D9m2cZ/euoxwcxkhLHQygh8lvUgDIq23bK6TWmT7r02+rfOd9wIW5A2kOknHvD6arS9ntbrISbvZ26y08prysym8cS7JQDdKMedvTxE5a4owVL7E7le/Hs6/+mXa3waj00bltrgZl2t/Am1n7EeKj40vz5amXAa8Rr28fZntGEYW5J3aMhy1rENW5LembnxpK2pZopdWmfpYFrXxpaVUmhIgVlqTH9xX/YisOZW1UI7zIWuyyseurWojEwZKQe0P3xNMzOcEE0sdJsLf66YCiV32VKcT2P2aYohZXFLM6sLGWZw31ISMNNFN/E1eNfe7rPHhADQ8LpUjzJtD+Z88L25L/y0ilaWc/lbWqTZVKI+65Eo5XeXuqxcWyfj69Waj86Gb/scN26/gfs49bCTJRbB23nqBQjQDigydV96cbm9Z4Eno20x1uNjaH0P9bL4WZXNrfwxVgC0NtanuvTqpdjHYtj9064OOoNfWyusE2pfw6Tbb2q9a3mTbz34oolhZ6JYZX+RtVTIz5wmVqQONL/NUuO+gUJl0aVhMGXor8liZW1OZYuvvcejoUbd4iahe04g+1wXis6CLw9Afv/UBSvE5TfrOPORbU/Y/1023KhROyrB6Flv3X08mAuleCpWbRi4wvoNMiZPiJPQz6f4spCkVOxED/YcX6auis7rWxhJPnhBK6AqdTnHTs9BgmUgo+NMpbnqWWZ9u7Kbwhr2pJXXWzZQ3xY9Ztn6HiOqPDnPs/9Ofd+baie4+6EtRS3EF/UkKlU68P9WNP/wFkZconbXceTatyOtW7ly33edg3Pdjzp/vJcPc0GEudUulF5AEVHpnMO1QycczKBrpi07Px+Zu62GprfY/q1X/H+Ubb9dRDqzlmsxwp025q9+Wx6++6XT/lipxU56KpvrKXzxQR7d3gVSyKpM1xvzWmIKH5IS8oaUytjlpuf0teSG6rRLqLMqxOonuS0t1U5nsIMhd0pPMRgklJ1dYiFIaf+bKjRcVJqyWKY2W2mjjZD7kO1NKU0n3rnMd9nZZk3mxhsBl0cXCpIdzFy3XugnYGXPc5wXbHlKvRN2od2Zv7th5iW6wl7q32+cb2Luls6bMbZ2/50TeJt1Qzfsgs0j62KKLubu8zm72nZtkp13uL7BLGnGVm8JdXh/y2kMeAZ7yTfrf5SEBmx4gcK22yH4s3HXzoEEiqL343GYil7qZM/sgaQA0iuq8wX2qkC5xdCunDJ6m2B3LvGhYVpAMLlUaUzf5IWvMzp7ejpfPg3nuSgxMdC+zFzsklRibKI0N98FrGo6UZ6HzmlOZ/zmZunGL7W/+eZ8Yp9x13JqscVmlJuPxjm5i7A9O6MQ12/v7rNjtebqRClNGSfvVp2P37SDqWPSor9yxXUTd9h+ZohLp61jr9tAXicICZqlkIlE5d2eJVfdFJiqQ7gW088eSBUg8QnmstyL8kVE7dGvU5aP1NF7TCLQ5HzE6RgZBd0K+rXJT7MKkHN2TKJfAVlR9nx/rJqtYtKTgVa5XrTw5Z0gTGMqM7flbaG79kzIM9Bxjb6hopN6ZRlgdyPZQ94atGEV0IsNWZl7vTGNjsRSdgDotJOrxdvYJMWpNoK0ka+6q8nT0V7MNBTboxNwbS894r5NSPYlu89B/wZ7mW2iSKNH5VL4tC/t5Gzom6k9Kpo3NCn1Zyh1H+yHz25yd+Ikt/U5opXPxy5fR6T6GRmrlPsEd2NgcASV2APs92kL37vLaQan8whJxNCWj5Jz+w1Yiyg6pBHw2X2/KrPLeHxlbny5Ancv10lrSO9gm01Co2wf1AuPJS4pW3Qv1ZHrzRzfeuvnfZ3XjvkCcbYPUMj1C2h9/0Mk7Fdv7Y1ZlBz/gAz3GKwk2e1rch8klIMO0xVU6UWwBoi7eH4+7hR36P4Byd2WFf6Kcgu9qNMYu9OZm9tNoQmqNHmWUKVQnzlLOAk9GF+KN8iVfWKihggKglqZ6S7dlZcoHU1X5zsYtlqwkMieItPkW37wNdZa+Csf+0JdWpjBgapwyb+4k+U5M929zPV5M/5k+ATPUYzZ6keEnxymVTzfXynA//Bl7KpyuBMpN8ein3Kl8upAqmfDhD9tT4fTMt9TGuqK+b5qjsNWjrP2iW9CULFcvtdtHelsTMsML3VrbS7s4vSUnG3PnH1BJpFduKKxgt01pT5QCgCkclGkXK7RdjsLdOF10lYmRizhhdVt4KSp9DOnomHAlp9wjKPcaA4kgLxQ/SppAZ1F2Y6l/0URopEoIKPuOjxUdEF1ISxrslRSt2MocyzrniZiUvvN5Rz6B8txixYaZf8q7TwhKHeUqJIuWJEYrUwFWoE0EhE5DF8yl3rqH3Hzx5o2ub8paACvnS+ZnZTZ0ewrKwbFSVnuPnrBWPYOIytHlD7ZyZGeqpv1kPB0l3e8qE0S28LGrMwzCtf2lMHJQUPpEme34zpfmslb9jld5aO/lueOfJ5QEVGWOyJPlR9M5RYiy8GLffQ+dvluaYurebKp9E3f79qvoNA9OodLL007cl2OVlxU/z9MEPShJq0PWVPlvfrykW7GkL/BW+mgXhH2BdO6UxXhul+XT39QHlLUpARks1ifRadvoNlhSWm5JvH/d+UJfTK88Wh1Mc1962z/qqIvuXShLEoRFK6UH1XNRi/Loc8jtTophhW6lEuVLcXJYKopucpV7qMOJFcuuKc6UGXrON9J8d8/TgrIWriyypsm29z66aKRVlraWxc6EgrySf90UlUe7oNxmp30TY5ToLmatHOepOZ789WTlhTPdKN3O12YRPIjSNVRZzHrMTqyKfk1Hpby2cTx/4r22n3gXjg30QK58k27Gd3bu/VmnSFUW7x33WWP3o0XZ1Kfj0aZzpGJgKnmjW08s7+5PH10BUPkS9tlXnqxa03SQ0omOleF7PLp+APY3lxa6Bel4utnnW5tgynKWLaWVicqCglZabSpb7OqX/BMjlTUBlTmUjcmO+daeMfZxeoZWQylTlGfZwu5vRcatTCxxcRKHRF62sradSA2vwtBCASWQz/K6F+SJI5tKZWaSi/MTa2QSlYVkgTzhjLWmm5G5DuIXuU3WnHwrKaGpfykPxl0Q2IX5RPDqZ5QrfisyylpQWqvbkihveLWCw0ttNB+npH5iRy+g3oLK5Ekr7Mt9vjdNdnOf73b+9b3U41a04LYhtqmy7ee8uAsO1JRiBuXCGUlF0KOwkk3vwgKrbiKvQXm0qQy/kUEz66iM0i7p79cdeAyNDhE2z2+KytxxKovmalCZ7aTC2MUAOkDl0ZlKC2rZ6SYflXdtarO/zQ2/9kdRqsxw1a4o5XhqmpK7Jb2RpZTViAU0a4+20drVtE5Z57+zixQ0fatcXWvTDLxQuutRFhtZgWHpLr3ug8rst70KWmVFbbeK/ji9yz1Kswp7W8ivHd94vHVPbip3icIKRZxJSSa5A71fQEz5B1jpXJIX6fjX3nQiYtGYhj6c67YH8mujWQVUbgjOkpAVrlJkKuuGmsqm6nc2ytTHcp9vgxJdGiaU3hj8zAG9qoxKysMK2W1PdVMewhJkWjaMynIDJ9CJCrcBSNOIqKy6ORVhjoLapTzCnIrKbMu7Iv/d+O+T3n8G5UJ0qnIvaUV2N6vOmVfd5SRlevNU+QcYbwtAvFt5zj1V0pmFXtxQ+rcTFJ4raLm8siSD1TtRfk5J8Z9qc8iKU7ZnlK8foel6q+QlZXKFpoqUd8NcuaYPL+86aNKBApQMmpXHIwVQ5hCUF4WG+WH66wvK08iDKXZlMGk06w1KyoZcuRHLUuk+UXk/6EtWH/y4Q7e/ahH9dYO+8sXPEdHkk06kubkTaqe8imjlmd+JardiYX0wvZ2nJBy+5LvGT5TSK1So/NkLP6tNL3ah0sP9DBq9+IMLnQf+Xu7ybOvvwCko+x/zAc3q8+v17JgfzT4vzOzlx1///PP/AZkLy4cZGAEA";
@@ -1,4 +1,4 @@
1
- <!DOCTYPE html><html class="default" lang="en" data-base=".."><head><meta charset="utf-8"/><meta http-equiv="x-ua-compatible" content="IE=edge"/><title>CameraKit | CameraKit Web SDK - v1.14.0</title><meta name="description" content="Documentation for CameraKit Web SDK"/><meta name="viewport" content="width=device-width, initial-scale=1"/><link rel="stylesheet" href="../assets/style.css"/><link rel="stylesheet" href="../assets/highlight.css"/><script defer src="../assets/main.js"></script><script async src="../assets/icons.js" id="tsd-icons-script"></script><script async src="../assets/search.js" id="tsd-search-script"></script><script async src="../assets/navigation.js" id="tsd-nav-script"></script><script async src="../assets/hierarchy.js" id="tsd-hierarchy-script"></script></head><body><script>document.documentElement.dataset.theme = localStorage.getItem("tsd-theme") || "os";document.body.style.display="none";setTimeout(() => app?app.showPage():document.body.style.removeProperty("display"),500)</script><header class="tsd-page-toolbar"><div class="tsd-toolbar-contents container"><div class="table-cell" id="tsd-search"><div class="field"><label for="tsd-search-field" class="tsd-widget tsd-toolbar-icon search no-caption"><svg width="16" height="16" viewBox="0 0 16 16" fill="none"><use href="../assets/icons.svg#icon-search"></use></svg></label><input type="text" id="tsd-search-field" aria-label="Search"/></div><div class="field"><div id="tsd-toolbar-links"></div></div><ul class="results"><li class="state loading">Preparing search index...</li><li class="state failure">The search index is not available</li></ul><a href="../index.html" class="title">CameraKit Web SDK - v1.14.0</a></div><div class="table-cell" id="tsd-widgets"><a href="#" class="tsd-widget tsd-toolbar-icon menu no-caption" data-toggle="menu" aria-label="Menu"><svg width="16" height="16" viewBox="0 0 16 16" fill="none"><use href="../assets/icons.svg#icon-menu"></use></svg></a></div></div></header><div class="container container-main"><div class="col-content"><div class="tsd-page-title"><ul class="tsd-breadcrumb"><li><a href="../modules.html">CameraKit Web SDK</a></li><li><a href="CameraKit.html">CameraKit</a></li></ul><h1>Class CameraKit</h1></div><section class="tsd-panel tsd-comment"><div class="tsd-comment tsd-typography"><p>The entry point to the CameraKit SDK's API. Most of CameraKit's features are accessed via this class.</p>
1
+ <!DOCTYPE html><html class="default" lang="en" data-base=".."><head><meta charset="utf-8"/><meta http-equiv="x-ua-compatible" content="IE=edge"/><title>CameraKit | CameraKit Web SDK - v1.15.0</title><meta name="description" content="Documentation for CameraKit Web SDK"/><meta name="viewport" content="width=device-width, initial-scale=1"/><link rel="stylesheet" href="../assets/style.css"/><link rel="stylesheet" href="../assets/highlight.css"/><script defer src="../assets/main.js"></script><script async src="../assets/icons.js" id="tsd-icons-script"></script><script async src="../assets/search.js" id="tsd-search-script"></script><script async src="../assets/navigation.js" id="tsd-nav-script"></script><script async src="../assets/hierarchy.js" id="tsd-hierarchy-script"></script></head><body><script>document.documentElement.dataset.theme = localStorage.getItem("tsd-theme") || "os";document.body.style.display="none";setTimeout(() => app?app.showPage():document.body.style.removeProperty("display"),500)</script><header class="tsd-page-toolbar"><div class="tsd-toolbar-contents container"><div class="table-cell" id="tsd-search"><div class="field"><label for="tsd-search-field" class="tsd-widget tsd-toolbar-icon search no-caption"><svg width="16" height="16" viewBox="0 0 16 16" fill="none"><use href="../assets/icons.svg#icon-search"></use></svg></label><input type="text" id="tsd-search-field" aria-label="Search"/></div><div class="field"><div id="tsd-toolbar-links"></div></div><ul class="results"><li class="state loading">Preparing search index...</li><li class="state failure">The search index is not available</li></ul><a href="../index.html" class="title">CameraKit Web SDK - v1.15.0</a></div><div class="table-cell" id="tsd-widgets"><a href="#" class="tsd-widget tsd-toolbar-icon menu no-caption" data-toggle="menu" aria-label="Menu"><svg width="16" height="16" viewBox="0 0 16 16" fill="none"><use href="../assets/icons.svg#icon-menu"></use></svg></a></div></div></header><div class="container container-main"><div class="col-content"><div class="tsd-page-title"><ul class="tsd-breadcrumb"><li><a href="../modules.html">CameraKit Web SDK</a></li><li><a href="CameraKit.html">CameraKit</a></li></ul><h1>Class CameraKit</h1></div><section class="tsd-panel tsd-comment"><div class="tsd-comment tsd-typography"><p>The entry point to the CameraKit SDK's API. Most of CameraKit's features are accessed via this class.</p>
2
2
  <p>Applications obtain an instance of CameraKit by calling <a href="../functions/bootstrapCameraKit.html" class="tsd-kind-function">bootstrapCameraKit</a>.</p>
3
3
  </div><div class="tsd-comment tsd-typography"><div class="tsd-tag-example"><h4 class="tsd-anchor-link"><a id="example" class="tsd-anchor"></a>Example<a href="#example" aria-label="Permalink" class="tsd-anchor-icon"><svg viewBox="0 0 24 24"><use href="../assets/icons.svg#icon-anchor"></use></svg></a></h4><pre><code class="ts"><span class="hl-4">const</span><span class="hl-1"> </span><span class="hl-6">cameraKit</span><span class="hl-1"> = </span><span class="hl-2">await</span><span class="hl-1"> </span><span class="hl-5">bootstrapCameraKit</span><span class="hl-1">(</span><span class="hl-0">config</span><span class="hl-1">)</span>
4
4
  </code><button type="button">Copy</button></pre>
@@ -25,4 +25,4 @@ to Lens rendering.</p>
25
25
  </code><button type="button">Copy</button></pre>
26
26
 
27
27
  </div></div></li></ul></section><section class="tsd-panel tsd-member"><a id="destroy" class="tsd-anchor"></a><h3 class="tsd-anchor-link"><span>destroy</span><a href="#destroy" aria-label="Permalink" class="tsd-anchor-icon"><svg viewBox="0 0 24 24"><use href="../assets/icons.svg#icon-anchor"></use></svg></a></h3><ul class="tsd-signatures"><li class="tsd-signature tsd-anchor-link"><a id="destroy-1" class="tsd-anchor"></a><span class="tsd-kind-call-signature">destroy</span><span class="tsd-signature-symbol">()</span><span class="tsd-signature-symbol">:</span> <a href="https://developer.mozilla.org/docs/Web/JavaScript/Reference/Global_Objects/Promise" class="tsd-signature-type external" target="_blank">Promise</a><span class="tsd-signature-symbol">&lt;</span><span class="tsd-signature-type">void</span><span class="tsd-signature-symbol">&gt;</span><a href="#destroy-1" aria-label="Permalink" class="tsd-anchor-icon"><svg viewBox="0 0 24 24"><use href="../assets/icons.svg#icon-anchor"></use></svg></a></li><li class="tsd-description"><div class="tsd-comment tsd-typography"><p>Destroys all sessions and frees all resources.</p>
28
- </div><h4 class="tsd-returns-title">Returns <a href="https://developer.mozilla.org/docs/Web/JavaScript/Reference/Global_Objects/Promise" class="tsd-signature-type external" target="_blank">Promise</a><span class="tsd-signature-symbol">&lt;</span><span class="tsd-signature-type">void</span><span class="tsd-signature-symbol">&gt;</span></h4><div class="tsd-comment tsd-typography"></div></li></ul></section></section></details></div><div class="col-sidebar"><div class="page-menu"><div class="tsd-navigation settings"><details class="tsd-accordion"><summary class="tsd-accordion-summary"><h3><svg width="20" height="20" viewBox="0 0 24 24" fill="none"><use href="../assets/icons.svg#icon-chevronDown"></use></svg>Settings</h3></summary><div class="tsd-accordion-details"><div class="tsd-filter-visibility"><span class="settings-label">Member Visibility</span><ul id="tsd-filter-options"><li class="tsd-filter-item"><label class="tsd-filter-input"><input type="checkbox" id="tsd-filter-protected" name="protected"/><svg width="32" height="32" viewBox="0 0 32 32" aria-hidden="true"><rect class="tsd-checkbox-background" width="30" height="30" x="1" y="1" rx="6" fill="none"></rect><path class="tsd-checkbox-checkmark" d="M8.35422 16.8214L13.2143 21.75L24.6458 10.25" stroke="none" stroke-width="3.5" stroke-linejoin="round" fill="none"></path></svg><span>Protected</span></label></li><li class="tsd-filter-item"><label class="tsd-filter-input"><input type="checkbox" id="tsd-filter-inherited" name="inherited" checked/><svg width="32" height="32" viewBox="0 0 32 32" aria-hidden="true"><rect class="tsd-checkbox-background" width="30" height="30" x="1" y="1" rx="6" fill="none"></rect><path class="tsd-checkbox-checkmark" d="M8.35422 16.8214L13.2143 21.75L24.6458 10.25" stroke="none" stroke-width="3.5" stroke-linejoin="round" fill="none"></path></svg><span>Inherited</span></label></li></ul></div><div class="tsd-theme-toggle"><label class="settings-label" for="tsd-theme">Theme</label><select id="tsd-theme"><option value="os">OS</option><option value="light">Light</option><option value="dark">Dark</option></select></div></div></details></div><details open class="tsd-accordion tsd-page-navigation"><summary class="tsd-accordion-summary"><h3><svg width="20" height="20" viewBox="0 0 24 24" fill="none"><use href="../assets/icons.svg#icon-chevronDown"></use></svg>On This Page</h3></summary><div class="tsd-accordion-details"><details open class="tsd-accordion tsd-page-navigation-section"><summary class="tsd-accordion-summary" data-key="section-Properties"><svg width="20" height="20" viewBox="0 0 24 24" fill="none"><use href="../assets/icons.svg#icon-chevronDown"></use></svg>Properties</summary><div><a href="#lenses" class=""><svg class="tsd-kind-icon" viewBox="0 0 24 24"><use href="../assets/icons.svg#icon-1024"></use></svg><span>lenses</span></a><a href="#metrics" class=""><svg class="tsd-kind-icon" viewBox="0 0 24 24"><use href="../assets/icons.svg#icon-1024"></use></svg><span>metrics</span></a><a href="#lensrepository" class=""><svg class="tsd-kind-icon" viewBox="0 0 24 24"><use href="../assets/icons.svg#icon-1024"></use></svg><span>lens<wbr/>Repository</span></a></div></details><details open class="tsd-accordion tsd-page-navigation-section"><summary class="tsd-accordion-summary" data-key="section-Methods"><svg width="20" height="20" viewBox="0 0 24 24" fill="none"><use href="../assets/icons.svg#icon-chevronDown"></use></svg>Methods</summary><div><a href="#createsession" class=""><svg class="tsd-kind-icon" viewBox="0 0 24 24"><use href="../assets/icons.svg#icon-2048"></use></svg><span>create<wbr/>Session</span></a><a href="#destroy" class=""><svg class="tsd-kind-icon" viewBox="0 0 24 24"><use href="../assets/icons.svg#icon-2048"></use></svg><span>destroy</span></a></div></details></div></details></div><div class="site-menu"><nav class="tsd-navigation"><a href="../modules.html">CameraKit Web SDK - v1.14.0</a><ul class="tsd-small-nested-navigation" id="tsd-nav-container"><li>Loading...</li></ul></nav></div></div></div><footer><p class="tsd-generator">Generated using <a href="https://typedoc.org/" target="_blank">TypeDoc</a></p></footer><div class="overlay"></div></body></html>
28
+ </div><h4 class="tsd-returns-title">Returns <a href="https://developer.mozilla.org/docs/Web/JavaScript/Reference/Global_Objects/Promise" class="tsd-signature-type external" target="_blank">Promise</a><span class="tsd-signature-symbol">&lt;</span><span class="tsd-signature-type">void</span><span class="tsd-signature-symbol">&gt;</span></h4><div class="tsd-comment tsd-typography"></div></li></ul></section></section></details></div><div class="col-sidebar"><div class="page-menu"><div class="tsd-navigation settings"><details class="tsd-accordion"><summary class="tsd-accordion-summary"><h3><svg width="20" height="20" viewBox="0 0 24 24" fill="none"><use href="../assets/icons.svg#icon-chevronDown"></use></svg>Settings</h3></summary><div class="tsd-accordion-details"><div class="tsd-filter-visibility"><span class="settings-label">Member Visibility</span><ul id="tsd-filter-options"><li class="tsd-filter-item"><label class="tsd-filter-input"><input type="checkbox" id="tsd-filter-protected" name="protected"/><svg width="32" height="32" viewBox="0 0 32 32" aria-hidden="true"><rect class="tsd-checkbox-background" width="30" height="30" x="1" y="1" rx="6" fill="none"></rect><path class="tsd-checkbox-checkmark" d="M8.35422 16.8214L13.2143 21.75L24.6458 10.25" stroke="none" stroke-width="3.5" stroke-linejoin="round" fill="none"></path></svg><span>Protected</span></label></li><li class="tsd-filter-item"><label class="tsd-filter-input"><input type="checkbox" id="tsd-filter-inherited" name="inherited" checked/><svg width="32" height="32" viewBox="0 0 32 32" aria-hidden="true"><rect class="tsd-checkbox-background" width="30" height="30" x="1" y="1" rx="6" fill="none"></rect><path class="tsd-checkbox-checkmark" d="M8.35422 16.8214L13.2143 21.75L24.6458 10.25" stroke="none" stroke-width="3.5" stroke-linejoin="round" fill="none"></path></svg><span>Inherited</span></label></li></ul></div><div class="tsd-theme-toggle"><label class="settings-label" for="tsd-theme">Theme</label><select id="tsd-theme"><option value="os">OS</option><option value="light">Light</option><option value="dark">Dark</option></select></div></div></details></div><details open class="tsd-accordion tsd-page-navigation"><summary class="tsd-accordion-summary"><h3><svg width="20" height="20" viewBox="0 0 24 24" fill="none"><use href="../assets/icons.svg#icon-chevronDown"></use></svg>On This Page</h3></summary><div class="tsd-accordion-details"><details open class="tsd-accordion tsd-page-navigation-section"><summary class="tsd-accordion-summary" data-key="section-Properties"><svg width="20" height="20" viewBox="0 0 24 24" fill="none"><use href="../assets/icons.svg#icon-chevronDown"></use></svg>Properties</summary><div><a href="#lenses" class=""><svg class="tsd-kind-icon" viewBox="0 0 24 24"><use href="../assets/icons.svg#icon-1024"></use></svg><span>lenses</span></a><a href="#metrics" class=""><svg class="tsd-kind-icon" viewBox="0 0 24 24"><use href="../assets/icons.svg#icon-1024"></use></svg><span>metrics</span></a><a href="#lensrepository" class=""><svg class="tsd-kind-icon" viewBox="0 0 24 24"><use href="../assets/icons.svg#icon-1024"></use></svg><span>lens<wbr/>Repository</span></a></div></details><details open class="tsd-accordion tsd-page-navigation-section"><summary class="tsd-accordion-summary" data-key="section-Methods"><svg width="20" height="20" viewBox="0 0 24 24" fill="none"><use href="../assets/icons.svg#icon-chevronDown"></use></svg>Methods</summary><div><a href="#createsession" class=""><svg class="tsd-kind-icon" viewBox="0 0 24 24"><use href="../assets/icons.svg#icon-2048"></use></svg><span>create<wbr/>Session</span></a><a href="#destroy" class=""><svg class="tsd-kind-icon" viewBox="0 0 24 24"><use href="../assets/icons.svg#icon-2048"></use></svg><span>destroy</span></a></div></details></div></details></div><div class="site-menu"><nav class="tsd-navigation"><a href="../modules.html">CameraKit Web SDK - v1.15.0</a><ul class="tsd-small-nested-navigation" id="tsd-nav-container"><li>Loading...</li></ul></nav></div></div></div><footer><p class="tsd-generator">Generated using <a href="https://typedoc.org/" target="_blank">TypeDoc</a></p></footer><div class="overlay"></div></body></html>
@@ -1,4 +1,4 @@
1
- <!DOCTYPE html><html class="default" lang="en" data-base=".."><head><meta charset="utf-8"/><meta http-equiv="x-ua-compatible" content="IE=edge"/><title>CameraKitSession | CameraKit Web SDK - v1.14.0</title><meta name="description" content="Documentation for CameraKit Web SDK"/><meta name="viewport" content="width=device-width, initial-scale=1"/><link rel="stylesheet" href="../assets/style.css"/><link rel="stylesheet" href="../assets/highlight.css"/><script defer src="../assets/main.js"></script><script async src="../assets/icons.js" id="tsd-icons-script"></script><script async src="../assets/search.js" id="tsd-search-script"></script><script async src="../assets/navigation.js" id="tsd-nav-script"></script><script async src="../assets/hierarchy.js" id="tsd-hierarchy-script"></script></head><body><script>document.documentElement.dataset.theme = localStorage.getItem("tsd-theme") || "os";document.body.style.display="none";setTimeout(() => app?app.showPage():document.body.style.removeProperty("display"),500)</script><header class="tsd-page-toolbar"><div class="tsd-toolbar-contents container"><div class="table-cell" id="tsd-search"><div class="field"><label for="tsd-search-field" class="tsd-widget tsd-toolbar-icon search no-caption"><svg width="16" height="16" viewBox="0 0 16 16" fill="none"><use href="../assets/icons.svg#icon-search"></use></svg></label><input type="text" id="tsd-search-field" aria-label="Search"/></div><div class="field"><div id="tsd-toolbar-links"></div></div><ul class="results"><li class="state loading">Preparing search index...</li><li class="state failure">The search index is not available</li></ul><a href="../index.html" class="title">CameraKit Web SDK - v1.14.0</a></div><div class="table-cell" id="tsd-widgets"><a href="#" class="tsd-widget tsd-toolbar-icon menu no-caption" data-toggle="menu" aria-label="Menu"><svg width="16" height="16" viewBox="0 0 16 16" fill="none"><use href="../assets/icons.svg#icon-menu"></use></svg></a></div></div></header><div class="container container-main"><div class="col-content"><div class="tsd-page-title"><ul class="tsd-breadcrumb"><li><a href="../modules.html">CameraKit Web SDK</a></li><li><a href="CameraKitSession.html">CameraKitSession</a></li></ul><h1>Class CameraKitSession</h1></div><section class="tsd-panel tsd-comment"><div class="tsd-comment tsd-typography"><p>A CameraKitSession represents a single rendering pipeline connecting an input media source to output <code>&lt;canvas&gt;</code>
1
+ <!DOCTYPE html><html class="default" lang="en" data-base=".."><head><meta charset="utf-8"/><meta http-equiv="x-ua-compatible" content="IE=edge"/><title>CameraKitSession | CameraKit Web SDK - v1.15.0</title><meta name="description" content="Documentation for CameraKit Web SDK"/><meta name="viewport" content="width=device-width, initial-scale=1"/><link rel="stylesheet" href="../assets/style.css"/><link rel="stylesheet" href="../assets/highlight.css"/><script defer src="../assets/main.js"></script><script async src="../assets/icons.js" id="tsd-icons-script"></script><script async src="../assets/search.js" id="tsd-search-script"></script><script async src="../assets/navigation.js" id="tsd-nav-script"></script><script async src="../assets/hierarchy.js" id="tsd-hierarchy-script"></script></head><body><script>document.documentElement.dataset.theme = localStorage.getItem("tsd-theme") || "os";document.body.style.display="none";setTimeout(() => app?app.showPage():document.body.style.removeProperty("display"),500)</script><header class="tsd-page-toolbar"><div class="tsd-toolbar-contents container"><div class="table-cell" id="tsd-search"><div class="field"><label for="tsd-search-field" class="tsd-widget tsd-toolbar-icon search no-caption"><svg width="16" height="16" viewBox="0 0 16 16" fill="none"><use href="../assets/icons.svg#icon-search"></use></svg></label><input type="text" id="tsd-search-field" aria-label="Search"/></div><div class="field"><div id="tsd-toolbar-links"></div></div><ul class="results"><li class="state loading">Preparing search index...</li><li class="state failure">The search index is not available</li></ul><a href="../index.html" class="title">CameraKit Web SDK - v1.15.0</a></div><div class="table-cell" id="tsd-widgets"><a href="#" class="tsd-widget tsd-toolbar-icon menu no-caption" data-toggle="menu" aria-label="Menu"><svg width="16" height="16" viewBox="0 0 16 16" fill="none"><use href="../assets/icons.svg#icon-menu"></use></svg></a></div></div></header><div class="container container-main"><div class="col-content"><div class="tsd-page-title"><ul class="tsd-breadcrumb"><li><a href="../modules.html">CameraKit Web SDK</a></li><li><a href="CameraKitSession.html">CameraKitSession</a></li></ul><h1>Class CameraKitSession</h1></div><section class="tsd-panel tsd-comment"><div class="tsd-comment tsd-typography"><p>A CameraKitSession represents a single rendering pipeline connecting an input media source to output <code>&lt;canvas&gt;</code>
2
2
  elements. When a Lens is applied to the session, CameraKit uses the Lens to transform the input media into rendered
3
3
  output.</p>
4
4
  <p>CameraKitSession is the primary object that applications interact with when integrating the CameraKit SDK.</p>
@@ -158,4 +158,4 @@ will be automatically removed.</p>
158
158
  </div><div class="tsd-comment tsd-typography"></div></li></ul></div><h4 class="tsd-returns-title">Returns <a href="https://developer.mozilla.org/docs/Web/JavaScript/Reference/Global_Objects/Promise" class="tsd-signature-type external" target="_blank">Promise</a><span class="tsd-signature-symbol">&lt;</span><span class="tsd-signature-type">void</span><span class="tsd-signature-symbol">&gt;</span></h4><p>Promise that resolves when the screen regions have been successfully set</p>
159
159
  <div class="tsd-comment tsd-typography"></div></li></ul></section><section class="tsd-panel tsd-member"><a id="destroy" class="tsd-anchor"></a><h3 class="tsd-anchor-link"><span>destroy</span><a href="#destroy" aria-label="Permalink" class="tsd-anchor-icon"><svg viewBox="0 0 24 24"><use href="../assets/icons.svg#icon-anchor"></use></svg></a></h3><ul class="tsd-signatures"><li class="tsd-signature tsd-anchor-link"><a id="destroy-1" class="tsd-anchor"></a><span class="tsd-kind-call-signature">destroy</span><span class="tsd-signature-symbol">()</span><span class="tsd-signature-symbol">:</span> <a href="https://developer.mozilla.org/docs/Web/JavaScript/Reference/Global_Objects/Promise" class="tsd-signature-type external" target="_blank">Promise</a><span class="tsd-signature-symbol">&lt;</span><span class="tsd-signature-type">void</span><span class="tsd-signature-symbol">&gt;</span><a href="#destroy-1" aria-label="Permalink" class="tsd-anchor-icon"><svg viewBox="0 0 24 24"><use href="../assets/icons.svg#icon-anchor"></use></svg></a></li><li class="tsd-description"><div class="tsd-comment tsd-typography"><p>Destroy the session.</p>
160
160
  <p>The session will become inoperable. Frame processing stops, and any session-scoped graphical resources are freed.</p>
161
- </div><h4 class="tsd-returns-title">Returns <a href="https://developer.mozilla.org/docs/Web/JavaScript/Reference/Global_Objects/Promise" class="tsd-signature-type external" target="_blank">Promise</a><span class="tsd-signature-symbol">&lt;</span><span class="tsd-signature-type">void</span><span class="tsd-signature-symbol">&gt;</span></h4><div class="tsd-comment tsd-typography"></div></li></ul></section></section></details></div><div class="col-sidebar"><div class="page-menu"><div class="tsd-navigation settings"><details class="tsd-accordion"><summary class="tsd-accordion-summary"><h3><svg width="20" height="20" viewBox="0 0 24 24" fill="none"><use href="../assets/icons.svg#icon-chevronDown"></use></svg>Settings</h3></summary><div class="tsd-accordion-details"><div class="tsd-filter-visibility"><span class="settings-label">Member Visibility</span><ul id="tsd-filter-options"><li class="tsd-filter-item"><label class="tsd-filter-input"><input type="checkbox" id="tsd-filter-protected" name="protected"/><svg width="32" height="32" viewBox="0 0 32 32" aria-hidden="true"><rect class="tsd-checkbox-background" width="30" height="30" x="1" y="1" rx="6" fill="none"></rect><path class="tsd-checkbox-checkmark" d="M8.35422 16.8214L13.2143 21.75L24.6458 10.25" stroke="none" stroke-width="3.5" stroke-linejoin="round" fill="none"></path></svg><span>Protected</span></label></li><li class="tsd-filter-item"><label class="tsd-filter-input"><input type="checkbox" id="tsd-filter-inherited" name="inherited" checked/><svg width="32" height="32" viewBox="0 0 32 32" aria-hidden="true"><rect class="tsd-checkbox-background" width="30" height="30" x="1" y="1" rx="6" fill="none"></rect><path class="tsd-checkbox-checkmark" d="M8.35422 16.8214L13.2143 21.75L24.6458 10.25" stroke="none" stroke-width="3.5" stroke-linejoin="round" fill="none"></path></svg><span>Inherited</span></label></li></ul></div><div class="tsd-theme-toggle"><label class="settings-label" for="tsd-theme">Theme</label><select id="tsd-theme"><option value="os">OS</option><option value="light">Light</option><option value="dark">Dark</option></select></div></div></details></div><details open class="tsd-accordion tsd-page-navigation"><summary class="tsd-accordion-summary"><h3><svg width="20" height="20" viewBox="0 0 24 24" fill="none"><use href="../assets/icons.svg#icon-chevronDown"></use></svg>On This Page</h3></summary><div class="tsd-accordion-details"><details open class="tsd-accordion tsd-page-navigation-section"><summary class="tsd-accordion-summary" data-key="section-Properties"><svg width="20" height="20" viewBox="0 0 24 24" fill="none"><use href="../assets/icons.svg#icon-chevronDown"></use></svg>Properties</summary><div><a href="#output" class=""><svg class="tsd-kind-icon" viewBox="0 0 24 24"><use href="../assets/icons.svg#icon-1024"></use></svg><span>output</span></a><a href="#playing" class=""><svg class="tsd-kind-icon" viewBox="0 0 24 24"><use href="../assets/icons.svg#icon-1024"></use></svg><span>playing</span></a><a href="#events" class=""><svg class="tsd-kind-icon" viewBox="0 0 24 24"><use href="../assets/icons.svg#icon-1024"></use></svg><span>events</span></a><a href="#metrics" class=""><svg class="tsd-kind-icon" viewBox="0 0 24 24"><use href="../assets/icons.svg#icon-1024"></use></svg><span>metrics</span></a><a href="#keyboard" class=""><svg class="tsd-kind-icon" viewBox="0 0 24 24"><use href="../assets/icons.svg#icon-1024"></use></svg><span>keyboard</span></a></div></details><details open class="tsd-accordion tsd-page-navigation-section"><summary class="tsd-accordion-summary" data-key="section-Methods"><svg width="20" height="20" viewBox="0 0 24 24" fill="none"><use href="../assets/icons.svg#icon-chevronDown"></use></svg>Methods</summary><div><a href="#applylens" class=""><svg class="tsd-kind-icon" viewBox="0 0 24 24"><use href="../assets/icons.svg#icon-2048"></use></svg><span>apply<wbr/>Lens</span></a><a href="#removelens" class=""><svg class="tsd-kind-icon" viewBox="0 0 24 24"><use href="../assets/icons.svg#icon-2048"></use></svg><span>remove<wbr/>Lens</span></a><a href="#play" class=""><svg class="tsd-kind-icon" viewBox="0 0 24 24"><use href="../assets/icons.svg#icon-2048"></use></svg><span>play</span></a><a href="#pause" class=""><svg class="tsd-kind-icon" viewBox="0 0 24 24"><use href="../assets/icons.svg#icon-2048"></use></svg><span>pause</span></a><a href="#mute" class=""><svg class="tsd-kind-icon" viewBox="0 0 24 24"><use href="../assets/icons.svg#icon-2048"></use></svg><span>mute</span></a><a href="#unmute" class=""><svg class="tsd-kind-icon" viewBox="0 0 24 24"><use href="../assets/icons.svg#icon-2048"></use></svg><span>unmute</span></a><a href="#setsource" class=""><svg class="tsd-kind-icon" viewBox="0 0 24 24"><use href="../assets/icons.svg#icon-2048"></use></svg><span>set<wbr/>Source</span></a><a href="#setfpslimit" class=""><svg class="tsd-kind-icon" viewBox="0 0 24 24"><use href="../assets/icons.svg#icon-2048"></use></svg><span>setFPSLimit</span></a><a href="#setscreenregions" class=""><svg class="tsd-kind-icon" viewBox="0 0 24 24"><use href="../assets/icons.svg#icon-2048"></use></svg><span>set<wbr/>Screen<wbr/>Regions</span></a><a href="#destroy" class=""><svg class="tsd-kind-icon" viewBox="0 0 24 24"><use href="../assets/icons.svg#icon-2048"></use></svg><span>destroy</span></a></div></details></div></details></div><div class="site-menu"><nav class="tsd-navigation"><a href="../modules.html">CameraKit Web SDK - v1.14.0</a><ul class="tsd-small-nested-navigation" id="tsd-nav-container"><li>Loading...</li></ul></nav></div></div></div><footer><p class="tsd-generator">Generated using <a href="https://typedoc.org/" target="_blank">TypeDoc</a></p></footer><div class="overlay"></div></body></html>
161
+ </div><h4 class="tsd-returns-title">Returns <a href="https://developer.mozilla.org/docs/Web/JavaScript/Reference/Global_Objects/Promise" class="tsd-signature-type external" target="_blank">Promise</a><span class="tsd-signature-symbol">&lt;</span><span class="tsd-signature-type">void</span><span class="tsd-signature-symbol">&gt;</span></h4><div class="tsd-comment tsd-typography"></div></li></ul></section></section></details></div><div class="col-sidebar"><div class="page-menu"><div class="tsd-navigation settings"><details class="tsd-accordion"><summary class="tsd-accordion-summary"><h3><svg width="20" height="20" viewBox="0 0 24 24" fill="none"><use href="../assets/icons.svg#icon-chevronDown"></use></svg>Settings</h3></summary><div class="tsd-accordion-details"><div class="tsd-filter-visibility"><span class="settings-label">Member Visibility</span><ul id="tsd-filter-options"><li class="tsd-filter-item"><label class="tsd-filter-input"><input type="checkbox" id="tsd-filter-protected" name="protected"/><svg width="32" height="32" viewBox="0 0 32 32" aria-hidden="true"><rect class="tsd-checkbox-background" width="30" height="30" x="1" y="1" rx="6" fill="none"></rect><path class="tsd-checkbox-checkmark" d="M8.35422 16.8214L13.2143 21.75L24.6458 10.25" stroke="none" stroke-width="3.5" stroke-linejoin="round" fill="none"></path></svg><span>Protected</span></label></li><li class="tsd-filter-item"><label class="tsd-filter-input"><input type="checkbox" id="tsd-filter-inherited" name="inherited" checked/><svg width="32" height="32" viewBox="0 0 32 32" aria-hidden="true"><rect class="tsd-checkbox-background" width="30" height="30" x="1" y="1" rx="6" fill="none"></rect><path class="tsd-checkbox-checkmark" d="M8.35422 16.8214L13.2143 21.75L24.6458 10.25" stroke="none" stroke-width="3.5" stroke-linejoin="round" fill="none"></path></svg><span>Inherited</span></label></li></ul></div><div class="tsd-theme-toggle"><label class="settings-label" for="tsd-theme">Theme</label><select id="tsd-theme"><option value="os">OS</option><option value="light">Light</option><option value="dark">Dark</option></select></div></div></details></div><details open class="tsd-accordion tsd-page-navigation"><summary class="tsd-accordion-summary"><h3><svg width="20" height="20" viewBox="0 0 24 24" fill="none"><use href="../assets/icons.svg#icon-chevronDown"></use></svg>On This Page</h3></summary><div class="tsd-accordion-details"><details open class="tsd-accordion tsd-page-navigation-section"><summary class="tsd-accordion-summary" data-key="section-Properties"><svg width="20" height="20" viewBox="0 0 24 24" fill="none"><use href="../assets/icons.svg#icon-chevronDown"></use></svg>Properties</summary><div><a href="#output" class=""><svg class="tsd-kind-icon" viewBox="0 0 24 24"><use href="../assets/icons.svg#icon-1024"></use></svg><span>output</span></a><a href="#playing" class=""><svg class="tsd-kind-icon" viewBox="0 0 24 24"><use href="../assets/icons.svg#icon-1024"></use></svg><span>playing</span></a><a href="#events" class=""><svg class="tsd-kind-icon" viewBox="0 0 24 24"><use href="../assets/icons.svg#icon-1024"></use></svg><span>events</span></a><a href="#metrics" class=""><svg class="tsd-kind-icon" viewBox="0 0 24 24"><use href="../assets/icons.svg#icon-1024"></use></svg><span>metrics</span></a><a href="#keyboard" class=""><svg class="tsd-kind-icon" viewBox="0 0 24 24"><use href="../assets/icons.svg#icon-1024"></use></svg><span>keyboard</span></a></div></details><details open class="tsd-accordion tsd-page-navigation-section"><summary class="tsd-accordion-summary" data-key="section-Methods"><svg width="20" height="20" viewBox="0 0 24 24" fill="none"><use href="../assets/icons.svg#icon-chevronDown"></use></svg>Methods</summary><div><a href="#applylens" class=""><svg class="tsd-kind-icon" viewBox="0 0 24 24"><use href="../assets/icons.svg#icon-2048"></use></svg><span>apply<wbr/>Lens</span></a><a href="#removelens" class=""><svg class="tsd-kind-icon" viewBox="0 0 24 24"><use href="../assets/icons.svg#icon-2048"></use></svg><span>remove<wbr/>Lens</span></a><a href="#play" class=""><svg class="tsd-kind-icon" viewBox="0 0 24 24"><use href="../assets/icons.svg#icon-2048"></use></svg><span>play</span></a><a href="#pause" class=""><svg class="tsd-kind-icon" viewBox="0 0 24 24"><use href="../assets/icons.svg#icon-2048"></use></svg><span>pause</span></a><a href="#mute" class=""><svg class="tsd-kind-icon" viewBox="0 0 24 24"><use href="../assets/icons.svg#icon-2048"></use></svg><span>mute</span></a><a href="#unmute" class=""><svg class="tsd-kind-icon" viewBox="0 0 24 24"><use href="../assets/icons.svg#icon-2048"></use></svg><span>unmute</span></a><a href="#setsource" class=""><svg class="tsd-kind-icon" viewBox="0 0 24 24"><use href="../assets/icons.svg#icon-2048"></use></svg><span>set<wbr/>Source</span></a><a href="#setfpslimit" class=""><svg class="tsd-kind-icon" viewBox="0 0 24 24"><use href="../assets/icons.svg#icon-2048"></use></svg><span>setFPSLimit</span></a><a href="#setscreenregions" class=""><svg class="tsd-kind-icon" viewBox="0 0 24 24"><use href="../assets/icons.svg#icon-2048"></use></svg><span>set<wbr/>Screen<wbr/>Regions</span></a><a href="#destroy" class=""><svg class="tsd-kind-icon" viewBox="0 0 24 24"><use href="../assets/icons.svg#icon-2048"></use></svg><span>destroy</span></a></div></details></div></details></div><div class="site-menu"><nav class="tsd-navigation"><a href="../modules.html">CameraKit Web SDK - v1.15.0</a><ul class="tsd-small-nested-navigation" id="tsd-nav-container"><li>Loading...</li></ul></nav></div></div></div><footer><p class="tsd-generator">Generated using <a href="https://typedoc.org/" target="_blank">TypeDoc</a></p></footer><div class="overlay"></div></body></html>
@@ -1,4 +1,4 @@
1
- <!DOCTYPE html><html class="default" lang="en" data-base=".."><head><meta charset="utf-8"/><meta http-equiv="x-ua-compatible" content="IE=edge"/><title>CameraKitSource | CameraKit Web SDK - v1.14.0</title><meta name="description" content="Documentation for CameraKit Web SDK"/><meta name="viewport" content="width=device-width, initial-scale=1"/><link rel="stylesheet" href="../assets/style.css"/><link rel="stylesheet" href="../assets/highlight.css"/><script defer src="../assets/main.js"></script><script async src="../assets/icons.js" id="tsd-icons-script"></script><script async src="../assets/search.js" id="tsd-search-script"></script><script async src="../assets/navigation.js" id="tsd-nav-script"></script><script async src="../assets/hierarchy.js" id="tsd-hierarchy-script"></script></head><body><script>document.documentElement.dataset.theme = localStorage.getItem("tsd-theme") || "os";document.body.style.display="none";setTimeout(() => app?app.showPage():document.body.style.removeProperty("display"),500)</script><header class="tsd-page-toolbar"><div class="tsd-toolbar-contents container"><div class="table-cell" id="tsd-search"><div class="field"><label for="tsd-search-field" class="tsd-widget tsd-toolbar-icon search no-caption"><svg width="16" height="16" viewBox="0 0 16 16" fill="none"><use href="../assets/icons.svg#icon-search"></use></svg></label><input type="text" id="tsd-search-field" aria-label="Search"/></div><div class="field"><div id="tsd-toolbar-links"></div></div><ul class="results"><li class="state loading">Preparing search index...</li><li class="state failure">The search index is not available</li></ul><a href="../index.html" class="title">CameraKit Web SDK - v1.14.0</a></div><div class="table-cell" id="tsd-widgets"><a href="#" class="tsd-widget tsd-toolbar-icon menu no-caption" data-toggle="menu" aria-label="Menu"><svg width="16" height="16" viewBox="0 0 16 16" fill="none"><use href="../assets/icons.svg#icon-menu"></use></svg></a></div></div></header><div class="container container-main"><div class="col-content"><div class="tsd-page-title"><ul class="tsd-breadcrumb"><li><a href="../modules.html">CameraKit Web SDK</a></li><li><a href="CameraKitSource.html">CameraKitSource</a></li></ul><h1>Class CameraKitSource</h1></div><section class="tsd-panel tsd-comment"><div class="tsd-comment tsd-typography"><p>This general-purpose class represents a source of media for a <a href="CameraKitSession.html" class="tsd-kind-class">CameraKitSession</a>.</p>
1
+ <!DOCTYPE html><html class="default" lang="en" data-base=".."><head><meta charset="utf-8"/><meta http-equiv="x-ua-compatible" content="IE=edge"/><title>CameraKitSource | CameraKit Web SDK - v1.15.0</title><meta name="description" content="Documentation for CameraKit Web SDK"/><meta name="viewport" content="width=device-width, initial-scale=1"/><link rel="stylesheet" href="../assets/style.css"/><link rel="stylesheet" href="../assets/highlight.css"/><script defer src="../assets/main.js"></script><script async src="../assets/icons.js" id="tsd-icons-script"></script><script async src="../assets/search.js" id="tsd-search-script"></script><script async src="../assets/navigation.js" id="tsd-nav-script"></script><script async src="../assets/hierarchy.js" id="tsd-hierarchy-script"></script></head><body><script>document.documentElement.dataset.theme = localStorage.getItem("tsd-theme") || "os";document.body.style.display="none";setTimeout(() => app?app.showPage():document.body.style.removeProperty("display"),500)</script><header class="tsd-page-toolbar"><div class="tsd-toolbar-contents container"><div class="table-cell" id="tsd-search"><div class="field"><label for="tsd-search-field" class="tsd-widget tsd-toolbar-icon search no-caption"><svg width="16" height="16" viewBox="0 0 16 16" fill="none"><use href="../assets/icons.svg#icon-search"></use></svg></label><input type="text" id="tsd-search-field" aria-label="Search"/></div><div class="field"><div id="tsd-toolbar-links"></div></div><ul class="results"><li class="state loading">Preparing search index...</li><li class="state failure">The search index is not available</li></ul><a href="../index.html" class="title">CameraKit Web SDK - v1.15.0</a></div><div class="table-cell" id="tsd-widgets"><a href="#" class="tsd-widget tsd-toolbar-icon menu no-caption" data-toggle="menu" aria-label="Menu"><svg width="16" height="16" viewBox="0 0 16 16" fill="none"><use href="../assets/icons.svg#icon-menu"></use></svg></a></div></div></header><div class="container container-main"><div class="col-content"><div class="tsd-page-title"><ul class="tsd-breadcrumb"><li><a href="../modules.html">CameraKit Web SDK</a></li><li><a href="CameraKitSource.html">CameraKitSource</a></li></ul><h1>Class CameraKitSource</h1></div><section class="tsd-panel tsd-comment"><div class="tsd-comment tsd-typography"><p>This general-purpose class represents a source of media for a <a href="CameraKitSession.html" class="tsd-kind-class">CameraKitSession</a>.</p>
2
2
  <p>When an instance is passed to <a href="CameraKitSession.html#setsource" class="tsd-kind-method">CameraKitSession.setSource</a>, it will be &quot;attached&quot;
3
3
  to the session. Later it may be &quot;detached&quot; from the session.</p>
4
4
  <p>Passing a <a href="../interfaces/CameraKitSourceSubscriber.html" class="tsd-kind-interface">CameraKitSourceSubscriber</a> to the constructor allows callers to specify behavior
@@ -33,4 +33,4 @@ of as free.</p>
33
33
  constraint should be removed, so callers don't have to understand the underlying LensCore state machine.</p>
34
34
  </div></div></li></ul></section><section class="tsd-panel tsd-member"><a id="settransform" class="tsd-anchor"></a><h3 class="tsd-anchor-link"><span>set<wbr/>Transform</span><a href="#settransform" aria-label="Permalink" class="tsd-anchor-icon"><svg viewBox="0 0 24 24"><use href="../assets/icons.svg#icon-anchor"></use></svg></a></h3><ul class="tsd-signatures"><li class="tsd-signature tsd-anchor-link"><a id="settransform-1" class="tsd-anchor"></a><span class="tsd-kind-call-signature">setTransform</span><span class="tsd-signature-symbol">(</span><span class="tsd-kind-parameter">transform</span><span class="tsd-signature-symbol">:</span> <a href="Transform2D.html" class="tsd-signature-type tsd-kind-class">Transform2D</a><span class="tsd-signature-symbol">)</span><span class="tsd-signature-symbol">:</span> <a href="https://developer.mozilla.org/docs/Web/JavaScript/Reference/Global_Objects/Promise" class="tsd-signature-type external" target="_blank">Promise</a><span class="tsd-signature-symbol">&lt;</span><span class="tsd-signature-type">void</span><span class="tsd-signature-symbol">&gt;</span><a href="#settransform-1" aria-label="Permalink" class="tsd-anchor-icon"><svg viewBox="0 0 24 24"><use href="../assets/icons.svg#icon-anchor"></use></svg></a></li><li class="tsd-description"><div class="tsd-comment tsd-typography"><p>Apply a 2D transformation to the source (e.g. translation, rotation, scale).</p>
35
35
  </div><div class="tsd-parameters"><h4 class="tsd-parameters-title">Parameters</h4><ul class="tsd-parameter-list"><li><span><span class="tsd-kind-parameter">transform</span>: <a href="Transform2D.html" class="tsd-signature-type tsd-kind-class">Transform2D</a></span><div class="tsd-comment tsd-typography"><p>Specifies the 3x3 matrix describing the transformation.</p>
36
- </div><div class="tsd-comment tsd-typography"></div></li></ul></div><h4 class="tsd-returns-title">Returns <a href="https://developer.mozilla.org/docs/Web/JavaScript/Reference/Global_Objects/Promise" class="tsd-signature-type external" target="_blank">Promise</a><span class="tsd-signature-symbol">&lt;</span><span class="tsd-signature-type">void</span><span class="tsd-signature-symbol">&gt;</span></h4><div class="tsd-comment tsd-typography"></div></li></ul></section></section></details></div><div class="col-sidebar"><div class="page-menu"><div class="tsd-navigation settings"><details class="tsd-accordion"><summary class="tsd-accordion-summary"><h3><svg width="20" height="20" viewBox="0 0 24 24" fill="none"><use href="../assets/icons.svg#icon-chevronDown"></use></svg>Settings</h3></summary><div class="tsd-accordion-details"><div class="tsd-filter-visibility"><span class="settings-label">Member Visibility</span><ul id="tsd-filter-options"><li class="tsd-filter-item"><label class="tsd-filter-input"><input type="checkbox" id="tsd-filter-protected" name="protected"/><svg width="32" height="32" viewBox="0 0 32 32" aria-hidden="true"><rect class="tsd-checkbox-background" width="30" height="30" x="1" y="1" rx="6" fill="none"></rect><path class="tsd-checkbox-checkmark" d="M8.35422 16.8214L13.2143 21.75L24.6458 10.25" stroke="none" stroke-width="3.5" stroke-linejoin="round" fill="none"></path></svg><span>Protected</span></label></li><li class="tsd-filter-item"><label class="tsd-filter-input"><input type="checkbox" id="tsd-filter-inherited" name="inherited" checked/><svg width="32" height="32" viewBox="0 0 32 32" aria-hidden="true"><rect class="tsd-checkbox-background" width="30" height="30" x="1" y="1" rx="6" fill="none"></rect><path class="tsd-checkbox-checkmark" d="M8.35422 16.8214L13.2143 21.75L24.6458 10.25" stroke="none" stroke-width="3.5" stroke-linejoin="round" fill="none"></path></svg><span>Inherited</span></label></li></ul></div><div class="tsd-theme-toggle"><label class="settings-label" for="tsd-theme">Theme</label><select id="tsd-theme"><option value="os">OS</option><option value="light">Light</option><option value="dark">Dark</option></select></div></div></details></div><details open class="tsd-accordion tsd-page-navigation"><summary class="tsd-accordion-summary"><h3><svg width="20" height="20" viewBox="0 0 24 24" fill="none"><use href="../assets/icons.svg#icon-chevronDown"></use></svg>On This Page</h3></summary><div class="tsd-accordion-details"><details open class="tsd-accordion tsd-page-navigation-section"><summary class="tsd-accordion-summary" data-key="section-Constructors"><svg width="20" height="20" viewBox="0 0 24 24" fill="none"><use href="../assets/icons.svg#icon-chevronDown"></use></svg>Constructors</summary><div><a href="#constructor" class=""><svg class="tsd-kind-icon" viewBox="0 0 24 24"><use href="../assets/icons.svg#icon-512"></use></svg><span>constructor</span></a></div></details><details open class="tsd-accordion tsd-page-navigation-section"><summary class="tsd-accordion-summary" data-key="section-Methods"><svg width="20" height="20" viewBox="0 0 24 24" fill="none"><use href="../assets/icons.svg#icon-chevronDown"></use></svg>Methods</summary><div><a href="#copy" class=""><svg class="tsd-kind-icon" viewBox="0 0 24 24"><use href="../assets/icons.svg#icon-2048"></use></svg><span>copy</span></a><a href="#setrendersize" class=""><svg class="tsd-kind-icon" viewBox="0 0 24 24"><use href="../assets/icons.svg#icon-2048"></use></svg><span>set<wbr/>Render<wbr/>Size</span></a><a href="#settransform" class=""><svg class="tsd-kind-icon" viewBox="0 0 24 24"><use href="../assets/icons.svg#icon-2048"></use></svg><span>set<wbr/>Transform</span></a></div></details></div></details></div><div class="site-menu"><nav class="tsd-navigation"><a href="../modules.html">CameraKit Web SDK - v1.14.0</a><ul class="tsd-small-nested-navigation" id="tsd-nav-container"><li>Loading...</li></ul></nav></div></div></div><footer><p class="tsd-generator">Generated using <a href="https://typedoc.org/" target="_blank">TypeDoc</a></p></footer><div class="overlay"></div></body></html>
36
+ </div><div class="tsd-comment tsd-typography"></div></li></ul></div><h4 class="tsd-returns-title">Returns <a href="https://developer.mozilla.org/docs/Web/JavaScript/Reference/Global_Objects/Promise" class="tsd-signature-type external" target="_blank">Promise</a><span class="tsd-signature-symbol">&lt;</span><span class="tsd-signature-type">void</span><span class="tsd-signature-symbol">&gt;</span></h4><div class="tsd-comment tsd-typography"></div></li></ul></section></section></details></div><div class="col-sidebar"><div class="page-menu"><div class="tsd-navigation settings"><details class="tsd-accordion"><summary class="tsd-accordion-summary"><h3><svg width="20" height="20" viewBox="0 0 24 24" fill="none"><use href="../assets/icons.svg#icon-chevronDown"></use></svg>Settings</h3></summary><div class="tsd-accordion-details"><div class="tsd-filter-visibility"><span class="settings-label">Member Visibility</span><ul id="tsd-filter-options"><li class="tsd-filter-item"><label class="tsd-filter-input"><input type="checkbox" id="tsd-filter-protected" name="protected"/><svg width="32" height="32" viewBox="0 0 32 32" aria-hidden="true"><rect class="tsd-checkbox-background" width="30" height="30" x="1" y="1" rx="6" fill="none"></rect><path class="tsd-checkbox-checkmark" d="M8.35422 16.8214L13.2143 21.75L24.6458 10.25" stroke="none" stroke-width="3.5" stroke-linejoin="round" fill="none"></path></svg><span>Protected</span></label></li><li class="tsd-filter-item"><label class="tsd-filter-input"><input type="checkbox" id="tsd-filter-inherited" name="inherited" checked/><svg width="32" height="32" viewBox="0 0 32 32" aria-hidden="true"><rect class="tsd-checkbox-background" width="30" height="30" x="1" y="1" rx="6" fill="none"></rect><path class="tsd-checkbox-checkmark" d="M8.35422 16.8214L13.2143 21.75L24.6458 10.25" stroke="none" stroke-width="3.5" stroke-linejoin="round" fill="none"></path></svg><span>Inherited</span></label></li></ul></div><div class="tsd-theme-toggle"><label class="settings-label" for="tsd-theme">Theme</label><select id="tsd-theme"><option value="os">OS</option><option value="light">Light</option><option value="dark">Dark</option></select></div></div></details></div><details open class="tsd-accordion tsd-page-navigation"><summary class="tsd-accordion-summary"><h3><svg width="20" height="20" viewBox="0 0 24 24" fill="none"><use href="../assets/icons.svg#icon-chevronDown"></use></svg>On This Page</h3></summary><div class="tsd-accordion-details"><details open class="tsd-accordion tsd-page-navigation-section"><summary class="tsd-accordion-summary" data-key="section-Constructors"><svg width="20" height="20" viewBox="0 0 24 24" fill="none"><use href="../assets/icons.svg#icon-chevronDown"></use></svg>Constructors</summary><div><a href="#constructor" class=""><svg class="tsd-kind-icon" viewBox="0 0 24 24"><use href="../assets/icons.svg#icon-512"></use></svg><span>constructor</span></a></div></details><details open class="tsd-accordion tsd-page-navigation-section"><summary class="tsd-accordion-summary" data-key="section-Methods"><svg width="20" height="20" viewBox="0 0 24 24" fill="none"><use href="../assets/icons.svg#icon-chevronDown"></use></svg>Methods</summary><div><a href="#copy" class=""><svg class="tsd-kind-icon" viewBox="0 0 24 24"><use href="../assets/icons.svg#icon-2048"></use></svg><span>copy</span></a><a href="#setrendersize" class=""><svg class="tsd-kind-icon" viewBox="0 0 24 24"><use href="../assets/icons.svg#icon-2048"></use></svg><span>set<wbr/>Render<wbr/>Size</span></a><a href="#settransform" class=""><svg class="tsd-kind-icon" viewBox="0 0 24 24"><use href="../assets/icons.svg#icon-2048"></use></svg><span>set<wbr/>Transform</span></a></div></details></div></details></div><div class="site-menu"><nav class="tsd-navigation"><a href="../modules.html">CameraKit Web SDK - v1.15.0</a><ul class="tsd-small-nested-navigation" id="tsd-nav-container"><li>Loading...</li></ul></nav></div></div></div><footer><p class="tsd-generator">Generated using <a href="https://typedoc.org/" target="_blank">TypeDoc</a></p></footer><div class="overlay"></div></body></html>