Sendi is a Webex to Twilio SMS gateway written in TypeScript that runs directly on Node 22.18+ via native type-stripping (no bundler/transpiler). Each Webex space represents one external SMS contact; inbound MMS is proxied both ways, with delivery-status cards for outbound sends. Highlights: - Express 5 HTTP surface for Twilio /sms and /callback (signature-validated) - webex-node-bot-framework in websocket transport mode for bot control plane - Prisma 6 + SQLite via better-sqlite3 driver adapter - Zod-validated env with fail-fast startup and pino secret redaction - Pino logging: pretty in dev, structured JSON in prod - 13 vitest unit tests (phone normalization, Twilio signature validation, card action dispatch) - Native --require preload patches Node 22's read-only globalThis.navigator so @webex/internal-media-core (transitive) can load Co-authored-by: Cursor <cursoragent@cursor.com>
15 lines
566 B
TypeScript
15 lines
566 B
TypeScript
// src/lib/asyncHandler.ts
|
|
import type { Request, Response, NextFunction, RequestHandler } from 'express';
|
|
|
|
/**
|
|
* Wraps an async Express handler so any thrown error / rejected promise
|
|
* is forwarded to `next()` (and thus to our centralized error middleware).
|
|
*/
|
|
export function asyncHandler<
|
|
Req extends Request = Request,
|
|
Res extends Response = Response,
|
|
>(fn: (req: Req, res: Res, next: NextFunction) => Promise<unknown>): RequestHandler {
|
|
return (req, res, next) => {
|
|
Promise.resolve(fn(req as Req, res as Res, next)).catch(next);
|
|
};
|
|
}
|