feat: priority

This commit is contained in:
cha0s 2024-01-09 22:22:58 -06:00
parent 28d9e7ddcc
commit 9d2e9573f3
9 changed files with 150 additions and 97 deletions

View File

@ -1,3 +1,5 @@
import {Flecks} from '@flecks/core';
import {createDatabaseConnection} from './connection';
import containers from './containers';
import register from './register';
@ -69,7 +71,10 @@ export const hooks = {
flecks.db.Models = flecks.gather('@flecks/db/server.models', {typeProperty: 'name'});
},
'@flecks/docker.containers': containers,
'@flecks/server.up': async (flecks) => {
flecks.db.sequelize = await createDatabaseConnection(flecks);
},
'@flecks/server.up': Flecks.priority(
async (flecks) => {
flecks.db.sequelize = await createDatabaseConnection(flecks);
},
{after: '@flecks/docker/server'},
),
};

View File

@ -1,5 +1,6 @@
import {join} from 'path';
import {Flecks} from '@flecks/core';
import {banner} from '@flecks/core/server';
const electron = __non_webpack_require__('electron');
@ -129,7 +130,10 @@ export const hooks = {
createWindow: () => createWindow(flecks),
},
}),
'@flecks/server.up': async (flecks) => {
await flecks.invokeSequentialAsync('@flecks/electron/server.initialize', flecks.electron);
},
'@flecks/server.up': Flecks.priority(
async (flecks) => {
await flecks.invokeSequentialAsync('@flecks/electron/server.initialize', flecks.electron);
},
{after: '@flecks/web/server', before: '@flecks/repl/server'},
),
};

View File

@ -1,3 +1,5 @@
import {Flecks} from '@flecks/core';
import containers from './containers';
import createClient from './create-client';
@ -40,4 +42,17 @@ export const hooks = {
'@flecks/repl.context': (flecks) => ({
redisClient: createClient(flecks),
}),
'@flecks/server.up': Flecks.priority(
async (flecks) => {
const client = createClient(flecks);
const promise = new Promise((resolve, reject) => {
client.on('ready', resolve);
client.on('error', reject);
});
await client.connect();
await promise;
await client.disconnect();
},
{after: '@flecks/docker/server'},
),
};

View File

@ -11,6 +11,11 @@ const debugSilly = debug.extend('silly');
const RedisStore = ConnectRedis(session);
export const hooks = {
'@flecks/core.priority': (graph, hook) => {
if ('@flecks/server.up' === hook) {
graph.addDependency('@flecks/user/session/server', '@flecks/redis/server');
}
},
'@flecks/user.session': async (flecks) => {
const client = createClient(flecks, {legacyMode: true});
await client.connect();

View File

@ -12,15 +12,18 @@ export const hooks = {
}
),
'@flecks/react.providers': async (req, flecks) => {
const slices = await flecks.invokeMergeUnique('@flecks/redux.slices');
const reducer = createReducer(flecks, slices);
// Hydrate from server.
const {preloadedState} = flecks.get('@flecks/redux/client');
const store = await configureStore(flecks, reducer, {preloadedState});
flecks.redux = store;
return [Provider, {store}];
},
'@flecks/react.providers': Flecks.priority(
async (req, flecks) => {
const slices = await flecks.invokeMergeUnique('@flecks/redux.slices');
const reducer = createReducer(flecks, slices);
// Hydrate from server.
const {preloadedState} = flecks.get('@flecks/redux/client');
const store = await configureStore(flecks, reducer, {preloadedState});
flecks.redux = store;
return [Provider, {store}];
},
{before: '@flecks/react/router/client'},
),
'@flecks/redux.store': ({enhancers}) => {
// Hydrate from and subscribe to localStorage.
enhancers.push(localStorageEnhancer);

View File

@ -1,4 +1,4 @@
import {D} from '@flecks/core';
import {D, Flecks} from '@flecks/core';
import {Provider} from 'react-redux';
import {hydrateServer} from './actions';
@ -30,5 +30,8 @@ export const hooks = {
preloadedState: req.redux.getState(),
},
}),
'@flecks/react.providers': (req) => [Provider, {store: req.redux}],
'@flecks/react.providers': Flecks.priority(
(req) => [Provider, {store: req.redux}],
{before: '@flecks/react/router/server'},
),
};

View File

@ -50,19 +50,22 @@ export const hooks = {
},
};
},
'@flecks/server.up': (flecks) => {
passport.use(new LocalStrategy(
{usernameField: 'email'},
async (email, password, fn) => {
const {User} = flecks.db.Models;
try {
const user = await User.findOne({where: {email}});
fn(undefined, user && await user.validatePassword(password) && user);
}
catch (error) {
fn(error);
}
},
));
},
'@flecks/server.up': Flecks.priority(
(flecks) => {
passport.use(new LocalStrategy(
{usernameField: 'email'},
async (email, password, fn) => {
const {User} = flecks.db.Models;
try {
const user = await User.findOne({where: {email}});
fn(undefined, user && await user.validatePassword(password) && user);
}
catch (error) {
fn(error);
}
},
));
},
{after: '@flecks/user/server', before: '@flecks/repl/server'},
),
};

View File

