Fix configs loading #470

Merged
bones7242 merged 15 commits from fix-configs-loading into master 2018-06-07 19:40:01 +02:00
38 changed files with 595 additions and 627 deletions

View file

@ -23,7 +23,7 @@ var _MultisitePage = _interopRequireDefault(require("@pages/MultisitePage"));
function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
var customizedApp = function customizedApp() { var App = function App() {
return _react.default.createElement(_reactRouterDom.Switch, null, _react.default.createElement(_reactRouterDom.Route, { return _react.default.createElement(_reactRouterDom.Switch, null, _react.default.createElement(_reactRouterDom.Route, {
exact: true, exact: true,
path: "/", path: "/",
@ -53,5 +53,5 @@ var customizedApp = function customizedApp() {
})); }));
}; };
var _default = customizedApp; var _default = App;
exports.default = _default; exports.default = _default;

View file

@ -11,6 +11,8 @@ var _reactGa = _interopRequireDefault(require("react-ga"));
var _reactRouterDom = require("react-router-dom"); var _reactRouterDom = require("react-router-dom");
var _siteConfig = _interopRequireDefault(require("@config/siteConfig.json"));
function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
function _typeof(obj) { if (typeof Symbol === "function" && typeof Symbol.iterator === "symbol") { _typeof = function _typeof(obj) { return typeof obj; }; } else { _typeof = function _typeof(obj) { return obj && typeof Symbol === "function" && obj.constructor === Symbol && obj !== Symbol.prototype ? "symbol" : typeof obj; }; } return _typeof(obj); } function _typeof(obj) { if (typeof Symbol === "function" && typeof Symbol.iterator === "symbol") { _typeof = function _typeof(obj) { return typeof obj; }; } else { _typeof = function _typeof(obj) { return obj && typeof Symbol === "function" && obj.constructor === Symbol && obj !== Symbol.prototype ? "symbol" : typeof obj; }; } return _typeof(obj); }
@ -31,14 +33,19 @@ function _assertThisInitialized(self) { if (self === void 0) { throw new Referen
function _getPrototypeOf(o) { _getPrototypeOf = Object.getPrototypeOf || function _getPrototypeOf(o) { return o.__proto__; }; return _getPrototypeOf(o); } function _getPrototypeOf(o) { _getPrototypeOf = Object.getPrototypeOf || function _getPrototypeOf(o) { return o.__proto__; }; return _getPrototypeOf(o); }
var customGAListener = function customGAListener(siteConfig) { var googleId = null;
var googleId = siteConfig.analytics.googleId;
if (_siteConfig.default && _siteConfig.default.analytics) {
googleId = _siteConfig.default.analytics.googleId;
}
if (googleId) {
_reactGa.default.initialize(googleId); _reactGa.default.initialize(googleId);
}
var GAListener = var GAListener =
/*#__PURE__*/ /*#__PURE__*/
function (_React$Component) { function (_React$Component) {
function GAListener() { function GAListener() {
_classCallCheck(this, GAListener); _classCallCheck(this, GAListener);
@ -54,12 +61,14 @@ var customGAListener = function customGAListener(siteConfig) {
}, { }, {
key: "sendPageView", key: "sendPageView",
value: function sendPageView(location) { value: function sendPageView(location) {
if (googleId) {
_reactGa.default.set({ _reactGa.default.set({
page: location.pathname page: location.pathname
}); });
_reactGa.default.pageview(location.pathname); _reactGa.default.pageview(location.pathname);
} }
}
}, { }, {
key: "render", key: "render",
value: function render() { value: function render() {
@ -70,10 +79,8 @@ var customGAListener = function customGAListener(siteConfig) {
_inherits(GAListener, _React$Component); _inherits(GAListener, _React$Component);
return GAListener; return GAListener;
}(_react.default.Component); }(_react.default.Component);
return (0, _reactRouterDom.withRouter)(GAListener); var _default = (0, _reactRouterDom.withRouter)(GAListener);
};
var _default = customGAListener;
exports.default = _default; exports.default = _default;

View file

@ -19,15 +19,14 @@ var _channelCreate = _interopRequireDefault(require("./channelCreate"));
function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
var customizedReducers = function customizedReducers(siteConfig) { // modules
return (0, _redux.combineReducers)({ // local modules
var _default = (0, _redux.combineReducers)({
channel: _channel.default, channel: _channel.default,
channelCreate: _channelCreate.default, channelCreate: _channelCreate.default,
publish: (0, _publish.default)(siteConfig), publish: _publish.default,
show: _show.default, show: _show.default,
site: (0, _site.default)(siteConfig) site: _site.default
}); });
};
var _default = customizedReducers;
exports.default = _default; exports.default = _default;

View file

@ -3,34 +3,37 @@
Object.defineProperty(exports, "__esModule", { Object.defineProperty(exports, "__esModule", {
value: true value: true
}); });
exports.default = void 0; exports.default = _default;
var actions = _interopRequireWildcard(require("../constants/publish_action_types")); var actions = _interopRequireWildcard(require("../constants/publish_action_types"));
var _publish_channel_select_states = require("../constants/publish_channel_select_states"); var _publish_channel_select_states = require("../constants/publish_channel_select_states");
var _siteConfig = _interopRequireDefault(require("@config/siteConfig.json"));
function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
function _interopRequireWildcard(obj) { if (obj && obj.__esModule) { return obj; } else { var newObj = {}; if (obj != null) { for (var key in obj) { if (Object.prototype.hasOwnProperty.call(obj, key)) { var desc = Object.defineProperty && Object.getOwnPropertyDescriptor ? Object.getOwnPropertyDescriptor(obj, key) : {}; if (desc.get || desc.set) { Object.defineProperty(newObj, key, desc); } else { newObj[key] = obj[key]; } } } } newObj.default = obj; return newObj; } } function _interopRequireWildcard(obj) { if (obj && obj.__esModule) { return obj; } else { var newObj = {}; if (obj != null) { for (var key in obj) { if (Object.prototype.hasOwnProperty.call(obj, key)) { var desc = Object.defineProperty && Object.getOwnPropertyDescriptor ? Object.getOwnPropertyDescriptor(obj, key) : {}; if (desc.get || desc.set) { Object.defineProperty(newObj, key, desc); } else { newObj[key] = obj[key]; } } } } newObj.default = obj; return newObj; } }
function _defineProperty(obj, key, value) { if (key in obj) { Object.defineProperty(obj, key, { value: value, enumerable: true, configurable: true, writable: true }); } else { obj[key] = value; } return obj; } function _defineProperty(obj, key, value) { if (key in obj) { Object.defineProperty(obj, key, { value: value, enumerable: true, configurable: true, writable: true }); } else { obj[key] = value; } return obj; }
var customizedPublishReducer = function customizedPublishReducer(siteConfig) { // parse inputs
// parse inputs var disabledConfig = false;
var disabledConfig = false; var disabledMessageConfig = 'none';
var disabledMessageConfig = 'none'; var thumbnailChannel = '';
var thumbnailChannel = ''; var thumbnailChannelId = '';
var thumbnailChannelId = '';
if (siteConfig) { if (_siteConfig.default) {
if (siteConfig.publishing) { if (_siteConfig.default.publishing) {
disabledConfig = siteConfig.publishing.disabled; disabledConfig = _siteConfig.default.publishing.disabled;
disabledMessageConfig = siteConfig.publishing.disabledMessage; disabledMessageConfig = _siteConfig.default.publishing.disabledMessage;
thumbnailChannel = siteConfig.publishing.thumbnailChannel; thumbnailChannel = _siteConfig.default.publishing.thumbnailChannel;
thumbnailChannelId = siteConfig.publishing.thumbnailChannelId; thumbnailChannelId = _siteConfig.default.publishing.thumbnailChannelId;
} }
} // create initial state } // create initial state
var initialState = { var initialState = {
disabled: disabledConfig, disabled: disabledConfig,
disabledMessage: disabledMessageConfig, disabledMessage: disabledMessageConfig,
publishInChannel: false, publishInChannel: false,
@ -56,8 +59,9 @@ var customizedPublishReducer = function customizedPublishReducer(siteConfig) {
thumbnail: null, thumbnail: null,
thumbnailChannel: thumbnailChannel, thumbnailChannel: thumbnailChannel,
thumbnailChannelId: thumbnailChannelId thumbnailChannelId: thumbnailChannelId
}; };
return function () {
function _default() {
var state = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : initialState; var state = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : initialState;
var action = arguments.length > 1 ? arguments[1] : undefined; var action = arguments.length > 1 ? arguments[1] : undefined;
@ -114,8 +118,6 @@ var customizedPublishReducer = function customizedPublishReducer(siteConfig) {
default: default:
return state; return state;
} }
}; }
};
var _default = customizedPublishReducer; ;
exports.default = _default;

View file

@ -3,17 +3,28 @@
Object.defineProperty(exports, "__esModule", { Object.defineProperty(exports, "__esModule", {
value: true value: true
}); });
exports.default = void 0; exports.default = _default;
var customizedSiteReducer = function customizedSiteReducer(siteConfig) { var _siteConfig = _interopRequireDefault(require("@config/siteConfig.json"));
var initialState = {};
if (siteConfig) { function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
var googleAnalyticsId = siteConfig.analytics.googleId,
_siteConfig$assetDefa = siteConfig.assetDefaults, var initialState = {
description: 'default description',
googleAnalyticsId: 'default google id',
host: 'default host',
title: 'default title',
twitter: 'default twitter',
defaultDescription: 'default description',
defaultThumbnail: 'default thumbnail'
};
if (_siteConfig.default) {
var googleAnalyticsId = _siteConfig.default.analytics.googleId,
_siteConfig$assetDefa = _siteConfig.default.assetDefaults,
defaultThumbnail = _siteConfig$assetDefa.thumbnail, defaultThumbnail = _siteConfig$assetDefa.thumbnail,
defaultDescription = _siteConfig$assetDefa.description, defaultDescription = _siteConfig$assetDefa.description,
_siteConfig$details = siteConfig.details, _siteConfig$details = _siteConfig.default.details,
description = _siteConfig$details.description, description = _siteConfig$details.description,
host = _siteConfig$details.host, host = _siteConfig$details.host,
title = _siteConfig$details.title, title = _siteConfig$details.title,
@ -27,19 +38,9 @@ var customizedSiteReducer = function customizedSiteReducer(siteConfig) {
defaultDescription: defaultDescription, defaultDescription: defaultDescription,
defaultThumbnail: defaultThumbnail defaultThumbnail: defaultThumbnail
}; };
} else { }
initialState = {
description: 'default description',
googleAnalyticsId: 'default google id',
host: 'default host',
title: 'default title',
twitter: 'default twitter',
defaultDescription: 'default description',
defaultThumbnail: 'default thumbnail'
};
}
return function () { function _default() {
var state = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : initialState; var state = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : initialState;
var action = arguments.length > 1 ? arguments[1] : undefined; var action = arguments.length > 1 ? arguments[1] : undefined;
@ -47,8 +48,6 @@ var customizedSiteReducer = function customizedSiteReducer(siteConfig) {
default: default:
return state; return state;
} }
}; }
};
var _default = customizedSiteReducer; ;
exports.default = _default;

View file

@ -8,7 +8,7 @@ import ShowPage from '@pages/ShowPage';
import FourOhFourPage from '@pages/FourOhFourPage'; import FourOhFourPage from '@pages/FourOhFourPage';
import MultisitePage from '@pages/MultisitePage'; import MultisitePage from '@pages/MultisitePage';
const customizedApp = () => { const App = () => {
return ( return (
<Switch> <Switch>
<Route exact path='/' component={HomePage} /> <Route exact path='/' component={HomePage} />
@ -22,4 +22,4 @@ const customizedApp = () => {
); );
}; };
export default customizedApp; export default App;

View file

@ -2,28 +2,34 @@ import React from 'react';
import GoogleAnalytics from 'react-ga'; import GoogleAnalytics from 'react-ga';
import { withRouter } from 'react-router-dom'; import { withRouter } from 'react-router-dom';
const customGAListener = (siteConfig) => { import siteConfig from '@config/siteConfig.json';
const { analytics: { googleId } } = siteConfig;
let googleId = null;
if (siteConfig && siteConfig.analytics) {
({ googleId } = siteConfig.analytics);
}
if (googleId) {
GoogleAnalytics.initialize(googleId); GoogleAnalytics.initialize(googleId);
}
class GAListener extends React.Component { class GAListener extends React.Component {
componentDidMount () { componentDidMount () {
this.sendPageView(this.props.history.location); this.sendPageView(this.props.history.location);
this.props.history.listen(this.sendPageView); this.props.history.listen(this.sendPageView);
} }
sendPageView (location) { sendPageView (location) {
if (googleId) {
GoogleAnalytics.set({ page: location.pathname }); GoogleAnalytics.set({ page: location.pathname });
GoogleAnalytics.pageview(location.pathname); GoogleAnalytics.pageview(location.pathname);
} }
}
render () { render () {
return this.props.children; return this.props.children;
} }
} }
return withRouter(GAListener); export default withRouter(GAListener);
};
export default customGAListener;

View file

@ -1,18 +1,17 @@
// modules
import { combineReducers } from 'redux'; import { combineReducers } from 'redux';
// local modules
import PublishReducer from './publish'; import PublishReducer from './publish';
import ChannelReducer from './channel'; import ChannelReducer from './channel';
import ShowReducer from './show'; import ShowReducer from './show';
import SiteReducer from './site'; import SiteReducer from './site';
import ChannelCreateReducer from './channelCreate'; import ChannelCreateReducer from './channelCreate';
const customizedReducers = (siteConfig) => { export default combineReducers({
return combineReducers({
channel : ChannelReducer, channel : ChannelReducer,
channelCreate: ChannelCreateReducer, channelCreate: ChannelCreateReducer,
publish : PublishReducer(siteConfig), publish : PublishReducer,
show : ShowReducer, show : ShowReducer,
site : SiteReducer(siteConfig), site : SiteReducer,
}) });
};
export default customizedReducers;

View file

@ -1,22 +1,24 @@
import * as actions from '../constants/publish_action_types'; import * as actions from '../constants/publish_action_types';
import { LOGIN } from '../constants/publish_channel_select_states'; import { LOGIN } from '../constants/publish_channel_select_states';
const customizedPublishReducer = (siteConfig) => { import siteConfig from '@config/siteConfig.json';
// parse inputs
let disabledConfig = false; // parse inputs
let disabledMessageConfig = 'none'; let disabledConfig = false;
let thumbnailChannel = ''; let disabledMessageConfig = 'none';
let thumbnailChannelId = ''; let thumbnailChannel = '';
if (siteConfig) { let thumbnailChannelId = '';
if (siteConfig) {
if (siteConfig.publishing) { if (siteConfig.publishing) {
disabledConfig = siteConfig.publishing.disabled; disabledConfig = siteConfig.publishing.disabled;
disabledMessageConfig = siteConfig.publishing.disabledMessage; disabledMessageConfig = siteConfig.publishing.disabledMessage;
thumbnailChannel = siteConfig.publishing.thumbnailChannel; thumbnailChannel = siteConfig.publishing.thumbnailChannel;
thumbnailChannelId = siteConfig.publishing.thumbnailChannelId; thumbnailChannelId = siteConfig.publishing.thumbnailChannelId;
} }
} }
// create initial state
const initialState = { // create initial state
const initialState = {
disabled : disabledConfig, disabled : disabledConfig,
disabledMessage : disabledMessageConfig, disabledMessage : disabledMessageConfig,
publishInChannel : false, publishInChannel : false,
@ -42,8 +44,9 @@ const customizedPublishReducer = (siteConfig) => {
thumbnail: null, thumbnail: null,
thumbnailChannel, thumbnailChannel,
thumbnailChannelId, thumbnailChannelId,
}; };
return (state = initialState, action) => {
export default function (state = initialState, action) {
switch (action.type) { switch (action.type) {
case actions.FILE_SELECTED: case actions.FILE_SELECTED:
return Object.assign({}, initialState, { // note: clears to initial state return Object.assign({}, initialState, { // note: clears to initial state
@ -90,7 +93,4 @@ const customizedPublishReducer = (siteConfig) => {
default: default:
return state; return state;
} }
};
}; };
export default customizedPublishReducer;

View file

@ -1,6 +1,16 @@
const customizedSiteReducer = (siteConfig) => { import siteConfig from '@config/siteConfig.json';
let initialState = {};
if (siteConfig) { let initialState = {
description : 'default description',
googleAnalyticsId : 'default google id',
host : 'default host',
title : 'default title',
twitter : 'default twitter',
defaultDescription: 'default description',
defaultThumbnail : 'default thumbnail',
};
if (siteConfig) {
const { const {
analytics: { analytics: {
googleId: googleAnalyticsId, googleId: googleAnalyticsId,
@ -26,23 +36,11 @@ const customizedSiteReducer = (siteConfig) => {
defaultDescription, defaultDescription,
defaultThumbnail, defaultThumbnail,
}; };
} else { }
initialState = {
description : 'default description', export default function (state = initialState, action) {
googleAnalyticsId : 'default google id',
host : 'default host',
title : 'default title',
twitter : 'default twitter',
defaultDescription: 'default description',
defaultThumbnail : 'default thumbnail',
};
}
return (state = initialState, action) => {
switch (action.type) { switch (action.type) {
default: default:
return state; return state;
} }
};
}; };
export default customizedSiteReducer;

View file

@ -1,8 +0,0 @@
const lbryConfig = {
api: {
apiHost: 'localhost',
apiPort: '5279',
},
};
module.exports = lbryConfig;

View file

@ -1,36 +0,0 @@
const logger = require('winston');
function LoggerConfig () {
this.logLevel = 'debug';
this.update = (config) => {
if (!config) {
return logger.warn('No logger config received.');
}
logger.info('configuring winston logger...');
// update values with local config params
const {logLevel} = config;
this.logLevel = logLevel;
// configure the winston logger
logger.configure({
transports: [
new (logger.transports.Console)({
level : this.logLevel,
timestamp : false,
colorize : true,
prettyPrint : true,
handleExceptions : true,
humanReadableUnhandledException: true,
}),
],
});
// test all the log levels
logger.info('testing winston log levels...');
logger.warn('Testing: Log Level 1');
logger.info('Testing: Log Level 2');
logger.verbose('Testing: Log Level 3');
logger.debug('Testing: Log Level 4');
logger.silly('Testing: Log Level 5');
};
};
module.exports = new LoggerConfig();

View file

@ -1,20 +0,0 @@
const logger = require('winston');
function MysqlConfig () {
this.database = 'default';
this.username = 'default';
this.password = 'default';
this.update = (config) => {
if (!config) {
return logger.warn('No MySQL config received.');
}
// configure credentials
logger.info('configuring mysql...');
const { database, username, password } = config;
this.database = database;
this.username = username;
this.password = password;
};
}
module.exports = new MysqlConfig();

View file

@ -1,43 +0,0 @@
function SiteConfig () {
this.analytics = {
googleId: 'default',
};
this.assetDefaults = {
description: 'An asset published on Spee.ch',
thumbnail : 'https://spee.ch/assets/img/video_thumb_default.png',
title : 'A Spee.ch Implementation',
};
this.auth = {
sessionKey: 'default',
};
this.details = {
description: 'Welcome to my decentralized image and video sharing site.',
host : 'http://localhost:3000',
port : 3000,
title : 'My Spee.ch Site',
twitter : '@exampleTwitterHandle',
};
this.publishing = {
additionalClaimAddresses: [],
disabled : false,
disabledMessage : 'Please check back soon.',
primaryClaimAddress : 'default',
thumbnailChannel : 'default',
thumbnailChannelId : 'default',
uploadDirectory : '/home/lbry/Uploads',
};
this.update = (config) => {
if (!config) {
return console.log('No site config received.');
}
const { analytics, assetDefaults, auth, details, publishing } = config;
console.log('Configuring site details...');
this.analytics = analytics;
this.assetDefaults = assetDefaults;
this.auth = auth;
this.details = details;
this.publishing = publishing;
};
}
module.exports = new SiteConfig();

View file

@ -1,51 +0,0 @@
const winstonSlackWebHook = require('winston-slack-webhook').SlackWebHook;
const winston = require('winston');
function SlackConfig () {
this.slackWebHook = 'default';
this.slackErrorChannel = 'default';
this.slackInfoChannel = 'default';
this.update = (config) => {
if (!config) {
return winston.warn('No slack config received');
}
// update variables
winston.info('configuring slack logger...');
const {slackWebHook, slackErrorChannel, slackInfoChannel} = config;
this.slackWebHook = slackWebHook;
this.slackErrorChannel = slackErrorChannel;
this.slackInfoChannel = slackInfoChannel;
// update slack webhook settings
if (this.slackWebHook) {
// add a transport for errors to slack
if (this.slackErrorChannel) {
winston.add(winstonSlackWebHook, {
name : 'slack-errors-transport',
level : 'warn',
webhookUrl: this.slackWebHook,
channel : this.slackErrorChannel,
username : 'spee.ch',
iconEmoji : ':face_with_head_bandage:',
});
};
if (this.slackInfoChannel) {
winston.add(winstonSlackWebHook, {
name : 'slack-info-transport',
level : 'info',
webhookUrl: this.slackWebHook,
channel : this.slackInfoChannel,
username : 'spee.ch',
iconEmoji : ':nerd_face:',
});
};
// send test messages
winston.info('testing slack logger...');
winston.error('Slack "error" logging is online.');
winston.info('Slack "info" logging is online.');
} else {
winston.warn('Slack logging is not enabled because no slackWebHook config var provided.');
}
};
};
module.exports = new SlackConfig();

View file

@ -1,4 +1,18 @@
// app dependencies // set up module aliasing
const moduleAlias = require('module-alias');
const createModuleAliases = require('./server/utils/createModuleAliases.js');
const customAliases = createModuleAliases();
moduleAlias.addAliases(customAliases);
// test configs
const checkForConfig = require('./server/utils/checkForConfig.js');
checkForConfig('siteConfig');
checkForConfig('mysqlConfig');
checkForConfig('slackConfig');
checkForConfig('loggerConfig');
checkForConfig('siteConfig');
// load modules
const express = require('express'); const express = require('express');
const bodyParser = require('body-parser'); const bodyParser = require('body-parser');
const expressHandlebars = require('express-handlebars'); const expressHandlebars = require('express-handlebars');
@ -7,29 +21,36 @@ const helmet = require('helmet');
const cookieSession = require('cookie-session'); const cookieSession = require('cookie-session');
const http = require('http'); const http = require('http');
const logger = require('winston'); const logger = require('winston');
const requestLogger = require('./server/middleware/requestLogger.js');
const Path = require('path'); const Path = require('path');
const loggerConfig = require('./config/loggerConfig.js');
const mysqlConfig = require('./config/mysqlConfig.js'); // load local modules
const siteConfig = require('./config/siteConfig.js'); const db = require('./server/models');
const slackConfig = require('./config/slackConfig.js'); const requestLogger = require('./server/middleware/requestLogger.js');
const createDatabaseIfNotExists = require('./server/models/utils/createDatabaseIfNotExists.js'); const createDatabaseIfNotExists = require('./server/models/utils/createDatabaseIfNotExists.js');
const { getWalletBalance } = require('./server/lbrynet/index'); const { getWalletBalance } = require('./server/lbrynet');
const configureLogging = require('./server/utils/configureLogging.js');
const configureSlack = require('./server/utils/configureSlack.js');
const speechPassport = require('./server/speechPassport');
const {
details: { port: PORT },
auth: { sessionKey },
} = require('@config/siteConfig');
function Server () { function Server () {
this.configureLogger = loggerConfig.update; this.initialize = () => {
this.configureMysql = mysqlConfig.update; // configure logging
this.configureSite = siteConfig.update; configureLogging();
this.configureSlack = slackConfig.update; // configure slack logging
configureSlack();
};
this.createApp = () => { this.createApp = () => {
// create an Express application /* create app */
const app = express(); const app = express();
// trust the proxy to get ip address for us // trust the proxy to get ip address for us
app.enable('trust proxy'); app.enable('trust proxy');
/* add middleware */
// set HTTP headers to protect against well-known web vulnerabilties // set HTTP headers to protect against well-known web vulnerabilties
app.use(helmet()); app.use(helmet());
@ -47,10 +68,7 @@ function Server () {
// add custom middleware (note: build out to accept dynamically use what is in server/middleware/ // add custom middleware (note: build out to accept dynamically use what is in server/middleware/
app.use(requestLogger); app.use(requestLogger);
// configure passport
const speechPassport = require('./server/speechPassport/index');
// initialize passport // initialize passport
const sessionKey = siteConfig.auth.sessionKey;
app.use(cookieSession({ app.use(cookieSession({
name : 'session', name : 'session',
keys : [sessionKey], keys : [sessionKey],
@ -67,32 +85,38 @@ function Server () {
app.set('view engine', 'handlebars'); app.set('view engine', 'handlebars');
// set the routes on the app // set the routes on the app
require('./server/routes/auth/index')(app); require('./server/routes/auth')(app);
require('./server/routes/api/index')(app); require('./server/routes/api')(app);
require('./server/routes/pages/index')(app); require('./server/routes/pages')(app);
require('./server/routes/assets/index')(app); require('./server/routes/assets')(app);
require('./server/routes/fallback/index')(app); require('./server/routes/fallback')(app);
this.app = app; this.app = app;
}; };
this.initialize = () => { this.createServer = () => {
this.createApp(); /* create server */
this.server = http.Server(this.app); this.server = http.Server(this.app);
}; };
this.start = () => { this.syncDatabase = () => {
const db = require('./server/models/index'); return createDatabaseIfNotExists()
const PORT = siteConfig.details.port;
// sync sequelize
createDatabaseIfNotExists()
.then(() => { .then(() => {
return getWalletBalance();
})
.then(balance => {
logger.info('starting LBC balance:', balance);
db.sequelize.sync(); db.sequelize.sync();
this.server.listen(PORT, () => { })
};
this.start = () => {
this.initialize();
this.createApp();
this.createServer();
/* start the server */
Promise.all([
this.syncDatabase(),
getWalletBalance(),
])
.then(([syncResult, walletBalance]) => {
logger.info('starting LBC balance:', walletBalance);
return this.server.listen(PORT, () => {
logger.info(`Server is listening on PORT ${PORT}`); logger.info(`Server is listening on PORT ${PORT}`);
}); })
}) })
.catch(error => { .catch(error => {
if (error.code === 'ECONNREFUSED') { if (error.code === 'ECONNREFUSED') {
@ -103,6 +127,6 @@ function Server () {
logger.error(error); logger.error(error);
}); });
}; };
}; }
module.exports = Server; module.exports = Server;

5
package-lock.json generated
View file

@ -5291,6 +5291,11 @@
} }
} }
}, },
"module-alias": {
"version": "2.0.6",
"resolved": "https://registry.npmjs.org/module-alias/-/module-alias-2.0.6.tgz",
"integrity": "sha1-q7LPoHAU9QNRStUGHG8D15tZGIk="
},
"moment": { "moment": {
"version": "2.22.1", "version": "2.22.1",
"resolved": "http://registry.npmjs.org/moment/-/moment-2.22.1.tgz", "resolved": "http://registry.npmjs.org/moment/-/moment-2.22.1.tgz",

View file

@ -38,6 +38,7 @@
"express": "^4.15.2", "express": "^4.15.2",
"express-handlebars": "^3.0.0", "express-handlebars": "^3.0.0",
"helmet": "^3.8.1", "helmet": "^3.8.1",
"module-alias": "^2.0.6",
"mysql2": "^1.3.5", "mysql2": "^1.3.5",
"passport": "^0.4.0", "passport": "^0.4.0",
"passport-local": "^1.0.0", "passport-local": "^1.0.0",

View file

@ -1,5 +1,5 @@
const db = require('../../../../models'); const db = require('../../../../models');
const { publishing: { primaryClaimAddress, additionalClaimAddresses } } = require('../../../../../config/siteConfig.js'); const { publishing: { primaryClaimAddress, additionalClaimAddresses } } = require('@config/siteConfig');
const Sequelize = require('sequelize'); const Sequelize = require('sequelize');
const Op = Sequelize.Op; const Op = Sequelize.Op;

View file

@ -1,5 +1,5 @@
const logger = require('winston'); const logger = require('winston');
const { details, publishing } = require('../../../../../config/siteConfig.js'); const { details, publishing } = require('@config/siteConfig');
const createBasicPublishParams = (filePath, name, title, description, license, nsfw, thumbnail) => { const createBasicPublishParams = (filePath, name, title, description, license, nsfw, thumbnail) => {
logger.debug(`Creating Publish Parameters`); logger.debug(`Creating Publish Parameters`);

View file

@ -1,5 +1,5 @@
const logger = require('winston'); const logger = require('winston');
const { details, publishing } = require('../../../../../config/siteConfig.js'); const { details, publishing } = require('@config/siteConfig');
const createThumbnailPublishParams = (thumbnailFilePath, claimName, license, nsfw) => { const createThumbnailPublishParams = (thumbnailFilePath, claimName, license, nsfw) => {
if (!thumbnailFilePath) { if (!thumbnailFilePath) {

View file

@ -1,4 +1,4 @@
const { details: { host } } = require('../../../../../config/siteConfig.js'); const { details: { host } } = require('@config/siteConfig');
const { sendGATimingEvent } = require('../../../../utils/googleAnalytics.js'); const { sendGATimingEvent } = require('../../../../utils/googleAnalytics.js');

View file

@ -1,4 +1,4 @@
const { details: { host } } = require('../../../config/siteConfig.js'); const { details: { host } } = require('@config/siteConfig');
const sendEmbedPage = ({ params }, res) => { const sendEmbedPage = ({ params }, res) => {
const claimId = params.claimId; const claimId = params.claimId;

View file

@ -1,6 +1,6 @@
const axios = require('axios'); const axios = require('axios');
const logger = require('winston'); const logger = require('winston');
const { api: { apiHost, apiPort } } = require('../../config/lbryConfig.js'); const { apiHost, apiPort } = require('@config/lbryConfig');
const lbrynetUri = 'http://' + apiHost + ':' + apiPort; const lbrynetUri = 'http://' + apiHost + ':' + apiPort;
const { chooseGaLbrynetPublishLabel, sendGATimingEvent } = require('../utils/googleAnalytics.js'); const { chooseGaLbrynetPublishLabel, sendGATimingEvent } = require('../utils/googleAnalytics.js');
const handleLbrynetResponse = require('./utils/handleLbrynetResponse.js'); const handleLbrynetResponse = require('./utils/handleLbrynetResponse.js');

View file

@ -1,6 +1,6 @@
const logger = require('winston'); const logger = require('winston');
const returnShortId = require('./utils/returnShortId.js'); const returnShortId = require('./utils/returnShortId.js');
const { assetDefaults: { thumbnail: defaultThumbnail }, details: { host } } = require('../../config/siteConfig.js'); const { assetDefaults: { thumbnail: defaultThumbnail }, details: { host } } = require('@config/siteConfig');
const NO_CLAIM = 'NO_CLAIM'; const NO_CLAIM = 'NO_CLAIM';

View file

@ -1,3 +1,6 @@
const Sequelize = require('sequelize');
const logger = require('winston');
const Certificate = require('./certificate.js'); const Certificate = require('./certificate.js');
const Channel = require('./channel.js'); const Channel = require('./channel.js');
const Claim = require('./claim.js'); const Claim = require('./claim.js');
@ -6,10 +9,10 @@ const Request = require('./request.js');
const User = require('./user.js'); const User = require('./user.js');
const Blocked = require('./blocked.js'); const Blocked = require('./blocked.js');
const Sequelize = require('sequelize'); const {database, username, password} = require('@config/mysqlConfig');
const logger = require('winston'); if (!database || !username || !password) {
logger.warn('missing database, user, or password from mysqlConfig');
const {database, username, password} = require('../../config/mysqlConfig.js'); }
// set sequelize options // set sequelize options
const sequelize = new Sequelize(database, username, password, { const sequelize = new Sequelize(database, username, password, {

View file

@ -1,7 +1,7 @@
const Sequelize = require('sequelize'); const Sequelize = require('sequelize');
const {database, username, password} = require('@config/mysqlConfig');
const createDatabaseIfNotExists = () => { const createDatabaseIfNotExists = () => {
const {database, username, password} = require('../../../config/mysqlConfig.js');
const sequelize = new Sequelize('', username, password, { const sequelize = new Sequelize('', username, password, {
dialect : 'mysql', dialect : 'mysql',
logging : false, logging : false,

View file

@ -10,6 +10,8 @@ var _reactRedux = require("react-redux");
var _reactRouterDom = require("react-router-dom"); var _reactRouterDom = require("react-router-dom");
var _reactHelmet = _interopRequireDefault(require("react-helmet"));
var _reducers = _interopRequireDefault(require("@reducers")); var _reducers = _interopRequireDefault(require("@reducers"));
var _GAListener = _interopRequireDefault(require("@components/GAListener")); var _GAListener = _interopRequireDefault(require("@components/GAListener"));
@ -18,27 +20,19 @@ var _app = _interopRequireDefault(require("@app"));
var _renderFullPage = _interopRequireDefault(require("../renderFullPage.js")); var _renderFullPage = _interopRequireDefault(require("../renderFullPage.js"));
var _reactHelmet = _interopRequireDefault(require("react-helmet"));
function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
var siteConfig = require('../../../config/siteConfig.js');
module.exports = function (req, res) { module.exports = function (req, res) {
var context = {}; // customize the reducer by passing in intial state configs var context = {}; // create a new Redux store instance
var MyReducers = (0, _reducers.default)(siteConfig); var store = (0, _redux.createStore)(_reducers.default); // render component to a string
var MyApp = _app.default;
var MyGAListener = (0, _GAListener.default)(siteConfig); // create a new Redux store instance
var store = (0, _redux.createStore)(MyReducers); // render component to a string
var html = (0, _server.renderToString)(_react.default.createElement(_reactRedux.Provider, { var html = (0, _server.renderToString)(_react.default.createElement(_reactRedux.Provider, {
store: store store: store
}, _react.default.createElement(_reactRouterDom.StaticRouter, { }, _react.default.createElement(_reactRouterDom.StaticRouter, {
location: req.url, location: req.url,
context: context context: context
}, _react.default.createElement(MyGAListener, null, _react.default.createElement(MyApp, null))))); // get head tags from helmet }, _react.default.createElement(_GAListener.default, null, _react.default.createElement(_app.default, null))))); // get head tags from helmet
var helmet = _reactHelmet.default.renderStatic(); // check for a redirect var helmet = _reactHelmet.default.renderStatic(); // check for a redirect

View file

@ -16,6 +16,8 @@ var _reduxSaga = _interopRequireDefault(require("redux-saga"));
var _effects = require("redux-saga/effects"); var _effects = require("redux-saga/effects");
var _reactHelmet = _interopRequireDefault(require("react-helmet"));
var _reducers = _interopRequireDefault(require("@reducers")); var _reducers = _interopRequireDefault(require("@reducers"));
var _GAListener = _interopRequireDefault(require("@components/GAListener")); var _GAListener = _interopRequireDefault(require("@components/GAListener"));
@ -26,12 +28,8 @@ var _sagas = _interopRequireDefault(require("@sagas"));
var _actions = _interopRequireDefault(require("@actions")); var _actions = _interopRequireDefault(require("@actions"));
var _reactHelmet = _interopRequireDefault(require("react-helmet"));
function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
var siteConfig = require('../../../config/siteConfig.js');
var returnSagaWithParams = function returnSagaWithParams(saga, params) { var returnSagaWithParams = function returnSagaWithParams(saga, params) {
return ( return (
/*#__PURE__*/ /*#__PURE__*/
@ -54,16 +52,12 @@ var returnSagaWithParams = function returnSagaWithParams(saga, params) {
}; };
module.exports = function (req, res) { module.exports = function (req, res) {
var context = {}; // configure the reducers by passing initial state configs var context = {}; // create and apply middleware
var MyReducers = (0, _reducers.default)(siteConfig);
var MyApp = _app.default;
var MyGAListener = (0, _GAListener.default)(siteConfig); // create and apply middleware
var sagaMiddleware = (0, _reduxSaga.default)(); var sagaMiddleware = (0, _reduxSaga.default)();
var middleware = (0, _redux.applyMiddleware)(sagaMiddleware); // create a new Redux store instance var middleware = (0, _redux.applyMiddleware)(sagaMiddleware); // create a new Redux store instance
var store = (0, _redux.createStore)(MyReducers, middleware); // create saga var store = (0, _redux.createStore)(_reducers.default, middleware); // create saga
var action = _actions.default.onHandleShowPageUri(req.params); var action = _actions.default.onHandleShowPageUri(req.params);
@ -76,7 +70,7 @@ module.exports = function (req, res) {
}, _react.default.createElement(_reactRouterDom.StaticRouter, { }, _react.default.createElement(_reactRouterDom.StaticRouter, {
location: req.url, location: req.url,
context: context context: context
}, _react.default.createElement(MyGAListener, null, _react.default.createElement(MyApp, null))))); // get head tags from helmet }, _react.default.createElement(_GAListener.default, null, _react.default.createElement(_app.default, null))))); // get head tags from helmet
var helmet = _reactHelmet.default.renderStatic(); // check for a redirect var helmet = _reactHelmet.default.renderStatic(); // check for a redirect

View file

@ -3,32 +3,26 @@ import { renderToString } from 'react-dom/server';
import { createStore } from 'redux'; import { createStore } from 'redux';
import { Provider } from 'react-redux'; import { Provider } from 'react-redux';
import { StaticRouter } from 'react-router-dom'; import { StaticRouter } from 'react-router-dom';
import Helmet from 'react-helmet';
import Reducers from '@reducers'; import Reducers from '@reducers';
import GAListener from '@components/GAListener'; import GAListener from '@components/GAListener';
import App from '@app'; import App from '@app';
import renderFullPage from '../renderFullPage.js'; import renderFullPage from '../renderFullPage.js';
import Helmet from 'react-helmet';
const siteConfig = require('../../../config/siteConfig.js');
module.exports = (req, res) => { module.exports = (req, res) => {
let context = {}; let context = {};
// customize the reducer by passing in intial state configs
const MyReducers = Reducers(siteConfig);
const MyApp = App;
const MyGAListener = GAListener(siteConfig);
// create a new Redux store instance // create a new Redux store instance
const store = createStore(MyReducers); const store = createStore(Reducers);
// render component to a string // render component to a string
const html = renderToString( const html = renderToString(
<Provider store={store}> <Provider store={store}>
<StaticRouter location={req.url} context={context}> <StaticRouter location={req.url} context={context}>
<MyGAListener> <GAListener>
<MyApp /> <App />
</MyGAListener> </GAListener>
</StaticRouter> </StaticRouter>
</Provider> </Provider>
); );

View file

@ -6,14 +6,13 @@ import { StaticRouter } from 'react-router-dom';
import renderFullPage from '../renderFullPage'; import renderFullPage from '../renderFullPage';
import createSagaMiddleware from 'redux-saga'; import createSagaMiddleware from 'redux-saga';
import { call } from 'redux-saga/effects'; import { call } from 'redux-saga/effects';
import Helmet from 'react-helmet';
import Reducers from '@reducers'; import Reducers from '@reducers';
import GAListener from '@components/GAListener'; import GAListener from '@components/GAListener';
import App from '@app'; import App from '@app';
import Sagas from '@sagas'; import Sagas from '@sagas';
import Actions from '@actions'; import Actions from '@actions';
import Helmet from 'react-helmet';
const siteConfig = require('../../../config/siteConfig.js');
const returnSagaWithParams = (saga, params) => { const returnSagaWithParams = (saga, params) => {
return function * () { return function * () {
@ -24,17 +23,12 @@ const returnSagaWithParams = (saga, params) => {
module.exports = (req, res) => { module.exports = (req, res) => {
let context = {}; let context = {};
// configure the reducers by passing initial state configs
const MyReducers = Reducers(siteConfig);
const MyApp = App;
const MyGAListener = GAListener(siteConfig);
// create and apply middleware // create and apply middleware
const sagaMiddleware = createSagaMiddleware(); const sagaMiddleware = createSagaMiddleware();
const middleware = applyMiddleware(sagaMiddleware); const middleware = applyMiddleware(sagaMiddleware);
// create a new Redux store instance // create a new Redux store instance
const store = createStore(MyReducers, middleware); const store = createStore(Reducers, middleware);
// create saga // create saga
const action = Actions.onHandleShowPageUri(req.params); const action = Actions.onHandleShowPageUri(req.params);
@ -49,9 +43,9 @@ module.exports = (req, res) => {
const html = renderToString( const html = renderToString(
<Provider store={store}> <Provider store={store}>
<StaticRouter location={req.url} context={context}> <StaticRouter location={req.url} context={context}>
<MyGAListener> <GAListener>
<MyApp /> <App />
</MyGAListener> </GAListener>
</StaticRouter> </StaticRouter>
</Provider> </Provider>
); );

View file

@ -1,5 +1,5 @@
const multipart = require('connect-multiparty'); const multipart = require('connect-multiparty');
const { publishing: { uploadDirectory } } = require('../../../config/siteConfig.js'); const { publishing: { uploadDirectory } } = require('@config/siteConfig');
const multipartMiddleware = multipart({uploadDir: uploadDirectory}); const multipartMiddleware = multipart({uploadDir: uploadDirectory});
module.exports = multipartMiddleware; module.exports = multipartMiddleware;

View file

@ -0,0 +1,9 @@
const logger = require('winston');
module.exports = (name) => {
const config = require(`@config/${name}`);
if (!config) {
return logger.warn(`Server could not find config file for ${name}.`);
}
logger.debug(`found ${name} config:`, config);
};

View file

@ -0,0 +1,36 @@
const logger = require('winston');
const config = require('@config/loggerConfig');
const { logLevel } = config;
function configureLogging () {
logger.info('configuring winston logger...');
if (!config) {
return logger.warn('No logger config found');
}
if (!logLevel) {
logger.warn('No logLevel found in config.');
}
// configure the winston logger
logger.configure({
transports: [
new (logger.transports.Console)({
level : logLevel || 'debug',
timestamp : false,
colorize : true,
prettyPrint : true,
handleExceptions : true,
humanReadableUnhandledException: true,
}),
],
});
// test all the log levels
logger.info('testing winston log levels...');
logger.warn('Testing: Log Level 1');
logger.info('Testing: Log Level 2');
logger.verbose('Testing: Log Level 3');
logger.debug('Testing: Log Level 4');
logger.silly('Testing: Log Level 5');
}
module.exports = configureLogging;

View file

@ -0,0 +1,46 @@
const winstonSlackWebHook = require('winston-slack-webhook').SlackWebHook;
const logger = require('winston');
const config = require('@config/slackConfig');
const {slackWebHook, slackErrorChannel, slackInfoChannel} = config;
function configureSlack () {
logger.info('configuring slack logger...');
if (!config) {
return logger.warn('No slack config found');
}
// update slack webhook settings
if (!slackWebHook) {
return logger.info('Slack logging is not enabled because no slackWebHook config var provided.');
}
// add a transport for errors to slack
if (slackErrorChannel) {
logger.add(winstonSlackWebHook, {
name : 'slack-errors-transport',
level : 'warn',
webhookUrl: slackWebHook,
channel : slackErrorChannel,
username : 'spee.ch',
iconEmoji : ':face_with_head_bandage:',
});
} else {
logger.warn('No slack error channel logging set up');
}
// add a transport for info in slack
if (slackInfoChannel) {
logger.add(winstonSlackWebHook, {
name : 'slack-info-transport',
level : 'info',
webhookUrl: slackWebHook,
channel : slackInfoChannel,
username : 'spee.ch',
iconEmoji : ':nerd_face:',
});
} else {
logger.warn('No slack info channel logging set up');
}
// send test messages
logger.info('Slack logging is online.');
}
module.exports = configureSlack;

View file

@ -0,0 +1,11 @@
const { resolve } = require('path');
const WWW_SPEECH_ROOT = resolve(process.cwd());
module.exports = () => {
let moduleAliases = {};
// default aliases
moduleAliases['@config'] = resolve(WWW_SPEECH_ROOT, 'config');
moduleAliases['@public'] = resolve(WWW_SPEECH_ROOT, 'public');
// return finished aliases
return moduleAliases;
};

View file

@ -1,8 +1,8 @@
const logger = require('winston'); const logger = require('winston');
const ua = require('universal-analytics'); const ua = require('universal-analytics');
const { analytics : { googleId }, details: { title } } = require('../../config/siteConfig.js'); const { analytics : { googleId }, details: { title } } = require('@config/siteConfig');
function createServeEventParams (headers, ip, originalUrl) { const createServeEventParams = (headers, ip, originalUrl) => {
return { return {
eventCategory : 'client requests', eventCategory : 'client requests',
eventAction : 'serve request', eventAction : 'serve request',
@ -11,9 +11,9 @@ function createServeEventParams (headers, ip, originalUrl) {
userAgentOverride: headers['user-agent'], userAgentOverride: headers['user-agent'],
documentReferrer : headers['referer'], documentReferrer : headers['referer'],
}; };
} };
function createPublishTimingEventParams (category, variable, label, startTime, endTime) { const createTimingEventParams = (category, variable, label, startTime, endTime) => {
const duration = endTime - startTime; const duration = endTime - startTime;
return { return {
userTimingCategory : category, userTimingCategory : category,
@ -21,43 +21,48 @@ function createPublishTimingEventParams (category, variable, label, startTime, e
userTimingTime : duration, userTimingTime : duration,
userTimingLabel : label, userTimingLabel : label,
}; };
} };
function sendGoogleAnalyticsEvent (ip, params) { const sendGoogleAnalyticsEvent = (ip, params) => {
if (!googleId) {
return logger.debug('Skipping analytics event because no GoogleId present in configs');
}
const visitorId = ip.replace(/\./g, '-'); const visitorId = ip.replace(/\./g, '-');
const visitor = ua(googleId, visitorId, { strictCidFormat: false, https: true }); const visitor = ua(googleId, visitorId, { strictCidFormat: false, https: true });
visitor.event(params, (err) => { visitor.event(params, (err) => {
if (err) { if (err) {
logger.error('Google Analytics Event Error >>', err); return logger.error('Google Analytics Event Error >>', err);
} }
logger.debug(`Event successfully sent to google analytics`); logger.debug(`Event successfully sent to google analytics`, params);
}); });
} };
function sendGoogleAnalyticsTiming (visitorId, params) { const sendGoogleAnalyticsTiming = (siteTitle, params) => {
const visitor = ua(googleId, visitorId, { strictCidFormat: false, https: true }); if (!googleId) {
return logger.debug('Skipping analytics timing because no GoogleId present in configs');
}
const visitor = ua(googleId, siteTitle, { strictCidFormat: false, https: true });
visitor.timing(params, (err) => { visitor.timing(params, (err) => {
if (err) { if (err) {
logger.error('Google Analytics Event Error >>', err); return logger.error('Google Analytics Event Error >>', err);
} }
logger.debug(`Timing event successfully sent to google analytics`); logger.debug(`Event successfully sent to google analytics`, params);
}); });
} };
function sendGAServeEvent (headers, ip, originalUrl) { const sendGAServeEvent = (headers, ip, originalUrl) => {
logger.debug('headers:', headers);
const params = createServeEventParams(headers, ip, originalUrl); const params = createServeEventParams(headers, ip, originalUrl);
sendGoogleAnalyticsEvent(ip, params); sendGoogleAnalyticsEvent(ip, params);
} };
function sendGATimingEvent (category, variable, label, startTime, endTime) { const sendGATimingEvent = (category, variable, label, startTime, endTime) => {
const params = createPublishTimingEventParams(category, variable, label, startTime, endTime); const params = createTimingEventParams(category, variable, label, startTime, endTime);
sendGoogleAnalyticsTiming(title, params); sendGoogleAnalyticsTiming(title, params);
} };
function chooseGaLbrynetPublishLabel ({ channel_name: channelName, channel_id: channelId }) { const chooseGaLbrynetPublishLabel = ({ channel_name: channelName, channel_id: channelId }) => {
return (channelName || channelId ? 'PUBLISH_IN_CHANNEL_CLAIM' : 'PUBLISH_ANONYMOUS_CLAIM'); return (channelName || channelId ? 'PUBLISH_IN_CHANNEL_CLAIM' : 'PUBLISH_ANONYMOUS_CLAIM');
} };
module.exports = { module.exports = {
sendGAServeEvent, sendGAServeEvent,

View file

@ -1,8 +1,8 @@
const chai = require('chai'); const chai = require('chai');
const expect = chai.expect; const expect = chai.expect;
const chaiHttp = require('chai-http'); const chaiHttp = require('chai-http');
const { details: { host } } = require('../../config/siteConfig.js'); const { details: { host } } = require('@config/siteConfig');
const { testChannel, testChannelId, testChannelPassword } = require('../../devConfig/testingConfig.js'); const { testChannel, testChannelId, testChannelPassword } = require('@devConfig/testingConfig.js');
const requestTimeout = 20000; const requestTimeout = 20000;
const publishTimeout = 120000; const publishTimeout = 120000;
const fs = require('fs'); const fs = require('fs');