Skip to content
Merged
Show file tree
Hide file tree
Changes from 1 commit
Commits
Show all changes
26 commits
Select commit Hold shift + click to select a range
b1ced85
Add sentry replay envelope and event
romtsn Feb 1, 2024
f8419d1
Merge branch 'rz/feat/session-replay-sources' into rz/feat/session-re…
romtsn Feb 13, 2024
a63cac1
WIP
romtsn Feb 15, 2024
fa72057
Add replay envelopes
romtsn Feb 19, 2024
6cfb511
Remove jsonValue
romtsn Feb 19, 2024
0d031d7
Remove
romtsn Feb 19, 2024
07e6b26
Fix json
romtsn Feb 19, 2024
18af924
Finalize replay envelopes
romtsn Feb 20, 2024
64cedfa
Introduce MapObjectReader
romtsn Feb 20, 2024
b8cb924
Add missing test
romtsn Feb 20, 2024
28d341f
Merge branch 'rz/feat/session-replay-envelopes' into rz/feat/session-…
romtsn Feb 20, 2024
1e76fc7
Add test for MapObjectReader
romtsn Feb 22, 2024
13c1971
Add MapObjectWriter change
romtsn Feb 22, 2024
a14e090
Merge branch 'rz/feat/session-replay-envelopes' into rz/feat/session-…
romtsn Feb 22, 2024
86baf7f
Add finals
romtsn Feb 22, 2024
f1ca9f6
Fix test
romtsn Feb 22, 2024
fbbe0d9
Fix test
romtsn Feb 22, 2024
688233f
Merge branch 'rz/feat/session-replay-envelopes' into rz/feat/session-…
romtsn Feb 22, 2024
fd63960
Address review
romtsn Feb 28, 2024
93785cc
Add finals and annotations
romtsn Feb 28, 2024
4db19e0
Merge pull request #3215 from getsentry/rz/feat/session-replay-map-ob…
romtsn Feb 28, 2024
62477b4
Remove public captureReplay method
romtsn Mar 1, 2024
af42fb3
Fix test
romtsn Mar 1, 2024
cd09739
Merge branch 'rz/feat/session-replay-sources' into rz/feat/session-re…
romtsn Mar 1, 2024
4e54c77
api dump
romtsn Mar 1, 2024
fb14ecb
Merge branch 'rz/feat/session-replay' into rz/feat/session-replay-env…
romtsn Mar 4, 2024
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Prev Previous commit
Next Next commit
Add finals and annotations
  • Loading branch information
