@camstack/core 0.1.15 → 0.1.16
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/addon/addon-api-factory.d.ts +36 -0
- package/dist/addon/addon-api-factory.d.ts.map +1 -0
- package/dist/addon-routes/addon-route-registry.d.ts +38 -0
- package/dist/addon-routes/addon-route-registry.d.ts.map +1 -0
- package/dist/auth/api-key-manager.d.ts +27 -0
- package/dist/auth/api-key-manager.d.ts.map +1 -0
- package/dist/auth/auth-manager.d.ts +47 -0
- package/dist/auth/auth-manager.d.ts.map +1 -0
- package/dist/auth/parse-record.d.ts +19 -0
- package/dist/auth/parse-record.d.ts.map +1 -0
- package/dist/auth/scoped-token-manager.d.ts +18 -0
- package/dist/auth/scoped-token-manager.d.ts.map +1 -0
- package/dist/auth/user-manager.d.ts +34 -0
- package/dist/auth/user-manager.d.ts.map +1 -0
- package/dist/builtins/addon-pages-aggregator/addon-pages-aggregator.addon.d.ts +54 -0
- package/dist/builtins/addon-pages-aggregator/addon-pages-aggregator.addon.d.ts.map +1 -0
- package/dist/builtins/addon-pages-aggregator/addon-pages-aggregator.addon.js +223 -217
- package/dist/builtins/addon-pages-aggregator/addon-pages-aggregator.addon.js.map +1 -1
- package/dist/builtins/addon-pages-aggregator/addon-pages-aggregator.addon.mjs +216 -7
- package/dist/builtins/addon-pages-aggregator/addon-pages-aggregator.addon.mjs.map +1 -1
- package/dist/builtins/addon-pages-aggregator/index.d.ts +2 -0
- package/dist/builtins/addon-pages-aggregator/index.d.ts.map +1 -0
- package/dist/builtins/addon-pages-aggregator/index.js +6 -221
- package/dist/builtins/addon-pages-aggregator/index.mjs +2 -9
- package/dist/builtins/addon-widgets-aggregator/addon-widgets-aggregator.addon.d.ts +33 -0
- package/dist/builtins/addon-widgets-aggregator/addon-widgets-aggregator.addon.d.ts.map +1 -0
- package/dist/builtins/addon-widgets-aggregator/addon-widgets-aggregator.addon.js +199 -197
- package/dist/builtins/addon-widgets-aggregator/addon-widgets-aggregator.addon.js.map +1 -1
- package/dist/builtins/addon-widgets-aggregator/addon-widgets-aggregator.addon.mjs +192 -7
- package/dist/builtins/addon-widgets-aggregator/addon-widgets-aggregator.addon.mjs.map +1 -1
- package/dist/builtins/addon-widgets-aggregator/index.d.ts +2 -0
- package/dist/builtins/addon-widgets-aggregator/index.d.ts.map +1 -0
- package/dist/builtins/addon-widgets-aggregator/index.js +6 -201
- package/dist/builtins/addon-widgets-aggregator/index.mjs +2 -9
- package/dist/builtins/alerts/alerts.addon.d.ts +82 -0
- package/dist/builtins/alerts/alerts.addon.d.ts.map +1 -0
- package/dist/builtins/alerts/alerts.addon.js +590 -430
- package/dist/builtins/alerts/alerts.addon.js.map +1 -1
- package/dist/builtins/alerts/alerts.addon.mjs +595 -7
- package/dist/builtins/alerts/alerts.addon.mjs.map +1 -1
- package/dist/builtins/alerts/index.d.ts +2 -0
- package/dist/builtins/alerts/index.d.ts.map +1 -0
- package/dist/builtins/alerts/index.js +3 -443
- package/dist/builtins/alerts/index.mjs +2 -8
- package/dist/builtins/auth-orchestrator/auth-orchestrator.addon.d.ts +8 -0
- package/dist/builtins/auth-orchestrator/auth-orchestrator.addon.d.ts.map +1 -0
- package/dist/builtins/auth-orchestrator/auth-orchestrator.addon.js +56 -0
- package/dist/builtins/auth-orchestrator/auth-orchestrator.addon.js.map +1 -0
- package/dist/builtins/auth-orchestrator/auth-orchestrator.addon.mjs +50 -0
- package/dist/builtins/auth-orchestrator/auth-orchestrator.addon.mjs.map +1 -0
- package/dist/builtins/auth-orchestrator/index.d.ts +2 -0
- package/dist/builtins/auth-orchestrator/index.d.ts.map +1 -0
- package/dist/builtins/auth-orchestrator/index.js +7 -0
- package/dist/builtins/auth-orchestrator/index.mjs +2 -0
- package/dist/builtins/backup-orchestrator/backup-orchestrator.addon.d.ts +148 -0
- package/dist/builtins/backup-orchestrator/backup-orchestrator.addon.d.ts.map +1 -0
- package/dist/builtins/backup-orchestrator/backup-orchestrator.addon.js +7639 -0
- package/dist/builtins/backup-orchestrator/backup-orchestrator.addon.js.map +1 -0
- package/dist/builtins/backup-orchestrator/backup-orchestrator.addon.mjs +7627 -0
- package/dist/builtins/backup-orchestrator/backup-orchestrator.addon.mjs.map +1 -0
- package/dist/builtins/backup-orchestrator/cron-helpers.d.ts +24 -0
- package/dist/builtins/backup-orchestrator/cron-helpers.d.ts.map +1 -0
- package/dist/builtins/backup-orchestrator/destination-policy.d.ts +73 -0
- package/dist/builtins/backup-orchestrator/destination-policy.d.ts.map +1 -0
- package/dist/builtins/backup-orchestrator/download-helpers.d.ts +13 -0
- package/dist/builtins/backup-orchestrator/download-helpers.d.ts.map +1 -0
- package/dist/builtins/backup-orchestrator/index.d.ts +3 -0
- package/dist/builtins/backup-orchestrator/index.d.ts.map +1 -0
- package/dist/builtins/backup-orchestrator/index.js +7 -0
- package/dist/builtins/backup-orchestrator/index.mjs +2 -0
- package/dist/builtins/backup-orchestrator/manifest-store.d.ts +78 -0
- package/dist/builtins/backup-orchestrator/manifest-store.d.ts.map +1 -0
- package/dist/builtins/console-logging/console-destination.d.ts +14 -0
- package/dist/builtins/console-logging/console-destination.d.ts.map +1 -0
- package/dist/builtins/console-logging/console-logging.addon.d.ts +26 -0
- package/dist/builtins/console-logging/console-logging.addon.d.ts.map +1 -0
- package/dist/builtins/console-logging/index.d.ts +4 -0
- package/dist/builtins/console-logging/index.d.ts.map +1 -0
- package/dist/builtins/console-logging/index.js +99 -235
- package/dist/builtins/console-logging/index.js.map +1 -1
- package/dist/builtins/console-logging/index.mjs +95 -9
- package/dist/builtins/console-logging/index.mjs.map +1 -1
- package/dist/builtins/device-manager/device-event-propagator.d.ts +27 -0
- package/dist/builtins/device-manager/device-event-propagator.d.ts.map +1 -0
- package/dist/builtins/device-manager/device-manager.addon.d.ts +259 -0
- package/dist/builtins/device-manager/device-manager.addon.d.ts.map +1 -0
- package/dist/builtins/device-manager/device-manager.addon.js +2125 -2127
- package/dist/builtins/device-manager/device-manager.addon.js.map +1 -1
- package/dist/builtins/device-manager/device-manager.addon.mjs +2145 -7
- package/dist/builtins/device-manager/device-manager.addon.mjs.map +1 -1
- package/dist/builtins/device-manager/index.d.ts +3 -0
- package/dist/builtins/device-manager/index.d.ts.map +1 -0
- package/dist/builtins/device-manager/index.js +6 -2156
- package/dist/builtins/device-manager/index.mjs +2 -10
- package/dist/builtins/hub-forwarder/hub-forwarder-destination.d.ts +45 -0
- package/dist/builtins/hub-forwarder/hub-forwarder-destination.d.ts.map +1 -0
- package/dist/builtins/hub-forwarder/hub-forwarder.addon.d.ts +16 -0
- package/dist/builtins/hub-forwarder/hub-forwarder.addon.d.ts.map +1 -0
- package/dist/builtins/hub-forwarder/index.d.ts +4 -0
- package/dist/builtins/hub-forwarder/index.d.ts.map +1 -0
- package/dist/builtins/hub-forwarder/index.js +150 -291
- package/dist/builtins/hub-forwarder/index.js.map +1 -1
- package/dist/builtins/hub-forwarder/index.mjs +145 -9
- package/dist/builtins/hub-forwarder/index.mjs.map +1 -1
- package/dist/builtins/local-auth/auth-schema.d.ts +12 -0
- package/dist/builtins/local-auth/auth-schema.d.ts.map +1 -0
- package/dist/builtins/local-auth/index.d.ts +2 -0
- package/dist/builtins/local-auth/index.d.ts.map +1 -0
- package/dist/builtins/local-auth/index.js +3 -623
- package/dist/builtins/local-auth/index.mjs +2 -8
- package/dist/builtins/local-auth/local-auth.addon.d.ts +17 -0
- package/dist/builtins/local-auth/local-auth.addon.d.ts.map +1 -0
- package/dist/builtins/local-auth/local-auth.addon.js +6861 -589
- package/dist/builtins/local-auth/local-auth.addon.js.map +1 -1
- package/dist/builtins/local-auth/local-auth.addon.mjs +6883 -7
- package/dist/builtins/local-auth/local-auth.addon.mjs.map +1 -1
- package/dist/builtins/local-network/index.d.ts +3 -0
- package/dist/builtins/local-network/index.d.ts.map +1 -0
- package/dist/builtins/local-network/index.js +9 -0
- package/dist/builtins/local-network/index.mjs +2 -0
- package/dist/builtins/local-network/local-network.addon.d.ts +102 -0
- package/dist/builtins/local-network/local-network.addon.d.ts.map +1 -0
- package/dist/builtins/local-network/local-network.addon.js +404 -0
- package/dist/builtins/local-network/local-network.addon.js.map +1 -0
- package/dist/builtins/local-network/local-network.addon.mjs +392 -0
- package/dist/builtins/local-network/local-network.addon.mjs.map +1 -0
- package/dist/builtins/mesh-orchestrator/index.d.ts +2 -0
- package/dist/builtins/mesh-orchestrator/index.d.ts.map +1 -0
- package/dist/builtins/mesh-orchestrator/index.js +7 -0
- package/dist/builtins/mesh-orchestrator/index.mjs +2 -0
- package/dist/builtins/mesh-orchestrator/mesh-orchestrator.addon.d.ts +9 -0
- package/dist/builtins/mesh-orchestrator/mesh-orchestrator.addon.d.ts.map +1 -0
- package/dist/builtins/mesh-orchestrator/mesh-orchestrator.addon.js +83 -0
- package/dist/builtins/mesh-orchestrator/mesh-orchestrator.addon.js.map +1 -0
- package/dist/builtins/mesh-orchestrator/mesh-orchestrator.addon.mjs +77 -0
- package/dist/builtins/mesh-orchestrator/mesh-orchestrator.addon.mjs.map +1 -0
- package/dist/builtins/native-metrics/index.d.ts +3 -0
- package/dist/builtins/native-metrics/index.d.ts.map +1 -0
- package/dist/builtins/native-metrics/native-metrics-provider.d.ts +49 -0
- package/dist/builtins/native-metrics/native-metrics-provider.d.ts.map +1 -0
- package/dist/builtins/native-metrics/native-metrics.addon.d.ts +74 -0
- package/dist/builtins/native-metrics/native-metrics.addon.d.ts.map +1 -0
- package/dist/builtins/native-metrics/native-metrics.addon.js +887 -861
- package/dist/builtins/native-metrics/native-metrics.addon.js.map +1 -1
- package/dist/builtins/native-metrics/native-metrics.addon.mjs +914 -5
- package/dist/builtins/native-metrics/native-metrics.addon.mjs.map +1 -1
- package/dist/builtins/platform-probe/index.d.ts +12 -0
- package/dist/builtins/platform-probe/index.d.ts.map +1 -0
- package/dist/builtins/platform-probe/index.js +539 -0
- package/dist/builtins/platform-probe/index.js.map +1 -0
- package/dist/builtins/platform-probe/index.mjs +530 -0
- package/dist/builtins/platform-probe/index.mjs.map +1 -0
- package/dist/builtins/platform-probe/inference-config-resolver.d.ts +30 -0
- package/dist/builtins/platform-probe/inference-config-resolver.d.ts.map +1 -0
- package/dist/builtins/platform-probe/platform-scorer.d.ts +22 -0
- package/dist/builtins/platform-probe/platform-scorer.d.ts.map +1 -0
- package/dist/builtins/remote-access-orchestrator/index.d.ts +2 -0
- package/dist/builtins/remote-access-orchestrator/index.d.ts.map +1 -0
- package/dist/builtins/remote-access-orchestrator/index.js +7 -0
- package/dist/builtins/remote-access-orchestrator/index.mjs +2 -0
- package/dist/builtins/remote-access-orchestrator/remote-access-orchestrator.addon.d.ts +9 -0
- package/dist/builtins/remote-access-orchestrator/remote-access-orchestrator.addon.d.ts.map +1 -0
- package/dist/builtins/remote-access-orchestrator/remote-access-orchestrator.addon.js +72 -0
- package/dist/builtins/remote-access-orchestrator/remote-access-orchestrator.addon.js.map +1 -0
- package/dist/builtins/remote-access-orchestrator/remote-access-orchestrator.addon.mjs +66 -0
- package/dist/builtins/remote-access-orchestrator/remote-access-orchestrator.addon.mjs.map +1 -0
- package/dist/builtins/snapshot/index.d.ts +3 -0
- package/dist/builtins/snapshot/index.d.ts.map +1 -0
- package/dist/builtins/snapshot/index.js +481 -491
- package/dist/builtins/snapshot/index.js.map +1 -1
- package/dist/builtins/snapshot/index.mjs +475 -464
- package/dist/builtins/snapshot/index.mjs.map +1 -1
- package/dist/builtins/snapshot/snapshot.addon.d.ts +121 -0
- package/dist/builtins/snapshot/snapshot.addon.d.ts.map +1 -0
- package/dist/builtins/sqlite-storage/config-store.d.ts +9 -0
- package/dist/builtins/sqlite-storage/config-store.d.ts.map +1 -0
- package/dist/builtins/sqlite-storage/device-store.d.ts +24 -0
- package/dist/builtins/sqlite-storage/device-store.d.ts.map +1 -0
- package/dist/builtins/sqlite-storage/filesystem-storage-provider.d.ts +87 -0
- package/dist/builtins/sqlite-storage/filesystem-storage-provider.d.ts.map +1 -0
- package/dist/builtins/sqlite-storage/filesystem-storage.addon.d.ts +32 -0
- package/dist/builtins/sqlite-storage/filesystem-storage.addon.d.ts.map +1 -0
- package/dist/builtins/sqlite-storage/filesystem-storage.addon.js +312 -56
- package/dist/builtins/sqlite-storage/filesystem-storage.addon.js.map +1 -1
- package/dist/builtins/sqlite-storage/filesystem-storage.addon.mjs +305 -7
- package/dist/builtins/sqlite-storage/filesystem-storage.addon.mjs.map +1 -1
- package/dist/builtins/sqlite-storage/index.d.ts +12 -0
- package/dist/builtins/sqlite-storage/index.d.ts.map +1 -0
- package/dist/builtins/sqlite-storage/index.js +229 -1001
- package/dist/builtins/sqlite-storage/index.js.map +1 -1
- package/dist/builtins/sqlite-storage/index.mjs +268 -26
- package/dist/builtins/sqlite-storage/index.mjs.map +1 -1
- package/dist/builtins/sqlite-storage/integration-registry.d.ts +28 -0
- package/dist/builtins/sqlite-storage/integration-registry.d.ts.map +1 -0
- package/dist/builtins/sqlite-storage/settings-store.d.ts +40 -0
- package/dist/builtins/sqlite-storage/settings-store.d.ts.map +1 -0
- package/dist/builtins/sqlite-storage/sql-schema.d.ts +33 -0
- package/dist/builtins/sqlite-storage/sql-schema.d.ts.map +1 -0
- package/dist/builtins/sqlite-storage/sqlite-settings-backend.d.ts +94 -0
- package/dist/builtins/sqlite-storage/sqlite-settings-backend.d.ts.map +1 -0
- package/dist/builtins/sqlite-storage/sqlite-settings.addon.d.ts +15 -0
- package/dist/builtins/sqlite-storage/sqlite-settings.addon.d.ts.map +1 -0
- package/dist/builtins/sqlite-storage/sqlite-settings.addon.js +586 -653
- package/dist/builtins/sqlite-storage/sqlite-settings.addon.js.map +1 -1
- package/dist/builtins/sqlite-storage/sqlite-settings.addon.mjs +582 -7
- package/dist/builtins/sqlite-storage/sqlite-settings.addon.mjs.map +1 -1
- package/dist/builtins/storage-orchestrator/index.d.ts +7 -0
- package/dist/builtins/storage-orchestrator/index.d.ts.map +1 -0
- package/dist/builtins/storage-orchestrator/index.js +9 -0
- package/dist/builtins/storage-orchestrator/index.mjs +2 -0
- package/dist/builtins/storage-orchestrator/location-store.d.ts +50 -0
- package/dist/builtins/storage-orchestrator/location-store.d.ts.map +1 -0
- package/dist/builtins/storage-orchestrator/storage-orchestrator.addon.d.ts +60 -0
- package/dist/builtins/storage-orchestrator/storage-orchestrator.addon.d.ts.map +1 -0
- package/dist/builtins/storage-orchestrator/storage-orchestrator.addon.js +755 -0
- package/dist/builtins/storage-orchestrator/storage-orchestrator.addon.js.map +1 -0
- package/dist/builtins/storage-orchestrator/storage-orchestrator.addon.mjs +746 -0
- package/dist/builtins/storage-orchestrator/storage-orchestrator.addon.mjs.map +1 -0
- package/dist/builtins/storage-orchestrator/storage-orchestrator.service.d.ts +121 -0
- package/dist/builtins/storage-orchestrator/storage-orchestrator.service.d.ts.map +1 -0
- package/dist/builtins/system-backup/system-backup.service.d.ts +138 -0
- package/dist/builtins/system-backup/system-backup.service.d.ts.map +1 -0
- package/dist/builtins/system-config/index.d.ts +2 -0
- package/dist/builtins/system-config/index.d.ts.map +1 -0
- package/dist/builtins/system-config/index.js +6 -188
- package/dist/builtins/system-config/index.mjs +2 -10
- package/dist/builtins/system-config/system-config.addon.d.ts +11 -0
- package/dist/builtins/system-config/system-config.addon.d.ts.map +1 -0
- package/dist/builtins/system-config/system-config.addon.js +227 -180
- package/dist/builtins/system-config/system-config.addon.js.map +1 -1
- package/dist/builtins/system-config/system-config.addon.mjs +226 -7
- package/dist/builtins/system-config/system-config.addon.mjs.map +1 -1
- package/dist/builtins/turn-orchestrator/index.d.ts +2 -0
- package/dist/builtins/turn-orchestrator/index.d.ts.map +1 -0
- package/dist/builtins/turn-orchestrator/index.js +7 -0
- package/dist/builtins/turn-orchestrator/index.mjs +2 -0
- package/dist/builtins/turn-orchestrator/turn-orchestrator.addon.d.ts +10 -0
- package/dist/builtins/turn-orchestrator/turn-orchestrator.addon.d.ts.map +1 -0
- package/dist/builtins/turn-orchestrator/turn-orchestrator.addon.js +78 -0
- package/dist/builtins/turn-orchestrator/turn-orchestrator.addon.js.map +1 -0
- package/dist/builtins/turn-orchestrator/turn-orchestrator.addon.mjs +72 -0
- package/dist/builtins/turn-orchestrator/turn-orchestrator.addon.mjs.map +1 -0
- package/dist/builtins/winston-logging/index.d.ts +4 -0
- package/dist/builtins/winston-logging/index.d.ts.map +1 -0
- package/dist/builtins/winston-logging/index.js +153 -300
- package/dist/builtins/winston-logging/index.js.map +1 -1
- package/dist/builtins/winston-logging/index.mjs +144 -9
- package/dist/builtins/winston-logging/index.mjs.map +1 -1
- package/dist/builtins/winston-logging/winston-destination.d.ts +22 -0
- package/dist/builtins/winston-logging/winston-destination.d.ts.map +1 -0
- package/dist/builtins/winston-logging/winston-logging.addon.d.ts +20 -0
- package/dist/builtins/winston-logging/winston-logging.addon.d.ts.map +1 -0
- package/dist/chunk-C13QxCFV.js +50 -0
- package/dist/chunk-hT5z_Zn9.mjs +35 -0
- package/dist/download/model-download-service.d.ts +42 -0
- package/dist/download/model-download-service.d.ts.map +1 -0
- package/dist/download/model-downloader.d.ts +32 -0
- package/dist/download/model-downloader.d.ts.map +1 -0
- package/dist/events/event-bus.d.ts +11 -0
- package/dist/events/event-bus.d.ts.map +1 -0
- package/dist/events/system-event-bus.d.ts +15 -0
- package/dist/events/system-event-bus.d.ts.map +1 -0
- package/dist/feature/feature-manager.d.ts +12 -0
- package/dist/feature/feature-manager.d.ts.map +1 -0
- package/dist/formatter-C-5An4Bl.mjs +164 -0
- package/dist/formatter-C-5An4Bl.mjs.map +1 -0
- package/dist/formatter-Dr_6NNZc.js +169 -0
- package/dist/formatter-Dr_6NNZc.js.map +1 -0
- package/dist/index.d.ts +76 -1696
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +7780 -8035
- package/dist/index.js.map +1 -1
- package/dist/index.mjs +7707 -2148
- package/dist/index.mjs.map +1 -1
- package/dist/lifecycle/lifecycle-state-machine.d.ts +29 -0
- package/dist/lifecycle/lifecycle-state-machine.d.ts.map +1 -0
- package/dist/logging/formatter.d.ts +31 -0
- package/dist/logging/formatter.d.ts.map +1 -0
- package/dist/logging/log-manager.d.ts +52 -0
- package/dist/logging/log-manager.d.ts.map +1 -0
- package/dist/logging/log-ring-buffer.d.ts +48 -0
- package/dist/logging/log-ring-buffer.d.ts.map +1 -0
- package/dist/logging/scoped-logger.d.ts +18 -0
- package/dist/logging/scoped-logger.d.ts.map +1 -0
- package/dist/network/network-quality.d.ts +12 -0
- package/dist/network/network-quality.d.ts.map +1 -0
- package/dist/notification/notification-service.d.ts +38 -0
- package/dist/notification/notification-service.d.ts.map +1 -0
- package/dist/notification/toast-service.d.ts +23 -0
- package/dist/notification/toast-service.d.ts.map +1 -0
- package/dist/pipeline/engine-manager-resolver.d.ts +16 -0
- package/dist/pipeline/engine-manager-resolver.d.ts.map +1 -0
- package/dist/pipeline/pipeline-runner.d.ts +9 -0
- package/dist/pipeline/pipeline-runner.d.ts.map +1 -0
- package/dist/pipeline/pipeline-validator.d.ts +14 -0
- package/dist/pipeline/pipeline-validator.d.ts.map +1 -0
- package/dist/process/resource-monitor.d.ts +12 -0
- package/dist/process/resource-monitor.d.ts.map +1 -0
- package/dist/python/python-env-manager.d.ts +13 -0
- package/dist/python/python-env-manager.d.ts.map +1 -0
- package/dist/repl/interfaces.d.ts +32 -0
- package/dist/repl/interfaces.d.ts.map +1 -0
- package/dist/repl/repl-engine.d.ts +9 -0
- package/dist/repl/repl-engine.d.ts.map +1 -0
- package/dist/resource-monitor-CmuWlmap.js +76 -0
- package/dist/resource-monitor-CmuWlmap.js.map +1 -0
- package/dist/resource-monitor-DcQdKGYU.mjs +59 -0
- package/dist/resource-monitor-DcQdKGYU.mjs.map +1 -0
- package/dist/storage/fs-storage-backend.d.ts +41 -0
- package/dist/storage/fs-storage-backend.d.ts.map +1 -0
- package/dist/storage/storage-location-manager.d.ts +24 -0
- package/dist/storage/storage-location-manager.d.ts.map +1 -0
- package/dist/storage/storage-manager.d.ts +77 -0
- package/dist/storage/storage-manager.d.ts.map +1 -0
- package/dist/tls/cert-manager.d.ts +27 -0
- package/dist/tls/cert-manager.d.ts.map +1 -0
- package/dist/tls/index.d.ts +2 -0
- package/dist/tls/index.d.ts.map +1 -0
- package/package.json +119 -23
- package/dist/builtins/addon-pages-aggregator/index.js.map +0 -1
- package/dist/builtins/addon-pages-aggregator/index.mjs.map +0 -1
- package/dist/builtins/addon-widgets-aggregator/index.js.map +0 -1
- package/dist/builtins/addon-widgets-aggregator/index.mjs.map +0 -1
- package/dist/builtins/alerts/index.js.map +0 -1
- package/dist/builtins/alerts/index.mjs.map +0 -1
- package/dist/builtins/device-manager/index.js.map +0 -1
- package/dist/builtins/device-manager/index.mjs.map +0 -1
- package/dist/builtins/local-auth/index.js.map +0 -1
- package/dist/builtins/local-auth/index.mjs.map +0 -1
- package/dist/builtins/local-backup/index.js +0 -173
- package/dist/builtins/local-backup/index.js.map +0 -1
- package/dist/builtins/local-backup/index.mjs +0 -10
- package/dist/builtins/local-backup/index.mjs.map +0 -1
- package/dist/builtins/system-config/index.js.map +0 -1
- package/dist/builtins/system-config/index.mjs.map +0 -1
- package/dist/chunk-2CIYKDRN.mjs +0 -1
- package/dist/chunk-2CIYKDRN.mjs.map +0 -1
- package/dist/chunk-2F76X6NL.mjs +0 -136
- package/dist/chunk-2F76X6NL.mjs.map +0 -1
- package/dist/chunk-2QUFBZ7M.mjs +0 -1
- package/dist/chunk-2QUFBZ7M.mjs.map +0 -1
- package/dist/chunk-3BK2Y7GY.mjs +0 -593
- package/dist/chunk-3BK2Y7GY.mjs.map +0 -1
- package/dist/chunk-4OOHFJHT.mjs +0 -421
- package/dist/chunk-4OOHFJHT.mjs.map +0 -1
- package/dist/chunk-4XHB7IHT.mjs +0 -809
- package/dist/chunk-4XHB7IHT.mjs.map +0 -1
- package/dist/chunk-6M2HSSTQ.mjs +0 -98
- package/dist/chunk-6M2HSSTQ.mjs.map +0 -1
- package/dist/chunk-7FI7SQS7.mjs +0 -135
- package/dist/chunk-7FI7SQS7.mjs.map +0 -1
- package/dist/chunk-ED57RCQE.mjs +0 -171
- package/dist/chunk-ED57RCQE.mjs.map +0 -1
- package/dist/chunk-FZN56HGQ.mjs +0 -626
- package/dist/chunk-FZN56HGQ.mjs.map +0 -1
- package/dist/chunk-GL4OOB25.mjs +0 -51
- package/dist/chunk-GL4OOB25.mjs.map +0 -1
- package/dist/chunk-KDG2NTDB.mjs +0 -137
- package/dist/chunk-KDG2NTDB.mjs.map +0 -1
- package/dist/chunk-NRBQWBDM.mjs +0 -191
- package/dist/chunk-NRBQWBDM.mjs.map +0 -1
- package/dist/chunk-O4V246GG.mjs +0 -2137
- package/dist/chunk-O4V246GG.mjs.map +0 -1
- package/dist/chunk-QT57H266.mjs +0 -163
- package/dist/chunk-QT57H266.mjs.map +0 -1
- package/dist/chunk-QX4RH25I.mjs +0 -141
- package/dist/chunk-QX4RH25I.mjs.map +0 -1
- package/dist/chunk-TB562PZX.mjs +0 -86
- package/dist/chunk-TB562PZX.mjs.map +0 -1
- package/dist/chunk-TDYPZXK5.mjs +0 -1
- package/dist/chunk-TDYPZXK5.mjs.map +0 -1
- package/dist/chunk-UJI4LN5P.mjs +0 -36
- package/dist/chunk-UJI4LN5P.mjs.map +0 -1
- package/dist/chunk-W6RTHQGP.mjs +0 -1
- package/dist/chunk-W6RTHQGP.mjs.map +0 -1
- package/dist/chunk-ZELBCPDC.mjs +0 -369
- package/dist/chunk-ZELBCPDC.mjs.map +0 -1
- package/dist/index.d.mts +0 -1696
- package/dist/resource-monitor-UZUGPIAU.mjs +0 -9
- package/dist/resource-monitor-UZUGPIAU.mjs.map +0 -1
- package/dist/storage-location-manager-HFNB3PCS.mjs +0 -7
- package/dist/storage-location-manager-HFNB3PCS.mjs.map +0 -1
|
@@ -1,733 +1,43 @@
|
|
|
1
|
-
|
|
2
|
-
|
|
3
|
-
|
|
4
|
-
var __getOwnPropDesc = Object.getOwnPropertyDescriptor;
|
|
5
|
-
var __getOwnPropNames = Object.getOwnPropertyNames;
|
|
6
|
-
var __getProtoOf = Object.getPrototypeOf;
|
|
7
|
-
var __hasOwnProp = Object.prototype.hasOwnProperty;
|
|
8
|
-
var __export = (target, all) => {
|
|
9
|
-
for (var name in all)
|
|
10
|
-
__defProp(target, name, { get: all[name], enumerable: true });
|
|
11
|
-
};
|
|
12
|
-
var __copyProps = (to, from, except, desc) => {
|
|
13
|
-
if (from && typeof from === "object" || typeof from === "function") {
|
|
14
|
-
for (let key of __getOwnPropNames(from))
|
|
15
|
-
if (!__hasOwnProp.call(to, key) && key !== except)
|
|
16
|
-
__defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable });
|
|
17
|
-
}
|
|
18
|
-
return to;
|
|
19
|
-
};
|
|
20
|
-
var __toESM = (mod, isNodeMode, target) => (target = mod != null ? __create(__getProtoOf(mod)) : {}, __copyProps(
|
|
21
|
-
// If the importer is in node compatibility mode or this is not an ESM
|
|
22
|
-
// file that has been converted to a CommonJS file using a Babel-
|
|
23
|
-
// compatible transform (i.e. "__esModule" has not been set), then set
|
|
24
|
-
// "default" to the CommonJS "module.exports" for node compatibility.
|
|
25
|
-
isNodeMode || !mod || !mod.__esModule ? __defProp(target, "default", { value: mod, enumerable: true }) : target,
|
|
26
|
-
mod
|
|
27
|
-
));
|
|
28
|
-
var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod);
|
|
29
|
-
|
|
30
|
-
// src/builtins/sqlite-storage/index.ts
|
|
31
|
-
var sqlite_storage_exports = {};
|
|
32
|
-
__export(sqlite_storage_exports, {
|
|
33
|
-
CORE_TABLE_DDL: () => CORE_TABLE_DDL,
|
|
34
|
-
ConfigStore: () => ConfigStore,
|
|
35
|
-
DeviceStore: () => DeviceStore,
|
|
36
|
-
FilesystemStorageAddon: () => FilesystemStorageAddon,
|
|
37
|
-
FilesystemStorageProvider: () => import_node2.FilesystemStorageProvider,
|
|
38
|
-
SettingsStore: () => SettingsStore,
|
|
39
|
-
SqliteSettingsAddon: () => SqliteSettingsAddon,
|
|
40
|
-
SqliteSettingsBackend: () => SqliteSettingsBackend,
|
|
41
|
-
addonTableToDdl: () => addonTableToDdl,
|
|
42
|
-
default: () => FilesystemStorageAddon
|
|
1
|
+
Object.defineProperties(exports, {
|
|
2
|
+
__esModule: { value: true },
|
|
3
|
+
[Symbol.toStringTag]: { value: "Module" }
|
|
43
4
|
});
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
constructor() {
|
|
53
|
-
super({ rootPath: "camstack-data" });
|
|
54
|
-
}
|
|
55
|
-
async onInitialize() {
|
|
56
|
-
const rootPath = this.ctx.addonConfig.rootPath ?? this.config.rootPath;
|
|
57
|
-
const overrides = {};
|
|
58
|
-
const addonCfg = this.ctx.addonConfig;
|
|
59
|
-
for (const key of Object.keys(addonCfg)) {
|
|
60
|
-
if (key.startsWith("override.")) {
|
|
61
|
-
const loc = key.slice("override.".length);
|
|
62
|
-
overrides[loc] = addonCfg[key];
|
|
63
|
-
}
|
|
64
|
-
}
|
|
65
|
-
this.provider = new import_node.FilesystemStorageProvider(rootPath, overrides);
|
|
66
|
-
this.ctx.logger.info("Filesystem storage initialized", { meta: { rootPath: this.provider.getRootPath() } });
|
|
67
|
-
return [{ capability: import_types.storageCapability, provider: this.provider }];
|
|
68
|
-
}
|
|
69
|
-
async onShutdown() {
|
|
70
|
-
this.provider = null;
|
|
71
|
-
}
|
|
72
|
-
getProvider() {
|
|
73
|
-
return this.provider;
|
|
74
|
-
}
|
|
75
|
-
};
|
|
76
|
-
|
|
77
|
-
// src/builtins/sqlite-storage/sqlite-settings-backend.ts
|
|
78
|
-
var import_better_sqlite3 = __toESM(require("better-sqlite3"));
|
|
79
|
-
var import_node_crypto = require("crypto");
|
|
80
|
-
var import_types2 = require("@camstack/types");
|
|
81
|
-
function parseRowData(raw) {
|
|
82
|
-
return (0, import_types2.asJsonObject)((0, import_types2.parseJsonUnknown)(raw)) ?? {};
|
|
83
|
-
}
|
|
84
|
-
var SqliteSettingsBackend = class _SqliteSettingsBackend {
|
|
85
|
-
// Domain schemas (auth, analytics events, …) live in the addons that
|
|
86
|
-
// own them — same pattern as `pipeline-analytics` (`event-store.ts`,
|
|
87
|
-
// `track-store.ts`, `media-store.ts`) and `local-auth` (`auth-schema.ts`).
|
|
88
|
-
// The backend exposes `declareCollection` and stays out of domain
|
|
89
|
-
// knowledge.
|
|
90
|
-
constructor(dbPath, runtimeDefaults) {
|
|
91
|
-
this.dbPath = dbPath;
|
|
92
|
-
this.runtimeDefaults = runtimeDefaults ?? {};
|
|
93
|
-
}
|
|
94
|
-
dbPath;
|
|
95
|
-
db = null;
|
|
96
|
-
structuredTables = /* @__PURE__ */ new Set();
|
|
97
|
-
/** Map from scoped collection name → set of column names (non-id) that
|
|
98
|
-
* the structured schema owns. Routes set/get/insert/update/query to
|
|
99
|
-
* typed columns. Every collection MUST be declared here before use. */
|
|
100
|
-
declaredCollections = /* @__PURE__ */ new Map();
|
|
101
|
-
runtimeDefaults;
|
|
102
|
-
/**
|
|
103
|
-
* Canonical key/value collections — declared with a `(id TEXT PK,
|
|
104
|
-
* data TEXT NOT NULL)` schema at boot so existing JSON-blob rows
|
|
105
|
-
* keep working through the structured path. Generates SQL identical
|
|
106
|
-
* to the previous legacy path; only the routing is unified.
|
|
107
|
-
*/
|
|
108
|
-
static CANONICAL_KV_COLLECTIONS = [
|
|
109
|
-
"system-settings",
|
|
110
|
-
"addon-settings",
|
|
111
|
-
"addon-device-settings",
|
|
112
|
-
"addon-devices",
|
|
113
|
-
"device-runtime-state",
|
|
114
|
-
"sections",
|
|
115
|
-
"provider-settings",
|
|
116
|
-
"device-settings",
|
|
117
|
-
"alerts"
|
|
118
|
-
];
|
|
119
|
-
async initialize() {
|
|
120
|
-
const dir = this.dbPath.substring(0, this.dbPath.lastIndexOf("/"));
|
|
121
|
-
if (dir) {
|
|
122
|
-
const fs = await import("fs");
|
|
123
|
-
fs.mkdirSync(dir, { recursive: true });
|
|
124
|
-
}
|
|
125
|
-
this.db = new import_better_sqlite3.default(this.dbPath);
|
|
126
|
-
this.db.pragma("journal_mode = WAL");
|
|
127
|
-
this.db.pragma("foreign_keys = ON");
|
|
128
|
-
for (const collection of _SqliteSettingsBackend.CANONICAL_KV_COLLECTIONS) {
|
|
129
|
-
await this.ensureTable(collection, {
|
|
130
|
-
columns: [
|
|
131
|
-
{ name: "id", type: "TEXT", primaryKey: true, notNull: true },
|
|
132
|
-
{ name: "data", type: "TEXT", notNull: true }
|
|
133
|
-
]
|
|
134
|
-
});
|
|
135
|
-
this.declaredCollections.set(collection, {
|
|
136
|
-
primaryKey: "id",
|
|
137
|
-
columns: /* @__PURE__ */ new Set(["data"])
|
|
138
|
-
});
|
|
139
|
-
}
|
|
140
|
-
const isEmpty = await this.isEmpty({ collection: "system-settings" });
|
|
141
|
-
if (isEmpty) {
|
|
142
|
-
await this.seedDefaults();
|
|
143
|
-
}
|
|
144
|
-
}
|
|
145
|
-
requireDeclared(scoped) {
|
|
146
|
-
const decl = this.declaredCollections.get(scoped);
|
|
147
|
-
if (!decl) {
|
|
148
|
-
throw new Error(`SqliteSettingsBackend: collection "${scoped}" is not declared. Call declareCollection() first or add it to CANONICAL_KV_COLLECTIONS.`);
|
|
149
|
-
}
|
|
150
|
-
return decl;
|
|
151
|
-
}
|
|
152
|
-
async shutdown() {
|
|
153
|
-
this.db?.close();
|
|
154
|
-
this.db = null;
|
|
155
|
-
}
|
|
156
|
-
// ---------------------------------------------------------------------------
|
|
157
|
-
// ISettingsBackend implementation
|
|
158
|
-
// ---------------------------------------------------------------------------
|
|
159
|
-
async get({ namespace, collection, key }) {
|
|
160
|
-
const scoped = this.scopedName(namespace, collection);
|
|
161
|
-
const decl = this.requireDeclared(scoped);
|
|
162
|
-
const cols = [`"${decl.primaryKey}"`, ...[...decl.columns].map((c) => `"${c}"`)].join(", ");
|
|
163
|
-
const row = this.getDb().prepare(`SELECT ${cols} FROM "${scoped}" WHERE "${decl.primaryKey}" = ?`).get(key);
|
|
164
|
-
if (!row) return void 0;
|
|
165
|
-
if (decl.columns.size === 1 && decl.columns.has("data")) {
|
|
166
|
-
const raw = row["data"];
|
|
167
|
-
return typeof raw === "string" ? JSON.parse(raw) : raw;
|
|
168
|
-
}
|
|
169
|
-
const data = {};
|
|
170
|
-
for (const c of decl.columns) {
|
|
171
|
-
const v = row[c];
|
|
172
|
-
if (typeof v === "string" && (v.startsWith("{") || v.startsWith("["))) {
|
|
173
|
-
try {
|
|
174
|
-
data[c] = JSON.parse(v);
|
|
175
|
-
} catch {
|
|
176
|
-
data[c] = v;
|
|
177
|
-
}
|
|
178
|
-
} else {
|
|
179
|
-
data[c] = v ?? null;
|
|
180
|
-
}
|
|
181
|
-
}
|
|
182
|
-
return data;
|
|
183
|
-
}
|
|
184
|
-
async set({ namespace, collection, key, value }) {
|
|
185
|
-
const scoped = this.scopedName(namespace, collection);
|
|
186
|
-
const decl = this.requireDeclared(scoped);
|
|
187
|
-
const row = { [decl.primaryKey]: key };
|
|
188
|
-
if (decl.columns.size === 1 && decl.columns.has("data")) {
|
|
189
|
-
row["data"] = JSON.stringify(value);
|
|
190
|
-
} else {
|
|
191
|
-
const valueObj = value !== null && typeof value === "object" ? value : {};
|
|
192
|
-
for (const [k, v] of Object.entries(valueObj)) {
|
|
193
|
-
if (decl.columns.has(k)) row[k] = this.serializeColumnValue(v);
|
|
194
|
-
}
|
|
195
|
-
}
|
|
196
|
-
const keys = Object.keys(row);
|
|
197
|
-
const cols = keys.map((k) => `"${k}"`).join(", ");
|
|
198
|
-
const placeholders = keys.map(() => "?").join(", ");
|
|
199
|
-
const updates = keys.filter((k) => k !== decl.primaryKey).map((k) => `"${k}" = excluded."${k}"`).join(", ");
|
|
200
|
-
const values = keys.map((k) => row[k]);
|
|
201
|
-
const sql = updates.length > 0 ? `INSERT INTO "${scoped}" (${cols}) VALUES (${placeholders}) ON CONFLICT("${decl.primaryKey}") DO UPDATE SET ${updates}` : `INSERT INTO "${scoped}" (${cols}) VALUES (${placeholders}) ON CONFLICT("${decl.primaryKey}") DO NOTHING`;
|
|
202
|
-
this.getDb().prepare(sql).run(...values);
|
|
203
|
-
}
|
|
204
|
-
async query({ namespace, collection, filter }) {
|
|
205
|
-
const scoped = this.scopedName(namespace, collection);
|
|
206
|
-
const decl = this.requireDeclared(scoped);
|
|
207
|
-
return this.queryDeclared(scoped, decl, filter);
|
|
208
|
-
}
|
|
209
|
-
async insert({ namespace, collection, record }) {
|
|
210
|
-
const scoped = this.scopedName(namespace, collection);
|
|
211
|
-
const decl = this.requireDeclared(scoped);
|
|
212
|
-
const id = record.id || (0, import_node_crypto.randomUUID)();
|
|
213
|
-
const row = { [decl.primaryKey]: id };
|
|
214
|
-
if (decl.columns.size === 1 && decl.columns.has("data")) {
|
|
215
|
-
row["data"] = JSON.stringify(record.data);
|
|
216
|
-
} else {
|
|
217
|
-
for (const [k, v] of Object.entries(record.data)) {
|
|
218
|
-
if (decl.columns.has(k)) row[k] = this.serializeColumnValue(v);
|
|
219
|
-
}
|
|
220
|
-
}
|
|
221
|
-
await this.tableInsert(scoped, row);
|
|
222
|
-
}
|
|
223
|
-
async update({ namespace, collection, id, data }) {
|
|
224
|
-
const scoped = this.scopedName(namespace, collection);
|
|
225
|
-
const decl = this.requireDeclared(scoped);
|
|
226
|
-
const updates = {};
|
|
227
|
-
if (decl.columns.size === 1 && decl.columns.has("data")) {
|
|
228
|
-
updates["data"] = JSON.stringify(data);
|
|
229
|
-
} else {
|
|
230
|
-
for (const [k, v] of Object.entries(data)) {
|
|
231
|
-
if (decl.columns.has(k)) updates[k] = this.serializeColumnValue(v);
|
|
232
|
-
}
|
|
233
|
-
}
|
|
234
|
-
if (Object.keys(updates).length > 0) {
|
|
235
|
-
await this.tableUpdate(scoped, { [decl.primaryKey]: id }, updates);
|
|
236
|
-
}
|
|
237
|
-
}
|
|
238
|
-
async delete({ namespace, collection, key }) {
|
|
239
|
-
const scoped = this.scopedName(namespace, collection);
|
|
240
|
-
const decl = this.requireDeclared(scoped);
|
|
241
|
-
await this.tableDelete(scoped, { [decl.primaryKey]: key });
|
|
242
|
-
}
|
|
243
|
-
async count({ namespace, collection, filter }) {
|
|
244
|
-
const scoped = this.scopedName(namespace, collection);
|
|
245
|
-
const decl = this.requireDeclared(scoped);
|
|
246
|
-
const isKvShape = decl.columns.size === 1 && decl.columns.has("data");
|
|
247
|
-
const isColumn = (f) => f === decl.primaryKey || decl.columns.has(f);
|
|
248
|
-
const fieldExpr = (f) => {
|
|
249
|
-
if (isColumn(f)) return `"${f}"`;
|
|
250
|
-
if (isKvShape) return `json_extract("data", '$.${f}')`;
|
|
251
|
-
return "";
|
|
252
|
-
};
|
|
253
|
-
let sql = `SELECT COUNT(*) AS cnt FROM "${scoped}"`;
|
|
254
|
-
const params = [];
|
|
255
|
-
if (filter?.where) {
|
|
256
|
-
const clauses = [];
|
|
257
|
-
for (const [field, value] of Object.entries(filter.where)) {
|
|
258
|
-
const expr = fieldExpr(field);
|
|
259
|
-
if (!expr) continue;
|
|
260
|
-
clauses.push(`${expr} = ?`);
|
|
261
|
-
params.push(this.serializeColumnValue(value));
|
|
262
|
-
}
|
|
263
|
-
if (clauses.length > 0) sql += ` WHERE ${clauses.join(" AND ")}`;
|
|
264
|
-
}
|
|
265
|
-
const row = this.getDb().prepare(sql).get(...params);
|
|
266
|
-
return row?.cnt ?? 0;
|
|
267
|
-
}
|
|
268
|
-
async isEmpty({ namespace, collection }) {
|
|
269
|
-
const scoped = this.scopedName(namespace, collection);
|
|
270
|
-
this.requireDeclared(scoped);
|
|
271
|
-
return await this.tableCount(scoped) === 0;
|
|
272
|
-
}
|
|
273
|
-
async queryDeclared(table, decl, filter) {
|
|
274
|
-
const isKvShape = decl.columns.size === 1 && decl.columns.has("data");
|
|
275
|
-
const cols = [`"${decl.primaryKey}"`, ...[...decl.columns].map((c) => `"${c}"`)].join(", ");
|
|
276
|
-
let sql = `SELECT ${cols} FROM "${table}"`;
|
|
277
|
-
const params = [];
|
|
278
|
-
const whereClauses = [];
|
|
279
|
-
const isColumn = (f) => f === decl.primaryKey || decl.columns.has(f);
|
|
280
|
-
const fieldExpr = (f) => {
|
|
281
|
-
if (isColumn(f)) return `"${f}"`;
|
|
282
|
-
if (isKvShape) return `json_extract("data", '$.${f}')`;
|
|
283
|
-
return "";
|
|
284
|
-
};
|
|
285
|
-
if (filter?.where) {
|
|
286
|
-
for (const [field, value] of Object.entries(filter.where)) {
|
|
287
|
-
const expr = fieldExpr(field);
|
|
288
|
-
if (!expr) continue;
|
|
289
|
-
whereClauses.push(`${expr} = ?`);
|
|
290
|
-
params.push(this.serializeColumnValue(value));
|
|
291
|
-
}
|
|
292
|
-
}
|
|
293
|
-
if (filter?.whereIn) {
|
|
294
|
-
for (const [field, values] of Object.entries(filter.whereIn)) {
|
|
295
|
-
const expr = fieldExpr(field);
|
|
296
|
-
if (!expr) continue;
|
|
297
|
-
const placeholders = values.map(() => "?").join(", ");
|
|
298
|
-
whereClauses.push(`${expr} IN (${placeholders})`);
|
|
299
|
-
for (const v of values) params.push(this.serializeColumnValue(v));
|
|
300
|
-
}
|
|
301
|
-
}
|
|
302
|
-
if (filter?.whereBetween) {
|
|
303
|
-
for (const [field, [low, high]] of Object.entries(filter.whereBetween)) {
|
|
304
|
-
const expr = fieldExpr(field);
|
|
305
|
-
if (!expr) continue;
|
|
306
|
-
whereClauses.push(`${expr} BETWEEN ? AND ?`);
|
|
307
|
-
params.push(this.serializeColumnValue(low), this.serializeColumnValue(high));
|
|
308
|
-
}
|
|
309
|
-
}
|
|
310
|
-
if (whereClauses.length > 0) sql += ` WHERE ${whereClauses.join(" AND ")}`;
|
|
311
|
-
if (filter?.orderBy) {
|
|
312
|
-
const expr = fieldExpr(filter.orderBy.field);
|
|
313
|
-
if (expr) {
|
|
314
|
-
const dir = filter.orderBy.direction === "desc" ? "DESC" : "ASC";
|
|
315
|
-
sql += ` ORDER BY ${expr} ${dir}`;
|
|
316
|
-
}
|
|
317
|
-
}
|
|
318
|
-
if (filter?.limit !== void 0) {
|
|
319
|
-
sql += ` LIMIT ?`;
|
|
320
|
-
params.push(filter.limit);
|
|
321
|
-
}
|
|
322
|
-
if (filter?.offset !== void 0) {
|
|
323
|
-
sql += ` OFFSET ?`;
|
|
324
|
-
params.push(filter.offset);
|
|
325
|
-
}
|
|
326
|
-
const rows = this.getDb().prepare(sql).all(...params);
|
|
327
|
-
return rows.map((r) => {
|
|
328
|
-
const id = String(r[decl.primaryKey] ?? "");
|
|
329
|
-
if (isKvShape) {
|
|
330
|
-
const v = r["data"];
|
|
331
|
-
if (typeof v === "string" && (v.startsWith("{") || v.startsWith("["))) {
|
|
332
|
-
try {
|
|
333
|
-
return { id, data: JSON.parse(v) };
|
|
334
|
-
} catch {
|
|
335
|
-
return { id, data: { value: v } };
|
|
336
|
-
}
|
|
337
|
-
}
|
|
338
|
-
return { id, data: v == null ? {} : { value: v } };
|
|
339
|
-
}
|
|
340
|
-
const data = { [decl.primaryKey]: r[decl.primaryKey] ?? null };
|
|
341
|
-
for (const c of decl.columns) {
|
|
342
|
-
const v = r[c];
|
|
343
|
-
if (typeof v === "string" && (v.startsWith("{") || v.startsWith("["))) {
|
|
344
|
-
try {
|
|
345
|
-
data[c] = JSON.parse(v);
|
|
346
|
-
} catch {
|
|
347
|
-
data[c] = v;
|
|
348
|
-
}
|
|
349
|
-
} else {
|
|
350
|
-
data[c] = v ?? null;
|
|
351
|
-
}
|
|
352
|
-
}
|
|
353
|
-
return { id, data };
|
|
354
|
-
});
|
|
355
|
-
}
|
|
356
|
-
// ---------------------------------------------------------------------------
|
|
357
|
-
// Legacy SettingsStore compatibility (used by ConfigManager.setSettingsStore)
|
|
358
|
-
// ---------------------------------------------------------------------------
|
|
359
|
-
/** Get a system setting by dot-notation key */
|
|
360
|
-
getSystem(key) {
|
|
361
|
-
this.requireDeclared("system-settings");
|
|
362
|
-
const row = this.getDb().prepare('SELECT data FROM "system-settings" WHERE id = ?').get(key);
|
|
363
|
-
if (!row) return void 0;
|
|
364
|
-
return JSON.parse(row.data);
|
|
365
|
-
}
|
|
366
|
-
/** Set a system setting */
|
|
367
|
-
setSystem(key, value) {
|
|
368
|
-
this.requireDeclared("system-settings");
|
|
369
|
-
this.getDb().prepare('INSERT INTO "system-settings" (id, data) VALUES (?, ?) ON CONFLICT(id) DO UPDATE SET data = excluded.data').run(key, JSON.stringify(value));
|
|
370
|
-
}
|
|
371
|
-
/** Get all system settings as flat key-value */
|
|
372
|
-
getAllSystem() {
|
|
373
|
-
this.requireDeclared("system-settings");
|
|
374
|
-
const rows = this.getDb().prepare('SELECT id, data FROM "system-settings"').all();
|
|
375
|
-
return Object.fromEntries(rows.map((r) => [r.id, JSON.parse(r.data)]));
|
|
376
|
-
}
|
|
377
|
-
/** Get all settings for an addon */
|
|
378
|
-
getAllAddon(addonId) {
|
|
379
|
-
this.requireDeclared("addon-settings");
|
|
380
|
-
const rows = this.getDb().prepare(`SELECT id, data FROM "addon-settings" WHERE json_extract(data, '$.addonId') = ?`).all(addonId);
|
|
381
|
-
if (rows.length === 0) return {};
|
|
382
|
-
const result = {};
|
|
383
|
-
for (const row of rows) {
|
|
384
|
-
const parsed = parseRowData(row.data);
|
|
385
|
-
const key = row.id.startsWith(`${addonId}.`) ? row.id.slice(addonId.length + 1) : row.id;
|
|
386
|
-
const isWrapper = parsed !== null && typeof parsed === "object" && "addonId" in parsed && "key" in parsed;
|
|
387
|
-
if (isWrapper) {
|
|
388
|
-
const wrapper = parsed;
|
|
389
|
-
if ("value" in wrapper) {
|
|
390
|
-
result[key] = wrapper.value;
|
|
391
|
-
}
|
|
392
|
-
} else {
|
|
393
|
-
result[key] = parsed;
|
|
394
|
-
}
|
|
395
|
-
}
|
|
396
|
-
return result;
|
|
397
|
-
}
|
|
398
|
-
/** Bulk-set all settings for an addon */
|
|
399
|
-
setAllAddon(addonId, config) {
|
|
400
|
-
this.requireDeclared("addon-settings");
|
|
401
|
-
const db = this.getDb();
|
|
402
|
-
const deleteStmt = db.prepare(`DELETE FROM "addon-settings" WHERE id LIKE ? || '%'`);
|
|
403
|
-
const insertStmt = db.prepare('INSERT INTO "addon-settings" (id, data) VALUES (?, ?)');
|
|
404
|
-
db.transaction(() => {
|
|
405
|
-
deleteStmt.run(`${addonId}.`);
|
|
406
|
-
for (const [key, value] of Object.entries(config)) {
|
|
407
|
-
if (value === void 0) continue;
|
|
408
|
-
insertStmt.run(`${addonId}.${key}`, JSON.stringify({ addonId, key, value }));
|
|
409
|
-
}
|
|
410
|
-
})();
|
|
411
|
-
}
|
|
412
|
-
/** Get all settings for a provider */
|
|
413
|
-
getAllProvider(providerId) {
|
|
414
|
-
return this.getAllScoped("provider-settings", providerId);
|
|
415
|
-
}
|
|
416
|
-
/** Set a provider setting */
|
|
417
|
-
setProvider(providerId, key, value) {
|
|
418
|
-
this.setScopedKey("provider-settings", providerId, key, value);
|
|
419
|
-
}
|
|
420
|
-
/** Get all settings for a device */
|
|
421
|
-
getAllDevice(deviceId) {
|
|
422
|
-
return this.getAllScoped("device-settings", deviceId);
|
|
423
|
-
}
|
|
424
|
-
/** Set a device setting */
|
|
425
|
-
setDevice(deviceId, key, value) {
|
|
426
|
-
this.setScopedKey("device-settings", deviceId, key, value);
|
|
427
|
-
}
|
|
428
|
-
// ── Addon-device settings (per-device overrides of an addon's config) ──
|
|
429
|
-
//
|
|
430
|
-
// Storage key format: "<addonId>:<deviceId>.<field>" inside the
|
|
431
|
-
// "addon-device-settings" collection. Uses the same JSON-blob layout
|
|
432
|
-
// as the other scoped collections so no schema change is required.
|
|
433
|
-
getAddonDevice(addonId, deviceId) {
|
|
434
|
-
return this.getAllScoped("addon-device-settings", `${addonId}:${deviceId}`);
|
|
435
|
-
}
|
|
436
|
-
setAddonDevice(addonId, deviceId, values) {
|
|
437
|
-
this.requireDeclared("addon-device-settings");
|
|
438
|
-
const db = this.getDb();
|
|
439
|
-
const prefix = `${addonId}:${deviceId}.`;
|
|
440
|
-
const deleteStmt = db.prepare(`DELETE FROM "addon-device-settings" WHERE id LIKE ? || '%'`);
|
|
441
|
-
const insertStmt = db.prepare(
|
|
442
|
-
`INSERT INTO "addon-device-settings" (id, data) VALUES (?, ?)
|
|
443
|
-
ON CONFLICT(id) DO UPDATE SET data = excluded.data`
|
|
444
|
-
);
|
|
445
|
-
db.transaction(() => {
|
|
446
|
-
deleteStmt.run(prefix);
|
|
447
|
-
for (const [key, value] of Object.entries(values)) {
|
|
448
|
-
insertStmt.run(
|
|
449
|
-
`${prefix}${key}`,
|
|
450
|
-
JSON.stringify({ addonId, deviceId, key, value })
|
|
451
|
-
);
|
|
452
|
-
}
|
|
453
|
-
})();
|
|
454
|
-
}
|
|
455
|
-
clearAddonDevice(addonId, deviceId) {
|
|
456
|
-
this.requireDeclared("addon-device-settings");
|
|
457
|
-
const prefix = `${addonId}:${deviceId}.`;
|
|
458
|
-
this.getDb().prepare(`DELETE FROM "addon-device-settings" WHERE id LIKE ? || '%'`).run(prefix);
|
|
459
|
-
}
|
|
460
|
-
/** Seed system-settings with runtime defaults (first boot) */
|
|
461
|
-
async seedDefaults() {
|
|
462
|
-
this.requireDeclared("system-settings");
|
|
463
|
-
const insert = this.getDb().prepare(
|
|
464
|
-
'INSERT OR IGNORE INTO "system-settings" (id, data) VALUES (?, ?)'
|
|
465
|
-
);
|
|
466
|
-
this.getDb().transaction(() => {
|
|
467
|
-
for (const [key, value] of Object.entries(this.runtimeDefaults)) {
|
|
468
|
-
insert.run(key, JSON.stringify(value));
|
|
469
|
-
}
|
|
470
|
-
})();
|
|
471
|
-
}
|
|
472
|
-
// ---------------------------------------------------------------------------
|
|
473
|
-
// Private helpers
|
|
474
|
-
// ---------------------------------------------------------------------------
|
|
475
|
-
/**
|
|
476
|
-
* Expose the raw better-sqlite3 Database instance for components that
|
|
477
|
-
* need direct SQL access (e.g. DeviceStore, ConfigStore).
|
|
478
|
-
* Returns null if the backend has not been initialized yet.
|
|
479
|
-
*/
|
|
480
|
-
getDatabase() {
|
|
481
|
-
return this.db;
|
|
482
|
-
}
|
|
483
|
-
getDb() {
|
|
484
|
-
if (!this.db) throw new Error("SqliteSettingsBackend not initialized \u2014 call initialize() first");
|
|
485
|
-
return this.db;
|
|
486
|
-
}
|
|
487
|
-
getAllScoped(collection, scopeId) {
|
|
488
|
-
this.requireDeclared(collection);
|
|
489
|
-
const rows = this.getDb().prepare(`SELECT id, data FROM "${collection}" WHERE id LIKE ? || '.%'`).all(scopeId);
|
|
490
|
-
const result = {};
|
|
491
|
-
for (const row of rows) {
|
|
492
|
-
const key = row.id.slice(scopeId.length + 1);
|
|
493
|
-
const parsed = parseRowData(row.data);
|
|
494
|
-
result[key] = parsed.value ?? parsed;
|
|
495
|
-
}
|
|
496
|
-
return result;
|
|
497
|
-
}
|
|
498
|
-
setScopedKey(collection, scopeId, key, value) {
|
|
499
|
-
this.requireDeclared(collection);
|
|
500
|
-
this.getDb().prepare(`INSERT INTO "${collection}" (id, data) VALUES (?, ?) ON CONFLICT(id) DO UPDATE SET data = excluded.data`).run(`${scopeId}.${key}`, JSON.stringify({ scopeId, key, value }));
|
|
501
|
-
}
|
|
502
|
-
// ── Declared collections (typed SQL tables behind the generic cap) ──
|
|
503
|
-
scopedName(namespace, collection) {
|
|
504
|
-
return namespace ? `${namespace}:${collection}` : collection;
|
|
505
|
-
}
|
|
506
|
-
async declareCollection(input) {
|
|
507
|
-
const table = this.scopedName(input.namespace, input.collection);
|
|
508
|
-
if (this.declaredCollections.has(table)) return;
|
|
509
|
-
const hasId = input.columns.some((c) => c.primaryKey === true);
|
|
510
|
-
const columns = hasId ? input.columns : [{ name: "id", type: "TEXT", primaryKey: true, notNull: true }, ...input.columns];
|
|
511
|
-
const schema = {
|
|
512
|
-
columns: columns.map((c) => ({
|
|
513
|
-
name: c.name,
|
|
514
|
-
// SQLite treats JSON as TEXT; we serialize object values on write
|
|
515
|
-
// and parse on read.
|
|
516
|
-
type: c.type === "JSON" ? "TEXT" : c.type,
|
|
517
|
-
...c.primaryKey !== void 0 ? { primaryKey: c.primaryKey } : {},
|
|
518
|
-
...c.notNull !== void 0 ? { notNull: c.notNull } : {},
|
|
519
|
-
...c.unique !== void 0 ? { unique: c.unique } : {}
|
|
520
|
-
})),
|
|
521
|
-
...input.indexes ? { indexes: input.indexes.map((i) => ({
|
|
522
|
-
name: i.name,
|
|
523
|
-
columns: i.columns,
|
|
524
|
-
...i.unique !== void 0 ? { unique: i.unique } : {}
|
|
525
|
-
})) } : {}
|
|
526
|
-
};
|
|
527
|
-
await this.ensureTable(table, schema);
|
|
528
|
-
const pkCol = columns.find((c) => c.primaryKey === true);
|
|
529
|
-
const primaryKey = pkCol ? pkCol.name : "id";
|
|
530
|
-
const columnNames = new Set(columns.filter((c) => c.name !== primaryKey).map((c) => c.name));
|
|
531
|
-
this.declaredCollections.set(table, { primaryKey, columns: columnNames });
|
|
532
|
-
}
|
|
533
|
-
/** Serialise per-column values for SQL binding: objects → JSON, booleans → 0/1. */
|
|
534
|
-
serializeColumnValue(v) {
|
|
535
|
-
if (v === null || v === void 0) return v ?? null;
|
|
536
|
-
if (typeof v === "boolean") return v ? 1 : 0;
|
|
537
|
-
if (typeof v === "object") return JSON.stringify(v);
|
|
538
|
-
return v;
|
|
539
|
-
}
|
|
540
|
-
// ── Structured table operations ────────────────────────────────────
|
|
541
|
-
async ensureTable(table, schema) {
|
|
542
|
-
if (this.structuredTables.has(table)) return;
|
|
543
|
-
const colDefs = schema.columns.map((col) => {
|
|
544
|
-
const parts = [`"${col.name}" ${col.type}`];
|
|
545
|
-
if (col.primaryKey) parts.push("PRIMARY KEY");
|
|
546
|
-
if (col.notNull) parts.push("NOT NULL");
|
|
547
|
-
if (col.unique) parts.push("UNIQUE");
|
|
548
|
-
if (col.defaultValue !== void 0) {
|
|
549
|
-
parts.push(`DEFAULT ${typeof col.defaultValue === "string" ? `'${col.defaultValue}'` : col.defaultValue === null ? "NULL" : String(col.defaultValue)}`);
|
|
550
|
-
}
|
|
551
|
-
return parts.join(" ");
|
|
552
|
-
});
|
|
553
|
-
const existingCols = this.getDb().prepare(`PRAGMA table_info("${table}")`).all();
|
|
554
|
-
if (existingCols.length > 0) {
|
|
555
|
-
const existingNames = new Set(existingCols.map((c) => c.name));
|
|
556
|
-
const declaredNames = new Set(schema.columns.map((c) => c.name));
|
|
557
|
-
const missingDeclared = schema.columns.some((c) => !existingNames.has(c.name));
|
|
558
|
-
const isLegacyKv = existingCols.length <= 2 && existingNames.has("data") && !declaredNames.has("data");
|
|
559
|
-
if (isLegacyKv || missingDeclared) {
|
|
560
|
-
try {
|
|
561
|
-
this.getDb().exec(`DROP TABLE "${table}"`);
|
|
562
|
-
} catch {
|
|
563
|
-
}
|
|
564
|
-
}
|
|
565
|
-
}
|
|
566
|
-
this.getDb().exec(`CREATE TABLE IF NOT EXISTS "${table}" (${colDefs.join(", ")})`);
|
|
567
|
-
if (schema.indexes) {
|
|
568
|
-
for (const idx of schema.indexes) {
|
|
569
|
-
const unique = idx.unique ? "UNIQUE " : "";
|
|
570
|
-
const cols = idx.columns.map((c) => `"${c}"`).join(", ");
|
|
571
|
-
this.getDb().exec(`CREATE ${unique}INDEX IF NOT EXISTS "${idx.name}" ON "${table}" (${cols})`);
|
|
572
|
-
}
|
|
573
|
-
}
|
|
574
|
-
this.structuredTables.add(table);
|
|
575
|
-
}
|
|
576
|
-
async tableInsert(table, row) {
|
|
577
|
-
const keys = Object.keys(row);
|
|
578
|
-
const cols = keys.map((k) => `"${k}"`).join(", ");
|
|
579
|
-
const placeholders = keys.map(() => "?").join(", ");
|
|
580
|
-
const values = keys.map((k) => {
|
|
581
|
-
const v = row[k];
|
|
582
|
-
return typeof v === "object" && v !== null ? JSON.stringify(v) : v;
|
|
583
|
-
});
|
|
584
|
-
this.getDb().prepare(`INSERT INTO "${table}" (${cols}) VALUES (${placeholders})`).run(...values);
|
|
585
|
-
}
|
|
586
|
-
async tableUpdate(table, filter, updates) {
|
|
587
|
-
const setClauses = [];
|
|
588
|
-
const setValues = [];
|
|
589
|
-
for (const [k, v] of Object.entries(updates)) {
|
|
590
|
-
setClauses.push(`"${k}" = ?`);
|
|
591
|
-
setValues.push(typeof v === "object" && v !== null ? JSON.stringify(v) : v);
|
|
592
|
-
}
|
|
593
|
-
const { whereSql, whereValues } = this.buildWhere(filter);
|
|
594
|
-
const result = this.getDb().prepare(`UPDATE "${table}" SET ${setClauses.join(", ")}${whereSql}`).run(...setValues, ...whereValues);
|
|
595
|
-
return result.changes;
|
|
596
|
-
}
|
|
597
|
-
async tableDelete(table, filter) {
|
|
598
|
-
const { whereSql, whereValues } = this.buildWhere(filter);
|
|
599
|
-
const result = this.getDb().prepare(`DELETE FROM "${table}"${whereSql}`).run(...whereValues);
|
|
600
|
-
return result.changes;
|
|
601
|
-
}
|
|
602
|
-
async tableQuery(table, options) {
|
|
603
|
-
let sql = `SELECT * FROM "${table}"`;
|
|
604
|
-
const values = [];
|
|
605
|
-
if (options?.where) {
|
|
606
|
-
const { whereSql, whereValues } = this.buildWhere(options.where);
|
|
607
|
-
sql += whereSql;
|
|
608
|
-
values.push(...whereValues);
|
|
609
|
-
}
|
|
610
|
-
if (options?.orderBy) {
|
|
611
|
-
sql += ` ORDER BY "${options.orderBy.field}" ${options.orderBy.direction === "desc" ? "DESC" : "ASC"}`;
|
|
612
|
-
}
|
|
613
|
-
if (options?.limit !== void 0) {
|
|
614
|
-
sql += ` LIMIT ?`;
|
|
615
|
-
values.push(options.limit);
|
|
616
|
-
}
|
|
617
|
-
if (options?.offset !== void 0) {
|
|
618
|
-
sql += ` OFFSET ?`;
|
|
619
|
-
values.push(options.offset);
|
|
620
|
-
}
|
|
621
|
-
const rows = this.getDb().prepare(sql).all(...values);
|
|
622
|
-
return rows.flatMap((r) => (0, import_types2.asJsonObject)(r) ? [(0, import_types2.asJsonObject)(r)] : []);
|
|
623
|
-
}
|
|
624
|
-
async tableGet(table, filter) {
|
|
625
|
-
const { whereSql, whereValues } = this.buildWhere(filter);
|
|
626
|
-
const row = this.getDb().prepare(`SELECT * FROM "${table}"${whereSql} LIMIT 1`).get(...whereValues);
|
|
627
|
-
return (0, import_types2.asJsonObject)(row);
|
|
628
|
-
}
|
|
629
|
-
async tableCount(table, filter) {
|
|
630
|
-
let sql = `SELECT COUNT(*) as count FROM "${table}"`;
|
|
631
|
-
const values = [];
|
|
632
|
-
if (filter) {
|
|
633
|
-
const { whereSql, whereValues } = this.buildWhere(filter);
|
|
634
|
-
sql += whereSql;
|
|
635
|
-
values.push(...whereValues);
|
|
636
|
-
}
|
|
637
|
-
const row = (0, import_types2.asJsonObject)(this.getDb().prepare(sql).get(...values));
|
|
638
|
-
return typeof row?.count === "number" ? row.count : 0;
|
|
639
|
-
}
|
|
640
|
-
buildWhere(filter) {
|
|
641
|
-
const conditions = [];
|
|
642
|
-
const values = [];
|
|
643
|
-
for (const [k, v] of Object.entries(filter)) {
|
|
644
|
-
conditions.push(`"${k}" = ?`);
|
|
645
|
-
values.push(typeof v === "object" && v !== null ? JSON.stringify(v) : v);
|
|
646
|
-
}
|
|
647
|
-
const whereSql = conditions.length > 0 ? ` WHERE ${conditions.join(" AND ")}` : "";
|
|
648
|
-
return { whereSql, whereValues: values };
|
|
649
|
-
}
|
|
650
|
-
};
|
|
651
|
-
|
|
652
|
-
// src/builtins/sqlite-storage/sqlite-settings.addon.ts
|
|
653
|
-
var import_types3 = require("@camstack/types");
|
|
654
|
-
var SqliteSettingsAddon = class extends import_types3.BaseAddon {
|
|
655
|
-
backend = null;
|
|
656
|
-
constructor() {
|
|
657
|
-
super({});
|
|
658
|
-
}
|
|
659
|
-
async onInitialize() {
|
|
660
|
-
const addonId = this.ctx.id.replace("addon:", "");
|
|
661
|
-
let pathSource = "fallback (hardcoded)";
|
|
662
|
-
const dbPath = await this.ctx.api.storage.resolve.query({ location: "addons-data", relativePath: `${addonId}/camstack.db` }).then((p) => {
|
|
663
|
-
pathSource = "storage capability (addons-data)";
|
|
664
|
-
return p;
|
|
665
|
-
}).catch(() => {
|
|
666
|
-
if (this.ctx.dataDir) {
|
|
667
|
-
pathSource = "dataDir";
|
|
668
|
-
return `${this.ctx.dataDir}/camstack.db`;
|
|
669
|
-
}
|
|
670
|
-
return "camstack-data/addons-data/sqlite-settings/camstack.db";
|
|
671
|
-
});
|
|
672
|
-
let dbExists = false;
|
|
673
|
-
try {
|
|
674
|
-
const fs = await import("fs");
|
|
675
|
-
dbExists = fs.existsSync(dbPath);
|
|
676
|
-
} catch (err) {
|
|
677
|
-
this.ctx.logger.warn("Failed to check DB file existence", { meta: { error: (0, import_types3.errMsg)(err) } });
|
|
678
|
-
}
|
|
679
|
-
this.ctx.logger.info("DB path resolved", { meta: { pathSource, dbPath } });
|
|
680
|
-
this.ctx.logger.info("DB file status", { meta: { dbExists } });
|
|
681
|
-
this.backend = new SqliteSettingsBackend(dbPath, { ...import_types3.RUNTIME_DEFAULTS });
|
|
682
|
-
await this.backend.initialize();
|
|
683
|
-
this.ctx.logger.info("Initialized successfully");
|
|
684
|
-
return [{ capability: import_types3.settingsStoreCapability, provider: this.backend }];
|
|
685
|
-
}
|
|
686
|
-
async onShutdown() {
|
|
687
|
-
await this.backend?.shutdown();
|
|
688
|
-
}
|
|
689
|
-
getBackend() {
|
|
690
|
-
return this.backend;
|
|
691
|
-
}
|
|
692
|
-
};
|
|
693
|
-
|
|
694
|
-
// src/builtins/sqlite-storage/settings-store.ts
|
|
695
|
-
var import_better_sqlite32 = __toESM(require("better-sqlite3"));
|
|
696
|
-
|
|
697
|
-
// src/builtins/sqlite-storage/sql-schema.ts
|
|
5
|
+
const require_chunk = require("../../chunk-C13QxCFV.js");
|
|
6
|
+
const require_builtins_sqlite_storage_filesystem_storage_addon = require("./filesystem-storage.addon.js");
|
|
7
|
+
const require_builtins_sqlite_storage_sqlite_settings_addon = require("./sqlite-settings.addon.js");
|
|
8
|
+
let _camstack_types = require("@camstack/types");
|
|
9
|
+
let better_sqlite3 = require("better-sqlite3");
|
|
10
|
+
better_sqlite3 = require_chunk.__toESM(better_sqlite3);
|
|
11
|
+
//#region src/builtins/sqlite-storage/sql-schema.ts
|
|
12
|
+
/** Core table DDL statements -- executed on first boot */
|
|
698
13
|
var CORE_TABLE_DDL = [
|
|
699
|
-
|
|
700
|
-
`CREATE TABLE IF NOT EXISTS system_settings (
|
|
14
|
+
`CREATE TABLE IF NOT EXISTS system_settings (
|
|
701
15
|
key TEXT PRIMARY KEY,
|
|
702
16
|
value JSON NOT NULL,
|
|
703
17
|
updated_at INTEGER NOT NULL DEFAULT (unixepoch())
|
|
704
18
|
)`,
|
|
705
|
-
|
|
19
|
+
`CREATE TABLE IF NOT EXISTS addon_settings (
|
|
706
20
|
addon_id TEXT NOT NULL,
|
|
707
21
|
key TEXT NOT NULL,
|
|
708
22
|
value JSON NOT NULL,
|
|
709
23
|
updated_at INTEGER NOT NULL DEFAULT (unixepoch()),
|
|
710
24
|
PRIMARY KEY (addon_id, key)
|
|
711
25
|
)`,
|
|
712
|
-
|
|
26
|
+
`CREATE TABLE IF NOT EXISTS provider_settings (
|
|
713
27
|
provider_id TEXT NOT NULL,
|
|
714
28
|
key TEXT NOT NULL,
|
|
715
29
|
value JSON NOT NULL,
|
|
716
30
|
updated_at INTEGER NOT NULL DEFAULT (unixepoch()),
|
|
717
31
|
PRIMARY KEY (provider_id, key)
|
|
718
32
|
)`,
|
|
719
|
-
|
|
33
|
+
`CREATE TABLE IF NOT EXISTS device_settings (
|
|
720
34
|
device_id TEXT NOT NULL,
|
|
721
35
|
key TEXT NOT NULL,
|
|
722
36
|
value JSON NOT NULL,
|
|
723
37
|
updated_at INTEGER NOT NULL DEFAULT (unixepoch()),
|
|
724
38
|
PRIMARY KEY (device_id, key)
|
|
725
39
|
)`,
|
|
726
|
-
|
|
727
|
-
* Per-device overrides of an addon's settings (scope: 'device' fields).
|
|
728
|
-
* Resolution chain: schema default -> addon_settings (global) -> this.
|
|
729
|
-
*/
|
|
730
|
-
`CREATE TABLE IF NOT EXISTS addon_device_settings (
|
|
40
|
+
`CREATE TABLE IF NOT EXISTS addon_device_settings (
|
|
731
41
|
addon_id TEXT NOT NULL,
|
|
732
42
|
device_id TEXT NOT NULL,
|
|
733
43
|
key TEXT NOT NULL,
|
|
@@ -735,14 +45,7 @@ var CORE_TABLE_DDL = [
|
|
|
735
45
|
updated_at INTEGER NOT NULL DEFAULT (unixepoch()),
|
|
736
46
|
PRIMARY KEY (addon_id, device_id, key)
|
|
737
47
|
)`,
|
|
738
|
-
|
|
739
|
-
// `track_trails` — these were consumed exclusively by the old
|
|
740
|
-
// analytics sub-addon (deleted) and its analysis-data-persistence cap.
|
|
741
|
-
// addon-pipeline-analytics now owns all detection/audio/track tables
|
|
742
|
-
// via `declareCollection` (pipeline-analytics:motion-events,
|
|
743
|
-
// :object-events, :audio-events, :tracks, :media).
|
|
744
|
-
// Device registry
|
|
745
|
-
`CREATE TABLE IF NOT EXISTS devices (
|
|
48
|
+
`CREATE TABLE IF NOT EXISTS devices (
|
|
746
49
|
id INTEGER PRIMARY KEY AUTOINCREMENT,
|
|
747
50
|
addon_id TEXT NOT NULL,
|
|
748
51
|
stable_id TEXT NOT NULL,
|
|
@@ -754,309 +57,234 @@ var CORE_TABLE_DDL = [
|
|
|
754
57
|
created_at TEXT DEFAULT (datetime('now')),
|
|
755
58
|
UNIQUE(addon_id, stable_id)
|
|
756
59
|
)`,
|
|
757
|
-
|
|
758
|
-
|
|
759
|
-
|
|
760
|
-
// stable_id IS NULL -> addon-global row (one per addon_id)
|
|
761
|
-
// stable_id IS NOT NULL -> per-device row (one per addon_id + stable_id pair)
|
|
762
|
-
// Two partial unique indexes enforce the constraint because SQLite does not
|
|
763
|
-
// support expressions inside UNIQUE(...) declarations.
|
|
764
|
-
`CREATE TABLE IF NOT EXISTS addon_config (
|
|
60
|
+
`CREATE INDEX IF NOT EXISTS idx_devices_addon ON devices(addon_id)`,
|
|
61
|
+
`CREATE INDEX IF NOT EXISTS idx_devices_parent ON devices(addon_id, parent_stable_id)`,
|
|
62
|
+
`CREATE TABLE IF NOT EXISTS addon_config (
|
|
765
63
|
addon_id TEXT NOT NULL,
|
|
766
64
|
stable_id TEXT,
|
|
767
65
|
data TEXT NOT NULL DEFAULT '{}',
|
|
768
66
|
updated_at TEXT DEFAULT (datetime('now'))
|
|
769
67
|
)`,
|
|
770
|
-
|
|
771
|
-
|
|
772
|
-
|
|
773
|
-
];
|
|
774
|
-
var CORE_TABLE_MIGRATIONS = [
|
|
775
|
-
// 2026-04 — DeviceRole support: optional role hint per device, used by
|
|
776
|
-
// admin UI to pick icons/widgets for accessory children (siren,
|
|
777
|
-
// floodlight, PIR, chime, doorbell, …). Nullable; existing rows stay.
|
|
778
|
-
`ALTER TABLE devices ADD COLUMN role TEXT`
|
|
68
|
+
`CREATE UNIQUE INDEX IF NOT EXISTS idx_addon_config_global ON addon_config(addon_id) WHERE stable_id IS NULL`,
|
|
69
|
+
`CREATE UNIQUE INDEX IF NOT EXISTS idx_addon_config_device ON addon_config(addon_id, stable_id) WHERE stable_id IS NOT NULL`,
|
|
70
|
+
`CREATE INDEX IF NOT EXISTS idx_addon_config_addon ON addon_config(addon_id)`
|
|
779
71
|
];
|
|
72
|
+
/**
|
|
73
|
+
* Idempotent ALTER statements run after `CORE_TABLE_DDL`. Each entry
|
|
74
|
+
* may fail on installs where the column already exists — the runner
|
|
75
|
+
* catches "duplicate column name" / "no such table" errors and moves
|
|
76
|
+
* on. Order matters: migrations stack in chronological order.
|
|
77
|
+
*
|
|
78
|
+
* Pattern when adding a new column:
|
|
79
|
+
* 1. Add the column to the matching `CREATE TABLE` above so fresh
|
|
80
|
+
* installs get it by default.
|
|
81
|
+
* 2. Append an `ALTER TABLE ... ADD COLUMN ...` here so existing
|
|
82
|
+
* installs get it on next boot.
|
|
83
|
+
*/
|
|
84
|
+
var CORE_TABLE_MIGRATIONS = [`ALTER TABLE devices ADD COLUMN role TEXT`];
|
|
85
|
+
/** Generate CREATE TABLE DDL from addon schema */
|
|
780
86
|
function addonTableToDdl(schema) {
|
|
781
|
-
|
|
782
|
-
|
|
783
|
-
|
|
784
|
-
|
|
785
|
-
|
|
786
|
-
|
|
787
|
-
|
|
788
|
-
${
|
|
789
|
-
|
|
790
|
-
|
|
791
|
-
|
|
792
|
-
|
|
793
|
-
|
|
794
|
-
|
|
795
|
-
|
|
796
|
-
const unique = idx.unique ? "UNIQUE " : "";
|
|
797
|
-
stmts.push(`CREATE ${unique}INDEX IF NOT EXISTS ${idx.name} ON ${schema.name}(${idx.columns.join(", ")})`);
|
|
798
|
-
}
|
|
799
|
-
return stmts;
|
|
87
|
+
const pks = schema.columns.filter((c) => c.primaryKey).map((c) => c.name);
|
|
88
|
+
const colDefs = schema.columns.map((c) => {
|
|
89
|
+
const parts = [c.name, c.type];
|
|
90
|
+
if (c.notNull) parts.push("NOT NULL");
|
|
91
|
+
return parts.join(" ");
|
|
92
|
+
});
|
|
93
|
+
let ddl = `CREATE TABLE IF NOT EXISTS ${schema.name} (\n ${colDefs.join(",\n ")}`;
|
|
94
|
+
if (pks.length > 0) ddl += `,\n PRIMARY KEY (${pks.join(", ")})`;
|
|
95
|
+
ddl += "\n)";
|
|
96
|
+
const stmts = [ddl];
|
|
97
|
+
for (const idx of schema.indexes ?? []) {
|
|
98
|
+
const unique = idx.unique ? "UNIQUE " : "";
|
|
99
|
+
stmts.push(`CREATE ${unique}INDEX IF NOT EXISTS ${idx.name} ON ${schema.name}(${idx.columns.join(", ")})`);
|
|
100
|
+
}
|
|
101
|
+
return stmts;
|
|
800
102
|
}
|
|
801
|
-
|
|
802
|
-
|
|
803
|
-
|
|
103
|
+
//#endregion
|
|
104
|
+
//#region src/builtins/sqlite-storage/settings-store.ts
|
|
105
|
+
/**
|
|
106
|
+
* Thin wrapper over better-sqlite3 that manages the four settings tables:
|
|
107
|
+
* system_settings, addon_settings, provider_settings, device_settings.
|
|
108
|
+
*
|
|
109
|
+
* All values are stored as JSON text and deserialized on read.
|
|
110
|
+
*/
|
|
804
111
|
var SettingsStore = class {
|
|
805
|
-
|
|
806
|
-
|
|
807
|
-
|
|
808
|
-
|
|
809
|
-
|
|
810
|
-
|
|
811
|
-
|
|
812
|
-
|
|
813
|
-
|
|
814
|
-
|
|
815
|
-
|
|
816
|
-
|
|
817
|
-
|
|
818
|
-
|
|
819
|
-
|
|
820
|
-
|
|
821
|
-
|
|
822
|
-
|
|
823
|
-
|
|
824
|
-
|
|
825
|
-
|
|
826
|
-
|
|
827
|
-
|
|
828
|
-
|
|
829
|
-
|
|
830
|
-
|
|
831
|
-
|
|
832
|
-
|
|
833
|
-
|
|
834
|
-
|
|
835
|
-
|
|
836
|
-
|
|
837
|
-
|
|
838
|
-
|
|
839
|
-
|
|
840
|
-
|
|
841
|
-
|
|
842
|
-
|
|
843
|
-
|
|
844
|
-
|
|
845
|
-
|
|
846
|
-
|
|
847
|
-
|
|
848
|
-
|
|
849
|
-
|
|
850
|
-
|
|
851
|
-
|
|
852
|
-
|
|
853
|
-
|
|
854
|
-
|
|
855
|
-
|
|
856
|
-
|
|
857
|
-
|
|
858
|
-
|
|
859
|
-
|
|
860
|
-
|
|
861
|
-
|
|
862
|
-
|
|
863
|
-
|
|
864
|
-
|
|
865
|
-
|
|
866
|
-
|
|
867
|
-
|
|
868
|
-
|
|
869
|
-
|
|
870
|
-
|
|
871
|
-
|
|
872
|
-
|
|
873
|
-
|
|
874
|
-
|
|
875
|
-
|
|
876
|
-
|
|
877
|
-
|
|
878
|
-
|
|
879
|
-
|
|
880
|
-
|
|
881
|
-
|
|
882
|
-
|
|
883
|
-
|
|
884
|
-
|
|
885
|
-
|
|
886
|
-
|
|
887
|
-
|
|
888
|
-
|
|
889
|
-
|
|
890
|
-
|
|
891
|
-
|
|
892
|
-
|
|
893
|
-
|
|
894
|
-
|
|
895
|
-
|
|
896
|
-
|
|
897
|
-
|
|
898
|
-
|
|
899
|
-
|
|
900
|
-
|
|
901
|
-
|
|
902
|
-
|
|
903
|
-
|
|
904
|
-
|
|
905
|
-
|
|
906
|
-
|
|
907
|
-
|
|
908
|
-
|
|
909
|
-
|
|
910
|
-
|
|
911
|
-
|
|
912
|
-
|
|
913
|
-
|
|
914
|
-
|
|
915
|
-
|
|
916
|
-
|
|
917
|
-
|
|
918
|
-
|
|
919
|
-
|
|
920
|
-
|
|
921
|
-
}
|
|
922
|
-
/**
|
|
923
|
-
* Bulk-replace all per-device overrides for (addonId, deviceId) in a
|
|
924
|
-
* single transaction. Empty input clears the override set — caller
|
|
925
|
-
* should use `clearAddonDevice` for explicit resets.
|
|
926
|
-
*/
|
|
927
|
-
setAddonDevice(addonId, deviceId, values) {
|
|
928
|
-
const deleteStmt = this.db.prepare(
|
|
929
|
-
"DELETE FROM addon_device_settings WHERE addon_id = ? AND device_id = ?"
|
|
930
|
-
);
|
|
931
|
-
const insertStmt = this.db.prepare(
|
|
932
|
-
`INSERT INTO addon_device_settings (addon_id, device_id, key, value, updated_at)
|
|
933
|
-
VALUES (?, ?, ?, json(?), unixepoch())`
|
|
934
|
-
);
|
|
935
|
-
this.db.transaction(() => {
|
|
936
|
-
deleteStmt.run(addonId, deviceId);
|
|
937
|
-
for (const [key, value] of Object.entries(values)) {
|
|
938
|
-
insertStmt.run(addonId, deviceId, key, JSON.stringify(value));
|
|
939
|
-
}
|
|
940
|
-
})();
|
|
941
|
-
}
|
|
942
|
-
clearAddonDevice(addonId, deviceId) {
|
|
943
|
-
this.db.prepare("DELETE FROM addon_device_settings WHERE addon_id = ? AND device_id = ?").run(addonId, deviceId);
|
|
944
|
-
}
|
|
945
|
-
// ---------------------------------------------------------------------------
|
|
946
|
-
// Lifecycle
|
|
947
|
-
// ---------------------------------------------------------------------------
|
|
948
|
-
/** Close the SQLite connection (call on shutdown). */
|
|
949
|
-
close() {
|
|
950
|
-
this.db.close();
|
|
951
|
-
}
|
|
952
|
-
/** Check if system_settings is empty (used for first-boot seeding). */
|
|
953
|
-
isSystemSettingsEmpty() {
|
|
954
|
-
const row = this.db.prepare("SELECT COUNT(*) AS cnt FROM system_settings").get();
|
|
955
|
-
return (row?.cnt ?? 0) === 0;
|
|
956
|
-
}
|
|
957
|
-
/** Seed system_settings with RUNTIME_DEFAULTS (only on first boot). */
|
|
958
|
-
seedDefaults() {
|
|
959
|
-
const insert = this.db.prepare(
|
|
960
|
-
`INSERT OR IGNORE INTO system_settings (key, value, updated_at) VALUES (?, json(?), unixepoch())`
|
|
961
|
-
);
|
|
962
|
-
this.db.transaction(() => {
|
|
963
|
-
for (const [key, value] of Object.entries(import_types4.RUNTIME_DEFAULTS)) {
|
|
964
|
-
insert.run(key, JSON.stringify(value));
|
|
965
|
-
}
|
|
966
|
-
})();
|
|
967
|
-
}
|
|
968
|
-
// ---------------------------------------------------------------------------
|
|
969
|
-
// Private helpers
|
|
970
|
-
// ---------------------------------------------------------------------------
|
|
971
|
-
initTables() {
|
|
972
|
-
this.db.transaction(() => {
|
|
973
|
-
for (const stmt of CORE_TABLE_DDL) {
|
|
974
|
-
this.db.prepare(stmt).run();
|
|
975
|
-
}
|
|
976
|
-
for (const stmt of CORE_TABLE_MIGRATIONS) {
|
|
977
|
-
try {
|
|
978
|
-
this.db.prepare(stmt).run();
|
|
979
|
-
} catch (err) {
|
|
980
|
-
const msg = err instanceof Error ? err.message : String(err);
|
|
981
|
-
if (msg.includes("duplicate column name") || msg.includes("no such table")) continue;
|
|
982
|
-
throw err;
|
|
983
|
-
}
|
|
984
|
-
}
|
|
985
|
-
})();
|
|
986
|
-
}
|
|
112
|
+
db;
|
|
113
|
+
constructor(dbPath) {
|
|
114
|
+
this.db = new better_sqlite3.default(dbPath);
|
|
115
|
+
this.db.pragma("journal_mode = WAL");
|
|
116
|
+
this.db.pragma("foreign_keys = ON");
|
|
117
|
+
this.initTables();
|
|
118
|
+
}
|
|
119
|
+
getSystem(key) {
|
|
120
|
+
const row = this.db.prepare("SELECT value FROM system_settings WHERE key = ?").get(key);
|
|
121
|
+
if (row === void 0) return void 0;
|
|
122
|
+
return JSON.parse(row.value);
|
|
123
|
+
}
|
|
124
|
+
setSystem(key, value) {
|
|
125
|
+
this.db.prepare(`INSERT INTO system_settings (key, value, updated_at) VALUES (?, json(?), unixepoch())
|
|
126
|
+
ON CONFLICT(key) DO UPDATE SET value = excluded.value, updated_at = excluded.updated_at`).run(key, JSON.stringify(value));
|
|
127
|
+
}
|
|
128
|
+
getAllSystem() {
|
|
129
|
+
const rows = this.db.prepare("SELECT key, value FROM system_settings").all();
|
|
130
|
+
return Object.fromEntries(rows.map((r) => [r.key, JSON.parse(r.value)]));
|
|
131
|
+
}
|
|
132
|
+
getAddon(addonId, key) {
|
|
133
|
+
const row = this.db.prepare("SELECT value FROM addon_settings WHERE addon_id = ? AND key = ?").get(addonId, key);
|
|
134
|
+
if (row === void 0) return void 0;
|
|
135
|
+
return JSON.parse(row.value);
|
|
136
|
+
}
|
|
137
|
+
setAddon(addonId, key, value) {
|
|
138
|
+
this.db.prepare(`INSERT INTO addon_settings (addon_id, key, value, updated_at) VALUES (?, ?, json(?), unixepoch())
|
|
139
|
+
ON CONFLICT(addon_id, key) DO UPDATE SET value = excluded.value, updated_at = excluded.updated_at`).run(addonId, key, JSON.stringify(value));
|
|
140
|
+
}
|
|
141
|
+
getAllAddon(addonId) {
|
|
142
|
+
const rows = this.db.prepare("SELECT key, value FROM addon_settings WHERE addon_id = ?").all(addonId);
|
|
143
|
+
return Object.fromEntries(rows.map((r) => [r.key, JSON.parse(r.value)]));
|
|
144
|
+
}
|
|
145
|
+
/** Bulk-replace all keys for an addon (within a transaction). */
|
|
146
|
+
setAllAddon(addonId, config) {
|
|
147
|
+
const deleteStmt = this.db.prepare("DELETE FROM addon_settings WHERE addon_id = ?");
|
|
148
|
+
const insertStmt = this.db.prepare(`INSERT INTO addon_settings (addon_id, key, value, updated_at) VALUES (?, ?, json(?), unixepoch())`);
|
|
149
|
+
this.db.transaction(() => {
|
|
150
|
+
deleteStmt.run(addonId);
|
|
151
|
+
for (const [key, value] of Object.entries(config)) insertStmt.run(addonId, key, JSON.stringify(value));
|
|
152
|
+
})();
|
|
153
|
+
}
|
|
154
|
+
getProvider(providerId, key) {
|
|
155
|
+
const row = this.db.prepare("SELECT value FROM provider_settings WHERE provider_id = ? AND key = ?").get(providerId, key);
|
|
156
|
+
if (row === void 0) return void 0;
|
|
157
|
+
return JSON.parse(row.value);
|
|
158
|
+
}
|
|
159
|
+
setProvider(providerId, key, value) {
|
|
160
|
+
this.db.prepare(`INSERT INTO provider_settings (provider_id, key, value, updated_at) VALUES (?, ?, json(?), unixepoch())
|
|
161
|
+
ON CONFLICT(provider_id, key) DO UPDATE SET value = excluded.value, updated_at = excluded.updated_at`).run(providerId, key, JSON.stringify(value));
|
|
162
|
+
}
|
|
163
|
+
getAllProvider(providerId) {
|
|
164
|
+
const rows = this.db.prepare("SELECT key, value FROM provider_settings WHERE provider_id = ?").all(providerId);
|
|
165
|
+
return Object.fromEntries(rows.map((r) => [r.key, JSON.parse(r.value)]));
|
|
166
|
+
}
|
|
167
|
+
getDevice(deviceId, key) {
|
|
168
|
+
const row = this.db.prepare("SELECT value FROM device_settings WHERE device_id = ? AND key = ?").get(deviceId, key);
|
|
169
|
+
if (row === void 0) return void 0;
|
|
170
|
+
return JSON.parse(row.value);
|
|
171
|
+
}
|
|
172
|
+
setDevice(deviceId, key, value) {
|
|
173
|
+
this.db.prepare(`INSERT INTO device_settings (device_id, key, value, updated_at) VALUES (?, ?, json(?), unixepoch())
|
|
174
|
+
ON CONFLICT(device_id, key) DO UPDATE SET value = excluded.value, updated_at = excluded.updated_at`).run(deviceId, key, JSON.stringify(value));
|
|
175
|
+
}
|
|
176
|
+
getAllDevice(deviceId) {
|
|
177
|
+
const rows = this.db.prepare("SELECT key, value FROM device_settings WHERE device_id = ?").all(deviceId);
|
|
178
|
+
return Object.fromEntries(rows.map((r) => [r.key, JSON.parse(r.value)]));
|
|
179
|
+
}
|
|
180
|
+
getAddonDevice(addonId, deviceId) {
|
|
181
|
+
const rows = this.db.prepare("SELECT key, value FROM addon_device_settings WHERE addon_id = ? AND device_id = ?").all(addonId, deviceId);
|
|
182
|
+
return Object.fromEntries(rows.map((r) => [r.key, JSON.parse(r.value)]));
|
|
183
|
+
}
|
|
184
|
+
/**
|
|
185
|
+
* Bulk-replace all per-device overrides for (addonId, deviceId) in a
|
|
186
|
+
* single transaction. Empty input clears the override set — caller
|
|
187
|
+
* should use `clearAddonDevice` for explicit resets.
|
|
188
|
+
*/
|
|
189
|
+
setAddonDevice(addonId, deviceId, values) {
|
|
190
|
+
const deleteStmt = this.db.prepare("DELETE FROM addon_device_settings WHERE addon_id = ? AND device_id = ?");
|
|
191
|
+
const insertStmt = this.db.prepare(`INSERT INTO addon_device_settings (addon_id, device_id, key, value, updated_at)
|
|
192
|
+
VALUES (?, ?, ?, json(?), unixepoch())`);
|
|
193
|
+
this.db.transaction(() => {
|
|
194
|
+
deleteStmt.run(addonId, deviceId);
|
|
195
|
+
for (const [key, value] of Object.entries(values)) insertStmt.run(addonId, deviceId, key, JSON.stringify(value));
|
|
196
|
+
})();
|
|
197
|
+
}
|
|
198
|
+
clearAddonDevice(addonId, deviceId) {
|
|
199
|
+
this.db.prepare("DELETE FROM addon_device_settings WHERE addon_id = ? AND device_id = ?").run(addonId, deviceId);
|
|
200
|
+
}
|
|
201
|
+
/** Close the SQLite connection (call on shutdown). */
|
|
202
|
+
close() {
|
|
203
|
+
this.db.close();
|
|
204
|
+
}
|
|
205
|
+
/** Check if system_settings is empty (used for first-boot seeding). */
|
|
206
|
+
isSystemSettingsEmpty() {
|
|
207
|
+
return (this.db.prepare("SELECT COUNT(*) AS cnt FROM system_settings").get()?.cnt ?? 0) === 0;
|
|
208
|
+
}
|
|
209
|
+
/** Seed system_settings with RUNTIME_DEFAULTS (only on first boot). */
|
|
210
|
+
seedDefaults() {
|
|
211
|
+
const insert = this.db.prepare(`INSERT OR IGNORE INTO system_settings (key, value, updated_at) VALUES (?, json(?), unixepoch())`);
|
|
212
|
+
this.db.transaction(() => {
|
|
213
|
+
for (const [key, value] of Object.entries(_camstack_types.RUNTIME_DEFAULTS)) insert.run(key, JSON.stringify(value));
|
|
214
|
+
})();
|
|
215
|
+
}
|
|
216
|
+
initTables() {
|
|
217
|
+
this.db.transaction(() => {
|
|
218
|
+
for (const stmt of CORE_TABLE_DDL) this.db.prepare(stmt).run();
|
|
219
|
+
for (const stmt of CORE_TABLE_MIGRATIONS) try {
|
|
220
|
+
this.db.prepare(stmt).run();
|
|
221
|
+
} catch (err) {
|
|
222
|
+
const msg = err instanceof Error ? err.message : String(err);
|
|
223
|
+
if (msg.includes("duplicate column name") || msg.includes("no such table")) continue;
|
|
224
|
+
throw err;
|
|
225
|
+
}
|
|
226
|
+
})();
|
|
227
|
+
}
|
|
987
228
|
};
|
|
988
|
-
|
|
989
|
-
|
|
229
|
+
//#endregion
|
|
230
|
+
//#region src/builtins/sqlite-storage/device-store.ts
|
|
990
231
|
var DeviceStore = class {
|
|
991
|
-
|
|
992
|
-
|
|
993
|
-
|
|
994
|
-
|
|
995
|
-
|
|
996
|
-
|
|
997
|
-
|
|
998
|
-
|
|
999
|
-
|
|
1000
|
-
|
|
1001
|
-
|
|
1002
|
-
|
|
1003
|
-
|
|
1004
|
-
|
|
1005
|
-
|
|
1006
|
-
return this.db.prepare(
|
|
1007
|
-
`SELECT stable_id as stableId, type, name, parent_stable_id as parentStableId, enabled FROM devices WHERE addon_id = ? AND parent_stable_id = ?`
|
|
1008
|
-
).all(addonId, parentStableId);
|
|
1009
|
-
}
|
|
1010
|
-
remove(addonId, stableId) {
|
|
1011
|
-
this.db.prepare(`DELETE FROM devices WHERE addon_id = ? AND stable_id = ?`).run(addonId, stableId);
|
|
1012
|
-
}
|
|
232
|
+
constructor(db) {
|
|
233
|
+
this.db = db;
|
|
234
|
+
}
|
|
235
|
+
insert(addonId, device) {
|
|
236
|
+
this.db.prepare(`INSERT INTO devices (addon_id, stable_id, type, name, parent_stable_id) VALUES (?, ?, ?, ?, ?)`).run(addonId, device.stableId, device.type, device.name, device.parentStableId);
|
|
237
|
+
}
|
|
238
|
+
listByAddon(addonId) {
|
|
239
|
+
return this.db.prepare(`SELECT stable_id as stableId, type, name, parent_stable_id as parentStableId, enabled FROM devices WHERE addon_id = ?`).all(addonId);
|
|
240
|
+
}
|
|
241
|
+
listChildren(addonId, parentStableId) {
|
|
242
|
+
return this.db.prepare(`SELECT stable_id as stableId, type, name, parent_stable_id as parentStableId, enabled FROM devices WHERE addon_id = ? AND parent_stable_id = ?`).all(addonId, parentStableId);
|
|
243
|
+
}
|
|
244
|
+
remove(addonId, stableId) {
|
|
245
|
+
this.db.prepare(`DELETE FROM devices WHERE addon_id = ? AND stable_id = ?`).run(addonId, stableId);
|
|
246
|
+
}
|
|
1013
247
|
};
|
|
1014
|
-
|
|
1015
|
-
|
|
248
|
+
//#endregion
|
|
249
|
+
//#region src/builtins/sqlite-storage/config-store.ts
|
|
1016
250
|
var ConfigStore = class {
|
|
1017
|
-
|
|
1018
|
-
|
|
1019
|
-
|
|
1020
|
-
|
|
1021
|
-
|
|
1022
|
-
if (stableId === null) {
|
|
1023
|
-
this.db.prepare(
|
|
1024
|
-
`INSERT INTO addon_config (addon_id, stable_id, data, updated_at)
|
|
251
|
+
constructor(db) {
|
|
252
|
+
this.db = db;
|
|
253
|
+
}
|
|
254
|
+
save(addonId, stableId, data) {
|
|
255
|
+
if (stableId === null) this.db.prepare(`INSERT INTO addon_config (addon_id, stable_id, data, updated_at)
|
|
1025
256
|
VALUES (?, NULL, ?, datetime('now'))
|
|
1026
257
|
ON CONFLICT(addon_id) WHERE stable_id IS NULL
|
|
1027
|
-
DO UPDATE SET data = excluded.data, updated_at = excluded.updated_at`
|
|
1028
|
-
|
|
1029
|
-
} else {
|
|
1030
|
-
this.db.prepare(
|
|
1031
|
-
`INSERT INTO addon_config (addon_id, stable_id, data, updated_at)
|
|
258
|
+
DO UPDATE SET data = excluded.data, updated_at = excluded.updated_at`).run(addonId, JSON.stringify(data));
|
|
259
|
+
else this.db.prepare(`INSERT INTO addon_config (addon_id, stable_id, data, updated_at)
|
|
1032
260
|
VALUES (?, ?, ?, datetime('now'))
|
|
1033
261
|
ON CONFLICT(addon_id, stable_id) WHERE stable_id IS NOT NULL
|
|
1034
|
-
DO UPDATE SET data = excluded.data, updated_at = excluded.updated_at`
|
|
1035
|
-
|
|
1036
|
-
|
|
1037
|
-
|
|
1038
|
-
|
|
1039
|
-
|
|
1040
|
-
|
|
1041
|
-
|
|
1042
|
-
|
|
1043
|
-
|
|
1044
|
-
this.db.prepare(`DELETE FROM addon_config WHERE addon_id = ? AND stable_id IS NULL`).run(addonId);
|
|
1045
|
-
} else {
|
|
1046
|
-
this.db.prepare(`DELETE FROM addon_config WHERE addon_id = ? AND stable_id = ?`).run(addonId, stableId);
|
|
1047
|
-
}
|
|
1048
|
-
}
|
|
262
|
+
DO UPDATE SET data = excluded.data, updated_at = excluded.updated_at`).run(addonId, stableId, JSON.stringify(data));
|
|
263
|
+
}
|
|
264
|
+
load(addonId, stableId) {
|
|
265
|
+
const row = stableId === null ? this.db.prepare(`SELECT data FROM addon_config WHERE addon_id = ? AND stable_id IS NULL`).get(addonId) : this.db.prepare(`SELECT data FROM addon_config WHERE addon_id = ? AND stable_id = ?`).get(addonId, stableId);
|
|
266
|
+
return row ? JSON.parse(row.data) : {};
|
|
267
|
+
}
|
|
268
|
+
remove(addonId, stableId) {
|
|
269
|
+
if (stableId === null) this.db.prepare(`DELETE FROM addon_config WHERE addon_id = ? AND stable_id IS NULL`).run(addonId);
|
|
270
|
+
else this.db.prepare(`DELETE FROM addon_config WHERE addon_id = ? AND stable_id = ?`).run(addonId, stableId);
|
|
271
|
+
}
|
|
1049
272
|
};
|
|
1050
|
-
|
|
1051
|
-
|
|
1052
|
-
|
|
1053
|
-
|
|
1054
|
-
|
|
1055
|
-
|
|
1056
|
-
|
|
1057
|
-
|
|
1058
|
-
|
|
1059
|
-
|
|
1060
|
-
|
|
1061
|
-
|
|
273
|
+
//#endregion
|
|
274
|
+
exports.CORE_TABLE_DDL = CORE_TABLE_DDL;
|
|
275
|
+
exports.CORE_TABLE_DDL$1 = CORE_TABLE_DDL;
|
|
276
|
+
exports.ConfigStore = ConfigStore;
|
|
277
|
+
exports.ConfigStore$1 = ConfigStore;
|
|
278
|
+
exports.DeviceStore = DeviceStore;
|
|
279
|
+
exports.DeviceStore$1 = DeviceStore;
|
|
280
|
+
exports.FilesystemStorageAddon = require_builtins_sqlite_storage_filesystem_storage_addon.FilesystemStorageAddon;
|
|
281
|
+
exports.FilesystemStorageProvider = require_builtins_sqlite_storage_filesystem_storage_addon.FilesystemStorageProvider;
|
|
282
|
+
exports.SettingsStore = SettingsStore;
|
|
283
|
+
exports.SettingsStore$1 = SettingsStore;
|
|
284
|
+
exports.SqliteSettingsAddon = require_builtins_sqlite_storage_sqlite_settings_addon.SqliteSettingsAddon;
|
|
285
|
+
exports.SqliteSettingsBackend = require_builtins_sqlite_storage_sqlite_settings_addon.SqliteSettingsBackend;
|
|
286
|
+
exports.addonTableToDdl = addonTableToDdl;
|
|
287
|
+
exports.addonTableToDdl$1 = addonTableToDdl;
|
|
288
|
+
exports.default = require_builtins_sqlite_storage_filesystem_storage_addon.FilesystemStorageAddon;
|
|
289
|
+
|
|
1062
290
|
//# sourceMappingURL=index.js.map
|