@n8n/n8n-nodes-langchain
Version:
121 lines • 4.6 kB
JavaScript
;
Object.defineProperty(exports, "__esModule", { value: true });
exports.CHAT_REFRESH_HEADER = exports.CHAT_REFRESH_PARAM = exports.CHAT_FRAME_SANDBOX = exports.CHAT_SHELL_INNER_PARAM = void 0;
exports.isShellInnerRequest = isShellInnerRequest;
exports.buildInnerFrameSrc = buildInnerFrameSrc;
exports.buildChatRefreshUrl = buildChatRefreshUrl;
exports.setChatOAuthToken = setChatOAuthToken;
exports.readChatOAuthToken = readChatOAuthToken;
exports.clearChatOAuthToken = clearChatOAuthToken;
exports.setChatRefreshToken = setChatRefreshToken;
exports.readChatRefreshToken = readChatRefreshToken;
exports.clearChatRefreshToken = clearChatRefreshToken;
exports.isChatRefreshRequest = isChatRefreshRequest;
exports.CHAT_SHELL_INNER_PARAM = 'n8nShellInner';
exports.CHAT_FRAME_SANDBOX = 'allow-scripts allow-forms allow-modals allow-popups';
function isShellInnerRequest(req) {
if (req.query[exports.CHAT_SHELL_INNER_PARAM] !== '1')
return false;
return req.headers['sec-fetch-dest'] === 'iframe';
}
function buildInnerFrameSrc(req) {
const [path, query] = req.originalUrl.split('?');
const params = new URLSearchParams(query);
params.set(exports.CHAT_SHELL_INNER_PARAM, '1');
return `${path}?${params.toString()}`;
}
exports.CHAT_REFRESH_PARAM = 'n8nChatRefresh';
exports.CHAT_REFRESH_HEADER = 'x-n8n-chat-refresh';
function buildChatRefreshUrl(req) {
const [path, query] = req.originalUrl.split('?');
const params = new URLSearchParams(query);
params.set(exports.CHAT_REFRESH_PARAM, '1');
return `${path}?${params.toString()}`;
}
const CHAT_OAUTH_COOKIE_NAME = 'n8n-chat-oauth';
const CHAT_OAUTH_REFRESH_COOKIE_NAME = 'n8n-chat-oauth-refresh';
const REFRESH_COOKIE_MAX_AGE_MS = 30 * 24 * 60 * 60 * 1000;
function isSecureRequest(req) {
const forwardedProto = req.headers['x-forwarded-proto'];
const firstValue = Array.isArray(forwardedProto) ? forwardedProto[0] : forwardedProto;
const proto = firstValue?.split(',')[0]?.trim() || req.protocol;
return proto === 'https';
}
function chatOAuthCookieOptions(req, resourceUrl) {
return {
httpOnly: true,
sameSite: 'lax',
secure: isSecureRequest(req),
path: new URL(resourceUrl).pathname,
};
}
function setChatOAuthToken(res, req, resourceUrl, payload) {
const value = { t: payload.token, e: payload.expiresAt };
res.cookie(CHAT_OAUTH_COOKIE_NAME, JSON.stringify(value), {
...chatOAuthCookieOptions(req, resourceUrl),
maxAge: 60_000,
});
}
function decodeCookieValue(value) {
try {
return decodeURIComponent(value.trim());
}
catch {
return null;
}
}
function readRawCookie(req, name) {
for (const pair of (req.headers.cookie ?? '').split(';')) {
const separator = pair.indexOf('=');
if (separator === -1)
continue;
if (pair.slice(0, separator).trim() !== name)
continue;
return decodeCookieValue(pair.slice(separator + 1));
}
return null;
}
function isSerializedPayload(value) {
if (typeof value !== 'object' || value === null)
return false;
const { t, e } = value;
return typeof t === 'string' && t !== '' && typeof e === 'number' && Number.isFinite(e);
}
function readChatOAuthToken(req) {
const raw = readRawCookie(req, CHAT_OAUTH_COOKIE_NAME);
if (!raw)
return null;
try {
const parsed = JSON.parse(raw);
return isSerializedPayload(parsed) ? { token: parsed.t, expiresAt: parsed.e } : null;
}
catch {
return null;
}
}
function clearChatOAuthToken(res, req, resourceUrl) {
res.clearCookie(CHAT_OAUTH_COOKIE_NAME, chatOAuthCookieOptions(req, resourceUrl));
}
function setChatRefreshToken(res, req, resourceUrl, refreshToken) {
res.cookie(CHAT_OAUTH_REFRESH_COOKIE_NAME, refreshToken, {
...chatOAuthCookieOptions(req, resourceUrl),
maxAge: REFRESH_COOKIE_MAX_AGE_MS,
});
}
function readChatRefreshToken(req) {
return readRawCookie(req, CHAT_OAUTH_REFRESH_COOKIE_NAME);
}
function clearChatRefreshToken(res, req, resourceUrl) {
res.clearCookie(CHAT_OAUTH_REFRESH_COOKIE_NAME, chatOAuthCookieOptions(req, resourceUrl));
}
function isChatRefreshRequest(req) {
if (req.query[exports.CHAT_REFRESH_PARAM] !== '1')
return false;
if (req.headers[exports.CHAT_REFRESH_HEADER] !== '1')
return false;
const site = req.headers['sec-fetch-site'];
if (typeof site === 'string' && site !== 'same-origin')
return false;
return true;
}
//# sourceMappingURL=shell.js.map