romtsn committed Feb 28, 2024
commit 93785cc282c0c2a32b1dcd3e8a57a32ff2aa7658
2 changes: 1 addition & 1 deletion sentry/src/main/java/io/sentry/Hub.java
Original file line number Diff line number Diff line change
Expand Up @@ -932,7 +932,7 @@ private IScope buildLocalScope(
"Instance is disabled and this 'captureReplay' call is a no-op.");
} else {
try {
StackItem item = stack.peek();
final @NotNull StackItem item = stack.peek();
sentryId = item.getClient().captureReplayEvent(replay, item.getScope(), hint);
} catch (Throwable e) {
options.getLogger().log(SentryLevel.ERROR, "Error while capturing replay", e);
Expand Down
3 changes: 2 additions & 1 deletion sentry/src/main/java/io/sentry/MainEventProcessor.java
Original file line number Diff line number Diff line change
Expand Up @@ -150,7 +150,8 @@ private void processNonCachedEvent(final @NotNull SentryBaseEvent event) {
}

@Override
public @NotNull SentryReplayEvent process(@NotNull SentryReplayEvent event, @NotNull Hint hint) {
public @NotNull SentryReplayEvent process(
final @NotNull SentryReplayEvent event, final @NotNull Hint hint) {
setCommons(event);
// TODO: maybe later it's needed to deobfuscate something (e.g. view hierarchy), for now the
// TODO: protocol does not support it
Expand Down
8 changes: 4 additions & 4 deletions sentry/src/main/java/io/sentry/ReplayRecording.java
Original file line number Diff line number Diff line change
Expand Up @@ -31,7 +31,7 @@ public Integer getSegmentId() {
return segmentId;
}

public void setSegmentId(@Nullable Integer segmentId) {
public void setSegmentId(final @Nullable Integer segmentId) {
this.segmentId = segmentId;
}

Expand All @@ -40,7 +40,7 @@ public List<? extends RRWebEvent> getPayload() {
return payload;
}

public void setPayload(@Nullable List<? extends RRWebEvent> payload) {
public void setPayload(final @Nullable List<? extends RRWebEvent> payload) {
this.payload = payload;
}

Expand Down Expand Up @@ -136,11 +136,11 @@ public static final class Deserializer implements JsonDeserializer<ReplayRecordi
if (event instanceof Map) {
final Map<String, Object> eventMap = (Map<String, Object>) event;
final ObjectReader mapReader = new MapObjectReader(eventMap);
for (Map.Entry<String, Object> entry : eventMap.entrySet()) {
for (final Map.Entry<String, Object> entry : eventMap.entrySet()) {
final String key = entry.getKey();
final Object value = entry.getValue();
if (key.equals("type")) {
RRWebEventType type = RRWebEventType.values()[(int) value];
final RRWebEventType type = RRWebEventType.values()[(int) value];
switch (type) {
case Meta:
final RRWebEvent metaEvent =
Expand Down
54 changes: 28 additions & 26 deletions sentry/src/main/java/io/sentry/SentryEnvelopeItem.java
Original file line number Diff line number Diff line change
Expand Up @@ -425,32 +425,34 @@ public CachedItem(final @Nullable Callable<byte[]> dataFactory) {
}
}

@SuppressWarnings({"CharsetObjectCanBeUsed", "UnnecessaryParentheses"})
private static byte[] serializeToMsgpack(Map<String, byte[]> map) throws IOException {
ByteArrayOutputStream baos = new ByteArrayOutputStream();

// Write map header
baos.write((byte) (0x80 | map.size()));

// Iterate over the map and serialize each key-value pair
for (Map.Entry<String, byte[]> entry : map.entrySet()) {
// Pack the key as a string
byte[] keyBytes = entry.getKey().getBytes(UTF_8);
int keyLength = keyBytes.length;
// string up to 255 chars
baos.write((byte) (0xd9));
baos.write((byte) (keyLength));
baos.write(keyBytes);

// Pack the value as a binary string
byte[] valueBytes = entry.getValue();
int valueLength = valueBytes.length;
// We will always use the 4 bytes data length for simplicity.
baos.write((byte) (0xc6));
baos.write(ByteBuffer.allocate(4).order(ByteOrder.BIG_ENDIAN).putInt(valueLength).array());
baos.write(valueBytes);
}
@SuppressWarnings({"UnnecessaryParentheses"})
private static byte[] serializeToMsgpack(final @NotNull Map<String, byte[]> map)
throws IOException {
try (final ByteArrayOutputStream baos = new ByteArrayOutputStream()) {

// Write map header
baos.write((byte) (0x80 | map.size()));

// Iterate over the map and serialize each key-value pair
for (final Map.Entry<String, byte[]> entry : map.entrySet()) {
// Pack the key as a string
final byte[] keyBytes = entry.getKey().getBytes(UTF_8);
final int keyLength = keyBytes.length;
// string up to 255 chars
baos.write((byte) (0xd9));
baos.write((byte) (keyLength));
baos.write(keyBytes);

// Pack the value as a binary string
final byte[] valueBytes = entry.getValue();
final int valueLength = valueBytes.length;
// We will always use the 4 bytes data length for simplicity.
baos.write((byte) (0xc6));
baos.write(ByteBuffer.allocate(4).order(ByteOrder.BIG_ENDIAN).putInt(valueLength).array());
baos.write(valueBytes);
}

return baos.toByteArray();
return baos.toByteArray();
}
}
}
8 changes: 4 additions & 4 deletions sentry/src/main/java/io/sentry/SentryReplayEvent.java
Original file line number Diff line number Diff line change
Expand Up @@ -22,15 +22,15 @@ public enum ReplayType implements JsonSerializable {
BUFFER;

@Override
public void serialize(@NotNull ObjectWriter writer, @NotNull ILogger logger)
public void serialize(final @NotNull ObjectWriter writer, final @NotNull ILogger logger)
throws IOException {
writer.value(name().toLowerCase(Locale.ROOT));
}

public static final class Deserializer implements JsonDeserializer<ReplayType> {
@Override
public @NotNull ReplayType deserialize(@NotNull ObjectReader reader, @NotNull ILogger logger)
throws Exception {
public @NotNull ReplayType deserialize(
final @NotNull ObjectReader reader, final @NotNull ILogger logger) throws Exception {
return ReplayType.valueOf(reader.nextString().toUpperCase(Locale.ROOT));
}
}
Expand Down Expand Up @@ -236,7 +236,7 @@ public static final class Deserializer implements JsonDeserializer<SentryReplayE
public @NotNull SentryReplayEvent deserialize(
final @NotNull ObjectReader reader, final @NotNull ILogger logger) throws Exception {

SentryBaseEvent.Deserializer baseEventDeserializer = new SentryBaseEvent.Deserializer();
final SentryBaseEvent.Deserializer baseEventDeserializer = new SentryBaseEvent.Deserializer();

final SentryReplayEvent replay = new SentryReplayEvent();

Expand Down
12 changes: 7 additions & 5 deletions sentry/src/main/java/io/sentry/rrweb/RRWebEvent.java
Original file line number Diff line number Diff line change
Expand Up @@ -60,7 +60,9 @@ public static final class JsonKeys {

public static final class Serializer {
public void serialize(
@NotNull RRWebEvent baseEvent, @NotNull ObjectWriter writer, @NotNull ILogger logger)
final @NotNull RRWebEvent baseEvent,
final @NotNull ObjectWriter writer,
final @NotNull ILogger logger)
throws IOException {
writer.name(JsonKeys.TYPE).value(logger, baseEvent.type);
writer.name(JsonKeys.TIMESTAMP).value(baseEvent.timestamp);
Expand All @@ -70,10 +72,10 @@ public void serialize(
public static final class Deserializer {
@SuppressWarnings("unchecked")
public boolean deserializeValue(
@NotNull RRWebEvent baseEvent,
@NotNull String nextName,
@NotNull ObjectReader reader,
@NotNull ILogger logger)
final @NotNull RRWebEvent baseEvent,
final @NotNull String nextName,
final @NotNull ObjectReader reader,
final @NotNull ILogger logger)
throws Exception {
switch (nextName) {
case JsonKeys.TYPE:
Expand Down
5 changes: 3 additions & 2 deletions sentry/src/main/java/io/sentry/rrweb/RRWebEventType.java
Original file line number Diff line number Diff line change
Expand Up @@ -18,14 +18,15 @@ public enum RRWebEventType implements JsonSerializable {
Plugin;

@Override
public void serialize(@NotNull ObjectWriter writer, @NotNull ILogger logger) throws IOException {
public void serialize(final @NotNull ObjectWriter writer, final @NotNull ILogger logger)
throws IOException {
writer.value(ordinal());
}

public static final class Deserializer implements JsonDeserializer<RRWebEventType> {
@Override
public @NotNull RRWebEventType deserialize(
@NotNull ObjectReader reader, @NotNull ILogger logger) throws Exception {
final @NotNull ObjectReader reader, final @NotNull ILogger logger) throws Exception {
return RRWebEventType.values()[reader.nextInt()];
}
}
Expand Down
10 changes: 5 additions & 5 deletions sentry/src/main/java/io/sentry/rrweb/RRWebMetaEvent.java
Original file line number Diff line number Diff line change
Expand Up @@ -127,11 +127,11 @@ public static final class Deserializer implements JsonDeserializer<RRWebMetaEven
@SuppressWarnings("unchecked")
@Override
public @NotNull RRWebMetaEvent deserialize(
@NotNull ObjectReader reader, @NotNull ILogger logger) throws Exception {
final @NotNull ObjectReader reader, final @NotNull ILogger logger) throws Exception {
reader.beginObject();
Map<String, Object> unknown = null;
RRWebMetaEvent event = new RRWebMetaEvent();
RRWebEvent.Deserializer baseEventDeserializer = new RRWebEvent.Deserializer();
@Nullable Map<String, Object> unknown = null;
final RRWebMetaEvent event = new RRWebMetaEvent();
final RRWebEvent.Deserializer baseEventDeserializer = new RRWebEvent.Deserializer();

while (reader.peek() == JsonToken.NAME) {
final String nextName = reader.nextName();
Expand Down Expand Up @@ -159,7 +159,7 @@ private void deserializeData(
final @NotNull ObjectReader reader,
final @NotNull ILogger logger)
throws Exception {
Map<String, Object> unknown = null;
@Nullable Map<String, Object> unknown = null;

reader.beginObject();
while (reader.peek() == JsonToken.NAME) {
Expand Down
23 changes: 12 additions & 11 deletions sentry/src/main/java/io/sentry/rrweb/RRWebVideoEvent.java
Original file line number Diff line number Diff line change
Expand Up @@ -242,14 +242,15 @@ public static final class JsonKeys {
}

@Override
public void serialize(@NotNull ObjectWriter writer, @NotNull ILogger logger) throws IOException {
public void serialize(final @NotNull ObjectWriter writer, final @NotNull ILogger logger)
throws IOException {
writer.beginObject();
new RRWebEvent.Serializer().serialize(this, writer, logger);
writer.name(JsonKeys.DATA);
serializeData(writer, logger);
if (unknown != null) {
for (String key : unknown.keySet()) {
Object value = unknown.get(key);
for (final String key : unknown.keySet()) {
final Object value = unknown.get(key);
writer.name(key);
writer.value(logger, value);
}
Expand Down Expand Up @@ -289,8 +290,8 @@ private void serializePayload(final @NotNull ObjectWriter writer, final @NotNull
writer.name(JsonKeys.LEFT).value(left);
writer.name(JsonKeys.TOP).value(top);
if (payloadUnknown != null) {
for (String key : payloadUnknown.keySet()) {
Object value = payloadUnknown.get(key);
for (final String key : payloadUnknown.keySet()) {
final Object value = payloadUnknown.get(key);
writer.name(key);
writer.value(logger, value);
}
Expand All @@ -303,12 +304,12 @@ public static final class Deserializer implements JsonDeserializer<RRWebVideoEve
@SuppressWarnings("unchecked")
@Override
public @NotNull RRWebVideoEvent deserialize(
@NotNull ObjectReader reader, @NotNull ILogger logger) throws Exception {
final @NotNull ObjectReader reader, final @NotNull ILogger logger) throws Exception {
reader.beginObject();
Map<String, Object> unknown = null;
@Nullable Map<String, Object> unknown = null;

RRWebVideoEvent event = new RRWebVideoEvent();
RRWebEvent.Deserializer baseEventDeserializer = new RRWebEvent.Deserializer();
final RRWebVideoEvent event = new RRWebVideoEvent();
final RRWebEvent.Deserializer baseEventDeserializer = new RRWebEvent.Deserializer();

while (reader.peek() == JsonToken.NAME) {
final String nextName = reader.nextName();
Expand Down Expand Up @@ -336,7 +337,7 @@ private void deserializeData(
final @NotNull ObjectReader reader,
final @NotNull ILogger logger)
throws Exception {
Map<String, Object> dataUnknown = null;
@Nullable Map<String, Object> dataUnknown = null;

reader.beginObject();
while (reader.peek() == JsonToken.NAME) {
Expand Down Expand Up @@ -365,7 +366,7 @@ private void deserializePayload(
final @NotNull ObjectReader reader,
final @NotNull ILogger logger)
throws Exception {
Map<String, Object> payloadUnknown = null;
@Nullable Map<String, Object> payloadUnknown = null;

reader.beginObject();
while (reader.peek() == JsonToken.NAME) {
Expand Down