// Vela storage callbacks return raw strings, not { data } wrappers. // https://iot.mi.com/vela/quickapp/en/features/data/storage.html function createStore(storage) { let value = 0 let saved = 0 let loaded = false let reading = false let writing = false let listener = null function notify() { if (listener) listener(value) } function flush() { if (!loaded || writing || value <= saved) return writing = true const target = value let settled = false const fail = () => { if (!settled) { settled = true; writing = false } } try { storage.set({ key: 'snake.best', value: String(target), success() { if (settled) return settled = true writing = false saved = target flush() }, fail }) } catch (e) { fail() } } function sync() { if (loaded) { flush(); return } if (reading) return reading = true let settled = false const fail = () => { if (!settled) { settled = true; reading = false } } try { storage.get({ key: 'snake.best', default: '0', success(raw) { if (settled) return settled = true reading = false const n = Number(raw) saved = Number.isInteger(n) && n >= 0 && n <= 253 ? n : 0 value = Math.max(value, saved) loaded = true notify() flush() }, fail }) } catch (e) { fail() } } return { subscribe(fn) { listener = fn; notify() }, record(score) { value = Math.max(value, score); notify(); sync() }, sync } } // One coordinator per native storage module, retained across page recreation. let sharedAPI let sharedStore function getStore(storage) { if (storage !== sharedAPI) { sharedAPI = storage sharedStore = createStore(storage) } return sharedStore } module.exports = { getStore }