Skip to content

Commit 372cf0e

Browse files
committed
fix: field bitmap parsing bug
1 parent ac19f3f commit 372cf0e

File tree

1 file changed

+25
-13
lines changed

1 file changed

+25
-13
lines changed

src/eventParser.js

Lines changed: 25 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -4,18 +4,30 @@ export function parseEvent(schema, event) {
44
const allFields = schema.type.getFields();
55
const replayId = decodeReplayId(event.replayId);
66
const payload = schema.type.fromBuffer(event.event.payload); // This schema is the same which we retreived earlier in the GetSchema rpc.
7-
payload.ChangeEventHeader.nulledFields = parseFieldBitmaps(
8-
allFields,
9-
payload.ChangeEventHeader.nulledFields
10-
);
11-
payload.ChangeEventHeader.diffFields = parseFieldBitmaps(
12-
allFields,
13-
payload.ChangeEventHeader.diffFields
14-
);
15-
payload.ChangeEventHeader.changedFields = parseFieldBitmaps(
16-
allFields,
17-
payload.ChangeEventHeader.changedFields
18-
);
7+
try {
8+
payload.ChangeEventHeader.nulledFields = parseFieldBitmaps(
9+
allFields,
10+
payload.ChangeEventHeader.nulledFields
11+
);
12+
} catch (error) {
13+
throw new Error('Failed to parse nulledFields', { cause: error });
14+
}
15+
try {
16+
payload.ChangeEventHeader.diffFields = parseFieldBitmaps(
17+
allFields,
18+
payload.ChangeEventHeader.diffFields
19+
);
20+
} catch (error) {
21+
throw new Error('Failed to parse diffFields', { cause: error });
22+
}
23+
try {
24+
payload.ChangeEventHeader.changedFields = parseFieldBitmaps(
25+
allFields,
26+
payload.ChangeEventHeader.changedFields
27+
);
28+
} catch (error) {
29+
throw new Error('Failed to parse changedFields', { cause: error });
30+
}
1931
return {
2032
replayId,
2133
payload
@@ -85,7 +97,7 @@ function getFieldNamesFromBitmap(fields, fieldBitmapAsHex) {
8597
binValue = reverseBytes(binValue); // Reverse byte order to match expected format
8698
// Use bitmap to figure out field names based on index
8799
const fieldNames = [];
88-
for (let i = 0; i < binValue.length; i++) {
100+
for (let i = 0; i < binValue.length && i < fields.length; i++) {
89101
if (binValue[i] === '1') {
90102
fieldNames.push(fields[i].getName());
91103
}

0 commit comments

Comments
 (0)