@logtail/next
Version:
Better Stack Telemetry Next.js client
138 lines • 5.12 kB
JavaScript
;
var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {
function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }
return new (P || (P = Promise))(function (resolve, reject) {
function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } }
function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }
step((generator = generator.apply(thisArg, _arguments || [])).next());
});
};
Object.defineProperty(exports, "__esModule", { value: true });
exports.throttle = exports.requestToJSON = exports.EndpointType = exports.isNoPrettyPrint = void 0;
exports.isNoPrettyPrint = process.env.BETTER_STACK_NO_PRETTY_PRINT == 'true' ? true : false;
var EndpointType;
(function (EndpointType) {
EndpointType["webVitals"] = "web-vitals";
EndpointType["logs"] = "logs";
})(EndpointType || (exports.EndpointType = EndpointType = {}));
/**
* Transforms a NextRequest or Request object into a JSON-serializable object
*/
function requestToJSON(request) {
var _a;
return __awaiter(this, void 0, void 0, function* () {
// Get all headers
const headers = {};
request.headers.forEach((value, key) => {
headers[key] = value;
});
let cookiesData = {};
if ('cookies' in request) {
request.cookies.getAll().forEach((cookie) => {
cookiesData[cookie.name] = cookie.value;
});
}
else {
const cookieHeader = headers['cookie'];
if (cookieHeader) {
cookiesData = Object.fromEntries(cookieHeader.split(';').map((cookie) => {
const [key, value] = cookie.trim().split('=');
return [key, value];
}));
}
}
let nextUrlData;
if ('nextUrl' in request) {
const nextUrl = request.nextUrl;
nextUrlData = {
basePath: nextUrl.basePath,
buildId: nextUrl.buildId,
hash: nextUrl.hash,
host: nextUrl.host,
hostname: nextUrl.hostname,
href: nextUrl.href,
origin: nextUrl.origin,
password: nextUrl.password,
pathname: nextUrl.pathname,
port: nextUrl.port,
protocol: nextUrl.protocol,
search: nextUrl.search,
searchParams: Object.fromEntries(nextUrl.searchParams.entries()),
username: nextUrl.username,
};
}
let body;
if (request.body) {
try {
const clonedRequest = request.clone();
try {
body = yield clonedRequest.json();
(_a = clonedRequest.body) === null || _a === void 0 ? void 0 : _a.getReader;
}
catch (_b) {
body = yield clonedRequest.text();
}
}
catch (error) {
console.warn('Could not parse request body:', error);
}
}
const cache = {
mode: request.cache,
credentials: request.credentials,
redirect: request.redirect,
referrerPolicy: request.referrerPolicy,
integrity: request.integrity,
};
let ip;
if ('ip' in request) {
// @ts-ignore NextRequest.ip was removed in Next 15, works with undefined
ip = request.ip;
}
// @ts-ignore NextRequest.ip was removed in Next 15, works with undefined
let geo;
if ('geo' in request) {
geo = request.geo;
}
return {
method: request.method,
url: request.url,
headers,
cookies: cookiesData,
nextUrl: nextUrlData,
ip,
geo,
body,
cache,
mode: request.mode,
destination: request.destination,
referrer: request.referrer,
keepalive: request.keepalive,
signal: {
aborted: request.signal.aborted,
reason: request.signal.reason,
},
};
});
}
exports.requestToJSON = requestToJSON;
const throttle = (fn, wait) => {
let lastFn, lastTime;
return function () {
const context = this, args = arguments;
// First call, set lastTime
if (lastTime == null) {
lastTime = Date.now();
}
clearTimeout(lastFn);
lastFn = setTimeout(() => {
if (Date.now() - lastTime >= wait) {
fn.apply(context, args);
lastTime = Date.now();
}
}, Math.max(wait - (Date.now() - lastTime), 0));
};
};
exports.throttle = throttle;
//# sourceMappingURL=shared.js.map