(request: LoggedRequest)
| 187 | }; |
| 188 | |
| 189 | export async function logRequest(request: LoggedRequest) { |
| 190 | const logger = _logger.child({ |
| 191 | module: "log_job", |
| 192 | method: "logRequest", |
| 193 | requestId: request.id, |
| 194 | teamId: request.team_id, |
| 195 | zeroDataRetention: request.zeroDataRetention, |
| 196 | }); |
| 197 | |
| 198 | // Emit a one-time PostHog milestone the first time this team uses each |
| 199 | // surface (playground / sdk / mcp / cli / api / ...). Fire-and-forget. |
| 200 | // Skip zero-data-retention requests — don't send their metadata to PostHog. |
| 201 | if (!request.zeroDataRetention) { |
| 202 | trackFirstSurfaceUse({ |
| 203 | teamId: request.team_id, |
| 204 | origin: request.origin, |
| 205 | kind: request.kind, |
| 206 | apiVersion: request.api_version, |
| 207 | apiKeyId: request.api_key_id, |
| 208 | }); |
| 209 | } |
| 210 | |
| 211 | // Sanitize user-provided fields (most likely sources of null bytes) |
| 212 | const sanitizedOrigin = sanitizeString(request.origin); |
| 213 | const sanitizedIntegration = sanitizeString(request.integration ?? null); |
| 214 | const sanitizedTargetHint = request.zeroDataRetention |
| 215 | ? "<redacted due to zero data retention>" |
| 216 | : sanitizeString(request.target_hint); |
| 217 | |
| 218 | await robustInsert( |
| 219 | "requests", |
| 220 | { |
| 221 | id: request.id, |
| 222 | kind: request.kind, |
| 223 | api_version: request.api_version, |
| 224 | team_id: |
| 225 | request.team_id === "preview" || request.team_id?.startsWith("preview_") |
| 226 | ? previewTeamId |
| 227 | : request.team_id, |
| 228 | origin: sanitizedOrigin, |
| 229 | integration: sanitizedIntegration, |
| 230 | target_hint: sanitizedTargetHint, |
| 231 | dr_clean_by: request.zeroDataRetention |
| 232 | ? new Date(Date.now() + 24 * 60 * 60 * 1000) |
| 233 | : null, |
| 234 | api_key_id: request.api_key_id ?? null, |
| 235 | }, |
| 236 | true, |
| 237 | logger, |
| 238 | ); |
| 239 | } |
| 240 | |
| 241 | export type LoggedScrape = { |
| 242 | id: string; |
no test coverage detected
searching dependent graphs…