Files
mqttx/src/stores/useSubscriptions.ts
T
Joe Allen 154fb15130 feat: initial MQTT v5 debugging tool
- Tauri v2 + Vue 3 + TypeScript + Element Plus
- Connection management (CRUD + enable/disable/test)
- Preset system with {{variable}} placeholders
- Dashboard with live message scrolling + topic tree
- Payload inspector (JSON/Hex/Base64/Plain)
- Protocol-level logging (file + UI dual channel)
- Global variable manager with localStorage persistence
- MQTT v5 property support (user properties, content type, etc.)
- SubAck result tracking with subscribe_tracked API
2026-08-18 14:32:57 +08:00

78 lines
1.8 KiB
TypeScript

import { ref, computed, watch } from 'vue'
import type { Subscription } from '../types/mqtt'
const STORAGE_KEY = 'mqttx_subscriptions'
function loadSubscriptions(): Subscription[] {
try {
const raw = localStorage.getItem(STORAGE_KEY)
if (!raw) return []
return JSON.parse(raw) as Subscription[]
} catch {
return []
}
}
function saveSubscriptions(subs: Subscription[]) {
try {
localStorage.setItem(STORAGE_KEY, JSON.stringify(subs))
} catch {
// silently ignore
}
}
const subscriptions = ref<Subscription[]>(loadSubscriptions())
watch(
subscriptions,
(val) => {
saveSubscriptions(val)
},
{ deep: true },
)
export function useSubscriptions() {
function addSubscription(connId: string, topic: string, qos: number = 0) {
const existing = subscriptions.value.find(
(s) => s.connectionId === connId && s.topic === topic,
)
if (existing) {
existing.qos = qos
return false
}
subscriptions.value.push({
id: crypto.randomUUID(),
connectionId: connId,
topic,
qos,
})
return true
}
function removeSubscription(connId: string, topic: string) {
subscriptions.value = subscriptions.value.filter(
(s) => !(s.connectionId === connId && s.topic === topic),
)
}
function removeAllByConnection(connId: string) {
subscriptions.value = subscriptions.value.filter(
(s) => s.connectionId !== connId,
)
}
function getSubscriptionsByConnection(connId: string): Subscription[] {
return subscriptions.value.filter((s) => s.connectionId === connId)
}
const allSubscriptions = computed(() => subscriptions.value)
return {
subscriptions,
addSubscription,
removeSubscription,
removeAllByConnection,
getSubscriptionsByConnection,
allSubscriptions,
}
}