Skip to content

Commit fdd44ac

Browse files
committed
feat: 🎸 add util.info route
1 parent 6ab411f commit fdd44ac

File tree

6 files changed

+92
-4
lines changed

6 files changed

+92
-4
lines changed

src/server/__tests__/util.spec.ts

Lines changed: 28 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,15 +1,15 @@
11
import {setup} from './setup';
22

3-
describe('util', () => {
4-
describe('ping', () => {
3+
describe('util.*', () => {
4+
describe('util.ping', () => {
55
test('returns pong', async () => {
66
const {caller} = setup();
77
const res = await caller.call('util.ping', {}, {});
88
expect(res.data).toBe('pong');
99
});
1010
});
1111

12-
describe('echo', () => {
12+
describe('util.echo', () => {
1313
test('returns strings', async () => {
1414
const {caller} = setup();
1515
const res = await caller.call('util.echo', 'hello world', {});
@@ -22,4 +22,29 @@ describe('util', () => {
2222
expect(res.data).toStrictEqual({foo: 'bar'});
2323
});
2424
});
25+
26+
describe('util.info', () => {
27+
test('returns stats object', async () => {
28+
const {call} = setup();
29+
const res = await call('util.info', {}, {});
30+
expect(res).toMatchObject({
31+
now: expect.any(Number),
32+
stats: {
33+
pubsub: {
34+
channels: expect.any(Number),
35+
observers: expect.any(Number),
36+
},
37+
presence: {
38+
rooms: expect.any(Number),
39+
entries: expect.any(Number),
40+
observers: expect.any(Number),
41+
},
42+
blocks: {
43+
blocks: expect.any(Number),
44+
patches: expect.any(Number),
45+
},
46+
},
47+
});
48+
});
49+
});
2550
});

src/server/routes/util/index.ts

Lines changed: 38 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -24,8 +24,45 @@ export const echo =
2424
return router.fn('util.echo', func);
2525
};
2626

27+
export const info =
28+
({services}: RouteDeps) =>
29+
<R extends RoutesBase>(router: TypeRouter<R>) => {
30+
const t = router.t;
31+
const Request = t.any;
32+
const Response = t.Object(
33+
t.prop('now', t.num),
34+
t.prop('stats', t.Object(
35+
t.prop('pubsub', t.Object(
36+
t.prop('channels', t.num),
37+
t.prop('observers', t.num),
38+
)),
39+
t.prop('presence', t.Object(
40+
t.prop('rooms', t.num),
41+
t.prop('entries', t.num),
42+
t.prop('observers', t.num),
43+
)),
44+
t.prop('blocks', t.Object(
45+
t.prop('blocks', t.num),
46+
t.prop('patches', t.num),
47+
)),
48+
)),
49+
);
50+
const Func = t.Function(Request, Response).implement<MyCtx>(async () => {
51+
return {
52+
now: Date.now(),
53+
stats: {
54+
pubsub: services.pubsub.stats(),
55+
presence: services.presence.stats(),
56+
blocks: services.blocks.stats(),
57+
},
58+
};
59+
});
60+
return router.fn('util.info', Func);
61+
};
62+
2763
// prettier-ignore
2864
export const util = (deps: RouteDeps) => <R extends RoutesBase>(r: TypeRouter<R>) =>
2965
( ping(deps)
3066
( echo(deps)
31-
( r )));
67+
( info(deps)
68+
( r ))));

src/server/services/PresenceService.ts

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -90,4 +90,12 @@ export class PresenceService {
9090
}
9191
if (!room.size) this.rooms.delete(roomId);
9292
}
93+
94+
public stats(): {rooms: number, entries: number, observers: number} {
95+
return {
96+
rooms: this.rooms.size,
97+
entries: [...this.rooms.values()].reduce((acc, v) => acc + v.size, 0),
98+
observers: [...this.observers.values()].reduce((acc, v) => acc + v.length, 0),
99+
};
100+
}
93101
}

src/server/services/PubSubService.ts

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -26,4 +26,11 @@ export class PubsubService {
2626
if (!observers) return;
2727
for (const observer of observers) observer.next(message);
2828
}
29+
30+
public stats(): {channels: number, observers: number} {
31+
return {
32+
channels: this.observers.size,
33+
observers: [...this.observers.values()].reduce((acc, v) => acc + v.length, 0),
34+
};
35+
}
2936
}

src/server/services/blocks/BlocksServices.ts

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -59,4 +59,8 @@ export class BlocksServices {
5959
patches: patchesBack,
6060
};
6161
}
62+
63+
public stats() {
64+
return this.store.stats();
65+
}
6266
}

src/server/services/blocks/MemoryStore.ts

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -75,4 +75,11 @@ export class MemoryStore implements types.Store {
7575
this.blocks.delete(id);
7676
this.patches.delete(id);
7777
}
78+
79+
public stats(): {blocks: number, patches: number} {
80+
return {
81+
blocks: this.blocks.size,
82+
patches: [...this.patches.values()].reduce((acc, v) => acc + v.length, 0),
83+
};
84+
}
7885
}

0 commit comments

Comments
 (0)