@@ -1,5 +1,8 @@
1+import _get from 'lodash/get';
2+import { compose } from 'lodash/fp';
1import type { Apps } from 'types/store';
3import type { Apps } from 'types/store';
2import store from 'stores/store';
4import store from 'stores/store';
5+import { sleep } from 'lib/utils';
3import { api } from 'lib/api';
6import { api } from 'lib/api';
4import { normalizeId } from 'lib/id';
7import { normalizeId } from 'lib/id';
@@ -7,17 +10,26 @@ export function getProvidedApps(patp: string): Promise<any> {
7 return api.scry<any>({ app: 'treaty', path: `/treaties/${patp}` });
10 return api.scry<any>({ app: 'treaty', path: `/treaties/${patp}` });
13+// Unused, use subscription
10export function getKnownApps(): Promise<any> {
14export function getKnownApps(): Promise<any> {
11 return api.scry<any>({ app: 'treaty', path: `/allies` }).then(processAllies);
15 return api.scry<any>({ app: 'treaty', path: `/allies` }).then(processAllies);
14export function getApp(ship: string, desk: string): Promise<any> {
18export function getApp(ship: string, desk: string): Promise<any> {
15− return api.scry<any>({ app: 'treaty', path: `/treaty/${normalizeId(ship)}/${desk}` });
19+ return getAppByPath(`${normalizeId(ship)}/${desk}`);
18// @param path - ship/desk e.g. ~mister-dister-dozzod-dozzod/webterm
22// @param path - ship/desk e.g. ~mister-dister-dozzod-dozzod/webterm
19−export function getAppByPath(path: string): Promise<any> {
23+export async function getAppByPath(path: string, retry: number = 2): Promise<any> {
20− return api.scry<any>({ app: 'treaty', path: `/treaty/${path}` });
25+ return await api.scry<any>({ app: 'treaty', path: `/treaty/${path}` });
28+ console.log(`Got error when fetching app: ${path}.\nTrying at most ${retry} more time(s)`);
30+ return getAppByPath(path, retry - 1);
23export function getInstalledApps(): Promise<any> {
35export function getInstalledApps(): Promise<any> {
@@ -30,7 +42,6 @@ export async function sendAllyUpdate(cmd: string, ship: string) {
30 mark: 'ally-update-0',
42 mark: 'ally-update-0',
31 json: { [cmd]: normalizeId(ship) },
43 json: { [cmd]: normalizeId(ship) },
33− // store.refreshKnownApps();
34 return result;
45 return result;
@@ -49,7 +60,6 @@ export async function addAllies(ships: string[]) {
49 results = results.filter(r => r.status === 'fulfilled').map((r) => {
60 results = results.filter(r => r.status === 'fulfilled').map((r) => {
50 return (r as PromiseFulfilledResult<any>).value;
61 return (r as PromiseFulfilledResult<any>).value;
52− store.refreshKnownApps();
53 return results;
63 return results;
@@ -60,7 +70,6 @@ export async function delAllies(ships: string[], retry: number = 0) {
60 results = results.filter(r => r.status === 'fulfilled').map((r) => {
70 results = results.filter(r => r.status === 'fulfilled').map((r) => {
61 return (r as PromiseFulfilledResult<any>).value;
71 return (r as PromiseFulfilledResult<any>).value;
63− store.refreshKnownApps();
64 return results;
73 return results;
@@ -73,3 +82,94 @@ export function processAllies(rawPals: any): Apps {
86+export type AllyUpdate = AllyUpdateIni | AllyUpdateAdd | AllyUpdateDel | AllyUpdateNew;
88+export interface AllyUpdateIni {
90+ [ship: string]: string[];
94+export interface AllyUpdateNew {
101+export interface AllyUpdateAdd {
105+export interface AllyUpdateDel {
109+export function handleAllyUpdateIni(json: AllyUpdate, apps: Apps): Apps {
110+ const data = _get(json, 'ini', false);
112+ apps = processAllies(json)
117+export function handleAllyUpdateNew(json: AllyUpdate, apps: Apps): Apps {
118+ const data = _get(json, 'new', false);
120+ apps = processAllies({
123+ [data.ship]: data.alliance,
130+export function handleAllyUpdateAdd(json: AllyUpdate, apps: Apps): Apps {
131+ const data = _get(json, 'add', false);
133+ apps = processAllies({
143+export function handleAllyUpdateDel(json: AllyUpdate, apps: Apps): Apps {
144+ const data = _get(json, 'del', false);
145+ if (data && (data in apps.allies)) {
146+ delete apps.allies[data];
147+ apps = processAllies({
154+export function handleAllyUpdateEvent(updateApps) {
155+ return (allyUpdate: AllyUpdate) => {
156+ console.log(`received ally-update: ${Object.keys(allyUpdate)}`);
157+ const reducers = [handleAllyUpdateIni, handleAllyUpdateNew, handleAllyUpdateAdd, handleAllyUpdateDel];
158+ const reducer = compose(reducers.map(r => sta => r(allyUpdate, sta)));
159+ updateApps(reducer);
163+export function subscribeToApps(e: (data: any) => void): Promise<any> {
164+ return api.subscribe({
167+ event: handleAllyUpdateEvent(e),
169+ console.error(`Subscription to treaty/all just got "err"`);
172+ console.error(`Subscription to treaty/all just got "quit"`);