(
event: ExecutionEvent,
context: ExecutionEventWriterContext = {}
)
| 287 | } |
| 288 | |
| 289 | async function compactEventForBuffer( |
| 290 | event: ExecutionEvent, |
| 291 | context: ExecutionEventWriterContext = {} |
| 292 | ): Promise<ExecutionEvent> { |
| 293 | if (!('data' in event)) { |
| 294 | return event |
| 295 | } |
| 296 | |
| 297 | const baseOptions = { |
| 298 | ...context, |
| 299 | executionId: context.executionId ?? event.executionId, |
| 300 | requireDurable: context.requireDurablePayloads, |
| 301 | preserveRoot: true, |
| 302 | } |
| 303 | |
| 304 | let compactedData = await compactExecutionPayload(event.data, { |
| 305 | ...baseOptions, |
| 306 | preserveUserFileBase64: context.preserveUserFileBase64, |
| 307 | }) |
| 308 | let eventData = trimFinalBlockLogsForEventData(compactedData) |
| 309 | let eventDataSize = getJsonSize(eventData) |
| 310 | |
| 311 | // SSE/replay events are size-bounded by LARGE_VALUE_THRESHOLD_BYTES. When a |
| 312 | // payload that preserved UserFile base64 (e.g., for chat/streaming) exceeds |
| 313 | // the cap, recompact the already-compacted result with base64 stripped so |
| 314 | // consumers can lazily re-hydrate via sim.files.readBase64. Recompacting the |
| 315 | // *compacted* value (not the raw event.data) lets existing LargeValueRefs |
| 316 | // pass through unchanged and avoids minting fresh storage objects for the |
| 317 | // same large fields. |
| 318 | if ( |
| 319 | context.preserveUserFileBase64 && |
| 320 | eventDataSize !== null && |
| 321 | eventDataSize > LARGE_VALUE_THRESHOLD_BYTES |
| 322 | ) { |
| 323 | const oversizedBytes = eventDataSize |
| 324 | compactedData = await compactExecutionPayload(compactedData, { |
| 325 | ...baseOptions, |
| 326 | preserveUserFileBase64: false, |
| 327 | }) |
| 328 | eventData = trimFinalBlockLogsForEventData(compactedData) |
| 329 | eventDataSize = getJsonSize(eventData) |
| 330 | logger.warn('Stripped inline UserFile base64 from execution event to fit size limit', { |
| 331 | executionId: baseOptions.executionId, |
| 332 | eventType: 'type' in event ? event.type : undefined, |
| 333 | thresholdBytes: LARGE_VALUE_THRESHOLD_BYTES, |
| 334 | originalBytes: oversizedBytes, |
| 335 | strippedBytes: eventDataSize, |
| 336 | }) |
| 337 | } |
| 338 | |
| 339 | if (eventDataSize !== null && eventDataSize > LARGE_VALUE_THRESHOLD_BYTES) { |
| 340 | throw new Error( |
| 341 | `Execution event data remains too large after compaction (${eventDataSize} bytes)` |
| 342 | ) |
| 343 | } |
| 344 | |
| 345 | return { ...event, data: eventData } as ExecutionEvent |
| 346 | } |
no test coverage detected