@ -31,18 +31,21 @@ export const hooks = {
},
},
],
'@flecks/server.up': (flecks) => {
passport.serializeUser((user, fn) => fn(null, user.id));
passport.deserializeUser(async (id, fn) => {
const {User} = flecks.db.Models;
try {
fn(undefined, await User.findByPk(id));
}
catch (error) {
fn(error);
}
});
},
'@flecks/server.up': Flecks.priority(
(flecks) => {
passport.serializeUser((user, fn) => fn(null, user.id));
passport.deserializeUser(async (id, fn) => {
const {User} = flecks.db.Models;
try {
fn(undefined, await User.findByPk(id));
}
catch (error) {
fn(error);
}
});
},
{before: '@flecks/web/server', after: ['@flecks/db/server', '@flecks/governor/server']},
),
'@flecks/socket.intercom': () => ({
'@flecks/user.users': async (sids, server) => {
const sockets = await server.sockets();
@ -57,25 +60,28 @@ export const hooks = {
);
},
}),
'@flecks/socket/server.request.socket': (flecks) => (socket, next) => {
debugSilly('@flecks/socket/server.request.socket: passport.initialize()');
passport.initialize()(socket.handshake, undefined, () => {
debugSilly('@flecks/socket/server.request.socket: passport.session()');
passport.session()(socket.handshake, undefined, async () => {
if (!socket.handshake.user) {
const {User} = flecks.db.Models;
socket.handshake.user = new User();
socket.handshake.user.id = 0;
}
socket.handshake.login = LogOps.logIn;
socket.handshake.logIn = LogOps.logIn;
socket.handshake.logout = LogOps.logOut;
socket.handshake.logOut = LogOps.logOut;
socket.handshake.isAuthenticated = LogOps.isAuthenticated;
socket.handshake.isUnauthenticated = LogOps.isUnauthenticated;
await socket.join(`/u/${socket.handshake.user.id}`);
next();
'@flecks/socket/server.request.socket': Flecks.priority(
(flecks) => (socket, next) => {
debugSilly('@flecks/socket/server.request.socket: passport.initialize()');
passport.initialize()(socket.handshake, undefined, () => {
debugSilly('@flecks/socket/server.request.socket: passport.session()');
passport.session()(socket.handshake, undefined, async () => {
if (!socket.handshake.user) {
const {User} = flecks.db.Models;
socket.handshake.user = new User();
socket.handshake.user.id = 0;
}
socket.handshake.login = LogOps.logIn;
socket.handshake.logIn = LogOps.logIn;
socket.handshake.logout = LogOps.logOut;
socket.handshake.logOut = LogOps.logOut;
socket.handshake.isAuthenticated = LogOps.isAuthenticated;
socket.handshake.isUnauthenticated = LogOps.isUnauthenticated;
await socket.join(`/u/${socket.handshake.user.id}`);
next();
});
});
});
},
},
{before: '@flecks/governor/server'},
),
};

View File

@ -1,4 +1,4 @@
import {D} from '@flecks/core';
import {D, Flecks} from '@flecks/core';
import express from 'express';
import expressSession from 'express-session';
@ -25,42 +25,51 @@ export const hooks = {
}
),
'@flecks/web/server.request.route': (flecks) => {
const urle = express.urlencoded({extended: true});
return (req, res, next) => {
debugSilly('@flecks/web/server.request.route: express.urlencoded()');
urle(req, res, (error) => {
if (error) {
next(error);
return;
}
debugSilly('@flecks/web/server.request.route: session()');
flecks.user.session(req, res, (error) => {
'@flecks/web/server.request.route': Flecks.priority(
(flecks) => {
const urle = express.urlencoded({extended: true});
return (req, res, next) => {
debugSilly('@flecks/web/server.request.route: express.urlencoded()');
urle(req, res, (error) => {
if (error) {
next(error);
return;
}
debugSilly('session ID: %s', req.session.id);
next();
debugSilly('@flecks/web/server.request.route: session()');
flecks.user.session(req, res, (error) => {
if (error) {
next(error);
return;
}
debugSilly('session ID: %s', req.session.id);
next();
});
});
};
},
{before: '@flecks/user/server'},
),
'@flecks/server.up': Flecks.priority(
async (flecks) => {
flecks.user.session = expressSession({
resave: false,
sameSite: true,
saveUninitialized: false,
secret: flecks.get('@flecks/user/session/server.cookieSecret'),
...await flecks.invokeMergeAsync('@flecks/user.session'),
});
};
},
'@flecks/server.up': async (flecks) => {
flecks.user.session = expressSession({
resave: false,
sameSite: true,
saveUninitialized: false,
secret: flecks.get('@flecks/user/session/server.cookieSecret'),
...await flecks.invokeMergeAsync('@flecks/user.session'),
});
},
'@flecks/socket/server.request.socket': (flecks) => (socket, next) => {
debugSilly('@flecks/socket/server.request.socket: session()');
flecks.user.session(socket.handshake, {}, () => {
const id = socket.handshake.session?.id;
socket.join(id);
next();
});
},
},
{after: ['@flecks/governor/server', '@flecks/user/server']},
),
'@flecks/socket/server.request.socket': Flecks.priority(
(flecks) => (socket, next) => {
debugSilly('@flecks/socket/server.request.socket: session()');
flecks.user.session(socket.handshake, {}, () => {
const id = socket.handshake.session?.id;
socket.join(id);
next();
});
},
{before: '@flecks/user/server'},
),
};