@camera.ui/server 2.0.4 → 2.0.6
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.
- package/dist/interface/assets/{404-B8P9h05I.js → 404-ekmIpFW1.js} +1 -1
- package/dist/interface/assets/About-CvajU0JT.js +1 -0
- package/dist/interface/assets/Adminpanel-DrKaMQqd.js +1 -0
- package/dist/interface/assets/Automation-Dn1ZXmhy.js +2 -0
- package/dist/interface/assets/AutomationImport-U7r6BcW_.js +2 -0
- package/dist/interface/assets/{AutomationStore-qLsO1tHb.js → AutomationStore-DZBtLuIs.js} +2 -2
- package/dist/interface/assets/{AutomationStoreDetail-BAW2nfPd.js → AutomationStoreDetail-BXpOtPMl.js} +2 -2
- package/dist/interface/assets/{Automations-CUCVYZSr.js → Automations-DGHcWJ0h.js} +2 -2
- package/dist/interface/assets/Camera-CVJ-46dw.js +2 -0
- package/dist/interface/assets/Camera-Da5zEitE.css +1 -0
- package/dist/interface/assets/{CameraConsole-t6nY7h-V.js → CameraConsole-DPI9LjVK.js} +1 -1
- package/dist/interface/assets/Cameras-2kM76WUB.css +1 -0
- package/dist/interface/assets/Cameras-DsZ7VINe.js +652 -0
- package/dist/interface/assets/Camview-Lnxd3oe8.js +1 -0
- package/dist/interface/assets/Config-B1ZKVfMn.js +2 -0
- package/dist/interface/assets/ConfigActionCameraControl-BHKVJQqx.js +1 -0
- package/dist/interface/assets/{ConfigActionDelay-Rnxk--Qt.js → ConfigActionDelay-BS1vLvDQ.js} +1 -1
- package/dist/interface/assets/ConfigActionHttp-BKlRdtJr.js +1 -0
- package/dist/interface/assets/{ConfigActionImageInput-C8_H3ubM.js → ConfigActionImageInput-DveJ7oK8.js} +1 -1
- package/dist/interface/assets/{ConfigActionNotification-4VYN5Hkr.js → ConfigActionNotification-Cn3qFFiK.js} +1 -1
- package/dist/interface/assets/ConfigActionOutput-Bg6d4zFD.js +1 -0
- package/dist/interface/assets/{ConfigActionPlugin-DrPmBv9V.js → ConfigActionPlugin-u-_sCQs9.js} +1 -1
- package/dist/interface/assets/{ConfigActionSensor-CyaEZRfx.js → ConfigActionSensor-Cx1Q9VtS.js} +1 -1
- package/dist/interface/assets/{ConfigActionSnapshot-l7VvnulO.js → ConfigActionSnapshot-DN4UC9jz.js} +1 -1
- package/dist/interface/assets/{ConfigActionVariable-DIlUMHDy.js → ConfigActionVariable-Yufao52p.js} +1 -1
- package/dist/interface/assets/{ConfigConditionIfElse-0XRDQcTw.js → ConfigConditionIfElse-X9Sf0RwG.js} +1 -1
- package/dist/interface/assets/ConfigConditionSensorState-DQkz0FC6.js +1 -0
- package/dist/interface/assets/{ConfigConditionSwitch-C7pp1EZI.js → ConfigConditionSwitch-B4OICWxL.js} +1 -1
- package/dist/interface/assets/ConfigConditionTime-DRhAEuuC.js +1 -0
- package/dist/interface/assets/{ConfigTriggerDetection-CKw-fo2n.js → ConfigTriggerDetection-CzI4hgRA.js} +1 -1
- package/dist/interface/assets/{ConfigTriggerGeofence-DjBRl2tE.js → ConfigTriggerGeofence-RUlZmXAo.js} +1 -1
- package/dist/interface/assets/{ConfigTriggerManual-BpBTh3CS.js → ConfigTriggerManual-Jjh7ZhyC.js} +1 -1
- package/dist/interface/assets/{ConfigTriggerSchedule-DZG10NcA.js → ConfigTriggerSchedule-Dr6ALguI.js} +1 -1
- package/dist/interface/assets/{ConfigTriggerSensor-CpFa6nUj.js → ConfigTriggerSensor-DLxdw9Fd.js} +1 -1
- package/dist/interface/assets/{ConfigTriggerSystem-BsQElCAL.js → ConfigTriggerSystem-DYDpUWwi.js} +1 -1
- package/dist/interface/assets/{ConfigTriggerWebhook-BKPOGAs3.js → ConfigTriggerWebhook-DiW3cwjT.js} +1 -1
- package/dist/interface/assets/Console-B55HKp9M.js +1 -0
- package/dist/interface/assets/{CuiActionButton-BSy6VaJ6.js → CuiActionButton-iNuXCl7_.js} +1 -1
- package/dist/interface/assets/{CuiAvatar-8AhiddF1.js → CuiAvatar-B1PdXoLS.js} +1 -1
- package/dist/interface/assets/{CuiBBoxPlayground-BUPzZ0sI.js → CuiBBoxPlayground-BJYeyVTF.js} +1 -1
- package/dist/interface/assets/{CuiBottomSheet-BNCym-11.js → CuiBottomSheet-B57WDcr5.js} +1 -1
- package/dist/interface/assets/CuiBottomSheet-Da0yy5zi.js +1 -0
- package/dist/interface/assets/CuiCameraCard-Dix4Iyrv.js +1 -0
- package/dist/interface/assets/{CuiCameraPipCard-CUPWEo3r.js → CuiCameraPipCard-BAOlD5uq.js} +1 -1
- package/dist/interface/assets/CuiCameraRecordings-ET-hbDL9.js +1 -0
- package/dist/interface/assets/{CuiCameraShares-oA3ockIQ.js → CuiCameraShares-CMzYmZt7.js} +1 -1
- package/dist/interface/assets/CuiCameraSnapshot-BcJfNxnj.js +1 -0
- package/dist/interface/assets/CuiCameraTable-CmyHU7oP.js +2 -0
- package/dist/interface/assets/{CuiDataTable-DhnQRMXG.js → CuiDataTable-Cd1jvrN0.js} +1 -1
- package/dist/interface/assets/{CuiFloatingButton-YIEmTfno.js → CuiFloatingButton-B3_fNyCP.js} +1 -1
- package/dist/interface/assets/{CuiImage-CzYVSrkC.js → CuiImage-BupeZIam.js} +1 -1
- package/dist/interface/assets/{CuiMarkdownContent-ecpe3mHA.js → CuiMarkdownContent-B4fVlO8h.js} +1 -1
- package/dist/interface/assets/CuiMarkdownContent-CMPFzD-0.js +1 -0
- package/dist/interface/assets/{CuiMenu-CEaJl-MF.js → CuiMenu-C-rnBf9W.js} +1 -1
- package/dist/interface/assets/{CuiPluginCard-BBV_hV1R.css → CuiPluginCard-C9zsmIaC.css} +1 -1
- package/dist/interface/assets/CuiPluginCard-Cs3gCugA.js +2 -0
- package/dist/interface/assets/{CuiPluginCategoryChip-BwL2qCTM.js → CuiPluginCategoryChip-D_ICXcvd.js} +1 -1
- package/dist/interface/assets/{CuiPluginOAuthButton-BmBW2Pdf.js → CuiPluginOAuthButton-B1e0NCmA.js} +2 -2
- package/dist/interface/assets/{CuiPluginTrustBadge-KcOasEJH.js → CuiPluginTrustBadge-CuxXssET.js} +1 -1
- package/dist/interface/assets/{CuiQRCode-BUSzb3ek.js → CuiQRCode-46CN267y.js} +1 -1
- package/dist/interface/assets/{CuiRecordingsGrid-lcLty5PV.css → CuiRecordingsGrid-DRBC07wN.css} +1 -1
- package/dist/interface/assets/CuiRecordingsGrid-FObjS4y5.js +1 -0
- package/dist/interface/assets/CuiSchema-BvjMb-mO.js +1 -0
- package/dist/interface/assets/{CuiTopNavbarItem-DVwItfbG.js → CuiTopNavbarItem-CmnJEc_r.js} +1 -1
- package/dist/interface/assets/{CuiTopbarSlot-h5_1cb9v.js → CuiTopbarSlot-T_pdxsit.js} +1 -1
- package/dist/interface/assets/Faces-DHk9Jq3T.js +1 -0
- package/dist/interface/assets/FirstSteps-Bb3XOidA.js +1 -0
- package/dist/interface/assets/{Instances-BNasTbK_.js → Instances-CXPH9NdC.js} +1 -1
- package/dist/interface/assets/Logs-jN6cBnCk.js +6 -0
- package/dist/interface/assets/{Menu-DTC3IWLc.js → Menu-BhWV3vKB.js} +1 -1
- package/dist/interface/assets/{OAuthDeviceFlow-BOIY4kBt.js → OAuthDeviceFlow-XfU0jZ6x.js} +1 -1
- package/dist/interface/assets/Plugin-BF0VMRby.js +1 -0
- package/dist/interface/assets/Plugin-DbSiTjYn.css +1 -0
- package/dist/interface/assets/{PluginConsole-DwNRvKqW.js → PluginConsole-DoeboO_n.js} +1 -1
- package/dist/interface/assets/PluginDetail-C2UBJlKS.js +2 -0
- package/dist/interface/assets/{PluginSchema-DWnYqRll.js → PluginSchema-BD-rLvro.js} +1 -1
- package/dist/interface/assets/PluginSearch-CTIiYmP4.js +1 -0
- package/dist/interface/assets/PluginSearch-NnCJ7vG2.js +2 -0
- package/dist/interface/assets/Plugins-BLtk8Off.js +1 -0
- package/dist/interface/assets/Recordings-CMO0UwaS.js +1 -0
- package/dist/interface/assets/{Settings-CfiNEl95.js → Settings-BAVtA47G2.js} +1 -1
- package/dist/interface/assets/SettingsAccount-Iz4WalaS.js +1 -0
- package/dist/interface/assets/SettingsAccount-NUdKG4ow.js +1 -0
- package/dist/interface/assets/SettingsAppearance-Ck1O2w3P.js +1 -0
- package/dist/interface/assets/{SettingsAppearance-Ck4VcB-w.js → SettingsAppearance-SLzxaqjN.js} +1 -1
- package/dist/interface/assets/SettingsBackup-CPC0aLD3.js +1 -0
- package/dist/interface/assets/SettingsNotifications-DB4CcddP.js +2 -0
- package/dist/interface/assets/SettingsRecordings-C15sTnLd.js +1 -0
- package/dist/interface/assets/SettingsRemote-5nVdezk3.js +1 -0
- package/dist/interface/assets/SettingsSystem-FqKuLssS.js +2 -0
- package/dist/interface/assets/SettingsUsers-CCp_3xlV.js +1 -0
- package/dist/interface/assets/Terminal-BHvfL8kE.js +4 -0
- package/dist/interface/assets/{VariableInput-DmE1m9Il.js → VariableInput-BnNttSx9.js} +1 -1
- package/dist/interface/assets/{VariableSuggestions-eII-1Bd_.js → VariableSuggestions-BbT0U9F0.js} +1 -1
- package/dist/interface/assets/VersionsHandler-jleSwMVy.js +7 -0
- package/dist/interface/assets/{Workers-Bj_tLx-1.js → Workers-ELW90lll.js} +2 -2
- package/dist/interface/assets/{account-CMuSWY7R.js → account-DqyKcqe6.js} +1 -1
- package/dist/interface/assets/ace-6JpPWRIj.js +1 -0
- package/dist/interface/assets/{ace.config-D884GuRj.js → ace.config-BnKJ0Xjj.js} +1 -1
- package/dist/interface/assets/{alert-circle-BBVlWmUb.js → alert-circle-DeKKKwiu.js} +1 -1
- package/dist/interface/assets/{alert-outline-MJaaWeWU.js → alert-outline-C4_42ECn.js} +1 -1
- package/dist/interface/assets/{api-CltBUyci.js → api-BRin642H.js} +1 -1
- package/dist/interface/assets/api-ByvWBLH3.js +2 -0
- package/dist/interface/assets/api-dcK5urq7.css +2 -0
- package/dist/interface/assets/{arrow-left-Bzo6lbMk.js → arrow-left-DroMCfOc.js} +1 -1
- package/dist/interface/assets/{arrow-right-outline-DU6p5Mjp.js → arrow-right-outline-CvgD4nuT.js} +1 -1
- package/dist/interface/assets/auth-D5gzm869.js +1 -0
- package/dist/interface/assets/{automation-BjkFcQH9.js → automation-BjZc8WL7.js} +1 -1
- package/dist/interface/assets/{automations-73X55Wxy.js → automations-B9KDzbWq.js} +1 -1
- package/dist/interface/assets/automations-CmA6Yx5B.js +1 -0
- package/dist/interface/assets/{back-filled-DI8fXlRr.js → back-filled-LVLhJP7G.js} +1 -1
- package/dist/interface/assets/{bell-Xdsks-42.js → bell-_E2Lq4ub.js} +1 -1
- package/dist/interface/assets/{bell-outline-Cy3lRQBX.js → bell-outline-CHhIZudN.js} +1 -1
- package/dist/interface/assets/{bell-ring-DR_BFore.js → bell-ring-DgLkBDcU.js} +1 -1
- package/dist/interface/assets/{bug-BkbVdwX_.js → bug-Eq4PDwA4.js} +1 -1
- package/dist/interface/assets/{cameras-Crvf7J3t.js → cameras-CYwpMvA8.js} +1 -1
- package/dist/interface/assets/{cameras.schema-CQPF4BCK.js → cameras.schema-neefhBQz.js} +1 -1
- package/dist/interface/assets/{cctv-D8gURS6i.js → cctv-BZIDJlxZ.js} +1 -1
- package/dist/interface/assets/{cctv-izLKpHLU.js → cctv-DbFrrwEm.js} +1 -1
- package/dist/interface/assets/{check-vQdlfVb0.js → check-COWE52r_.js} +1 -1
- package/dist/interface/assets/{check-circle-pC6Mk9ok.js → check-circle-CAbOGJc_.js} +1 -1
- package/dist/interface/assets/{chevron-down-5hhpriLd.js → chevron-down-Bu7d-Y9N.js} +1 -1
- package/dist/interface/assets/{chevron-right-B8jZK42K.js → chevron-right-90_Zn7fJ.js} +1 -1
- package/dist/interface/assets/{circular-connection-CShziQTj.js → circular-connection-Fq-Vqe3X.js} +1 -1
- package/dist/interface/assets/{clock-outline-C1Qoi42Q.js → clock-outline-CqPKrGj2.js} +1 -1
- package/dist/interface/assets/{close-CunDSika.js → close-BTPBtoEq.js} +1 -1
- package/dist/interface/assets/{close-circle-ClO0DCH3.js → close-circle-BAE2M1UZ.js} +1 -1
- package/dist/interface/assets/{cloud-check-DH_MvuMa.js → cloud-check-C2zK34QI.js} +1 -1
- package/dist/interface/assets/{cloud-outline-C6S72e1A.js → cloud-outline-64fdhdhh.js} +1 -1
- package/dist/interface/assets/{cloud-outline-CNhBvx4x.js → cloud-outline-BooRVJGO.js} +1 -1
- package/dist/interface/assets/cloudHandoff-CdYAKJPM.js +1 -0
- package/dist/interface/assets/{cog-Bgvz011z.js → cog-BOiZ8Brk.js} +1 -1
- package/dist/interface/assets/{cog-outline-uZ6J7_NJ.js → cog-outline-CXjehRoX.js} +1 -1
- package/dist/interface/assets/config-BLaep_I5.js +1 -0
- package/dist/interface/assets/{copy-16-filled-I80UlDbg.js → copy-16-filled-DfOe7jyi.js} +1 -1
- package/dist/interface/assets/{copy-B4-Xsyae.js → copy-D1B4K3K8.js} +1 -1
- package/dist/interface/assets/{delete-BdZ-cqP2.js → delete-BEupTYe7.js} +1 -1
- package/dist/interface/assets/{deviceId-BJm8lmpp.js → deviceId-B7SNJduj.js} +1 -1
- package/dist/interface/assets/{dist-D7Ztbw2o.js → dist-PhgrarGW.js} +1 -1
- package/dist/interface/assets/{download-C1GMtykU.js → download-BKGJ_BFg.js} +1 -1
- package/dist/interface/assets/{download-CNVBKEUL.js → download-DLRWZxWu.js} +1 -1
- package/dist/interface/assets/esm-2cKQcsYl.js +1 -0
- package/dist/interface/assets/esm-BC-ykYHP.js +1 -0
- package/dist/interface/assets/esm-BQAccPYQ2.js +1 -0
- package/dist/interface/assets/esm-B_RAh7V8.js +1 -0
- package/dist/interface/assets/esm-BsEkUnid.js +1 -0
- package/dist/interface/assets/esm-C1u--4jU.js +1 -0
- package/dist/interface/assets/esm-Cmrq9Tli.js +1 -0
- package/dist/interface/assets/esm-CrZMuT0_.js +1 -0
- package/dist/interface/assets/esm-CxS-x_QY.js +1 -0
- package/dist/interface/assets/esm-D-xtFbBs.js +1 -0
- package/dist/interface/assets/esm-D6PR9MbI.js +1 -0
- package/dist/interface/assets/esm-DTxHX_m3.js +1 -0
- package/dist/interface/assets/esm-Dzks7cY7.js +1 -0
- package/dist/interface/assets/esm-nCaFxJ36.js +1 -0
- package/dist/interface/assets/{eventIcons-GmV5zC8O.js → eventIcons-OxuOsPp8.js} +1 -1
- package/dist/interface/assets/{face-recognition-CS2Rf6Zc.js → face-recognition-CPwwcApe.js} +1 -1
- package/dist/interface/assets/{github-BrijWwqw.js → github-CWr5rTTh.js} +1 -1
- package/dist/interface/assets/{grid-fill-vdgMWTlf.js → grid-fill-DepYpY1i.js} +1 -1
- package/dist/interface/assets/{hasPermission-LUHh3i2_.js → hasPermission-FP_aMe9r.js} +1 -1
- package/dist/interface/assets/{home-By41XQGy.js → home-DTNk2yog.js} +1 -1
- package/dist/interface/assets/{information-outline-Kgo_4wPg.js → information-outline-BaVRQ1WL.js} +1 -1
- package/dist/interface/assets/{instances-A-hAMJRC.js → instances-DWzDpyhw.js} +1 -1
- package/dist/interface/assets/{lightbulb-outline-XVFprQ8f.js → lightbulb-outline-DPjpJn5F.js} +1 -1
- package/dist/interface/assets/main-7zIUc9Mt.css +1 -0
- package/dist/interface/assets/main-eaoHjmUh.js +3 -0
- package/dist/interface/assets/{microphone-GG_JO-aa.js → microphone-DJsihw9n.js} +1 -1
- package/dist/interface/assets/{motion-sensor-BvWcG84o.js → motion-sensor-D9ErhY-p.js} +1 -1
- package/dist/interface/assets/native-BK8vZMAo.js +1 -0
- package/dist/interface/assets/native-Z2MQ5D82.js +1 -0
- package/dist/interface/assets/{nodeDefinitions-BSLOZMDt.js → nodeDefinitions-kqqBPelM.js} +1 -1
- package/dist/interface/assets/{notifications-eX5p2YaS.js → notifications-Dae9EImK.js} +1 -1
- package/dist/interface/assets/{play-solid-BtIose8X.js → play-solid-cginGSgT.js} +1 -1
- package/dist/interface/assets/plugin-DHenq6mQ.js +1 -0
- package/dist/interface/assets/{plugins-DfuM5k5Q.js → plugins-bWz9yaCS.js} +1 -1
- package/dist/interface/assets/{plus-CPMfvO5i.js → plus-CJ2GnX_q.js} +1 -1
- package/dist/interface/assets/{plus-BKTSMYeY.js → plus-CJzoaVfR.js} +1 -1
- package/dist/interface/assets/{power-M2I2_fCM.js → power-CH_DVgfm.js} +1 -1
- package/dist/interface/assets/{puzzle-filled-C2Lcmza4.js → puzzle-filled-BsJvAZrD.js} +1 -1
- package/dist/interface/assets/{refresh-rounded-B-PvjcAK.js → refresh-rounded-D9PcUR6I.js} +1 -1
- package/dist/interface/assets/{ring-resize-CdUkE4zr.js → ring-resize-QxO72Hs5.js} +1 -1
- package/dist/interface/assets/{round-alt-arrow-left-bold-MIf6gSgD.js → round-alt-arrow-left-bold-C57m543l.js} +1 -1
- package/dist/interface/assets/{round-restart-alt-rDMgoX7-.js → round-restart-alt-C6zOLIvt.js} +1 -1
- package/dist/interface/assets/router-jxQ55Ssp.js +2 -0
- package/dist/interface/assets/{routerState-DxipV4mY.js → routerState-D1WXHNt5.js} +1 -1
- package/dist/interface/assets/{search-CHjonsLq.js → search-BgYt2zqA.js} +1 -1
- package/dist/interface/assets/{server-CoQ6jFok.js → server-Uk7xnHXH.js} +1 -1
- package/dist/interface/assets/{settings-CJjCbQsx.js → settings-DHy64jsU.js} +1 -1
- package/dist/interface/assets/shares-Cz4zuZa_.js +1 -0
- package/dist/interface/assets/{shield-check-oKTXgAfr.js → shield-check-0hUJRszq.js} +1 -1
- package/dist/interface/assets/{source-branch-aFYjLKkc.js → source-branch-Dv9Du0bc.js} +1 -1
- package/dist/interface/assets/{terminal-B8qmxarl.js → terminal-CNEjR0aR.js} +1 -1
- package/dist/interface/assets/{theme-BzXEv5Er.js → theme-GXDCnY_7.js} +1 -1
- package/dist/interface/assets/{trash-2-rEVmOxCl.js → trash-2-CAa4rD_d.js} +1 -1
- package/dist/interface/assets/{trash-fill-DfnCMe3h.js → trash-fill-Br00Vept.js} +1 -1
- package/dist/interface/assets/{trash2-BvyW-bOK.js → trash2-tuK9V5bO.js} +1 -1
- package/dist/interface/assets/{types-Ds4g4ynm.js → types-BpBkaZ8S.js} +1 -1
- package/dist/interface/assets/{types-CAW47AJe.js → types-jpiqSoyF.js} +1 -1
- package/dist/interface/assets/{ui-Dg-QtLMl.js → ui-DzCa9zWL.js} +1 -1
- package/dist/interface/assets/{upload-DkFN5YK-.js → upload-DAasFa9r.js} +1 -1
- package/dist/interface/assets/useAppVersion-CqnE2uYa.js +1 -0
- package/dist/interface/assets/useBackupRestore-Dm7jUOC-.js +1 -0
- package/dist/interface/assets/{useBiometricCredentials-Buylkybs.js → useBiometricCredentials-DJqfT1lk.js} +1 -1
- package/dist/interface/assets/useCameraOptions-Dv3QCMBK.js +1 -0
- package/dist/interface/assets/{useCuiCameraDrawer-DwlhaZ2i.js → useCuiCameraDrawer-D1zCpVbQ.js} +1 -1
- package/dist/interface/assets/useCuiDialog-C02Or5oR.js +2 -0
- package/dist/interface/assets/{useFileDownload-Bhdbhy_2.js → useFileDownload-CwxydJkw.js} +1 -1
- package/dist/interface/assets/{useLogsSocket-81hTPkwS.js → useLogsSocket-CunaH_T7.js} +2 -2
- package/dist/interface/assets/{useServerRestart-3pT0h7CH.js → useServerRestart-BQO5FbNN.js} +1 -1
- package/dist/interface/assets/{useSharedComposables-Ki01kFNJ.js → useSharedComposables-BrdI_nDH.js} +1 -1
- package/dist/interface/assets/{useStreamStatus-CHITNYE7.js → useStreamStatus-e7l-QLmI.js} +1 -1
- package/dist/interface/assets/useUpdateChannel-CW45dNAk.js +1 -0
- package/dist/interface/assets/useUserOptions-EhjyVt4P.js +1 -0
- package/dist/interface/assets/users.schema-4d5Hcv-l.js +1 -0
- package/dist/interface/assets/vendor-ClrOISZp.js +22 -0
- package/dist/interface/assets/{vendor-ace-DdrK3_G3.js → vendor-ace-BlP3GAWI.js} +4 -4
- package/dist/interface/assets/vendor-cameraui-E9E7fP4y.js +1978 -0
- package/dist/interface/assets/{vendor-capacitor-Cmm68VPg.js → vendor-capacitor-DWVJM4o8.js} +2 -2
- package/dist/interface/assets/vendor-chart-Cn72DQnu.js +3 -0
- package/dist/interface/assets/{vendor-core-DnC_SdtD.js → vendor-core-D2PMTaN3.js} +1 -1
- package/dist/interface/assets/{vendor-dnd-BAVhbK8Q.js → vendor-dnd-B9-e5xxH.js} +1 -1
- package/dist/interface/assets/{vendor-draggabilly-C56V4WL_.js → vendor-draggabilly-CPB8E5_r.js} +1 -1
- package/dist/interface/assets/{vendor-leaflet-_2Z0GiOD.js → vendor-leaflet-BMMJO5Nd.js} +1 -1
- package/dist/interface/assets/{vendor-markdown-D8dkSMBf.js → vendor-markdown-D7EhExwE.js} +2 -2
- package/dist/interface/assets/{vendor-primevue-OV61z06m.js → vendor-primevue-Ba4XR6PC.js} +301 -301
- package/dist/interface/assets/vendor-vueflow-Ci6VMxDa.js +26 -0
- package/dist/interface/assets/vendor-xterm-IIYDrBG1.js +142 -0
- package/dist/interface/assets/view-grid-Bs5Mc3pI.js +1 -0
- package/dist/interface/assets/view-grid-CWZLWCco.css +1 -0
- package/dist/interface/assets/web-1H50tiqZ.js +1 -0
- package/dist/interface/assets/web-BBRAFu75.js +1 -0
- package/dist/interface/assets/web-BQqZ-0se.js +1 -0
- package/dist/interface/assets/web-BgDADYuL.js +1 -0
- package/dist/interface/assets/web-BjKL51lK-DF7_OzmH.js +1 -0
- package/dist/interface/assets/web-C3oASmFS.js +1 -0
- package/dist/interface/assets/web-CQIOnZbD.js +1 -0
- package/dist/interface/assets/web-CW6kIZQg.js +1 -0
- package/dist/interface/assets/web-CXLWILCn.js +1 -0
- package/dist/interface/assets/web-Cz9RS9vK.js +1 -0
- package/dist/interface/assets/web-D7_BjGke.js +1 -0
- package/dist/interface/assets/web-Dn-uR4FN.js +1 -0
- package/dist/interface/assets/web-GsFXaCFL.js +1 -0
- package/dist/interface/assets/web-kh2rHftO.js +1 -0
- package/dist/interface/assets/{webhook-nx5ZDIQ-.js → webhook-BCBlzc3z.js} +1 -1
- package/dist/interface/assets/workbox-window.prod.es5-CQTy-jf8.js +1 -0
- package/dist/interface/assets/{zoom-in-wM6G8w-4.js → zoom-in-CKM5nWQX.js} +1 -1
- package/dist/interface/index.html +88 -85
- package/dist/interface/sw.js +1 -1
- package/dist/server/package.json +36 -19
- package/dist/server/requirements.txt +4 -3
- package/dist/server/src/_camera_ui_tools/camera_ui_common/common_utils/signal_handler.py +17 -9
- package/dist/server/src/_camera_ui_tools/camera_ui_sdk/camera/detection.py +10 -0
- package/dist/server/src/_camera_ui_tools/camera_ui_sdk/internal/event_emitter.py +45 -0
- package/dist/server/src/_camera_ui_tools/camera_ui_sdk/manager/__init__.py +3 -0
- package/dist/server/src/_camera_ui_tools/camera_ui_sdk/storage/__init__.py +47 -12
- package/dist/server/src/api/controllers/plugins.controller.js +11 -3
- package/dist/server/src/api/controllers/plugins.controller.js.map +1 -1
- package/dist/server/src/api/controllers/remote.controller.d.ts +1 -0
- package/dist/server/src/api/controllers/remote.controller.js +9 -2
- package/dist/server/src/api/controllers/remote.controller.js.map +1 -1
- package/dist/server/src/api/database/index.d.ts +2 -1
- package/dist/server/src/api/database/index.js +22 -3
- package/dist/server/src/api/database/index.js.map +1 -1
- package/dist/server/src/api/middlewares/authValidation.middleware.js +1 -1
- package/dist/server/src/api/middlewares/authValidation.middleware.js.map +1 -1
- package/dist/server/src/api/schemas/cameras.schema.d.ts +27 -0
- package/dist/server/src/api/schemas/cameras.schema.js +6 -0
- package/dist/server/src/api/schemas/cameras.schema.js.map +1 -1
- package/dist/server/src/api/schemas/config.schema.d.ts +2 -0
- package/dist/server/src/api/schemas/config.schema.js +1 -0
- package/dist/server/src/api/schemas/config.schema.js.map +1 -1
- package/dist/server/src/api/services/backup.service.d.ts +4 -0
- package/dist/server/src/api/services/backup.service.js +35 -4
- package/dist/server/src/api/services/backup.service.js.map +1 -1
- package/dist/server/src/api/services/plugins.service.js +1 -1
- package/dist/server/src/api/services/plugins.service.js.map +1 -1
- package/dist/server/src/api/services/remote.service.d.ts +0 -1
- package/dist/server/src/api/services/remote.service.js +6 -13
- package/dist/server/src/api/services/remote.service.js.map +1 -1
- package/dist/server/src/api/types/index.d.ts +1 -0
- package/dist/server/src/api.d.ts +1 -0
- package/dist/server/src/api.js +11 -3
- package/dist/server/src/api.js.map +1 -1
- package/dist/server/src/camera/decoder/audio-source.d.ts +2 -0
- package/dist/server/src/camera/decoder/audio-source.js +12 -0
- package/dist/server/src/camera/decoder/audio-source.js.map +1 -1
- package/dist/server/src/camera/decoder/detection-coordinator.js +16 -2
- package/dist/server/src/camera/decoder/detection-coordinator.js.map +1 -1
- package/dist/server/src/camera/decoder/frame-source.d.ts +2 -0
- package/dist/server/src/camera/decoder/frame-source.js +23 -2
- package/dist/server/src/camera/decoder/frame-source.js.map +1 -1
- package/dist/server/src/camera/decoder/ptz-autotracker.js +51 -78
- package/dist/server/src/camera/decoder/ptz-autotracker.js.map +1 -1
- package/dist/server/src/camera/streaming/fmp4-session.js +9 -0
- package/dist/server/src/camera/streaming/fmp4-session.js.map +1 -1
- package/dist/server/src/camera/streaming/rtp-session.js +0 -13
- package/dist/server/src/camera/streaming/rtp-session.js.map +1 -1
- package/dist/server/src/go2rtc/api/routes/streams.js +5 -6
- package/dist/server/src/go2rtc/api/routes/streams.js.map +1 -1
- package/dist/server/src/go2rtc/index.js +1 -1
- package/dist/server/src/go2rtc/index.js.map +1 -1
- package/dist/server/src/go2rtc/types.d.ts +3 -0
- package/dist/server/src/go2rtc/types.js.map +1 -1
- package/dist/server/src/main.js +1 -1
- package/dist/server/src/main.js.map +1 -1
- package/dist/server/src/manager/deviceManager.js +4 -1
- package/dist/server/src/manager/deviceManager.js.map +1 -1
- package/dist/server/src/manager/discoveryManager.d.ts +3 -2
- package/dist/server/src/manager/discoveryManager.js +60 -29
- package/dist/server/src/manager/discoveryManager.js.map +1 -1
- package/dist/server/src/plugins/config-store.d.ts +1 -1
- package/dist/server/src/plugins/config-store.js +17 -10
- package/dist/server/src/plugins/config-store.js.map +1 -1
- package/dist/server/src/plugins/index.d.ts +1 -0
- package/dist/server/src/plugins/index.js +38 -2
- package/dist/server/src/plugins/index.js.map +1 -1
- package/dist/server/src/plugins/plugin.js +2 -2
- package/dist/server/src/plugins/plugin.js.map +1 -1
- package/dist/server/src/plugins/runtime/base.js +10 -5
- package/dist/server/src/plugins/runtime/base.js.map +1 -1
- package/dist/server/src/plugins/runtime/go/index.js +1 -0
- package/dist/server/src/plugins/runtime/go/index.js.map +1 -1
- package/dist/server/src/plugins/runtime/node/child.d.ts +1 -0
- package/dist/server/src/plugins/runtime/node/child.js +62 -19
- package/dist/server/src/plugins/runtime/node/child.js.map +1 -1
- package/dist/server/src/plugins/runtime/node/configDb.d.ts +8 -0
- package/dist/server/src/plugins/runtime/node/configDb.js +15 -0
- package/dist/server/src/plugins/runtime/node/configDb.js.map +1 -1
- package/dist/server/src/plugins/runtime/node/index.js +2 -0
- package/dist/server/src/plugins/runtime/node/index.js.map +1 -1
- package/dist/server/src/plugins/runtime/node/pluginApi.d.ts +4 -0
- package/dist/server/src/plugins/runtime/node/pluginApi.js +13 -5
- package/dist/server/src/plugins/runtime/node/pluginApi.js.map +1 -1
- package/dist/server/src/plugins/runtime/node/proxy/cameraDevice.d.ts +1 -2
- package/dist/server/src/plugins/runtime/node/proxy/cameraDevice.js +2 -8
- package/dist/server/src/plugins/runtime/node/proxy/cameraDevice.js.map +1 -1
- package/dist/server/src/plugins/runtime/node/proxy/coreManager.d.ts +3 -2
- package/dist/server/src/plugins/runtime/node/proxy/coreManager.js +9 -13
- package/dist/server/src/plugins/runtime/node/proxy/coreManager.js.map +1 -1
- package/dist/server/src/plugins/runtime/node/proxy/deviceManager.d.ts +3 -2
- package/dist/server/src/plugins/runtime/node/proxy/deviceManager.js +14 -12
- package/dist/server/src/plugins/runtime/node/proxy/deviceManager.js.map +1 -1
- package/dist/server/src/plugins/runtime/node/proxy/fileServe.js +4 -9
- package/dist/server/src/plugins/runtime/node/proxy/fileServe.js.map +1 -1
- package/dist/server/src/plugins/runtime/node/proxy/notificationManager.js +3 -0
- package/dist/server/src/plugins/runtime/node/proxy/notificationManager.js.map +1 -1
- package/dist/server/src/plugins/runtime/node/storage.d.ts +5 -2
- package/dist/server/src/plugins/runtime/node/storage.js +92 -67
- package/dist/server/src/plugins/runtime/node/storage.js.map +1 -1
- package/dist/server/src/plugins/runtime/node/storageController.d.ts +2 -0
- package/dist/server/src/plugins/runtime/node/storageController.js +12 -4
- package/dist/server/src/plugins/runtime/node/storageController.js.map +1 -1
- package/dist/server/src/plugins/runtime/python/child.py +50 -38
- package/dist/server/src/plugins/runtime/python/config_db.py +28 -17
- package/dist/server/src/plugins/runtime/python/index.js +1 -0
- package/dist/server/src/plugins/runtime/python/index.js.map +1 -1
- package/dist/server/src/plugins/runtime/python/plugin_api.py +5 -5
- package/dist/server/src/plugins/runtime/python/proxy/camera_device.py +14 -13
- package/dist/server/src/plugins/runtime/python/proxy/core_manager.py +11 -14
- package/dist/server/src/plugins/runtime/python/proxy/device_manager.py +23 -18
- package/dist/server/src/plugins/runtime/python/remote_urls.py +3 -7
- package/dist/server/src/plugins/runtime/python/storage.py +157 -126
- package/dist/server/src/plugins/runtime/python/storage_controller.py +28 -13
- package/dist/server/src/plugins/runtime/python/store.py +513 -0
- package/dist/server/src/plugins/runtime/python/store_migrate.py +59 -0
- package/dist/server/src/plugins/store/coalescingWriter.d.ts +7 -0
- package/dist/server/src/plugins/store/coalescingWriter.js +52 -0
- package/dist/server/src/plugins/store/coalescingWriter.js.map +1 -0
- package/dist/server/src/plugins/store/envelope.d.ts +5 -0
- package/dist/server/src/plugins/store/envelope.js +40 -0
- package/dist/server/src/plugins/store/envelope.js.map +1 -0
- package/dist/server/src/plugins/store/layout.d.ts +2 -0
- package/dist/server/src/plugins/store/layout.js +60 -0
- package/dist/server/src/plugins/store/layout.js.map +1 -0
- package/dist/server/src/plugins/store/location.d.ts +14 -0
- package/dist/server/src/plugins/store/location.js +55 -0
- package/dist/server/src/plugins/store/location.js.map +1 -0
- package/dist/server/src/plugins/store/migrate.d.ts +1 -0
- package/dist/server/src/plugins/store/migrate.js +22 -0
- package/dist/server/src/plugins/store/migrate.js.map +1 -0
- package/dist/server/src/plugins/store/pluginStoreFile.d.ts +14 -0
- package/dist/server/src/plugins/store/pluginStoreFile.js +58 -0
- package/dist/server/src/plugins/store/pluginStoreFile.js.map +1 -0
- package/dist/server/src/plugins/store/storeFile.d.ts +5 -0
- package/dist/server/src/plugins/store/storeFile.js +112 -0
- package/dist/server/src/plugins/store/storeFile.js.map +1 -0
- package/dist/server/src/plugins/store/validate.d.ts +1 -0
- package/dist/server/src/plugins/store/validate.js +49 -0
- package/dist/server/src/plugins/store/validate.js.map +1 -0
- package/dist/server/src/plugins/worker.js +9 -8
- package/dist/server/src/plugins/worker.js.map +1 -1
- package/dist/server/src/remote/services/cloudflare-managed.js +2 -2
- package/dist/server/src/remote/services/cloudflare-managed.js.map +1 -1
- package/dist/server/src/remote/services/cloudflare.js +1 -0
- package/dist/server/src/remote/services/cloudflare.js.map +1 -1
- package/dist/server/src/remote/tunnel/client.js +1 -1
- package/dist/server/src/remote/tunnel/client.js.map +1 -1
- package/dist/server/src/rpc/interfaces/discovery.d.ts +1 -0
- package/dist/server/src/rpc/server.js +12 -5
- package/dist/server/src/rpc/server.js.map +1 -1
- package/dist/server/src/services/config/defaults.js +1 -0
- package/dist/server/src/services/config/defaults.js.map +1 -1
- package/dist/server/src/services/config/index.d.ts +1 -0
- package/dist/server/src/services/config/index.js +2 -0
- package/dist/server/src/services/config/index.js.map +1 -1
- package/dist/server/src/services/config/types.d.ts +1 -0
- package/dist/server/src/utils/npm/index.d.ts +1 -1
- package/dist/server/src/utils/npm/index.js +7 -4
- package/dist/server/src/utils/npm/index.js.map +1 -1
- package/dist/server/src/workers/capabilities/plugin-host.js +1 -1
- package/dist/server/src/workers/capabilities/plugin-host.js.map +1 -1
- package/package.json +36 -19
- package/dist/interface/assets/About-CjQs3rZw.js +0 -1
- package/dist/interface/assets/Adminpanel-BTIcUxWm.js +0 -1
- package/dist/interface/assets/Automation-BNbTehB5.js +0 -2
- package/dist/interface/assets/AutomationImport-BEm0hc0d.js +0 -2
- package/dist/interface/assets/Camera-BG8K5bH_.css +0 -1
- package/dist/interface/assets/Camera-eIsFEdVo.js +0 -2
- package/dist/interface/assets/Cameras-54LaZPN3.css +0 -1
- package/dist/interface/assets/Cameras-Bswv6ojJ.js +0 -652
- package/dist/interface/assets/Camview-DMywoy_4.js +0 -1
- package/dist/interface/assets/Config-C7H5amm4.js +0 -2
- package/dist/interface/assets/ConfigActionCameraControl-C0hvC4QW.js +0 -1
- package/dist/interface/assets/ConfigActionHttp-BF8vrrHR.js +0 -1
- package/dist/interface/assets/ConfigActionOutput-CxB3eLLl.js +0 -1
- package/dist/interface/assets/ConfigConditionSensorState-BvygRJ79.js +0 -1
- package/dist/interface/assets/ConfigConditionTime-B0zctDc4.js +0 -1
- package/dist/interface/assets/Console-DHlNpv-R.js +0 -1
- package/dist/interface/assets/CuiBottomSheet-ChG_av5z.js +0 -1
- package/dist/interface/assets/CuiCameraCard-BGAQxNHs.js +0 -1
- package/dist/interface/assets/CuiCameraRecordings-B25441dH.js +0 -1
- package/dist/interface/assets/CuiCameraSnapshot-BLM8v7rY.js +0 -1
- package/dist/interface/assets/CuiCameraTable-3joRnfiM.js +0 -2
- package/dist/interface/assets/CuiMarkdownContent-5LJK4h8V.js +0 -1
- package/dist/interface/assets/CuiPluginCard-De_cbBBe.js +0 -2
- package/dist/interface/assets/CuiRecordingsGrid-DHSABYJb.js +0 -1
- package/dist/interface/assets/CuiSchema-D35n-DE5.js +0 -1
- package/dist/interface/assets/Faces-BJlHL3gp.js +0 -1
- package/dist/interface/assets/FirstSteps-D1Zf1CYN.js +0 -1
- package/dist/interface/assets/Logs-CW5EqpAL.js +0 -6
- package/dist/interface/assets/Plugin-DHhrlRqP.css +0 -1
- package/dist/interface/assets/Plugin-DIPGTrNi.js +0 -1
- package/dist/interface/assets/PluginDetail-D1TJZJhY.js +0 -2
- package/dist/interface/assets/PluginSearch-C5bkQgYA.js +0 -1
- package/dist/interface/assets/PluginSearch-DqwgO886.js +0 -2
- package/dist/interface/assets/Plugins-o7IfSFjd.js +0 -1
- package/dist/interface/assets/Recordings-DTw5IG8W.js +0 -1
- package/dist/interface/assets/SettingsAccount-Ch2SR80X.js +0 -1
- package/dist/interface/assets/SettingsAccount-DIwWUyp6.js +0 -1
- package/dist/interface/assets/SettingsAppearance-CkF7biyP.js +0 -1
- package/dist/interface/assets/SettingsBackup-BigThNuk.js +0 -1
- package/dist/interface/assets/SettingsNotifications-XLBjwgwX.js +0 -2
- package/dist/interface/assets/SettingsRecordings-Dp9tJdHk.js +0 -1
- package/dist/interface/assets/SettingsRemote-B5jm7MdB.js +0 -1
- package/dist/interface/assets/SettingsSystem-Isy5hiDl.js +0 -2
- package/dist/interface/assets/SettingsUsers-QuUercEC.js +0 -1
- package/dist/interface/assets/Terminal-BTfYdYuv.js +0 -4
- package/dist/interface/assets/VersionsHandler-BYj7-lpw.js +0 -7
- package/dist/interface/assets/ace-DQ1lNH50.js +0 -1
- package/dist/interface/assets/api-D7tGlI-z.css +0 -2
- package/dist/interface/assets/api-DoPgGqHU.js +0 -2
- package/dist/interface/assets/auth-BiWutL3Z.js +0 -1
- package/dist/interface/assets/automations-hsi5MCtT.js +0 -1
- package/dist/interface/assets/backup-CHJIDGvl.js +0 -1
- package/dist/interface/assets/cloudHandoff-lLBGqrXl.js +0 -1
- package/dist/interface/assets/esm-0fUwrSGA2.js +0 -1
- package/dist/interface/assets/esm-50afX45o.js +0 -1
- package/dist/interface/assets/esm-B0VLR4af.js +0 -1
- package/dist/interface/assets/esm-BfZLgtrg.js +0 -1
- package/dist/interface/assets/esm-Bnmu7wlp.js +0 -1
- package/dist/interface/assets/esm-CG1dvQ4U.js +0 -1
- package/dist/interface/assets/esm-CZTaj2CB.js +0 -1
- package/dist/interface/assets/esm-CxRM74Bx.js +0 -1
- package/dist/interface/assets/esm-DBpRougC.js +0 -1
- package/dist/interface/assets/esm-DQ7OYRdT.js +0 -1
- package/dist/interface/assets/esm-DVYEXBOA.js +0 -1
- package/dist/interface/assets/esm-DdCbmz73.js +0 -1
- package/dist/interface/assets/esm-DiryHoSP.js +0 -1
- package/dist/interface/assets/esm-DyoMjqMI.js +0 -1
- package/dist/interface/assets/main-BjuXWRyJ.css +0 -1
- package/dist/interface/assets/main-DEbfQmxF.js +0 -3
- package/dist/interface/assets/native-Dg-M0-9s.js +0 -1
- package/dist/interface/assets/native-DyQXBqB9.js +0 -1
- package/dist/interface/assets/plugin-_eNpRpqe.js +0 -1
- package/dist/interface/assets/router-D1e_o7wa.js +0 -2
- package/dist/interface/assets/shares-VWzmq1V-.js +0 -1
- package/dist/interface/assets/useCameraOptions-GAeXCTvO.js +0 -1
- package/dist/interface/assets/useCuiDialog-yRn5B1oO.js +0 -2
- package/dist/interface/assets/useUserOptions-CUvE4OL9.js +0 -1
- package/dist/interface/assets/users.schema-DWL8-tZN.js +0 -1
- package/dist/interface/assets/vendor-c9Zhw4pk.js +0 -22
- package/dist/interface/assets/vendor-cameraui-DhctzD3V.js +0 -1978
- package/dist/interface/assets/vendor-chart-BjXPY6za.js +0 -3
- package/dist/interface/assets/vendor-vueflow-CJdb-8KZ.js +0 -26
- package/dist/interface/assets/vendor-xterm-BRN-hOYD.js +0 -145
- package/dist/interface/assets/view-grid-D04t817d.css +0 -1
- package/dist/interface/assets/view-grid-_whxsqcn.js +0 -1
- package/dist/interface/assets/web-B9o4PkxX.js +0 -1
- package/dist/interface/assets/web-BDuGOqy7.js +0 -1
- package/dist/interface/assets/web-BUVPtx3X.js +0 -1
- package/dist/interface/assets/web-B_hO9nzV.js +0 -1
- package/dist/interface/assets/web-BjKL51lK-CV2GxIDK.js +0 -1
- package/dist/interface/assets/web-CCgyqWSl.js +0 -1
- package/dist/interface/assets/web-Cm_fnqV2.js +0 -1
- package/dist/interface/assets/web-CsSSdPVW.js +0 -1
- package/dist/interface/assets/web-D2AMa4qD.js +0 -1
- package/dist/interface/assets/web-D2vwufvW.js +0 -1
- package/dist/interface/assets/web-D86U7zR6.js +0 -1
- package/dist/interface/assets/web-DilWncpX.js +0 -1
- package/dist/interface/assets/web-OjqOEI0k.js +0 -1
- package/dist/interface/assets/web-mrIKbnbx.js +0 -1
- package/dist/interface/assets/workbox-window.prod.es5-CsKLpYYC.js +0 -1
- /package/dist/interface/assets/{error-256-DLKVOU2S.png → logo-512-DLKVOU2S.png} +0 -0
|
@@ -1,26 +1,16 @@
|
|
|
1
|
+
from __future__ import annotations
|
|
2
|
+
|
|
1
3
|
import asyncio
|
|
2
4
|
import inspect
|
|
3
|
-
from collections.abc import Awaitable, Callable
|
|
4
|
-
from contextlib import suppress
|
|
5
5
|
from copy import deepcopy
|
|
6
|
-
from typing import Any,
|
|
6
|
+
from typing import TYPE_CHECKING, Any, ClassVar, cast
|
|
7
7
|
|
|
8
8
|
from deepdiff.diff import DeepDiff
|
|
9
|
-
from plugins.runtime.python.config_db import PluginConfigDb
|
|
10
9
|
|
|
11
10
|
from _camera_ui_tools.camera_ui_common import ObjectPath, merge, merge_with
|
|
12
|
-
from _camera_ui_tools.camera_ui_rpc import
|
|
13
|
-
from _camera_ui_tools.camera_ui_sdk import (
|
|
14
|
-
API_EVENT,
|
|
15
|
-
FormSubmitResponse,
|
|
16
|
-
JsonSchema,
|
|
17
|
-
PluginAPI,
|
|
18
|
-
SchemaConfig,
|
|
19
|
-
)
|
|
11
|
+
from _camera_ui_tools.camera_ui_rpc import RPCMethod
|
|
20
12
|
from _camera_ui_tools.camera_ui_sdk import DeviceStorage as DeviceStorageInterface
|
|
21
|
-
from plugins.runtime.python.namespaces import
|
|
22
|
-
NamespaceManager,
|
|
23
|
-
)
|
|
13
|
+
from plugins.runtime.python.namespaces import NamespaceManager
|
|
24
14
|
from plugins.runtime.python.schema import (
|
|
25
15
|
generate_config_from_schemas,
|
|
26
16
|
get_value_by_key,
|
|
@@ -28,13 +18,28 @@ from plugins.runtime.python.schema import (
|
|
|
28
18
|
is_submit_type,
|
|
29
19
|
remove_callbacks_from_schemas,
|
|
30
20
|
)
|
|
31
|
-
from plugins.runtime.python.
|
|
21
|
+
from plugins.runtime.python.store import (
|
|
22
|
+
PluginLocation,
|
|
23
|
+
SensorLocation,
|
|
24
|
+
delete_location,
|
|
25
|
+
read_location,
|
|
26
|
+
validate_store_value,
|
|
27
|
+
write_location,
|
|
28
|
+
)
|
|
32
29
|
|
|
33
|
-
|
|
30
|
+
if TYPE_CHECKING:
|
|
31
|
+
from _camera_ui_tools.camera_ui_rpc import CloseHandler, RPCClient
|
|
32
|
+
from _camera_ui_tools.camera_ui_sdk import (
|
|
33
|
+
FormSubmitResponse,
|
|
34
|
+
JsonSchema,
|
|
35
|
+
PluginAPI,
|
|
36
|
+
SchemaConfig,
|
|
37
|
+
)
|
|
38
|
+
from plugins.runtime.python.config_db import PluginConfigDb
|
|
39
|
+
from plugins.runtime.python.store import StoreLocation
|
|
40
|
+
from plugins.runtime.python.typings import PluginInfo
|
|
34
41
|
|
|
35
|
-
|
|
36
|
-
OnGetCallback = Callable[[], Awaitable[Any] | Any]
|
|
37
|
-
OnClickCallback = Callable[[Any], Awaitable[FormSubmitResponse | None] | FormSubmitResponse | None]
|
|
42
|
+
ConfigDict = dict[str, Any]
|
|
38
43
|
|
|
39
44
|
|
|
40
45
|
def merge2(
|
|
@@ -53,17 +58,19 @@ def merge2(
|
|
|
53
58
|
|
|
54
59
|
|
|
55
60
|
class DeviceStorage(DeviceStorageInterface):
|
|
61
|
+
# Strong refs to detached onSet tasks: the event loop only holds weak
|
|
62
|
+
# references, so an unreferenced task could be garbage-collected mid-flight.
|
|
63
|
+
__detached_tasks: ClassVar[set[asyncio.Task[None]]] = set()
|
|
64
|
+
|
|
56
65
|
def __init__(
|
|
57
66
|
self,
|
|
58
67
|
api: PluginAPI,
|
|
59
68
|
proxy: RPCClient,
|
|
60
69
|
plugin: PluginInfo,
|
|
61
70
|
plugin_db: PluginConfigDb,
|
|
62
|
-
|
|
71
|
+
location: StoreLocation,
|
|
63
72
|
schemas: list[JsonSchema] | None = [],
|
|
64
|
-
is_plugin_storage: bool = False,
|
|
65
73
|
sensor_id: str | None = None,
|
|
66
|
-
camera_id: str | None = None,
|
|
67
74
|
) -> None:
|
|
68
75
|
if schemas is None:
|
|
69
76
|
schemas = []
|
|
@@ -75,32 +82,31 @@ class DeviceStorage(DeviceStorageInterface):
|
|
|
75
82
|
self.__proxy = proxy
|
|
76
83
|
self.__plugin = plugin
|
|
77
84
|
self.__plugin_db = plugin_db
|
|
78
|
-
self.
|
|
79
|
-
self.__is_plugin_storage = is_plugin_storage
|
|
85
|
+
self.__location = location
|
|
80
86
|
self.__sensor_id = sensor_id
|
|
81
|
-
self.__camera_id = camera_id
|
|
82
87
|
self.__close_proxy: CloseHandler | None = None
|
|
88
|
+
self.__dirty = False
|
|
83
89
|
|
|
84
|
-
if
|
|
90
|
+
if isinstance(location, SensorLocation):
|
|
91
|
+
if not self.__sensor_id:
|
|
92
|
+
raise ValueError(f"sensor storage for {plugin['id']} requires a sensor_id")
|
|
85
93
|
sensor_ns = NamespaceManager.plugin_sensor_namespaces(
|
|
86
|
-
plugin["id"],
|
|
94
|
+
plugin["id"], location.camera_id, self.__sensor_id
|
|
87
95
|
)
|
|
88
96
|
self.__storage_namespace = sensor_ns.sensor_storage_rpc
|
|
89
|
-
elif
|
|
97
|
+
elif isinstance(location, PluginLocation):
|
|
90
98
|
plugin_ns = NamespaceManager.plugin_namespaces(plugin["id"])
|
|
91
99
|
self.__storage_namespace = plugin_ns.plugin_storage_rpc
|
|
92
100
|
else:
|
|
93
|
-
camera_ns = NamespaceManager.plugin_camera_namespaces(plugin["id"],
|
|
101
|
+
camera_ns = NamespaceManager.plugin_camera_namespaces(plugin["id"], location.camera_id)
|
|
94
102
|
self.__storage_namespace = camera_ns.camera_storage_rpc
|
|
95
103
|
|
|
96
|
-
self.__api.once(API_EVENT.SHUTDOWN, self.__close)
|
|
97
|
-
|
|
98
104
|
@RPCMethod
|
|
99
105
|
async def getValue(self, key: str, default_value: Any | None = None) -> Any:
|
|
100
106
|
schema: Any = next((schema for schema in self.schemas if schema["key"] == key), None)
|
|
101
107
|
config_value = ObjectPath.get(self.values, key)
|
|
102
108
|
schema_default_value = (
|
|
103
|
-
schema["defaultValue"] if "defaultValue" in schema and schema["defaultValue"] else None
|
|
109
|
+
schema["defaultValue"] if schema and "defaultValue" in schema and schema["defaultValue"] else None
|
|
104
110
|
)
|
|
105
111
|
|
|
106
112
|
if schema:
|
|
@@ -132,23 +138,24 @@ class DeviceStorage(DeviceStorageInterface):
|
|
|
132
138
|
schema: Any = next((schema for schema in self.schemas if schema["key"] == key), None)
|
|
133
139
|
|
|
134
140
|
if schema:
|
|
141
|
+
validate_store_value(key, new_value)
|
|
135
142
|
old_value = ObjectPath.get(self.values, key)
|
|
136
|
-
|
|
137
|
-
|
|
138
|
-
|
|
139
|
-
|
|
140
|
-
|
|
141
|
-
|
|
142
|
-
|
|
143
|
-
|
|
144
|
-
|
|
145
|
-
|
|
146
|
-
|
|
147
|
-
|
|
148
|
-
|
|
149
|
-
|
|
150
|
-
|
|
151
|
-
|
|
143
|
+
if new_value is None:
|
|
144
|
+
unchanged = old_value is None
|
|
145
|
+
ObjectPath.delete(self.values, key)
|
|
146
|
+
else:
|
|
147
|
+
unchanged = old_value is not None and DeepDiff(old_value, new_value) == {}
|
|
148
|
+
stored = ( # pyright: ignore[reportUnknownVariableType]
|
|
149
|
+
deepcopy(new_value) # pyright: ignore[reportUnknownVariableType, reportUnknownArgumentType]
|
|
150
|
+
if isinstance(new_value, (dict, list))
|
|
151
|
+
else new_value
|
|
152
|
+
)
|
|
153
|
+
ObjectPath.set(self.values, key, stored)
|
|
154
|
+
|
|
155
|
+
if self.__contains_storable_schema(schema) and (not unchanged or self.__dirty):
|
|
156
|
+
await self.save()
|
|
157
|
+
|
|
158
|
+
self.__run_on_set_detached(schema.get("onSet", None), key, new_value, old_value)
|
|
152
159
|
|
|
153
160
|
@RPCMethod
|
|
154
161
|
async def submitValue(self, key: str, new_value: Any) -> FormSubmitResponse | None:
|
|
@@ -170,9 +177,20 @@ class DeviceStorage(DeviceStorageInterface):
|
|
|
170
177
|
return None
|
|
171
178
|
|
|
172
179
|
@RPCMethod
|
|
173
|
-
def setInternalValue(self, key: str, value: Any) -> None:
|
|
174
|
-
|
|
175
|
-
self.
|
|
180
|
+
async def setInternalValue(self, key: str, value: Any) -> None: # type: ignore[override]
|
|
181
|
+
validate_store_value(key, value)
|
|
182
|
+
old_value = ObjectPath.get(self.values, key)
|
|
183
|
+
if value is None:
|
|
184
|
+
unchanged = old_value is None
|
|
185
|
+
ObjectPath.delete(self.values, key)
|
|
186
|
+
else:
|
|
187
|
+
unchanged = old_value is not None and DeepDiff(old_value, value) == {}
|
|
188
|
+
stored = deepcopy(value) if isinstance(value, (dict, list)) else value # type: ignore
|
|
189
|
+
ObjectPath.set(self.values, key, stored)
|
|
190
|
+
|
|
191
|
+
if unchanged and not self.__dirty:
|
|
192
|
+
return
|
|
193
|
+
await self.save()
|
|
176
194
|
|
|
177
195
|
@RPCMethod
|
|
178
196
|
def hasValue(self, key: str) -> bool:
|
|
@@ -188,52 +206,67 @@ class DeviceStorage(DeviceStorageInterface):
|
|
|
188
206
|
|
|
189
207
|
@RPCMethod
|
|
190
208
|
async def setConfig(self, new_config: dict[str, Any]) -> None:
|
|
209
|
+
validate_store_value("config", new_config)
|
|
191
210
|
old_config = deepcopy(self.values)
|
|
192
211
|
self.values = merge_with(self.values, new_config, merge)
|
|
193
212
|
|
|
194
|
-
await self.
|
|
195
|
-
self.
|
|
213
|
+
await self.save()
|
|
214
|
+
self.__trigger_on_set_for_changes(old_config, self.values)
|
|
196
215
|
|
|
197
216
|
@RPCMethod
|
|
198
217
|
async def addSchema(self, schema: JsonSchema) -> None:
|
|
199
|
-
|
|
200
|
-
|
|
201
|
-
schema_exist = next((schema for schema in self.schemas if schema["key"] == schema["key"]), None)
|
|
202
|
-
|
|
203
|
-
if schema_exist:
|
|
218
|
+
if self.hasSchema(schema["key"]):
|
|
204
219
|
raise Exception(f"Schema with key {schema['key']} already exists")
|
|
205
|
-
else:
|
|
206
|
-
self.schemas.append(schema)
|
|
207
220
|
|
|
208
|
-
|
|
221
|
+
self.schemas.append(schema)
|
|
209
222
|
|
|
210
|
-
|
|
211
|
-
|
|
223
|
+
old_value = ObjectPath.get(self.values, schema["key"])
|
|
224
|
+
await self.__resolve_on_get_functions(schema)
|
|
212
225
|
|
|
213
|
-
|
|
214
|
-
|
|
226
|
+
new_value = ObjectPath.get(self.values, schema["key"])
|
|
227
|
+
if (
|
|
228
|
+
self.__contains_storable_schema(schema)
|
|
229
|
+
and DeepDiff(old_value, new_value, ignore_order=True) != {}
|
|
230
|
+
):
|
|
231
|
+
await self.save()
|
|
215
232
|
|
|
216
233
|
@RPCMethod
|
|
217
|
-
def removeSchema(self, key: str) -> None:
|
|
234
|
+
async def removeSchema(self, key: str) -> None: # type: ignore[override]
|
|
218
235
|
schema = next((schema for schema in self.schemas if schema["key"] == key), None)
|
|
236
|
+
had_value = ObjectPath.get(self.values, key) is not None
|
|
219
237
|
self.schemas = [s for s in self.schemas if s["key"] != key]
|
|
220
238
|
ObjectPath.delete(self.values, key)
|
|
221
239
|
|
|
222
|
-
if schema and self.__contains_storable_schema(schema):
|
|
223
|
-
self.save()
|
|
240
|
+
if schema and self.__contains_storable_schema(schema) and had_value:
|
|
241
|
+
await self.save()
|
|
224
242
|
|
|
225
243
|
@RPCMethod
|
|
226
244
|
async def changeSchema(self, key: str, new_schema: dict[str, Any]) -> None:
|
|
227
245
|
new_schema["key"] = key
|
|
228
|
-
|
|
246
|
+
index = next(
|
|
247
|
+
(i for i, schema in enumerate(self.schemas) if schema["key"] == key),
|
|
248
|
+
None,
|
|
249
|
+
)
|
|
250
|
+
if index is None:
|
|
251
|
+
return
|
|
229
252
|
|
|
230
|
-
|
|
231
|
-
|
|
253
|
+
was_storable = self.__contains_storable_schema(self.schemas[index])
|
|
254
|
+
self.schemas[index] = cast(JsonSchema, new_schema)
|
|
232
255
|
|
|
233
|
-
|
|
256
|
+
# Storable-ness flipped: the next write must persist even if the
|
|
257
|
+
# value compares unchanged, otherwise the flip never becomes durable.
|
|
258
|
+
if self.__contains_storable_schema(self.schemas[index]) != was_storable:
|
|
259
|
+
self.__dirty = True
|
|
234
260
|
|
|
235
|
-
|
|
236
|
-
|
|
261
|
+
old_value = ObjectPath.get(self.values, key)
|
|
262
|
+
await self.__resolve_on_get_functions(self.schemas[index])
|
|
263
|
+
|
|
264
|
+
new_value = ObjectPath.get(self.values, key)
|
|
265
|
+
if (
|
|
266
|
+
self.__contains_storable_schema(self.schemas[index])
|
|
267
|
+
and DeepDiff(old_value, new_value, ignore_order=True) != {}
|
|
268
|
+
):
|
|
269
|
+
await self.save()
|
|
237
270
|
|
|
238
271
|
@RPCMethod
|
|
239
272
|
def getSchema(self, key: str) -> JsonSchema | None:
|
|
@@ -245,42 +278,50 @@ class DeviceStorage(DeviceStorageInterface):
|
|
|
245
278
|
|
|
246
279
|
@RPCMethod
|
|
247
280
|
async def destroy(self) -> None:
|
|
248
|
-
self.
|
|
249
|
-
config
|
|
250
|
-
|
|
251
|
-
|
|
252
|
-
self.values = {}
|
|
253
|
-
self.__plugin_db.update({"config": config})
|
|
281
|
+
config = self.__plugin_db.get("config") or {}
|
|
282
|
+
delete_location(config, self.__location)
|
|
283
|
+
self.values = {}
|
|
284
|
+
await self.__plugin_db.put("config", config)
|
|
254
285
|
|
|
255
|
-
def save(self) -> None:
|
|
256
|
-
config
|
|
286
|
+
async def save(self) -> None: # type: ignore[override]
|
|
287
|
+
config = self.__plugin_db.get("config") or {}
|
|
257
288
|
|
|
258
289
|
if len(self.schemas) > 0:
|
|
259
290
|
storable_config = self.__filter_storable_values(self.schemas)
|
|
260
291
|
else:
|
|
261
292
|
storable_config = self.values
|
|
262
293
|
|
|
263
|
-
config
|
|
264
|
-
|
|
294
|
+
write_location(config, self.__location, storable_config)
|
|
295
|
+
try:
|
|
296
|
+
await self.__plugin_db.put("config", config)
|
|
297
|
+
except Exception:
|
|
298
|
+
self.__dirty = True
|
|
299
|
+
raise
|
|
300
|
+
self.__dirty = False
|
|
265
301
|
|
|
266
302
|
def defineSchemas(self, schemas: list[JsonSchema]) -> None:
|
|
267
303
|
self.schemas = schemas
|
|
268
304
|
self.__initializeStorage()
|
|
269
305
|
|
|
270
|
-
# Internal method
|
|
271
306
|
def update_schema(self, schemas: list[JsonSchema] = []) -> None:
|
|
272
307
|
self.schemas = schemas
|
|
273
308
|
self.__initializeStorage()
|
|
274
309
|
|
|
275
|
-
# Internal method
|
|
276
310
|
async def register_storage(self) -> None:
|
|
277
311
|
self.__close_proxy = await self.__proxy.register_handler(self.__storage_namespace, self)
|
|
278
312
|
|
|
279
|
-
# Internal method
|
|
280
313
|
async def unregister_storage(self) -> None:
|
|
281
314
|
if self.__close_proxy:
|
|
282
315
|
await self.__close_proxy()
|
|
283
316
|
|
|
317
|
+
# Internal method to close the storage
|
|
318
|
+
async def close(self) -> None:
|
|
319
|
+
try:
|
|
320
|
+
await self.save()
|
|
321
|
+
await self.unregister_storage()
|
|
322
|
+
except Exception as error:
|
|
323
|
+
cast(Any, self.__api).logger.error(f"store: close save failed: {error}")
|
|
324
|
+
|
|
284
325
|
async def __resolve_on_get_functions(
|
|
285
326
|
self,
|
|
286
327
|
schemas: JsonSchema | list[JsonSchema],
|
|
@@ -294,46 +335,40 @@ class DeviceStorage(DeviceStorageInterface):
|
|
|
294
335
|
if schema_value is not None:
|
|
295
336
|
ObjectPath.set(self.values, schema["key"], schema_value)
|
|
296
337
|
|
|
297
|
-
|
|
298
|
-
self, old_config: dict[str, Any], new_config: dict[str, Any]
|
|
299
|
-
) -> None:
|
|
300
|
-
tasks: list[Awaitable[None | Any]] = []
|
|
301
|
-
|
|
338
|
+
def __trigger_on_set_for_changes(self, old_config: dict[str, Any], new_config: dict[str, Any]) -> None:
|
|
302
339
|
for config_key in list(new_config.keys()):
|
|
303
340
|
old_value: Any = get_value_by_key(old_config, config_key) or {}
|
|
304
341
|
new_value: Any = new_config[config_key]
|
|
305
342
|
|
|
306
343
|
if DeepDiff(old_value, new_value, ignore_order=True) != {}:
|
|
307
|
-
schema = next(
|
|
344
|
+
schema = next(
|
|
345
|
+
(schema for schema in self.schemas if schema["key"] == config_key),
|
|
346
|
+
None,
|
|
347
|
+
)
|
|
308
348
|
if schema and schema["type"] != "submit" and "onSet" in schema:
|
|
309
|
-
|
|
310
|
-
|
|
311
|
-
|
|
312
|
-
|
|
313
|
-
|
|
314
|
-
|
|
315
|
-
|
|
316
|
-
|
|
317
|
-
|
|
318
|
-
|
|
319
|
-
|
|
320
|
-
|
|
321
|
-
|
|
322
|
-
|
|
323
|
-
|
|
324
|
-
|
|
325
|
-
|
|
326
|
-
|
|
327
|
-
if tasks:
|
|
328
|
-
await asyncio.gather(*tasks)
|
|
349
|
+
self.__run_on_set_detached(schema.get("onSet", None), config_key, new_value, old_value)
|
|
350
|
+
|
|
351
|
+
def __run_on_set_detached(self, on_set_function: Any, key: str, new_value: Any, old_value: Any) -> None:
|
|
352
|
+
if not on_set_function:
|
|
353
|
+
return
|
|
354
|
+
|
|
355
|
+
async def _run() -> None:
|
|
356
|
+
try:
|
|
357
|
+
res = on_set_function(new_value, old_value)
|
|
358
|
+
if inspect.iscoroutine(res):
|
|
359
|
+
await res
|
|
360
|
+
except Exception as error:
|
|
361
|
+
cast(Any, self.__api).logger.error(f'onSet handler for "{key}" failed: {error}')
|
|
362
|
+
|
|
363
|
+
task = asyncio.create_task(_run())
|
|
364
|
+
self.__detached_tasks.add(task)
|
|
365
|
+
task.add_done_callback(self.__detached_tasks.discard)
|
|
329
366
|
|
|
330
367
|
def __filter_storable_values(
|
|
331
368
|
self,
|
|
332
369
|
schemas: list[JsonSchema],
|
|
333
|
-
result: ConfigDict | None = None,
|
|
334
370
|
) -> ConfigDict:
|
|
335
|
-
|
|
336
|
-
result = {}
|
|
371
|
+
result: ConfigDict = {}
|
|
337
372
|
|
|
338
373
|
for schema in schemas:
|
|
339
374
|
if is_button_type(schema) or is_submit_type(schema):
|
|
@@ -343,9 +378,10 @@ class DeviceStorage(DeviceStorageInterface):
|
|
|
343
378
|
config_value = get_value_by_key(self.values, schema["key"])
|
|
344
379
|
ObjectPath.set(result, schema["key"], config_value)
|
|
345
380
|
|
|
346
|
-
#
|
|
381
|
+
# Keys without any schema are internal values and always persist;
|
|
382
|
+
# schema-covered keys persist only via their store flag above.
|
|
347
383
|
for key, value in self.values.items():
|
|
348
|
-
if key.startswith("
|
|
384
|
+
if not any(schema["key"] == key or schema["key"].startswith(f"{key}.") for schema in schemas):
|
|
349
385
|
result[key] = value
|
|
350
386
|
|
|
351
387
|
return result
|
|
@@ -360,12 +396,7 @@ class DeviceStorage(DeviceStorageInterface):
|
|
|
360
396
|
return bool("store" in schema and schema["store"])
|
|
361
397
|
|
|
362
398
|
def __initializeStorage(self) -> None:
|
|
363
|
-
config
|
|
364
|
-
device_config = config
|
|
399
|
+
config = self.__plugin_db.get("config") or {}
|
|
400
|
+
device_config = read_location(config, self.__location) or {}
|
|
365
401
|
schema_config = generate_config_from_schemas(self.schemas)
|
|
366
402
|
self.values = merge_with(schema_config, device_config, merge2)
|
|
367
|
-
|
|
368
|
-
async def __close(self) -> None:
|
|
369
|
-
with suppress(Exception):
|
|
370
|
-
self.save()
|
|
371
|
-
await self.unregister_storage()
|
|
@@ -1,18 +1,19 @@
|
|
|
1
1
|
from __future__ import annotations
|
|
2
2
|
|
|
3
|
-
from typing import TYPE_CHECKING,
|
|
3
|
+
from typing import TYPE_CHECKING, Literal, overload
|
|
4
4
|
|
|
5
|
-
from plugins.runtime.python.config_db import PluginConfigDb
|
|
6
|
-
|
|
7
|
-
from _camera_ui_tools.camera_ui_rpc import RPCClient
|
|
8
|
-
from _camera_ui_tools.camera_ui_sdk import JsonSchema, SensorType
|
|
9
5
|
from plugins.runtime.python.storage import DeviceStorage
|
|
10
|
-
from plugins.runtime.python.
|
|
6
|
+
from plugins.runtime.python.store import CameraLocation, PluginLocation, SensorLocation
|
|
11
7
|
|
|
12
8
|
if TYPE_CHECKING:
|
|
9
|
+
from _camera_ui_tools.camera_ui_rpc import RPCClient
|
|
10
|
+
from _camera_ui_tools.camera_ui_sdk import JsonSchema, SensorType
|
|
11
|
+
from plugins.runtime.python.config_db import PluginConfigDb
|
|
13
12
|
from plugins.runtime.python.plugin_api import PluginAPI
|
|
13
|
+
from plugins.runtime.python.typings import PluginInfo
|
|
14
14
|
|
|
15
15
|
|
|
16
|
+
# Stable storage key for sensor instance storage.
|
|
16
17
|
def sensor_storage_key(camera_id: str, sensor_type: str, plugin_id: str, sensor_name: str) -> str:
|
|
17
18
|
return f"{camera_id}:sensor:{sensor_type}:{plugin_id}:{sensor_name}"
|
|
18
19
|
|
|
@@ -39,7 +40,12 @@ class StorageController:
|
|
|
39
40
|
|
|
40
41
|
if not camera_storage:
|
|
41
42
|
camera_storage = DeviceStorage(
|
|
42
|
-
self.__api,
|
|
43
|
+
self.__api,
|
|
44
|
+
self.__proxy,
|
|
45
|
+
self.__plugin,
|
|
46
|
+
self.__plugin_db,
|
|
47
|
+
CameraLocation(camera_id=cameraId),
|
|
48
|
+
schemas,
|
|
43
49
|
)
|
|
44
50
|
self.__storages[cameraId] = camera_storage
|
|
45
51
|
else:
|
|
@@ -55,7 +61,12 @@ class StorageController:
|
|
|
55
61
|
|
|
56
62
|
if not plugin_storage:
|
|
57
63
|
plugin_storage = DeviceStorage(
|
|
58
|
-
self.__api,
|
|
64
|
+
self.__api,
|
|
65
|
+
self.__proxy,
|
|
66
|
+
self.__plugin,
|
|
67
|
+
self.__plugin_db,
|
|
68
|
+
PluginLocation(),
|
|
69
|
+
schemas,
|
|
59
70
|
)
|
|
60
71
|
self.__storages["storage"] = plugin_storage
|
|
61
72
|
else:
|
|
@@ -82,16 +93,17 @@ class StorageController:
|
|
|
82
93
|
storage = self.__storages.get(storage_key)
|
|
83
94
|
|
|
84
95
|
if not storage:
|
|
96
|
+
# storage_key is only the in-memory registry key; persistence addresses
|
|
97
|
+
# the canonical sensors.<camId>.<type>.<name> path. sensor_id is the
|
|
98
|
+
# runtime UUID for the RPC namespace.
|
|
85
99
|
storage = DeviceStorage(
|
|
86
100
|
self.__api,
|
|
87
101
|
self.__proxy,
|
|
88
102
|
self.__plugin,
|
|
89
103
|
self.__plugin_db,
|
|
90
|
-
|
|
104
|
+
SensorLocation(camera_id=camera_id, sensor_type=sensor_type.value, sensor_name=sensor_name),
|
|
91
105
|
schemas,
|
|
92
|
-
False,
|
|
93
106
|
sensor_id,
|
|
94
|
-
camera_id,
|
|
95
107
|
)
|
|
96
108
|
self.__storages[storage_key] = storage
|
|
97
109
|
storage.update_schema(schemas)
|
|
@@ -106,7 +118,6 @@ class StorageController:
|
|
|
106
118
|
storage_key = sensor_storage_key(camera_id, sensor_type.value, plugin_id, sensor_name)
|
|
107
119
|
return self.__storages.get(storage_key)
|
|
108
120
|
|
|
109
|
-
# Internal method
|
|
110
121
|
@overload
|
|
111
122
|
async def createStorage(self, type_: Literal["camera"], device_id: str) -> DeviceStorage: ...
|
|
112
123
|
@overload
|
|
@@ -150,7 +161,6 @@ class StorageController:
|
|
|
150
161
|
await storage.register_storage()
|
|
151
162
|
return storage
|
|
152
163
|
|
|
153
|
-
# Internal method
|
|
154
164
|
@overload
|
|
155
165
|
async def removeStorage(self, type_: Literal["camera"], device_id: str) -> None: ...
|
|
156
166
|
@overload
|
|
@@ -194,3 +204,8 @@ class StorageController:
|
|
|
194
204
|
await device_storage.unregister_storage()
|
|
195
205
|
del self.__storages[storage_key]
|
|
196
206
|
return
|
|
207
|
+
|
|
208
|
+
# Internal method to close all storages
|
|
209
|
+
async def close(self) -> None:
|
|
210
|
+
for storage in self.__storages.values():
|
|
211
|
+
await storage.close()
|