58 lines
1.5 KiB
TypeScript
58 lines
1.5 KiB
TypeScript
import twilio, { type Twilio } from "twilio";
|
|
|
|
let client: Twilio;
|
|
|
|
function getEnvVars() {
|
|
const accountSid = process.env.TWILIO_ACCOUNT_SID;
|
|
const authToken = process.env.TWILIO_AUTH_TOKEN;
|
|
const serviceSid = process.env.TWILIO_SERVICE_SID;
|
|
|
|
if (!accountSid || !authToken || !serviceSid) {
|
|
throw new Error(`Missing env vars. accountSid: ${!!accountSid}, authToken: ${!!authToken}, serviceSid: ${!!serviceSid}`);
|
|
}
|
|
|
|
return { accountSid, authToken, serviceSid };
|
|
}
|
|
|
|
function getTwilioClient() {
|
|
if (!client) {
|
|
const { accountSid, authToken } = getEnvVars();
|
|
client = twilio(accountSid, authToken);
|
|
}
|
|
return client;
|
|
}
|
|
|
|
|
|
export async function sendVerifyCode(phoneNumber: string, code: string) {
|
|
const { serviceSid } = getEnvVars();
|
|
|
|
const twilioClient = getTwilioClient();
|
|
|
|
const verification = await twilioClient!.verify.v2
|
|
.services(serviceSid)
|
|
.verifications.create({
|
|
channel: "sms",
|
|
customCode: code,
|
|
to: phoneNumber,
|
|
});
|
|
|
|
if (verification.status !== "pending") {
|
|
throw new Error("Unknown error sending verification code");
|
|
}
|
|
|
|
return verification.sid;
|
|
}
|
|
|
|
export async function updateVerify(sid: string) {
|
|
const { serviceSid } = getEnvVars();
|
|
const twilioClient = getTwilioClient();
|
|
|
|
const verification = await twilioClient!.verify.v2
|
|
.services(serviceSid)
|
|
.verifications(sid)
|
|
.update({ status: "approved" });
|
|
|
|
if (verification.status !== "approved") {
|
|
throw new Error("Unknown error updating verification");
|
|
}
|
|
} |