@@ -23,6 +23,16 @@ namespace {
2323// Header for the message format.
2424static constexpr kj::StringPtr HDR_MSG_FORMAT = " X-Msg-Fmt" _kj;
2525
26+ // The upstream service sends 0 when there is "no data" available on a timestamp field (e.g. no `oldestMessageTimestamp`).
27+ // This method converts it to kj::none so users see `undefined`.
28+ void clearEpochSentinel (jsg::Optional<kj::Date>& ts) {
29+ KJ_IF_SOME (date, ts) {
30+ if (date == kj::UNIX_EPOCH) {
31+ ts = kj::none;
32+ }
33+ }
34+ }
35+
2636// Header for the message delivery delay.
2737static constexpr kj::StringPtr HDR_MSG_DELAY = " X-Msg-Delay-Secs" _kj;
2838
@@ -306,8 +316,10 @@ jsg::Promise<WorkerQueue::SendResponse> WorkerQueue::sendWithResponse(jsg::Lock&
306316 return context.awaitIo (
307317 js, kj::mv (promise), [&responseHandler](jsg::Lock& js, kj::String text) -> SendResponse {
308318 auto parsed = jsg::JsValue::fromJson (js, text);
309- return JSG_REQUIRE_NONNULL (
319+ auto result = JSG_REQUIRE_NONNULL (
310320 responseHandler.tryUnwrap (js, parsed), Error, " Failed to parse queue send response" , text);
321+ clearEpochSentinel (result.metadata .metrics .oldestMessageTimestamp );
322+ return kj::mv (result);
311323 });
312324}
313325
@@ -456,6 +468,7 @@ jsg::Promise<WorkerQueue::Metrics> WorkerQueue::metrics(
456468 auto parsed = jsg::JsValue::fromJson (js, text);
457469 auto result = JSG_REQUIRE_NONNULL (metricsHandler.tryUnwrap (js, parsed), Error,
458470 " Failed to parse queue metrics response" , text);
471+ clearEpochSentinel (result.oldestMessageTimestamp );
459472 return kj::mv (result);
460473 });
461474}
@@ -569,8 +582,10 @@ jsg::Promise<WorkerQueue::SendBatchResponse> WorkerQueue::sendBatchWithResponse(
569582 return context.awaitIo (
570583 js, kj::mv (promise), [&responseHandler](jsg::Lock& js, kj::String text) -> SendBatchResponse {
571584 auto parsed = jsg::JsValue::fromJson (js, text);
572- return JSG_REQUIRE_NONNULL (
585+ auto result = JSG_REQUIRE_NONNULL (
573586 responseHandler.tryUnwrap (js, parsed), Error, " Failed to parse queue send response" , text);
587+ clearEpochSentinel (result.metadata .metrics .oldestMessageTimestamp );
588+ return kj::mv (result);
574589 });
575590}
576591
@@ -658,14 +673,19 @@ QueueEvent::QueueEvent(
658673 }
659674 messages = messagesBuilder.finish ();
660675
661- // Extract metadata. If the sender didn't set the field, capnp defaults all values to zero.
676+ // Extract metadata. If the sender didn't set the field, capnp defaults all to the zero values .
662677 auto m = params.getMetadata ().getMetrics ();
678+ jsg::Optional<kj::Date> oldestTimestamp;
679+ if (m.getOldestMessageTimestamp () != 0 ) {
680+ oldestTimestamp =
681+ kj::UNIX_EPOCH + static_cast <int64_t >(m.getOldestMessageTimestamp ()) * kj::MILLISECONDS;
682+ }
663683 metadata = MessageBatchMetadata{
664684 .metrics =
665685 MessageBatchMetrics{
666686 .backlogCount = m.getBacklogCount (),
667687 .backlogBytes = m.getBacklogBytes (),
668- .oldestMessageTimestamp = m. getOldestMessageTimestamp ( ),
688+ .oldestMessageTimestamp = kj::mv (oldestTimestamp ),
669689 },
670690 };
671691}
@@ -985,7 +1005,9 @@ kj::Promise<WorkerInterface::CustomEvent::Result> QueueCustomEvent::sendRpc(
9851005 auto metricsBuilder = metadataBuilder.initMetrics ();
9861006 metricsBuilder.setBacklogCount (p.metadata .metrics .backlogCount );
9871007 metricsBuilder.setBacklogBytes (p.metadata .metrics .backlogBytes );
988- metricsBuilder.setOldestMessageTimestamp (p.metadata .metrics .oldestMessageTimestamp );
1008+ KJ_IF_SOME (ts, p.metadata .metrics .oldestMessageTimestamp ) {
1009+ metricsBuilder.setOldestMessageTimestamp ((ts - kj::UNIX_EPOCH) / kj::MILLISECONDS);
1010+ }
9891011 }
9901012 }
9911013 }
0 commit comments