Skip to content

Isomorphic TypeScript / JavaScript client to aggregate all the official Optimade providers

License

Notifications You must be signed in to change notification settings

tilde-lab/optimade-client

Repository files navigation

Aggregating Optimade client for the online materials databases

NPM version NPM downloads GitHub issues DOI

Features

  • discovers all the official Optimade databases recursively
  • caches the discovered list (prefetched.json) for future and boosts the retrieval performance
  • queries them all, in the browser, at the server, everywhere
  • provides pagination, with the minimized number of pages

Install

npm i optimade --save
yarn add optimade

CDN: UNPKG | jsDelivr (available as window.optimade)

If you are not using ES6 or CDN, add to your HTML just before closing the body tag:

<script src="/path/to/optimade/dist/index.js"></script>
<!-- OR -->
<script type="module" src="/path/to/optimade/dist/index.mjs"></script>

Usage

The code is generally isomorphic, however one should additionally take care of downloading the cache or setting the CORS policy for the browsers. Concerning the CORS, the Optimade class constructor accepts the corsProxyUrl parameter, pointing to a running cors-anywhere proxy instance. This will be valid until all the Optimade providers are supplying the header Access-Control-Allow-Origin $http_origin in their responses. For the server-side environment this is not required.

Discovery and querying

const optimadeClient = new Optimade({
  providersUrl: "https://providers.optimade.org/providers.json",
});

console.log(optimadeClient.providers); // { [id: string]: Provider }[]

const providersMap = await optimadeClient.getProviders(); // { [id: string]: Provider }[]

const providerIds = Object.keys(providersMap); // string[]

const results = await optimadeClient.getStructuresAll({
  providers: Provider[],
  filter: YOUR_OPTIMADE_QUERY,
}); // [StructuresResponse[], Provider][]

Importing depends on your environment. See also the examples folder. The .html examples are suited for the browser environment, the .js examples are suited for the server environment.

Pagination

import prefetched from 'optimade/dist/prefetched.json';

const optimadeClient = new Optimade({
  providersUrl: "https://providers.optimade.org/providers.json",
});

optimadeClient.providers = prefetched.providers;
optimadeClient.apis = prefetched.apis;

const results = await optimadeClient.getStructuresAll({
  providers: Provider[],
  filter: YOUR_OPTIMADE_QUERY,
  page: number,
  limit: number,
  offset: number,
  batch: true
}); // [StructuresResponse[], Provider][]

See also the demo folder.

License

MIT © Pavel Malyshev and Alexander Volkov, Tilde Materials Informatics