Ви не можете вибрати більше 25 тем Теми мають розпочинатися з літери або цифри, можуть містити дефіси (-) і не повинні перевищувати 35 символів.
 
 
 

87 рядки
3.6 KiB

  1. const session = require('express-session'); //(Object.assign({ secret: config.secret }, config.session));
  2. const debug = require('debug')('server-connect:setup:session');
  3. const Parser = require('../core/parser');
  4. const Scope = require('../core/scope');
  5. const db = require('../core/db');
  6. const { toSystemPath } = require('../core/path');
  7. const config = require('./config');
  8. const options = config.session;
  9. if (!options.secret) {
  10. options.secret = config.secret;
  11. }
  12. debug('init session store %o', options.store);
  13. if (options.store.$type == 'redis') { // https://www.npmjs.com/package/connect-redis
  14. const RedisStore = require('connect-redis').default;
  15. options.store = new RedisStore(Object.assign({
  16. client: global.redisClient
  17. }, options.store));
  18. } else if (options.store.$type == 'file') { // https://www.npmjs.com/package/session-file-store
  19. const FileStore = require('session-file-store')(session);
  20. options.store = new FileStore(options.store);
  21. } else if (options.store.$type == 'database') { // https://www.npmjs.com/package/connect-session-knex
  22. const KnexStore = require('connect-session-knex')(session);
  23. if (typeof options.store.knex == 'string') {
  24. if (!global.db) global.db = {};
  25. if (!global.db[options.store.knex]) {
  26. const fs = require('fs-extra');
  27. const action = fs.readJSONSync(`app/modules/connections/${options.store.knex}.json`);
  28. const knex_options = Parser.parseValue(action.options, new Scope({ $_ENV: process.env }));
  29. if (knex_options.connection && knex_options.connection.filename) {
  30. knex_options.connection.filename = toSystemPath(knex_options.connection.filename);
  31. }
  32. if (knex_options.connection && knex_options.connection.ssl) {
  33. if (knex_options.connection.ssl.key) {
  34. knex_options.connection.ssl.key = fs.readFileSync(toSystemPath(knex_options.connection.ssl.key));
  35. }
  36. if (knex_options.connection.ssl.ca) {
  37. knex_options.connection.ssl.ca = fs.readFileSync(toSystemPath(knex_options.connection.ssl.ca));
  38. }
  39. if (knex_options.connection.ssl.cert) {
  40. knex_options.connection.ssl.cert = fs.readFileSync(toSystemPath(knex_options.connection.ssl.cert));
  41. }
  42. }
  43. knex_options.useNullAsDefault = true;
  44. knex_options.postProcessResponse = function(result) {
  45. if (Array.isArray(result)) {
  46. return result.map(row => {
  47. for (column in row) {
  48. if (row[column] && row[column].toJSON) {
  49. row[column] = row[column].toJSON();
  50. }
  51. }
  52. return row;
  53. });
  54. } else {
  55. for (column in result) {
  56. if (result[column] && result[column].toJSON) {
  57. result[column] = result[column].toJSON();
  58. }
  59. }
  60. return result;
  61. }
  62. };
  63. global.db[options.store.knex] = db(knex_options);
  64. }
  65. options.store.knex = global.db[options.store.knex];
  66. }
  67. options.store = new KnexStore(options.store);
  68. } else {
  69. const MemoryStore = require('../core/memoryStore')(session);
  70. options.store = new MemoryStore(options.store);
  71. }
  72. module.exports = session(options);