laconic-console/packages/console-app/src/resolvers.js
2020-06-23 09:19:01 -05:00

111 lines
2.6 KiB
JavaScript

//
// Copyright 2020 DXOS.org
//
import debug from 'debug';
import { Registry } from '@wirelineio/registry-client';
import { getServiceUrl } from './util/config';
const log = debug('dxos:console:client:resolvers');
const timestamp = () => new Date().toUTCString();
const MAX_LOG_LENGTH = 200;
/**
* Resolvers
* https://www.apollographql.com/docs/tutorial/local-state/#local-resolvers
* @param config
*/
export const createResolvers = config => {
const endpoint = getServiceUrl(config, 'wns.server', { absolute: true });
const registry = new Registry(endpoint);
// TODO(burdon): Errors swallowed!
// Oldest to latest.
let cachedLog = [];
return {
Query: {
wns_status: async () => {
log('WNS status...');
const data = await registry.getStatus();
return {
__typename: 'JSONResult',
timestamp: timestamp(),
// NOTE: Hack since this should be a string according to the schema.
json: data
};
},
wns_records: async (_, { attributes }) => {
log('WNS records...');
const data = await registry.queryRecords(attributes);
return {
__typename: 'JSONResult',
timestamp: timestamp(),
// NOTE: Hack since this should be a string according to the schema.
json: JSON.stringify(data)
};
},
wns_log: async () => {
log('WNS log...');
// Cache and merge previous state.
const data = await registry.getLogs();
let i = data.findIndex(line => line === cachedLog[cachedLog.length - 1]);
if (i === -1) {
cachedLog = data;
} else {
i++;
for (; i < data.length - 1; i++) {
cachedLog.push(data[i]);
}
// Trim.
cachedLog.splice(0, cachedLog.length - MAX_LOG_LENGTH);
}
return {
__typename: 'JSONLog',
timestamp: timestamp(),
log: [...cachedLog].reverse()
};
},
signal_status: async () => {
log('Signal status...');
const url = getServiceUrl(config, 'signal.api', { path: 'status' });
const res = await fetch(url);
return {
__typename: 'JSONResult',
timestamp: timestamp(),
// NOTE: Hack since this should be a string according to the schema.
json: res.json()
};
},
signal_log: async () => {
log('Signal log...');
return {
__typename: 'JSONLog',
timestamp: timestamp(),
log: []
};
}
}
};
};