Преглед изворни кода

Replace promisifyAll with individual promisify calls in web service (#30931)

* Initial plan

* Replace promisifyAll with individual promisify calls in all 8 files

Co-authored-by: Seinzu <194547+Seinzu@users.noreply.github.com>

* Remove unused promisify imports from V1Api and FileStoreHandler

Co-authored-by: Seinzu <194547+Seinzu@users.noreply.github.com>

* Fix formatting and remove unnecessary .bind() calls

Co-authored-by: Seinzu <194547+Seinzu@users.noreply.github.com>

* Fix formatting: collapse multi-line promisify calls to single lines

Co-authored-by: Seinzu <194547+Seinzu@users.noreply.github.com>

---------

Co-authored-by: copilot-swe-agent[bot] <198982749+Copilot@users.noreply.github.com>
Co-authored-by: Seinzu <194547+Seinzu@users.noreply.github.com>
GitOrigin-RevId: c16a3f3ea48c93c2f62ad32c1f4512cd237882bf
Copilot пре 6 месеци
родитељ
комит
55c3b6b7ea

+ 31 - 6
services/web/app/src/Features/Editor/EditorController.mjs

@@ -8,7 +8,7 @@ import ProjectDeleter from '../Project/ProjectDeleter.mjs'
 import EditorRealTimeController from './EditorRealTimeController.mjs'
 import async from 'async'
 import PublicAccessLevels from '../Authorization/PublicAccessLevels.mjs'
-import { promisifyAll } from '@overleaf/promise-utils'
+import { promisify, promisifyMultiResult } from '@overleaf/promise-utils'
 
 const EditorController = {
   addDoc(projectId, folderId, docName, docLines, source, userId, callback) {
@@ -687,9 +687,34 @@ const EditorController = {
   },
 }
 
-EditorController.promises = promisifyAll(EditorController, {
-  multiResult: {
-    mkdirp: ['newFolders', 'lastFolder'],
-  },
-})
+EditorController.promises = {
+  addDoc: promisify(EditorController.addDoc),
+  addDocWithRanges: promisify(EditorController.addDocWithRanges),
+  addFile: promisify(EditorController.addFile),
+  appendToDoc: promisify(EditorController.appendToDoc),
+  upsertDoc: promisify(EditorController.upsertDoc),
+  upsertFile: promisify(EditorController.upsertFile),
+  upsertDocWithPath: promisify(EditorController.upsertDocWithPath),
+  upsertFileWithPath: promisify(EditorController.upsertFileWithPath),
+  addFolder: promisify(EditorController.addFolder),
+  mkdirp: promisifyMultiResult(EditorController.mkdirp, [
+    'newFolders',
+    'lastFolder',
+  ]),
+  deleteEntity: promisify(EditorController.deleteEntity),
+  deleteEntityWithPath: promisify(EditorController.deleteEntityWithPath),
+  updateProjectDescription: promisify(
+    EditorController.updateProjectDescription
+  ),
+  deleteProject: promisify(EditorController.deleteProject),
+  renameEntity: promisify(EditorController.renameEntity),
+  moveEntity: promisify(EditorController.moveEntity),
+  renameProject: promisify(EditorController.renameProject),
+  setCompiler: promisify(EditorController.setCompiler),
+  setImageName: promisify(EditorController.setImageName),
+  setSpellCheckLanguage: promisify(EditorController.setSpellCheckLanguage),
+  setPublicAccessLevel: promisify(EditorController.setPublicAccessLevel),
+  setRootDoc: promisify(EditorController.setRootDoc),
+  setMainBibliographyDoc: promisify(EditorController.setMainBibliographyDoc),
+}
 export default EditorController

+ 11 - 7
services/web/app/src/Features/FileStore/FileStoreHandler.mjs

@@ -6,7 +6,7 @@ import HistoryManager from '../History/HistoryManager.mjs'
 import ProjectDetailsHandler from '../Project/ProjectDetailsHandler.mjs'
 import { File } from '../../models/File.mjs'
 import OError from '@overleaf/o-error'
-import { promisifyAll } from '@overleaf/promise-utils'
+import { promisifyMultiResult } from '@overleaf/promise-utils'
 import Modules from '../../infrastructure/Modules.mjs'
 
 const FileStoreHandler = {
@@ -115,11 +115,15 @@ const FileStoreHandler = {
   },
 }
 
-FileStoreHandler.promises = promisifyAll(FileStoreHandler, {
-  multiResult: {
-    uploadFileFromDisk: ['fileRef', 'createdBlob', 'size'],
-    uploadFileFromDiskWithHistoryId: ['fileRef', 'createdBlob', 'size'],
-  },
-})
+FileStoreHandler.promises = {
+  uploadFileFromDisk: promisifyMultiResult(
+    FileStoreHandler.uploadFileFromDisk,
+    ['fileRef', 'createdBlob', 'size']
+  ),
+  uploadFileFromDiskWithHistoryId: promisifyMultiResult(
+    FileStoreHandler.uploadFileFromDiskWithHistoryId,
+    ['fileRef', 'createdBlob', 'size']
+  ),
+}
 
 export default FileStoreHandler

+ 24 - 13
services/web/app/src/Features/Institutions/InstitutionsAPI.mjs

@@ -3,7 +3,7 @@ import OError from '@overleaf/o-error'
 import logger from '@overleaf/logger'
 import settings from '@overleaf/settings'
 import request from 'requestretry'
-import { promisifyAll, promiseMapWithLimit } from '@overleaf/promise-utils'
+import { promisify, promiseMapWithLimit } from '@overleaf/promise-utils'
 import NotificationsBuilder from '../Notifications/NotificationsBuilder.mjs'
 import {
   V1ConnectionError,
@@ -406,17 +406,28 @@ function makeAffiliationRequest(options, callback) {
   })
 }
 
-InstitutionsAPI.promises = promisifyAll(InstitutionsAPI, {
-  without: [
-    'addAffiliation',
-    'removeAffiliation',
-    'getUsersNeedingReconfirmationsLapsedProcessed',
-  ],
-})
-
-InstitutionsAPI.promises.addAffiliation = addAffiliation
-InstitutionsAPI.promises.removeAffiliation = removeAffiliation
-InstitutionsAPI.promises.getUsersNeedingReconfirmationsLapsedProcessed =
-  getUsersNeedingReconfirmationsLapsedProcessed
+InstitutionsAPI.promises = {
+  getInstitutionAffiliations: promisify(
+    InstitutionsAPI.getInstitutionAffiliations
+  ),
+  getConfirmedInstitutionAffiliations: promisify(
+    InstitutionsAPI.getConfirmedInstitutionAffiliations
+  ),
+  getInstitutionAffiliationsCounts: promisify(
+    InstitutionsAPI.getInstitutionAffiliationsCounts
+  ),
+  getLicencesForAnalytics: promisify(InstitutionsAPI.getLicencesForAnalytics),
+  getUserAffiliations: promisify(InstitutionsAPI.getUserAffiliations),
+  getUsersNeedingReconfirmationsLapsedProcessed,
+  addAffiliation,
+  removeAffiliation,
+  endorseAffiliation: promisify(InstitutionsAPI.endorseAffiliation),
+  deleteAffiliations: promisify(InstitutionsAPI.deleteAffiliations),
+  addEntitlement: promisify(InstitutionsAPI.addEntitlement),
+  removeEntitlement: promisify(InstitutionsAPI.removeEntitlement),
+  sendUsersWithReconfirmationsLapsedProcessed: promisify(
+    InstitutionsAPI.sendUsersWithReconfirmationsLapsedProcessed
+  ),
+}
 
 export default InstitutionsAPI

+ 11 - 2
services/web/app/src/Features/Spelling/SpellingHandler.mjs

@@ -1,6 +1,6 @@
 import OError from '@overleaf/o-error'
 import Metrics from '@overleaf/metrics'
-import { promisifyAll } from '@overleaf/promise-utils'
+import { promisify } from '@overleaf/promise-utils'
 import LearnedWordsManager from './LearnedWordsManager.mjs'
 
 const SpellingHandler = {
@@ -26,4 +26,13 @@ const SpellingHandler = {
   },
 }
 
-export default { ...SpellingHandler, promises: promisifyAll(SpellingHandler) }
+export default {
+  ...SpellingHandler,
+  promises: {
+    getUserDictionary: promisify(SpellingHandler.getUserDictionary),
+    deleteWordFromUserDictionary: promisify(
+      SpellingHandler.deleteWordFromUserDictionary
+    ),
+    deleteUserDictionary: promisify(SpellingHandler.deleteUserDictionary),
+  },
+}

+ 5 - 4
services/web/app/src/Features/Subscription/V1SubscriptionManager.mjs

@@ -2,7 +2,7 @@ import UserGetter from '../User/UserGetter.mjs'
 import request from 'requestretry'
 import settings from '@overleaf/settings'
 import { V1ConnectionError, NotFoundError } from '../Errors/Errors.js'
-import { promisifyAll } from '@overleaf/promise-utils'
+import { promisify } from '@overleaf/promise-utils'
 
 const V1SubscriptionManager = {
   cancelV1Subscription(userId, callback) {
@@ -117,8 +117,9 @@ const V1SubscriptionManager = {
   },
 }
 
-V1SubscriptionManager.promises = promisifyAll(V1SubscriptionManager, {
-  without: ['getGrandfatheredFeaturesForV1User'],
-})
+V1SubscriptionManager.promises = {
+  cancelV1Subscription: promisify(V1SubscriptionManager.cancelV1Subscription),
+  v1IdForUser: promisify(V1SubscriptionManager.v1IdForUser),
+}
 
 export default V1SubscriptionManager

+ 5 - 2
services/web/app/src/Features/Uploads/ArchiveManager.mjs

@@ -26,7 +26,7 @@ import {
   ZipContentsTooLargeError,
 } from './ArchiveErrors.mjs'
 import _ from 'lodash'
-import { promisifyAll } from '@overleaf/promise-utils'
+import { promisify } from '@overleaf/promise-utils'
 
 const ONE_MEG = 1024 * 1024
 
@@ -267,5 +267,8 @@ const ArchiveManager = {
   },
 }
 
-ArchiveManager.promises = promisifyAll(ArchiveManager)
+ArchiveManager.promises = {
+  extractZipArchive: promisify(ArchiveManager.extractZipArchive),
+  findTopLevelDirectory: promisify(ArchiveManager.findTopLevelDirectory),
+}
 export default ArchiveManager

+ 5 - 7
services/web/app/src/Features/V1/V1Api.mjs

@@ -11,7 +11,7 @@ import request from 'request'
 
 import settings from '@overleaf/settings'
 import Errors from '../Errors/Errors.js'
-import { promisifyAll } from '@overleaf/promise-utils'
+import { promisifyMultiResult } from '@overleaf/promise-utils'
 
 // TODO: check what happens when these settings aren't defined
 const DEFAULT_V1_PARAMS = {
@@ -98,10 +98,8 @@ const V1Api = {
   },
 }
 
-V1Api.promises = promisifyAll(V1Api, {
-  multiResult: {
-    request: ['response', 'body'],
-    oauthRequest: ['response', 'body'],
-  },
-})
+V1Api.promises = {
+  request: promisifyMultiResult(V1Api.request, ['response', 'body']),
+  oauthRequest: promisifyMultiResult(V1Api.oauthRequest, ['response', 'body']),
+}
 export default V1Api

+ 7 - 4
services/web/app/src/infrastructure/FileWriter.mjs

@@ -15,7 +15,7 @@ import Settings from '@overleaf/settings'
 import request from 'request'
 import { Transform, pipeline } from 'node:stream'
 import { FileTooLargeError } from '../Features/Errors/Errors.js'
-import { promisifyAll } from '@overleaf/promise-utils'
+import { promisify } from '@overleaf/promise-utils'
 
 export class SizeLimitedStream extends Transform {
   constructor(options) {
@@ -180,8 +180,11 @@ const FileWriter = {
   },
 }
 
-FileWriter.promises = promisifyAll(FileWriter, {
-  without: ['ensureDumpFolderExists'],
-})
+FileWriter.promises = {
+  writeLinesToDisk: promisify(FileWriter.writeLinesToDisk),
+  writeContentToDisk: promisify(FileWriter.writeContentToDisk),
+  writeStreamToDisk: promisify(FileWriter.writeStreamToDisk),
+  writeUrlToDisk: promisify(FileWriter.writeUrlToDisk),
+}
 
 export default FileWriter