Skip to content

Commit fc64f19

Browse files
committed
add JSON.stringify and JSON.parse passes to our JSON encode/decode tests
We missed some cases where values were not convertable to JSON!
1 parent 6addbbf commit fc64f19

File tree

4 files changed

+67
-37
lines changed

4 files changed

+67
-37
lines changed

js/packages/direct-connect-common/src/msg/__tests__/JsonSerializer.test.ts

Lines changed: 24 additions & 24 deletions
Original file line numberDiff line numberDiff line change
@@ -41,8 +41,8 @@ test("encoded, decode pairing ApplyChangesMsg", () => {
4141
seqEnd,
4242
changes,
4343
} as const;
44-
const encoded = serializer.encode(msg);
45-
const decoded = serializer.decode(encoded);
44+
const encoded = JSON.stringify(serializer.encode(msg));
45+
const decoded = serializer.decode(JSON.parse(encoded));
4646
expect(decoded).toEqual(msg);
4747
}
4848
)
@@ -65,8 +65,8 @@ test("encode, decode pairing for GetChangesMsg", () => {
6565
since,
6666
schemaVersion,
6767
} as const;
68-
const encoded = serializer.encode(msg);
69-
const decoded = serializer.decode(encoded);
68+
const encoded = JSON.stringify(serializer.encode(msg));
69+
const decoded = serializer.decode(JSON.parse(encoded));
7070
expect(decoded).toEqual(msg);
7171
}
7272
)
@@ -90,8 +90,8 @@ test("encode, decode pairing for EstablishOutboundStreamMsg", () => {
9090
seqStart,
9191
schemaVersion,
9292
} as const;
93-
const encoded = serializer.encode(msg);
94-
const decoded = serializer.decode(encoded);
93+
const encoded = JSON.stringify(serializer.encode(msg));
94+
const decoded = serializer.decode(JSON.parse(encoded));
9595
expect(decoded).toEqual(msg);
9696
}
9797
)
@@ -103,8 +103,8 @@ test("encode, decode pairing for AckChangesMsg", () => {
103103
fc.property(fc.tuple(fc.bigIntN(64), fc.integer({ min: 0 })), (seqEnd) => {
104104
const serializer = new JsonSerializer();
105105
const msg = { _tag: tags.ackChanges, seqEnd } as const;
106-
const encoded = serializer.encode(msg);
107-
const decoded = serializer.decode(encoded);
106+
const encoded = JSON.stringify(serializer.encode(msg));
107+
const decoded = serializer.decode(JSON.parse(encoded));
108108
expect(decoded).toEqual(msg);
109109
})
110110
);
@@ -142,8 +142,8 @@ test("StreamingChangesMsg", () => {
142142
seqEnd,
143143
changes,
144144
} as const;
145-
const encoded = serializer.encode(msg);
146-
const decoded = serializer.decode(encoded);
145+
const encoded = JSON.stringify(serializer.encode(msg));
146+
const decoded = serializer.decode(JSON.parse(encoded));
147147
expect(decoded).toEqual(msg);
148148
}
149149
)
@@ -155,8 +155,8 @@ test("ApplyChangesResponse", () => {
155155
const msg = {
156156
_tag: tags.applyChangesResponse,
157157
} as const;
158-
const encoded = serializer.encode(msg as any);
159-
const decoded = serializer.decode(encoded);
158+
const encoded = JSON.stringify(serializer.encode(msg as any));
159+
const decoded = serializer.decode(JSON.parse(encoded));
160160
expect(decoded).toEqual(msg);
161161
});
162162

@@ -176,8 +176,8 @@ test("CreateOrMigrateResponse", () => {
176176
seq,
177177
status,
178178
} as const;
179-
const encoded = serializer.encode(msg as any);
180-
const decoded = serializer.decode(encoded);
179+
const encoded = JSON.stringify(serializer.encode(msg as any));
180+
const decoded = serializer.decode(JSON.parse(encoded));
181181
expect(decoded).toEqual(msg);
182182
}
183183
)
@@ -200,8 +200,8 @@ test("CreateOrMigrateMsg", () => {
200200
schemaName,
201201
schemaVersion,
202202
} as const;
203-
const encoded = serializer.encode(msg);
204-
const decoded = serializer.decode(encoded);
203+
const encoded = JSON.stringify(serializer.encode(msg));
204+
const decoded = serializer.decode(JSON.parse(encoded));
205205
expect(decoded).toEqual(msg);
206206
}
207207
)
@@ -220,8 +220,8 @@ test("GetLastSeenMsg", () => {
220220
toDbid,
221221
fromDbid,
222222
} as const;
223-
const encoded = serializer.encode(msg);
224-
const decoded = serializer.decode(encoded);
223+
const encoded = JSON.stringify(serializer.encode(msg));
224+
const decoded = serializer.decode(JSON.parse(encoded));
225225
expect(decoded).toEqual(msg);
226226
}
227227
)
@@ -236,8 +236,8 @@ test("GetLastSeenResponse", () => {
236236
_tag: tags.getLastSeenResponse,
237237
seq,
238238
} as const;
239-
const encoded = serializer.encode(msg);
240-
const decoded = serializer.decode(encoded);
239+
const encoded = JSON.stringify(serializer.encode(msg));
240+
const decoded = serializer.decode(JSON.parse(encoded));
241241
expect(decoded).toEqual(msg);
242242
})
243243
);
@@ -259,8 +259,8 @@ test("UploadSchemaMsg", () => {
259259
content,
260260
activate,
261261
} as const;
262-
const encoded = serializer.encode(msg);
263-
const decoded = serializer.decode(encoded);
262+
const encoded = JSON.stringify(serializer.encode(msg));
263+
const decoded = serializer.decode(JSON.parse(encoded));
264264
expect(decoded).toEqual(msg);
265265
}
266266
)
@@ -276,8 +276,8 @@ test("ActivateSchemaMsg", () => {
276276
name,
277277
version,
278278
} as const;
279-
const encoded = serializer.encode(msg);
280-
const decoded = serializer.decode(encoded);
279+
const encoded = JSON.stringify(serializer.encode(msg));
280+
const decoded = serializer.decode(JSON.parse(encoded));
281281
expect(decoded).toEqual(msg);
282282
})
283283
);

