setup.js 6.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159
  1. const fs = require('fs');
  2. const os = require('os');
  3. const path = require('path');
  4. const { makeNetwork, makeNode, makeCooler, generateKeypair } = require('./mock-ssb');
  5. const tmpRoot = path.join(os.tmpdir(), 'oasis-tests-' + process.pid);
  6. let counter = 0;
  7. const fresh = () => {
  8. counter++;
  9. const dir = path.join(tmpRoot, 'd-' + counter + '-' + Math.random().toString(36).slice(2));
  10. fs.mkdirSync(dir, { recursive: true });
  11. return dir;
  12. };
  13. const tribeCryptoFactory = require('../../src/models/crypto');
  14. const realConfig = require('../../src/server/ssb_config');
  15. const FACTORIES = {
  16. tribes: '../../src/models/tribes_model',
  17. tribesContent: '../../src/models/tribes_content_model',
  18. audios: '../../src/models/audios_model',
  19. videos: '../../src/models/videos_model',
  20. images: '../../src/models/images_model',
  21. documents: '../../src/models/documents_model',
  22. bookmarks: '../../src/models/bookmarking_model',
  23. forum: '../../src/models/forum_model',
  24. transfers: '../../src/models/transfers_model',
  25. votes: '../../src/models/votes_model',
  26. events: '../../src/models/events_model',
  27. tasks: '../../src/models/tasks_model',
  28. chats: '../../src/models/chats_model',
  29. pads: '../../src/models/pads_model',
  30. maps: '../../src/models/maps_model',
  31. torrents: '../../src/models/torrents_model',
  32. calendars: '../../src/models/calendars_model',
  33. reports: '../../src/models/reports_model',
  34. market: '../../src/models/market_model',
  35. jobs: '../../src/models/jobs_model',
  36. projects: '../../src/models/projects_model',
  37. opinions: '../../src/models/opinions_model',
  38. inhabitants: '../../src/models/inhabitants_model',
  39. parliament: '../../src/models/parliament_model',
  40. courts: '../../src/models/courts_model',
  41. shops: '../../src/models/shops_model',
  42. pixelia: '../../src/models/pixelia_model',
  43. pm: '../../src/models/pm_model',
  44. feed: '../../src/models/feed_model',
  45. tags: '../../src/models/tags_model',
  46. search: '../../src/models/search_model',
  47. trending: '../../src/models/trending_model',
  48. agenda: '../../src/models/agenda_model',
  49. cv: '../../src/models/cv_model',
  50. favorites: '../../src/models/favorites_model',
  51. banking: '../../src/models/banking_model',
  52. activity: '../../src/models/activity_model',
  53. stats: '../../src/models/stats_model',
  54. blockchain: '../../src/models/blockchain_model',
  55. larp: '../../src/models/larp_model',
  56. melody: '../../src/models/melody_model'
  57. };
  58. function loadFactory(name) {
  59. const p = FACTORIES[name];
  60. if (!p) throw new Error('Unknown factory: ' + name);
  61. return require(p);
  62. }
  63. function makePeer(network, keypair) {
  64. const kp = keypair || generateKeypair();
  65. const node = makeNode(network, kp);
  66. const cooler = makeCooler(node);
  67. const configDir = fresh();
  68. const tribeCrypto = tribeCryptoFactory(configDir, 'tribes');
  69. const chatCrypto = tribeCryptoFactory(configDir, 'chats');
  70. const padCrypto = tribeCryptoFactory(configDir, 'pads');
  71. const mapCrypto = tribeCryptoFactory(configDir, 'maps');
  72. const calendarCrypto = tribeCryptoFactory(configDir, 'calendars');
  73. const eventCrypto = tribeCryptoFactory(configDir, 'events');
  74. const forumCrypto = tribeCryptoFactory(configDir, 'forum');
  75. const baseDeps = { cooler, isPublic: false, tribeCrypto };
  76. const models = {};
  77. const requireOnce = (name) => {
  78. if (models[name]) return models[name];
  79. const f = loadFactory(name);
  80. let deps;
  81. if (name === 'tribesContent' || name === 'torrents') {
  82. deps = { ...baseDeps, tribesModel: requireOnce('tribes') };
  83. } else if (name === 'chats') {
  84. deps = { ...baseDeps, chatCrypto, tribesModel: requireOnce('tribes') };
  85. } else if (name === 'pads') {
  86. deps = { ...baseDeps, padCrypto, tribesModel: requireOnce('tribes') };
  87. } else if (name === 'maps') {
  88. deps = { ...baseDeps, mapCrypto, tribesModel: requireOnce('tribes') };
  89. } else if (name === 'calendars') {
  90. deps = { ...baseDeps, calendarCrypto, tribesModel: requireOnce('tribes') };
  91. } else if (name === 'activity' || name === 'stats' || name === 'blockchain' || name === 'larp') {
  92. deps = { ...baseDeps, tribesModel: requireOnce('tribes') };
  93. } else if (name === 'events') {
  94. deps = { ...baseDeps, eventCrypto, tribesModel: requireOnce('tribes') };
  95. } else if (name === 'forum') {
  96. deps = { cooler, isPublic: false, tribeCrypto, forumCrypto };
  97. } else if (name === 'search') {
  98. deps = { ...baseDeps, padsModel: requireOnce('pads'), tribesModel: requireOnce('tribes') };
  99. } else if (name === 'tags') {
  100. deps = { ...baseDeps, padsModel: requireOnce('pads'), tribesModel: requireOnce('tribes') };
  101. } else if (name === 'favorites') {
  102. deps = {
  103. audiosModel: requireOnce('audios'),
  104. bookmarksModel: requireOnce('bookmarks'),
  105. documentsModel: requireOnce('documents'),
  106. imagesModel: requireOnce('images'),
  107. videosModel: requireOnce('videos'),
  108. mapsModel: requireOnce('maps'),
  109. padsModel: requireOnce('pads'),
  110. chatsModel: requireOnce('chats'),
  111. calendarsModel: requireOnce('calendars'),
  112. torrentsModel: requireOnce('torrents')
  113. };
  114. } else if (name === 'banking') {
  115. deps = { services: { cooler, feed: { listAll: async () => [] }, activity: { list: async () => [] } } };
  116. } else if (name === 'parliament' || name === 'courts') {
  117. const svc = {
  118. tribes: requireOnce('tribes'),
  119. votes: requireOnce('votes'),
  120. inhabitants: { listInhabitants: async () => [], getLastKarmaScore: async () => 0 },
  121. banking: { getBankingData: async () => ({ karmaScore: 0 }) }
  122. };
  123. deps = { ...baseDeps, services: svc };
  124. } else if (name === 'reports') {
  125. deps = baseDeps;
  126. } else if (name === 'forum') {
  127. deps = { cooler, isPublic: false };
  128. } else {
  129. deps = baseDeps;
  130. }
  131. if (name === 'pads') deps.cipherModel = { encryptECB: x => x, decryptECB: x => x };
  132. models[name] = f(deps);
  133. return models[name];
  134. };
  135. return {
  136. keypair: kp,
  137. node,
  138. cooler,
  139. tribeCrypto,
  140. configDir,
  141. use(name) { return requireOnce(name); },
  142. setActor() { realConfig.keys = kp; }
  143. };
  144. }
  145. function makeNetworkAndPeer() {
  146. const network = makeNetwork();
  147. const peer = makePeer(network);
  148. peer.setActor();
  149. return { network, peer };
  150. }
  151. module.exports = { makePeer, makeNetworkAndPeer, makeNetwork, generateKeypair, fresh, realConfig };