diff --git a/package-lock.json b/package-lock.json index 98be5417c..64b667ffd 100644 --- a/package-lock.json +++ b/package-lock.json @@ -103,6 +103,11 @@ "integrity": "sha512-jgsaNduz+ndvGyFt3uSuWqvy4lCnIJiovtouQN5JZHOKCS2QuhEdbcQHFhVksz2N2U9hXJo8odG7ETyWlEeuDw==", "dev": true }, + "async": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/async/-/async-3.2.0.tgz", + "integrity": "sha512-TR2mEZFVOj2pLStYxLht7TyfuRzaydfpxr3k9RpHIzMgw7A64dzsdqCxH1WJyQdoe8T10nDXd9wnEigmiuHIZw==" + }, "async-lock": { "version": "1.2.4", "resolved": "https://registry.npmjs.org/async-lock/-/async-lock-1.2.4.tgz", diff --git a/package.json b/package.json index e26f4aef1..1289d262f 100644 --- a/package.json +++ b/package.json @@ -29,6 +29,7 @@ "nock": "^12.0.3" }, "dependencies": { + "async": "^3.2.0", "console-stamp": "^0.2.9", "dotenv": "^8.2.0", "isomorphic-git": "^1.4.0", diff --git a/src/history/persistor.js b/src/history/persistor.js index 51b18a51b..32a0ee508 100644 --- a/src/history/persistor.js +++ b/src/history/persistor.js @@ -2,6 +2,13 @@ import path from 'path'; import fsApi from 'fs'; const fs = fsApi.promises; +import async from 'async'; + +const commitQueue = async.queue(_commit, 1); +commitQueue.error((err, { serviceProviderId, policyType, isSanitized, reject }) => { + reject(new Error(`_commit for ${serviceProviderId}${isSanitized ? ' sanitized ' : ' '}document ${policyType} experienced an error: ${err}`)); +}); + import * as git from './git.js'; const __dirname = path.dirname(new URL(import.meta.url).pathname); @@ -28,7 +35,6 @@ export async function save({ serviceProviderId, policyType, fileContent, isSanit }); } -let lock = Promise.resolve('Initial Promise'); export async function commit({ serviceProviderId, policyType, isSanitized }) { const directory = `${isSanitized ? SANITIZED_DIRECTORY : RAW_DIRECTORY}/${serviceProviderId}`; const fileExtension = isSanitized ? 'md' : 'html' @@ -39,17 +45,14 @@ export async function commit({ serviceProviderId, policyType, isSanitized }) { return; } - // Ensure asynchronous functions `git.add` and `git.commit` will always be called in sequence… - // …and others caller of `persistor.commit` will wait - await lock; - lock = new Promise(resolveLock => { - git.add(filePath).then(() => { - git.commit(`${isSanitized ? 'Update sanitized' : 'Update'} ${serviceProviderId} ${policyType} document`).then((sha) => { - console.log(`Commit ID for document "${serviceProviderId}/${policyType}.${fileExtension}": ${sha}`); - resolveLock(sha); - }); - }); - }); + return new Promise((resolve, reject) => { + commitQueue.push({ serviceProviderId, policyType, isSanitized, fileExtension, filePath, resolve, reject }); + }) +} - return lock; +async function _commit({ serviceProviderId, policyType, isSanitized, fileExtension, filePath, resolve }) { + await git.add(filePath) + const sha = await git.commit(`${isSanitized ? 'Update sanitized' : 'Update'} ${serviceProviderId} ${policyType} document`); + console.log(`Commit ID for document "${serviceProviderId}/${policyType}.${fileExtension}": ${sha}`); + resolve(sha); }