@ksp-gonogo/kerbcast 1.4.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CHANGELOG.md +186 -0
- package/LICENSE +369 -0
- package/README.md +112 -0
- package/dist/__generated__/types.d.ts +529 -0
- package/dist/__generated__/types.js +50 -0
- package/dist/client.d.ts +433 -0
- package/dist/client.js +821 -0
- package/dist/index.d.ts +3 -0
- package/dist/index.js +7 -0
- package/dist/noise.d.ts +34 -0
- package/dist/noise.js +274 -0
- package/dist/panZoom.d.ts +190 -0
- package/dist/panZoom.js +302 -0
- package/dist/testing/index.d.ts +217 -0
- package/dist/testing/index.js +606 -0
- package/package.json +57 -0
- package/src/__generated__/types.ts +488 -0
- package/src/client.test.ts +1673 -0
- package/src/client.ts +1219 -0
- package/src/domStubs.test.ts +49 -0
- package/src/index.ts +29 -0
- package/src/noise.test.ts +340 -0
- package/src/noise.ts +317 -0
- package/src/panZoom.test.ts +404 -0
- package/src/panZoom.ts +405 -0
- package/src/testing/index.ts +689 -0
- package/src/testing.test.ts +156 -0
|
@@ -0,0 +1,156 @@
|
|
|
1
|
+
import { beforeEach, describe, expect, it, vi } from "vitest";
|
|
2
|
+
import { CameraLifecycle, Layer } from "./__generated__/types";
|
|
3
|
+
import { KerbcastClient } from "./index";
|
|
4
|
+
import { MockSidecar } from "./testing/index";
|
|
5
|
+
|
|
6
|
+
beforeEach(() => {
|
|
7
|
+
vi.spyOn(globalThis, "fetch").mockImplementation(() =>
|
|
8
|
+
Promise.resolve(MockSidecar.makeOfferResponse([42])),
|
|
9
|
+
);
|
|
10
|
+
});
|
|
11
|
+
|
|
12
|
+
describe("MockSidecar", () => {
|
|
13
|
+
it("cameras populate on open()", async () => {
|
|
14
|
+
const sidecar = new MockSidecar();
|
|
15
|
+
sidecar.addCamera({ flightId: 42 });
|
|
16
|
+
|
|
17
|
+
const client = new KerbcastClient(
|
|
18
|
+
{ host: "localhost", port: 8088 },
|
|
19
|
+
sidecar.createTransport(),
|
|
20
|
+
);
|
|
21
|
+
|
|
22
|
+
const cameraEvents: unknown[] = [];
|
|
23
|
+
client.on("cameras-change", (cams) => cameraEvents.push(cams));
|
|
24
|
+
|
|
25
|
+
await client.connect([42]);
|
|
26
|
+
sidecar.open();
|
|
27
|
+
|
|
28
|
+
expect(client.cameras).toHaveLength(1);
|
|
29
|
+
expect(client.cameras[0].flightId).toBe(42);
|
|
30
|
+
expect(cameraEvents).toHaveLength(1);
|
|
31
|
+
});
|
|
32
|
+
|
|
33
|
+
it("client sends hello on open()", async () => {
|
|
34
|
+
const sidecar = new MockSidecar();
|
|
35
|
+
sidecar.addCamera({ flightId: 42 });
|
|
36
|
+
|
|
37
|
+
const client = new KerbcastClient(
|
|
38
|
+
{ host: "localhost", port: 8088 },
|
|
39
|
+
sidecar.createTransport(),
|
|
40
|
+
);
|
|
41
|
+
await client.connect([42]);
|
|
42
|
+
sidecar.open();
|
|
43
|
+
|
|
44
|
+
expect(sidecar.lastCommand("hello")).toBeDefined();
|
|
45
|
+
});
|
|
46
|
+
|
|
47
|
+
it("destroyCamera sends Destroyed lifecycle to client", async () => {
|
|
48
|
+
const sidecar = new MockSidecar();
|
|
49
|
+
sidecar.addCamera({ flightId: 42 });
|
|
50
|
+
|
|
51
|
+
const client = new KerbcastClient(
|
|
52
|
+
{ host: "localhost", port: 8088 },
|
|
53
|
+
sidecar.createTransport(),
|
|
54
|
+
);
|
|
55
|
+
await client.connect([42]);
|
|
56
|
+
sidecar.open();
|
|
57
|
+
|
|
58
|
+
const cam = client.camera(42);
|
|
59
|
+
const changes: unknown[] = [];
|
|
60
|
+
cam.on("change", (s) => changes.push(s));
|
|
61
|
+
|
|
62
|
+
sidecar.destroyCamera(42);
|
|
63
|
+
|
|
64
|
+
expect(cam.state?.lifecycle).toBe(CameraLifecycle.Destroyed);
|
|
65
|
+
expect(changes).toHaveLength(1);
|
|
66
|
+
});
|
|
67
|
+
|
|
68
|
+
it("firePing causes client to respond with pong", async () => {
|
|
69
|
+
const sidecar = new MockSidecar();
|
|
70
|
+
sidecar.addCamera({ flightId: 42 });
|
|
71
|
+
|
|
72
|
+
const client = new KerbcastClient(
|
|
73
|
+
{ host: "localhost", port: 8088 },
|
|
74
|
+
sidecar.createTransport(),
|
|
75
|
+
);
|
|
76
|
+
await client.connect([42]);
|
|
77
|
+
sidecar.open();
|
|
78
|
+
|
|
79
|
+
const cmdsBefore = sidecar.commands.length;
|
|
80
|
+
sidecar.firePing();
|
|
81
|
+
|
|
82
|
+
expect(sidecar.commands.length).toBe(cmdsBefore + 1);
|
|
83
|
+
expect(sidecar.lastCommand("pong")).toBeDefined();
|
|
84
|
+
});
|
|
85
|
+
|
|
86
|
+
it("ping event fires on the client when sidecar sends ping", async () => {
|
|
87
|
+
const sidecar = new MockSidecar();
|
|
88
|
+
sidecar.addCamera({ flightId: 42 });
|
|
89
|
+
|
|
90
|
+
const client = new KerbcastClient(
|
|
91
|
+
{ host: "localhost", port: 8088 },
|
|
92
|
+
sidecar.createTransport(),
|
|
93
|
+
);
|
|
94
|
+
await client.connect([42]);
|
|
95
|
+
sidecar.open();
|
|
96
|
+
|
|
97
|
+
let pingFired = false;
|
|
98
|
+
client.on("ping", () => { pingFired = true; });
|
|
99
|
+
|
|
100
|
+
sidecar.firePing();
|
|
101
|
+
|
|
102
|
+
expect(pingFired).toBe(true);
|
|
103
|
+
});
|
|
104
|
+
|
|
105
|
+
it("lastCommand filters by flightId", async () => {
|
|
106
|
+
const sidecar = new MockSidecar();
|
|
107
|
+
sidecar.addCamera({ flightId: 42 });
|
|
108
|
+
|
|
109
|
+
const client = new KerbcastClient(
|
|
110
|
+
{ host: "localhost", port: 8088 },
|
|
111
|
+
sidecar.createTransport(),
|
|
112
|
+
);
|
|
113
|
+
await client.connect([42]);
|
|
114
|
+
sidecar.open();
|
|
115
|
+
|
|
116
|
+
const cam = client.camera(42);
|
|
117
|
+
await cam.setFov(35);
|
|
118
|
+
await cam.setFov(60);
|
|
119
|
+
|
|
120
|
+
const last = sidecar.lastCommand("set-fov", 42);
|
|
121
|
+
expect(last?.content.fov).toBe(60);
|
|
122
|
+
});
|
|
123
|
+
|
|
124
|
+
it("updateCamera pushes state-change to the client", async () => {
|
|
125
|
+
const sidecar = new MockSidecar();
|
|
126
|
+
sidecar.addCamera({ flightId: 42, layers: [Layer.Near] });
|
|
127
|
+
|
|
128
|
+
const client = new KerbcastClient(
|
|
129
|
+
{ host: "localhost", port: 8088 },
|
|
130
|
+
sidecar.createTransport(),
|
|
131
|
+
);
|
|
132
|
+
await client.connect([42]);
|
|
133
|
+
sidecar.open();
|
|
134
|
+
|
|
135
|
+
sidecar.updateCamera(42, { layers: [Layer.Near, Layer.Scaled] });
|
|
136
|
+
|
|
137
|
+
expect(client.cameras[0].layers).toEqual([Layer.Near, Layer.Scaled]);
|
|
138
|
+
});
|
|
139
|
+
|
|
140
|
+
it("setConnectionState drives client state-change events", async () => {
|
|
141
|
+
const sidecar = new MockSidecar();
|
|
142
|
+
const client = new KerbcastClient(
|
|
143
|
+
{ host: "localhost", port: 8088 },
|
|
144
|
+
sidecar.createTransport(),
|
|
145
|
+
);
|
|
146
|
+
await client.connect();
|
|
147
|
+
|
|
148
|
+
const states: string[] = [];
|
|
149
|
+
client.on("state-change", (s) => states.push(s));
|
|
150
|
+
|
|
151
|
+
sidecar.setConnectionState("connected");
|
|
152
|
+
sidecar.setConnectionState("failed");
|
|
153
|
+
|
|
154
|
+
expect(states).toEqual(["connected", "failed"]);
|
|
155
|
+
});
|
|
156
|
+
});
|