Vulcan/packages/nova-core/lib/server/render_context.js
2017-02-06 14:36:42 +08:00

52 lines
1.7 KiB
JavaScript

import { Meteor } from 'meteor/meteor';
import { WebApp } from 'meteor/webapp';
import { DDP } from 'meteor/ddp';
import { Accounts } from 'meteor/accounts-base';
import { createApolloClient, getReducers, getMiddlewares, configureStore } from '../modules.js';
const Fibers = Npm.require('fibers');
export const renderContext = new Meteor.EnvironmentVariable();
const Context = function Context(loginToken) {
this._loginToken = loginToken;
// get the user
if (Meteor.users) {
// check to make sure, we've the loginToken,
// otherwise a random user will fetched from the db
let user;
if (loginToken) {
const hashedToken = loginToken && Accounts._hashLoginToken(loginToken);
const query = { 'services.resume.loginTokens.hashedToken': hashedToken };
const options = { fields: { _id: 1 } };
user = Meteor.users.findOne(query, options);
}
if (user) {
this.userId = user._id;
}
}
};
WebApp.connectHandlers.use(Meteor.bindEnvironment((req, res, next) => {
req.loginToken = req.cookies && req.cookies.meteor_login_token;
req.apolloClient = createApolloClient({ currentUserToken: req.loginToken });
req.reducers = { ...getReducers(), apollo: req.apolloClient.reducer() };
req.middlewares = [...getMiddlewares(), req.apolloClient.middleware()];
req.store = configureStore(req.reducers, {}, req.middlewares);
renderContext.withValue({
loginToken: req.loginToken,
apolloClient: req.apolloClient,
reducers: req.reducers,
middlewares: req.middlewares,
store: req.store,
}, () => {
// support for Meteor.user
Fibers.current._meteor_dynamics[DDP._CurrentInvocation.slot] = new Context(req.loginToken);
next();
});
}));