Client functions for callbacks, the local player, items and stashes.

## Callbacks

```lua
CreateThread(function()
    local price = ObsiLib.callback.await('my_script:getPrice', 'water')       -- blocking
end)

ObsiLib.callback.trigger('my_script:getPrice', 'water', function(price) end) -- non blocking

-- Answer a server-side ObsiLib.callback.awaitClient(source, 'my_script:heading')
ObsiLib.callback.register('my_script:heading', function(payload)
    return GetEntityHeading(PlayerPedId())
end)
```

## Player, job, money and licences

```lua
ObsiLib.player.data()        -- framework player data
ObsiLib.player.gender()      -- 'male' | 'female'
ObsiLib.player.isDead()

ObsiLib.job.get()            -- { name, label, grade, gradeLabel, onDuty }
ObsiLib.job.is({ 'police', 'sheriff' })
ObsiLib.job.copsOnline()     -- asks the server

local cash, bank = ObsiLib.money.get()                 -- blocking
ObsiLib.money.get(function(cash, bank) end)            -- async
local hasLicense = ObsiLib.license.has('driver')       -- blocking, or pass a callback
```

## Items (read only)

The client can only read its own items; changes go through the [server](/lib/server-api/items-and-stashes).

```lua
ObsiLib.items.count('water')
ObsiLib.items.has('lockpick')
ObsiLib.items.list()      -- { { name, count, metadata, slot } }
ObsiLib.items.counts()    -- { water = 3 }
```

## Stashes

```lua
ObsiLib.stash.open('police_evidence')   -- only stashes registered with clientOpen = true
```
