64 lines
1.8 KiB
JavaScript
64 lines
1.8 KiB
JavaScript
// 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 }
|