@benev/nubs
Version:
user-input system for web games
67 lines (52 loc) • 1.62 kB
text/typescript
import {Bindings} from "./types/bindings.js"
import {extract_bindings} from "./extract_bindings.js"
import {BindingsSchema} from "./types/bindings-schema.js"
import {jsonStorageProxy} from "../../../tools/json-storage.js"
import {default_bindings_schema} from "./default_bindings_schema.js"
import {detect_bindings_version} from "./utils/detect_bindings_version.js"
import {migrate_bindings_to_latest_version} from "./utils/migrate_bindings_to_latest_version.js"
export class Bindings_Controller {
storage_key: string = `nub_bindings`
#schema: BindingsSchema = default_bindings_schema
#bindings: Bindings = this.defaults
#store: {[key: string]: any | undefined}
#on_bindings_change: (b: Bindings) => void
constructor({storage, on_bindings_change}: {
storage: Storage
on_bindings_change: (b: Bindings) => void
}) {
this.#store = jsonStorageProxy(storage)
this.#on_bindings_change = on_bindings_change
}
get defaults() {
return extract_bindings(this.#schema)
}
get schema() {
return this.#schema
}
set schema(s: BindingsSchema) {
this.#schema = s
this.bindings = this.defaults
}
get bindings() {
return this.#bindings
}
set bindings(b: Bindings) {
this.#bindings = b
this.save_to_storage()
this.#on_bindings_change(b)
}
save_to_storage() {
this.#store[this.storage_key] = this.#bindings
}
load_from_storage() {
const read_bindings = (
this.#store[this.storage_key]
?? this.defaults
)
const bindings_version = detect_bindings_version(read_bindings)
this.bindings = migrate_bindings_to_latest_version(
read_bindings, bindings_version
)
}
}