'use strict';
Object.defineProperty(exports, "__esModule", {
value: true
});
exports.PROCESS_SOURCE = exports.ISSUES_SOURCE = undefined;
var _map = require('babel-runtime/core-js/map');
var _map2 = _interopRequireDefault(_map);
var _asyncToGenerator2 = require('babel-runtime/helpers/asyncToGenerator');
var _asyncToGenerator3 = _interopRequireDefault(_asyncToGenerator2);
exports.default = createContext;
var _uniqBy = require('lodash/uniqBy');
var _uniqBy2 = _interopRequireDefault(_uniqBy);
var _iterall = require('iterall');
var _eventEmitterToAsyncIterator = require('../asynciterators/eventEmitterToAsyncIterator');
var _eventEmitterToAsyncIterator2 = _interopRequireDefault(_eventEmitterToAsyncIterator);
function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
const ISSUES_SOURCE = exports.ISSUES_SOURCE = {
__typename: 'Issues',
id: 'Source:issues',
name: 'Issues'
};
const PROCESS_SOURCE = exports.PROCESS_SOURCE = {
__typename: 'Process',
id: 'Source:metro',
name: 'Metro Bundler'
};
const DEFAULT_SOURCES = [ISSUES_SOURCE, PROCESS_SOURCE];
function createContext({ projectDir, messageBuffer, layout, issues }) {
return {
getCurrentProject() {
return {
projectDir
};
},
getMessageIterator(cursor) {
return messageBuffer.getIterator(cursor);
},
getMessageEdges(source) {
if (source) {
if (source.id === ISSUES_SOURCE.id) {
return issues.getIssueList();
}
return flattenMessagesFromBuffer(messageBuffer, source.id);
} else {
return flattenMessagesFromBuffer(messageBuffer);
}
},
getMessageConnection(source) {
const edges = this.getMessageEdges(source);
let unreadCount = 0;
let lastReadCursor = null;
if (source) {
var _extractReadInfo = extractReadInfo(layout.get(), source.id, edges);
unreadCount = _extractReadInfo.unreadCount;
lastReadCursor = _extractReadInfo.lastReadCursor;
}
return {
count: edges.length,
unreadCount,
edges,
// on-demand mapping
nodes: () => edges.map(({ node }) => node),
pageInfo: {
hasNextPage: false,
lastReadCursor,
lastCursor: edges.length > 0 ? edges[edges.length - 1].cursor : null
}
};
},
getIssuesSource() {
return ISSUES_SOURCE;
},
getProcessSource() {
return PROCESS_SOURCE;
},
getSourceById(id) {
const allSources = this.getSources();
return allSources.find(source => source.id === id);
},
getSources() {
const chunks = messageBuffer.all().filter(({ node }) => node && node.tag === 'device');
const devices = (0, _uniqBy2.default)(chunks, ({ node }) => node.deviceId).map(({ node }) => ({
__typename: 'Device',
id: node.deviceId,
name: node.deviceName
}));
return DEFAULT_SOURCES.concat(devices);
},
getProjectManagerLayout() {
return layout.get();
},
setProjectManagerLayout(newLayout) {
newLayout.sources.forEach(sourceId => {
this.setLastRead(sourceId);
});
layout.set(newLayout);
},
setLastRead(sourceId, lastReadCursor) {
if (!lastReadCursor) {
const source = this.getSourceById(sourceId);
const edges = this.getMessageEdges(source);
if (edges.length === 0) {
return;
} else {
lastReadCursor = edges[edges.length - 1].cursor;
}
}
layout.setLastRead(sourceId, lastReadCursor.toString());
},
clearMessages(sourceId) {
messageBuffer.push({
type: 'CLEARED',
sourceId
});
},
getIssueIterator() {
const iterator = (0, _eventEmitterToAsyncIterator2.default)(issues, ['ADDED', 'UPDATED', 'DELETED']);
return {
next() {
return (0, _asyncToGenerator3.default)(function* () {
var _ref = yield iterator.next();
const value = _ref.value,
done = _ref.done;
return {
value: {
type: value.eventName,
node: value.event
},
done
};
})();
},
return() {
return iterator.return();
},
throw(error) {
return iterator.throw(error);
},
[_iterall.$$asyncIterator]() {
return this;
}
};
}
};
}
function flattenMessagesFromBuffer(buffer, sourceId) {
const items = buffer.allWithCursor();
const itemsById = new _map2.default();
const flattenedItems = [];
for (let i = items.length - 1; i >= 0; i--) {
var _items$i = items[i];
const cursor = _items$i.cursor,
item = _items$i.item;
if (sourceId && item.sourceId !== sourceId) {
continue;
}
if (item.type === 'CLEARED') {
break;
}
const node = item.node;
if (!itemsById.has(node.id)) {
const element = { cursor, node };
itemsById.set(node.id, element);
flattenedItems.unshift(element);
} else {
itemsById.get(node.id).cursor = cursor;
}
}
return flattenedItems;
}
function extractReadInfo(layout, sourceId, items) {
let lastReadCursor = layout.sourceLastReads[sourceId];
let unreadCount;
if (!lastReadCursor) {
lastReadCursor = items[0] && items[0].cursor;
unreadCount = items.length;
} else {
const index = items.findIndex(({ cursor }) => cursor.toString() === lastReadCursor);
unreadCount = items.length - index - 1;
}
return {
lastReadCursor,
unreadCount
};
}