NeahFront5/node_modules/next-auth/core/lib/callback-handler.js
2025-04-10 11:30:00 +02:00

195 lines
5.5 KiB
JavaScript

"use strict";
Object.defineProperty(exports, "__esModule", {
value: true
});
exports.default = callbackHandler;
var _errors = require("../errors");
var _utils = require("./utils");
async function callbackHandler(params) {
const {
sessionToken,
profile: _profile,
account,
options
} = params;
if (!(account !== null && account !== void 0 && account.providerAccountId) || !account.type) throw new Error("Missing or invalid provider account");
if (!["email", "oauth"].includes(account.type)) throw new Error("Provider not supported");
const {
adapter,
jwt,
events,
session: {
strategy: sessionStrategy,
generateSessionToken
}
} = options;
if (!adapter) {
return {
user: _profile,
account
};
}
const profile = _profile;
const {
createUser,
updateUser,
getUser,
getUserByAccount,
getUserByEmail,
linkAccount,
createSession,
getSessionAndUser,
deleteSession
} = adapter;
let session = null;
let user = null;
let isNewUser = false;
const useJwtSession = sessionStrategy === "jwt";
if (sessionToken) {
if (useJwtSession) {
try {
session = await jwt.decode({
...jwt,
token: sessionToken
});
if (session && "sub" in session && session.sub) {
user = await getUser(session.sub);
}
} catch (_unused) {}
} else {
const userAndSession = await getSessionAndUser(sessionToken);
if (userAndSession) {
session = userAndSession.session;
user = userAndSession.user;
}
}
}
if (account.type === "email") {
const userByEmail = await getUserByEmail(profile.email);
if (userByEmail) {
var _user, _events$updateUser;
if (((_user = user) === null || _user === void 0 ? void 0 : _user.id) !== userByEmail.id && !useJwtSession && sessionToken) {
await deleteSession(sessionToken);
}
user = await updateUser({
id: userByEmail.id,
emailVerified: new Date()
});
await ((_events$updateUser = events.updateUser) === null || _events$updateUser === void 0 ? void 0 : _events$updateUser.call(events, {
user
}));
} else {
var _events$createUser;
const {
id: _,
...newUser
} = {
...profile,
emailVerified: new Date()
};
user = await createUser(newUser);
await ((_events$createUser = events.createUser) === null || _events$createUser === void 0 ? void 0 : _events$createUser.call(events, {
user
}));
isNewUser = true;
}
session = useJwtSession ? {} : await createSession({
sessionToken: await generateSessionToken(),
userId: user.id,
expires: (0, _utils.fromDate)(options.session.maxAge)
});
return {
session,
user,
isNewUser
};
} else if (account.type === "oauth") {
const userByAccount = await getUserByAccount({
providerAccountId: account.providerAccountId,
provider: account.provider
});
if (userByAccount) {
if (user) {
if (userByAccount.id === user.id) {
return {
session,
user,
isNewUser
};
}
throw new _errors.AccountNotLinkedError("The account is already associated with another user");
}
session = useJwtSession ? {} : await createSession({
sessionToken: await generateSessionToken(),
userId: userByAccount.id,
expires: (0, _utils.fromDate)(options.session.maxAge)
});
return {
session,
user: userByAccount,
isNewUser
};
} else {
var _events$createUser2, _events$linkAccount2;
if (user) {
var _events$linkAccount;
await linkAccount({
...account,
userId: user.id
});
await ((_events$linkAccount = events.linkAccount) === null || _events$linkAccount === void 0 ? void 0 : _events$linkAccount.call(events, {
user,
account,
profile
}));
return {
session,
user,
isNewUser
};
}
const userByEmail = profile.email ? await getUserByEmail(profile.email) : null;
if (userByEmail) {
const provider = options.provider;
if (provider !== null && provider !== void 0 && provider.allowDangerousEmailAccountLinking) {
user = userByEmail;
} else {
throw new _errors.AccountNotLinkedError("Another account already exists with the same e-mail address");
}
} else {
const {
id: _,
...newUser
} = {
...profile,
emailVerified: null
};
user = await createUser(newUser);
}
await ((_events$createUser2 = events.createUser) === null || _events$createUser2 === void 0 ? void 0 : _events$createUser2.call(events, {
user
}));
await linkAccount({
...account,
userId: user.id
});
await ((_events$linkAccount2 = events.linkAccount) === null || _events$linkAccount2 === void 0 ? void 0 : _events$linkAccount2.call(events, {
user,
account,
profile
}));
session = useJwtSession ? {} : await createSession({
sessionToken: await generateSessionToken(),
userId: user.id,
expires: (0, _utils.fromDate)(options.session.maxAge)
});
return {
session,
user,
isNewUser: true
};
}
}
throw new Error("Unsupported account type");
}