
Security News
Attackers Are Hunting High-Impact Node.js Maintainers in a Coordinated Social Engineering Campaign
Multiple high-impact npm maintainers confirm they have been targeted in the same social engineering campaign that compromised Axios.
@open-draft/until
Advanced tools
⚠️ This package has been re-published as
until-async. Please update to that package instead as it will receive updates and fixes from now on. Thank you.
untilGracefully handle a Promise using async/await.
With the addition of async/await keywords in ECMAScript 2017 the handling of Promises became much easier. However, one must keep in mind that the await keyword provides no standard error handling API. Consider this usage:
async function getUser(id) {
const data = await fetchUser(id)
// Work with "data"...
}
In case fetchUser() throws an error, the entire getUser() function's scope will terminate. Because of this, it's recommended to implement error handling using try/catch block wrapping await expressions:
async function getUser(id) {
let data = null
try {
data = await asyncAction()
} catch (error) {
console.error(error)
}
// Work with "data"...
}
While this is a semantically valid approach, constructing try/catch around each awaited operation may be tedious and get overlooked at times. Such error handling also introduces separate closures for execution and error scenarios of an asynchronous operation.
This library encapsulates the try/catch error handling in a utility function that does not create a separate closure and exposes a NodeJS-friendly API to work with errors and resolved data.
npm install @open-draft/until
import { until } from '@open-draft/until'
async function getUserById(id) {
const [error, data] = await until(() => fetchUser(id))
if (error) {
return handleError(error)
}
return data
}
import { until } from '@open-draft/until'
interface User {
firstName: string
age: number
}
interface UserFetchError {
type: 'FORBIDDEN' | 'NOT_FOUND'
message?: string
}
async function getUserById(id: string) {
const [error, data] = await until<UserFetchError, User>(() => fetchUser(id))
if (error) {
return handleError(error.type, error.message)
}
return data.firstName
}
until accept a function and not a Promise directly?This has been intentionally introduced to await a single logical unit as opposed to a single Promise.
// Notice how a single "until" invocation can handle
// a rather complex piece of logic. This way any rejections
// or exceptions happening within the given function
// can be handled via the same "error".
const [error, data] = until(async () => {
const user = await fetchUser()
const nextUser = normalizeUser(user)
const transaction = await saveModel('user', user)
invariant(transaction.status === 'OK', 'Saving user failed')
return transaction.result
})
if (error) {
// Handle any exceptions happened within the function.
}
until API.await-to-js is a utility that provides a similar functionality to @open-draft/until by allowing you to handle promises and errors in a cleaner way. It returns an array with an error and result, similar to the tuple returned by @open-draft/until. However, await-to-js is more established and widely used in the community.
promise-toolbox offers a variety of utilities for working with promises, including a `reflect` function that can be used to handle errors and results in a similar manner to @open-draft/until. It provides more comprehensive tools for promise management compared to @open-draft/until.
FAQs
Gracefully handle a Promise using async/await.
The npm package @open-draft/until receives a total of 11,337,040 weekly downloads. As such, @open-draft/until popularity was classified as popular.
We found that @open-draft/until demonstrated a healthy version release cadence and project activity because the last version was released less than a year ago. It has 1 open source maintainer collaborating on the project.
Did you know?

Socket for GitHub automatically highlights issues in each pull request and monitors the health of all your open source dependencies. Discover the contents of your packages and block harmful activity before you install or update your dependencies.

Security News
Multiple high-impact npm maintainers confirm they have been targeted in the same social engineering campaign that compromised Axios.

Security News
Axios compromise traced to social engineering, showing how attacks on maintainers can bypass controls and expose the broader software supply chain.

Security News
Node.js has paused its bug bounty program after funding ended, removing payouts for vulnerability reports but keeping its security process unchanged.