Book a Demo!
CoCalc Logo Icon
StoreFeaturesDocsShareSupportNewsAboutPoliciesSign UpSign In
sagemathinc
GitHub Repository: sagemathinc/cocalc
Path: blob/master/src/packages/backend/conat/test/sync/binary.test.ts
1451 views
1
/*
2
Test using binary data with kv and stream.
3
4
You can just store binary directly in kv and stream, since MsgPack
5
handles buffers just fine.
6
7
DEVELOPMENT:
8
9
pnpm test ./binary.test.ts
10
*/
11
12
import { dstream, dkv } from "@cocalc/backend/conat/sync";
13
import { before, after, connect } from "@cocalc/backend/conat/test/setup";
14
import { wait } from "@cocalc/backend/conat/test/util";
15
16
beforeAll(before);
17
18
let maxPayload;
19
20
describe("test binary data with a dstream", () => {
21
let s,
22
name = `${Math.random()}`;
23
24
// binary values come back as Uint8Array with streams
25
const data10 = Uint8Array.from(Buffer.from("x".repeat(10)));
26
it("creates a binary dstream and writes/then reads binary data to/from it", async () => {
27
s = await dstream<Buffer>({ name });
28
expect(s.name).toBe(name);
29
s.publish(data10);
30
expect(s.get(0).length).toEqual(data10.length);
31
await s.save();
32
s.close();
33
s = await dstream({ name });
34
expect(s.get(0).length).toEqual(data10.length);
35
});
36
37
it("sanity check on the max payload", async () => {
38
const client = connect();
39
await wait({ until: () => client.info != null });
40
maxPayload = client.info?.max_payload ?? 0;
41
expect(maxPayload).toBeGreaterThan(500000);
42
});
43
44
it("writes large binary data to the dstream to test chunking", async () => {
45
s = await dstream({ name });
46
const data = Uint8Array.from(Buffer.from("x".repeat(maxPayload * 1.5)));
47
s.publish(data);
48
expect(s.get(s.length - 1).length).toEqual(data.length);
49
await s.save();
50
s.close();
51
s = await dstream({ name });
52
expect(s.get(s.length - 1).length).toEqual(data.length);
53
});
54
55
it("clean up", async () => {
56
await s.delete({ all: true });
57
await s.close();
58
});
59
});
60
61
describe("test binary data with a dkv", () => {
62
let s,
63
name = `${Math.random()}`;
64
65
// binary values come back as buffer with dkv
66
const data10 = Buffer.from("x".repeat(10));
67
68
it("creates a binary dkv and writes/then reads binary data to/from it", async () => {
69
s = await dkv({ name });
70
expect(s.name).toBe(name);
71
s.x = data10;
72
expect(s.x).toEqual(data10);
73
expect(s.x.length).toEqual(data10.length);
74
await s.save();
75
s.close();
76
s = await dkv({ name });
77
await wait({ until: () => s.has("x") });
78
expect(s.x.length).toEqual(data10.length);
79
expect(s.x).toEqual(data10);
80
});
81
82
it("writes large binary data to the dkv to test chunking", async () => {
83
s = await dkv({ name });
84
const data = Uint8Array.from(Buffer.from("x".repeat(maxPayload * 1.5)));
85
s.y = data;
86
expect(s.y.length).toEqual(data.length);
87
await s.save();
88
s.close();
89
s = await dkv({ name });
90
expect(s.y.length).toEqual(data.length);
91
});
92
93
it("clean up", async () => {
94
await s.clear();
95
s.close();
96
});
97
});
98
99
afterAll(after);
100
101