Skip to content

Commit cc42ff4

Browse files
committed
Move isBase64EncodedPayload check to encodePayloads util
1 parent 24568c4 commit cc42ff4

3 files changed

Lines changed: 50 additions & 35 deletions

File tree

src/lib/stores/schedules.ts

Lines changed: 6 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -13,10 +13,7 @@ import type {
1313
SchedulePresetsParameters,
1414
ScheduleSpecParameters,
1515
} from '$lib/types/schedule';
16-
import {
17-
encodePayloads,
18-
isEncodedPayload,
19-
} from '$lib/utilities/encode-payload';
16+
import { encodePayloads } from '$lib/utilities/encode-payload';
2017
import { stringifyWithBigInt } from '$lib/utilities/parse-with-big-int';
2118
import { routeForSchedule, routeForSchedules } from '$lib/utilities/route-for';
2219
import {
@@ -226,13 +223,11 @@ export const submitEditSchedule = async (
226223
if (fields && Object.keys(fields).length > 0) {
227224
try {
228225
for (const [key, value] of Object.entries(fields)) {
229-
if (!isEncodedPayload(value)) {
230-
const encodedValue = await encodePayloads({
231-
input: stringifyWithBigInt(value),
232-
encoding: 'json/plain',
233-
});
234-
fields[key] = encodedValue[0];
235-
}
226+
const encodedValue = await encodePayloads({
227+
input: stringifyWithBigInt(value),
228+
encoding: 'json/plain',
229+
});
230+
fields[key] = encodedValue[0];
236231
}
237232
} catch (e) {
238233
error.set(`${translate('data-encoder.encode-error')}: ${e?.message}`);

src/lib/utilities/encode-payload.test.ts

Lines changed: 21 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -8,7 +8,7 @@ import {
88
import {
99
encodePayloads,
1010
getSinglePayload,
11-
isEncodedPayload,
11+
isBase64EncodedPayload,
1212
} from './encode-payload';
1313

1414
describe('getSinglePayload', () => {
@@ -33,10 +33,10 @@ describe('getSinglePayload', () => {
3333
});
3434
});
3535

36-
describe('isEncodedPayload', () => {
36+
describe('isBase64EncodedPayload', () => {
3737
it('should return true for a base64-encoded payload', () => {
3838
expect(
39-
isEncodedPayload({
39+
isBase64EncodedPayload({
4040
metadata: { encoding: 'anNvbi9wbGFpbg==' },
4141
data: 'eyJmb28iOiJiYXIifQ==',
4242
}),
@@ -45,7 +45,7 @@ describe('isEncodedPayload', () => {
4545

4646
it('should return true for a binary/null encoded payload', () => {
4747
expect(
48-
isEncodedPayload({
48+
isBase64EncodedPayload({
4949
metadata: { encoding: 'YmluYXJ5L251bGw=' },
5050
data: '',
5151
}),
@@ -54,31 +54,43 @@ describe('isEncodedPayload', () => {
5454

5555
it('should return false for a decoded payload', () => {
5656
expect(
57-
isEncodedPayload({
57+
isBase64EncodedPayload({
5858
metadata: { encoding: 'json/plain' },
5959
data: { foo: 'bar' },
6060
}),
6161
).toBe(false);
6262
});
6363

6464
it('should return false for a raw string value', () => {
65-
expect(isEncodedPayload('hello')).toBe(false);
65+
expect(isBase64EncodedPayload('hello')).toBe(false);
6666
});
6767

6868
it('should return false for a raw object value', () => {
69-
expect(isEncodedPayload({ foo: 'bar' })).toBe(false);
69+
expect(isBase64EncodedPayload({ foo: 'bar' })).toBe(false);
7070
});
7171

7272
it('should return false for null', () => {
73-
expect(isEncodedPayload(null)).toBe(false);
73+
expect(isBase64EncodedPayload(null)).toBe(false);
7474
});
7575

7676
it('should return false for undefined', () => {
77-
expect(isEncodedPayload(undefined)).toBe(false);
77+
expect(isBase64EncodedPayload(undefined)).toBe(false);
7878
});
7979
});
8080

8181
describe('encodePayloads', () => {
82+
it('should return already-encoded payload as-is', async () => {
83+
const alreadyEncoded = {
84+
metadata: { encoding: 'anNvbi9wbGFpbg==' },
85+
data: 'eyJmb28iOiJiYXIifQ==',
86+
};
87+
const payload = await encodePayloads({
88+
input: stringifyWithBigInt(alreadyEncoded),
89+
encoding: 'json/plain',
90+
});
91+
expect(payload).toEqual([alreadyEncoded]);
92+
});
93+
8294
it('should encode single simple string payload', async () => {
8395
const payload = await encodePayloads({
8496
input: stringifyWithBigInt('cats'),

src/lib/utilities/encode-payload.ts

Lines changed: 23 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -11,10 +11,11 @@ import {
1111
stringifyWithBigInt,
1212
} from '$lib/utilities/parse-with-big-int';
1313

14-
export const isEncodedPayload = (payload: Payload): boolean => {
15-
const encoding = payload?.metadata?.encoding;
16-
if (typeof encoding !== 'string' || typeof payload?.data !== 'string')
17-
return false;
14+
export const isBase64EncodedPayload = (value: unknown): value is Payload => {
15+
if (!value || typeof value !== 'object') return false;
16+
const { metadata, data } = value as Payload;
17+
const encoding = metadata?.encoding;
18+
if (typeof encoding !== 'string' || typeof data !== 'string') return false;
1819
return atob(encoding) !== encoding;
1920
};
2021

@@ -66,18 +67,25 @@ export const encodePayloads = async ({
6667
messageType = '',
6768
encodeWithCodec = true,
6869
}: EncodePayloads): Promise<Payload[]> => {
69-
let payloads = null;
70+
if (!input) return null;
7071

71-
if (input) {
72-
const parsedInput = parseWithBigInt(input);
73-
payloads = [setBase64Payload(parsedInput, encoding, messageType)];
74-
const endpoint = get(dataEncoder).endpoint;
75-
if (endpoint && encodeWithCodec) {
76-
const awaitData = await encodePayloadsWithCodec({
77-
payloads: { payloads },
78-
});
79-
payloads = awaitData?.payloads ?? null;
80-
}
72+
const parsedInput = parseWithBigInt(input);
73+
let payloads: Payload[] = isBase64EncodedPayload(parsedInput)
74+
? [parsedInput]
75+
: [
76+
setBase64Payload(
77+
parsedInput,
78+
encoding,
79+
messageType,
80+
) as unknown as Payload,
81+
];
82+
83+
const endpoint = get(dataEncoder).endpoint;
84+
if (endpoint && encodeWithCodec) {
85+
const awaitData = await encodePayloadsWithCodec({
86+
payloads: { payloads },
87+
});
88+
payloads = (awaitData?.payloads as Payload[]) ?? null;
8189
}
8290
return payloads;
8391
};

0 commit comments

Comments
 (0)