supertokens-node
Version:
NodeJS driver for SuperTokens core
128 lines (127 loc) • 5.53 kB
JavaScript
;
/* Copyright (c) 2024, VRAI Labs and/or its affiliates. All rights reserved.
*
* This software is licensed under the Apache License, Version 2.0 (the
* "License") as published by the Apache Software Foundation.
*
* You may not use this file except in compliance with the License. You may
* obtain a copy of the License at http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
* WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
* License for the specific language governing permissions and limitations
* under the License.
*/
Object.defineProperty(exports, "__esModule", { value: true });
exports.default = getRecipeInterface;
function getRecipeInterface(stInstance, querier, config) {
return {
getUserIdentifierInfoForUserId: async function ({ userId, userContext }) {
let user = await stInstance
.getRecipeInstanceOrThrow("accountlinking")
.recipeInterfaceImpl.getUser({ userId, userContext });
if (user === undefined) {
return {
status: "UNKNOWN_USER_ID_ERROR",
};
}
const primaryLoginMethod = user.loginMethods.find((method) => method.recipeUserId.getAsString() === user.id);
if (primaryLoginMethod !== undefined) {
if (primaryLoginMethod.email !== undefined) {
return {
info: primaryLoginMethod.email,
status: "OK",
};
}
else if (primaryLoginMethod.phoneNumber !== undefined) {
return {
info: primaryLoginMethod.phoneNumber,
status: "OK",
};
}
}
if (user.emails.length > 0) {
return { info: user.emails[0], status: "OK" };
}
else if (user.phoneNumbers.length > 0) {
return { info: user.phoneNumbers[0], status: "OK" };
}
return {
status: "USER_IDENTIFIER_INFO_DOES_NOT_EXIST_ERROR",
};
},
createDevice: async function (input) {
var _a, _b, _c;
if (input.userIdentifierInfo === undefined) {
const emailOrPhoneInfo = await this.getUserIdentifierInfoForUserId({
userId: input.userId,
userContext: input.userContext,
});
if (emailOrPhoneInfo.status === "OK") {
input.userIdentifierInfo = emailOrPhoneInfo.info;
}
else if (emailOrPhoneInfo.status === "UNKNOWN_USER_ID_ERROR") {
return {
status: "UNKNOWN_USER_ID_ERROR",
};
}
else {
// Ignore since UserIdentifierInfo is optional
}
}
const response = await querier.sendPostRequest("/recipe/totp/device", {
userId: input.userId,
deviceName: input.deviceName,
skew: (_a = input.skew) !== null && _a !== void 0 ? _a : config.defaultSkew,
period: (_b = input.period) !== null && _b !== void 0 ? _b : config.defaultPeriod,
}, input.userContext);
if (response.status !== "OK") {
return response;
}
return Object.assign(Object.assign({}, response), { qrCodeString: `otpauth://totp/${encodeURI(config.issuer)}${input.userIdentifierInfo !== undefined ? ":" + encodeURI(input.userIdentifierInfo) : ""}` +
`?secret=${response.secret}&issuer=${encodeURI(config.issuer)}&digits=6&period=${(_c = input.period) !== null && _c !== void 0 ? _c : config.defaultPeriod}` });
},
updateDevice: (input) => {
return querier.sendPutRequest("/recipe/totp/device", {
userId: input.userId,
existingDeviceName: input.existingDeviceName,
newDeviceName: input.newDeviceName,
}, {}, input.userContext);
},
listDevices: (input) => {
return querier.sendGetRequest("/recipe/totp/device/list", {
userId: input.userId,
}, input.userContext);
},
removeDevice: (input) => {
return querier.sendPostRequest("/recipe/totp/device/remove", {
userId: input.userId,
deviceName: input.deviceName,
}, input.userContext);
},
verifyDevice: (input) => {
return querier.sendPostRequest({
path: "/<tenantId>/recipe/totp/device/verify",
params: {
tenantId: input.tenantId,
},
}, {
userId: input.userId,
deviceName: input.deviceName,
totp: input.totp,
}, input.userContext);
},
verifyTOTP: (input) => {
return querier.sendPostRequest({
path: "/<tenantId>/recipe/totp/verify",
params: {
tenantId: input.tenantId,
},
}, {
userId: input.userId,
totp: input.totp,
}, input.userContext);
},
};
}