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
This commit is contained in:
Copilot
2026-02-12 09:05:28 +00:00
committed by Copybot
co-authored by copilot-swe-agent[bot] <198982749+Copilot@users.noreply.github.com> Seinzu
parent 21ccf42ae8
commit 55c3b6b7ea
8 changed files with 99 additions and 45 deletions
@@ -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
@@ -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
@@ -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
@@ -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),
},
}
@@ -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
@@ -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
View File
@@ -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
@@ -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