Files
vela-snake/src/common/best.js
T

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 }