setup.js 6.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157
  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. };
  56. function loadFactory(name) {
  57. const p = FACTORIES[name];
  58. if (!p) throw new Error('Unknown factory: ' + name);
  59. return require(p);
  60. }
  61. /**
  62. * Create a fresh peer with their own SSB log presence and tribe keyring.
  63. * @param {object} network - shared network (use makeNetwork())
  64. * @param {object} [keypair] - optional keypair (will be generated if missing)
  65. * @returns {object} { keypair, node, cooler, tribeCrypto, models, configDir, setActor }
  66. */
  67. function makePeer(network, keypair) {
  68. const kp = keypair || generateKeypair();
  69. const node = makeNode(network, kp);
  70. const cooler = makeCooler(node);
  71. const configDir = fresh();
  72. const tribeCrypto = tribeCryptoFactory(configDir, 'tribes');
  73. const chatCrypto = tribeCryptoFactory(configDir, 'chats');
  74. const padCrypto = tribeCryptoFactory(configDir, 'pads');
  75. const mapCrypto = tribeCryptoFactory(configDir, 'maps');
  76. const calendarCrypto = tribeCryptoFactory(configDir, 'calendars');
  77. const baseDeps = { cooler, isPublic: false, tribeCrypto };
  78. const models = {};
  79. const requireOnce = (name) => {
  80. if (models[name]) return models[name];
  81. const f = loadFactory(name);
  82. let deps;
  83. if (name === 'tribesContent' || name === 'torrents') {
  84. deps = { ...baseDeps, tribesModel: requireOnce('tribes') };
  85. } else if (name === 'chats') {
  86. deps = { ...baseDeps, chatCrypto, tribesModel: requireOnce('tribes') };
  87. } else if (name === 'pads') {
  88. deps = { ...baseDeps, padCrypto, tribesModel: requireOnce('tribes') };
  89. } else if (name === 'maps') {
  90. deps = { ...baseDeps, mapCrypto, tribesModel: requireOnce('tribes') };
  91. } else if (name === 'calendars') {
  92. deps = { ...baseDeps, calendarCrypto, tribesModel: requireOnce('tribes') };
  93. } else if (name === 'activity' || name === 'stats' || name === 'blockchain') {
  94. deps = { ...baseDeps, tribesModel: requireOnce('tribes') };
  95. } else if (name === 'search') {
  96. deps = { ...baseDeps, padsModel: requireOnce('pads'), tribesModel: requireOnce('tribes') };
  97. } else if (name === 'tags') {
  98. deps = { ...baseDeps, padsModel: requireOnce('pads'), tribesModel: requireOnce('tribes') };
  99. } else if (name === 'favorites') {
  100. deps = {
  101. audiosModel: requireOnce('audios'),
  102. bookmarksModel: requireOnce('bookmarks'),
  103. documentsModel: requireOnce('documents'),
  104. imagesModel: requireOnce('images'),
  105. videosModel: requireOnce('videos'),
  106. mapsModel: requireOnce('maps'),
  107. padsModel: requireOnce('pads'),
  108. chatsModel: requireOnce('chats'),
  109. calendarsModel: requireOnce('calendars'),
  110. torrentsModel: requireOnce('torrents')
  111. };
  112. } else if (name === 'banking') {
  113. deps = { services: { cooler, feed: { listAll: async () => [] }, activity: { list: async () => [] } } };
  114. } else if (name === 'parliament' || name === 'courts') {
  115. const svc = {
  116. tribes: requireOnce('tribes'),
  117. votes: requireOnce('votes'),
  118. inhabitants: { listInhabitants: async () => [], getLastKarmaScore: async () => 0 },
  119. banking: { getBankingData: async () => ({ karmaScore: 0 }) }
  120. };
  121. deps = { ...baseDeps, services: svc };
  122. } else if (name === 'reports') {
  123. deps = baseDeps;
  124. } else if (name === 'forum') {
  125. deps = { cooler, isPublic: false };
  126. } else {
  127. deps = baseDeps;
  128. }
  129. if (name === 'pads') deps.cipherModel = { encryptECB: x => x, decryptECB: x => x };
  130. models[name] = f(deps);
  131. return models[name];
  132. };
  133. return {
  134. keypair: kp,
  135. node,
  136. cooler,
  137. tribeCrypto,
  138. configDir,
  139. use(name) { return requireOnce(name); },
  140. setActor() { realConfig.keys = kp; }
  141. };
  142. }
  143. function makeNetworkAndPeer() {
  144. const network = makeNetwork();
  145. const peer = makePeer(network);
  146. peer.setActor();
  147. return { network, peer };
  148. }
  149. module.exports = { makePeer, makeNetworkAndPeer, makeNetwork, generateKeypair, fresh, realConfig };