LogoLogo
Developer HubGitHubContact Us
  • Welcome!
  • Olive Helps
    • Platform
      • How Olive Helps Works
      • Installation
      • Account Creation
      • Distributing Olive Helps
    • FAQs
      • General Loop FAQs
      • Loop Development FAQs
      • Olive Helps User FAQs
      • Security / IT FAQs
    • Data Security
      • User Data
      • Antivirus and Firewalls
  • Loop Development Kit
    • Your First Loop
      • Become a Loop Author
      • Creating a Loop
      • Build Your Loop
      • Local Loop Installation
      • Restarting Local Loops
    • Troubleshooting
    • Loop Security
      • Permissions
      • Environment Permissions
    • Loop Publication
      • Loop Approval Checklist
    • Loop Analytics Library
    • Examples
  • Documentation
  • Interfaces
  • Type Alias
  • Enumerations
  • Whisper Components
    • Base Attributes
    • Autocomplete
    • Box
    • Breadcrumb
    • Button
    • Chart
    • CollapseBox
    • Grid
    • Checkbox
    • Date Time
    • Divider
    • DropZone
    • Email
    • Icon
    • List Pair
    • Link
    • Pagination
    • Number
    • Markdown
    • Message
    • Password
    • Progress
    • Radio
    • Rating
    • RichTextEditor
    • Section Title
    • Select
    • Text Input
    • Telephone
    • Typography
  • APTITUDES
    • What are Aptitudes?
    • Browser
    • Clipboard
    • Config
    • Cursor
      • Screen Scaling Behavior
    • Document
    • Filesystem
    • Keyboard
    • Network
    • Process
    • Screen
    • Search
      • Index
    • System
    • UI
      • Loop UI Handlers
    • User
      • JWT
    • Vault
    • Whisper
      • Whisper Updates
      • JSX Whispers
    • Window
      • Screen Scaling Behavior
  • Release Notes
    • What's New
      • Olive Helps v0.55.0
      • Olive Helps v0.54.1
      • Olive Helps v0.53.1
      • Olive Helps v0.51.2
      • LDK v4.0.0
      • Olive Helps v0.50.3
      • Olive Helps v0.49.5
      • LDK v 3.18.0
      • Olive Helps v0.47.2
      • Olive Helps v0.46.2
      • LDK v 3.17.0
      • Olive Helps v0.45.4
      • Olive Helps v0.44.2
      • Olive Helps v0.43.1
      • Olive Helps v0.42.1
      • Olive Helps v0.41.4
      • Olive Helps v0.40.2
      • Olive Helps v0.39.4 & LDK v3.16.0
      • Olive Helps v0.38.8 & LDK v3.15.0
      • Olive Helps v0.36.5
      • Olive Helps v0.36.4
    • Archive
      • Olive Helps v0.36.3 & LDK v3.14.0
      • Olive Helps v0.34.4
      • LDK v3.13.0
      • Olive Helps v0.32.2 & LDK v3.12.0
      • Olive Helps v0.31.2 & LDK v3.11.0
      • Olive Helps v0.30.2 & LDK v3.10.0
      • Olive Helps v0.29.4
      • Olive Helps v0.29.3 & LDK v3.9.0
      • Olive Helps v0.28.3 & LDK v3.8.0
      • Olive Helps v0.27.7
      • Olive Helps v0.27.5
      • Olive Helps v.027.4
      • Olive Helps v0.27.2 & LDK v3.7.0
      • Olive Helps v0.25.3 & LDK v3.5.1
      • Olive Helps v0.24.6 & LDK v3.4.0
      • Olive Helps v0.23.2 & LDK v3.3.0
      • Olive Helps v0.22.3 & LDK v3.2.0
Powered by GitBook
On this page

Was this helpful?

  1. APTITUDES

Vault

The Vault Aptitude provides the ability to read and write strings in either macOS' Keychain or Window's Credential Manager, depending on the system.

The vault Aptitude is not intended for storing large amounts of data.

remove

Removes the entry from the vault with the specified key.

import { vault } from '@oliveai/ldk';

const key = 'myKey';

vault.remove(key).then(() => {
    console.log(`Removed ${key} from the vault`);
});

exists

Returns true if an entry with the specified key is in the vault.

import { vault } from '@oliveai/ldk';

const key = 'myKey';

vault.exists(key).then((inVault) => {
    console.log(`${key} ${!inVault ? 'does not exist' : 'exists'} in the vault.`);
});

read

Returns the value stored in the vault with the specified key.

import { vault } from '@oliveai/ldk';

const key = 'myKey';

vault.read(key).then((value) => {
    console.log(`${key} maps to ${value}`);
});

write

Adds the given value to the vault with the specified key.

import { vault } from '@oliveai/ldk';

const key = 'myKey';
const value = 'some value to write';

vault.write(key, value).then(() => {
    console.log(`Wrote ${value} to ${key}`);
});

Let's suppose we have a Loop that needs to access network resources that are locked behind a security token. We'll create a Loop that retrieves and stores this token to be used elsewhere within the Loop.

import { network, user, vault } from '@oliveai/ldk';

const tokenKey = 'myloop_token';
const expirationKey = 'myloop_expiration';
const oneDayMs = 24 * 60 * 60 * 1000;

const tokenUrl = 'http://127.0.0.1:8080/token';
const apiUrl = 'http://127.0.0.1:8080/myTestApi';

async function refreshToken() {
    // We'll use the jwt provided by the user aptitude to act as our authorization
    // to hit the token endpoint
    const jwt = await user.jwt();
    const response = await network.httpRequest({
        url: tokenUrl,
        method: 'GET',
        headers: {
            Authorization: `Bearer ${jwt}`,
        },
    });

    if (response.statusCode != 200) {
        return;
    }

    const token = await network.decode(response.body);
    const expirationTime = Date.now() + oneDayMs;
  
    // Once we've retrieved the new token, we can store it securely in the vault
    await vault.write(tokenKey, token);
    await vault.write(expirationKey, expirationTime);
}

// This will be the main entrypoint into our example
async function main() {
    let exists = await vault.exists(expirationKey);
  
    if (exists) {
        // If the key exists in vault, we need to make sure it hasn't expired
        let expirationTimeStr = await vault.read(expirationKey);
        let expirationTime = parseInt(expirationTimeStr);
        if (expirationTime < Date.now()) {
            await refreshToken();
        }
    } else {
        await refreshToken();
    }

    // Check to make sure the user token exists before retrieving it
    // Something could have gone wrong with refreshToken();
    const userTokenExists = await vault.exists(tokenKey);
    if (!userTokenExists) {
        return;
    }

    // Read the key and make an API request to get our data
    const userToken = await vault.read(tokenKey);
    const someData = await network.httpRequest({
        url: apiUrl,
        method: 'GET',
        headers: {
            Authorization: `Bearer ${userToken}`,
        },
    });

    // Do something with someData
}

main();

To use the Vault Aptitude, simply set the following permissions in your package.json under the ldk object.

...
"ldk": {
  "permissions": {
    "vault": {},
    ...
  }
},
...
PreviousJWTNextWhisper

Last updated 3 years ago

Was this helpful?

Please see our page for more information.

Permissions