Storage
Store JSON-serializable data tied to the current presentation / user context. Field names on entries are snake_case.
Public surface (storage): get · getAll · getAllAcrossPresentations · getForPresentation · query · search · save · delete
There is no getAllForPresentation() — that 1.x name hit the unrestricted list and was replaced by getAllAcrossPresentations() / getAll() / getForPresentation(id).
interface StorageEntry { name: string data: unknown team_id: number user_id: number presentation_id: number | null created_at: string | null // ISO 8601 updated_at: string | null}
interface StorageFilter { name?: string presentationID?: number since?: string // ISO 8601 until?: string limit?: number // default 100 (local fallback path)}Save, load, delete
Section titled “Save, load, delete”get(name: string): Promise<StorageEntry | null>save(name: string, data: unknown): Promise<StorageEntry>delete(name: string): Promise<void>import mobilelocker from '@mobilelocker/javascript-sdk'
await mobilelocker.storage.save('scan-results', { leads: [{ id: 1 }] })
const entry = await mobilelocker.storage.get('scan-results')// entry?.name, entry?.data, entry?.team_id, entry?.presentation_id, …
await mobilelocker.storage.delete('scan-results')Outside Mobile Locker, get / getAll / save / delete use IndexedDB via localforage.
List by scope
Section titled “List by scope”getAll(): Promise<StorageEntry[]> // current presentationgetAllAcrossPresentations(): Promise<StorageEntry[]> // all for usergetForPresentation(presentationID: number): Promise<StorageEntry[]>const allHere = await mobilelocker.storage.getAll()const across = await mobilelocker.storage.getAllAcrossPresentations()const forPres = await mobilelocker.storage.getForPresentation(37976)Query and search
Section titled “Query and search”query(filter?: StorageFilter): Promise<StorageEntry[]>search(text: string, filter?: StorageFilter): Promise<StorageEntry[]>const filtered = await mobilelocker.storage.query({ name: 'scan-results', limit: 10, // presentationID, since, until also supported})
const hits = await mobilelocker.storage.search('lead', { limit: 20 })// Matches against name and stringified datalocalforage vs storage
Section titled “localforage vs storage”| API | Use when |
|---|---|
storage |
Named server-backed entries with presentation/user metadata |
localforage |
Drop-in key-value store (native-backed on iOS 5.3.0+ / Android) |
Prefer mobilelocker.localforage over raw browser localforage in presentations so data is not lost when the WebView origin/port changes.