/* This Source Code Form is subject to the terms of the Mozilla Public * License, v. 2.0. If a copy of the MPL was not distributed with this * file, You can obtain one at . */ // @flow /** * Debuggee reducer * @module reducers/debuggee */ import { sortBy } from "lodash"; import { createSelector } from "reselect"; import { getDisplayName } from "../utils/workers"; import type { Selector } from "./types"; import type { MainThread, WorkerList, Thread } from "../types"; import type { Action } from "../actions/types"; export type DebuggeeState = { workers: WorkerList, mainThread: MainThread }; export function initialDebuggeeState(): DebuggeeState { return { workers: [], mainThread: { actor: "", url: "", type: -1, name: "" } }; } export default function debuggee( state: DebuggeeState = initialDebuggeeState(), action: Action ): DebuggeeState { switch (action.type) { case "CONNECT": return { ...state, mainThread: { ...action.mainThread, name: L10N.getStr("mainThread") } }; case "INSERT_WORKERS": return insertWorkers(state, action.workers); case "REMOVE_WORKERS": const { workers } = action; return { ...state, workers: state.workers.filter(w => !workers.includes(w.actor)) }; case "NAVIGATE": return { ...initialDebuggeeState(), mainThread: action.mainThread }; default: return state; } } function insertWorkers(state, workers) { const formatedWorkers = workers.map(worker => ({ ...worker, name: getDisplayName(worker) })); return { ...state, workers: [...state.workers, ...formatedWorkers] }; } export const getWorkers = (state: OuterState) => state.debuggee.workers; export const getWorkerCount = (state: OuterState) => getWorkers(state).length; export function getWorkerByThread(state: OuterState, thread: string) { return getWorkers(state).find(worker => worker.actor == thread); } export function getMainThread(state: OuterState): MainThread { return state.debuggee.mainThread; } export function getDebuggeeUrl(state: OuterState): string { return getMainThread(state).url; } export const getThreads: Selector = createSelector( getMainThread, getWorkers, (mainThread, workers) => [mainThread, ...sortBy(workers, getDisplayName)] ); type OuterState = { debuggee: DebuggeeState };