Skip to content

Commit ca0567d

Browse files
authored
Fix utf8 encoding for payload (#1039)
* fix utf8 encoding for payload Signed-off-by: Assem Hafez <assem.hafez@uber.com> * split language test cases Signed-off-by: Assem Hafez <assem.hafez@uber.com> --------- Signed-off-by: Assem Hafez <assem.hafez@uber.com>
1 parent bf27544 commit ca0567d

12 files changed

+64
-10
lines changed
Lines changed: 33 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,33 @@
1+
import formatBase64Payload from '../format-base64-payload';
2+
3+
describe('formatBase64Payload', () => {
4+
it('should decode English text from base64 correctly', () => {
5+
const result = formatBase64Payload('RW5nbGlzaA==');
6+
expect(result).toBe('English');
7+
});
8+
9+
it('should decode Russian text from base64 correctly', () => {
10+
const result = formatBase64Payload('0KDRg9GB0YHQutC40Lk=');
11+
expect(result).toBe('Русский');
12+
});
13+
14+
it('should decode Chinese text from base64 correctly', () => {
15+
const result = formatBase64Payload('5Lit5paH');
16+
expect(result).toBe('中文');
17+
});
18+
19+
it('should decode Arabic text from base64 correctly', () => {
20+
const result = formatBase64Payload('2KfZhNi52LHYqNmK2Kk=');
21+
expect(result).toBe('العربية');
22+
});
23+
24+
it('should decode Cyrillic text from base64 correctly', () => {
25+
const result = formatBase64Payload('0JXQkw==');
26+
expect(result).toBe('ЕГ');
27+
});
28+
29+
it('should decode emoji from base64 correctly', () => {
30+
const result = formatBase64Payload('8J+agA==');
31+
expect(result).toBe('🚀');
32+
});
33+
});
Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,3 @@
1+
export default function formatBase64Payload(payload: string) {
2+
return Buffer.from(payload, 'base64').toString('utf-8');
3+
}

src/utils/data-formatters/format-failure-details.ts

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,11 +1,13 @@
11
import { type Failure } from '@/__generated__/proto-ts/uber/cadence/api/v1/Failure';
22

3+
import formatBase64Payload from './format-base64-payload';
4+
35
const formatFailureDetails = (failure: Pick<Failure, 'details'> | null) => {
46
if (!failure?.details) {
57
return null;
68
}
79

8-
const decodedFailureDetails = atob(failure.details);
10+
const decodedFailureDetails = formatBase64Payload(failure.details);
911

1012
try {
1113
return JSON.parse(decodedFailureDetails);

src/utils/data-formatters/format-input-payload.ts

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,8 @@ import logger from '@/utils/logger';
22

33
import losslessJsonParse from '../lossless-json-parse';
44

5+
import formatBase64Payload from './format-base64-payload';
6+
57
const separators = ['\n', ' '];
68

79
const formatInputPayload = (
@@ -12,7 +14,7 @@ const formatInputPayload = (
1214
return null;
1315
}
1416

15-
const parsedData = atob(data);
17+
const parsedData = formatBase64Payload(data);
1618
return parseMultipleInputs(parsedData);
1719
};
1820

src/utils/data-formatters/format-payload.ts

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,7 @@
11
import losslessJsonParse from '../lossless-json-parse';
22

3+
import formatBase64Payload from './format-base64-payload';
4+
35
const formatPayload = (
46
payload: { data?: string | null } | null | undefined
57
) => {
@@ -9,7 +11,7 @@ const formatPayload = (
911
return null;
1012
}
1113

12-
const parsedData = atob(data);
14+
const parsedData = formatBase64Payload(data);
1315

1416
// try parsing as JSON
1517
try {

src/utils/data-formatters/format-workflow-history-event/format-external-workflow-execution-signaled-event.ts

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,5 @@
1+
import formatBase64Payload from '../format-base64-payload';
2+
13
import formatWorkflowCommonEventFields from './format-workflow-common-event-fields';
24
import { type ExternalWorkflowExecutionSignaledEvent } from './format-workflow-history-event.type';
35

@@ -14,7 +16,7 @@ const formatExternalWorkflowExecutionSignaledEvent = ({
1416

1517
return {
1618
...primaryCommonFields,
17-
control: control ? parseInt(atob(control)) : null,
19+
control: control ? parseInt(formatBase64Payload(control)) : null,
1820
initiatedEventId: parseInt(initiatedEventId),
1921
...eventAttributes,
2022
...secondaryCommonFields,

src/utils/data-formatters/format-workflow-history-event/format-request-cancel-external-workflow-execution-failed-event.ts

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,5 @@
1+
import formatBase64Payload from '../format-base64-payload';
2+
13
import formatWorkflowCommonEventFields from './format-workflow-common-event-fields';
24
import { type RequestCancelExternalWorkflowExecutionFailedEvent } from './format-workflow-history-event.type';
35

@@ -17,7 +19,7 @@ const formatRequestCancelExternalWorkflowExecutionFailedEvent = ({
1719
return {
1820
...primaryCommonFields,
1921
cause,
20-
control: control ? parseInt(atob(control)) : null,
22+
control: control ? parseInt(formatBase64Payload(control)) : null,
2123
initiatedEventId: parseInt(initiatedEventId),
2224
...eventAttributes,
2325
decisionTaskCompletedEventId: parseInt(decisionTaskCompletedEventId),

src/utils/data-formatters/format-workflow-history-event/format-request-cancel-external-workflow-execution-initiated-event.ts

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,5 @@
1+
import formatBase64Payload from '../format-base64-payload';
2+
13
import formatWorkflowCommonEventFields from './format-workflow-common-event-fields';
24
import { type RequestCancelExternalWorkflowExecutionInitiatedEvent } from './format-workflow-history-event.type';
35

@@ -14,7 +16,7 @@ const formatRequestCancelExternalWorkflowExecutionInitiatedEvent = ({
1416

1517
return {
1618
...primaryCommonFields,
17-
control: control ? parseInt(atob(control)) : null,
19+
control: control ? parseInt(formatBase64Payload(control)) : null,
1820
...eventAttributes,
1921
decisionTaskCompletedEventId: parseInt(decisionTaskCompletedEventId),
2022
...secondaryCommonFields,

src/utils/data-formatters/format-workflow-history-event/format-signal-external-workflow-execution-failed-event.ts

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,5 @@
1+
import formatBase64Payload from '../format-base64-payload';
2+
13
import formatWorkflowCommonEventFields from './format-workflow-common-event-fields';
24
import { type SignalExternalWorkflowExecutionFailedEvent } from './format-workflow-history-event.type';
35

@@ -18,7 +20,7 @@ const formatSignalExternalWorkflowExecutionFailedEvent = ({
1820
...primaryCommonFields,
1921
...eventAttributes,
2022
cause,
21-
control: control ? parseInt(atob(control)) : null,
23+
control: control ? parseInt(formatBase64Payload(control)) : null,
2224
initiatedEventId: parseInt(initiatedEventId),
2325
decisionTaskCompletedEventId: parseInt(decisionTaskCompletedEventId),
2426
...secondaryCommonFields,

src/utils/data-formatters/format-workflow-history-event/format-signal-external-workflow-execution-initiated-event.ts

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,4 @@
1+
import formatBase64Payload from '../format-base64-payload';
12
import formatInputPayload from '../format-input-payload';
23

34
import formatWorkflowCommonEventFields from './format-workflow-common-event-fields';
@@ -21,7 +22,7 @@ const formatSignalExternalWorkflowExecutionInitiatedEvent = ({
2122
...eventAttributes,
2223
input: formatInputPayload(input),
2324
signalName,
24-
control: control ? parseInt(atob(control)) : null,
25+
control: control ? parseInt(formatBase64Payload(control)) : null,
2526
decisionTaskCompletedEventId: parseInt(decisionTaskCompletedEventId),
2627
...secondaryCommonFields,
2728
};

0 commit comments

Comments
 (0)