CoreModule.js 14 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282
  1. /*
  2. * Copyright (C) 2024 Puter Technologies Inc.
  3. *
  4. * This file is part of Puter.
  5. *
  6. * Puter is free software: you can redistribute it and/or modify
  7. * it under the terms of the GNU Affero General Public License as published
  8. * by the Free Software Foundation, either version 3 of the License, or
  9. * (at your option) any later version.
  10. *
  11. * This program is distributed in the hope that it will be useful,
  12. * but WITHOUT ANY WARRANTY; without even the implied warranty of
  13. * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
  14. * GNU Affero General Public License for more details.
  15. *
  16. * You should have received a copy of the GNU Affero General Public License
  17. * along with this program. If not, see <https://www.gnu.org/licenses/>.
  18. */
  19. const { AdvancedBase } = require("@heyputer/puter-js-common");
  20. const { Context } = require('./util/context');
  21. class CoreModule extends AdvancedBase {
  22. async install (context) {
  23. const services = context.get('services');
  24. const app = context.get('app');
  25. const useapi = context.get('useapi');
  26. await install({ services, app, useapi });
  27. }
  28. // Some services were created before the BaseService
  29. // class existed. They don't listen to the init event
  30. // and the order in which they're instantiated matters.
  31. // They all need to be installed after the init event
  32. // is dispatched, so they get a separate install method.
  33. async install_legacy (context) {
  34. const services = context.get('services');
  35. await install_legacy({ services });
  36. }
  37. }
  38. module.exports = CoreModule;
  39. const install = async ({ services, app, useapi }) => {
  40. const config = require('./config');
  41. useapi.withuse(() => {
  42. def('Service', require('./services/BaseService'));
  43. def('Module', AdvancedBase);
  44. def('puter.middlewares.auth', require('./middleware/auth2'));
  45. });
  46. // /!\ IMPORTANT /!\
  47. // For new services, put the import immediate above the
  48. // call to services.registerService. We'll clean this up
  49. // in a future PR.
  50. const { LogService } = require('./services/runtime-analysis/LogService');
  51. const { PagerService } = require('./services/runtime-analysis/PagerService');
  52. const { AlarmService } = require('./services/runtime-analysis/AlarmService');
  53. const { ErrorService } = require('./services/runtime-analysis/ErrorService');
  54. const { CommandService } = require('./services/CommandService');
  55. const { ExpectationService } = require('./services/runtime-analysis/ExpectationService');
  56. const { HTTPThumbnailService } = require('./services/thumbnails/HTTPThumbnailService');
  57. const { PureJSThumbnailService } = require('./services/thumbnails/PureJSThumbnailService');
  58. const { NAPIThumbnailService } = require('./services/thumbnails/NAPIThumbnailService');
  59. const { DevConsoleService } = require('./services/DevConsoleService');
  60. const { RateLimitService } = require('./services/sla/RateLimitService');
  61. const { MonthlyUsageService } = require('./services/sla/MonthlyUsageService');
  62. const { AuthService } = require('./services/auth/AuthService');
  63. const { SLAService } = require('./services/sla/SLAService');
  64. const { PermissionService } = require('./services/auth/PermissionService');
  65. const { ACLService } = require('./services/auth/ACLService');
  66. const { CoercionService } = require('./services/drivers/CoercionService');
  67. const { PuterSiteService } = require('./services/PuterSiteService');
  68. const { ContextInitService } = require('./services/ContextInitService');
  69. const { IdentificationService } = require('./services/abuse-prevention/IdentificationService');
  70. const { AuthAuditService } = require('./services/abuse-prevention/AuthAuditService');
  71. const { RegistryService } = require('./services/RegistryService');
  72. const { RegistrantService } = require('./services/RegistrantService');
  73. const { SystemValidationService } = require('./services/SystemValidationService');
  74. const { EntityStoreService } = require('./services/EntityStoreService');
  75. const SQLES = require('./om/entitystorage/SQLES');
  76. const ValidationES = require('./om/entitystorage/ValidationES');
  77. const { SetOwnerES } = require('./om/entitystorage/SetOwnerES');
  78. const AppES = require('./om/entitystorage/AppES');
  79. const WriteByOwnerOnlyES = require('./om/entitystorage/WriteByOwnerOnlyES');
  80. const SubdomainES = require('./om/entitystorage/SubdomainES');
  81. const { MaxLimitES } = require('./om/entitystorage/MaxLimitES');
  82. const { AppLimitedES } = require('./om/entitystorage/AppLimitedES');
  83. const { ESBuilder } = require('./om/entitystorage/ESBuilder');
  84. const { Eq, Or } = require('./om/query/query');
  85. const { TrackSpendingService } = require('./services/TrackSpendingService');
  86. const { ServerHealthService } = require('./services/runtime-analysis/ServerHealthService');
  87. const { MakeProdDebuggingLessAwfulService } = require('./services/MakeProdDebuggingLessAwfulService');
  88. const { ConfigurableCountingService } = require('./services/ConfigurableCountingService');
  89. const { FSLockService } = require('./services/fs/FSLockService');
  90. const { StrategizedService } = require('./services/StrategizedService');
  91. const WebServerService = require('./services/WebServerService');
  92. const FilesystemAPIService = require('./services/FilesystemAPIService');
  93. const ServeGUIService = require('./services/ServeGUIService');
  94. const PuterAPIService = require('./services/PuterAPIService');
  95. const { RefreshAssociationsService } = require("./services/RefreshAssociationsService");
  96. // Service names beginning with '__' aren't called by other services;
  97. // these provide data/functionality to other services or produce
  98. // side-effects from the events of other services.
  99. // === Services which extend BaseService ===
  100. services.registerService('system-validation', SystemValidationService);
  101. services.registerService('server-health', ServerHealthService);
  102. services.registerService('log-service', LogService);
  103. services.registerService('commands', CommandService);
  104. services.registerService('web-server', WebServerService, { app });
  105. services.registerService('__api-filesystem', FilesystemAPIService);
  106. services.registerService('__api', PuterAPIService);
  107. services.registerService('__gui', ServeGUIService);
  108. services.registerService('expectations', ExpectationService);
  109. services.registerService('pager', PagerService);
  110. services.registerService('alarm', AlarmService);
  111. services.registerService('error-service', ErrorService);
  112. services.registerService('registry', RegistryService);
  113. services.registerService('__registrant', RegistrantService);
  114. services.registerService('fslock', FSLockService);
  115. services.registerService('es:app', EntityStoreService, {
  116. entity: 'app',
  117. upstream: ESBuilder.create([
  118. SQLES, { table: 'app', debug: true, },
  119. AppES,
  120. AppLimitedES, {
  121. // When apps query es:apps, they're allowed to see apps which
  122. // are approved for listing and they're allowed to see their
  123. // own entry.
  124. exception: async () => {
  125. const actor = Context.get('actor');
  126. return new Or({
  127. children: [
  128. new Eq({
  129. key: 'approved_for_listing',
  130. value: 1,
  131. }),
  132. new Eq({
  133. key: 'uid',
  134. value: actor.type.app.uid,
  135. }),
  136. ]
  137. });
  138. },
  139. },
  140. WriteByOwnerOnlyES,
  141. ValidationES,
  142. SetOwnerES,
  143. MaxLimitES, { max: 5000 },
  144. ]),
  145. });
  146. services.registerService('es:subdomain', EntityStoreService, {
  147. entity: 'subdomain',
  148. upstream: ESBuilder.create([
  149. SQLES, { table: 'subdomains', debug: true, },
  150. SubdomainES,
  151. AppLimitedES,
  152. WriteByOwnerOnlyES,
  153. ValidationES,
  154. SetOwnerES,
  155. MaxLimitES, { max: 5000 },
  156. ]),
  157. });
  158. services.registerService('rate-limit', RateLimitService);
  159. services.registerService('monthly-usage', MonthlyUsageService);
  160. services.registerService('auth', AuthService);
  161. services.registerService('permission', PermissionService);
  162. services.registerService('sla', SLAService);
  163. services.registerService('acl', ACLService);
  164. services.registerService('coercion', CoercionService);
  165. services.registerService('puter-site', PuterSiteService);
  166. services.registerService('context-init', ContextInitService);
  167. services.registerService('identification', IdentificationService);
  168. services.registerService('auth-audit', AuthAuditService);
  169. services.registerService('spending', TrackSpendingService);
  170. services.registerService('counting', ConfigurableCountingService);
  171. services.registerService('thumbnails', StrategizedService, {
  172. strategy_key: 'engine',
  173. strategies: {
  174. napi: [NAPIThumbnailService],
  175. purejs: [PureJSThumbnailService],
  176. http: [HTTPThumbnailService],
  177. }
  178. });
  179. services.registerService('__refresh-assocs', RefreshAssociationsService);
  180. services.registerService('__prod-debugging', MakeProdDebuggingLessAwfulService);
  181. if ( config.env == 'dev' ) {
  182. services.registerService('dev-console', DevConsoleService);
  183. }
  184. const { EventService } = require('./services/EventService');
  185. services.registerService('event', EventService);
  186. const { PuterVersionService } = require('./services/PuterVersionService');
  187. services.registerService('puter-version', PuterVersionService);
  188. const { SessionService } = require('./services/SessionService');
  189. services.registerService('session', SessionService);
  190. const { EdgeRateLimitService } = require('./services/abuse-prevention/EdgeRateLimitService');
  191. services.registerService('edge-rate-limit', EdgeRateLimitService);
  192. const { Emailservice } = require('./services/EmailService');
  193. services.registerService('email', Emailservice);
  194. const { TokenService } = require('./services/auth/TokenService');
  195. services.registerService('token', TokenService);
  196. const { OTPService } = require('./services/auth/OTPService');
  197. services.registerService('otp', OTPService);
  198. const { UserProtectedEndpointsService } = require("./services/web/UserProtectedEndpointsService");
  199. services.registerService('__user-protected-endpoints', UserProtectedEndpointsService);
  200. const { AntiCSRFService } = require('./services/auth/AntiCSRFService');
  201. services.registerService('anti-csrf', AntiCSRFService);
  202. const { LockService } = require('./services/LockService');
  203. services.registerService('lock', LockService);
  204. const { PuterHomepageService } = require('./services/PuterHomepageService');
  205. services.registerService('puter-homepage', PuterHomepageService);
  206. const { GetUserService } = require('./services/GetUserService');
  207. services.registerService('get-user', GetUserService);
  208. const { DetailProviderService } = require('./services/DetailProviderService');
  209. services.registerService('whoami', DetailProviderService);
  210. const { DevTODService } = require('./services/DevTODService');
  211. services.registerService('__dev-tod', DevTODService);
  212. const { DriverService } = require("./services/drivers/DriverService");
  213. services.registerService('driver', DriverService);
  214. const { ScriptService } = require('./services/ScriptService');
  215. services.registerService('script', ScriptService);
  216. const { BroadcastService } = require('./services/BroadcastService');
  217. services.registerService('broadcast', BroadcastService);
  218. const { NotificationService } = require('./services/NotificationService');
  219. services.registerService('notification', NotificationService);
  220. }
  221. const install_legacy = async ({ services }) => {
  222. const { ProcessEventService } = require('./services/runtime-analysis/ProcessEventService');
  223. const { ParameterService } = require('./services/ParameterService');
  224. const { InformationService } = require('./services/information/InformationService');
  225. const { FilesystemService } = require('./filesystem/FilesystemService');
  226. const PerformanceMonitor = require('./monitor/PerformanceMonitor');
  227. const { OperationTraceService } = require('./services/OperationTraceService');
  228. const { WSPushService } = require('./services/WSPushService');
  229. const { ReferralCodeService } = require('./services/ReferralCodeService');
  230. const { ClientOperationService } = require('./services/ClientOperationService');
  231. const { EngPortalService } = require('./services/EngPortalService');
  232. const { AppInformationService } = require('./services/AppInformationService');
  233. const { FileCacheService } = require('./services/file-cache/FileCacheService');
  234. // === Services which do not yet extend BaseService ===
  235. services.registerService('process-event', ProcessEventService);
  236. services.registerService('params', ParameterService);
  237. services.registerService('information', InformationService)
  238. services.registerService('filesystem', FilesystemService);
  239. services.registerService('operationTrace', OperationTraceService);
  240. services.registerService('__event-push-ws', WSPushService);
  241. services.registerService('referral-code', ReferralCodeService);
  242. services.registerService('file-cache', FileCacheService);
  243. services.registerService('client-operation', ClientOperationService);
  244. services.registerService('app-information', AppInformationService);
  245. services.registerService('engineering-portal', EngPortalService);
  246. // TODO: add to here: ResourceService and DatabaseFSEntryService
  247. // This singleton was made before services existed,
  248. // so we have to pass that to it manually
  249. PerformanceMonitor.provideServices(services);
  250. };