js/packages/direct-connect-common/src/msg/__tests__/sandbox.test.ts

Lines changed: 7 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -8,10 +8,14 @@ test("sandbox", () => {
88
_tag: tags.streamingChanges,
99
seqStart: [0n, 0],
1010
seqEnd: [0n, 0],
11-
changes: [["", Uint8Array.from([0]), "", "", 0n, 0n]],
11+
changes: [
12+
["", Uint8Array.from([0]), "", Uint8Array.from([1, 1, 1]), 0n, 0n],
13+
],
1214
} as const;
1315
const s = new JsonSerializer();
1416

15-
const encoded = s.encode(msg);
16-
const decoded = s.decode(encoded);
17+
const encoded = JSON.stringify(s.encode(msg));
18+
const decoded = s.decode(JSON.parse(encoded));
19+
console.log(encoded);
20+
console.log(decoded);
1721
});

js/packages/direct-connect-common/src/msg/jsonDecode.ts

Lines changed: 19 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -86,9 +86,19 @@ export default function decode(parsed: { [key: string]: any }): Msg {
8686
case tags.establishOutboundStreamResponse:
8787
return parsed as Msg;
8888
case tags.uploadSchema:
89-
return parsed as Msg;
89+
return {
90+
_tag: parsed._tag,
91+
name: parsed.name,
92+
version: BigInt(parsed.version),
93+
content: parsed.content,
94+
activate: parsed.activate,
95+
};
9096
case tags.activateSchema:
91-
return parsed as Msg;
97+
return {
98+
_tag: parsed._tag,
99+
name: parsed.name,
100+
version: BigInt(parsed.version),
101+
};
92102
}
93103
}
94104

@@ -98,17 +108,21 @@ function decodeChanges(changes: any[]): Change[] {
98108
c[0],
99109
hexToBytes(c[1]),
100110
c[2],
101-
decodeMaybeNumer(c[3]),
111+
decodeValue(c[3]),
102112
BigInt(c[4]),
103113
BigInt(c[5]),
104114
];
105115
});
106116
}
107117

108118
/**
109-
* See `safelyEncodeIfBigNumber`
119+
* See `jsonEncode.encodeValue`
110120
*/
111-
function decodeMaybeNumer(maybeNumber: any) {
121+
function decodeValue(maybeNumber: any) {
122+
// we encode Uint8Array into an array of 1 entry of the blob for JSON.
123+
if (Array.isArray(maybeNumber) && typeof maybeNumber[0] === "string") {
124+
return hexToBytes(maybeNumber[0]);
125+
}
112126
if (typeof maybeNumber !== "string") {
113127
return maybeNumber;
114128
}

js/packages/direct-connect-common/src/msg/jsonEncode.ts

Lines changed: 17 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -86,9 +86,19 @@ export default function encode(msg: Msg): Object {
8686
case tags.establishOutboundStreamResponse:
8787
return msg;
8888
case tags.uploadSchema:
89-
return msg;
89+
return {
90+
_tag: msg._tag,
91+
name: msg.name,
92+
version: msg.version.toString(),
93+
content: msg.content,
94+
activate: msg.activate,
95+
};
9096
case tags.activateSchema:
91-
return msg;
97+
return {
98+
_tag: tags.activateSchema,
99+
name: msg.name,
100+
version: msg.version.toString(),
101+
};
92102
}
93103
}
94104

@@ -98,8 +108,7 @@ function encodeChanges(changes: readonly Change[]): readonly any[] {
98108
c[0],
99109
bytesToHex(c[1]),
100110
c[2],
101-
// TODO: support blob encoding.... Likely need a type arg on value.
102-
safelyEncodeIfBigNumber(c[3]),
111+
encodeValue(c[3]),
103112
c[4].toString(),
104113
c[5].toString(),
105114
];
@@ -115,13 +124,16 @@ function encodeChanges(changes: readonly Change[]): readonly any[] {
115124
* Given (3), we need to convert BigInts to Numbers but given (1)
116125
* we have to convert BigInts > 53 bits to strings.
117126
*/
118-
function safelyEncodeIfBigNumber(x: any) {
127+
function encodeValue(x: any) {
119128
if (typeof x === "bigint") {
120129
if (x > Number.MAX_SAFE_INTEGER) {
121130
return x.toString();
122131
} else {
123132
return Number(x);
124133
}
134+
} else if (typeof x === "object" && x.constructor === Uint8Array) {
135+
const hex = bytesToHex(x);
136+
return [hex];
125137
}
126138
return x;
127139
}

0 commit comments

Comments
 (0)