import UrbitApi from '@urbit/http-api'; import type { ContactUpdate, Patp, Group, Contact, Rolodex } from '@urbit/api'; import _get from 'lodash/get'; import { compose } from 'lodash/fp'; import { normalizeId } from './id'; console.log(`Initializing Urbit API at ${Date()}`); const api: UrbitApi = new UrbitApi('', '', window.desk); api.ship = window.ship; // api.connect(); export function scry(path: string): Promise { return api.scry({ app: 'astrolabe', path }); } export function getPoint(patp: string): Promise { return scry(`/point/${patp}`); } export function getSpawnedPoints(patp: string): Promise { return scry(`/point/${patp}/spawned`); } export function getPeers(): Promise { return scry(`/peers`); } export async function searchPoints(search: string): Promise { const { points } = await scry(`/search/${search}`); return points.map(normalizeId); } export function getChartData(old = false): Promise { return scry('/chart-data' + (old ? '-old' : '')); } window['gcd'] = getChartData; export function getDoc(path: string): Promise { return scry(`/doc/${path}`); } export function initialContacts(json: ContactUpdate, contacts: Rolodex): Rolodex { const data = _get(json, 'initial', false); if (data) { contacts = data.rolodex; } return contacts; }; export function addContact(json: ContactUpdate, contacts: Rolodex): Rolodex { const data = _get(json, 'add', false); if (data) { contacts[data.ship] = data.contact; } return contacts; }; export function removeContact(json: ContactUpdate, contacts: Rolodex): Rolodex { const data = _get(json, 'remove', false); if ( data && (data.ship in contacts) ) { delete contacts[data.ship]; } return contacts; }; export function handleContactUpdateEvent(updateContacts) { return ({ 'contact-update': contactUpdate }) => { console.log(`received contact-update: ${Object.keys(contactUpdate)}`) const reducers = [initialContacts, addContact, removeContact]; const reducer = compose(reducers.map(r => sta => r(contactUpdate, sta))); updateContacts(reducer); }; } export function subscribeToContacts(e: (data: any) => void): Promise { return api.subscribe({ app: 'contact-store', path: '/all', event: handleContactUpdateEvent(e), err: () => { console.error(`Subscription to contact-store/all just get "err"`); }, quit: () => { console.error(`Subscription to contact-store/all just get "quit"`) } }) }